pax_global_header00006660000000000000000000000064117654254520014525gustar00rootroot0000000000000052 comment=5e2e30f23ba0708055975ceae5851986eed2670f psignifit3-3.0~beta.20120611.1/000077500000000000000000000000001176542545200155325ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/.mailmap000066400000000000000000000001561176542545200171550ustar00rootroot00000000000000Ingo Fründ Ingo Fründ Ingo Fründ psignifit3-3.0~beta.20120611.1/COPYING000066400000000000000000000024121176542545200165640ustar00rootroot00000000000000======= License ======= psignifit including all examples, code snippets and attached documentation is covered by the MIT license. :: The MIT License Copyright (c) 2009-2012 Ingo Fründ 2009-2012 Valentin Haenel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. psignifit3-3.0~beta.20120611.1/Doxyfile000066400000000000000000001637671176542545200172640ustar00rootroot00000000000000# Doxyfile 1.5.6 # 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 = Psi++ # 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 = # 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 = doc-html # 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, 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, Slovak, Slovene, Spanish, Swedish, # and Ukrainian. 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 = # 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 = # 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 DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = 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 # 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 = YES # 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 #--------------------------------------------------------------------------- # 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 = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # 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 = NO # 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 = NO # 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 = YES # 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 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_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 = #--------------------------------------------------------------------------- # 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 = # 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 = NO # 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 = # 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 = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # 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 = YES # 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 = NO # 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 = NO # 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 documentstion. 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 = psipp-api # 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_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 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_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. 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 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_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 # 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 FRAME, 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 (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hiererachy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NONE # 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 #--------------------------------------------------------------------------- # 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. 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 #--------------------------------------------------------------------------- # 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 = NO # 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 # 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 = YES # 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 = YES # 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 = NO # 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 = NO # 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 = YES # 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 enabled by default, which results in a transparent # background. 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 = YES # 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 #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO psignifit3-3.0~beta.20120611.1/Makefile000066400000000000000000000227401176542545200171770ustar00rootroot00000000000000# vim: set fdm=marker: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### # The main Psignifit 3.x Makefile #################### VARIABLE DEFINITIONS ################### {{{ SHELL=/bin/bash CLI_INSTALL=$(DESTDIR)/usr/bin SPHINX_DOCOUT=doc-html EPYDOC_DCOOUT=api PSIPP_DOCOUT=psipp-api PSIPP_SRC=src LIBRARY_PATH=$(DESTDIR)/usr/lib/ LD_LIBRARY_PATH=src/build PYTHON=python NOSE=nosetests -v CLI_SRC=cli TODAY=`date +%d-%m-%G` LONGTODAY=`date +%G%m%d` RELEASE_TAG=release/3.0_beta.$(LONGTODAY).1 FILENAME_PREFIX=3.0_beta.$(LONGTODAY).1 ARCHIVE_PREFIX=psignifit_${FILENAME_PREFIX}/ TAR_FILE=psignifit_${FILENAME_PREFIX}.tar ZIP_FILE=psignifit_${FILENAME_PREFIX}.zip WINDOWS_CLI_INSTALLER=psignifit_${FILENAME_PREFIX}_installer.exe WINDOWS_PY_INSTALLER=psignifit_${FILENAME_PREFIX}_win32-py2.6.exe GIT_DESCRIPTION=`git describe` CLI_VERSION_HEADER=cli/cli_version.h MPSIGNIFIT_VERSION=mpsignifit/psignifit_version.m PYPSIGNIFIT_VERSION=pypsignifit/__version__.py .PHONY : swignifit ipython psipp-doc #}}} #################### GROUPING FILES ################### {{{ PYTHONFILES=$(addprefix pypsignifit/, __init__.py\ psignidata.py\ psignierrors.py\ psigniplot.py\ psigobservers.py\ pygibbsit.py) CFILES_LIB=$(addprefix src/, bootstrap.cc\ core.cc\ data.cc\ linalg.cc\ mclist.cc\ mcmc.cc\ optimizer.cc\ psychometric.cc\ rng.cc\ sigmoid.cc\ special.cc\ getstart.cc ) HFILES_LIB=$(addprefix src/, bootstrap.h\ core.h\ data.h\ errors.h\ linalg.h\ mclist.h\ mcmc.h\ optimizer.h\ prior.h\ psychometric.h\ rng.h\ sigmoid.h\ special.h\ psipp.h\ getstart.h) SWIGNIFIT_INTERFACE=swignifit/swignifit_raw.i SWIGNIFIT_AUTOGENERATED=$(addprefix swignifit/, swignifit_raw.py swignifit_raw.cxx) SWIGNIFIT_HANDWRITTEN=$(addprefix swignifit/, interface_methods.py utility.py) DOCFILES=$(addprefix doc-src/, \ ADDITIONALPLOTSBOOTSTRAP.rst \ INSTALL_WINDOWS.rst BAYESINTRO.rst \ CONTRIBUTING.rst \ PSYCHOMETRICFUNCTIONS.rst \ DESIGN.rst \ QUICKSTART.rst \ DIFFERENCES.rst \ swig-api.rst \ index.rst \ TODO.rst \ INFLUENTIAL.rst \ TUTORIAL_BAYES.rst \ INSTALL_LINUX.rst \ TUTORIAL_BOOTSTRAP.rst \ INSTALL_MAC.rst \ WELCOME.rst \ INSTALL_MATLAB.rst \ *.png ) EPYDOC_TARGET=swignifit pypsignifit # }}} #################### MAIN DEFINITIONS ################### {{{ build: python-build install: python-install psipp-install doc: python-doc psipp-doc clean: clean-python-doc clean-python psipp-clean cli-clean mpsignifit-clean test: swignifit-test psipp-test test-extended: test swignifit-test-interface-extended # }}} #################### PYTHON DEFINITIONS ################### {{{ python-install: | psipp-build python-version swig if [ -n "$(DESTDIR)" ] ; then \ $(PYTHON) setup.py install --home=$(DESTDIR);\ else \ $(PYTHON) setup.py install;\ fi python-build: | psipp-build swignifit python-version clean-python: swignifit-clean -rm -rv build -rm pypsignifit/*.pyc -rm $(PYPSIGNIFIT_VERSION) # when building with the windows_setup.py, a setup.pyc file is created -rm setup.pyc python-doc: $(DOCFILES) $(PYTHONFILES) python-build mkdir -p $(SPHINX_DOCOUT)/$(EPYDOC_DCOOUT) # epydoc -o $(SPHINX_DOCOUT)/$(EPYDOC_DCOOUT) $(EPYDOC_TARGET) PYTHONPATH=.:doc-src LD_LIBRARY_PATH=src/build/ sphinx-build doc-src $(SPHINX_DOCOUT) clean-python-doc: -rm -rv $(SPHINX_DOCOUT) ipython: swignifit ipython python-version: if git rev-parse &> /dev/null ; then \ echo "version = '"$(GIT_DESCRIPTION)"'" > $(PYPSIGNIFIT_VERSION); \ fi # }}} #################### PSIPP COMMANDS ################### {{{ psipp-build: cd $(PSIPP_SRC) && $(MAKE) psipp-install: psipp-build if ! [ -d $(LIBRARY_PATH) ] ; then\ mkdir -p $(LIBRARY_PATH);\ fi cp $(PSIPP_SRC)/build/libpsipp.so $(LIBRARY_PATH)/ psipp-doc: doxygen psipp-clean: cd $(PSIPP_SRC) && $(MAKE) clean -rm -rv $(SPHINX_DOCOUT)/$(PSIPP_DOCOUT) psipp-uninstall: rm $(LIBRARY_PATH)/libpsipp.so psipp-test: cd $(PSIPP_SRC) && $(MAKE) test # }}} ################### CLI COMMANDS ###################### {{{ cli-install: cli-version cli-build psipp-install if [ -d $(CLI_INSTALL) ]; then \ echo $(CLI_INSTALL) " exists adding files"; \ else \ mkdir $(CLI_INSTALL); \ echo ""; echo ""; echo ""; \ echo "WARNING: I had to create " $(CLI_INSTALL) "you will most probably have to add it to your PATH"; \ echo ""; echo ""; echo ""; \ fi cd $(CLI_SRC) &&\ cp psignifit-mcmc psignifit-diagnostics psignifit-bootstrap psignifit-mapestimate $(CLI_INSTALL) cli-build: cli-version psipp-build cd $(CLI_SRC) && $(MAKE) cli-clean: cd $(CLI_SRC) && $(MAKE) clean -rm $(CLI_VERSION_HEADER) cli-test: cli-install $(PYTHON) tests/cli_test.py cli-uninstall: rm $(CLI_INSTALL)/psignifit-mcmc rm $(CLI_INSTALL)/psignifit-diagnostics rm $(CLI_INSTALL)/psignifit-bootstrap rm $(CLI_INSTALL)/psignifit-mapestimate cli-version: if git rev-parse &> /dev/null ; then \ echo "#ifndef CLI_VERSION_H" > $(CLI_VERSION_HEADER) ; \ echo "#define CLI_VERSION_H" >> $(CLI_VERSION_HEADER) ; \ echo "#define VERSION \""$(GIT_DESCRIPTION)"\"" >> $(CLI_VERSION_HEADER) ; \ echo "#endif" >> $(CLI_VERSION_HEADER) ; \ fi # }}} #################### SWIGNIFIT COMMANDS ################### {{{ swig: $(SWIGNIFIT_AUTOGENERATED) swignifit: $(PYTHONFILES) $(CFILES) $(HFILES) $(SWIGNIFIT_AUTOGENERATED) $(SWIGNIFIT_HANDWRITTEN) setup.py psipp-build $(PYTHON) setup.py build_ext -i $(SWIGNIFIT_AUTOGENERATED): $(SWIGNIFIT_INTERFACE) swig -c++ -python -v -Isrc -o swignifit/swignifit_raw.cxx swignifit/swignifit_raw.i swignifit-clean: -rm -rv $(SWIGNIFIT_AUTOGENERATED) -rm -rv swignifit/_swignifit_raw.so -rm -rv swignifit/*.pyc swignifit-test: swignifit PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(NOSE) \ tests/swignifit_raw_test.py tests/interface_test.py tests/utility_test.py swignifit-test-raw: swignifit PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(NOSE) tests/swignifit_raw_test.py swignifit-test-interface: swignifit PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(NOSE) tests/interface_test.py swignifit-test-utility: swignifit PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(NOSE) tests/utility_test.py swignifit-test-interface-extended: swignifit PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(NOSE) tests/test_interface_extended.py # }}} #################### PYPSIGNIFIT COMMANDS ################### {{{ pypsignifit-test: PYTHONPATH=. LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(PYTHON) pypsignifit/psignidata.py # }}} #################### MPSIGNIFIT COMMANDS ################### {{{ mpsignifit-version: if git rev-parse &> /dev/null ; then \ echo "function psignifit_version()" > $(MPSIGNIFIT_VERSION) ; \ echo "disp('"$(GIT_DESCRIPTION)"')" >> $(MPSIGNIFIT_VERSION) ; \ fi mpsignifit-clean: -rm $(MPSIGNIFIT_VERSION) # }}} #################### DISTRIBUTION COMMANDS ################## {{{ dist-changelog: if [[ `git symbolic-ref HEAD` != refs/heads/master ]] ; then \ echo "FATAL: not on master branch!"; \ false; \ fi echo `date +%Y-%m-%d` - Psignifit-3.x - $(RELEASE_TAG) > tmp echo >> tmp echo "* " >> tmp echo >> tmp cat changelog >> tmp cp changelog changelog_old cp tmp changelog vi changelog +3 if diff tmp changelog; then \ mv changelog_old changelog; \ echo "FATAL: changelog not modified!"; \ false; \ else \ git commit changelog -m "changelog entry for upload"; \ fi dist-tar: python-version cli-version mpsignifit-version git archive --format=tar --prefix=${ARCHIVE_PREFIX} master > ${TAR_FILE} tar --transform "s,^,${ARCHIVE_PREFIX}," -rf ${TAR_FILE} $(PYPSIGNIFIT_VERSION) $(CLI_VERSION_HEADER) $(MPSIGNIFIT_VERSION) gzip ${TAR_FILE} dist-swigged: dist-tar swig tar xzf ${TAR_FILE}.gz cp swignifit/swignifit_raw.cxx swignifit/swignifit_raw.py ${ARCHIVE_PREFIX}swignifit/ zip -r ${ZIP_FILE} ${ARCHIVE_PREFIX} rm -r ${ARCHIVE_PREFIX} dist-win: build psignifit-cli.iss cli-version if [ -d WindowsInstaller ]; then rm -r WindowsInstaller; fi cd cli && make clean && make -f MakefileMinGW wine $(HOME)/.wine/drive_c/Program\ Files/Inno\ Setup\ 5/ISCC.exe psignifit-cli.iss mv WindowsInstaller/psignifit-cli_3_beta_installer.exe ${WINDOWS_CLI_INSTALLER} dist-win-python-installer: swig # Execute on Windows only! python windows_setup.py bdist_wininst dist-upload-doc: python-doc # this upload will only work with Ingo's account scp -r doc-html/* igordertigor,psignifit@web.sourceforge.net:/home/groups/p/ps/psignifit/htdocs/ git tag doc-$(LONGTODAY) git push origin doc-$(LONGTODAY) dist-prepare-upload: dist-swigged dist-win mkdir ${ARCHIVE_PREFIX} cp ${ZIP_FILE} ${WINDOWS_CLI_INSTALLER} ${ARCHIVE_PREFIX} if [ -d dist ]; then \ cp dist/pypsignifit-3.0beta.win32-py2.7.exe ${ARCHIVE_PREFIX}/${WINDOWS_PY_INSTALLER}; \ else \ echo "Installer for Python w32 has not been built; will be omitted in Upload."; \ fi dist-upload-archives: | dist-changelog dist-git-tag-release dist-prepare-upload # this upload will only work with Ingo's account scp -rv ${ARCHIVE_PREFIX} igordertigor,psignifit@frs.sourceforge.net:/home/frs/project/p/ps/psignifit/ #rm -r psignifit3.0_beta_$(TODAY) git push origin master git push origin $(RELEASE_TAG) dist-git-tag-release: if git tag | grep -q $(RELEASE_TAG) ; then \ echo "A rare case of tagging twice in a day?"; \ echo "The tag "$(RELEASE_TAG)" exists already."; \ echo "Currently we do not support this"; \ false; \ fi git tag -s -m "Psignifit-3.x $(RELEASE_TAG)" $(RELEASE_TAG) # }}} psignifit3-3.0~beta.20120611.1/README000077700000000000000000000000001176542545200215642doc-src/WELCOME.rstustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/TODO000066400000000000000000000007331176542545200162250ustar00rootroot00000000000000* Mac Install system wide -- /usr/bin * Lion: PATH differs between terminal and matlab * Lion: tests faile with explicite stepwidths * evtl irgendwann keine matplotlib abhängigkeitn ~> debian/control * split tests into "may fail" and "should never fail" * installation: Windows ~> windows_setup.py * Entought has to work out of the box * Doc: Warning about initial grids. We assume that the experimenter is sane * optimizer stopping? Do something about that? * b(x-a) core psignifit3-3.0~beta.20120611.1/changelog000066400000000000000000000110311176542545200174000ustar00rootroot000000000000002012-06-11 - Psignifit-3.x - release/3.0_beta.20120611.1 * upgraded to Windows py2.7 support: psignifit now works with recent versions of EPD. * fixed a bug in ASIRInference that was observed if the prenormalization was insufficient for a particular dataset. * disable HybridMCMC (was never used anyway). * updated documentation * fixed a bug in polyCore: polycore now returns 0 for negative values. * some cosmetic changes in plotting routines 2012-05-03 - Psignifit-3.x - release/3.0_beta.20120503.1 * minor bugfix release * pickle functionality thanks to Brad Buran * unit tests give non zero exit status on failure 2012-03-09 - Psignifit-3.x - release/3.0_beta.20120309.1 * shared library * jeffrey's prior * bugfix: too narrow posteriors in ASIR * tagged, signed releases * new release markers * multiple minor fixes in code and documentation 2011-10-28 * bugfix: NaN bug in optimizer fixed * new features: ASIR resampling can be accessed from python * fixed a couple of minor bugs and typos 2011-08-27 * Fixed bug in sensitivity analysis 2011-08-18 * Refactoring optimizer to be more robust * fixing segfaults in ASIR inference * fixing most unit tests * updates in documentation * removed psipy 2011-07-04 * Various documentation changes * ASIR inference uses finer grid, moment matching and avoids numerical integration in 3/4d. * Bugfix: Speed issues in psignifit-bootstrap -- jackknife used to call getstart unnessessarily often. 2011-06-07 * Updating documentation * bugfix: no status messages any more to make matlab interface working * posterior oversampling factor for ASIRInference can be specified from python 2011-05-17 * New strategy for Bayesian inference: Numerical integration of posterior, fitting marginal distributions and sampling importance resampling in python object ASIRInference * plotJoint distribution * various bugfixes 2011-05-05 * Updated documentation * changed distribution targets * a number of small bugfixes * improvements of matlab interface 2011-03-24 * Bugfix: command line interface checks ALL output for NaN * A couple of typos and documentations updates 2011-03-11 * Bugfix: cut can be a float * Swig function to get the points of a grid 2011-02-02 * A couple of bugfixes mainly with the matlab interface 2010-12-21 * New: version numbers in psignifit can be displayed in scripts e.g. pypsignifit.version * Bugfix: stimulus intensities for bootstrap are always double * Bugfix: switched off tunesampler in MCMC -> used to give weired behavior we now got back to Laplace approximations 2010-12-16 * Mersenne Twister is faster for MCMC 2010-12-15 * Improving grid search to also work with very narrow priors * Using results from grid search to set initial simplex size * Optimized MCMC --- reduced data sets are created only once 2010-12-10 * Zoom-in grid search for robust starting value determination 2010-12-08 * Bugfixes: Slope handling was wrong due to an error in documentation * Bugfixes: documentation is fixed and slope handling, too. 2010-12-06 * Added BCa confidence intervals for slope to the high level interface * Checking command line arguments based on docstring 2010-11-29 * Bugfix: cuts is checked to be iterable in constructor * Bugfix: if ConvergenceMCMC has less then three chains, Rhat is not printed * Bugfix: axes limits are set to lists to be mutable * Makefile flexibility increased 2010-11-12 * Bugfixes: In coverage.py script and in PsiPsychometric::getStart 2010-10-27 * Bugfix in matlab interface: nafc is actually used * bugfix in coverage script: default values * matlab interface has default priors 2010-10-21 * Old matplotlib versions require fake iterables for plotting 2010-10-21 * Fixed warnings for the dependency on matplotlib to be suppressable 2010-10-21 * Allowing older versions of matplotlib (spines are not required) * added some examples for the python interface 2010-10-18 * Fixed bug with NaN in matlab interface (seems to be crucial only on windows) 2010-10-13 * Fixed bug with tmp-files to (mainly a windows issue) 2010-09-17 * Fixed segmentation fault in random number generator * Enabled automatic upload to sourceforge 2010-09-10 * Adds Windows Installer and more installation stuff in Makefile * Adds matlab interface 2010-09-09 * fixes some bugs with the plotting engine 2010-09-03 * enables gamma==lambda constraints from high level python interface 2010-07-16 * Activates new interface layer swignifit * Fixes a number of memory leaks * Overhall of build system * Makes available Beta-regression for psychometric functions (so far only via swig/C++) psignifit3-3.0~beta.20120611.1/cli/000077500000000000000000000000001176542545200163015ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/cli/Makefile000066400000000000000000000040361176542545200177440ustar00rootroot00000000000000CC=g++ CFLAGS=-pg -ggdb -Wall LFLAGS=-lm -lpsipp -pg TODAY=`date +%d-%m-%G` LONGTODAY=`date +%G-%m-%d` BUILD=build SRC=../src export LIBRARY_PATH := $(SRC)/build HEADERS= $(addprefix $(SRC)/, core.h data.h errors.h optimizer.h prior.h psychometric.h sigmoid.h bootstrap.h mclist.h special.h mcmc.h rng.h linalg.h getstart.h ) CLI_H= cli.h cli_utilities.h CLI_O= $(addprefix $(BUILD)/, cli.o cli_utilities.o) compile: psignifit-mapestimate psignifit-bootstrap psignifit-mcmc psignifit-diagnostics clean: -rm -r $(BUILD) psignifit-mapestimate: $(HEADERS) $(BUILD)/psignifit-mapestimate.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-mapestimate $(OBJECTS) $(BUILD)/psignifit-mapestimate.o $(CLI_O) $(LFLAGS) psignifit-bootstrap: $(HEADERS) $(BUILD)/psignifit-bootstrap.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-bootstrap $(OBJECTS) $(BUILD)/psignifit-bootstrap.o $(CLI_O) $(LFLAGS) psignifit-mcmc: $(HEADERS) $(BUILD)/psignifit-mcmc.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-mcmc $(OBJECTS) $(BUILD)/psignifit-mcmc.o $(CLI_O) $(LFLAGS) psignifit-diagnostics: $(HEADERS) $(BUILD)/psignifit-diagnostics.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-diagnostics $(OBJECTS) $(BUILD)/psignifit-diagnostics.o $(CLI_O) $(LFLAGS) $(BUILD)/psignifit-mapestimate.o: psignifit-mapestimate.cc $(HEADERS) $(CLI_H) $(BUILD) $(CC) -c $(CFLAGS) psignifit-mapestimate.cc -o $(BUILD)/psignifit-mapestimate.o $(BUILD)/psignifit-bootstrap.o: psignifit-bootstrap.cc $(HEADERS) $(CLI_H) $(BUILD) $(CC) -c $(CFLAGS) psignifit-bootstrap.cc -o $(BUILD)/psignifit-bootstrap.o $(BUILD)/psignifit-mcmc.o: psignifit-mcmc.cc $(HEADERS) $(CLI_H) $(BUILD) $(CC) -c $(CFLAGS) psignifit-mcmc.cc -o $(BUILD)/psignifit-mcmc.o $(BUILD)/psignifit-diagnostics.o: psignifit-diagnostics.cc $(HEADERS) $(CLI_H) $(BUILD) $(CC) -c $(CFLAGS) psignifit-diagnostics.cc -o $(BUILD)/psignifit-diagnostics.o $(BUILD)/cli.o: cli.cc cli.h $(CC) -c $(CFLAGS) cli.cc -o $(BUILD)/cli.o $(BUILD)/cli_utilities.o: cli_utilities.cc cli_utilities.h $(CC) -c $(CFLAGS) cli_utilities.cc -o $(BUILD)/cli_utilities.o $(BUILD): mkdir $(BUILD) psignifit3-3.0~beta.20120611.1/cli/MakefileMinGW000066400000000000000000000100611176542545200206410ustar00rootroot00000000000000# CC=g++ CC=i586-mingw32msvc-g++ CFLAGS=-Wall LFLAGS=-lm -static TODAY=`date +%d-%m-%G` LONGTODAY=`date +%G-%m-%d` GIT_DESCRIPTION=`git describe --tags` CLI_VERSION_HEADER=cli_version.h BUILD=build SRC=../src HEADERS= $(addprefix $(SRC)/, core.h data.h errors.h optimizer.h prior.h psychometric.h sigmoid.h bootstrap.h mclist.h special.h mcmc.h rng.h linalg.h getstart.h) OBJECTS= $(addprefix $(BUILD)/, core.o data.o optimizer.o psychometric.o sigmoid.o bootstrap.o mclist.o special.o mcmc.o rng.o linalg.o getstart.o prior.o) CLI_H= cli.h cli_utilities.h CLI_O= $(addprefix $(BUILD)/, cli.o cli_utilities.o) compile: cli-version psignifit-mapestimate.exe psignifit-bootstrap.exe psignifit-mcmc.exe psignifit-diagnostics.exe cli-version: if git rev-parse &> /dev/null ; then \ echo "#ifndef CLI_VERSION_H" > $(CLI_VERSION_HEADER) ; \ echo "#define CLI_VERSION_H" >> $(CLI_VERSION_HEADER) ; \ echo "#define VERSION \""$(GIT_DESCRIPTION)"\"" >> $(CLI_VERSION_HEADER) ; \ echo "#endif" >> $(CLI_VERSION_HEADER) ; \ fi psignifit-mapestimate.exe: $(OBJECTS) $(HEADERS) $(BUILD)/psignifit-mapestimate.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-mapestimate.exe $(OBJECTS) $(BUILD)/psignifit-mapestimate.o $(CLI_O) $(LFLAGS) psignifit-bootstrap.exe: $(OBJECTS) $(HEADERS) $(BUILD)/psignifit-bootstrap.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-bootstrap.exe $(OBJECTS) $(BUILD)/psignifit-bootstrap.o $(CLI_O) $(LFLAGS) psignifit-mcmc.exe: $(OBJECTS) $(HEADERS) $(BUILD)/psignifit-mcmc.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-mcmc.exe $(OBJECTS) $(BUILD)/psignifit-mcmc.o $(CLI_O) $(LFLAGS) psignifit-diagnostics.exe: $(OBJECTS) $(HEADERS) $(BUILD)/psignifit-diagnostics.o $(CLI_H) $(CLI_O) $(CC) -o psignifit-diagnostics.exe $(OBJECTS) $(BUILD)/psignifit-diagnostics.o $(CLI_O) $(LFLAGS) $(BUILD)/psignifit-mapestimate.o: psignifit-mapestimate.cc $(HEADERS) $(CLI_H) $(CC) -c $(CFLAGS) psignifit-mapestimate.cc -o $(BUILD)/psignifit-mapestimate.o $(BUILD)/psignifit-bootstrap.o: psignifit-bootstrap.cc $(HEADERS) $(CLI_H) $(CC) -c $(CFLAGS) psignifit-bootstrap.cc -o $(BUILD)/psignifit-bootstrap.o $(BUILD)/psignifit-mcmc.o: psignifit-mcmc.cc $(HEADERS) $(CLI_H) $(CC) -c $(CFLAGS) psignifit-mcmc.cc -o $(BUILD)/psignifit-mcmc.o $(BUILD)/psignifit-diagnostics.o: psignifit-diagnostics.cc $(HEADERS) $(CLI_H) $(CC) -c $(CFLAGS) psignifit-diagnostics.cc -o $(BUILD)/psignifit-diagnostics.o $(BUILD)/cli.o: cli.cc cli.h $(CC) -c $(CFLAGS) cli.cc -o $(BUILD)/cli.o $(BUILD)/cli_utilities.o: cli_utilities.cc cli_utilities.h $(CC) -c $(CFLAGS) cli_utilities.cc -o $(BUILD)/cli_utilities.o $(BUILD): mkdir $(BUILD) $(BUILD)/core.o: $(SRC)/core.cc $(HEADERS) | $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/core.cc -o $(BUILD)/core.o $(BUILD)/data.o: $(SRC)/data.cc $(HEADERS) | $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/data.cc -o $(BUILD)/data.o $(BUILD)/optimizer.o: $(SRC)/optimizer.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/optimizer.cc -o $(BUILD)/optimizer.o $(BUILD)/psychometric.o: $(SRC)/psychometric.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/psychometric.cc -o $(BUILD)/psychometric.o $(BUILD)/sigmoid.o: $(SRC)/sigmoid.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/sigmoid.cc -o $(BUILD)/sigmoid.o $(BUILD)/mclist.o: $(SRC)/mclist.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/mclist.cc -o $(BUILD)/mclist.o $(BUILD)/bootstrap.o: $(SRC)/bootstrap.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/bootstrap.cc -o $(BUILD)/bootstrap.o $(BUILD)/special.o: $(SRC)/special.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/special.cc -o $(BUILD)/special.o $(BUILD)/mcmc.o: $(SRC)/mcmc.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/mcmc.cc -o $(BUILD)/mcmc.o $(BUILD)/rng.o: $(SRC)/rng.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/rng.cc -o $(BUILD)/rng.o $(BUILD)/linalg.o: $(SRC)/linalg.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/linalg.cc -o $(BUILD)/linalg.o $(BUILD)/getstart.o: $(SRC)/getstart.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/getstart.cc -o $(BUILD)/getstart.o $(BUILD)/prior.o: $(SRC)/prior.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) $(SRC)/prior.cc -o $(BUILD)/prior.o psignifit3-3.0~beta.20120611.1/cli/cli.cc000066400000000000000000000030661176542545200173640ustar00rootroot00000000000000#include "cli.h" void cli_parser::parse_args ( int argc, char ** argv ) { unsigned int arg; for (arg=0; arg 0 && arg 0 ) { optswitch[argv[arg]] = !optswitch[argv[arg]]; } else { args.push_front ( argv[arg] ); } } } void cli_parser::print_help ( void ) { print_version(); std::map::iterator optargs_i; std::map::iterator optswitch_i; std::cout << "\nCall: " << command << "\n\n"; std::cout << "Options:\n"; std::cout << "--------\n\n"; for ( optargs_i = optargs.begin(); optargs_i != optargs.end(); optargs_i++ ) { std::cout << " " << (*optargs_i).first << " default: " << (*optargs_i).second << "\n"; std::cout << " " << optargs_help[(*optargs_i).first] << "\n\n"; } std::cout << "Switches:\n"; std::cout << "---------\n\n"; for ( optswitch_i = optswitch.begin(); optswitch_i != optswitch.end(); optswitch_i++ ) { std::cout << " " << (*optswitch_i).first << " default: " << (*optswitch_i).second << "\n"; std::cout << " " << optswitch_help[(*optswitch_i).first] << "\n\n"; } exit ( 0 ); } void cli_parser::print_version ( void ) { std::cout << "Psignifit3 cli, version: " << VERSION << "\n"; } psignifit3-3.0~beta.20120611.1/cli/cli.h000066400000000000000000000023671176542545200172310ustar00rootroot00000000000000#ifndef CLI_H #define CLI_H #include #include #include #include #include #include #include "cli_version.h" class cli_parser { private: std::map optargs; std::map optargs_help; std::map optswitch; std::map optswitch_help; std::list args; std::string command; public: cli_parser ( std::string call ) : command ( call ) {} void add_option ( std::string option, std::string helptext, std::string defaultvalue="" ) { optargs[option] = defaultvalue; optargs_help[option] = helptext; } void add_switch ( std::string option, std::string helptext, bool defaultvalue=false ) { optswitch[option] = defaultvalue; optswitch_help[option] = helptext; } void parse_args ( int argc, char ** argv ); std::string getOptArg ( std::string option ) { return optargs[option]; } bool getOptSet ( std::string option ) { return optswitch[option]; } std::string popArg ( void ) { if ( args.empty() ) return ""; std::string out ( args.front() ); args.pop_front(); return out; } void print_help ( void ); void print_version ( void ); }; #endif psignifit3-3.0~beta.20120611.1/cli/cli_utilities.cc000066400000000000000000000234541176542545200214620ustar00rootroot00000000000000#include "cli_utilities.h" #include PsiData * allocateDataFromFile ( std::string fname, int nafc ) { std::fstream infile ( fname.c_str() ); std::list inputlines; char line[100]; unsigned int i; std::list::iterator inputlines_i; while ( !infile.eof() ) { infile.getline ( line, 100 ); if (strlen(line)>0) inputlines.push_back ( std::string ( line ) ); } std::vector x ( inputlines.size() ); std::vector k ( inputlines.size() ); std::vector n ( inputlines.size() ); double xx,kk,nn; for ( i=0, inputlines_i=inputlines.begin(); inputlines_i != inputlines.end(); inputlines_i++, i++ ) { sscanf ( (*inputlines_i).c_str(), "%lf %lf %lf\n", &xx,&kk,&nn ); if ( kk<1 ) kk *= nn; if ( kk != round(kk) ) std::cerr << "Warning: number of correct trials is " << kk << " and not an integer\n"; x[i] = xx; k[i] = kk; n[i] = nn; if ( nn < kk ) std::cerr << "Warning: number of correct trials is larger than the total number of trials!\n"; } return new PsiData ( x, n, k, nafc ); } PsiPsychometric * allocatePsychometric ( std::string core, std::string sigmoid, int nafc, PsiData* data, bool verbose=false ) { PsiSigmoid *psisigmoid; PsiCore *psicore; double alpha; PsiPsychometric * out; if ( verbose ) std::cerr << "setting up psychometric function model ("; if ( !sigmoid.compare("cauchy") ) { if (verbose) std::cerr << PsiCauchy::getDescriptor(); psisigmoid = new PsiCauchy(); } else if ( !sigmoid.compare("exponential") ) { if (verbose) std::cerr << PsiExponential::getDescriptor(); psisigmoid = new PsiExponential(); } else if ( !sigmoid.compare("gauss") ) { if (verbose) std::cerr << PsiGauss::getDescriptor(); psisigmoid = new PsiGauss(); } else if ( !sigmoid.compare("gumbel_l") ) { if (verbose) std::cerr << PsiGumbelL::getDescriptor(); psisigmoid = new PsiGumbelL(); } else if ( !sigmoid.compare("gumbel_r") ) { if (verbose) std::cerr << PsiGumbelR::getDescriptor(); psisigmoid = new PsiGumbelR(); } else if ( !sigmoid.compare("logistic") ) { if (verbose) std::cerr << PsiLogistic::getDescriptor(); psisigmoid = new PsiLogistic(); } else { std::cerr << "Unknown sigmoid " << sigmoid << "\n"; exit ( -1 ); } if ( verbose ) std::cerr << ","; if ( !core.compare("ab") ) { if (verbose) std::cerr << abCore::getDescriptor(); psicore = new abCore (); } else if ( !core.compare ( 0, 2, "mw" ) ) { alpha = atof ( core.substr( 2, 100 ).c_str() ); if (verbose) std::cerr << mwCore::getDescriptor() << alpha; psicore = new mwCore ( data, psisigmoid->getcode(), alpha ); } else if ( !core.compare ( "linear" ) ) { if (verbose) std::cerr << linearCore::getDescriptor(); psicore = new linearCore (); } else if ( !core.compare ( "log" ) ) { if (verbose) std::cerr << logCore::getDescriptor(); psicore = new logCore ( data ); } else if ( !core.compare ( "poly" ) ) { if (verbose) std::cerr << polyCore::getDescriptor(); psicore = new polyCore ( data ); } else if ( !core.compare ( "weibull" ) ) { if (verbose) std::cerr << weibullCore::getDescriptor(); psicore = new weibullCore ( data ); } else { std::cerr << "Unknown core " << sigmoid << "\n"; exit ( -1 ); } if ( verbose ) std::cerr << ") "; out = new PsiPsychometric ( nafc, psicore, psisigmoid ); delete psisigmoid; delete psicore; return out; } PsiPrior * allocatePrior ( std::string prior ) { PsiPrior *psiprior; double prm1,prm2; if ( !prior.compare ( 0, 4, "Beta" ) ) { sscanf ( prior.c_str(), "Beta(%lf,%lf)", &prm1, &prm2 ); psiprior = new BetaPrior ( prm1, prm2 ); } else if ( !prior.compare ( 0, 5, "Gamma" ) ) { sscanf ( prior.c_str(), "Gamma(%lf,%lf)", &prm1, &prm2 ); psiprior = new GammaPrior ( prm1, prm2 ); } else if ( !prior.compare ( 0, 6, "nGamma" ) ) { sscanf ( prior.c_str(), "nGamma(%lf,%lf)", &prm1, &prm2 ); psiprior = new nGammaPrior ( prm1, prm2 ); } else if ( !prior.compare ( 0, 5, "Gauss" ) ) { sscanf ( prior.c_str(), "Gauss(%lf,%lf)", &prm1, &prm2 ); psiprior = new GaussPrior ( prm1, prm2 ); } else if ( !prior.compare ( 0, 7, "Uniform" ) ) { sscanf ( prior.c_str(), "Uniform(%lf,%lf)", &prm1, &prm2 ); psiprior = new UniformPrior ( prm1, prm2 ); } else if ( !prior.compare ( "None" ) ) { psiprior = NULL; } else { std::cerr << "Unknown prior: " << prior << "\n"; exit ( -1 ); } return psiprior; } void setPriors ( PsiPsychometric * pmf, std::string prior1, std::string prior2, std::string prior3, std::string prior4 ) { PsiPrior * prior; prior = allocatePrior ( prior1 ); if (prior!=NULL) pmf->setPrior ( 0, prior ); delete prior; prior = allocatePrior ( prior2 ); if (prior!=NULL) pmf->setPrior ( 1, prior ); delete prior; prior = allocatePrior ( prior3 ); if (prior!=NULL) pmf->setPrior ( 2, prior ); delete prior; if ( pmf->getNparams()>3 ) { prior = allocatePrior ( prior4 ); if (prior!=NULL) pmf->setPrior ( 3, prior ); delete prior; } } std::vector getCuts ( std::string cuts ) { size_t pos0(0),pos1(0); unsigned int nfound(1); pos0 = cuts.find_first_of ( "," ); while ( pos0!=std::string::npos ) { nfound ++; pos0 = cuts.find_first_of ( ",", pos0+1 ); } std::vector out ( nfound ); unsigned int i(0); pos0 = 0; pos1 = cuts.find_first_of ( "," ); for (i=0; i theta, bool matlabformat, std::string varname, FILE *ofile ) { unsigned int i; char xstr[30]; if ( matlabformat ) { savestr ( theta[0], xstr ); fprintf ( ofile, "results.%s = [ %s", varname.c_str(), xstr ); for ( i=1; i theta, bool matlabformat, std::string varname, FILE *ofile ) { unsigned int i; char xstr[30]; if ( matlabformat ) { savestr ( theta[0], xstr ); fprintf ( ofile, "results.%s = [ %s", varname.c_str(), xstr ); for ( i=1; i theta, PsiData *data, FILE* ofile, bool matlabformat ) { unsigned int i,j; unsigned int nparameters ( pmf->getNparams() ); char xstr[30]; Matrix * fisher = pmf->ddnegllikeli ( theta, data ); if ( matlabformat ) { fprintf ( ofile, "results.fisher_info = [ " ); for ( i=0; i >& theta, bool matlabformat, std::string varname, FILE *ofile ) { unsigned i, j; char xstr[30]; if ( matlabformat ) { fprintf ( ofile, "results.%s = [ ", varname.c_str() ); for ( i=0; i >& theta, bool matlabformat, std::string varname, FILE *ofile ) { unsigned i, j; char xstr[30]; if ( matlabformat ) { fprintf ( ofile, "results.%s = [ ", varname.c_str() ); for ( i=0; i #include #include #include PsiData * allocateDataFromFile ( std::string fname, int nafc ); PsiPsychometric * allocatePsychometric ( std::string core, std::string sigmoid, int nafc, PsiData* data, bool verbose ); PsiPrior * allocatePrior ( std::string prior ); void setPriors ( PsiPsychometric * pmf, std::string prior1, std::string prior2, std::string prior3, std::string prior4 ); std::vector getCuts ( std::string cuts ); void print ( std::vector theta, bool matlabformat, std::string varname, FILE *ofile ); void print ( double theta, bool matlabformat, std::string varname, FILE *ofile ); void print ( std::vector< std::vector >& theta, bool matlabformat, std::string varname, FILE *ofile ); void print ( std::vector< std::vector >& theta, bool matlabformat, std::string varname, FILE *ofile ); void print ( std::vector theta, bool matlabformat, std::string varname, FILE *ofile ); void print_fisher ( PsiPsychometric *pmf, std::vector theta, PsiData *data, FILE* ofile, bool matlabformat ); #endif psignifit3-3.0~beta.20120611.1/cli/psignifit-bootstrap.cc000066400000000000000000000264641176542545200226330ustar00rootroot00000000000000/** * psignifit-bootstrap: bootstrap inference for psychometric functions * * This file is part of the command line interface to psignifit. * * See COPYING file distributed along with the psignifit package for the copyright and * license terms */ #include "../src/psipp.h" #include "cli.h" #include "cli_utilities.h" #include int main ( int argc, char ** argv ) { // Parse command line cli_parser parser ( "psignifit-bootstrap [options] [ ... ]" ); parser.add_option ( "-c", "psignifit core object to be used", "mw0.1" ); parser.add_option ( "-s", "psignifit sigmoid object to be used", "logistic" ); parser.add_option ( "-prior1", "prior for the first parameter (alpha,a,m,...)", "None" ); parser.add_option ( "-prior2", "prior for the second parameter (beta,b,w,...)", "None" ); parser.add_option ( "-prior3", "prior for the third parameter (lambda)", "Uniform(0,.1)" ); parser.add_option ( "-prior4", "prior for the fourth parameter (gamma)", "Uniform(0,.1)" ); parser.add_option ( "-nafc", "number of response alternatives in forced choice designs (set this to 1 for yes-no tasks)", "2" ); parser.add_option ( "-nsamples","number of bootstrap samples to be generated","2000" ); parser.add_option ( "-o", "write output to this file", "stdout" ); parser.add_option ( "-cuts", "cuts to be determined", "0.25,0.50,0.75" ); parser.add_switch ( "-v", "display status messages", false ); parser.add_switch ( "--summary", "write a short summary to stdout" ); parser.add_switch ( "-e", "In yes-no tasks: set gamma==lambda", false ); parser.add_switch ( "-nonparametric", "Use nonparametric bootstrap instead of the default parametric bootstrap", false ); parser.add_switch ( "--matlab", "format output to be parsable by matlab", false ); parser.parse_args ( argc, argv ); // Set up the most important data bool verbose ( parser.getOptSet ( "-v" ) ), pmfshown ( false ), summary ( parser.getOptSet( "--summary" ) );; PsiData *data; PsiPsychometric *pmf; PsiOptimizer * opt; std::vector theta; std::vector cuts (getCuts ( parser.getOptArg("-cuts") ) ); unsigned int i,j, ncuts(cuts.size()), nparams, nblocks; BootstrapList *bs_list; JackKnifeList *jk_list; unsigned int nsamples ( atoi ( parser.getOptArg("-nsamples").c_str() ) ); double th; double sl; double th_m; double sl_m; double m,s; setSeed (0); // Contents of the bootstrap lists std::vector< std::vector > mcthres ( nsamples, cuts ); std::vector< std::vector > mcslopes ( nsamples, cuts ); std::vector< std::vector > *mcestimates; std::vector< std::vector > *mcdata; std::vector mcdeviance ( nsamples ); std::vector mcRpd ( nsamples ); std::vector mcRkd ( nsamples ); std::vector bias_thres ( ncuts ); std::vector acc_thres ( ncuts ); std::vector bias_slope ( ncuts ); std::vector acc_slope ( ncuts ); std::vector thresholds ( ncuts ); std::vector slopes ( ncuts ); std::vector *influential; std::vector *outliers; std::vector *ci_lower; std::vector *ci_upper; std::vector *devianceresiduals; // Use matlabformat? bool matlabformat ( parser.getOptSet ( "--matlab" ) ); // Get the output file FILE * ofile; if ( !(parser.getOptArg ( "-o" ).compare( "stdout" )) ) { if ( verbose ) std::cerr << "Writing results to stdout\n"; ofile = stdout; } else ofile = fopen ( parser.getOptArg ( "-o" ).c_str(), "w" ); // Write some status messages if (verbose) { std::cerr << "core: " << parser.getOptArg ( "-c" ) << "\n"; std::cerr << "sigmoid: " << parser.getOptArg ( "-s" ) << "\n"; std::cerr << "cuts: "; for (i=0; igetNblocks(); if ( verbose ) std::cerr << "Read " << nblocks << " blocks "; if ( verbose ) { std::cerr << "Data:\n"; for (i=0; igetIntensity ( i ) << " " << data->getNcorrect ( i ) << " " << data->getNtrials ( i ) << "\n"; } // Get the psychometric function model pmf = allocatePsychometric ( parser.getOptArg ( "-c" ), parser.getOptArg ( "-s" ), atoi ( parser.getOptArg ( "-nafc" ).c_str() ), data, verbose && !pmfshown); pmfshown = true; if ( parser.getOptSet ( "-e" ) ) pmf->setgammatolambda(); setPriors ( pmf, parser.getOptArg ( "-prior1" ), parser.getOptArg ( "-prior2" ), parser.getOptArg ( "-prior3" ), parser.getOptArg ( "-prior4" ) ); nparams = pmf->getNparams(); // Determine starting value opt = new PsiOptimizer ( pmf, data ); theta = opt->optimize ( pmf, data ); // Sample if ( verbose ) { std::cerr << "Starting sampling ..."; std::cerr << "bs..."; std::cerr.flush(); } bs_list = new BootstrapList ( bootstrap ( atoi(parser.getOptArg("-nsamples").c_str()), data, pmf, cuts, &theta,true,!(parser.getOptSet("-nonparametric")) ) ); if ( verbose ) { std::cerr << "jk..."; std::cerr.flush(); } jk_list = new JackKnifeList ( jackknifedata ( data, pmf ) ); if ( verbose ) { std::cerr << " Done"; std::cerr.flush(); } if ( verbose ) std::cerr << "\n"; // These might change during analysis and have to be allocated for each file mcestimates = new std::vector< std::vector > (nsamples); mcdata = new std::vector< std::vector > (nsamples); influential = new std::vector (nblocks); outliers = new std::vector (nblocks); ci_lower = new std::vector (nparams); ci_upper = new std::vector (nparams); // Now store everything that is related to inteval estimation of parameters for ( i=0; igetEst ( i ); (*mcdata)[i] = bs_list->getData ( i ); for ( j=0; jgetThres_byPos ( i, j ); mcslopes[i][j] = bs_list->getSlope_byPos ( i, j ); } } for ( j = 0; jgetBias_t(j); acc_thres[j] = bs_list->getAcc_t(j); bias_slope[j] = bs_list->getBias_s(j); acc_slope[j] = bs_list->getAcc_s(j); } for ( i=0; igetPercentile ( .025, i ); (*ci_upper)[i] = bs_list->getPercentile ( .975, i ); } for ( i=0; iinfluential ( i, *ci_lower, *ci_upper ); (*outliers)[i] = jk_list->outlier ( i ); } // Write a summary of the parameter estimation if requested. if ( summary ) { std::cerr << "Parameter estimates:\n"; std::cerr << "--------------------\n"; for ( i=0; igetThres ( theta, cuts[i] ); std::cerr << "Threshold(" << cuts[i] << ") = " << th << "\tCI_95 = (" << bs_list->getThres(.025,i) << "," << bs_list->getThres(.975,i) << ") "; std::cerr << "Slope(" << cuts[i] << ") = " << pmf->getSlope ( theta, th ) << "\tCI_95 = (" << bs_list->getSlope(.025,i) << "," << bs_list->getSlope(.975,i) << ")\n"; } } // Get thresholds and slopes for ( i=0; igetThres ( theta, cuts[i] ); thresholds[i] = th_m; sl_m = pmf->getSlope ( theta, th_m ); slopes[i] = sl_m; } // If we performed nonparametric bootstrap, we can't use the bootstrap samples for goodness of fit // Here we perform a second, parametric bootstrap that gives the data for the goodness of fit assessment if ( parser.getOptSet("-nonparametric") ) { // redo bootstrap to obtain goodness of fit form parametric simulations delete bs_list; bs_list = new BootstrapList ( bootstrap ( atoi(parser.getOptArg("-nsamples").c_str()), data, pmf, cuts, &theta, true, true ) ); } // Now store everything related to goodness of fit for ( i=0; igetdeviance(i); mcRpd[i] = bs_list->getRpd(i); mcRkd[i] = bs_list->getRkd(i); } // Write a summary of the goodness of fit statistics if requested if ( summary ) { devianceresiduals = new std::vector ( pmf->getDevianceResiduals ( theta, data ) ); std::cerr << "\n"; std::cerr << "Goodness of fit statistics:\n"; std::cerr << "---------------------------\n"; std::cerr << "Deviance: " << pmf->deviance ( theta, data ) << "\tcrit: " << bs_list->getDeviancePercentile ( .95 ) << "\n"; std::cerr << "Rpd: " << pmf->getRpd ( *devianceresiduals, theta, data ) << "\tcrit: (" << bs_list->percRpd(.025) << "," << bs_list->percRpd(.975) << ")\n"; std::cerr << "Rkd: " << pmf->getRkd ( *devianceresiduals, data ) << "\tcrit: (" << bs_list->percRkd(.025) << "," << bs_list->percRkd(.975) << ")\n"; delete devianceresiduals; } // Now store everything in the output file. print ( *mcdata, matlabformat, "mcdata", ofile ); print ( *mcestimates, matlabformat, "mcestimates", ofile ); print ( mcdeviance, matlabformat, "mcdeviance", ofile ); print ( mcthres, matlabformat, "mcthres", ofile ); print ( mcslopes, matlabformat, "mcslopes", ofile ); print ( mcRpd, matlabformat, "mcRpd", ofile ); print ( mcRkd, matlabformat, "mcRkd", ofile ); print ( *influential, matlabformat, "influential", ofile ); print ( *outliers, matlabformat, "outliers", ofile ); print ( bias_thres, matlabformat, "bias_thres", ofile ); print ( bias_slope, matlabformat, "bias_slope", ofile ); print ( acc_thres, matlabformat, "acc_thres", ofile ); print ( acc_slope, matlabformat, "acc_slope", ofile ); print ( thresholds, matlabformat, "thresholds", ofile ); print ( slopes, matlabformat, "slopes", ofile ); // Get the next input file (if there is one) fname = parser.popArg(); // Clean up delete mcestimates; delete mcdata; delete influential; delete outliers; delete data; delete pmf; delete opt; } return 0; } psignifit3-3.0~beta.20120611.1/cli/psignifit-diagnostics.cc000066400000000000000000000111141176542545200231070ustar00rootroot00000000000000/** * psignifit-diagnostics: diagnostic information for psychometric functions * * This file is part of the command line interface to psignifit. * * See COPYING file distributed along with the psignifit package for the copyright and * license terms */ #include "../src/psipp.h" #include "cli.h" #include "cli_utilities.h" #include int main ( int argc, char ** argv ) { // Analyze the command line cli_parser parser ( "psignifit-diagnostics [options] [ ... ]" ); parser.add_option ( "-c", "psignifit core object to be used", "mw0.1" ); parser.add_option ( "-s", "psignifit sigmoid object to be used", "logistic" ); parser.add_option ( "-nafc", "number of response alternatives in forced choice designs (set this to 1 for yes-no tasks)", "2" ); parser.add_option ( "-o", "write output to this file", "stdout" ); parser.add_option ( "-cuts", "cuts to be determined", "0.25,0.50,0.75" ); parser.add_option ( "-params", "parameters to be evaluated", "4.0,2.0,0.02" ); parser.add_switch ( "-v", "display status messages", false ); parser.add_switch ( "-e", "In yes-no tasks: set gamma==lambda", false ); parser.add_switch ( "--matlab", "format output to be parsable by matlab", false ); parser.parse_args ( argc, argv ); // Set up the environment bool verbose ( parser.getOptSet ( "-v" ) ), pmfshown ( false ); PsiData *data; PsiPsychometric *pmf; std::vector theta (getCuts ( parser.getOptArg("-params") ) ); std::vector cuts (getCuts ( parser.getOptArg("-cuts") ) ); double xmin,xmax,dx; unsigned int i; // Use matlabformat? bool matlabformat ( parser.getOptSet ( "--matlab" ) ); // Output stuff std::vector< std::vector > predicted; std::vector devianceresiduals; // Where do we want output to go FILE * ofile; if ( !(parser.getOptArg ( "-o" ).compare( "stdout" )) ) { if ( verbose ) std::cerr << "Writing results to stdout\n"; ofile = stdout; } else ofile = fopen ( parser.getOptArg ( "-o" ).c_str(), "w" ); if (verbose) { std::cerr << "core: " << parser.getOptArg ( "-c" ) << "\n"; std::cerr << "sigmoid: " << parser.getOptArg ( "-s" ) << "\n"; std::cerr << "cuts: "; for (i=0; igetNblocks() << " blocks "; // Here, we set up the psychometric function model pmf = allocatePsychometric ( parser.getOptArg ( "-c" ), parser.getOptArg ( "-s" ), atoi ( parser.getOptArg ( "-nafc" ).c_str() ), data, verbose && !pmfshown); pmfshown = true; if ( parser.getOptSet ( "-e" ) ) pmf->setgammatolambda(); // Replace cuts with the derived thresholds at the cuts for ( i=0; igetThres ( theta, cuts[i] ); } if ( verbose ) std::cerr << "\n"; // Print output predicted = std::vector< std::vector > ( data->getNblocks(), std::vector(2) ); xmin = 1e10; xmax=-1e10; for ( i=0; igetNblocks(); i++ ) { predicted[i][0] = data->getIntensity(i); predicted[i][1] = pmf->evaluate ( data->getIntensity(i), theta ); if ( data->getIntensity(i) < xmin ) xmin = data->getIntensity(i); if ( data->getIntensity(i) > xmax ) xmax = data->getIntensity(i); } print ( predicted, matlabformat, "prediction", ofile ); predicted = std::vector< std::vector > ( 100, std::vector(2) ); dx = xmax-xmin; dx /= 99; for ( i=0; i<100; i++ ) { predicted[i][0] = xmin + i*dx; predicted[i][1] = pmf->evaluate ( predicted[i][0], theta ); } print ( predicted, matlabformat, "pmf", ofile ); devianceresiduals = pmf->getDevianceResiduals ( theta, data ); print ( devianceresiduals, matlabformat, "devianceresiduals", ofile ); print ( cuts, matlabformat, "thres", ofile ); print ( pmf->deviance ( theta, data ), matlabformat, "deviance", ofile ); print ( pmf->getRpd ( devianceresiduals, theta, data ), matlabformat, "rpd", ofile ); print ( pmf->getRkd ( devianceresiduals, data ), matlabformat, "rkd", ofile ); fname = parser.popArg(); // Clean up delete data; delete pmf; } return 0; } psignifit3-3.0~beta.20120611.1/cli/psignifit-mapestimate.cc000066400000000000000000000104241176542545200231140ustar00rootroot00000000000000/** * psignifit-mapestimate: mapestimation of parameters for psychometric functions * * This file is part of the command line interface to psignifit. * * See COPYING file distributed along with the psignifit package for the copyright and * license terms */ #include "../src/psipp.h" #include "cli.h" #include "cli_utilities.h" #include int main ( int argc, char ** argv ) { // Analyze the command line cli_parser parser ( "psignifit-mapestimate [options] [ ... ]" ); parser.add_option ( "-c", "psignifit core object to be used", "mw0.1" ); parser.add_option ( "-s", "psignifit sigmoid object to be used", "logistic" ); parser.add_option ( "-prior1", "prior for the first parameter (alpha,a,m,...)", "None" ); parser.add_option ( "-prior2", "prior for the second parameter (beta,b,w,...)", "None" ); parser.add_option ( "-prior3", "prior for the third parameter (lambda)", "Uniform(0,.1)" ); parser.add_option ( "-prior4", "prior for the fourth parameter (gamma)", "Uniform(0,.1)" ); parser.add_option ( "-nafc", "number of response alternatives in forced choice designs (set this to 1 for yes-no tasks)", "2" ); parser.add_option ( "-o", "write output to this file", "stdout" ); parser.add_option ( "-cuts", "cuts to be determined", "0.25,0.50,0.75" ); parser.add_switch ( "-v", "display status messages", false ); parser.add_switch ( "-e", "In yes-no tasks: set gamma==lambda", false ); parser.add_switch ( "--matlab", "format output to be parsable by matlab", false ); parser.parse_args ( argc, argv ); // Set up the environment bool verbose ( parser.getOptSet ( "-v" ) ), pmfshown ( false ); PsiData *data; PsiPsychometric *pmf; PsiOptimizer * opt; std::vector theta; std::vector cuts (getCuts ( parser.getOptArg("-cuts") ) ); unsigned int i; // Where do we want output to go FILE * ofile; if ( !(parser.getOptArg ( "-o" ).compare( "stdout" )) ) { if ( verbose ) std::cerr << "Writing results to stdout\n"; ofile = stdout; } else ofile = fopen ( parser.getOptArg ( "-o" ).c_str(), "w" ); if (verbose) { std::cerr << "core: " << parser.getOptArg ( "-c" ) << "\n"; std::cerr << "sigmoid: " << parser.getOptArg ( "-s" ) << "\n"; std::cerr << "cuts: "; for (i=0; igetNblocks() << " blocks "; // Here, we set up the psychometric function model pmf = allocatePsychometric ( parser.getOptArg ( "-c" ), parser.getOptArg ( "-s" ), atoi ( parser.getOptArg ( "-nafc" ).c_str() ), data, verbose && !pmfshown); pmfshown = true; if ( parser.getOptSet ( "-e" ) ) pmf->setgammatolambda(); setPriors ( pmf, parser.getOptArg ( "-prior1" ), parser.getOptArg ( "-prior2" ), parser.getOptArg ( "-prior3" ), parser.getOptArg ( "-prior4" ) ); // Perform the optimization opt = new PsiOptimizer ( pmf, data ); theta = opt->optimize ( pmf, data ); // Replace cuts with the derived thresholds at the cuts for ( i=0; igetThres ( theta, cuts[i] ); } if ( verbose ) std::cerr << "\n"; // Print output print ( theta, parser.getOptSet ( "--matlab" ), "params_estimate", ofile ); print_fisher ( pmf, theta, data, ofile, parser.getOptSet ( "--matlab" ) ); print ( cuts, parser.getOptSet ( "--matlab" ), "thres", ofile ); print ( pmf->deviance ( theta, data ), parser.getOptSet ( "--matlab" ), "deviance", ofile ); fname = parser.popArg(); // Clean up delete data; delete pmf; delete opt; } return 0; } psignifit3-3.0~beta.20120611.1/cli/psignifit-mcmc.cc000066400000000000000000000342631176542545200215310ustar00rootroot00000000000000/** * psignifit-mcmc: bayesian inference for psychometric functions * * This file is part of the command line interface to psignifit. * * See COPYING file distributed along with the psignifit package for the copyright and * license terms */ #include "../src/psipp.h" #include "cli.h" #include "cli_utilities.h" #include #include double prctile ( std::vector x, double p ) { sort ( x.begin(), x.end() ); unsigned int pos ( floor(p*x.size()) ); return x[pos]; } int main ( int argc, char ** argv ) { // Parse command line cli_parser parser ( "psignifit-mcmc [options] [ ... ]" ); parser.add_option ( "-c", "psignifit core object to be used", "mw0.1" ); parser.add_option ( "-s", "psignifit sigmoid object to be used", "logistic" ); parser.add_option ( "-prior1", "prior for the first parameter (alpha,a,m,...)", "None" ); parser.add_option ( "-prior2", "prior for the second parameter (beta,b,w,...)", "None" ); parser.add_option ( "-prior3", "prior for the third parameter (lambda)", "Uniform(0,.1)" ); parser.add_option ( "-prior4", "prior for the fourth parameter (gamma)", "Uniform(0,.1)" ); parser.add_option ( "-nafc", "number of response alternatives in forced choice designs (set this to 1 for yes-no tasks)", "2" ); parser.add_option ( "-nsamples", "number of markov chain monte carlo samples to be generated","2000" ); parser.add_option ( "-o", "write output to this file", "stdout" ); parser.add_option ( "-cuts", "cuts to be determined", "0.25,0.50,0.75" ); parser.add_option ( "-proposal", "standard deviations of the proposal distribution (or name of file with pilot samples)", "0.1,0.1,0.01" ); parser.add_option ( "-start", "starting values for the sampling process", "mapestimate" ); parser.add_switch ( "-v", "display status messages", false ); parser.add_switch ( "--summary", "write a short summary to stdout" ); parser.add_switch ( "-e", "In yes-no tasks: set gamma==lambda", false ); parser.add_switch ( "-generic", "Use generic metropolis instead of the default standard metropolis hastings", false ); parser.add_switch ( "--matlab", "format output to be parsable by matlab", false ); parser.parse_args ( argc, argv ); // Set up the most important data bool verbose ( parser.getOptSet ( "-v" ) ), pmfshown ( false ), summary ( parser.getOptSet( "--summary" ) ), generic ( parser.getOptSet ( "-generic" ) ); unsigned int i,j, ncuts, nparams, nblocks; PsiData *data; PsiPsychometric *pmf; PsiOptimizer *opt; PsiSampler *sampler; std::vector theta; std::vector cuts (getCuts ( parser.getOptArg("-cuts") ) ); ncuts = cuts.size (); PsiMClist *pilotsample = NULL; char sline[80]; MCMCList *mcmc_list; unsigned int nsamples ( atoi ( parser.getOptArg("-nsamples").c_str() ) ); double th; double sl; double th_m; double sl_m; double meanestimate; double bayesian_p; GaussRandom proposal; setSeed (0); // We might either want to read the stepwidths or a pilot sample std::vector stepwidths; std::fstream pilotfile ( parser.getOptArg ( "-proposal" ).c_str() ); if ( pilotfile.fail() ) stepwidths = getCuts ( parser.getOptArg("-proposal") ); else { // read data from file if ( verbose ) std::cerr << "Reading pilot data..."; while ( strcmp(sline,"# mcestimates") ) { pilotfile.getline ( sline, 80 ); } j = pilotfile.tellg(); nblocks = 1; pilotfile.getline ( sline, 80 ); nparams = 0; i = std::string ( sline ).find('.'); while ( i!=std::string::npos ) { nparams ++; i = std::string ( sline ).find ('.',i+1); } if ( verbose ) std::cerr << "nparams: " << nparams; while ( strcmp(sline,"") ) { nblocks++; pilotfile.getline ( sline, 80 ); } pilotfile.clear(); // If we passed the end of the file pilotfile.seekg ( j, std::ios::beg ); theta = std::vector ( nparams ); pilotsample = new PsiMClist ( nblocks, nparams ); for ( i=0; i> theta[j]; } pilotsample->setEst ( i, theta, 0 ); } // In case we use MH-Sampling: determine stepwidths as averages if ( verbose ) std::cerr << " sd: "; stepwidths = std::vector ( nparams ); for ( j=0 ; jgetMean ( j ); for ( i=0; igetEst ( i, j )-theta[j])*(pilotsample->getEst ( i, j )-theta[j]); } stepwidths[j] /= pilotsample->getNsamples()-1; stepwidths[j] = sqrt(stepwidths[j]); if ( verbose ) std::cerr << stepwidths[j] << " "; } if ( verbose ) std::cerr << "\n"; } // Contents of the mcmc lists std::vector< std::vector > mcthres ( nsamples, cuts ); std::vector< std::vector > mcslopes ( nsamples, cuts ); std::vector< std::vector > *mcestimates; std::vector< std::vector > *mcdata; std::vector mcdeviance ( nsamples ); std::vector mcRpd ( nsamples ); std::vector mcRkd ( nsamples ); std::vector ppdeviance ( nsamples ); std::vector ppRpd ( nsamples ); std::vector ppRkd ( nsamples ); std::vector dummydata ( nsamples/2 ); std::vector thresholds ( ncuts ); std::vector slopes ( ncuts ); std::vector *influential; std::vector *outliers; std::vector *ci_lower; std::vector *ci_upper; std::vector *devianceresiduals; // Use matlabformat? bool matlabformat ( parser.getOptSet ( "--matlab" ) ); // Get the output file FILE * ofile; if ( !(parser.getOptArg ( "-o" ).compare( "stdout" )) ) { if ( verbose ) std::cerr << "Writing results to stdout\n"; ofile = stdout; } else ofile = fopen ( parser.getOptArg ( "-o" ).c_str(), "w" ); // Write some status messages if (verbose) { std::cerr << "core: " << parser.getOptArg ( "-c" ) << "\n"; std::cerr << "sigmoid: " << parser.getOptArg ( "-s" ) << "\n"; std::cerr << "cuts: "; for (i=0; igetNblocks(); if ( verbose ) std::cerr << "Read " << nblocks << " blocks "; // Get the psychometric function model pmf = allocatePsychometric ( parser.getOptArg ( "-c" ), parser.getOptArg ( "-s" ), atoi ( parser.getOptArg ( "-nafc" ).c_str() ), data, verbose && !pmfshown); pmfshown = true; if ( parser.getOptSet ( "-e" ) ) pmf->setgammatolambda(); setPriors ( pmf, parser.getOptArg ( "-prior1" ), parser.getOptArg ( "-prior2" ), parser.getOptArg ( "-prior3" ), parser.getOptArg ( "-prior4" ) ); nparams = pmf->getNparams(); // Determine starting value opt = new PsiOptimizer ( pmf, data ); theta = opt->optimize ( pmf, data ); // Set up the sampler if ( generic ) { sampler = new GenericMetropolis ( pmf, data, &proposal ); if ( pilotsample != NULL ) { ((GenericMetropolis*)sampler)->findOptimalStepwidth ( *pilotsample ); } else { sampler->setStepSize ( stepwidths ); } } else { sampler = new MetropolisHastings ( pmf, data, &proposal ); sampler->setStepSize ( stepwidths ); } if ( parser.getOptArg ( "-start" ) == "mapestimate" ) { ((MetropolisHastings*)sampler)->setTheta ( theta ); } else { ((MetropolisHastings*)sampler)->setTheta ( getCuts ( parser.getOptArg ( "-start" ) ) ); } // Sample if ( verbose ) { std::cerr << "Starting sampling ..."; std::cerr.flush(); } mcmc_list = new MCMCList ( sampler->sample ( nsamples ) ); if ( verbose ) std::cerr << " Done \n"; // These might change during analysis and have to be allocated for each file mcestimates = new std::vector< std::vector > (nsamples); mcdata = new std::vector< std::vector > (nsamples); influential = new std::vector (nblocks); outliers = new std::vector (nblocks); ci_lower = new std::vector (nparams); ci_upper = new std::vector (nparams); // Now store everything that is related to inteval estimation of parameters for ( i=0; igetEst ( i ); (*mcdata)[i] = mcmc_list->getppData ( i ); for ( j=0; jgetThres ( (*mcestimates)[i], cuts[j] ); mcslopes[i][j] = pmf->getSlope ( (*mcestimates)[i], cuts[j] ); } } for ( i=0; igetlogratio (j,i); } } // Write a summary of the parameter estimation if requested. if ( summary ) { std::cerr << "Parameter estimates:\n"; std::cerr << "--------------------\n"; for ( i=0; igetThres ( theta, cuts[i] ); for ( j=0; jgetThres ( (*mcestimates)[nsamples/2+j], cuts[i] ); } std::cerr << "Threshold(" << cuts[i] << ") = " << th << "\tCI_95 = (" << prctile(dummydata,.025) << "," << prctile(dummydata,.975) << ") "; for ( j=0; jgetSlope ( (*mcestimates)[nsamples/2+j], cuts[i] ); } std::cerr << "Slope(" << cuts[i] << ") = " << pmf->getSlope ( theta, th ) << "\tCI_95 = (" << prctile(dummydata,.025) << "," << prctile(dummydata,.975) << ")\n"; } } for ( i=0; igetThres ( theta, cuts[i] ); thresholds[i] = th_m; sl_m = pmf->getSlope ( theta, th_m ); slopes[i] = sl_m; } // Now store everything related to goodness of fit for ( i=0; igetdeviance(i); mcRpd[i] = mcmc_list->getRpd(i); mcRkd[i] = mcmc_list->getRkd(i); ppdeviance[i] = mcmc_list->getppDeviance(i); ppRpd[i] = mcmc_list->getppRpd(i); ppRkd[i] = mcmc_list->getppRkd(i); } // Write a summary of the goodness of fit statistics if requested if ( summary ) { devianceresiduals = new std::vector ( pmf->getDevianceResiduals ( theta, data ) ); std::cerr << "\n"; std::cerr << "Goodness of fit statistics:\n"; std::cerr << "---------------------------\n"; bayesian_p = 0; for ( i=nsamples/2; i mcdeviance[i]; bayesian_p /= nsamples/2; std::cerr << "Deviance: " << pmf->deviance ( theta, data ) << "\tbayesian_p: " << bayesian_p << "\n"; bayesian_p = 0; for ( i=nsamples/2; i mcRpd[i]; bayesian_p /= nsamples/2; std::cerr << "Rpd: " << pmf->getRpd ( *devianceresiduals, theta, data ) << "\tbayesian_p: " << bayesian_p << ")\n"; bayesian_p = 0; for ( i=nsamples/2; i mcRkd[i]; bayesian_p /= nsamples/2; std::cerr << "Rkd: " << pmf->getRkd ( *devianceresiduals, data ) << "\tbayesian_p: " << bayesian_p << ")\n"; delete devianceresiduals; } // Now store everything in the output file. print ( *mcdata, matlabformat, "mcdata", ofile ); print ( *mcestimates, matlabformat, "mcestimates", ofile ); print ( mcdeviance, matlabformat, "mcdeviance", ofile ); print ( ppdeviance, matlabformat, "ppdeviance", ofile ); print ( mcthres, matlabformat, "mcthres", ofile ); print ( mcslopes, matlabformat, "mcslopes", ofile ); print ( mcRpd, matlabformat, "mcRpd", ofile ); print ( ppRpd, matlabformat, "ppRpd", ofile ); print ( mcRkd, matlabformat, "mcRkd", ofile ); print ( ppRkd, matlabformat, "ppRkd", ofile ); print ( *influential, matlabformat, "influential", ofile ); print ( thresholds, matlabformat, "thresholds", ofile ); print ( slopes, matlabformat, "slopes", ofile ); // Get the next input file (if there is one) fname = parser.popArg(); // Clean up delete mcestimates; delete mcdata; delete influential; delete outliers; delete data; delete pmf; delete opt; } if (pilotsample!=NULL) delete pilotsample; return 0; } psignifit3-3.0~beta.20120611.1/cli/psignifit3000077500000000000000000000014231176542545200203060ustar00rootroot00000000000000#!/bin/sh # command line wrapper for psignifit3 print_help() { cat << END Usage: psignifit3 COMMAND [OPTIONS] FILE [FILE ...]" COMMANDS are: bootstrap -- perform bootstrap inference mcmc -- perform mcmc inference mapestimate -- obtain mapestimate diagnostics -- miscellaneous diagnostics help -- print this help message for help on commands try: psignifit3 COMMAND -h END } COMMAND=$1 ; shift case $COMMAND in "bootstrap") psignifit-bootstrap $@;; "mcmc") psignifit-mcmc $@;; "mapestimate") psignifit-mapestimate $@;; "diagnostics") psignifit-diagnostics $@;; "help" | "") print_help ;; *) print_help echo "Fatal: '$COMMAND' is not a valid command!" ;; esac psignifit3-3.0~beta.20120611.1/compare_mcmc_asir.rst000066400000000000000000000016021176542545200217260ustar00rootroot00000000000000Comparison: MCMC vs ASIR -- Are they equal? =========================================== Analyze 3 datasets per condition, repeat analysis of each dataset 3 times. Restrict sampler to 100.000 > number of mcmc samples (psignifit code!) Questions --------- * Numerically the same results * Computation time * If MCMC does not converge, do we get "something useful" from ASIR? Numerical comparison of the following percentiles: 2.5%, 31.6%, 50%, 68.4%, 97.5% Also compare mean and variance. Simulation parameters --------------------- sigmoid="logistic" core="mw0.1" * 20, 40, 60 trials/block * 4, 6, 8, 12 blocks * w_gen = 1, 2, 4 * Sampling: Best Wichmann & Hill Sampling auf der Basis m=4, w=2, for yes/no and 2afc * yes/no, 2afc Should give a total of 648 runs! Sampling schemes ---------------- 2afc-S7 (best 2afc): 0.34, 0.44, 0.54, 0.80, 0.90, 0.98 yes/no-y1: 0.01,0.1,0.2,0.8,0.9,0.99 psignifit3-3.0~beta.20120611.1/doc-src/000077500000000000000000000000001176542545200170645ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/doc-src/ADDITIONALPLOTSBOOTSTRAP.rst000066400000000000000000000024201176542545200233440ustar00rootroot00000000000000=================================== Additional Plots for the Bootstrap =================================== In addition to the plots mentioned in the :doc:`tutorial ` you can access several other plots in psignifit. Parameter Plots --------------- >>> ParameterPlot(B) In an interactive session, this should open a window showing the sampling distribution of the model parameters as shown below (you might have to type show() to see the window). .. image:: BootstrapParameters.png Each of these plots shows the sampling distribution of the model parameters. In addition, the estimated parameter is marked by a solid vertical line and the 95% confidence interval is marked by dotted vertical lines. The confidence interval limits and the estimates are written on top of the graph. Threshold Plots --------------- In some cases, we may not directly be interested in the parameters of the model. Instead, we ask for "thresholds", that is predefined performance levels of the sigmoid :math:`F`. We can get a plot of such thresholds and the associated confidence intervals using the function:: >> ThresholdPlot(B) The image looks essentially the same as for the ParameterPlot only that this time, the threshold(s) of the model are displayed. .. image:: BootstrapThresholds.png psignifit3-3.0~beta.20120611.1/doc-src/API.rst000066400000000000000000000034371176542545200202360ustar00rootroot00000000000000============= psignifit API ============= Data Types ========== .. automodule:: pypsignifit.psignidata .. currentmodule:: pypsignifit.psignidata .. autosummary:: BootstrapInference BayesInference .. autoclass:: BootstrapInference :members: .. autoclass:: BayesInference :members: Diagnostic Plots ================ Default functions ----------------- The following functions will be imported by default: .. currentmodule:: pypsignifit.psigniplot .. autosummary:: GoodnessOfFit ConvergenceMCMC ParameterPlot ThresholdPlot plotSensitivity plotInfluential plotMultiplePMFs .. automodule:: pypsignifit.psigniplot :members: Subfunctions ------------ To get access to all plot functions in isolation, they can also be imported separately. Here is the documentation .. currentmodule:: pypsignifit.psigniplot .. autosummary:: drawaxes plotRd plotHistogram plotPMF plotThres plotGeweke plotChains plotParameterDist .. autofunction:: drawaxes .. autofunction:: plotRd .. autofunction:: plotHistogram .. autofunction:: plotppScatter .. autofunction:: plotPMF .. autofunction:: plotThres .. autofunction:: plotGeweke .. autofunction:: plotChains .. autofunction:: plotParameterDist Simulated Observers =================== psignifit allows to simulate a number of observers to access stability of psychometric functions. .. currentmodule:: pypsignifit.psigobservers .. autosummary:: Observer LinearSystemLearner CriterionSettingObserver BetaBinomialObserver .. autoclass:: Observer :members: .. autoclass:: LinearSystemLearner :members: .. autoclass:: CriterionSettingObserver :members: .. autoclass:: BetaBinomialObserver :members: Errors ====== .. automodule:: pypsignifit.psignierrors :members: psignifit3-3.0~beta.20120611.1/doc-src/BAYESINTRO.rst000066400000000000000000000357261176542545200213120ustar00rootroot00000000000000Bayesian model fitting and prior selection ========================================== The new psignifit version heavily relies on Bayesian methods. So far, our simulations with psignifit seem to indicate that Bayesian inference for psychometric functions (based on Markov Chain Monte Carlo) is superior to maximum likelihood inference with a sampling distribution that is approximated using the bootstrap technique. Here, we present a very general introduction to Bayesian analysis that is specially tailored towards psychometric functions. More elaborate introductions to the topic can be found in most modern textbooks about statistics. The idea of Bayesian inference ------------------------------ The basic idea of Bayesian inference is to treat both, parameters as well as data, as probabilistic. That means, that a "model" in Bayesian terms is an explicit formulation of the joint distribution of parameters :math:`\theta` and data :math:`\mathcal{D}` .. math:: P(\theta,\mathcal{D}). Using the definition of conditioned probability, we can decompose this joint distribution in two ways: .. math:: P(\mathcal{D} | \theta) \cdot P(\theta) = P(\theta,\mathcal{D}) = P(\theta | \mathcal{D} ) \cdot P(\mathcal{D}). Typically, a model gives us the probability to observe certain data given a set of parameters, that is :math:`P(\mathcal{D} | \theta)`. However, we are usually interested in the opposite: the probability the a given data set was generated by a certain parameter set, that is :math:`P(\theta | \mathcal{D})`. To get this we can divide both sides of the above equation by :math:`P(\mathcal{D})` and get the famous Bayes Formula: .. math:: P(\theta | \mathcal{D}) = \frac{P(\mathcal{D} | \theta) \cdot P(\theta)}{P(\mathcal{D})}. Once, we have observed a data set, :math:`P(\mathcal{D})` will not change anymore and :math:`P(\theta | \mathcal{D})` will be proportional to :math:`P(\mathcal{D} | \theta)\cdot P(\theta)`. There is still something tricky about this formula: Getting the probability of the parameters given the data requires prior knowledge about the parameter that is expressed in terms of :math:`P(\theta)`. That is why typically :math:`P(\theta)` is called the "prior" distribution. :math:`P(\theta|\mathcal{D})` is often called the posterior distribution, because it is the distribution of parameters *after* taking into accout the information contained in the data. In this section, we will mainly explain how to specify the prior probability distribution in psignifit. The sections :doc:`/DESIGN` and :doc:`/PSYCHOMETRICFUNCTIONS` explain in considerable detail how the term :math:`P(\mathcal{D} | \theta)` is specified in psignifit. Specification of prior distributions ------------------------------------ Psignifit accepts a list of prior specifications. This list must include one prior specification for each parameter in the model (that means for three parameters in 2AFC, 3AFC, 4AFC, ... and for four parameters in 1AFC/yes-no tasks). Each prior specification is given by a string of the form:: "nameofthedistribution(parameter1,parameter2)" Thus, a string like "Gauss(0,40)" specifies a normal distribution with mean 0 and standard deviation 40. So a valid form of prior specification for a 2AFC task might be:: prior = ("Gauss(0,100)","Gauss(0,100)","Uniform(0,1)") Note, that the length of the prior list is crucial. If you don't specify priors for all parameters, you will get an error message [#]_. Prior distributions for lapse rate and guessing rate ---------------------------------------------------- In the models about psychometric data there were two parameters that can directly be interpreted as probabilities for certain events to occur. * The lapse rate :math:`\lambda` can be interpreted as the probability that an observer misses the stimulus and thus gives a response based only on guessing * The guessing rate :math:`\gamma` can be interpreted as the probability that an observer gets the stimulus right without having seen it. In certain experimental settings (in particular non AFC settings) the interpretation of these two parameters might change slightly but in any case, they will be probabilities. That means, that these parameters should always be within the unit interval --- there are neither negative probabilities nor probabilities greater than one. A simple but also trivial prior for such probabilities would be the Uniform distribution:: "Uniform(0,1)" This specifies exactly that the parameter can only take values between 0 and 1 and that all values between 0 and 1 are equally plausible. One might expect that after this, we don't have to care about these priors anymore. In a way that is right, in a way it is not. We know quite a bit about lapse and guessing rate. 1. If lapse rate and guessing rate sum to 1, there is no psychometric function anymore. The data are entirely flat in this case. 2. In many cases, we can also easily give an upper bound for the guessing rate. Take for instance a yes-no task in which we want to fit the probability of a correct response. In that case, we can be pretty sure that the guessing rate is somewhere around 0.5. An other example might be that you measured data symmetrically. You might have presented a mark at different horizontal positions and asked for the position of this mark relative to something else (the center of some geometrical figure, the center of the screen, some explicit landmark, an illusory contour, ...). In this case, you can be pretty sure, that the probability that the mark is reported on the right side will be close to zero for points that were presented far to the left. So you could restrict the guessing rate (i.e. the gamma parameter of the model) to be close to zero. Thus, although a Uniform prior on the unit interval results expresses the most important restriction that keeps the lapse and guessing rates in a range that is at least not impossible, there are other constraints that are relevant. A first idea is to reduce the interval on which the Uniform distribution is defined. For example for humans, we can usually be quite sure that they don't lapse in more than 10% of the trials. That can be expressed as:: "Uniform(0,0.1)" This assigns equal prior probability [#]_ to any lapse rate between 0 and 10% but assigns a prior probability of 0 to any other value. Although we might feel that this is a good working solution, the translation of it seems odd: It is perfectly fine to find a lapse rate of 9.9% but a lapse rate of 10.1% is entirely implausible and we reject any solution that leads to such a lapse rate. Another typical prior distribution for parameters that might take values on the unit interval is therefore often the Beta-distribution. The Beta distribution has two parameters :math:`\alpha` and :math:`\beta`. We can think of the Beta-distribution in the following way: Imagine performing a random experiment with two possible outcomes (throwing a coin and looking at heads and tails, throwing a dice and looking at odd and even numbers, ...). Imagine, we repeated this experiment a couple of times and we observed :math:`\alpha-1` successes and :math:`\beta-1` misses. In this case, the :math:`Beta(\alpha,\beta)` distribution expresses your knowledge about the probability of a success. Thus, we can easily use the Beta-distribution to express prior believes about lapse rate or guessing rate. Above, we discussed an experiment in which we consider values of the guessing rate around 0.5 more plausible than others. We could express that using a Beta prior in the following way:: "Beta(5,5)" You can take a look at this prior by typing the following commands:: from scipy import stats from pylab import plot, show, mgrid x = mgrid[0:1:100j] plot ( x, stats.beta.pdf(x,5,5) ) In some cases, you will have to add an additional line with the show() command. Also the case, in which we expect only a limited range of a parameter may be expressed by a beta prior. Imagine, we want restrict the the lapse rate to a range that is roughly between 0 and 10%. In that case, we could also use the beta prior:: "Beta(2,20)" That would correspond roughly to having knowledge from 20 trials on which we know for sure that the observer lapsed only once. This prior gives special emphasis to lapse rates close to 5% but also allows for any other value in the unit interval. More generally, you could describe this as follows: - Beta (a,b) - lapses = a - 1 - non-lapses = b-(a-1) If you are unsure about which distribution would be appropriate for the lapse rate in your data, the following numbers are a good starting point: - For human participants who show a low lapse rate a Beta(2,20) is a good approximation of the lapse rate. - For human participants who show a high lapse rate or for a lot of animal experiments a Beta(1.5,12) is a good starting point for your lapse rate. It is also possible to set the prior :math:`\lambda=\gamma` which means that the upper asymptote of the psychometric function is as far from 1 as the lower asymptote is from 0. However, this prior is not yet available from the Python interface. Prior distributions for parameters of the psychometric function --------------------------------------------------------------- Selecting priors for the psychometric function depends on the exact parameterization of the psychometric function. We will explain the reasoning for a logistic-sigmoid and an mw01-core. In this parameterization, the psychometric function depends on the two parameters :math:`m` and :math:`w`. :math:`m` is the midpoint of the psychometric function. It is what we are often interested in when we talk about a "threshold". :math:`w` on the other hand gives the width of the interval on which the psychometric function rises. These two parameters don't have natural constraints. The psychometric function is defined for any choice of :math:`m` and :math:`w`. One might therefore be tempted to omit any priors on these two parameters. This can be done by taking a parameter list like:: ("improper","improper","Beta(2,20)") That puts improper priors on the first two parameters (:math:`m` and :math:`w`) and a Beta(2,20) prior on the lapse rate as explained above. Unfortunately, the improper priors are not real probability distributions: They assign a probability of one to any choice of :math:`m` and :math:`w`. Furthermore, we typically *have* prior beliefs about these parameters: 1. In virtually all cases, we know in advance whether the psychometric function will be increasing or decreasing. For example in contrast detection experiments, we know that for higher contrasts, it becomes more likely that the observer's report is correct. If in contrast, we derive a psychometric function for detections in degraded images, we know in advance, that the probability of a correct response will decrease as the image is more degraded. 2. In some cases, we also know that the threshold can only be within a certain range. For example, contrasts can usually not become negative --- thus contrast thresholds can't be negative either. In any case, we can most often restrict the threshold to a fairly large range of "typical values" in our experiment. Both these types of prior knowledge can be expressed in psignifit. We start with the first case. A typical prior for the width is the Gamma-distribution. The Gamma-distribution is only defined for values greater than zero. Thus, a Gamma-prior on the width of the psychometric function implies that the psychometric function is assumed to be increasing. The Gamma-distribution has two parameters, a shape parameter and a scale parameter. The shape parameter governs how the overall shape of the Gamma-density is. For shape<1, the Gamma-density approaches infinity at zero. For shape>1, the Gamma-density goes to zero at zero. For higher values, the Gamma-density becomes more and more a bell shaped curve. At shape=2 or shape=3 this curve is heavily skewed and gets smaller as the shape parameter increases. The scale parameter is then only used to scale the the distribution up or down. For example:: "Gamma(2,2)" Is a skewed bell curve that has been scaled up by a factor of two. A relatively broad prior (i.e. with few prior assumptions) would be a Gamma-prior (allowing only positive values of the parameter) that goes to zero at zero (i.e. shape greater than 1) and is very broad otherwise (i.e. scaled up by a relatively large factor). In a number of simulations about coverage, we used a prior of the form:: "Gamma(1.01,2000)" This is essentially flat on the interval from 0 to 100 except that it rapidly drops to zero at zero. To plot Gamma priors you can again use scipy:: from scipy import stats from pylab import plot, show, mgrid x = mgrid[0:100:1000j] plot ( x, stats.gamma.pdf ( x, 1.01, scale=2000 ) ) Because of the great flexibility of the Gamma-distribution, psignifit also defines an nGamma prior that expresses the assumption that not the parameter itself follows a Gamma-distribution but that the negative of the parameter follows a Gamma distribution. Thus, assuming a prior for w that has the form:: "nGamma(1.01,2000)" Is equivalent to the above prior except that it assumes that :math:`w` is negative, i.e. the psychometric function is decreasing. If we know in advance, that the m parameter will only be negative or positive, it might be sensible to use a Gamma prior for m, too. However, in many cases this is not entirely clear in advance. As an alternative, a Gaussian prior can be used. The Gaussian (or normal) distribution has a symmetric bell shaped density. We can easily shift the position of the bell along the x-axis or changing the width of the bell. This can be combined to select certain ranges of parameters. For example, if we know that the absolute value of m is unlikeli to be greater than 100, we might select a Gaussian prior of the form:: "Gauss(0,100)" This expresses a prior distribution of m with mean 0 and standard deviation 100, which is close to flat for virtually all practical purposes. Thus, we can summarize that for most situations only very moderate preassumptions are needed to justify the following priors:: ("Gauss(0,100)","Gamma(1.01,2000)","Beta(2,20)") Or alternatively for decreasing psychometric functions:: ("Gauss(0,100)","nGamma(1.01,2000)","Beta(2,20)") Although these priors seem natural at first sight, it is often a good idea to think a minute about the proper choice of a prior distribution. For example, uniform priors might also be interesting for :math:`m` and :math:`w`, and Michelson contrast is restricted to have values in the unit interval, so a Beta prior might also be justified for contrast thresholds. .. [#] In some cases, you might still want to use Bayesian inference techniques but without a 'real' prior for a certain parameter. To specify such an 'improper' prior, you could use the empty string "" or explicitely demand "improper". Such a prior will assign a prior probability of 1 to any value of the respective parameter and is thus no proper probability distribution. .. [#] Usually you can translate 'prior probability' to 'plausibility' psignifit3-3.0~beta.20120611.1/doc-src/BayesConvergence1.png000066400000000000000000001627561176542545200231160ustar00rootroot00000000000000PNG  IHDR,}sBIT|d pHYsaa?i IDATxw|TUߝ@D,-yX`a_E`AA"dQ +)" ґ&UދH 33L&3!dB|?a¹ܛd2Ϝ)B!B!JB!B !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !B!D % B!BP !BSӦM̙3CQIB(BQ \?O]ׯ8Ǐ'66MҪU+>sLETT>wf4y":: s j׮͡Cl{֭[m_t)7QFnݚ}ٶծ]H~@)Ell,ϟ*Fg={d۶m>_7u{= oܸa?::zRJϫsv(J!BZl{R?jҤ^|E5rH/_OK.\N:RvJ)~7p *#G(ڴiS2.:?2dW1sΫn||ڵ='nݺ|=CB!Bօ TŊ"""ǽw u UB;;~*[C2>&Md۶uVՠAʕSv{MMMUn'71ryP[VgΜ5TK.|=#-B!dzn:R4hЀGRlYùx"+Wwу'Ni?#={5k:l]6gΜnݺ2ON>իWx뭷ذaeʔat;KHHaÆzuO6l /`x";we˖,YN:ExgȠE|'PL֭Ν;iӦMqٲeT^%_SݳgRn]۷/jx۷o<. "Η[T.IB!dz!nJnشiӧOg֬YoL:޽{p|C4f=ʨQ/طoڵuӧm@XX ._'%%VZѤI }z[RZ5F#cƌ+?mիs)ڴi}t_{3a[Rʥym _bq|>oⴿpIB(BQoߞ^{>}/3n:gy'O=Ə?HթY&ö3gPvm)SMl4nܘ|=(ӦMG 55~_mm޼98 C?wYB!,&&FL&R;wV7nPJ)նm[u qFբE &ɭ^llZbRJ3gΨ0u<۷ZdW6l6ETQFjϞ=_tqT.]Rxd۶/BhaXi&qy՗Θ1Ciƥ-X>>zNRڵS5R"6lh;l5zhհaCմiSըQ#5`uMckɓ';?h ՠAհaCկ_?~NRM4QM4QS]vU'O헞UFF] ׼shiF͜9ӥ-X,[Ǐ{]fdd~z_/XQJa4qӦMcʕwXB??>Ay?齉RׯZBIJ C׮][.o&[n%==72|p\Z'@ZZZ!F,-[СC+WRzu|OǏҥK4jVA ذau=ɓyWbiȐ!K/ĸq<y6m+W橧*0.*UrBg޿RJn}K*ʕ+۷/mڴlٲ|;6׵9BfhӦ *Tpֻw\gAw7Ď;0`,;;>D֯_Oҥɓ'ߏ0Foxc{dNwQF1x`n޼ɲexIMMe̘1.uuCm߾}3l0J*e+zzoi+Vt{̒oPq͚A|<SQppCyppm7ub67o~|׫Q5j} ƍV}uCiڴi>і:uɃ>o%PH%O=SLaѢEV>sL"""fu/̮]hѢ5gZj}OժUjO>lٲ_Uƍs=L>gyƥd駟MbP-Zf3[˼ӧ͚5l6s9 dΜ9lْ 8l 'd|GI~w6lo鏐 P=(R a.]ԩC !99:u0|֬Yܹsmo\ ٳ9uS2ydzR _5ǏgݺuOU7o~`޼y|wQ{[lq@"66>F,]Pb(--{:9wԭ[סq͛ p?B/ׯ_wizh޼9O< !",^QFGRR|-ff4((3|p^y҈fʕV)))q9ʖ-K֭ٸq#v/o;ݻi}zp [bj6z*D^/EFKCCC8q"'NXgƌ̘1å<<<3gyѣG3z S Gʕ+.-;wp`av}V{%wG%==a7ur /8|~YϟoոYfL6odʗ/OӦM3g}wxBBz<<ì])>aLx!Gsw{(|QB!͛7HttCihFpp0;6mo߾@tUJy_TZ!C0k,~i̙c=0ś:yh4z[ 8; !(J g?r/$!ƒ[_yf4M_~ <;ؐDFAppp:^Se\B۶my衇omuR؈#9r$oKɓ̞=y&L`h7q>v!V-:Q _hJfZBB͚5#>>DN-n!|%Eݰ0]E!B!Dq$ B!(2RR`vYC I( g"'G; !v" _Ȥ2B g6;!   _HB(B!}r/˨B!BP !B!D % B!(2N=g?r/$!B!E2B!(2|Vww7B(B!%$B!BQBIB(B =aaaQn]{=:֭uքRJ +W!+ ΟןE=P!Gͣ]vTX 6li&vJժUYl_|֭Cd;u5g?r/dR!B\pK/1i$[yllCzh" 3￟XOK/Tq-օUg?r/P!SN%--#FxsvM߾}m @֭WK,)PJã" _HB(B͛7SR%:DӦM)U{/C ֭[kܸQQQBoE.!LIIaذaDDDBtt4 ,j˗/ӿTBhh(111.222xw[.s=tؑM6LJAF]޽{DŊڵ+[nwhBBtRSS_ٲe qqq̙3{ k׮XXm(z.H^K^.GF¢E!|Q§~ٳg3fVZEݻ7uL:t /Yl{/]tauyY~=}tԉ_N^^'B#SL?୷bݺu̞=tڷoφ f2223f *ZbС|'lݺ4M+HNoG Ib\qx]n{(.EjR+Vn:ϟO^h۶-gϞ孷ޢW^M6}vZl @vhҤ Çgǎ:`Ȼv3w\7o~[L6 H q[&MDxxCYΝ[.|۷SdBTR%N8>PtgHJJr?))J*yaÆQB޽{ӻw~WHNիs~K_ Zu{V VAAl9Kzdʕ+G= @>}عs'[om @@@=/^ZjhF`` ʕs?44M(UT_XI?geIB(d 88z1%FӦMٹs'ʩ'ѨQ#gKo۞'Pw AG'^Y3}OoOz+{(Eti~v0x p!@k1sLV\IZZ.\_B u9%5 5D pMvMÆ t+W:X-[RZ5Zh9s0Ͷ:;vرc<ӅBH5\vnLmvRRǁ~Gfx ۧyYz5[}q|LB!C%==QF;!D!ر#O<?QJѢE ?ɓO>i[p„ tԉ=z0d._ȑ#b~ !/ &m6VXAtt4;vjRaÆѭ[7G^ޔ(m!+xC}]͛Ntt_bHLLd.{ҥKeW^%!!C\&''@9uCYzz: 8={G:L&~\G1D?kƗ_~I/6l즗l۶-+V 11nݺꫯҡC֯_/CTE*BZjZhR~i2e}VzR|riZvRJ_Ui&MPd2 爏WJ.]Nm?}^;S!` 1wo7cƌQ?0z׍6mڨ'|1o޼ێc*""¥\rO?u(2erߠA;ZJܹs;wVh ժU+7o*@r:FRW_IGDw+=-,R޽={?áʕ+n8xKqM233ʏ;N:}ؓխ[Ϝ99Pf4U||JJJ(FqE"J+W2EKzrJiZ`C>Wf}iڹs,;;[5lPnV/(M_|vvWz=@{[7͛\Z5"c*MԻU}yBJ^78$BHM*ӥK:uĐ!CHNNN:̟?5k0w\" bٜ:u5jb'OG?*U_sq֭[g;GLL Z&55X4i'N˵+iK'N"w~ѣҥ ?m}SVZ)2!B)R !ŋ5jqqq$%%OϞ=muf3fa ֯_yWHKK#::+WҦM[=MXjcƌaʔ)=`6m… e`M]g;q,_j*ma2B!D044'2qDuf̘3\Ù9sf(_<}}N IDATzW|s2k"XB[ӲC6lػt ΅gKE\v9u?}s wkѴ41n0 ȿ֮-[B&1ƌџE=HcOᜰtU />1]NEE#B! y7ٳ'/_`ժU8pϑ {MBr,G$%u2-v֩?}_/'Ko]9|> !V\I-8|0IIIÌ5 !HBXX[T>4q'on?/7nxWmlUɜLG!~ &rJm:t`۶m~L!Kd6CrOzZk /Rm6\o|@æM98rĻ_@]]fc(}[Bޑ#G$͛7B qְ_teqPOEoۖ|\ wKB4v;>RXv#}ѵkaذFK BQƎKZZuԡGՋzꑞرc(f1|ΏHX H²nYA%1W `$Dw2!cɾL>@>!|%⋜.&-Bf̘12fqF Ǯ][֭[J*U0`8FuXP۔+?>Ǒ#w>' aaΗ.|H/g7 aAe+Јo(o䈞ٱkΛǧzuH\QC!ȑ#ч~Ȏ; 6mߴi]vjժ,[/uѡC ӧgOnA0XRݺu㸛(|iO-2vU"3Sobg4k}峅P;p l߮?Hֺj/LJ.|g4 /λ !J+ھWDkJ)yu|-Zx[oQ~}-Z 2}t^z|knބPGgT^x{( $;kiHL߱S[ɿN&1%, А B9]F!1g@jq45b\KBh!ܚz3ov}]tj [N@wޯ1hL#z4qB?`;۶PF y|[)Rl.\`݌?ޖ nݚzdI=okrgkhA]}q7jkAvS/F *}aߛyJY|Cx˜=>vI <P !Pvmbcc)UK? 2^zJ֭yw?;p7v/**m۶XBq;d aa&N3f;~jkaYB" мCӀ[S"WD㱍Ը Hlo/ʔGQE%/ٱ~He;KN 紨ގ a:K-l"B]vd055d/*VȈ#={6۶mo˴k׎5kp2xXXaaaBok`([lD\f2*x:݋lkC^A%;vVIe<$p%!,T>w.4h~x7szz !D1w-Or(_<*T=zI&|t҅-ZЧOlB51bWpT֭g?r/$!,,$<I\)t'2}TnIs[!P-j.]3Jljtg(zڍ1ܱݱЭr>͛sRcvߟ46ݜ{~hh(_̤R%onk̺=7Æ [nvE]а,G!,$FS6@96+|R%CoӧljwMHy=ۄo!zno RfsǚރS\ӽ;_l} YʃKyz]yZ }z?h V4$8Kr֏xo{zTkkWKG(>BQ,\HLL uԡVZ̜9{Υi5`߾}tams3qD~nQL(nr/\ aJJ Æ #""Y`W^|SJBCCvs vz'.u'$?%GT/pߧ1s>o)mEH`Mve4h`ߨ Pn泛m \ŋ!t^jnoЀ6W.a~j?Fy}'R dI",-Q@(w).^ @yH@Bqޠ2!tj!4+fefԈxBĚlfp"x·k!kmKh23eΜfoGs[Y`\z)SдiSz)N*Cq߿?1119nݺ1qD233y>z NJhӦ 3f̠Yfzm۶eŊѭ[7ʔ)ÓO>\_7))?DEAٲ$PH.Yrѣb ŋܹ3}ׯoKA_pc׮]$&&zɓlڴ=zP̔&h_o{mh=ڵ ڷQ8p>͌Ҽ9 zFe0Rʱ)I6ljVcy9C1OX%1䑁%ʕsݐτpO<N5rH/k+Fn^k𕕯=} aoH a]6ׯ_gÆ |G᥷z!CеkW>̴iؾ};oOzٻw/nh4r%-Z Zuؑm۶իW1c+pIw" _DFFFYz&̄wI=< &;Vj9QCI]7xXve\9yH<s2zC؎aA8`ٚf6]FERQB u֥O>$!2R0;2ߑܽ _.׮]nݺ.E]s[5))⯹k29s&n:?a{dyCoRfT@No$R`tx%'pTg-q!w/,Z 1S'N]FO$:o@iTIm[k ?mK) !]+..۳h"سgC!J"BXR%-yE]s[ĵRJmiӦ?uÆ B e{uBhRuLpzOn20ys+Y u 4K(5h[mzNv&k< ͛PF 7curaz2Bg=yyz-l:eJ9:n kuc'}«MT{nkmM\JBw?fi,HyB/>};!(RTBظqcϟlvG2v-E\طoKyn^|˗&Pl` 1\[ԶH{;c83.f+usUAh]gͳPS d/ +Wff͛(.-Bbct҅S~}4MC4ۤ2/wajGqw{(|QBŋ3j(HJJ"22={ffØ ֯_yWHKK#::+WҦMl۶G2zB.+C* gT0eܛMSn,MvyBh*3!Qy R>%|J*y@KCe֭te<7c*r ahh('Ndĉ̘13f3sL9?&n'2g\Mfp6lcBք]/Ů 9F%_/O) 5 E0paoDx$}oXS24YF}NT}Sd29|-ɠ}VO?=5b̚G8 "6K<j$ W|/dod{Jcf·a'ccփtmxgm NvD^͜`rzBhfyn!p1 ζԈ] a~=#DQuh. 4C)C2 YA|?n@̅Ey[Bh?R?%!DL/xZtq9d 2Aҳslݳo0S,ֶn®uٴ~|2ܺ Qn^tvQ2}W,]*UФImYh[VҟE=(rc;9!-JnioktٺS;UɓTN`s(, 5#& 2g7˨ӎnBMpeOաݛ/GN-[j嬾/c!S8!thơгǒdM{c޶m )ȥ ~Jiv:9rcʮ},֚@RNYXW[Bh"ˁhpḿ1٦l];FCm#z.o8tJUPu2'9Pu: 01Z[Z.\}hCf?¢\ M|5s,/׀, *ofϞ͐!Cׯ?XZZƍc͚5~P'ip"; : 4hѢEŘ1c(Bȑ+W8oei,L9ׄ&Vֿq k@D\| IDAT[{]^f&l@= |ems A)Bhxɂ_s<o rnxF4r%eԠ@3]FF?SJXJӓJiPC L Z[-`V>zurMf |nsYRP;'f3ԋPfr)S7dh6m_ÇG~シS։ lFթ>_B"2h0@D~}K(f$!魭cɒ ִǁczKB&Y}cQF} L5!|QgV lܵfd:FlR9ɏ5!,itTvN 'vl/Iean7!CZ–rXJ/ n:Z7YЕٌ5o׆m0`lN2؜>ey)4`.]FϜ9C۶m]˖-KZZ"~oж-Qe6+ VOVb`ʒ%LŊzkO>ԩS1 sӬ@ǎ)W+V{>}Y\?o?iUq~> x+{(~eLv]FoZ Zsh-|VOxrMr21:"Ln[T'6@29\1hcwl1f #@`ƚmmhak.,B)-c HpBeT4Y`6ںmsY0kc*Je#dOKi9_+=V8&^K^ӷf'e YМfUvә1 q0cS㮅L)cC[w{])o <^{7W\aϞ=k;~N͛uW` u= }qSM~]^z%ڷoO Xhö8BBBX|-9m֬> | Ǐcqݭ4p"|&PBA¶x5a7վN \ap?m-G2wCoD4 1&]fN5S13B=!t2jgMEC|%~OC@le6 Ήu@nBc aCUVnpB&! uE9J_Z^kʡuF03I>.,D#F'66TZns=Nj/ȫĝf t͛{J{xƎ-D˗]ʯ^J@%~1glɓ]>5,_ݻےA5kҾ}{,Y !DAvE_m`0sBxƟrI̸BfmA W݌ЛNV,* 2(ǩݵ.EŦQi<9s㌞Vd"%ljftLA`rm.+3Һ`ɜD`)~`2L408)~Ma2;^Yo!4B7k3z1뎹(h0Llڴ\r;w}v._̿do2xIh/:w>FQxAc41 .]bذa?jժl?y$4v*ʼn'4P^! GV|)rް!!T8,c7yVMS)2QRh&~jBj3lp!MRN2rZpr 8OΉw 0 R_녕=TS9@Ĝ)_a=9Y[|.-|Ո_;O+;m3âE0nH0 tܙǏSfM7oDaY@o_`<| o_}q/%SLqE)Ŗ-[ջJ x饗nvIkPJqu|_! $~`rܻo!TtSG a@.3\?As$WG)Fn[ akiPm{d/yxU?U k}1@$ &""0WQ*"`Ư`pA6EPQ@,U?n/U՝yIw-nݪS[x*9’.$Vr aa!݊){~ %JWG6LAO $Fou<_4W =![v\2*i%ɹx:֊*\[T8H#4tOCY0{ᵀ$Iz=z_p` II:5(^x}^~Y\G$aZbŊ qHX쩙$$$ժ`؈%11Ny PEQWnYjtPرڵ$۶ֽ>J!P%=5|TdCQ<5>/ݤ3Bhg6Bx)I-[iZoroe^NI'$Xl5/VZF}ܒzUȞ2-pɆ:SB31>Œ E /JP4M_A_( n:ö-25^S֝6uM e#!ti1%qtKClЈLas$=`]>sLƏi׮!@dd5YWo O> c;\=B!|UX 222Ozt xl"eu_d.##a iPRRptޝ/*U\v/^䩧bܸqtM8ΝbPZ5=_fgg#I?ʕ+ >Ç_9gԯ| piaAlPyA𺯗yRM&ԝq/{쓶~ H:,f}"f®yͨ_ts\֌Mh:mZL~=!${ϽKQU]t֘U0lT)eUՓ:,Ų+PҌ/BnUUey^KtDDV5׽Q/ӧ۷oo߾ԨQʕ+;_e1 dff2rD74o~7#GN$3$ҥ`AǏw߽B%\D d#i޹91ch޹9#Y$A뢳 u!M: kgl;kH:>Dt!99P\\?ӧK֙3g`Μ9TZZx1TR|ƍΝ;=صkM4xܹsYbuAE@EKG` ( LCU klp|T P|BF dǔ*dC/tyπW$O5yɆMҜ1&Ŧ M3oyrM@y┙IbBi(V+6`~_T:#Fp o.E+p ?9~8+~\.I?idNכ'SN`$0t7u}=)FP^M ఌډ`Y OTO+W~R(vaQaپ#4HR5s"?$2 +bV ջSLB7˨$IedYgTu Y`1)cBؽ{k݅kf4*N~gX|<3uT`hժ,yiʂ ر0u*4mZ>Cҹ;i?=/;,CZ !!DB.ց^`[U|PTпj2 ףt3'Ow^>cLR*BBn<'%%( ]vu.{Wh߾=s'OvQF@syW{JjT77P\IJ콫q't$#)}*myA:2j+E4PvNYdLU:[3>qK(~ؠ Q.O-{eUBYB-eTO/)c%B`3O*+PsNvS!*;(\Ϗ=`[Bp ,Xݻ$-Z0rHj֬yvPH@[I%S81dd|>;Fq=i3Mz3ILH`vR7F3Re׮RM ua׏PN*ԉC|xDԡnd]D֡NDD!2$/cȟg.¼% $b!OB?5!!Ш nZ6&$u͚5 2M2zhf.JdP bbbHNNfҤI <BϞ=3g30#N  J;ӻ!id!eOBh{5} Ҿ.3]WzL}qB70L2*QSIe¬p49Y#:֧RR9'Ww ;[Ղ[FBhN0=sS,i|iC(I(;RA2rn۶;ʕ+ӡC4M#11kҮ]k+F鬃H*JV p8GG}BCĢF jP> 8YyvEd0=տ!!0y2<44iRkFʱ]<^jlWy'W74..[r`+p0x>썌 /TUJD( ق ttOO\DnzlE<5-}6FGwo6 VjF18Qe5zbu rDOu'b6uuJX5!ܶm N2ؤI矯q/7LP _P&˂WP!-w|yFa1&EY{x|.j)b08SlQtӉE H;+E ԧ1gh(L|&eyJN_?NoQF~`5uy(_l> ZC`ʔ(*W^СˉGӦLjK粞A/_9s&o&Fb̈́B}3@@rssٱc999hn}Ƕmxhڴ) .dᨪ3raa!={ԨQ7|>}vZCŋѣNbɴjՊ\RRR((0C\߸l[m>h}.rdfU<9,HZ-AܔAp@CZذ*>ɚc!%+* P8MRQNQ 2z?D Jƻ*UQ;a _o&CbABCM,:+ka-nɒeTd8f}dR-t#[SrM###9vцǎ#""R %Y'Vߙm M^#g+ +M'/sN@axF=Ab:FXo-\#}{y12Bl\_)u10kP 7UX`-`ٞeRPb-&t#m^z,_ԁIv(G]U}PV̙ApQ8w*UԢE|9,[3W4.GfkY?@^^$|kܳ k2}W<\bw|7]E1tPuƟĉ:tA cٳ:t,Z"!!-[82e cΝ4lйwޥ9K3,*&NXO+1d&CH ^Ԧ&e2^,Gn-G}<ل$@S !PC A{W^eG]>2Xvl 6!t@OȂ [l[F5dgRwh $d2y7B\c$gul}g0_8`&t1tP~a͛0a#fUV(:XdI;'$ RBjaOũv^ \(.#g  dvvB\C?O##͒Dcyfm)Vaa ^S)CYrx lԓχ|Nvع0'XbQ}ɁGl6b[`]k B!E 87?Oj֬@@WC\z)Fř3gPUUK"""2daȑ#9q[n-$ c?HMM=]Z^^cȐ!2x-O ;4W ^[2#i8@`Bx.lf$ wb);#@z/;L+zbxpi&NwSr3I"ְ !籹S mf5llWݯmrZFLBA^W=Be)lqae2Uϟ?τ Z ޽f͚y3LV&Ѧ3i13K:yB,I!\{pDkAXX~yٷo һW[ٺ\oTY_E fptդw/E_1p@n:#8V|k&VN^q$sk[\3:MC>=dn=ax rww &W`#@5330 `F {ܢ\O"+? KgyKQoMf;YU2='s2ˁBtZ4׾ee ^w2X qHG<=ڨ!Ɏqcx`Nyn8Gd/ĹKLڴ_VS&=߮)b,l9e ԫvTTZQD+'ySqI"1t^Ӹp@!33Ą܈eBbbT 999|m6G-jW_,I%ԸQ0+2[ 2M6>E7n\YమrJBCCҥ M6e%{Ç/uܒfPΆ" I;VW{hF`VNy?-Bq'%?͢@v YFe4)[F")NU`MFkޤ" c;e$V'Б%/5C! +BB2*!žф ɣT kWla_~2B(A ]<` >ѣG/_e˖%?-d,"@RD٨&˗n]vԪR\`[:!$5 aNWָ%_Y";Odb:=KX{1;>cX1{; (_qxMB*vI9$I׋gz eHnIPW{#?7Sp?RS)El:=&ޟ93~nc5ߣǣ,d* QrК7)8 52KfsB{zoڰ{L\,{ iL=B[Mi {3{iC#S/TJsOGԾPdF,ғw G 3˨~YJ=4$T,p֭{{>{Ey9Qe *p`8%4htM`'4 ^ПџX ~L;}I&L:)&߾5kfv<;ݧs瞦nNZ%x aٜ5qO4ƵYO5 V+v킿]XEBIԚo=y6'nՐ~/Ȓ̼~hnK_’,El[o ש\[*UU).~.u!bΪEo^ OۏU}m^2O'l~RRծc%So]ZY}Wӥ!T> Ӧ1'5M6TmIׯn݄ý:FZj*RuxS~jM/]5dw ^8qң@X IO};SS/>cƌHɓi۶-+W"gڵp`/c@iP째aÆ]\xR,-X:uݻw/fVO?;RfMjժE||<6l ?5(((~yzp,IX#n_1Dw$ͨ*JvKeG߂Ք^(ӕLRItCm]!̽zoȀib)؜*49~pA$&c[M<'oy)ʥT;HfI jפ*'\2mƻޣ]vW䘗UVݼe3[DwDzx{^h"W/Y_HeT!v$!#*tz *Vڼyt%nN; z/w*EV RhV*Q).Qm+5j@",xD/3؟Yj[oݛ7K^^?c C:$CuO_0ҠL C=ҥK/y>}ЫW/q͛3f =N9zh8zsQFѼys ¢EXv-9p8g&''oիWӯ_?222xW/%B3NM!̵ElSL- Þ!Đpj z˨fil~*?rk[:-IG5mp2 5H6+h9 pNLҮl"Ȓ?B QUH;κhH{66j\קtc͖hm0SDBXA2-&BGjy̙3y뭷;5k׿իo3gμ"7J"11W;k刐ĮM]ˈNZ۶xxWXB,cDD h|辏yeE2y$g2>}}ۡC>{bajo_Q[r ?Dt[,FnpBVwUkݓ*IWJ2ʫʝw0a&Lga„ ~|r|ANJ߾}Yx!a>Yn=z`رߟӧOҥK1:uĺu!ClMNNcGe!w[rSs9ki e<̣u aDj̄i?ͮ󲾬1v,y .zgWDF]'[ׇ qqԯ/Y>s'2Lz)3z-sOqqs ii^ +EH {_0KGܹ֭[STTo2hpΝܹsnDI{5X`_ܹ3ׯk2jHKUde˼h'GBVP%8bϜ>>kA@BlӼ*`$?H*~-̡jBȾ]0f|FLyvTU2Z`qe`C.>p/8fz=릮raR9ɼT P-9i>8u?1fCc`%Geeu|vX?QWWĉ- {Qk7=ޘ[zmvX$q x6ns!J |X>c2W0رcqQn.̞-|</@Bj ԉtv+bt4KEa"O^"EPڐ"oLHf z>gFˣFBb"C7mޟczPwBP6%)e:KNNv֯_|9>9T:2Ҫ ,8Tʷow]v?GhdXbӌYF !ye7I c;T5Y)؍+Ypdu1|R 2߾C!ԟc!t'ԳFKySg< 6ld#*pSUyA=6nq~6#pc rbd麰n۶͙`ٲeu]?<{P*H$% >#Ά#qԶ!**5u絩,YGANy^>`R403-c.\YaCj`>cX#KM#˨OB7.D (ʪN[]!FT{z1ih![F77Gப܊aGmYUM1dtB({U-j1V,2u`/3͜Sf5S74NB3*lQ41,B$Bx<|>p[`ҥՋ> 11BzZ\`bzmS粺Ѫѻx>~J^۷m֫z5s2>s4VV4aIzȔp eGQIĐ|m&O\?DlZŰ00A/hz L97L w7ođ#W}!::W_}ՐRp9bcc3g|WlْG}3f8ۻw/ݻwjl2>CO.]8s PhS;JPzӭL:Y?bIz~re1{>xٍ1Y$&WjZj7_~z)j׮رc_.UtV+VbРATz\~}ze7Qyl W@ WR,a(D߼luK[Lw6\B(a#fd bxw 6di;4ɵNdMѠĺB 9KtMk}q 6] !汛B(DqXڤ|8($cNdG\Il *;?cu;Q3nαޕkl޼{{f͚_йJ E j4h+zo̢~UMڷ;Jؿp38ȑinbbӼ݌9L~]TU6g.Ծ}z [,B mR:2AEA%֟jOIyI3ic8b#WvB0+jD,aZ%ٷOx wQ |̙AtP,DZ*_AZJ,DtP7En]94+PbwQ+TUĐqG&ÆnwsD^=ӯZcAJIsxށ杛9杛3|)(**bٲeۗ w[oqi>Lƍ6l=SjU{1OرcÐUiZ/BJ!0Bx!KZCYa/Ljb(УQm-DEOdXP)S?FBh q~~N Y(e6,e(B <,R%)*)e a?e O}m@:x${}GW5 Uڨjn)Ghfwld(9aO4b*z< RPh_q* խ[4Im}̦`&f/\A\\" e+{\\7U 38~|(Kٳ+qC&su:Dת+w'W Щx{Q;v,j#&&_-[#NݺuILLd_)2l۶uSO3mڴ2߿hѢwα?Nj\c@iP>nP(}r 1᣷=Ƅ=g cfe6EbIp$,wq$‚` p.+Ew1ABhjtfEP1D/D%RBX$瞣z׺+-< 9nVv0ՊYb33I[ïjN\0;J,~o9AtD7=} $%\b+8,H@]HI@[I%s^RIA$qG pN3h*bϞ= 8P/W?wգ^zY>}:>(ժU ;3 ;;I 1f;w.m۶?7 5ݻf?r)`PUDzLs@^6*$,&ŊV#恄[ WUAAyB|*G*As8c2p%WXJTB D:B`QFQ۴Vx%2e ]?*n al,h #~utSr6"s,psi[z8lԀʝ}Qޣ]~d.Iq׍ҩYsEm%y.*~BiBPI6o3DWRRO=Q|JCnfz?5{bBSSѵXcIbU='TD75u +\䵓 V eXXt:")*Y H/2O?D׮]X,tѮ];TUȑ#k׎0vݮ]hҤ &&J&paA^-IڮR [%B$El0'/zh ,Moe C5[WF -{Df1|:>m*{3-!pV`th*3ZT?8k]! u a0r)EvvO'xqb> o ';T{"nj|p?A:On$PdV<2E?"vԂ"MڥJL0YP`[MN*Yq*+X,6ķW{y@Y]+VHpz/~"[ˉB* eXzAͥ8o'OR1!''=z`oxƍQƍcXׯ˗/'11љiȑ#_g}@P«Gũ;$ $B(CH=!,ql?t aIXV\v| -U]QVCgGIV1+4C=gg,"xXF7o׃P:_$*v a}Q d1VAXGU<-2wc(BJ|(g&ۼBfJǢ?+켭.|~nNDH$=z[nL6l\*WTL&bIKۊZV|f((+k Wn̞{L4 jVDڱ>,v,pzK=T\;RjUX|91 N+B{ӧӧO&O|By+p#nTT_%V;W eY0FB^E*V+HU#rɸ>ʩS k9fشekB -e=ap0յЊ%Hf{P/!t(Ba!aPMl$ް(APV,p)Kl'Ծ`BP IWJ6vChN:y%~;hԁE:+n#)".y=|)ѣCΤ?I,e*bVfXjV\wytqq'0Œ J*,fg_tYsavbo6ۆQ󍓞q: a ry= 4o~zDy*@z 0At^~J(* QC< aA^%w3MQ%]27˨"[dL!2ļ_}g$_ a$Yz6͕0K1[Z03?igt/`>H1{{{NyHc;;8<*R,-lmFS ^ȇDobXczzQij-X2'y"Xl:W *J*z֪XX&Oߑ>$(ApWq#h 8k > *Fe gTٵU|" qTo!{c՟7n(_;v 'ND||}/c4jQQQ8|-Zɓ':,5B&~.-8j-%~yWJ{]F틟%fƫ2Ĺ lj!|"?u)5oR[wVn(OJJ-\M)_GT.d?<{.)Y/d,d2*#.rU+dߞnhlԞ2y}*Q٪%s?ʿ%E]F-!??ӧOGdd$<==!W1ƱcoFdd$Μ9 bΜ9jO*!3uݵkۇD!NW^~:>c1"=WׯGFFN8.]oӧOɓ'֗H$&OF[] ŋʌ!У9ʄ?$eTqr}n ȶ`QmbP}Hv>88JU}\m;F@PBJJ c*'^f#o`Qn gշ)+Óm˻*Nj`Cը&W-&_N;a(!,Sj!`k'_R6tcڵСuqX-o) ~ػw/Ǝŋ[8Bf[Xc߹S0V[Y] mhbbbpm688XY x :u oV[34Ҽɬ(7S;J ¿ શF03ScXgy2}ײ ˨&Aeʷ ^Hyyv'eOmIm]AxԔ#nBwH蟀Q_W9 9R&B;⑱Zl)))0` $$bU+uKC~…  j dddܶ]vZojwA,#00| z+wupEwguCxpA..TZ&y_mIFE1G)ZT>,Z$zֲv' >޶ kskF=!T>^M੽vV/ i *í^I W_}#G 99} {ãYMy#!A,0s` \z1z޽{#!!vBrr22ۅPI>8g6m_ߨ^kt5o_ZH`iZdQ[o 'n(53xxֹH$OjTBF~#}+*.+h!lO +ܝ.ZzM'ܖiڬ 8>[jl7V5|!HJ4scH~#;!4z>]]%`>"  IDATV4jQ* a"o+onD͛x?gH܀??# r2Մe孌vɮ'O[(99| RSSqMHRt| ^xA}tL>E޽|r4k֬qU)XQ9|)履~œ9s`˖-j-2 2LmDPXcciyyy={ ""pt [nEQQbccѣG9s 59brڵgV9|)2!JG||u[|Z˽a DRRRUìwPuAl{½i].j!LM *P߀+PH~D^k6V7hB@IFzz&W3!4w fJzoY !)23g nb*]yLI5UBTeT͖@s%ֺS,c2%=~d15bݻ~~~pqqkcCtJjooVZfL॥عs'Lضm[1ƪU!Tm!4qPS!T LG/эN_eYybc+;3@S'BB`lDZ()+Q_8bvTpJqP{ ~Bh0"iwe9+V0piڵZ744())X_1,BKBh(وȌeTaTQ .j=j عx WU"om |@{Pk/ܲE*B`lQ[ %-ťV+i| 7 p !c3fY?i$aΜ9SYW룻;>DFWmt.y3sL]Fkڵ@JJ ]-Ll!E> _޳eƴ}%QjA 0zUۼr. +=턁@ִG+Tg}UlYlk=g߃t|Q 42㣏>q=ݻq…*wܹb tر:BL2T{$&&V՝;ygV9|)&%/ >]W"cZA0 -ĉ=<<999Z@IE||<:9:t=tCf n!jn!Tܧ'V]hL a4B3_:aW߮-#7nES%SByb7ua6ɓZQm$ Ѹ-KtƠAO C[Ul| v6v AD|dk׌=Tf͚K")) ӧ?^})3gT{EH$8wvϟG˖-AƘUВtC jBh#TG'/S t&Y鲷GPJPbt ХJ.ʼS\ 1(vzS6bv6>FPmsu1ƘĐ!C#//O-XqqqO0w\mmm+য়~B~OSDEEa8y]{šsx1sL^^^:uj1ƪI-z?ޭ}6 ”9\22Z5" M O[ѳ<T*cB{5_3!Tmq*9/:+dZ^Ì3\)SIڹs'Aݻѭ[7t]xj )))ða >|Xy!v<+f琙[-):5 ()~%[hǧW`8p`bСӗ֦BImçRפ%dfʟ2ꚅ "&&ސdhݺ5JJJO>1i_4zN:!99p뵆 5lhH˝;$Ogg``0k>ZRE OyCɳ:[ӨQ˶oXukQ{emРA czE`:=[m,[V}qR$Bkb16oތ#==2 ;vDPPCcS&09ggLܺs%|)8!f&噇ʽ5'xv[D %?^*qCmdq'Qs+ `fvoX1VZh-ZX: ƌ`<{XwȓE}3VNY%T[]+EHp2=??ɟ5tR=`QE5^&cÇ~h@h_|񅙣ar {򧋯C* 5h$qPT=e/_^T?Wbtp;yR{XcZkic.c ZB*ڦM222 f(}}77KGS;9dILĝf /Z:ݖ-CegW:UT U$O^84.;O1RRR? T>am~~>bbbD0됕 .=L9diS}9=3YG6ʻ-jUIGY1X=|r(Aprrg}pЊo/ $Z:ڋ!3E-wjݥ'4}IJBh%}Tcy xY׍ u>}__ǝ;zC*-f터*Q"!׿VV'N87\vcu_|v Ap L:C txLXܻ(e`U'u‘T 8 $%_L}#|BBBo>SvsEaa!+e˖*m^W!̬, ]ѦM?GDDكKc^ӦuPC)iOP_Xܽ ̝kxr{VYUBk.۷1bW^~:>c1"=CׯGFFN8.]Ѿ}{L>'OԩSHHH͛maH hml!nuKBBԖEFF"00-ℐ1X[@)TupUdVuik-W,{msrr̙3Xl֬YDRհ:ZQrYoҤI(**œ9s, cc鈌'D"t}nnn:t(j8ez/[:KqgXa̠zwi]ZZ9}t8fh!t[N(pQVRRR z;wN>Ν+V@ǎkܹk-?s ޽HOOZ~#Dm+WpUeEEEHOOGׯ_ǥKԖ!==>Cǡy[F}p}]O>pb֭ope߯k39t$6Cg+`NN}C*3m||<]X"77= O477 קL=;.qNeZq !NXnQ?E>âE0q 3Wf_kyϞ=yfe۷oGXXֺ/Ԗ8qaaaw{3fP[vUi% ,1cԖ ,, CDZfu뺀<|ŋ D;w"** /l,_#=$uWQC+ŬY~Lmybb" @'Nлmdd$h-_x1 @w!"1cƐ gϞYFZZ*e-DKZ:%__yHYڼyH?~뚻޸}6;wNkJڲlqdddЍ7ԖQZZ=yDm˗?P[VXXHiiic׮]LeF999|u8n߾n}M P\\OD" &hmӯ_? ҹzuAD7Qp0C$c(IKT>;XuRR @?~/d2ۮ^AT岧OR6m[net!ǖ-[H8q":tuQ*hEBd#QㄐYI;wQ׫zzJ_BI ի6mD"$ =-3ƪ!‹/ &ѣGhѢw^l޼Y7ܸqظq#^5vX\Xd <==j*\rE+LVJcrk׮Zhwz XaH駟"**  Кߴk׮1fC4jԨC*9D"4 @^'^_16W3f28VO?9s 66999 -[0|p:2 2LmXcwޕ+{ @˖v*+ʇ`BVJR#>>^:~-[^^^ذaeT8LӺ|ґ(`2X]rDFFbR=֮]kcV*6֭@H|n;]́c s7ϴm:S;?*VetȐ!8}4.] l޼FL&èQn=—_~ ///$$$ ** CϞ=bرhӦ R)~7̟?ݺuCFFkPcL^^ZnqHLL;#{aΜ91f*{mS3h lC:t=zL1PYd';W!+/ e呑Ceeez]r% @'OT.+--6mP.]*,$}7zIKK#f0ꋞ={`~̵Mm7||"HGp0֭Z>n&>+H~>>2m68;;#::ZmyLL n߾TK.e666x7p)ܩͭj3-?cTR q"6Ya䟉JH…  HVhh( ##ڵZnhR ##~!Zh!CTcX~=0m4KBU6nni?d2:t e úŪ!|+{msrrtoۿ M4QnӦ J?&L'¢E0yd GFU6yw&A>&Wq0+rhR\!x"pTsh@ܒY)~HOu4}CfV$OOO>}eeeĒ%KУG=z~~~2e \]]Ֆ5X}޽{3gz ̙3o6c̚5 7o}p3;dr:y#n@kU B,^U=Yǫ5f*!MYNN}C*3f[t$:w(4m-իu4ё`6 ƺuZWK"???岈D",\oZE9\o0VUچ XM]vHLLL&Sky@۶mnsi-7f[@bkp.BGGGe7ncV˾ p \pIV55Pݰa|||Fյmff&N:\VZZM6k׮hܸO\v AAAU;XsaO1VUچ1jUFEE_Ą #hػw/6o Aƍƍq;º IDATUecbʕƒ%KUVʕ+طosaΜ94h… Xly@Ƙ^&M+v www zYV}pr\Vu2c1X= !c1cS2c1X=euEEzzCQx x Eaa!-JUXX ׫ &YzrU._oCXf0Viiiԩè`u0?Nk3V70/7X]qBc1c*c1c'1c1VOqBh&2e ||| HбcGZFrr2F͛C, DZcǴMOOG߾} 777 :YYY: ppp@1|V*uA$b1=z/!8uۇnݺA*111ӧO888 $$ F'N@~{{{4o3gDQQz}n1}tDFF"HlwƌOOOHRt01 |RrDFFbR=֮]krL @$|:uʤ}SwTd̘1z1%&c뎊:u C ޽{z7WtʵYЮ];9r$ƎkrU!(( gϞf-7<<\Nx  888>>>hԨYʽvzFoqq1Ν@ሎ6y.))All,5k{{{`(..6VYF_5[oE _meDGGSxx8Z:D;v^z8p@ŋٙzEIIIO?Q۶mLJpBD4g:t-[697o {5͛Ɔ^{5ڹs'=z6l@/VB4x`ڷom޼|}})44XKǎkג= @+V0[NJ>>>$YW^7ϓY}1=sK tԩ988Ч~jr>>TVVV-ܽ{WkYqq1R߾}ˢˋ?~\vu4c j\hD"L_Aј1cI͛$JiҤIܹ3mVs9~8 @WV.pD"Zdo69::RNNrfϞM ͛7Ֆ$^ԙ+W tIRjӦ uEg8>ˊ[TVϞ=߿R;*HTl"JII!A(66֨;*ү_?W^p;~UvJ=(}7f/755i$Ŝ۫W/ :^s>)++F/rppPrH$A>,8qAUVm_  mh111}6RSS///ehժn޼ (--Ν;1tP899)GDDmۦ\{nUKT;SRw0rPz%%%H@ 2ĬΟ?X`.]f9~Mm777b~'ܴ4"00&L;֯_2/*(꾷zU=>lذIII(,,Dzz:Vvu3Ԭϟ? B3xݵ+=xleO4 EEE3gZY!"<|P=$ֺnnnF=i$nk*[n@y#GM6)M(\R)bq' cTcĈʁi,y9ɱ3fa &@,..\ɓ'\nnn1c6n܈Ǐcոwñw^aLQY(..6u00F֭d8q-Rw0r`j=_A,gϞL&brϜ9e˖a͚5H$չ.wHHH] GGGܹsQQQjY[K.hҤ $ ^yBYY/899[n&mkj?0vXprrBzz:?~{"((,*O/gkX;w.{$$$cǎΝ;qYJ&/ڵ+lmm1a„2##h׮V\ :u ~)rssiӦ1UU?̙~yyyرcf̛͚7Ϩh߾=ڷo|W_Ehh(f̘ aLѻwJŷ~z4l6z;&Oqaԩ={6glSVyzz(++=zѣJKK#Go߾վCbcc^7lM4Çc^L& Ѷm[dffb…FEU{neM87nҥK Æ ӧOѷo_ٳ;w2@L:ԩRSS1}tpf>Sf[-..}-Z'ŢZf< ('Ot՛SaxQFEnnI?//5~-hذX+s-((@IIIgƌGRR^z%t'OƪU#99F?/M*C>Ue0:uꄈX|.\u/.%JꫯٳxISwTƹs琖7xC힚Sw#&&K,ڵkƍܹsʮ>>>:.S_ULgmllЩS't Bvv6-Zdrq5*]Lq:88}lYGʲ<<RRR(**$ :t222j,d>sጏ=JDD]tP!CYF,##D"-]TmIRzӷo_jҤ -HڱcGlCǛիW \SjӦ uMg8>KcST;Ct 5ǏSӦMSNFolabrww]uGeܸq\\\裏>p;~UvJ=(Ɔ}}!9s&H:trК:^j;] /@5Br=<<Ԧ1.[L9=J ?O2z{{ս|>#rvv۷oW.L"##ݝ֮]K0˗/'AtI:qC!33SZk}rZl988;S8G5XM+D"˗ÇiŊ$J&,MII!;;;2d%''͛ϏڵkG%%%j{뭷ӧٳI$5Y/B"zE۷oÇٙڶmKO>5ٵkmݺN[n[*2GO\ycڌ,+blQ'ٳiǎtQKG&A<Øm_~#Gw}G$iFǘ[l!Ahݺu&oklQ .… iϞ=taZr%?Ozg̵رc֖O2cٳg/L֭JIIrpp Ahҥf)W,@f;ÇӐ!Chƍt!ڻw/}$ٙ\"|Nv$rww'4k,`jڴ)J&Qnё-ZD<<<?lǻ|rڴi9rvI֖u'fO|y{{=uAۙ 'HS!MKK}T*%2d]zU~KjժS@@Qiii3f 9;;k-h̙Ovvv@sJ[n$HÃƌCZ{)͛76mJL F 7fԠA#0aVY87j?_~ݬe߽{FM$H{&]3u~R~z޽; QDDm޼0dѢEԾ}{rrr"CӧMڏu"##Y b*cC._L=z D~`f̵Ø1ctS޽{FI͛7'{{{-Z[oEƍ3[(=z+WPTT5i҄H"P)..&Ol=z(T*%TJ4b{1͛GD""ˣ?5kFvvvDݺuyQΎ襗^T/N ̿1c1j-T1c1)Nc1cℐ1c1)Nc1cℐ1c1)Nc1cℐ cƌ-cµk pܹ*'""}Q5Ec ᅬ)S5š5kѣGA-*c !A նܾ}(--3ƀm۶aj͛7;vty7nΞ=iӦaҤIƋ/ DGGc(((tU '^ "Qĉ8r:w [[j?c puuT*tzԩSiӦ x7燹sHOOtU 'Zmڴ Z\]]ѫW/N:B"[n8~"_5^~eHRرc|2zGGGt .]Rn|͚5T*Ñg0֥KEGVqF޽;ѣʟ/d2.]@bhD"AV|/''Æ Cƍ!׫m?P: /رcѠA4j_~8 I"$$hڴ)/_ѡCH$t;vPH{cǎpttD޽q]ܹ!!!H$2dZ:H瞃p 0|={""Ȥ:1fAкuknnn Q.swwx|U b\~D"ҥKn:'"ںu+eeeQff&;J>TCjڴ)ϔEÇf͚Q>}tٳ'EDD(Oɉ^z%x"R֭iuFM R={6oߞRRR͛yfrtt]v=#G+-IRruu%;;;rtt$WWWZtiuRƬөaÆuVy&>}6nHDDYYY$ҁ(++^ujܸ1=}nݺE tEʢ+WMϟٳ'+AԨQ#SVQT|2ӇˆMFt]{.UGSYw!MqpSi$YMK lEEaZJ eHb1zGKPeAZY9 ""3mablyg=}s}3؟ssLDDD26Il?F5 5MMMB$NS7nm$ $onn$k׮m_!Fl:uuuB$G!{ ٳgnٽ{[k``@ttt۷o!J_ׯ;џnQYY9rW z!IҤM!RSS޽{cO"""Dvv6swb2]M?y[Ŋ+B9s!/$ =9s[B\B'5Çw$ .}ac#"` $_=׬\F111Xn֬Y h4@WW8z|###Gww[?OpM;5pfi44^?T*t:\~ׯNCCCF#/^D{v)׋_wJ0JJJPUU.8N "55>]N6=|d`Z?=p8 B!/p_cZv=!!!H 3t~.gk Ѐ:?EEEX,¶m044rt:( Z NӭOΦjiܻwO>rQTn7k,HAl6chhBj$&&fFc"M5LpΞ=e˖AR`ڧH-&Օ+W`0m7]ӍkqH f#F#F#:pܺu hllDEE>}f>g.b~eҥPTZx/^0 jkkja4q9 00+B[d J%jkk9>?~M6!==hyO>YM C{{;6o.\Vtvv)))^'[j"??JFkk+oQQQQAcc#BCCQZZ * ZS-&9rPHNN0Ӄ~>FAZZJKKSF|ADDDDD|!b $"""""Q DDDDDD>G1[d58IENDB`psignifit3-3.0~beta.20120611.1/doc-src/BayesConvergence2.png000066400000000000000000001561551176542545200231130ustar00rootroot00000000000000PNG  IHDR,}sBIT|d pHYsaa?i IDATxy|LL VT-U^](hj{UEKU\m[~], (ZAdEEId1I&3M23Ic9s>s>qR !B!B!B !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !B!D9%B!BS !BQ˖-#66B0 B!ʠ0}vnܸQ<Ξ=KΝiݺ5;v6Ӎ?|^ϩS G^hݺ5<#۷ed̙ҦM7o΋/͛7iРU9}Ys=-[Eqqs @6mhӦ ׯ@)EΝxbhׂ9sU美"o9--7x@1b<ТE {1{SQLB!6tA]V)?Zje3ݞ={ŋU TDDDsN5mڴe9r:tJJJ2o۰a*:wRիz*22R)ԯ6l4MSJ)`f5nܸ*x$mxxׯz-ʝu&=;VM<9!!A)Tjj_-Z}Q֩(> !B+.]R>>>|}}ٳg;P(L!!!G*ٳgU*U,oE)ڻwj֬Ezooou!'OorrSJKK+P9m0u_Tbcc9(h>͛7U T/ǎSESQ|˨B!DǪU4i}[n_W_eȐ!殄9_m۶ҥK<-mРA$$#G{ŋ #Gh޼9+W.P;wMre<MHJJ"::ڜ~Ĉ4mڔ#GrUJ*ѨQ#ycn9_z6..iӦ /P~}m:˿N###ywhٲ%;v$,,fڅ 2h u*B!ܹslْ{}v F͚5/NcʕZQ,)&&???jԨAhh(oIIItؑVZI<@ff&3f_~1Gtt4]t;./Sk޿?̟?߼M)ey߾}ԭ[ugY4M̙3L2O?Ǐӭ[7N>}gN7w\Yd9T8B!eL=xw6lHZ4VZ1dΝ;g~???9žX4hPr&#F0n8SNmۖRJʒ3ٳ'={`0PNZl <;o .fNJaN>̓>ŋӧ˖-O>ԭ[7(lYҠAt:y"-[ҸqcN8a.\w}ǎ;X@tB!(:t@\\KݻyG ѣ6_ חƍn:lBZhذaJWwܱƸeWNڵFw}guF1p@^yݸq#111Vz!'y͛GyIIIΝ;}VUVy]xmذ!z}k^i'MĥK1@O'0kQ`{[.AAAl۶ 0vE=w|Ǭ]~UZ啳N8wKzzuv1B|/BcǪ^ڵPy9sFuIlRuA:uʼWJ)^{5<<<߯7no.\PTVTӦMUaq͛ϑ[FF>}j޼jݺjѢ=zyդ'oZx1cTfTȑ#խ[RJEGGVZVZ&M~(qwUuQ/h6u/9::ZuMhBg.ptQFu֪u֪cǎ\ !41cpyV\$BY >:q:wᄃ|֭[Ν; =_^CQT2Ą ˋ6mژ~z Ԯ]Aa[nz?^$ʀɓ'/~z&Oם]$!Nĉݻ7kF3sLi322 ooo:tPEˣ5k[Hݺuٿ=g1e8g֩(>.Bػwo>iҤ VbҥZaÆ=cǎԩSҸqc3g1118pf͚v֍K.j*_`ر.bcciӦ [q,]3f0m4t~{2i$:uDzz:G]vIW F.nݺ'x5k0tP>}疐`u~51bݺu?~d.DQlڴ իGrr2k֬!$$ٳgN!ʩDj׮m3 f߾}oI%B\nىM6͐!C,=ÇsAlkVZ<baLw+/Ю];6m` !!￟3g[RSJj8w-9+WN8qڵksy>#MSR ϛ >͛7sY$''3w\x ޽{sA~|ݻ@y?fJ)233y&˖-#,,~BK.b ~G-[/B6m5jK.ur bZ"`߾}XjiӦ1f֭'88ݻwyfypRRRq ٳ0hٲ=ٳ_h¼חիsNǜ>})UTZjl߾@i ŋ?yZ7OOOjԨʜ9s։|oQ~zQHҥ | ;vd֬Y6 !#š5kl4M_f|PJ1vXVZŊ+xꩧ t#FopA~ik׎.]Pzu}Æ sTQ 8ѣ222X`TXXרQhxzzcXt:giΜ9cW`\GN:fʔ)+ܺu͛7̌3黼e˖w}̙3ILL/.hám[g&oNEra˖-Yf Y#5k2uTjԨO?|@ &/^ݻ4j2ݻqss!DFrr2w3///f͚֭[ׯӧOjժ,]p֭[ !!ƍ2e ӦMvZCM4t˖-t:/_-lРy VݺuIIIa$$$N&M5k瘋oƻkرcźB&My94k׮a>}ӧ` t޽Pi߶mȑ#y晻Ζ:իWcǎԨQD6nʕ+8qb8 !ʎ^{8س#44Pt:111Cg&ǪQȠM6l޼WP´i`o_b7̞ 6:Q1!(q !!.iS8}q)WSQ6d dݸt:t:*T민 @ѻqI+V<_~ٳߩ[.ׯ_7wuNNNf|\~i Iff&` |˓^z^zBT"4on|wEY={@)]BߕzAB!ػw/ؽ{7:#G+гgOfΜI||<&MB L>X;i$&O;CŊ2Oxd>S/^LDDqqqL:j$ft:?߿?|I\Bҫ~}XԹe0u kՂض͸섟\r+ԩ(h!.B !DaF-A^ŋ(EZB!D`jm/ GäI-LB!Bqϒ  *U[ueM]*RK!B?S'(RP!Bܳ8yY6Wԩp B!=2. ԩp2*B!B!BQNI@(B!Yt4 b|CT8B! p]S !BRRR'NwԮ]^̙3^J8Ï?E: B!D!]v%KtyxbV!EB!BBjР7n`Ν|c(BB!@)ocһwo~i9E(R$ B!(AK.euIW.ԩpwg@!to6 .svqJTFm]S !BW_}6m/ &PzumÆ cذaUbU*R-R$ B!(6l~͛Ҹu+WXpp0m۶uDQ~~۽alLϞ=]!8Mӊ$BQt2P!믿ݻw2e"BQh.&%%1a|}}M6[.֯_πӓڵk3h "촳ر *WLڵ=z4 }9B2g|'i)eĉVۏ;_eڵk9r*S޾}#GnٳDGG[l{.G!))b{\\gΜf08r7nܐ(CoV!D)\L^ꫯԮ]رcNSW:'|R-_\ٳG_^lRy{{vRjjǎjժUO4W /kB^3fP:N}y3}otE= bj裏,-YDo֬z뭷,m۶M… {lɓ P>fձcGmnRZ~\Gӧ[EWZ7Õ㻳`׬0,H~%T}.S:N]b{޽2 vzն^~eRJ9UҞcDz~znܸ^ݛuڵ >{T<5jDƍ ҥKԫWy1qDM6~6:rڵ#<}:}8pbǎT2!Bq011FYmQyAeffK/[oeqy>Oa!(_lقNc۶ml۶bN`08dB!ErM3f cŊXNW%Bf;w`0iKA!Dy_wQwM'uJ*+88B2N8_ŋYhua۶m@׺5ܾR-R\IJJbÆ CBBCv5 W_/LKi?g)‰N+cb$,,si;8}4SLqr9\* ۷/zbܸq,];w+O?`1c ǎ?˗3zhZh̯GZgDFF2dv!\ IDATիyg df!JBJXthK"weQBv=zz$&NH޽]6z3gZ4yѽ{wjժ'gܸqXI!K7n^`ڴi׏kZ3Ms E˗/'((N:_ 8G׮]ٺu+,mOL]7tn9 !DO>^zYfQjU>777իǣ>Z|HNNNVUDD6lӇcǎLzz:0_Nz"_qsU+ԩp ˚P FvvIUjf*`\U 4TBX1_TRB5j`\LsxxxKqqqqxhh(t:bbb4Çx7mkR!(* S XFBӦ^׊Z&n:BOFs/-헶gp -Bʺuf999r8BB6FӤµ,T'( RDE =f{0qBc<#ߞj{BS!\ݝ;w5jTZի_>m, :s3.I!u*ABQ*& B_Ѿ28tpBh>|+WRBVXeŊ.^W"4on|CT8tuPӧ CPf1gw3R˨J*(~BCC޽;tԉ R~}BBBx]R~}X٥([N#H ݾm\[J k۔@Αڵ.EѬ= 8~x,sM4bŊܼy:믿:hB4:i˗K&jg/LWU%.w3ߕvao!e*򗔔ĉݻ7kF3sLgKQ52 `^"￧RJ,B8Ndjk {Rk/  Ze?.Q 'a]ƒ%K`VF?`,\///&L/'KJxH G1Nd [F=%5f3vR)*GwנAnd'&&TwQj;ӧ9t 6CN,YЩqm]AT8NdXR-%:LeMiyv v-稨/OQpLKRAM‘Ix(5jDF]2# NrvIS:QIj%{*ٮY @-DGg|2?-[x 0-ltى$ Buwf׮]ܺu=B;tqQ|N#H@D%BVBMiyTgMr C,;!֦M|@ͩcY&S@(NTarE=%u6MsHQMiddߟ; ,Uqfd@b"c)tTd„ T^b۰a6lJ$D駟70|pgE!\NT]FGpOnߡ8lfBsסe& ׺7n,[fH  SUTΝ;;eVt4L痽1ogf6N^r !N8)*րS'yfm\АQBl.ժeohə3֙{]FWZ1re3H@((Əŋ%¬Izz쉷7>>> 4b)+1\Jxgu4t _r/u*\NT"]F5 ͫPrcou`kL|7:p:{^K~ 6-[۶S&+L_ڼseWab+B6'Nѣ4mڔ0p@y{atMHuFff&,_?.]p-e@bl㭂4bΝ;YSz\c]P./ i>@f&ƭ`E1Kkz#@ _b|| Я/Ʌ y&+LtCRR響V,,,ddDDDa3'_g޽jLoa')蚤ӦMˋ-[PJڵkGƍYp!+•G<~wP??c+Nd jrVoŶN;J'CZɵbiwIY)Sd[^]F馀AinPyV?\ȀāS\11lu2{>i4Þ=}4WOy.&&M4 `B.rQQQ¸;wY ӍF%9ԩp yV\Ɍ3ضm<Æ c͚5yw9V^MŊ߿?w rWppp^K^5Pf&J[*hcL{*N`VQ)gUi!WX>>P:=hr#/l=!(Bz/ Jw¡<)ٌ31ci%S.ԨQj_5PJ'OBzwQ3y-'t:Gqb鬕K52α֨KRvH GppӦMx{{3d)GfదAV G^|f5ߙ36wk.%4Ud0& !\O?mw_IԬYׯ[~::ǗKV>}]ET8'O$ 0000g/ ,sCRRcԩT,TR2u?y{qQ ceRSؙKYb^>({2gP?(-+Wdܸq9.`)))̙3~%Βĉ 8tnh߾ Lv.p3f8| 6ˋǏ[;q7ӡeB\n abbݾcѢElݺ۷3h ,X@߾} Ժx*V5˨UQ) ?0pjVӕP>suF`3eףt8/-s̍Ƈ/ֿOh35c-@S.%}) ,E-|K,?ҥ K&ի %$dNm?7s "(h( .(Gy'ٸq#IIIϟgΝ^P!J2m4ƌCPPݺuc{n6o2x[Nei;zث E9i?97c8t#͓d 4@3 lq9|}}-۷ϡ r)^ׁC88|'5?bͻ k>ڵI&1x`ѣ .,{g}~8s(R\. lٲ%k֬A4q'NE*YQy/]j|c@l>S5sY =? Ac"os Pzn2U@T2&'V۷åKw0c) 4M jf@/СCv s[45>vݿu7`0 ǟJZs!&n+q  PJ):*<#Vau*@v&W+o_qcG7sr鄳dfqzRRm9}4/ |:5Yi3.٨Ql\bbb m۶l߾X튚5gl:r]FHRR6l/:t(s\&-%0vg eHsPsU'VYgjx[f@X-gP`#ةR<Ȱ-{VI,;Cu/gk a05ո?Pc?0_ >?7~z}Zvt ᵔkO7OdV0챠VejI߿?;w&99 yƎ]<$nnoV#6@׮BV>Q<Ѻ%9GtNfpn:9[rig&777T9]v 77yX (\o߾Ջqqm6lȚ5k駟Xjy•1cưrJWxS  N ={fԯ_4Xh=z',k3݋W$?Noec_[gyid݌sB;7Eaa9,^^p7BMidiB.9OԳ˗2]޺eQG[-=[j^Ch*vmuzhJ#-fu['hOp#{fΓF \s ~7~m{=N:i4k ooogO8AFF3 1G/`|X 0v,dMd- A&=Ӣ@'`ez&/ |gT:}gff]X!: 6nȔ)S6mׯ_' kϚhiV_9t:/^ŋtn֭KJJ 'O&!!www4i¬YJtw0S^m\nףiV46?e'Z/\0ܞ3(2?6053@XVF3.o7|xV|)2w\19J`s27mdzּV>ӵ玬r-J } 11gZ[e09)ZztPJf 6ߕ2@ӌaŴ=9x+^O޽9{,<#.p2M3vQQSg(W~thA6† ]Ξe $> ڷ7sٽ9d ?4AY]’%K,)سgdo!D9aʕ &88n9>RcMEQ ӳ-&; GSZr&_ͳ̨`J)_O!ffZVtTi0W8z!eW … ~VQ4 cp7{]V 7'W 5n ٰe ,Yb^z-AeX):u={rfjr]2 X>cs/Ң{/pVʌ#G󕅇o7Eh(Lf{9{˻4): *ӽxJU-ɿ@HHqᢆ[ğ|}d'#)MP:KK'B0~ lCP ,< k&4~7eaoĔDjV:~~h҄%KOq㌓  dݤ)YF1Q^,>[y欃\kiIݜ}w^M/~\-9etFP4_`{BaH7VDP@^v&s~᫈(bܹL09sЮ];ŝVꤒ G4xUckߊ0b@m:4Οˍ%K 0\p5 L1CI&Ӿu{X`4ǮcgNvb=N댽Ql^tKRll,ݺucӦM8@eJq<6 "#NSFg adrAw Pzi>l;#F@; |o5Y:W﹎/@@X?$ݣTJ# ̯j쀰S'c,~=8qqǘ N YFaVPZ͐x0-Ea'ژ/.R٣2>݆̬t:]FkH4J?Ly|X/?BhϲUߚxu9j&ДnlM׻ٜHG7~&Yc+<^+۷/ڗ(4@iRkx{o@C8-_qU:DT(ES/8u{ዐ/g&vHx~ӌglvpѻ]vY|رcs}9PeHZŷ۳1 IDATrT˘4>kzYըkЯ\3hqʺnERh v@h9:jY-l򋳋 H)xu/o77X1+[LBB &NԡCefbpwYL\N'͜d s.e JE^x=Ezx;G&Z9 FjFzeS)]kFPP/tԉp*TM[WeI@@{e0&5lvt!+ějP6fMٕN a΀Ж]Fx06rY^LqQ{qe@w36;moaAI?lvwyS`B['s;zM} 曘2j/ּv b8[tze4-4N g}~Ƚ6@uw-g?rƕ gP x\Lw*/W^Nc$":u{nN>S 8Bg}6 sݿ4^?o`~x"'E=<8w.!=У!bqF^y;㉌dʕL:UB!D$\sX\^B{N 5@լ̻*Oe)vݱ4OXv^Z2,22[MiƾCZ^׫w?6ժeС1(c0Y1P!˨вn 53kHWF'|+":eRGZmyx.V~%oMQ-"S虜cqか0[l VДBhPpƨܹt]̬/5&˗ ɓt:Zhѣ]sUtXS ޵ P)?3/T2i߾Nm&!*I$ўDо}Iec$"|ł ruGx|1wY M~s̛gVSq̮ANLcL`5-W eJ,m5w,\Ͽ&$[8NMi/ ٘4Aj#H9fPgjʸJв 2."I3UUCi}UuWg}Pc~ 듸ÇӬY3+ |╘Yal,uoscc5~˔;Gӿysza7o;Gk{LW_1ŚwCB1 )6Cn8N$z'+]˩0:9GԡC*πCp 黴|zȒGH9 w3үQ?_QIx'k<{yl zNi\#=8d) jժɓ'1 x~) ->8<ZҤN#H <4[t܁K쀰P-[_G▖=QMin!tEM@ww}1+˗jJ3iZSV-Μaf2nY-tƠP2N3l4m9Cxd5{Mi^ *Z3܆爩0̘Ow 7-@Şmy,; TALFf-Fn(2 ]ßY~!n nްy୷bС| ƍ㭷brw>/mY@8gȼ(e\?1v;7ͼk{ޙGMNf@)"XR@bTdD ,*#Z& + ZR ]f&Β$"m)zL&3m<Ǖ'>[&^ om|Jӭ\uf K_j%)~-wF4{$nM36#o9֭ӦDj#ڔEU`/ظQ'ҷn][X ̙? p5lhz{M\Ө6%h\#pkܭb u\*[O|,TOO8g/TxM}_{AvZʕ+׿JluѥK*WLXXu^ WSmaaaq(ai߾=ڵ~Źk {#M=]={RF=O t8Ȫ=iy0dw8I2{۸_xZNawU~f]'Bbw"C.ID*:NO9.R@(.ޱ30! ; e2ދ͛2Z{ UJGmW=8JwEG@(Prk].CTXÇ[~a"K9}͛y7WgϦ(BKl\ظY?Kwv?ߗ Шw^sL4IsBe0o1% UQDk֩SEtҹIHJbCF$df®]8ڄv|Ǎ <{f;wݥ7˺eD~}D]8>8,ŋQUIxr{aǎoߞ[n3gÚ5k?~<;_}UmaaaQUVTI&1x`:ڵkǝwIvʬXi2O 濸ͩQt$*HNs'%RF BйA &PG) *m \$tˍ(χ|c81vϞb.OIs8A-.!9JBCV$Fz1) "Q9E>}?JƖ-ܧ§:JwT6naSxX-.Tx+v;=&>TҘw/-gc~h(4m 'СT߬,YflAx_ jqhYsM%ǀ>.-̘Z j"{^|RT䲌䥗^bڴidee{nԩ+Bjռɼy(((`ѢEжm[N8˹sdAYXXXzoqQ&MDʕ2e 5]G4": X("eitCqƁ;!*Yas SO.Qt!Tm  i_?q#=:*׸.Vx l|R^`.eϯ+~1 T;Ô'ʢ/ro!"E!8|QvqBI)P+ 8rt+ĉر#T^իӯ_?:uDjԹؿ.ǚ/v-h?qq0dԷKɓ 8F~4jt LVUv|.`佴3f -',qL-fl`̅HdY.HɎtǎ+=kZ%W(22(TvիPW%!^ y#拾PiPSg!wTݳẉìs"k3䞓b:T".O|م"y:ʉe+KABZ{6-M/TcY+lMa<O´< <~~vO^I a5?d8 ISd2Z ((PL̚G'ɺuXnL>]wWܹ \5iJwvmzҍ:$Pz!tOjS8- REDto͡Aџ%&F$i @"pnGOdԩ 7ɶmP;c&"3X7v$=3f̈ wcJ|0Ns6f}QIYPws#B?@G~P=6l$A6!jWФ t 4ѣ{޴no-Μ)>kYf1}tB iӦWĠAeС>|\{>#\)ML rxoÍ#~9XueZ#lɽ4Hw!vB#7gcPv*gs>s'ꮴ5ZiO±V677ɏ[2։√q묬,N>MTT-[e˖DEEqiΝ;W"c>}*U[qx>XZƲqt@DBmWtq_2eJ,/hqP!mRCJj*/dzpZ'waQӢ7f@ b}8y$H߶>6bS*>7B[N,ԏ=aNRK%5U.|J׮<[]9|5&sl=ם8OOg; K2W_yD޽ᦛ̅޽"*l\(zڳEbYyY~$3ͤsw&K~Yrz&#Gv_PHN?[B\h^=qk_rp}5mNHKK 3/hڴiN曙:u*lܸ_~,>3(%Unٲ5kְf&M,^c;3%DyICM^:\\ M_fbHh8߾=\.\p*Ố n{j5xDuGCuW1CZ8\Q;?-@$).s-pqbs`B9½5fw#t? ;3=eٯaN*BVpۮ/i\kpQxf7S\!4N! BM昋6tH6 Ne 6G,o߾==\mLw{#"|N{6ҽS[7X=¦G|uھƾlƳ0rImT|ӎw/cr84G 1tWKdz>ݓp0Kr&W|M9r̞^7k//E:7Lm><Νjբ;%,o ݧ3 $Ix^v +q9Aq2'F6m U2UpZ_[Ǎǀ8~8.oݻwxsфw۲eKbccyxG9l>11DʤI>|827'$d?fSU]ֽsY6nAf^AF"k`5TY%[A% $5-遍Ü25 Ӵ)E2xzF7TTE皩M=³帀|U*_WفM !BG K^?nHEf`~.'>OɚӜ<cNQYri(ϟٷ܁0,(0c2X(ɥr73w\EpW7nl`f4kPذa2]v{?f%a!ZP`r2K /l)xaRn6fduƑOv+޻}ǙT-N 7ѽ{w̙Ä $^xf͚xbof׮]4n+=4oܻLߍYўS'\J:A BUUٺu+?W槟~"''[nPW=FR1߷١ef-gˉhx C$lH0R5OG&_@8b 5jT[@Хtᵂ;\!;Ņʼnׇ'OHrN+6DMnNAN] ͏3ઽTCPޔNͩ(q穬y }n^ݿK%8r2=NMӢE >C~m>{UՋqx IDATiӦpB]>sLhҬ(,6p@}Yju/0 lyw{ .\~\M!R"3OA 5O} ۄ$%%R$qzҥ ]t)j׮^['\kժUjs)i}_,R\XԢ4(VAXJrrrHLL;dvmV`bߋwfynWYPkIS"K^Ma崝+Hדg0au%wl$UQв]B[o\Bc"b:"e?۷|EzdȄఋ'D'Sq`Mgs2aN}{.E1Pڹh*Zz9q`',ӱcGvAPUUVVb]vs 2l;w.˗/g%fJe㶍2Ԁ%sd߲Q +#rDDPAm pɓMV7k+V,nfmg<?O=\wkD4g9c°aD75[|{SX!~k #DF7mRQca YE"ݳ9Q/XBܹ#g*m~֫+@ Mb(ZFQ&H6˖ 6枀<ڃD=bK74jBh&$ö(em۲~zRSS@=11u֕9Ӛ1c0vXΜ9CÆ 7o.bX8qr*+ʇ6| \8e@jG69!\ (Rr|+cOKɦNZlm$2dF SUUXzMTbccYlH\W,fOiԨ9_u`Ӵ78}49w8pLn O kNfVŇuN-Jb+t)\~} Ck 4jUVl)Kҋ[hQ|ցLRFUYTJ>JꂕjKU݂Pr!I`S]køנjsw'9ɷ?"q7a\}̪)r -uy8mbb!b&%ۢU3gNɓl*Y ?p} Y:pW9޽sjEӧa1˃nJ`.D@R؎;xy|T&!9(dRXќnRǥ `lX,a07EP0<)VH3gD[tƲ\ǎA|hVֲ[uyf<ս;եnp99Ė+7,~^|N -ĭK׮]ڵ땞!%Ҙ"J>O TJ>7P%gd uGK| l. WH[c*q #? |> ;ޥ 4)NDg0_]]E>4#W%S62.PeTS#B&) Hݺ2z5 ͛7{\,X@n1b/^ Ϋ$0LEO>!CƦ%P?pmo +nz&Y0V-aR" B|`Љ0>~ )y~w--¶ۘsOep] Pj"Odo@V$Poy=V$0 lqˉS`Hu+xqQkpF.hYq|1}#vPp$Y ԯ? S2Gy}^.0ARSRLF *O.j +%K k~j"VKys"))^!t`SdP}ۙIʨ*|9^ /mQGSQ u&BMBY5~x @6rOգC 4nUu2h `2f+4裏_XWgŒ%KxgJq\8ӦK/ŲvpW,"!; !;,Ց9|F7?{?dӻ8lI67z%x"{kٵvkә1uqMic1E|eYc.?^$!̝ koʋǓ;BЎ˖P]0kt #G@Fk}nF*|iv֭ţE`SJ>NHU$wݛN@`(@5PڃB vX0ѻD.\ŋ󉉉eQ xw7fږi<+\*,c{^JL&v)bO𤦤_z"ҵtix_ C#cY:F9SXx[P!x-b NJa;Ux_g rQfϞ͌3?~<;vdРAՋPr"S[9( ,AXJ-raPΘ/JAfn 2갹#Pf)s]`21܇x>o}= F[I"|AcHHA:Ȃ|" ˴? _.\ < :*6Tқ @fĎ2V =Uu?.Յ]*[.5kƄ ԩ?СCTVz37DL ))ի'ԳU Ș;tL0^z G a[4Ӝ5!"pg*Q׾U5qS**ƉK.͚ D[jABR22L,I}_CXv[NDGG3l0 ֭[1cO?4O=gРA%RlaaaQRFK L T[(=x%Q *찠U  a !a{`.Z(@-سg.\_.0a/9]"UI-EqcHK|6سt 5֤ <\̈́_t0{_իüy2$ \jwɵ ,XロZj3uTN8[.Ӽ*Ɂu늿uN-J2'srr1bqqq+WM2~fĈk׎(dY+WuDDD9yKTF0p(ޱ+@/v&/\ͻeT~1qyGp[+I1Bxl86=ɞqN~&Es`*<ͦGq @6E1~ӾѯU/PC)No[3AX:t(N4pBBB yEqDBR.pc0y2Z-ɹs$sto~[NX 7K%|kKә8ągz {9rɓ'ӸqmbbbXjOÆsx(sjQ)AtRV\|?Nvܹ3FB b߮];233 A6j(4h… ر#<9;w?Oq`M lL k\>2,RS?^Ά bn觬܂%K78wc µ O j"Yd|U 3n8@שS3gСC+8rEL_ήH_ΌTV,^,ZR)s$ XWE`v(;;Ot֍*UJݺu?~|iaaaQTӧk`^JCOqc #5h6R |:i\&.ք4rTlo ]wVBVBIXy~GhRFM"ow{rl!4/lSY½smMJQPTq-Z0xMUYw; [m tnB,&!.(߄]Ʃ8yy\jmB&*޳7/Y;wuV̙CD-((`ua` s1Rm# rsIy%J6%)) `G^$( ;v = s&99O?(ñcJl+}0z4&Y\&9( R(#F **J=NZ<U!ن^9;\rP{B . YiF.oSV5E|z!p.5t0!CHUO1a'Y{\l6N]_U`c,eE^AW">b_6 gPt3fF$BC" ܂|IZj7|Í7X,MBB`,2v@*XF GRoBZZ2{N@mpjmqTT<22RWChxy'Jd#GO0x`{=k_%ۺwaSҠL hݙ3gc >)'OYf4bPC(T-L׀O+0Tv Bمu*D$UDAKD%"GNv 8x}xEAîȊsoz!D]~=a^RSR8cFMSƍtڰ]$%%ZZMc̙Ԯ]QFy3 JӧsEF]jc^)n J:A!DwLC_*}l߾=`ݎ;e #LMe%.v½lIDM2w]OىJBE tTŗ#1v\6J3P}ه׌ ĉm(?M̰&.I¦ O a*c: Ĥ`Tsl߬rИxRF HuEA3gÇk׮|WzJWMxzBFQ[T#Uiq7T ?Htt4$&&u]ǐ!C8|ˆ2%{ENN .-9s&qqqli IDAToőg}ׯ?1(jںb{Ia_eW5?e\ C +8E J`WD$?ex d_ʨ7WcaBb #Tı~2+Wi22gK+ WSo`S`EpE(EJT^z9s[o]X\AlNgOOEӦM΢M65̟r.\@~4hiii;>nݺȘBJڵ+;wfȐ!dggܹsY|9g=̚5}QfM=Br߾}lڴp{{7ܹ3}aȐ!dff /ФIX"Ǧh.*y^ޭ6V A@66ѥyX0 kvx#) 2o*[_x>ފˮS̼J#ZRKf|mE=#I5C®@A?AMcW%2J`'_6*6 ްqxGfIMvBwDZTGd? Aٷo111e{~/WhVWAq{ѳgOLϞ=M+_AQx76lZn3dVZu8#@fhY¦sjQ-b̘1;3gаaC͛G߾}((m$IbԩL:Ipiq۵kҥK;v,=z|tޝ'R|MϵEzaznS"A dާzbn! wE<^A) 0|uFhyv!CthER[36j'Lw PO{K'6lN;6Չ3>{{%}'eT2Mu{.Io*P3 7(PBl`k6\޸qK($$%!#S{iOfϞ=tEk׮lݺT+Νм9 PouN-J2'#""}vZ=]wŶmx3fLٻ(t˗.] P,eKw 2R<* 9_sjqea)h:6-Jţ 7]2ZÝM&Z6vW~+j` B Td.F7~ON]RIPrtI|8ZV׆y_{Cw.%n;]@:<oࢰQ^3):SUKF#kZX A9uӦMpx]Tݑ_'663f$=ovbIz:g̰Ġ^6|7o?̜9sOKdN:qK/oɓIII{d?¿ @\\'lZ\ ko!Lgo|W.#gu:{+k4ߦEFm2n&kŜ2 ;\ѥ3;ETk6€ݡ xf#qOO$q6uɎ6qG G=ssi\c%eTҦBlCqf*{FPqzݭa!Ԯ]VxiO~gdaaq)x^{ rq]69Ǐwرc1b^~Ӣ~t5Djpnq\ xZUj"OHA@ڦC}{i\soD.3mDl<-6QMb!T5F4ޔ5Dx`m2"sr U] }3]Tsc!Ýb$;_tɓ'9~8s.G6mٵABG ǁaCpuN-JK!0aȪE$;8~#D,RPęYQ qO.nFר lРAMa<=.ŵȑ#G>|8V"++KN$\"[XW_e1q9h9Z,AXJ\JP%TQgʇl!vj@h`\Սw`)JHwҭ) 7ǯ4cH|1ܼ-6޲¹$G !4f "-PܺiA#\U`zt>y%_^fNC 1MeGs ۼhد?ժUcРAWz?OΞ=˛oi!(Q,RkJ b*6֤ɨB 3V`=0R4o~ՙc~a2 d7I u~KpAOx8EB_'S\g8VkWEvRҸU) 7&뾎PdCT1Hۣpl6„PΕh IBBFwd6֏mcS%@ !4rӴFX~=7oqƅolql͛/Q g4PrEs2B;B@RλXUk{$O/k̂} , dé8QQ+Зߌp^OCil B-} .dpB.\HnnE0nFeL r 0mx(sjQX84w{9gd!A.G}{(K''2*N fŊާs!A{ӫ`yP4p \vɨ*䝻ɻ\n} Gl.!΅C>t7 _^]$i)6v .ۅX*Ue"Eel [;Q]?w=FlV'-Co߾YM U,"|7ßqTʇmw:*DRDKy d[gW\ȮP" y9AOij<pubjc&pX}J<T ?I61C<;BH%0sL,[ m ݻwɓ'~{O>A:utGTCs׮)iR}n\fB*JLPP/"H ACϏ@{nJ5tW>QkG\p>{mi"!;I;w/] ZEʻwUDJcǂ5k5%HDz]bB4BJV!=ZfBzdjjJ Y^Q:dA C5 p;xyx8q@R\v  'OXǏGdd$zI!x<~ 7FBʳ3{q:ѷYFh٬,B5սt+=֐Qh$ֲeo#$pP ցo _!ƃ=wEoo 5j ٦vu\ޫ-+AkX o4Bz*78dT}|L0{u֬U^X6DB_erN !! B.]Bݺua9[nERRV^Mɠ?? =]U` {GGHGWyvsϘ"UBȌ' 9qowA^MC嫷KtBWV?('q a PO^GJTSv\ΝxQnbC ҙ8 >؎M F=FS߾@Mٖ*yW<;|~oȨ#YFu-}ĿhF}BHeoc.gϞELL }733111Xt)H^u\% T(!Vk%z p8g0L}=CF 89S+GބP0`+oqN'"YT:{V*<~ C=qP,עn^RS޸kRHRa8w ڶmMZ;wľ}pE`۰a0l0KgQ~~%P[F5'p/fA͍J$P !//>rl#enݴN*GĐѰ0@#whs1=4@Xh.dB Rѝ?^жh1yZ~~~8z1,]8x aʉM@uJlBN*C&m۶^dWEVVFooortG/""<|n>NUJy2!P`z YS]=F)ƐQ&{xX={B+jҪk=mskCha~~\kq$SgjY,c8W=P  xzjmKjjhF=Q< <*{Jך,*JBR%$$ѣ8z(郞={"##OFrr2oop D04/'ȝ;!2N-T %%˖-CӦMaÆAPݻwGnn.V\ Z QQQGXX`F!Nker훷-E;!;>g@Z5xKo _H%Rr1ɓ[#4Mb4VK{]MZZB˗#!!54֧Q-Z|68X+֭'Oh"K:%PŸضm ݻw駟bС $%6l@ZZN::PnӦMӧd27z5a?w[| ƤT ’{E7(pf :2AՆ&MDžк)Բ2r$p`00v_=&qj^  `h?)BBHSdgg*\[UDr Sb n] 9Gu4 R' H̙3`U)-@ƌaW%()ͼtbg|X)M5%JPCXO*S/IV ($CFe2`&`:J 191Z=&'ڱ޽ ?Ǚ<#!,k8G)B5"R>كLdeeaϞ=>|8 `!.*\B`^@ZZc[]^u+Wo޼ wwwHR4ngFZ,A\^t)+Iɜ `Xh^`yܷtȨNBÇuk)*!gB{ {obi,Rx!46!/vտfZvB?B]vڵkcРAҥ k{G!vQ‡CgjÇ #nݺaժUqa 8׿eCUBs_zh ̚Rʟe2tI!ǕN*cƲD!Z u 8RCh/&iڤ'j&eJ~UCx`CFBBHU#˱i&deeԩS8y$yfk_:uR~'AuJlCh+s<@`` &M{o߾љ|fذaF'1CX:N…=_ǗEER'vazJ{B}|]kN;CgaH#tTKXCFU7ySD=>7"99ر#fϞ.];}TMMG$T!ACZ:KQ3 3@.C@Z:O;5;ҳj }+e/ tкu됝O?-Z'O_"22 " ܿI!A`rPSb .!lժmB!-[<6$$.].Xk3CXiI.]+v Yu7868nIxxڙ\V)d2Q,8JlM}fBGRbᄐzVZzBƍxbJ !RT{<ܹS}ӦM7:ģvΜ9V\\[cǎ]0-[:udt0xaGp7^ݻJij(QSxxCzg&No) K$ʯѳG^V^١B$Nm CK; O7k B!T0** ={Dtt4rssѨQ#l۶ B\\wkزe n߾zFիWcXt)fW#)) _}@Xjw>}Xu!/Vc,~Nߍ`|Ȩ9D!2`٣Ъ kE# 4dr>>شiiM.\@ff`ۃp9}\3577Ν҉T~wܾ}[ٳg8w޽Zsܹsx*:2ʞRSU]Ro1|.:%*dBXКPSNe1 vh5ΟҴ6,Z ÏL#=&+{aT5bѢEXx1&L`|111x뭷_۶m+okl C\pݻw#44Tg`۩S,I&amoFhhN`4)??a:*ot%ՏL\"A&{M3󀿿WP`} )!V/*&>=0=4pk; ~ t7Z\ShF!̏_2-Vuk(cU͘1C1eYFqa:ۏ;???~aǎYS83pNpYtVZYÆ qY4mT}Μ9(,,l8{,4h@ /^KhR%??2I֞{kF ChUCQ?8A(8$Nʥ9, Y|sr~#Cu5)!,  66gƜ9st.O2女ELk֬7YiҤ6Lw@=J$x2b_J*ʡ̙C !Jm^;e'e;3NR\,|lPCjk?!& {\z/(8};)2BHEU/}>X hT\ (>C(/:%@ zqj-B1ʨskUTdzC6JJL酢 MQæQBX~q8x <(x8=&T/iҒ 7WԿjm R[Fz6~Av6?wYg}9=7o_"=4BZBl-?~i&/;%6]CweTF5am$U&Y-{[BB~ٳ@% Bўs ;>@JАjoG{Ǵ1X k-N*.z!v*cr(o!r4zHOW~ݼ F<#FԬ m(HUG a5qjHkPJ'~'baRFߋ I(!&d2@*ҝCXiPN!Q/Ss$T.t^M>p;?jY:ҠB}DI%S룄x+r("GX$CXiPBH! _\{GRuR!rҠB9:iijiޜXuT~H1BB!P!7 $ޑ(!$B!%ĒtQ~ n$b; DRQBHH5D=B!fyGGgvlWUwSBBB5< !A~i4 UeuTĺ貐j_7 !]bc(HUG !!H/B!Dab;B!QB,mLDWFPyǨ޻A(!$B!je Z>HNU pe͙C !ѯM>C&m۶E#Fr;wƑ#GN:A.#GDvv%_ !pzzA*B.W^u!+ϵMe̛GPXf.X}wo(!@!0`RRRl24mqqq6l  f𸢢"tXr%|||j*DEE!>>aaa}kO>Xp!2331}tt)))JxJɓ'h޼9Fz!??۶møq㐕Yf;DBHTkkyAāqx"[_Oz^sUcL=6Te3@MϿ4z^2[Ybq?rZ=\&έ.RUF||}Z履~ ܹS]^ ХKlܸǏ+%TFlٳ'nݺkRBHQkk8rXSnBZNc/z)ŖLU9C{ʄ'w2zMW>P4f@ SK=׿s<4#7ªB%v킫+,>rHHNNFN N@"wg} ޽{HIIҥK pNдiSڵBBY; BHTkk!wF ~l9 t>moѮǖq ཡֈT$*!LMMEpp'e!!!4fjj'!55ЪU+Dƍu{xx7$''GcU kXv-HŋcvRƚk.)'KA.Znf2%SJ+i `۰al~c8!Э[7Q^pA0`֬Y;v,>^pe˖gϞf͚~999̙31d>#GĖ-[pgeeaڴiطo жm[,X@;w..\_|l: !ƍa\zY&ڴi1c߶wx J̵ !KK !B!FB!BPBh#۶mwqq-RCTrHU11SUQBh#11SU z*!U 8ǸOUE !!B!TSB!BH5E !!B!TSja?ƹsccǏQPP{Reڵk&Cآ j77Lx:6p9; B,ٳh׮è UEݰ>Jm@'T&IuQA"j7 RQa}B!BH5EB!BH5E !!B!TSZI^^bbbLm￷9>aÆaÆJpwwk'N{9pwwqEPPѰaC̟?eqyvxTƍ#66VO||<:u\ooo9:ex_>UVN:޽{NNNhذ!f̘gϞ taڴiիNX#Fr;wƑ#GTb{i91.\@^P^=HRr+Xn1i2v~9sƬĴ1`<$0̙3ݻ7j֬ WWWt 'O4_yigϳE<z6^uœ vqi&d> ߟdz8Vn]Š39;;˗D6sL<[xX.]ĜXݻ٢ET*e}jܹsbllN8waa!kٲ% `}gc,11d!)bS؇~ȶoN8:F8c .4;.ƌ=zqǖ.]ʒ_yyyvq-8N>ͼY@@S(&vrz<)#IDAT"""3;ucvz`N;k<[7nwruѣG7ի{qlzE-CO>lƍ,))UVՕټ~̉ǜ!QBhgDZ۷ Ջ'33Sg[aa![.ѣz{zݻwT*eӧOWo{svvfǏxbrHܿ96'''4k b۷D5 22vRo;x 0rHcؽ{ضn݊$^Lk"[[Ŵ~z`wRRR{_9t M6IJ{n030v#::U̺7RLQVO<Ν;ѽ{w:FL!Ƌ/ɠjf{gsbXyĶϳV\x.פP(PXX%K`ʔ);62-- hժV^ OOO9s9?~[4B45kƎ'O`޽9s&1o}PLѭ[2ŷaxyyT1yd=1>3 66oCOIes GDD 00&M޽{ѷo_dHuBѣGɓعs'Ek1OeȨOOO|䨟X,Z/Ƅ h[;xzzHo7{NNɸ0i$L2x1?~*,&s{l?^^^FcQ=*Oϟӧ 믿:`Xf ;>|ئ6k`%c0GzЮ];DFFbŊpB{v\.G߾}qE_LQ.]ٳgQqb1FKbݺuFڵq%^s.4vs 5^i֎ǐwyVS^֪>o[o%xc*C1B+hժ^ B!~e@˖--zX׌35j2 .]9hҤ՘p}o<|d<@VV/_ۑwww{hܸMbjӦ ݛU9So(CBBLѲeK P}bL<ڏ B_er_m%[LQ6l3ƬĴbM6 >Djj*޽$FeNA +ϵv֜yUXCyaa̘1شi6lؠN4ٲ~C,ӘVG`DZ^wެnݺ֝k86g :|̙m999L&hK,a<ϳW%$$DWBBb2%&&׏ELfDZ/R]5cnBBBS :uqǾ4<[lq1\=zd~zԩ 7o8c{Idgg:q,99YŋESNzc${/~ոq㘃{}i;ӧ,00kNbs2ֱcGv_jժ>#Z vV<[ţʕ+u~-umo]cN|ZbO>L&˗cǎ+V0\z-> ё 0>|űzVZϟ  '$$>|0߿?Jرc&^"0e„ >c{eǏg{aÇgǕ{9}mcbccYRRۼy3 aR믢vc2]܈m;LIMMe .d ;v[z5Wk߾=7xbkQF1Κ?;v 0mٲ%&&CS2GGG롖5Ƙwvٲe86i$6[׏xlU?&MbDZѣG?8wGl<1B+c~!cNNNM6:WDDyq`߳gϲ=z0\jժ n߾ܕ+Wf͚1'''V~}ˊ#v[36c Y٬YtÇN:1L<==و#XvvNy/^`cɉUV 'ff͚ёhsYnׯ/ݻV=wff&>|8d2u٬s"$4ƜØ 6Ν;3www&H;dqqqe}yjc/^ZnjԨ$ ad)))f#W^Օxm17n`]vejbR5mڔ͝;h;~bFoݜvV# EE!۷oݡZ… yӦMS3~x 6^!Rnj8pg~7߿[|Bk.,XaTXC۶m!UZ׮]D>W%Z`?ݳSN )) *,V>!pss\.wjVZhӦ = @M:/^D~~>o\~vX֭[ѬY38:: (((9spssL&CNpI233Yff&{%ZB}1777vc죏>b3f`ǏgCs%bq?II `;vPo8-ZHٳ8wߩё) Ƙ2!tttd}98cc ¼<&عs?^Dj+,,dwedݻٳɉ]~ݽ{=~Xk'2e,..Np֭m7n`Lco߾lĉ a٘1c?z3&իWOmK.em۶e1b[la$'NP_ v܉ }]\CÍIHOOǻ yDqq]r ڴiD~W_{.vUxxx_9m:THZjuֈ@XX bTzH$HLLDRR9kb8}47naÆX~= H%%%r4/Όmce$FPX*NNNQ8CQQxǞ={s0ꊰ0߿L1R]h֭[+We˖prrlr^scm*6mglSqӜ6Ȓm!"##qyDDDPNzբE ddd>&2Ieu9RRR ɰk.ʙ9?CM6\.GvvEy-OY mCBl/@II!A=bΜ9cǎW^pwwӧ&MPܸq#ZngϞO?5#g'''1˗/ӧO1yd[z/\]]'`ĉ(..FΝ$w{ EΝӧӧO \]]1yd@*cǎĕ+W*qؿ?N:oooX\MI+z/^ 999992e ?DŽ 0m4cٲePĵmܹsiiiE͚5!J!Bb15kÇd"00-B~7oƘ1cкuk4h-­[LK{[ƍѧO999x7=v /Xޘ7on߾ ꫘={X $&&sΔ j_Չ/ϛ?>R4ƍC~+TeySmѣ/SLT*E֭GP޳~DGGEhժ͛!CYkZĴA4h~Gtشi脜BQ7!ܼyg?ޡB;wwAnnF8B!D=BqqqhԨ֭T|:t(%B JI'fX!_3g"##ׯVXa!!B!RMlB!RMQBH!B!%B!RMQBH!B!%B!RMQBH!B!%B!RMJXV4NIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BayesConvergence3.png000066400000000000000000002201771176542545200231100ustar00rootroot00000000000000PNG  IHDR qsBIT|d pHYsaa?i IDATxy\UA BETpDE4ќġ"^[-ۯ2-,+4EJ-i8ZSi `8zu^r^{gmó2a """""""""dJ_,@B"""""""""(Y("""""""""QPDDDDDDDDD% EDDDDDDDD/JdEB,(Y(""""""""""""""""""% EDDDDDDDDPPDDDDDDDDDdrrrʕ+vHy\ p VJ 8t}ŷ}v[.m۶%!!!~ 2???6myۇ~H@@uߟy晷M4@hѢ >eiӦ:u2 0.^hTZؽ{aaJ(a:t(1RSS ooo~wo-[/m.\0Ona[FxxyСC3gaΝ3+fӻa ,0Zje\r0 HJJ2 øw3gN:eԮ]qJΩPDDDDDD$ >G}ڵk8v޼4lؐ5jsNyիG`` gΜ1'99PԩCFjۗjժѬY3va'..M#<ѣΜ9Chh(~)={K.̟?gycǎv؁ 0UVqL},Yb{ٳ'~-͛7SBN:1nUͧ~JvիXb ޸q н{w:DٲeQ9sαsN>F...\~ ._+| 6,S={2k֬^v#<UhҤ +W`V-Y|ʕM6,]۲޿{X-[)Sxqssx89L[=c\x<<<)Q[lk3J7x;vw^^y%%%ѬY3bccyh۶-/2?3M4ᣏ>n&i6oϞ={ѣ׿:u*ϟСC];wb2R 6l`׮]ٳK(e˖%66-[iԨwRJ8pbpqs777LoJLLY?Ün>޽ƍO?D2ef͚9s۷7[/_ȑ#}FAZ cQN:ij>СC???qs,[۷7D:u}::t0' 'MĤIVX___zMJJ ݺugn&Wz!Μ9C  ;9v옹rZ&LK.cǎjnرcܹ?-ZPZ5z) !CC4hx,_E<|[YAʕqssA8믿ɉ~'ڴicqٿעի$%%Y$nPOz߿.]0gΜ,s'Xb9?(([r3%>۶m˖-[سgӦMĉԩS(Cmϝ;ٳg-x">cƌa<|?bl?۫nB رc-[ggL{pQs-mϭD!@.](S KJի&ŋe5c@@AAA [r$˗… 2|p&Mį?NHH'O~ǎcĈ4k~S"""*VȔ)S8p{SNtڕݻw:4{ݪ>3L<$$$_3f̰qԶs% .7p~Jdd$-[ٙVZ`222HMM嫯2te˖n jժ{:?Sٳg裏ȶmۀÄ۷oo%44Yfa/^d…}4j2zjJd>31oRJ_|Ewθqѣ:rǎ4n8kJ6mO!;.Y퍳s*xn9~8]t1Z}Ņ~-!&""/C$1 bRmk3СC\zUߥDDT1l0Mŋ9v:f׼w…3)Z(D"]dd$۶mcÆ :(5kFJJJӧQQQ1'NЮ];F~yfΜIZZݭbbb:u*}KClܸѢ  L2|w|GY6mڐjwL8!Cj*BCCy嗙0aB|DGG9Xzm۶q)>/_/'OP/] ܟڵkS~}4iBzz:F":::Je׏(tB߾} ]v]OOO_R%.\@bb"fͺ?s֭[iԨpsu2rHIFA͚5o̿\2=g6rc߾}̞=3|p7oNbb"xq$''3p@y>0?~ݻDGGӺuk[&""ܝANbٲeL8˗/SdI:w̄ JsǗ/ps)Ae-&&f5ܻ[ì"_~`͚5֭[ }^~ت1r?s,Y5k<쳼kSO>Ν;8qƍSzu,YbN0 gq~1sL~zem+W!C0eʔ{Oz6T|y6mdhDD$a"b;@ɒ%-X"?9QxKrشi]ta9:ύ7rk{N:UVRJQT;5k0|f͚DDD@Q5}}q|PD3f J駟`NvehѢ_IsJy%)) //L-̮fWWW/_cĈԮ].FDDDDDD $% E$JϏ%KdS/7=ܹ3ώHFE…y7m8(% E$̟?Zjq%/^LDD}yaePSD 2j+Qş8/_JJ cرiӦŕ+Wr p2--dpuu}LZHUקE|' ڵ+k^y- ={dj0 gv}oBٳgxcxyy_Nbʕ/^ӧU'+/,}q|,<3a-ZİaذaCÞ!2x`v> ܜ/ 88".>(_|Hmoưa|ꩧx7;w.#G4GFFCѡCBBBX~E>8>% EDDDDDDDDPPDDDDDDDDDdJH>UxSPDDDDDDDDD% EDDDDD$*AA)Y(""""""""""""""""""% EDDDDDDDDPPDDDDDDktD"""""""""(Y(""""""V"aT\7774h͛'3sL>aaa899Y4iח!""""""""b7 :pBܹs fƌ~|}}3/Y$o6~~~L&/_&44DHHs1jk5a8^pFhڴ)-00ƏcӶm[yfearr2K,~& DDsJDDYA|NL+"!{nڴicަMlr `8pvڙM&ׯTR/_>}p\_DDDDDDrV"!?t|||,K.MBBB%''S\9RSS1LDDDТE Ν;ӫW/*UıcxiѢqqq Kft__xzzg_Κ5k:t(%K'k׮իW'((___ݻwUEDDDD$ ""GNڵyyꩧ~:|\z6mAr~۽֯}=<8>Kz{{윩0>>2eddJ*ԪU0esJ(Aʕ9ydmJ HAQbELB5HMMetڕXׯ+իYt)Ŋ#<<Ν;k.gM`۷\9% E$pJPPk׮hI&9>aw|p%''sqʗ/߱8N:Ѯ];*T@j3f %Kd$''3{lLBpp05k$22}f[.""*  FXX4lؐYfqa@߾})_yeɓ'ӰaCTBjj*?L6 &L@hh(>>>8qQFEhhͮSDDDDDĞ˗iٲ%v"--֭[x{{SNlBm{ex챻8>krdaILLdȑɓ*KKJJb8q1c}ٙ۷3c .\@i۶-&("""""b/hܸ1ׯ_͍EQZ5v؁{M>>>={֪1L7_^p0< d}pd!A4hPbbb,ޏ?\e"Ez\ODDDDD$Y&{!%%(zuÌ`}sdXyȀoNDD}%%%x6l*)\}}q|HA4vXpsshѢtؑ:,)n- ֭3o;<{(ED~(Y(""vExx8g֭Ѻuk._lDD${뭷ضmN۬Y޽{ɀ> IDAT|8۶mO۶mm Cq?sضmH:~8ݻw'>>7776NΝz*m۶eҥM(""MBtylws̹vWWWNԩSQִ }}q|,""` `С4k֌:GTY(""`^z%͛ܞݰ>ykSծvGiMSPDDā 2e˖qFʖ-e~jW(""",q/Ѭ_+:ɇ,q櫯"::www(VEqt""[]Ʈ]8s W^o߾IDD -p"""Oŋiٲ%e˖5-ZdDD$\v#GRT)5kF=ׯEPlYl}f^2ǧd == *NDD_jj*۷g899ѩS'3{IHH૯A""RP(Y("""""bCSNeʹiӆcǎtRW_۶m)T6lAOǧd }_RXl.\jժ믿Z1:)h,~J,y׾\x QHAd *TMLL3#LB^: 99~w~wj׮mV"OBzg~:Ç϶4h={Vh""Ru""""""ِ!C7og 0/bk׮e޽̘1Hm]*AA)Y("""""bC=V{lܸ7kspp0QQQ"L) ,rʱyf-[FTTqqq$''ၿ?O?44!1% EDDDDDdK.t֡HNDDDDDDlhܹ\2G}W\ɼy8"ǤK ,~1nܸ0aDD SPDDDDDāZn6KXˆ*W 4`o WWW9sa0DD$˷ ,\Ç3w\1c!!!߿__LK,o&˗3x` H~tq?J0997fիWٴiGJsAӦojۿ ݻ]L""dFѴiS}s[`` !!!?>Gm۶;6ɤ[zNؿ1c0f̘/gϞs꣏WnWNMؓ|YYݻ=zE{6mزe]7 6p&MWaHTbE7on~qF<==W^M&nnnTZ=zN%lɤ˗ϓE{ҥIHHvdʕ+Gjj*&Zh;Amfs<qHaaa;99mܟcާP!qϋ?!<|,̎dvOOOYf Cdɒ<9:/9sn>-DDDDDDuQX1[lQ|o7Pˬ7Ι)SLL&T@Z8pSLɔ,96իK-[u"""f2YJPPk׮cǎBBBr|0pʭ_J^ddڵk\plTPHA/Æ #,,`6lȬY8|0o߾/_޼2ɓiذ!UT!55~HM;9׮]we>|8~a`2HOObt""RdaILLdȑɓm$ 'pqqߟ3fзo B\r͛{nz!\]]~:˗… 7GPu.JǗW4hGڵkҴiS󶘘fϞm~?~x>Ljj*)))ر#BҔ)Sؽ{7>,a28q.]b޽-[-+"uЮPDDDDDxb\\\裏(\p~~~̘13i$ΝkvExx8g֭Ѻuk._lc2xIHH0f̘a8UftDrj""""""9|05k֤xa7nܰN%O_tt4zrsYmf͍RJ_kaGdBMjj*-9;;SJk-܊ˢ/DT\_|d['""HBk0dBٲep}*U2Ueddpql50 Jfͨ_'~-[neʔ)Z;,NJZ8,q_@=z4'OnV1sQ^=K/o>+07oNyꩧf֭㏙a2|=(-mtDrkbUm:uDjj*111t҅`\2xyy1eL&oM2d˖-#&&eޱnnnd %""ABk)TK"""""rlܸ???X|9aaa)RӧOs6WZK/_֭[GŊСC\z[!o"(PTY(""""")BӦM-ڊ+ٳ?pssXb6o|WDGGNBB9"Ep/^Lǎ+ԯ_{&1Se5)BɱB QL% Oŋiٲ%e˖5-Z+˖-yTT>}иqcV\+suКQe8;n/_<6mR4""ה,& Cl8p+WrQ._|E?fϞmɤSК4 YDDDDD&--{yx% ED$(YhM..pㆭ;o2o<)BϞ=W )a>>۱r'( "CBkRPDD@˖-sDD$ߩ^:ȷʕ߶u""(ΐn(DDDDDĎ 4ÇcPsdaDD+W͍ ylN>ƍၻ;-ZūI&* EDDDDo^|E^|Evʜ9sv횭C!!/\Ç3w\1c!!!߿? ޷o΀hѢ&>s*Tܜ)$$9ssuu,\2/_f 8ҥKSP_׎9bDDJ̙3ٳ .m}x|{7˗3m4Ə @O? j*LaJRrzYNByf6nȩSvb!G%--Gyd(ED$:~4N:ehDDdxY~]L% SSSٽ{7GhoӦ [lQ\/_իxyyY*U WWWZjĉ)W\#JؕCѻwovin3Lw}>+Vо}{[)""sV"/ϒ'Oy$&&ҦMA>}HJJbΝ={… OxIOOǢt$$$F|tֹsgzEJ8v:-Z ..77_(Y("b7Ξ=K˖-Yf<L>=~1c ,M*U,*U96laaaӰaCf͚Ç8p psU˛}]|MK*T`J|qww'%% &'N`ԨQxyy(Y("b7<<|sY;DɇZl6[ɳNn hР "))>}PzuZhMb„ yPPDnуnݺ}vy ɓ'1 7xP9z(>y'Nܹs9{YN89&UǗg:uƍm~)5b;v 7775kȑ#C5% EDdbTZ?9s昷7ȑ#EDDBJhڴ)7nkߞ={qFӭDy,N߾}۷OkAu„ 6l˗/'..d<<m8M&N rUVr_uB4vLBQD % ED&ƌرc-6oތ5W^y[VvExx8\z7x֭[s!<<<xWXz5K.XbӹsgvڅjTDDI$ 7lؐ,mڴ!::?bŊ:)@wNs)R*UгgOFem?ˋm۶Ѷm[={6| DFFRlY֬YCr"/WU0a|}}ӧuӓK./0|N^X Io;g1`sϓO>itRضm}饗fLºuҥ ps^ý{2qD)"".ְ[.gΜaڴiw7c ȫP쇒"""Y2 ;vz8ᯇkly#<|\<-ZmzħYp#k׮d2ѵkWW_} CDDZ5`,X; $$$p5-ʀ>|8۶mO۶m˳#FеkW ®]߿?㡇ʕ+̙3ٳg{Jص˗/s%~a<< eמHb|"!Cؾf2givL:iЁ#Ν#))'NĹs?>g?""vb 84wNLL '矬[=zپ=Vݚo\x8­?Wg%R" Z1"*s]S@ժ0}:뷓^L4Ȣo 'jԈ%&ڑ䮪UrA^ʊ+$((Ȣٳg-+hij}}q|y,]b(_|}99Az###q_ӢE <==1LxzzҲeK+&L@zz:CuIII<ը;vYSd=Àax .\ehԪul{$J,uk:^b"[nѥK>3y.^H׮]qvv6;wǏf͚6VDD< B IDAT~W:d8zT^Z,"b76mDR:ƈ#ؼy"0סc8,Y*nQL RQZf93rd-MӰ,#Wj{%(  Ȕq#( Ⱥ\ {8yd*:h)^c'ˉq%9yzRΨc 4QCCU;ݑի >U.[ bϞt EQ ujcޯӳxݫ&T6@Æ &O=z+/BXHA^!>& E# +Wd56IZ=z4Ç>dIP!Jw㏁j%Y \f \ŝz\m  F@m~1k? q4j7`UΪXbp6ŤQK517eC8::>qd8q"{{ _|~"7:-X5kPB-[FLL ܹÇ˩X"֭c B!(5^z%޽˸q\o%Oσ *V^>2Bov4[Ԍ|rtQ6hьͦٛ8/ +7$SG]O?5eðgv_]/ZW\[b,˔˔~Mǵ9=0`4m ˃V͝g¯رСCy_4ƣ8<ڌc޼&<kkk4h֭SkjA͙iȢ.IIjb~YM;oX0- fWW4QQ,_-Z0Ɔ166LwwgY0z4֭=5aY( >oBthp M4N;"jDEEqU}"9† rYvڕ{_~>}Z" [Q` !(NÃT^|E ˗'>>Çd݋ QF{ Νs'166<5d.GCFj6&fr”S@-g[x8pPN> de\{gkg b;x8?<(|?@rC}bqc05-.sUj(9_Ý;jqhh:y ؔXx(JRΕ?&`rr Fۍ&`FSVVMjBs$aPZY3W/10+? ({t,,Wu̙3O]~\|?&E:-^~BNO/ޠBʺuׯ/_oeeO?DncA8( ݽ-rnpǏgO Phuy??IZF;3m0;clhr7ƍl+~1yVKO w5Q\{QTwWV0!Emlml^{[qZB$WfOKu^(LUGB^jS+&'jYfl^}aŊŶUVO`` ,^ ri<9p@ZnM۶mh4̟?@Μ9-" ðV+BX~m9N:(!Y{T:{7RpMY3￙K166'XX画vk=.EQ~ٛ`\+N֟_ρkjR~ Fn߄=59wO[5t)4hP0G.KosBh֌ .k޽;( ]#F"7w?jqոsS&T"⦆Ҳk~Oc1W <1V]wÖ-u+:aU+(WP?SJ yxNJ420?Kbcu2u+.1Q-=Z-||\TgszF?'jͥ\Ѯv; 6Ypb GT;.|)2l2D$ @ ſk]g /:66ƦMJV%00_[F0`BovmBnrSM vmg5OWkummfkkWOC /1PŹ)+,)+Vz:u*kYnB///=K:b' S_BR,iӦe)SDD?ЦMl9r{hb?+qW4gL+ԤPvKՋSpt ǟ9*U\Q2riE'+Ŋxz،Q`1J)wD++J}~[Q._18MD7RPtG^=S9y\jyƪj*'VFO]ۊ2dh4Ҹl߮\(m۪ᣏ>^\ll PFFXB !P,p?Ase2|o* տ(gWNe*bŧ2-[L1Tu脳RbE%===kY֭(nnn%bqM<G_`` mShIJr3Q*ZLLqsɇxV%VCJc˶O0%9F()LjIF$k;\כ>}:iiitҥB)dԩSc3CCC"##-xjGˀfϞͶmhܸqLyZmy)I !ޅѰaC 2Ο?_B Ƕ"4KP%K(lm}P]B :URKu(lm`g<ٴjS}mqvYbf&;uR;FFm ?.35Uptˌz]V'f}4hZÓ } NR_|ȑlSu1У?o켼׳:KK^q|n.u] qh%!h||9oطVc1hXƏg8~ooO>1p(So`g`&!ÁlV#R#GԡMBqBlMV~r;$D_w[U;6 k1@ʎ\8T)2n8VXQbYeddpI,X@`` 9Rі^҅tAOg N֭ۛ[g___fΜ}Νˌ3غu+-Zq"ͱl] B荙7&$$zxxp)RRrb) 98Uf ]uυ>NX*£+̊֩;Mos ԩRv"89?4&wx}|KlG `b7_Cjsur<(‰'Xn=ϯ'F0 3F$]E~]a,]s̜]2_BY  ѣQQffQ צ8G_7c4T//Jq wBBUn %&iwnq' ] bc1$.,SNd(35Vff??~2ԌXS3%rI)*QWOk3-Tڵ=zpl3O)5֭U^O,,8PQҊ45jx{{ҥK gСߟ5jd )ϙ>h9wPE?0`cߍ:ae,tGQ'jӎݻՂQHtDt 6" ΑFQ %zl7' MsI Ku,sժjuWFCӪMiZ)_ȭ[՟-z|{chP70x0ћo0];zXHiMps9sA)|㒒ĉI;5Y36LVݬl~=>(uo7p8z˓z.10+%v~RS! !K-MoeNj*T@tJTئ2g㏿*K4[ BC!BzS>R@\p(1%^r,/CBmr ͛GPPW\ٓSzlI!(' Ϝ9?åKHHH,Ҳeˊm~~~DGG3n8"""hҤ 7nk׮adwѫWlۙ:ujui9 h߾=K.e̞=;f̘Arr2lx.LGs,I,GUedIm%n&p!2^ j8µe Z5~ UsmO%Ig$]D801x04H}{{{MN[0cqmN2 IDAT"Vc޼y$$$%*TwhB!#:Ɛ!CXbE-I"ͯY~j-Bȹshڴ) 4qu `ҥsQ4hLj'ǩ1cf2o^ރ vU:9A?0 4,^qΝjpuj| aZu8t 7sgF<z|ϫWLKlz2aU+UHO(x{w'88{*-?W!GQBt,0asԔ>}ЬY3rHє{nk[PJ&~Hzz:+RB∍EQYlo͗' [!`zCJo5̆b{d4XE niۄۧ6رCmtܹI@Q{{3%88[xDgf`F<ٓnnP9sSO* W/a5j5sjGO>)~( /{-rlp˄DŽ&â rD)&%`0qtfCtS>.^$>^]^>-nPkSY{ g1t ky:1 uyݱ6% )jqt¢~{Ra3]˞ fY.Eihty>OǫGCk~84kжmSW@fW&h1MBbqwldDG'B!DIYFDFF\EE:mݺ.70!r!L֭[I>>>L2*,ǩ`||Vp7-.ǃʭ6H%._^KJZ*QpoNҐZZ)մzquU ˌ 1I~2rYUY 0]AQ3#3K$aA.7M\xe}.`}ʑԉQpq`O2PC]Ejڡ[z n]G.Z-.-oZYP"7Ws Pdh AFkh8 C*sy>D'W֒BOgB7nLhh.67E:mڤ>ܸժo`B!$99pݻNNNy6>){jXU!Xxt> .]T+?^SoPZ4j0ycuetɚ)S£aC:z|88C}kmNN39 DyPŔ+MLXc`~ ~X qDaXLAC zjw}SMQ:0rOՖĆh qwMRC 6Ұܜ͡ptt,&5U[?~&۷=j"u>{|Qt,,8I !J>ժU'BQjѤI}Qb:I# 9iLr7y۾ l|]Q${4rsd']\(NN{w ../лwr-eJQCg16VezzMG]^}rJkڪ!ָ\Kpj W<{(Z|P,S3*G=zԳhpl;RGGLmm1Qё:a#J믉Z6KQ!BM:Kߟ)SpqhXJ,ȣBKKKcϞ=FڵR}ܭs7@l¼ڪBaaO&Qo71ڵC|9qqNLgI=ԋ{RZ<+FGW lٿDGcY`Z{C6ch-! \߅-B2EgxƏOǎ֭;vn,BRG^:7oҴiS:vHϞ=qrrbʔ)zl32 jYԩ{^hq@l%55Vۃ-(%ssxEc[T J vC^s2Ѥxzzxu@Bqt /B ,9xptfz 7``woҡ"B^!>% ǏR XYY~~D*$Y(FDDٖر |Mlҥ 5j>(FaBkd6mpđMo*8!3y eHh4o __.\ǃ Yd> ,J?$((;;;z-iذBYp՘~֭ݔ-%Y(zj8Qw^:tm,AT֮J:H4^֬9?z1!t?'00SNyߟ}RbE}(9Q ЬY3uyh4)?hRQ L!D888LTTTVҰAY&M|2 7ߊtҳC;IRJ %00+W\rt S޽{7s%44/^{YbEx{{gMK$SƐjw}h64SP}N<BDPPl޼4gԨQ#zyyNHHHI/666ԩSk׮=q$tYvںt%BQꅆr}!9ҫW/ӧ m۶ڵ*qqq\r%Dgq+p_QL7qRV: D٧d5Yۣ( Nz"Grrrj*FM`` ,^___N>899G}Uƍfn9ld& 32wB! Ύ$fϞ͉'Xr%K!3nkF(oߞƍW_dK`ffFݺuCĢ4jj''#xv,YؤIBBB~oӦ ?ϧuY ?pׯmϟ?Çg 9s&7nc֬YO߼ys7ov RJ(0,BRɉ%KꫯaXv-NZ!ժU+|/"M6m۶zJv:>ǃ ! Jgݐ;vH||<O>۳f4h@~СCVoСnjj*txdؿb ;;;^uΜ9S=ABQԫW`|||8s ^^^lٲEa !xܹ ; !aea~HKK#55˳a8<ϟW02?>vܹCFF*VJdddmժ+...ܾ}3g /p l$Y(R ذa&L`ܹt҅>ѣG;4!Bӳڅw@)_xY}x,YXZ5&MmgϞ%88˗/cffF˖-Zjuccc-ZĢEtB!BEJ% D$#2qc&BPBRŋQ^=N8x^ccHO8tH',T\kk<~<|Y8$=ZYha8B!5j7oζ޽{tggg7oNժUYlBdaIztBQѩS'lll000I!D1/Ͷ|ررFCʕILLwztjA^!>I$ B@RR/"CBQBBBP͛7Z+̙3DFFh"Z- ,cB!uD CBQo6/_o B!ݍ7hԨQev8;;0d&OBTT !B!4-ۻw/;vZhSo.B<_$Y/RY(B!llltRe[nm۶ٖ'''cd$rBu쓣HeB\/ :4͛7Ӻu|_˧tEfBRe˖]@ ; ՕUf( ԨQCъJצs& a1a\@db$ $&bd`D9r7)Oը^:.6.ԷCB<'$Y/,B^{-[f^Z_BQ=u1p@&L5x۽{7IIIxxx#R4.\`{_ XXR|5ʛĒ %bSb$ 48[;ʡZӾN{Tχ:!GbjBRXI%!xniӆ &MĹsV#GjnSNSPrZ2?WNѾN{&0Vh`[s}ŋBbeeEŊlYUxG\vaƞMFЫabIT0@=Xm ?.]ZU~8 mЖ'0J) !?RYX@VYйs%B< B!J3]4deո \;헶ȏ:|5q?]B-hK+}>U->}ŤBwd’ַ/\)B!YRSSY|97oŋ$$$Txb F'_PYV^^(gT^ {Q9zoZ ϵ[I/ !I4oo5Y(ZB!;wh߾='Ow(eZIf0aK&}7T4XA&6pשu]̂26ˤ&Q϶v-_u($YX5wB!BR?ɓԮ]O>OOO*TD7/6|A]ɔJ|cFzdiR+״SN*-qKZ굜nB!BׯĄ]v;Jڵ󼔴ݻwӭ[7Wk׮}bTď IDATSRzuy饗8}tYRs'v_}fR(|#FA8 ^Y͸|ˆM#x[ !JĨ$ B!@LL M6Aߡ*)) 777'csoa8q:uбcGMKǟ:rY߆C*S#SFxȋ|ҧt':2c ҒdB!BQݺuwȓӧO{Oܦ( ,`t GGG/^Lzz:+W,u]ܗ@ǟ:rENjuC2766s .wMhm]ʋ, ’&NOOtIߑ!B]xw8<w(r%nݺE /~=FV|ҵ_R1a^yy ^սW?Z/kMȍ}&#I$ E>CHB!.=={믳m6}S`e[^jլJb)°Vfvt#=rvdjvIRZ-`AP QI7&5٢RRk#kB!x&uEQu:uޞub۷`[ӏܖ+44<.ekQTm9a^_xiCP !JJ Ciz}:8:7!BQvڕ7orM=ESpX[[g-KkR0'{?fl7w8%ax|FlXe=HP_RWfe~B!Q**N:ٱm66l@ZZ{eƌzn'ަ޴rhŬN5n3m0CR/ycVYT0:$’VKNVB!Ѝv;JLL$,,,/rQlllppp?O?~ԭ[YfallL߾}K,Fj2&-#z٫!CB&&DЙ ,W^9&uB48)))IB!B/!!!FaԨQ3eƍ{ǀhܸ1/^d˖-XXX9Yth[/n?S|5}wFFəвFKV׮\Є:L' [ԩ͛7g޽{)󎏢\[)JAE#y##TFJG H/BBi66;ےMٔ̾33p<ϸqh׮Z?%R"@ 5{3uTpOj 4łbl6۞1o6IIIz"""l)Ey8fms>ǰgjB:X3a &dIμ0[̶1#T}X|r^z%>#>|8#G$!!x^Oǎiٍ֬"A^Y(@P}og,\~a̜9sڵ+[nQda4 iĜ{:J] gg 37Ϥ8za rڊsg񄅅1{l:vȂ ܎[裏0a7.0,% ٯI@ ֤2h 9€С˸)S Ik֬A5o~|?{ju8:ur읺 ,@TZBQX(wb@ A'99̙#֮]KllønP80}ʊaC1J7> wΔS~h6oݟ烽Yuvߍ;uhTK!-- Lf7mڔEeEq PPz<^? @ n6l~{Ŏh4oED ?K}&~pcwT AHGѴ;Ҵ̸}}ЀP_'JIMCvGy!h4n^n\.1?&)miB,@ $&&ҩS'J`j'RN".MC:*K&;|.{G%JKt6jN"LNNy=t’Y-@mgٕ4w65J@ 9˗/ӰaQfǗT^$oѥQ^ N`?y 6LcL=O}JO xA۷/۷owXA},˗a^_G32腰,@P[!&&qv"55;JUCZn]|.l`|63us5۳ɭ|;[V[MXw~^P-B3g`V\I||s&XnAQmBӧ3}tEDD8,mRagaB"@ h4.]J7o?ٳgrYfٖh4ol?;N׺ߍ :h47k3`Z-!W\ T(Z,(wMXX25Y$x-[*#/\A @ n|̜9pN>Mvv6tޝQFKFNDLF YPjk5qXǘt~3}A* +a.-VPSz0e %Bh/-Ҹqc&O0$býpլ׍ uy  dY&ס 5,h;֯|?/v9#?7nb3pp2VoA.лwC+_L&8v b)S=U`>RoZq,X> :@ |rV.D$IýrO{ۢC Ӽm^:#ݘ︥-M WgaٟKR "+*{AϞ7,zql~vX}#Yg+XX'ͥx$4jT]IldHs>x @ ĴmmWI 3bq<8[P*BCޏ}OۿfΠwuxAB!W4U_E|V|L?ލW2^+v 9trkB~Z\*LJzI*>w8sFniSwXiIMݸ&!Ae&,,֭[ b }#9Kq$I^Ilb*)+ClN@-S̙S*1K NDg\כ\kޠxJóVخ*lWecfr=@ TJ]{h4^ubccʕ+dggoFa0,'RN=n;啓*.ͣ2{95auø{v"JD!W4/J.e?oS]ToM/B%|,K˯ТOZ7(40PYʓw ( <aš\`!||,[G}m={裏ҵkW ʍ7~}kZnC]U/ڵ2UQwj؉vΧ>eRI5B|pV4 sY}Y._]BNk!ۨbay^9c8: ٳ"Iy*MLL*4TY0]b:@P&[ jƏOXX~mEVgR,~Zᛩ*h4q8OCJTZeO.WYX`,`驥~n.t7Cb}+mb KeidM?>}m`j=4qNC.(~IJCT(VHt~FrͼGVԍ@PDGGq7ԩS781YL<_rCi޼z6n{4Մ-erLs:7/zWz r)baEcga>iLc䝲Xxi2$n+I7Y?o 7)Og\q.K,To/?cJJ <=Zbl=Wj0:vPLh""` ﶩ]qV"d 늰:M A^zDFFEb"22uV`tda6f| S'Xtی]Baqfy2^_&TD𑳰T0;m f28k$ٛ:F,rq 1>rtY9VFf|~C-lwjhi1Yj:ʂtk*[~O\ɨJ)?WҏW]<@ İaL8crrrx),,dذaaՠ8_֋[Ɉ^j( fٜ|$-kdؒa(M?iQ\˃XnNɢvC~=xy.,,,[%\Rouu]W('RNSP)+WmEB@ ,gϦAlڴ3m4ϟ/6m۷gƍ4hЀ{!W9]Mow:A9ҵqW"&G_]{`=KK  !˗$RS*̲CV3dddw1c &Ǒ3ȠO>޽m:JLWE 4 OQ3k2/o}>+~W"T#XX($سwTԩػZ$K: PYEr GFmz֭ÝwaapV,t:_~=U zEZP'.o<3Ν6/SzR9Jܑ#{{]Ժ2#^kfA.l{2]ǎeP՚bbb={6lݺdF@PNtڕ#GuV3f ˜1cxٺu+G[nʱ24hxcEpT#N`4V?ƕ+M r'>y'dVݺn a`ۘmdmmۯ"^M 藁?)..W N]֛=z- 4M1ieADQї´4YdVVȅj=0]3n!7Pwt 4,؅ڍXMjN%[Ua XH<$YHCFe,ba^bz,6 nX>Ü}sq$/1w]s1oÇCn!Vkԩmaaa|r-бcGF'B0tPPO,fL14 )ߧ*E};u/WB:ƀ7o,xpV4V^]Y9΅.Y}WOIE^ "bҚ_3T,Tq&%:/f\ON%89 5}58РqFɠUWK]?ů{7-`{`㶳3~쾳d<57L7baZ׿e8psڊHҢ s9xSep̜)3+Y`,=[;po~Ɉ!".혯ƑF)k@ 59zz?PVerD͈[o}~w֝_fAUBUkX^Tʳ.@4t(~\g 0 hmbVos>2(QQTuO9=4vb=J=J +7*>\l6ٗ#S`)ʳ+mbFy5Uj%:Nb7KguvҐ{6i[,,yCU.ڔ"+R3d^=9z⚉-ZQoOp@ADxt8kϯ*gayjg!X}^̛O}.TzaJ|K2y4duloQҐSbq ^݅?@YCSrhB fFج,r2sKRvmcRp0<̟?$<z^*5d'],4Bp'9YԇiRA DV  Ԕ}<\t}7X;b ">޺d&YD Xd&(3 b9xȭf5XT8 6oSf̘l!8, -nE,TΏ,8WKnR!Iv"Q^+6nC gY3E7pY,9,.U &q2l, *X2rJ2des1; 4^v3XI47M1\G%ZՊx'O}dp„ dzuVBCCn/IGIx'֋bX_U j6oM1Hק3dTCMF}7lg:ٻg{I/TX њKR]\Ɂu%4w|^-f,Jz-f!BCl]5 B^?%`N-6mSUF#f,: XeS*bqόF o']BeŋiK_|yi%$;9XsbY2__z%w@x]sJq;wtY u wZm{庍b[PB[RbCo PbM1baQdgBOᕯ[ IDAT,9ĶbǻqXX }GPPF۩_;#Vuxh§1-\NѤOT.uxNjļ3<ûޥӗ-A AuH^; %ԩ{Asz?'A]K>BYJJo0 9 Vi(FɹrJ;ȢE!.϶.B4du '\lY6Th[M.77_24GnYh)dv(2Ӑ͒ŝs+\WrX:yy8SWfۗ\ܓ>;BVa$jk:hSpsf\=S]ב^o'f97|rJ)u~EGٳ6X+/h,t`W$%ug˜ZGr9תϙ2Q}\oo|KGфls)￵kKدnzyes J*Ϲ^+WDߤ$.f\tn4,$HMSՎRF~o9ݜ*|XXHHH`Æ $&&һwoZhA-hٲ%ux@ hҤѰaCN! =X(( :x1j(Slwg}{kmi%ڴXtM*6{ Uܵˉq,p,Wr8\z~Z 2~}nt{-‚h ͡ޥ,T\ AV5mbX0X,l63p@_'4oޜf͚1vXΝ;WFOӬvri[]~<ۃj }0-VNb9{a,>C WEvZ\(,$MCⰪ{—dVY{E8d6s`? H`Zd4PJp<3W^Yp|LOHGDih!;1= `!nq+VG54(F?:>_5~̖* Bp0*qЦ:2t  MVE7+U?8e=W^\nM4PO/wd rXvH H!m4+pJcKŵ{.1o\~ʼnSM)Sl@ eܹ+W0`K!?.!RF0(N<{%cpin^p3yᆿ@Pݩbi׮z[|ի֭AAAtޝuNBz)1`,ntO t!3g%%'CRT#A1Wd]bb6yMO#v''O&?@`v~kƕ$ &se'U,X܋jA[Tb  ,ӐVýݱ]Ҵm  9 McfAkt,Ӗfg?N[E,rmXI=p@iNBo'/\FM/Y:/liO/'-Z Qѿ 8{dڴb_oݤB[TE=n/(5++,{3.SEIC~#F@x=8pɒ?@ ɰa=z4;wf_`~kmjDž?Л>PO͏ss,]uW>놖AUJ˗/祗^⣏>"**Ç3rHY9p=3f… L>Faȑyo<6](rM=zȩpgU^gWџ=UP6F[ЪRJ:ru\1tDJދY]R^׺04V%jM^[ < :, fG9Fw)QQ^wvZmoR58Ql_uシ(izNܒ$Qd.BH8 +Yݾ$P; ]42ba:lj>rӷ9z^ {muJf3dfr܃ŏ@` 1-NlbXltmn; *ySBO~q1l0:uİaظq#IIIYUW%j-`)rhAAI)lfcMě{p.DPc6C^dUx:>՝a"wxO_X(}Z`H" Ncba0Vhכu0/7Q f||ɔ8ImgqmP[kOy+^PB#|yx -: v6zhpb&g"hPT7 4t LjwγrΝXȕPv%)w=팥ML?v PB@ cŊ$''c4dÆ իpatBA @̋10Υo? fcr)T$UN,lԨ:ELn"T; 4lؐvڕ{A޿;Yf;QR\&;jbn";.] 170OeY8]$04WfirÆȫ:n5M,D#0= N\Z3YwhNjE.c[5ڧ',; VNNݽ`I ۇOl:u`Ѳ/2[@ ^ Fz`4hJ _8\ʻw}צ~fkfy>_ZYUDLE.ϔhݰXJ[i, 'S\dg[qfyr68~,)E\mCHNF2:^;S7" } U\{<Ex8O>NׯGkL[<rx \Vu3SU4(zd_*ggicg"@ j6.jU!g g?˪GVoeq›Y|b&Aeʉۗ۷;nׯ;vpwzOvv6.]*ή"*Ǯ> *ٍz"_&y9f3 Nm( sMb*<\=׊./Vslb@|͈7ٗvvub Sd1͛-V$D1TiMrFbO PУև[CpS0t;(O6Yz]}d!  NF!q020X(  $Q% C#I |G?b}y {0M,T- l=Ǡx kkl<8vB71I,ܛ< 9,owl|Oh)AXV exh٭5!ʑ;s;4aLNwꢹ]l5s{l~m?6'IՂ\E6uhG3 @ ;CVu(Nc\q!vNIzm~ޖٻgVrb!̙3Y`+W$>>7|{9&M믿n 6`.]_Mxx87??7|Gȁ3f 4`رs.&dw~i%OCV:*j$O60΍qj`,fq l;EE%,P]e8Ys8kϫлP+W,b+GEzQk% 5 vZIFlu:݈{yCksNvtYl:1^~oߧ 1-;qCph`UvUJ<jyuȥ6vnE@ Ⱥy4: Dpwۻνp1ޞhYk RK@KX8~x>Sf͚E.]ؼy3 i_/SN̟?˗sm8t#FM63-Zgjժ6ҒʄU0~wi%ȺV%,`mgmk&4ek@ bP,hǠc_nh'8nMFkь=1Q4u֬isa{EC ZWwv-z0:ʤf-I}r4 Nw<1,=|ru70مRmɵ7Y!_>tDl`j[W?H,W %`:R :m}CB'YٺN+\c^ {I#u+5+$g8em#Ir}99l,@f/A:6sL?Mj5>NdW7%@!ApBq}S~q@ T6lw$iCԄneQH#^g˱HƯOwII,ybaUC]T J1CS@|95,{Ż*&/_KrWM=M,<ltT)Ɵq"OݎʲEC9fdž"&/߅SgvhZ(ъ 9īspY"BlF؝mjUk $8O0 IDAT9Rmwgܒ,wrirUY\OKW_:k}:EtޫOSg~ju8d[,8w4AhrcU؛=c͎BbN׬su GΆn\]c {銽q3첝ps*o.AfvP-piYa\E km,jgavkWl@ ʦM0R -:wϞ){8IFw?ͼ6]>1{(q%TB, uv) Y*T5kCzNY~lĀː(xD68/Xc8Fkg_@]7KF[:?c#g郞hC=ePwvIC]tZ9T4,[LT/+w3 Fa"upٜWc['GbpP(<pOP?  d|ctBpfa&|syA",[NmI XsOK:~'ǀl q.8 :r}DZWX7˃Wh~wXo(wmNc1|.~ZYv@ AuCoԳ.סݐMof Iz)/G~Ilf,-v㝝p)뒯CPX·wB\ +$Ln): ☴c\tY 96DN3TWzGZ!%#d9`LCY Vx4b2ݥ)%vym)'܎@ n캴BS!#:u(AXMij'8C 8OBq/2 ׎/|fF, j`re¬PkI59nSWGRHtJgZ5uաV.lubB[ϝmp:ўpUpF|LUio/!weT|et|kMJw_,Z?UuJ'tUOȩB,d|9'f6j܈Fag#-`kzܽ#V `ɇɆ>azgrJ\׎57յ$C bzz^<4!¤Hۈn@ j"b6V7.:jAB{qGZШэ&hv>ήǩXG=¤^+.8XXAH*/s'ۺjه!,.{pT#{`ҙܒw-e],nn(z?%ӽZIUXk*j,E ':z\ܓvn|p[k\?eiːN\?ʼnCrߺLkdUx>pO?ӡ7ޥ<\$;FGgsHV9rZynSB~%WQg^e{i#B'UՀyzE+cҐE7d@ 5M1qY\ҍ</!hBByS<)b2b|g?=mabωi|;٪t wJ cgn^t.7 5yӝӾ2u[~7&Q%;ߍXɡW,>Ueh1 T(_Nq/nYtsr=tb14Bdf#'Y-t_/Уw =_P AM#.3(Ft!Vu(:6IJ 0GcAz-{bŒ'D8 + B53&$ Tζ۝ $8 :{'hzvI>Y,t p],PF}{I']5!d{0:Ǐ4gzT݅Avkጒzuť-rm-CAk :5,Q1w݃KCikzs;(.irMLwP@ "l?C u(UtboɁo\<h5Z6rle1{l}nHGh_TaXXA,_nn(Y(Y$Q`uz3V+#Ugވ&?;ڹHY,JobaiDݡ)'En; yJuG`)+b){۷RR, }ws{Ki`4-`? (.=Fs}e߇Y ^m@ "b6ѿu]xYJ7>*ʳX(CȘcy |+Ϯ]WӬc塮ѭq7/(" 0Ub S>\rPOq-q]fA**FfMtS -Dޤ!ùNaYЫ0bWiȥRj\8Ÿs׷}qݒaV}~K)@P1YLDGpO{|@SjbB /_e+ܨ3sϡǂt/o}=`!V9tҐ>m{FFވDȖ=Ÿ;<XxgRL1T&ù 0C-dWkRQFӪwӲbeƛU',b@ 0P_"TBBy#:W|?'ඃ/ \<4ɵOۙԗ5#ظ;g!@KKfZ\#6t?PKrrlcbߖ N'̿m?}q^ U,,]#sgaYkK @ T"#_ZPJI_tߌ8A:өylc41~ݳ9tTR! 4gBV7zOu)P~\qipRSYBھoE Pכ-[Ӑ+|w@ v`@;ߢ$[@\ʉVVwސ8 QiҘ}ĭJO2qD~<#/:d N*J0ǩ Rμ(IKqTf0 iAihq_,}}WggaiQ] `0syC$bZiL; lv7$$njpC aH! j;&:lA! BqB$5*p] h_N ozLbaIifBee }%Rb/Ӑv Ψ?w/ȝĝ]@ ՑÉ)00`:х7_{ۗ{r\vǪUб㍍K=n{7wCf ".mqۈ`Etk܍6f -jq + M霅Ķ]mZM\CGZ< ܊%%(mw׊WˆJ7>VcJbVF#Bl_GqpN⡃@ AfG֥O>Ɠ)?JCaፉEP>4nnm9캴;GЮ^; ;[Iָ:m !Vjw7b1G[bsa~೻ Lx?u\7[\/1;:{VSj-h_~n -u`XcZU yB,@P-Am aGh4eV*`0ҲNK&ĞHKa콼} XvzfL:huw[.R(I1z]/q'ԑ: .9R497فnWȵ%uty8~–FBòo[,)mٹYs-K5_^X [Vii؊W8; e @ Tqz$`p%:ut)S|hڌ=̼8a_&br A~A,:ѿ'Mi;-W磽=vwaQg}aSDEPAPMs%J-V4_iZYj/ ޿?3030 3Cz ,Ϲ09<9UXn*ScG?m 4;  zzI'j[Qjր̮]u >流q~>{ȸm5йcr71#ے8݁:ܑ.lay?ª7w1{" }:<|H LEj`*pYs캸 {.{bD{G#Z(U ~pN9unGݳMƜ[abK_fT\E\\T+ ~+ 2sC mC .9^|pPBq`j0f8h`DFͱ e|S,2"g \=c,L3wIp R/MhGMWc1: nnhڡ:zQ@QUmRRo5_<~ a@2q.þ+>|3ܺ'vqU";^hGG5C/C{ǁa%\EZe6C=]~Zknc{I˃z`0Z~]o1綃MnWVfxSn&7RJJy$,ʿiӽ /'z.m8LKפP}輦.nBh7Ԟq{0 1=L_ c6I+?#@bpqcCw!) A{5 /gΘsfe#A3fr> 6?7&@ X5h^N|*6em³k˭CrxǑ~()us;n@r@֡B`gڽVW/ru^bZWɡ*c.3˲:]j.VXnWBorc ],+Z5Ɨ+oouX4ȴ)T LF8]M3_^s/LVMR۹+ו5ħ.k( zR1X.Fj*z 8m,)1c5dRvY;VK?fS5 s# ))S%8俑[; -\˂V7՟5ׄcԟVfjŐyKӮ#zv{ڽ9CgLZ\w&W&Fq{ıKm*wZQW[T Z3^vm%6M*/{n +j7ԞE0[ 󥺁d(s`/E8ͮ)ޕ ǡ?T^k5uulr?~={X3pI~I#PHkqmc1ؿw& X/gk*0\,r? ;yl5ߑ+fh=cR'B?F&_GL[#,2dՂ8b2s 8`.m[V-}Ik]Ge [r6c(b|G=uM~W4cE_co]BeaO-bxu){pEXumYp֝?~TfP&)ſ+0xe'PY}OmmEP"K=^9oMuyljBphw?gd Qz{]\VšacF h? cB Q'(-Yz ڷ}OBZ/L?OD|?N:*_imkX 1J+/ uo߳(-Gez*JepO ~Eom }y 9PF)&'xBBA#v'@_,Dq 48Tqz1^䜑ujUix W^( @X Z֖HĂi7 O7E^#VzAek vPTy;nuoc$C+vkY_,k{hߕ7 m_J7uYx>A3]>rU?#&w6J~xc1`5چfN ^A7Rmu`ߏ ߶nNzԽ^;8ZuOh8Ѧ-=u+T8^]PwwY:U.!J׈=J*;bze 5X QX'ۤ5.w؀Nfn0+0M>@'<*#vc(~UڻVĞgd0]T{GiY K#]@WfZr|O(z>31dokYssZcbaނp}.v^p97)zUmԫ'[>r eE|'Q↓U&n@e z5aOXQԎXp C w!A*Ij u4cr9P_9WN4]+$V0c4i\@c1<mC3_c*̙ "..۶mv N!pwGΉ:>i?@*-;,S5b 8,rbUVUk;;¦XKtH$`v=Q wtRmE heœ.Q%9.#HŒ_zp@w>@!lj bvţpk+AѶU*ś}\U lqGY96_d|o+\;_iUW,~;eT"yP?B x= P q'kz-AT)))cb) Z8.ݐsw;&n 4Y?nXeɒ%x1sL?~]tA׮]qn;)Fi)H0O$- ?E6.bX8NysLW !ȧ Ơ{XؔVV=9'lU,D&nտysઃxÄf H(đ*pUt :C=B%G %S:A}݌BkF/q$|ڗɮs`4,̝-w )ÒF 2l@gX`Bxa Cj帣D^pck/^7{s-[esX@+)q*Q&7؇َE[(X>S<0@rƌXv-ΝvCrd;(܅{#W>p@(X\~ iiV@!|"iQW01H\^٥`3 LX,$ݥe{B(ў x㊣θnUN:ecұn^*EaUy۪[xP"bϱb˹M n,:ƞc L󧐕jEKknh-B }1=> F\w4<x d+ D5·*/W[^d'D8 {[y")lE Z/ ^rېnȽ,!~]PbLHo &h Ң]Me㒭#ob: ^ ]v^?8Ww@Sw_ܩe/qup^ &=ؖX|mcR%}b/{-?t S?o/BY 5uQ6:el3c5S20z8 f=z/^8([Fčo^M?댼D\pb/,>C 8Ns0 bGnpURl `+(kG\*/efg7a(D w7 ؿug?>9_ߚd1ϜSbp26ct8]~(׼܃j,3fy\,P\\}aԩ:;v;vwm=PUtJN)Őv@Sg8}+W}Oss`?ዟ‼hwpGh9eJ,a<c Ѿ˵\6rA2N8/&]^pE{GcX$Ej=V/>}W][k4\,>䋓6f&ߐ$qٷ:\ -pYM{#X^(r9 vBXX Wu@A@V@Y#nwEl@w4M k| 08 D k:?҆ ebd!Bi,Lh9C̮l u0/rP:Fk\`@wEO!^f }GxX/4sRSqabݍԋ}XxrrٵϢ{x2 L `b͊+X{ F!&ʄ<1[ ҽw{{u5!qv OwǨQƌlln'oG$:, xvD؋!/ S 4t El,pU<ݯo,l(zO^T&p()E 7{U5Aݍ'OwaowGS aB{xno Fqq1Kxzz"..c133Xx6((:g.TBcG0m{jSU}wחӧ9s;V=:u DEռ\,2T*޸r}߼6p A@Ir"7[pOVO7T>j;*gW|O#@W*"(ȕQ  +n ?0;|yd"MO~ck lV"8*@֭́+OH_|)%(,] ot4 XiX'R)G~iME-ED)x=hC5#I汯/9o!%f^-8\yD [:<bRXLsNJpQ@J|Y7(صK[Νww|t#v$( ^vb}(`HHjoCC1K”D : "H%RU\>6-i5qR#7^t2{Gĉnn_gC?m$JgC`vlケx8Xx'2jTE0.2ж-Ц d̙ʯnvN(CbaShUh>5 ݛvG}x-&8Xz+aӈoM0Fb! `oo>c1cÇ5ӽ$ +S>#Ho2MT>V~xW;`pӦLĊ 6+كi(73 1vSFrRL+VA;y.iUhP =gOkW1h[ @T?i汗*qW_w6q'¨NX5 |xv ,!2ػ!FĀDqe(fQѣįQxx.>Q`ajj9hVѦIS6rr|ɪw67qrBnNp'Vo4OJq4illt"qXA?3Fr5Mcǎ>oĎo_jǵb M16R%7D*B"pW^HV*ZULwwDN酒{7f6Cp.9jC[EQiKwvteTy1 *jܮ""N '5_.O]EU/ ΋B]/PDz~K+Vkeһwo$j}/_a…:|qA1Ƙ5|Oq}65LCM 5.s=ݻk^~yyN];&lS_+αj#~~捉'Uh$$$ )) |R.66]vŌ3-f:o5AA8Y=irwW ͽ{PJqł:wl6ХIkbv.Cf#,֧{׸hV),3͚5Oc#!V1Zx1)JZd eggoAtܹzNoXA_Ug~Hn::u9|}})//Ọ>JmڴLȠxٳf~nn.y{{ѣ̙3}'cիOt:|0ۗT*6ǎK!!!NGݻStt4Qii)hтzAǎ۷SHHM0Aƙ3gΎ|M_~`\WSvv64i-^|||jnmyksa8GCʭDD\,4֭[K/3-::^ul Vyy9T*5ӊˋ͛GDDG!Ae222H:q͙3T*h5k׭[HڰaIT.ӪU4\~d2[֮]Kr\`ʕT*5b&MXm hR\DDW_5iӦqFJMM|XZ+SRtty|okԥKhĉJD}w֍ƍ3m4d"jXY)U,j&ucRERSޱcI5KuI$xz7- 3/sڶ=`۷δ>}nc$tQgzǎcĐW ɐ!==,777e!J5t.]Bvvvq{EII :tY-[DzzfQQQpww,"MtۡCٳeeeXt)󑚚 bzУGtA.I֌ɓJc=n֪UЪU+ǬY4-¨QXuի6l؀'O233gϞ j1jy!jcɒ"K)XCcI5K)))APLW(VN9sU]޹sbɁ pqqX 6l&Mf͚͜qcڵ E.]ၨ(O?VXK.e9rݺu3U,yCm1Gmsh(Uf2T*޸rEbPo\7_Nu˨\/"Yڦ4\z`\<(J=?34ib՘`|A3Zm_aҥ(,,Drr2._l֙3g駟"22[no)S`ܹ:Y}+WDnn.FYZ1cGXXr9bccc:YVCS eIrU,\d)5kc,b)ƻヒ.];w>as檺mXɓ1dxxxX,3gB.c„ ۰D׮]C~~>y۶mÈ#0|p} ]t9sжm[mG\ۭ\1\q6Ǜ+[դ5/5 PS -k?~<>\ox }P ǁPPP˗c?1qD矐ԶG}ֹsgaaaXjBBB`qU3{x͚51|7Z}| ufVs>SX|9"""~<ȑ#mג5 _rU||btESLH u;TSSaɒ%:t(!AY3̙j۶KJJ0h ,޽{c߾}:~(//_Y;v`ڵE'"##ׯG@@lق]tUW}~bc7[YhVѫ._|>>>X˗/k&2UW? u„ Xz56oެsBJ*<T*5 ^ZHL:III3g|||޽{quB&A&a֭!˭rlϟ{:4wqFcTCd,wY\eI5&k],cir%ՔS,)44vBNNsN#$$00gKۆJJJ0p@={6lcP/ڵkhԨ;;;/2z_xxx@*qܾ}sYЩS'gGl>ޮ)<戡.抣!VIDATf%ѪU+lܸQg͛M|Rtb())m41$&&ƍ8xfLܼySgm۶ȚMƍrJlڴIoVZA&aӦMi9998t687nlSPUVeP/A"X5N:СCDff&222C"##R>|V}o%%%ĉ:N<}߫}F5Ӭ:͓H$(..n0Y^CS Mu˚ԹʒjMM,cir%)%%%V\]][naݻba˜.m'&&-i&$%%i`8y$6nWWWĠ^~8x緯/&Mu֙=刏9(--Eyy}}nYɜ51\9\q4j{<,YB?SVVM2R.il}g~6fΜI~z:u5(??_F׮])!!233)##ZnMz%JEO=>}֭[G駟iܸqB[l˗/k~ u t:z(uޝbbb(22zIǎ;vPHH=6ޞz-:{f/_`\SNt:<=zONR6nhi߾= V_om߾Ο?O}U[Dr9}'M˖-#GGG;Z+6kѨQ#wò{lȐ!H6loF*J]k3f=S)Y)jUT57YBML;R]Srlذ֯_OΝm۶Qbb"%&&Riicac\USÆ ۱cd23g={\.ݻwQII Ջ(33S'[$CL+9Xb) ܹs4|d~zƑD111c:w-ZjuZ۸56>>>ꫯےۭ1%)戣.9q4J$^lΜ9H 7oL $H49R̴iLJJ%Çuڸu :ɉ F:hLUcQ,\PLQQM0ΎzE.\iܹsԣG#www8q^ݲe ƒB`7oѸFA$JёRRRh͚5VɘFl'JER\\\G[jWHHf[Z[$dh؝;whܸqϏ^~e***jY)LefJr5UM`J.S%Tc,Ԝb /@JC&L;wX<f~Uյ-[F$)""VXe0H$ڲeEb0ĔbX`\.f͚?qe yL> `ԩ1c.2,*==жm[ʹ;vMc1V;Gv1c!3,*== ZL۾};\\\ЬY3+Fc1c1.Zvv6ƌ`( ( k׮u-//?!C 44Jvvvh֬^{5ܸq6߻w/u'''(Jov,aѣ?ٳg!H"'|f͚A. ÇO֭[^z[?F3gԩ=meee\áCp3Ƙ⫯BZZ!ɠRлwo,[zB޽ [[[aҥtfΜN:2 HMMŢEn NԃgggFǎaoo{{{`͵>}:Zl {{{HRxzz]v:u*JKKֹ{.fΜ8899Q\\lp;D/QQQP*puuEqI|wH$9r:/# 2 O4^rO?4T* Zh Vk'5,XQQQpssÀzp}WꟆzS佪_|Zh\OOO7wwEhh(r9믣ڸ.\Ç OPVVft+Vm۶tɘ5k੧BDDT*g}t7b!E$999Q\\%$$P@@ @111:˟?A LFHdggG PPP]zUo;۷'A#RInnnԦMRT$RFF-\$ T*jӦ nVV @4zhxz4nܘ$ egg͛8q" @ Ppp0%$$htvv;vz?۫c547oޤ$TPP%$$PHH6~HL[ƍkXhv}]MnmRӦM57`| D"ћOI*Nd_JJJM6$rjٲ%%&&RӦMƆ$ s AHTRLL őB A(99 5j( x%WWW?~< @-IIIT\\L;w&AyC666$=zN:AcǒIRpM<=;sL2~~~OP(&A(--Mo=@JHHxrvv&AÃ9r;:b!{hʘ1cHgٳgi…:rssiٲe3ݻ4i$',D'2^y*))!"dk$iӆ>ӬO)))$k:mL&#\NK,̻q=#v2V,/I ={hӬYH {ܟƤRZZQFHjժf/ @ i(cY[>}4'#w֙w93Mĉ:F}bGeee:رCsXĉK Ж-[WW,TfΜ9)--gyFle˖ir̵ktݺuk{fZyy9mۖAѣG۷5]F:u"AW_ikҥ$ѪU4o޼I]t!\^mP&QTT={V3~#DB2SNtuٳgk xU_I|B󈋋/2z2ؿs=WWWWڴifӧۛATjԨeffjڵlmmIBX!qnݺ\\\H/t۷o7g|4hd2~n޼3T[܈Y CK]P3.BCC^B}ؾ}{uΝ;izlB Ptttur|Mn޼I$m޼Yg]TTD*d28q>|8 @?]P={N2LII!;;;*..s1fnw?uI?敗?I$ڿql۶AgyFo^M¡C#RInݺeR 3f Ah޼y&-j*yH,0:;;N„}bT*'OۡC\]] >@ץyR;_zlذ`'b!cTUN{ڟ ,[oڅD#G :5*Ry:T`С/Ū*..:_]xV1vxBRT%KjM6_Dݑvڡ]vv q 6LoZ@@\\\ 7?::(z)鮮۷/qlիHNNFhhezغukRVV-[ ** Bܹm۶L&S1f +CHHH5.@Dzcx_}|Ith׮^xj|Ii7!j*ָG68޽{׮]AoLB:}v hҤ(@7?&&Food2dx%K`ԩoеkW$''#-- >>>zcF@v\&778o]ٳyyyرfQRR:ԩMG@nlp3G|2\vZ B0_~6m֮] MLMMEDDGa޼yTv%SdUY]5e< R71D}^[LL aaaɓ'۷o#'' hU y0w\ڜc2f.\,dlݺSN͛1oscS5}Ope/7o酞xqTx/`ɒ%^9s&wY^c:dPMMOłwɺx{oޫzm9RA]TcܹpssÌ3# xU?P#PkӦ `ؼy3~'_)))8v?#`ѢEHJJkTWTϫd /C!C~ܹ;vhN Չ8}4.r^cIY.ݻqi4m^q= | ϟ{⯿²e˰g'RSST 6.={ܙeX}1Gd1p^mγ9p]Cc1gϞmpÇ,d IIΝ CNNV\Yٳ%h8~x=&!77eff6j޼9G}i߾=QVV2!&&F󸰰2 )))ieeeشiScEıٳı ]vuecc֭[cҤIؽ{7 r,X@L]rLhh(A@NN\bp`<c^TTcǎAy <<<SUU9fyy9So\,d RW-͙3 P oћ~m,_ s5 dffb˖-qM$&&jݻ%%%h۶mo1f+W4(Խ R̙3lۮyּyPTTdR;HHHӛ󅞹;O}cF՝cY3m۶/Faa!7n)K./QkV}%?":P02KZhÍ:JwS'V[-V[FH9Ъ͘Lhkw'qqu]c\23_|̙ۧ#0Ɲ=YGXVff3UUUd2)00!0t!?aL UQQai银nݪ>^?UAA$)))i >|Ro[<װpmW` T||3NGGǔ[ =zJK{RSS-eٳgu9K-]]]p$Z?VƎ޽;flIRAAܹciUJJxxx0 M`& dRrr-m?VVV$ҬYtQy jΝIR^^ިmUUUȰ.~4ByiŊ giݺu;&[[[YruuՎ;82GL4dtqqQZZ`ZpsUOOdoo^~~~***Ў#Nㅅaee5es'sOJJ$iӦM QTTyOkZ&kѲe EFFOqqqڳgϨuqLXQYYGONNErwwƍoy: ***RzzVZ.xB}}}Z~^:浧@jÆ eooӧOڵk4n ?N֡du)͞=[^mۦϟ;yL竦F%%%ZfԤamٲEgΜuD U\\,ݻwÇyoTC:r֮]A566M:qlz*22RjllǏ\UWWŋ*-->|+&&Fruu4v#dN'77WPKKjkkU[[k~jN7D>2>ggg+%%Ejkk -_nn***ji]/^z%$$F/_T]]-^$ߛ0immmҥKk,f}Dڿt B&ڷS3RqqGuvv*11Q RPP4d=s-eggQnnnPkk ÐØOD%ҥKlݺK.;L^u5j-;{,*T<,>>>TR'"EpF{YfDGGӴiS{#";×_~ɧ~J&M _֭ʴ-889ȭB H10vXƏ|o7gϞ<LJJqD(Qw'7v،ocعsM1114h _c)DQ."ƍرc=z4N޽;{%***,55yD*U "\|ODb'$$ʣ>Vc8BBBTRlْ`R `|w^8{T:ć~ȑ#f2d={d=z@W\M4SNt҅͛7g߿?nnne/"קW^,XkOf1"RT1gΜa̙4nܘݻ3k,,KMII}\p)SPR%>S:uڵkiӦMG/0 ΝGMf宮nՋѣGo ƍy饗|ѣ+5ǏӺukH(93J*l2|˱X,^իWgfXHKKfa0 #c;֭#44s%4iªUhݺu^ȝR'"EŸF*we̘1ڴi 4H7o@ZZ5tҙ~MuV^:u*KW c H gXzSCy0 @o,,z߿ww<ԫf@09Yz;v>THqODC~;=bҥf$...HKKc„٫ 6"={v!FWFvX Tf~,| .%AUa\fСy:HQ6Ξ=K n*O//$_?< fn7`5P-g-ւhѷ=jfρ@~aÆ?#@fh= %J7߼8b8#G`XXh-bp!jԨffeZ+ݝutM4aժUn^#YHK3n2fš ۷Ct;`nسl OW"ԨիC˖Py1U`޼dI\k~8z(G szW #8$aX =KKKcӦHKKw%?~:kqu-mB:)N>MhDbIMu5@&N ቈP]!$>DDDT^R%̙SQI^Ƶn˵Vhk/\~a&39rsg[*U2y0[+fDxw1j׮Cjj0~u+聫0 .rŅ֭$88Kbqu6|w+W.)..-+C؈bӦDF~/"BZI9'iif"fv~RCoয়VաMx3)S'{͇k}b9dI(}݊`6!fq/3g05//ΩSekh1&&Zjy뭏~ιNA80ЉDD|dDQG]p-)OK6+KؼlEo&Oƍft3vj,[Vz`&Jπn` )SNW]@Z3n^gV F(| z@@@@oQQaYiNT8(ȔCD<}k at39r:uYN89ILDΝpww%mphY:u OOO\\\ M(gus..>tH""yB7^."ŝ qdJ!ƵD `&CXYcv_1535{kcɳgx˖ysB+\\cǎXrXѥˣ|RScvw%裏Vh""Ol2+M@ID qd3Յ :u*͛{߈Ç[n-/f+#'0hA>9OV+?0SF4 P'rBK_UCZv^;z?IM= |~pq4nܸBɵC]{$ خڀHjĉ ND qdjA<[r%O?̥KF+E0i$NXX-gA>1Y񯿆7070Wb,yNCDҾnk*%V+t$:u8￟^zٳ_0u{j} WX>)"r|||߰M qdJ%O6l@nO`u02M>|>z扉fbN p={˜1pٵRkɓxn/VlM$\]Cjqzz9s"jtӧO͕eii݁XVSlvUD$|||<ܖ qTΗuH1 W_a0T?ɾ}|d39r`6hVϜ}{s4|WM6ȑ̛76m,ԬH~uV.\@%~"ʴiӈeg{EDfΜcGx衇H]rmƍ6pŞquȿL.ˣy_LڃBs- jKf<<><:t`رFѸqcINNy,YBHHѯ_?/^|~RRR4hӧOH[mGrRJlǀ$ aڴqlp9 %&Bniif~ٵ]Dr̙3̜9ƍӽ{wf͚uǿϙ3__Le鉋H^۳g{iӦ?~ON˖-Yd < /f͚5ٳwwwzyi.]UTaժU9r5jdVfM>L:u36672uT?enҡCTB2eV?c#=R=J=:t(}geȑӇ~kkp,OT~Qt{7]wԩØ1c۷/sMj?%k{f <翁aXo%D >!{ n5Y~zz@$oj֬ɹsg֬Yw 4iӦsaSOaXߙ4iuԩS-[УGϑ#Gذa< 沐!!!2Ƕmr˭ǏOgQjUF믿NժUoJ-ZO?ĉ'(S o6 """"WIvzɓmۖ9sЦMN>3￟{뭷x뭷 :"##4H&C Z:uر3ֽCj#<;}Ogoߴm6iʕYz55jѣ>|81'NC;3fժU{$''s9aݺu<䓔-[Ν;MO ­SfM/_΄ ꫯܖނުU+.]D%F:t(cÇg9VŋٳgOqǎSN̜9;vܴcǎ̞=; w(?4Vn0`I9'hbrŰ yoWǥFΆQao?l6a:eދH;}aXchb+W6VQBGƮ]=875k4vޝ|СF߾} 6V_ 0Ku5 0/^l4nHNN6Ҍݻ700Xpal2QFYw ט3g-_~ɓ;WGybO BvXzjxW / 40,X`aobŊ\ǰrJI&Frrqee˖ҥK7ߍוm?4IwMT/m,7oؑ?ɍzlX,\\\Xp!))) 1o<&L@&M4iy:gΝ޽{Ʋڵ'`ٲeުa1 "o[nYfDGGqKc…\p#GR|y,?o941c`8ڵ_6lbq^gΜRJ\'VN:/ڵcҥ7mOZnWm.i%~`ĈDt7O0EռI7.]<5\vMD[*Uh׮7o~J_{N>MhDbIMu5@&N 9[]łpÉfxٲv__k#˪Uk&kg:"x@IAi۶-QQQHeg8p`"`lFiSo"#R␏T_[ 1/nr9\|\K/<,$'ã zmܹˆ8'Nn:ZhaPD䪷j0/:~95) jA|g殮f^az]/_ww{G,VZEbb"/^`,^0'*Y$gܹ>>DF~uumoXY>IaP.b矯з69#cSO_Xh"&M [ȝ!"#{!&M 4k捯/xx3:esRj}^!99r|=%"""""R\I|9ҮNX[0ifz˖nL>þ80%kΝn$',iAH,[W@qqٿCqX"AOHH`Ȑ!TV%KҤI*g,X֭[SL<<`.RS:Fa48}~݂4i+ObÆ tڕ{PT)֯_رcx"Ǐwf3[-8|L!Czu7Sv9Oнl%?{l <댲-Zȑ#yW^2//Lee8 ZaP ǏC\H6lȞ={nZ<&& d{}h֬Me2݊rrnl_VAXxxfޣqs&OLy7HQ'"rg{NС.\v,XgݿΝ^:Æ cу_~OOO֯_τ СCLARR 7ۖ-BrN}ccXxɥxy]RJ̚5^x/M'ױc2&\l={W^$((щ""w[,YB߾}3f ;w_e…l6l6[W_}/'OҫW/}QKҥKq)vcfyR !!Ф DF^0Xj3fͅí `Y+jKOOON:i׮K MDԞ={[-7#u۲gϞBC_tiA]nԯ߅~eEs5oA(UᄇgODD7?<KI1 &O6oE…[7+11|+Zh. c*x7hԨ}/F:t/Lƍٽ{7;w`ԪUщٽ{7 vfk\4H]صk~~~'..-ŦM ,=}4%5W4814c'8qbт.yfvm?q>BCR%d,W~ ~k~z>hi.!y"v3m44i©S믩\2щy٪ˁeklUСoŢy뭏&]AI)G'4tbѢEoIlre̙ӓ-zVUg~Or9q#C]tt%_a9cO=ewe/f&ٌO?ٌ+W c0={ _ j5 0`Q/Eعx1bCFŊ b9>2^xbŊѢE cݺulHQ ~6C,1l| Dz<.$d2=ęߏ.rk @v< %Ja>ðph޼:GprkW+CRRRa\CعsgmذaqfΜIƍ޽;fʘvRRRh߾=.\`ʔ)TTO?N:vZڴiS`qH^aJe%xKMuZ荬W,**sV~>DW8{ω3S.&fӧC@<,X x>lc+[0n8Ųj* q7~f͚;wxf͚cgϞݻXm۶4jԈP6o\ 1H^q/+\]?oޙ9{ω3S.Y2 ز73@ksb_5'(Ê+1+a„_O`9/8W"bw71["'.]oƗS{9Fɓ'Zj~)"y­ -0П-d݋c Yޙ9{ω3S^]֭7o6'{+_޼mnvu\NpBm.܏{ yrWJj}ҥxYCȳ]vCT0 tҥHe[#,V&ĉlԛ1{m؀-Ԯ=&̙ߓ|Nbn^ظ5ߟU}ƎÖ-o V뇸oWRL Zll۶SNԥ[nvΞ=K n*O//D$~> Hy~nƣx!2KaRX/ޙ9{ω3S^B6N}];GBŊжSS0d`Z"ii"Am6{,KAN_DR'"rg@/]LaxsR瞃U+pk, ˗lٲݝSRF?UHLLŋ9ŋҥ %K̝;Rzu^|ENJ^0a>>>L6?kx܅%..-˷؈bӦDF:ϸ6¦O pq:h0J]bƙ3ѼaFLaaaLdg;JiŊƷ~kaƽkX,XbEf͚b1,aZ3=>rayx ooodɒF˖-ue{X 7 #/FHp{(Rd:\0 ο8[ҬY38taJhœDn syǎR9ɓ'X"'_~..lu ޽qJ$g.˰mZХ Ԫe@T\b&"?, wuÐRS]v$g]عZKZjAR9qc([Q]ڵbp}%ڗ#,5 0Ȯ."O pq6JЋK<!!P޵7k"E^F2=lİm6y;E%eu P'Mu8%֭P4|9[QP:ev{ 4[E$ó,8{l!G#781Mzsx9 6` kbįHO pq6ZoػLп{||`vUQ8g}ٳg;bLJȯ YW놿WBBhyOpq6jA/Ƣ\99g꫰gxy?9"e˖-A!"#{!Rl:\b 8r4gs߳\5\9hQ8ݻ4Iӧټy3Æ cd""KȝQ^ lyٵ=41W9Zի[7pѪ"\rZ,j֬Ihh(ݺust""GȝQ^D=z3fGΝIJDŊqwwjA|#5J7V ))&̙cDDBȝ$qELZZC f{0a CԩKO>\p{|L­V7}*Wŋᮻh,Y-%)""""""F-Ea  s0 ưa\^y`̯8>/rEhHN6[x ;ڷl ̖tɛgz~EK SQ'"{JЋ? |ONrN8ze˖˫\Ϟݻ8tȜ͜ . ~Y"Niy֭AAAl޼˗3j({("R T"OGjjHFY0gp挅믿δiS\np=0p f O?]7l6mT)\ xܣG&N/Qk1k,/_СCHP'"{^DeIM}6@iSUQs,yժ0n\2/͖ᅴcz˜n`HK3[5Mpa"_:utS>ʚ5kHP'"rgW\'? ,=./\Pf͚e_KŠs'|9|F[N.]̉㲲`A_fҥ7?""wF]܋777٢3? _Ab"fc߾}sZ0dR*e͛CŊٟ{. qb/6l ((Bdd$˖-c̙OD3jA/", wUW9e34/UlEc4:DժU9wu9CvK-tQ"DHHk֬ŅDDDO~HQ'"rgE zBBGfѢE={___~mz}vRRR{2dJG~ͥKScǼȇ &¿+IIf޽jI>== 2EVvh׮)tDDrX$=z~#,,z1|lߦ =z4FӓLy{a۶Ls皷k- ПS3uf0[sv~M"'s.\lٲo%}?gOD$>A_r%k׮e-=GaĈk6EGG3zh&L3bι2hl̙|2VkC<<0o0V_Qr%=ض |c&Էn5gt_?g?Hyyyq)*UWY,Ҳ."RԨ=OЗ.]J2eիW~ѧOlB->>$$$ys2tWWWٳgIOD ːj( 'ݻw'!!ŋg*3gժUySOaVTrJV+<@|;,ժSd3woo KRA`Ic!S"ӪU+ Ƹqؼy3:u?zv,Kdjժ{1o<~رcAAA?p܎?ɫ!66s9}N:ѡC^{5.\@ڵY`=h߿?s0BBB׿ŀcL<?lڴNprERSh5vR3.Q'/_BҀXsϴixWXp!SL{`t̍Ctn=͛˘1cXtBԉr%uYK/AF0{vVtg :cFŘ1c8{,~~~,\~:c͆fԝՕ5k0rȌckժEXXC-눋Kn$'7f[&"\F-, =IJJːj oԮ]kT>q=o^J*Uh׮7o=IMLD2 ]ý^+_*V|ϝIHK*Exx8 IDATADDM˗gL> C̑YfͶ( 3o.fAj$%2pqQv.bbbرc|TTիW?{WuNnRTfjEWR/ rņ7 s.t k(ˆYmnH u>?GGE|9y|ߜ|NNN΅(R1&spT&orL"Ҵs''Mz?q˖+߸pqlw\4jyǠO?] Yjd;IWvN}b%"t Ǐw}>}}98*sy=pc"ҝÇULLT']*ML13fzw6ŋ7~Y֠Ay}T/R;wS徾1@Ap<`iikkkIb%"Mh"LGpp0|||`aacǎa…;wb&nȗ|E `Ӧ{e>`#2|Bh`hx;JP41<ۻMD@?z+6 L&L& \.rpj- Ǝ}W^0tĉ:thf͚ʕ+ZapuuE||<Ξ=[nz̙3՘~ہ|5`g']\Gd8^UU~HM۫&i={n4vlxz 7w+xI]~$p(`e$'NNʑ_"D{p4srr*յHn3m iyyZ6b#?/m+;|Xu/;W3j炴c ĉ 2KKys &F}[n LMyH9ӦMCaa,++ x%$_i;gj] fiv'5Dҹ~](^|0A XhZ<"Zl-[@@@1c #"寿ac4t矁-[4Ν~s?,R)j!iKKKnCHHΝsR9]o \q{_~RKDpV\9s ;;J~~~h׮/>jZ)r9m5DuE` *Jiժ^:mhCKRamG_|O> &=++[>tA0!\]]q EꐈH˶nG5.gg <q^:v}|Gh֮U={eB~w@\xZdX5mӦMGѸqcٳ;aŊl\'xWaAb"s.mؠ]<࣏*Nf̘j&?۷bWsTO˳ =4-,cX nΝ;7|Z9Gѣx =m۶IgŘ2e ~7C!:YJaL@,72DIf;T_ѫWo%CƮ]"5̙f!"I=7n܀;aff&PTT$atDTɪ|s^4m@3?JWVXk|пrwwШaa}P\숲ؕꍲìY3Ѷm[5JHe˖IΝ aC՗[4\ 22-Z͚+ 5ͽWfk ^С $>>/^l%02a̞=#GRkDz **J 7o]&ХjUvP:> uTO׬^1OUN6M7qtb"8U B?YGTOiv`rib""ݺu P(IP(ѣ5ˬ{5}}0mFI  qBz G^^"""2 e 4,oт!ݻE4LL^S5{ux)Ս="maR 9\Y~ p}kkkUwQ}PZ j>6nTͮ~j5mޜ qnjnJxxxh;,"""r6йyyn41l Yfj wy'{4jj t/j>O}!"I`֭q@yDT+ɀQ~WÆ@FE1Qmj[:v.jFR;wÆi7F"m`݀301=y{tN'___ 07`ĉx%0$$}Y yET rrr|Ɓ_aml!RF|2$H?(ȑeO> $%ƚƹab3n|qq*<nBD*l0sss!00Z:"Bnݰ~ K,AHHR?Ynm 4m9T& 69&?lp#G߮8|^UZyAŝH˖,Y`:tn̙3qQc߾}RGTJJT3+% /zb3<Kk>޲E5!c>ʆ Q}ύirrrP\|đ#G~}ddRR@_T99aH,XPa!ǼyZСCvZ{ضmjy&z]vᣏ>?{{{cϞ=ZW~6@5<8G9s*vҴiq|AdwJpy2쳚e}Ů: "='eee "++KPH4h@;wB?ajjzl"d2ذaFy޽(++˗ L&8.+--"00 ߗ_ B(幹BJSMyxRn1*}Qk DTWk7@xxQQSDAAq1iϥKBl,DIɃϟ >}?OЉǎP-ZhdX[[cذacƌqjussC``GFff&.\Iw>T53sy^^1[CU/23f@.K Qzgka}W_ųCCǎ;M{7V{wjq,!ܵO?i>CU/;#G>=d@U4w\tO=annnݺZ.]Bf*-tR=22OORg0w41iCNz2zv㓙 wKO?i>CeˬmݺHHH#8{,N#FTzR3 9bӰaClܸső#Gh׮điOtt4lll4"##)QDҥ@NP+Q7`8yrT_e:bck{se?_}ls1TF@n ȑ#qAtܹs,\xѯ_?mKDF]v:RڼyJo(Wwj{,߿6R-ݾ lܨZw^=кff@޺O vvvxg[}Ѯ~re_2g1zM U@üy󐜜 ˚ADtR|gعs'!ʭa%ɴ7T*5rѣG۷X///T(ɱ@r&&@t4{ Qt^C|bЩN}?Ǡ?2;ZDd^~e;0777|||4^2d 11Q\PQcʎ=q233eXn࠵u-T%g'J n˸gƝ1Gd9*(-['O:"2`6mBrr2BCCuZoxx80a\z...HHH۱~zƍڵkq)8;;Ǝ˗cذaXp!b HMMu7VVʂ5k*.sfeH?se?"P}a 矘5kbccajjb;eeer 6lFUY>NBDgmm INJJ1k,6l(J(JfffHKKCLL &M7n)))֭btHOt4W^\ (:;ADO_󏡒HHH@qq 6`ȑؿ?*HOOGϞ==wtt4.]Z<;;:t@VVMBDd_Xlԡh_ՔJUx1Hj蟠2+WDbbACzzFѸz*ЉH۷v–-[LL!d2l૯_Wֺ5@۶EmDDc ԤIt޽4iJUI&><׮]24""2P?;z|b""""V/DDRS(HLLD~~>JKK5`fggK=ŋ+ SMFDUc#"9w!"G`pqqANNv튖-[:<*uOS4]\ww2++i .>"CGDT;li٧~O?~!ob˖-2e ^*uxcLEǎ1q tcLEaa!`X :Z O>94~~cHo6Љ ''011ANNNz{{(*LN;xDNȠ1I DDZ닿-Zod2nbccw<9q{rJ2 0I DDZp)ڪNQZjS2t؍:D"G$N3|liA6moѢ,,, (0I Y#"Ҳ-Z`HIIQfLDT0DDZW_EDDZjɓ'#33S갈v@'"Ҳ!C 117,XǏK.h׮fϞ-uxDDZGDT;lHƍ1fر+,,,0g"":?"aHGlܸ ?._SJ1 DDZm6<󰷷ǫ رgϞ… ZwII sssaƚP( +}h5n"2DDeֈlȐ!0`+fff:{С8|0-ZvaRDdddΡP(Q֬Y3mKDFv@'"Ҳ|4nXnݺHHH#8{,N#F@.pG_b#"vq'"Ҳƍѣx71|pum۶رcZ7996lF1cpyaooP|g(,,ę3gбcGL0۶mիW~z|̄L&Ö-[ЪU+"::dxꩧ|r!** xP\\QFɓpttDVkٳg#!!r/accb9NB֭aoo,^_ŋc޽8qz &͛UVaĉpqqY%&&W_SNuF...:3)) ӧOǬYPTTwwwlذÇOTBTj]]]g֭[G^0sL:Ȱ1 $[׮]ϡCtRSLѸ]TTnݺaܹXd BCCo>xzz^Ç~Evo{ IDAT?Ɖ' LA!663f̀L&Ssƌprr–-[px{{cĈÇwŖ-[dlڴ ٰ)S`ժU1cڴi[ڵk3<q,Zozk׮D@@^}UmŤIpfy7oFYHHZne˖)_oC&tu8 :z so<}'M?C[nᅬ#G ѣ|ՍA/#''~~~IV^>dd$?Dze˰{n@&aɒ%ѣG^ 0i$'|B.C&aʕرCPݸv +Z\XXX""cGDT;2aa_|Elڴ /_hoذ#Gľ}j+x T=;;:t@VV)~Rqz<ܹsq*-wBA~:t o߾RFZc߾}Xt) ɐz ]tQ0DTQcǎݽSr///Yk@?uΜ91iߔ)SpܸqNNNP(RЊ!^#Fqn>Sk6lJKKK9r$VX!qtDDGDT;F@tRU6kLJKK1vXX[[7ިx--uCP(o!++?"1z]Q*7nߏD8::> "##ZQbcc@ "9?"1z+}J^TT BX~=֬Y֨8Ag 011'|]Vٳxp<8t>1eּqqѣW{ǏB_~QFi-Vz8Ji ANN F7oVدqƘ?>k $"""""}d !C v\P/ /pt>>>탿?|||]vΜ9[[[L6 AAAO_aРA~ݣGĠgϞpvvFll,н{w899+//rrr ˑ5kΝ2l޼ mڴ޽{+۴iStE=3=wqGXX&LW ؾ};֯_^?zܸqXv-N:gggWرcѾ}{8p@}ކ Ok2&/^İaO?\r7oСCaׯO! Xh{7ouR6l>w}ZR7˓d믿sN\p...:u*كCa5jBCCusHMME^K 4@&MoӦ Μ9"o@RROYfذaGTBT?#d2V^իWkM68uήX޽:tߤI:t7FHH ((B֭ѨQ#<3T L񈏏(;}Cd2M{Jʪ}M4jHwMLLPlݺwRo]v\.G-p-g?s ڴiSk"""""Ǡ~ѣ9,qW\7]?;vp[[[cٲe겂?F1Ahh(/^ @HHfϞ0~W:u ݺu{争Nj֬+~~~سg6l$DGG/Փ911탇|||0`\x͕)vm={?P5O?Ν;퍨(lܸfff_|7oܼy>|8rrrӧGGDDDDDFF&eggC:DT0I11Ci LMЩbcc`gg'ux1?t^A'"""2VY<9@,%2wddldcj+"i;6mFTT(@/'OCLLtHl<Ul v"x5&cTKO*^ ___o?͛߿?Ѿ}{'OuՅR{y?D4@'GGGo8sƶM_~QƎ @5s{bb"RSSq;v X[oǏرcPȐ &&{r9fϞ]s ** vvvD.]sN-ELDԴ @Us*l?WD`$'] }/Ǐȑ#5WXx1V^ [[[uyϞ=P 6DHHO=TDŋXr%n߾!C~Iݼyz®]G~=ñgmMDS'zn}E$Au.++KYYYRbd2X|BǏ q-!.]͚5%%%"//O8;;;}055׹s}u۷F?Go#\.^(d2={vY|dR)qk_"<~a{"=6Ioeeeŋw/_{ /^8+++L2ƍæMaiiqK.ņ ƍ"4k֬BݲK.:$""`#");I[d2Xz5"##55mXnd2Y̙3F^ ///XB}ǻ_~ήpܹs0e\r!!!CΝJNzz:ry^999RKDTgt\Y2TW&))¾uի~:9B~X7|ؽ{7_b͚5x 22fff8qݻ?9Kv""1_?>A's!xyyU}ƌ5>ߞ={p [n߾<T롮]7o۷P(Q5ܕ{AARSSS㸉H7bcc ;Jpq#"*;Ig9n߾ l޼5>7쌞={b͚5k׮!)) 999CJJ GapssCYYv튷z ЧO>| <pI7n gggL> >Cl޼2 oƋ/>}<ꏋꘝ226YWuHo0_?4u.;;:t@VVHgb#.DDDDDDDz t"""""""=:`HԋzII sssaƍ5:QQQ%t邝;wj9b""""""oE}СXv-{=l۶ DBBBݼyz®]G~=ñgEODDDDDDѯuV"!!#Fٳ:u*F_~%rss@@=ヘ8p@gADDDDDD蟠'''Æ (3f Ο?V{q&&&=z4233qMDDDDDD7Џ;ww Oɽ]&Ն7/]f͚U([vҥ*-**zcjǠK)::666e("""""""WF@o޼yO۫;~=_p"&&y(-5i:u@ll Ho1o{{{#!!JRcѣG۷X///T(ɱDDD[Y<9@,%2wddlL"J0>d 11Q\PQcʎ=q233eXn࠵vM[|eT_.W <911GDǘ?7 &`ժUصk^z%l߾ToqơA>vرİaÐT >;-Z$%Q%23Tu=v""0:$%%ìYЧO:t6lИMTBTB.333CZZBBB0i$ 8HIIAnݤ"+))ALL z ;;;r̞=+ J_Zᔖޓl 1fTxzÓOg?3Ro3?~ :XZZ"..qqqU -ZBbtDDqE\2dVZ5T nnne-AI$5S2Tn8!|&?GhGmڴ˗.]ªU<۷d:u@^AP :uuHKzXEO 3?Ew"9Q'ҕ N@\\#66FtcI51 3?@'"jh޼9"""+uHDCFFDE%cڵJҋ.±u!|&?Q1gG… K*81Q]2$~`gϞ5ȑ#~:w`` 777̚5 U H3H;m,):cLvnnnʪ0'rss$GZ!!!8p@? ADU_J`#CglI.6е‚3~QrppرcC劘1Q}I∈Ο?4t̻DT0. :KIIq5@nn.f'6777k׮ũS]D`ǎ… !1w\i.NDd^}U={[7|o2 OF֭JJRc_WWWٳuѫW/̜9\QM1!و$1DDDDDDDz t=P/떺~^t&C`x5ve}6ì&6L}n_R/&C`x5vl f}6ìODDDDDDDz t"""""""=::zƍ(..Fvv$KY߸qOH.ƫ]CxmY_>?GѡC W/u1?"qN8!uDAOtO?0>?6Љ'#""""""l6PII sssaƍ5:QQQ%t邝;wVojj*:w KKKa̘1(,,I=z\.ݻC}9DGG#88666XfMצM6aprr_3g^wUݷo߇ر=z􀃃4hƍHJJצꮝja# ҟ\.GAA^z`4i5;>sz\{[?Gnٲݺu56lwww,\J㬋x'tX޽{W ~ IDATrgϮBQMmرh۶-дiSJ}[jr9V?}Yf033k5~M6EÆ Ѷm[鼵fgg#44hڴ)"""p:OTb… -caɸ|V.!w\I&i۷ocҥ򂹹9׸>TgDӦM_|!ŋ/(d2믫=۷[_HMM 4w7==]!CT~z$Dhh]>TݻvvvvwbȑB&5kT66իW{M6 oooamm-rssktVVVZ=i&o$~yf1`!ĺuzkyH||xzB,X@'~IݻW|>Js^^^Ν;ҥ^Ś"d2)))bbʔ)B&_]+>J}d"22R$-5k&N-lllD=ԱΞ=F{ՍG75l0ѣGb {n?`ѠAs:sΉ&MGGGamm:֯_/LLLȑ#ŏ?(~gP(Ă 괞ѰaCѩS'w߉Y̛7OA=ҹk=~"%%E$%% GGGQXXX]vMXYYNjoFbyS?uzm}Qd21iҤ:.!(--666bbbǎbѢE"55i ud˖-B& 6h[8::*]|dR)5 ۷8,ڕJkMu} ?~Fye׾d@7NuWvB<ڵWL<{u}kyzVVByd!DqqqSwذaEڵk겳g 3331mڴ:L:nPrJ0 s36cc~ss͈aʽ,H(J9{.:N:s꼞G::;sZ~׮]5 Vv^:Y]׶;!şF64'۷o=z6}РAs<׭W6m*M߿?N:wn߾ӧO?_?ʕ+\nܹߍU wLkﺶs})״+J*u4M[/] ܸq`m7Pkbaae˪M3Dum[ESI7xdC()L/mN} \ի>PX---amm {ѣG|6߆/vQ$炶}筷5u?__֭[#G`ɒ%{߯Xϟ?ɓ r9:U^2dڵk>׵EUVhҤI0z ww\ 45=纱qY\Lfs^7={^zoԶ 2t߯^k׮~4m}Es϶Ur{8U oƏG0}ϯpyQ?%G1c=|0u/ix sN8z(zm&֑#G"##&M9i&l۶`4ޗ/_sͳq=G[x~!z N>>ܿƍChh(Tb6euttŋ+++TT ÇdzgVpp00bܺu /^~ Æ 35pk[MHHr!8p YbN>%K}*7o鉩SRJ'֮]kv =BڵsMP4_diU}״W+mڴ ddd`Ϟ=/^@6"Kۺ2T }Bpp0 Em}J.fNloKKKVAСիѥK>ff{~m~QDEE)ŪUbΜ9h֬qYf8~Ab}6>|?χ;͛Xn^cG9Z 0x`CabmҤ vڅݻo<0;w\L8ѤT*T[ϟ?GLL d2mSA>PoM9/^i } 6 W}6лwoI&8s LX9rDomر#\\\#Fŋ֎6y}Px1*Udn߾)Sqر޷=qDfԪU +WDrl2 8/_ħ~ju d̙j`Ν>Ŕ DZeTZUu [$׶~W^#G ŋS<|֭À`/Lui[[GU@uӦMѱcGԫW3g|S APٳgXvh֬RSS1|VZFR,Y 40ЩS'tCEҥqAٳgꫯ#Gܹs!Cӧ7n iDojƌذa/^ ___o˖-صkΝ;mP(ocƌ̿>|8<6m襭8n^^^Xd q)̚5 )));k*ѡCd2>ޤ9s&ƏӧիWGff& :[T 9 F߹ BBBW_믿ƈ#T5 cƌAJ'O --Mo뭭ɓ'{AдiS=?#6l؀-M, Lq}x1q]߿z-[c{&%%'OLWkǭ[~ t=?뙬.\xzzj]A8|9U}״WP( ھ6kPrތAuaVa.~p\R*w///HmѣGz~~~x왔 w]ڦ+L^̋!.-(L׆B_wʕU k||>>&usJU.֖&jՂֿU777(Ǐm۶~:og\\ЬY3 ,_K[jBҥ5Du]OvTlٲEmzxx8VvgTM^t Neeeaݺuh֬*W @yԽI&XnZR?y$ .軮mk껿07ɋܹsA}ab޽;سgHXXXqz1ܻwҥF^Zzu_8qBoطJBQR%8x ƎX`u1w\`1c޷o#** WTT}"::[{AAA1tuu瑑6ݐ(;KKKt ۶mCjj4ƍBnަ8v'ַgT@-Z-KKK|G8wڙjx2#NvD Ő!CL&6l ƍҴ )\\\Ć E׮]8|ZJtM߿__^8;; ///h>,u&֮]+:$'Ə/D ިm!bB&QFI w]7DG%d2v~}'ݼ{dر]*UJXZZUO>D\|bBd1l0Qreamm-ի'[Ūnݺf͚[N4kL.]ZX[[ڵk)S4رcqƢL2Vxyy ,Ū*F}|/Zke/Ĕ)Sbڴi_gѺukQlYaee%\\\ERRR߯B9sFmV.]Z+WNtM\zU%&&暗kРAz[NoRVllر([v] E&O'"""""""5DDDDDDD&: `NDDDDDDdXDDDDDDD&: `NDDT`:/FT0ѰӧO'>S#]򛫫+-Z6 =}囂r*Xs2 2aM޽qewuu_mi%;t{7%-ӛ4vDDDT !P( -[[[꼼L&P "zS7OA'""23ƍC PR%OHMMŀPlYTV ;vP[СChҤ lmmQJ|x4?-- | QJ,X W/__|jժ>>>سgα_v ؼy37o;;;xzzСC2ۇFG̟?jՂ ֭kתm?22uARЦM\vMmEw܉Fܹ_B:@iK.W֭[6+WD׮]Qti_~yadffbԨQppp@Ŋ1cƌ#ۣ\rի|XFD#5k`ooX-uYJff&ڵkϟ?ÇqMtQZ&SXX&Mq_r{ӧOcΜ9r[[[lذk֬Ν;+|x0x`$$HZj% B+WN :T#!ÇBL0AxyymgŊt"33S<~XXYY;vH={&ʔ)#Ə/"!!Aro^Zfբ|ZcOLL2L,\P-5jJ!DTTdb޽2N={Vm{Æ ]v6̙B&'Oh_ 2DkbѢEjrnO3Fmd27oŋRܹSkDdXZҘ3ܤso&,--r`BBdBr… Ŕ)SDժUElll17f"==]6uT+zBW899ѣG*UG+>^NDDd2 j.MP %%͛mϟ?Gbb"f͚I˔)KϞ= B5km'##Cvd24iXe/^tj˼|Ro7g;;wcƌ)P9]x&MRyM˾/mmmQLCDEO&isEff&šVZprr^?ߜ"~49sF^;99I[.0aoߎŋc޽*XE+4Mi[NtP(ƹsr_LMfmm68p@1,L-[bؼy3&O\mK߿xXZZ">>ڵ+pdZx :_>?6(UjԨzA.ĉTI}}}K<~5kTz뭷 Ov /<<<`cc[njjժRO<^9h9|رcjӎ? BcΨ]vs@~U%$$ )) )дiSٳ_5[=5}`x{{c͚5ĭ[py|wػwow^$&&bܸqx! uy{{{fx7o͛7?`ٲeӇ ӦMõkװ}|8_"<<իWq%|w|ggg9rzCcbٲeXv-nܸ7oرc O]rE;v… 1b˶okFqEO>Aƍ H`ѢEz돾rŋqIY}APPLJE:dҥKOq'""""""2A'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'""""""2,ЉL t"""""""@'puu;|}}QNϞ=+~7|EfvGƍ!z4l^^^ҥ N8!-믿bԨQnh߾=cǎi\@Ѹqcy?3|}}+"((NNNprr*p|D%s777̟?-娻wYfRR(=z4<<<ၥKj\.-- M6/ׯ\t)yl2xxxm۶͛7ߨD __޽0~xlٲ󃷷7ڶm{RJaҤIҴrŋԭ[s-pAd"..NzݱcGpB#FTƏ//_.ιO'*V(OiZ ĭ[ N^DhhBQjUkdq1{nѨQ<٠Am6!"**JĈ+(69.wQ|yqԩo7**J-G}gbҥKŇ~(ӧVZٳS( ;ܹsrB!֬Y# #QqW3% @޽[!ĭ[gĉB!~Gi]>++KjJOL8QW}ӧOgY*<ULOOGZZ*Upy fܹs+WƋ/m8z(yx{{Aظq#K6m 8=zݻ4jnnn6l `۷/vzEx>/DfPF |7ѳgO'00cƌAXX4[nXfM;6W^~ðapuuő#Gr-͛TRynԩS>:w F@@ʕ+s\D9N{{Qn]\zrDÆ ѠA9sFZ~ĉY&k.m+V؎6۷oǐ!Cݻ7nݚk9L;;;'OPj|ƢaÆYE~!:(NOݓ'O p9x{{}AzzoV GGG?~\c;:u *T@fƾ}qPtnnnjʡr3,͘G^Wʕm۶YYYB!RSS?.|}}űcDŽBOXB!ݻwHKK=wB$U&n޼)CJm셇ݻ !HOO/^B(vQ_^!ĬYDZz-̙_R[)))E>|8rN޹~Y!"##z߾}M6͛ \_BP;wrʩm_~jGusHСCՎ$&&r4X!/^ʕBeޑd~غu]B%ӅB]t7sQL)b̘1ZjĪnݺ"&&FE~4Y!{=QR%Q^=iT>>"88X!Ć rWZUUĈVZ B!fϞ/eQ~}ammmvgOAd2lݺ7=zիcGy~:bcccǎŒ%K?RJ!::o|___B.#!!-[Ddd$&M;vԮYѣ ???>}Zj:t ǵk״Mu\r֭޽{2 T뛝J*;w-Z5/j3g{.>|sww?={<[o ~ݻ зo_@RR׍5B Զ[Z5scʕF:t(.] Lo9?((|2~S,|rݺuäIɓ'zشigϞ4n8tVX(ШQ#߿_cΝ;wbƌ8wHKKCLL ,--_Hmd2HZXXHFi=I !4&CLS믿Ԓq$ټys;{,z-|)))(_<ڵkpuuf^qmٲW^si[nзo_UT؎jyOˌ3FeEٲe233QV-ojd?~m۶u~|X~=r96o,6dt:uBFFj׮ C\\ׯ!>sPZ{ƍO!/Pn])7ob'|۷oCP 00uc=ڔشi>S 0Wƺu0`̟?hҤvN8QǘYYY!""#FWPbE[N={ryn'`=z2 #GD``1Rd ۷/J.5jݻ'N{F{n_'s\tt4&M1 >ZN''ߛsg64Yb,,,rYmppp@PPe駟W^J}駟t>jΝxwX^/@v 0p@899th޼ƛn5z_ݻzz1so*,, g6tq۷Q~})SO>UҥKhҤ 6l)Sŋ9s&?~TXшڵkܰb ̞=3gw݌ 4jO>Ehh(z-,^wƁ |"GD t:u%ʗ/-[ٳgҼ={СCrt7n ǏGhh&"*GI?#F'NiӦW^eʔnBCDd0S׭[#G`ɒ%NS®]vgVn۷o/pXAn߾Փ>GNݻw"A0Qqa1n8j|N+W//\4h|(B%"*rZ޸J,?"2.G  6LGP>r! *@Ǐs={ϟ?oDDE(99Yk^$`#"c1oٲv¹sK.-[D}{D;!QGdژ ȴgzjj*F1cƠRJHIIt'OGQsJNNL&v.\ D"""alڴ 666Ǥ9::j0?1,)eC1*QW3>0*:( &M˗ Qb#"sU t"*QXcBDT\kЉDX"bbb`eeeP8ND%NIHDDoUI,Љ۶m?n0x;kB\\\мyscCDTd\5L_rء)?"2W%9@'b!x :;nΝ;Qc#"se.:;?#ƍtcBDT\KcNDμypQ;""GD\ t*uߩ䱰@*UFqơjժ/6oެӺwF˖-aoo#44 Q6Dd%@'8ص W~g^) ޽aKݺuڵk1{lݻ7F>}q<ۻw/:u2e ""Gǎ1uT|E=12ǻSs9)IHtϟ)6"##qlܸzj ׯ_ǤIЫW/XXh>N?L2رclll. Y?+sAE I5o;vĹs*9aoo=zM4hܹ?S뺖s{{{XYY$^"ʍ̕?-cbbЮ];8;;KFF|r \_Fjб#PUƎA؉{QrվӺȑ#I&!)) شimۆɓ'4n"RGDٞxxx`pvvFZZ6n܈> ӧOAAdV\1)}.W[bϞ= S[ŋT>|*UK.3g5Qɗ *8///lܸ BT .@7]sMU/\ 6|Љ+?3Iamm *`ذa7oF-[6lѢE 1r޽{xⅱ(QvTlٲEmzxx8VMj]z믿rM?q4_nf?>m4 :O<Ν;_"-- gbZh___t+VرcnxFΝ;N:Xn)1ڷo@ >O>EZqF۷ׯ.n7o*Uh\CpppO$ҕL&âEl۶ ӦM̙3 wwwlڴ ={Q~ IDAT(P(6`ذaŋѣGdff9f̘aHDd43='???( ܼySk@,c@| )2JҥpB,\P2WիsMׯgDdr3ks:|0rgoHII v߃) ; ""GD/f[9ӦMocǎaΝ8p -[ &ׯ_Gv|rDGG#** !!!ӧ<==駟cǀ$IIE)8[9s&Zh/_;"҃ '?"2W3SrJ,]O>Eٲeu֡o߾eˢTRꫯp]d2bј:u* UIF1{0`ammmPsv!GD/f[#8CرcGEDjA7轩rss "=(y."ܐ}b#"s?-k4ǘ&##666湼p}_5DEe*cGNrڧ:tnnnHHH0v(DjJE-7g\1GЉ@qjHٳ'\\\ 8_;mj_JT\c~?Dd : '''; "5霌uo dd(_w"2Ba)Ņ,x>U_ӧ(;tߥDd :Drr25k;",C[ "Dd :ׯgggcBU-9`ok - /Ztc0Ya#"sWx,Љ zjԭ[ء(9G,}.goO (HI)\q\ }VA~Er?>)?oGDDTLh|AF ׋_VrޠnDž~p0LQs'8Nf#%|rcBdR{ 22jNkּ[FԴ6To+,mmmm v}p0n>/Udf&H׷F}""C?:`YYYBIMMdԫWSLA^tZ_ł  ԨQƍg}fK}!x*ͳA~]挳NiW9^|Kת6U}T=K =]4 -Z(MJ2? t2 0< r֭N>N:X~=B>}nhh(OÇcڴi(U.^,_Rk/nU> x]$FͳU^33ΔףЪ+rEzџ 9ަvcT}yybF~[^ 7,,?RN8p6n(j ׯ_ǤIЫW/XXh̙3>}:BCC1qDi;S${B1#'{Ӷ_`gga,|P ί 9|#ef(`Lte/>kSNKr[VuT73VndN&""]t2 -[4)EЏ1cGTMaoo=zM4hܹ?S뺋/-Fm0K``FoV2hú.קQ h/U#G[[ WꞒp~'ׯېskiN}ZvMyJSP(@BU}Qrhp^GDϰX~㴜Q~+LkX_xgΜAVVV4H ww\ 4i]pwwGDD֭ KKK8;;/DfN{^T7T^$F7a۸QY]Zμ[J(|z{ke!߿?PzѮIUܪyB5kdף^՜TkP>ѷ/|Ս~ɹty>ߥٗg#"sg`̙38s挱CӠAB89)OxtrR6F uٿeU'w*ʖ}/}e^*ƨ@|k;wL&Z׵e˖NNNbժUĉb޼yJOz%BU~d2<ʽ^Μac[|<߹j[̾}6slYW5֜4ҴOW:꿟9?gy#̹Uմ<eWQ~ נŒzg}822^T()I9bkzI5R6ugƸc1oBf* ={k⣏>4k ?>BBBPV-7˗W֧O|oLgJ5-tɷǞUSm7c2cǔ2r۪;[[+Uf>=~":B.bx`²Ϯ.kZ[M0م3 Yr͊n.-z{{oC**øqp彽5 W]ueep9gr2k5* .C8I!ٴ_k[-b`GqK]61n|vw{Oo, k1T<qjr3eXs0tcD=ꫮ.}{:oYutpC&F q$||:g>ӋQ `bF+ Xv-&M:,X۶msoӦM|G54J ZYTɓԧ>n SLӧuV|_G}{/矏_ĺup%OƏ_3 z]5@erCWraV lDN$mO[um\JfwyfYsNya֭HRw}0g}?O_L#߆x91iܯ埜zovr)I^C.#՘Z(dӱrżpX46Y:@z-|zqp8m#\~;˗oEs10O^f-N68ˎ N z}dgS%ms1{RR jd|,[nea;wKo8)䟆Fi T*;q{GYmm-{衇c0 OOx:tȲzl„ wyg?M9yňL!zlUƾ,wT@9yݚ {UcU~&c6v^~hIV;gw2`q -ߵk3 mذv_2Лccǎe^{-۵k1MihAEUn6<#ߏG;`XIk4vX0p 477܀+^rۻYw1o`#t5/H+`=,0zh_ׯfƍظqcF~?@=QV;1fS֋c:z_Uap"P--^rj$|r<>>[EJJǏnj3Җ^"$L4 p.x\xعs'Ν[qkhW\T~=[nɓ'3[N>//WB|M!rSVۭg(ކWMNVb5eٳ 54 OƷa'$7ʼnF ξ2i [df GLɇhՉ+EƶWSA84ĿN"9RrU5SL?e5г-fyL g,YK,pB,_w֭[~qi;W\T>eL2pW?կrD"z{{a_~=?Lu Z6:"o>IIYґ%zFm3LAclvP==g0hZ4 @u2S)>^(:.;[$m%;\L0a\qx7\F%@CUA\T*ÇsE]]?m"V, /5ĝjyS8vNlǑ#G= W9FuɉF5)DK(Z6.[ZZv4&xDyRS,wYm=pR5S˭uwO Z?_v5J{gx)3J/1Q_@^}U~̘1555z BÇ}v\{Eiy«B=2 @۬U\)H&׾4 Je*q9ylV_ p9!0r%z53'0x 67ܐ^{hsH&rTc Nv}_4.6ل'(װNMOށsL$^sN5\<䓖6m¤IpŒK/ᢋ.054JZ+-Teߎ\x;v,?z 7o??=g?˗&n:}"EyMqt2wުz+ ^@8.P44J$[ ',DY!:d[[Mߎ63az@]:1=mm<\.1n I `&` `4wcמED,'C\u ]R*2RƲe˰dvmǹ瞋[^?> 馛yf߿8qOF®]~1OKC _i* .o~Ø?>lقnax3gW^wߍ@MM J<.ixν)@+"r+ nĉBEh/D9)q^c[Ӧqag(끓'ӗG.̈́d8tX^L '}8*=9dwuYsaNppzJA*N3 PSO{uۋYf'WmRR͘17nġC044f\y啸{R4byD:îy0hTN]lk&{P}sqS}@_Uzjz-uس78_}m#8DJU=ۅüE">ۜuZeZ<2[wzF|>NZ$5YnKW5t[}}=fϞj1Qw&+3 +Yٞ=V.bySIzp= jj$KH 2;#ybʗzD[gKO v_4 RCc_(B刋##B<0ۼoq1Y΅t;LE}0X_$X$b\;Ajh(POD$b掋2U"]Dsau?L|Jlak$X*իӯ|]hg͹W jC?D*bwk=d qn>zQ$y۰|NaUcz=r7xa&|zET5BZtw{W_mسF?'<7ШD޽\V^Xlc0kGSP*e}b]OiaepЛYkN;E G 9ï޽08x#p@S).!]b٤@iy |c۶m{sWJG2C3UJܧ![NRL/u}.]]f: B$^ãG圼;נ(*mCLBzS7E2slPș̎1{5/ PC.a-_@(%}}>[dwaqÿO0ƹL"c7E"S7hL |#K_%bW"J-K[9rbޤ;.mF"`o+XT{\<& p8vn(d:F{ka~aVi?N:NO|B!6|Od= `sqܮ_e?T5 ÔA^jrKnz(\}Fݯ U\%2_[Z^*EiTH(/h(5-Sr8*%BOVVcɆ2e,vʗH$*"}S?N쬳b۶mOe%KF#W^yY:;;=?B!6a6w\mKMk IDATaɥʘ'Im{b{ ORIV{-{ð̕'B2j'*Ii?W9U/o SɤfYI4*EQx9QACUFͩB~s| _Oe~;lݺ_=.áCp]w믇ϥ3gzjzӟǏK\swT\O`xI.W70^)7YL-&? 0<Jk үkm-3gz55焾er:ΜKihh W9Un:y&cqvcb%б(Gcd-{ 9qӧG <ƌtv94 7|3F5O?4quY^||M>x?X-"G"Ή^v]]:s y4zkUbaq3+Qa̚(㲼_B}l.ꔛͷMCCC#h|=U/wg2gBFv`V,ce76Ev0$\kmu)C<#f)&Gr?N>QF(QTڵ fJϝ;{n\tE~駟.|>+C-"FMe"q. ̎I2c:28˄V/30 ɤA'?%d`۱,LE}np~vN|EkhhZ h]cD +,WNeԎV52K0odUprFcEҴiZn쎕I?^L&xb\vexrPlqq̘1#mرc!LXlYXh䣞؇]5ڦ5'Y<)iWrlrdwu'Oz)|Yg })* `1l*ڋ•\#iC. w }<$7zOoe/R:{ ɤitӓK"n/"&!*@(DEb A\^zS'ݷ'*53{Du?)jjj%Ie(9} G4c1n<zUz.2fFmDr4YW.b K*eď<\O*bD" 5w+ r gdҲ|֭0 +۾};3 ñ}P[/϶J&I%vTG"VInu2|>{m)$Zv`_}{z>w*QӨlC(=hw0u8eI޽b~vLƸcLɓjd!YS)^~Q[gyn  MFac\}Hf0\0\Yk000'|Ҳ|ӦM4i.\oxW,m?s9 n8*D}Tɤ|8L.b @n<⨾>1&\6'na⹁ 90HHRs< ~/}>Sv;f~3g}GFdjojhhTr4JUkhkkQ[[F|j*|O}H#/.L C ;[+AQq 領$VE5|.ԯ\Xg~BgɊ{k+~0~>/_ЌsJ`e`ٲeXd n6<ؾ};n O:zM7!ȑ#1cK/. cƌQp饗s- vZGO ySjsFDeX8rˈ9q\6(T2R55 cp9xu/ok<'TeΜ|BШ ?Goذ===뮻0{ld@8vB"K(D'0T^?95j/1nB 4yF9skS.S m'X#D\EϜiH{"w&9o:RA*ů .!h35S{;cfuu5ie sP(?ʀ6~=3 .C=.꫸[i&Emq zC!>+6&uƸr֋CFv,ƍ>@9)D<Ei޿_M2 :$m碫 e9/ϭ$VG7̉x$3hGPUh:9 G_:y7I<nˎܭT 7ѹd&hs~6n//ˑeCCF v@~&W544*s玌Qd;ƾT|~_ns10)K.a_-3C/(T9tTg7Q\=9.w;\DUmrնrg.Fu)TO薗([0hScKXv(\xUmdCd<>'lӱ)Gsm$32*:w1I-D@)? =R} `?=3vX֦\W)zj+  ;"˄[0hNPm"xS)Xr"pkl|ϓ$.[#^+N($1ji̩@samb4.ڟ&tc0g^c"&F_LJ֙ FiTF```]wu+P4FU[fpo~cpT.+ \W]/4̈JT EQP1~]xؿ8ss 1Rĉe\"8q KPH44U.DqvM4ѣ%?\\HB<$|5q~o(G-o~?_F6%e.544ߏ#G`KFŠsпw{~o~>\tE]iB$xvw7yiө^^H`ɫy':z8r+M=t#Z;m3N45}ƓmyNcq"r;1(aGgv%Ӧ+Vu3եWL Yr^:EꩡQy8q"v܉|&{Q~Z~3|Ųe/|oe^Ca͚5Dë9sp7i#Vn`&Ykq< $,/Z.JsӍ5=iOydW< wѳ'{Dtws%AE;v,*4'/~'JihG@>v>rಳO޹ynM3T2|rCw!2=pޡ0eՃn奓 ~K<)o8gʧP^coN!vwb!$MX_ ! XLbd3G-9{eXD"Ԣ\Q[ˣw/j<ݝ>Qlo7e($| r\P.׶lP$JD˄:WgNT8aFL""1 6q߱ .+ѕ_(dJ&{&(Ge/U D bnn-c^I>1ūիNc}n5JU2O}/>' wwG?Q0DT_<7pg%έ>Cl*1 lـsZnEyszE9 {!_06pսσ#C@Jm\_6(oj پY)"ײCCC,JyߡЕ(&p# lfa[iHȝC1H6<@_H'xC,Sjh$jj #?6F%Bf~yv]]^H'K(uxIϠw0v_Nė;Y ;S @>ΩpX:rZս:,oݰ޵C0tJFĜ-A~/vzP{;YAԛN@ $zm5CUƒnI[_ǘl*csfT X&HX-|ۆ|EŎ? @b>n{ O0#f{(TϞ;@;mm 7Njj- ֿȇ"ÑNeσA۲%}[jnN\=sZ6j:&:kkx* :Kv찖pһ[omrt^|!J~nJvW"))۰9({SI-UGȺϾZdѨ5\ilWmR 0M{,? zNr ס#SN;3}`P͟?=m۶]}lҤI,dzkڵqRNϞS(p 2eu\̀d^ }y:T2>NMr"7Ϙ귖Rݳ=RϮ{Ni |95E%pH y"_`!ϧ>u q|aTGFHW,Eh=JD9 h/[e%+}1jUX T65ٓ(ч> D鳠ZKΑW9,Y566Gy+l͚50 … E~߳_Wl޼y޽vRweJ4$*ϹZyaUJ#܉pk7TRe3$Z67J]a2wSBCDoNqB>_.}GA<5PT"M@{a.v)l0-HvW`} qvYGdv8='ڃ^xaiKI&dR=[c}QڲVWWnfJ]QTUM~9y?Ŗ[T߫La{DO/~o;Z&Ҳ|Q/W*2C)_en>B@,vezl1PX3Jnzg%/)!yjDVfBfuX`T+ O?Fc_ oY8N3ķn `;w̸s=-[v}9ȿl=*;v c_,,. T'Llr48*+nB+gd|jANqtȫa\ #P[b=c1.Rb%v01edkDv: b1 No64l::8FwȎr4\` `p =$訩$&{{ O$)}ob;1ʉ&1Sfy/{^C N-=y X+}_i'S4lIeCuL+`}V3QZHR馛sN<䓘4iRT0P=6yK2 {Q4fL.ybt9cjP>IFGt?b1~~ i;qc#`"oih+939x^/&cҼnMz C}}1u|-fX)]4)e[~ *H]]ōMoM `ܱì* m{ ?mM*ů/{J 87NL8u+{OB6z{\o!=ƍSz{{{׻15kc=/}KvZ4ibnҨR).PH'Mѻk]S!4e ˿|!$ \'0ʊ4.]9m %+S;hV3ꧥ! IDAT8|4 Ut -MHFejLV]nKd@(d+bz8L!s4!VQ$JD9ؕ7pbjmaVwbU5dT4&'pkI5;h[na$qT36m$dx}EM "xe7g&Z:sb>U`;&xriiyX(EbϥHv(VJp_HɦB?Hry`ОN.Jߤ`Z:Ω[)o+wD<b?3 \G,љG GXnԧluS4tB<0 m6򫮺McW#INek-k/-H_2{۳JtԵ+&+^1/euV dQ0S:BX0zd2DL :떲̕О94I\8yxeC$)DKL#[rB$!gd[2Ù(/} "fHD3=S.A3쳹<*~4ұl2,Yv}Ql߾r ^x?鍊nB _::::zj̙3opXS*(D#'.d3硛 r~u~!t:NʟC-2a䤪ҴiT|v4H'J"b?G 4 QV7P 0x<|84?OF*/Ye"A)'S¯xw,_v* X ebT"JmUSJyU$d~ 8i\RDo](f8lLjeRʳ/o;d'Nd`͟??ͣj*ءCM6|>fFZ;slW/Pyd=d$>! h$ 2|yNM,bjϑ1dϑ[b/ϋmQjO%jM|x˩9Gڨ&z&[>촫neA"G1s0x ,8ۺA2<=@i\d5=kp+V*N=kTx=ׯ|X,?WbfƍH&:u L"JiT^+C8](i3I`JehI msco2izR)Ri֭ٻ ^+6tA}H$D֭X΋O 7pϴ[Ԛ>QN\:n(HL?'rgrީ+@$8pu QJD͠2>jGdZ浽̀u@r(\cx%⬺^#i*]'T$'HJ3'DyYMZFp29o&\SyatA"*#BP%|wjH.3T_D[[OZ466f)W J_4r֮]I& ,m.r9sсn\r%㏋xC%6 qŒHoL'JR)rhiy/cq^ awHɇBe XC!kń,KW0O~omʷ9}ߦ촆32g˿]pt[-z;9)1cL#-`ZCO:^{-6oތo~mmmJ6+}vƸ6n͍IC~U44Sf^{M} MY<Өu]gYzj|x7=pe~+V?,ظ3h8"I#roT #+^'SEp3=ΥJioFy%)Pl>ɓ'oc}!a޼yiΝ;{ŐX Uligp!O24 .uB!ҍmb'?fjl{Q;:xh4 Lj3[Zܷ(ϧz5v\!T;Mպ s)_H$Mq>alWWZ5 ./ػWI`׮]5k| 8w\ݻI2YDrH|nc1>s^ED]Ne􊑕D8Nw W0%&4H/'M5rtho188{pqرcǎc 'N1ե~::XN海X شHF+}8̵Z/GFlCCz==ܛNwЬa gx4\"ҊFK:g1{˜3ZM{xhfcyWD O<7 nIYy2XwzeQ OeF9 ^WL${w 岗*a3E ӘIݦR(a앏TUzdY(Oڇy}>kJr_9e؁}1 Y]]9i )'ԸoRٸ?я}mxqYT0 }_~~GttOGL==@o/qO.`e0`G3ۉDlՠ > E==)CO-MdM}_g  ׉3-OscNI2 DJR*e:UJ#f_{ ΩR[>R7nMzyvn#0Y {pc';Ak y;ުWtd~ Wk8[nail[nea_vߥKYf- `~rb?I~z#m$YuMUlN*TDP,|{ca{v믿577+ˬ}[߲ݯ\TbL_b mgz UGV^EeWzQ.O|~A{[^|ز+_['}ߡWɿ@TFb4A)Nj9eWHP$)BD,,yf۶meUW]&OR?03 ={6袋l+'rbU2ŒNJVoY}'*IM9yY6(|Af?x [g.c?<{ꩧ؜9sɓl)\Q}F׶S›i79㕁R*8?Nʀ(WdRK&uSzy<ҹ?2Н&(~FL|xxY<gsaSNe_d\s e-Tƴ] 齔ix5KOFӤN4.(ԋ,d(.raiY}wŋѣ٘1cص^Vrn 8^c Nդ Rlf5,T^LBel@;_TzwUƷ܏7R^?RwLzkkzѣ9^y.5%Q,N ֮]I& ,mle^zE~`W"-ےW2*kLu-BOWx*K,I~BX60vmeRVgW1*lɥ`ie~2~1a,w/U 8E Ss3UWbH3琾+Voi"_,lT\DKt_(9_JUeY5vW"J9ē 9K2]Ju$bK9S|-ߙeXTy- z#r{Ts= `OOlժ1W(N6f~82Ő2)\MjA|rU^.i򍾭Zm@P(7UTTsJ 9 K/E2[8ڕ*rp7p8l[xΝ.^ر|ܯ_.Ȥޫ[(vHd;o1vu̩DӽR>ݐ 8gItQ,b['Gڃn{~N˜;䦝n|Vufs3]4D!0Mʩ$tt[8Y鹻. TŮ]0k,|VQ?w\ݻ7o^r/V`͘^Bf_6ayCCPu_S'0_~?\XYs.솆I|\.vwH0eכr p j!hGz%gPfFy`ڵh HLW~76r[2)",{ mC!]<.ɁhbPEقT"ν12AH'8HR2ap\dvE^aG~˗?WV> (?b&2O6I"MV9I7m2qNlGj !+S& b*8;=40ƕaTJevv*L^ELOV b?neXJiw7N^/m~z $!? a={$XEAINQٳ]Hw:6]]X֨HZvs/x9fp<2`h(8NTϭ!$1'NIɤ5R+Mg֧. 虢*.l2>ð^z_1JqL>M㲘qbUEU5YZzABv.5C# Hļ/v ϕs1QTHʹ"@03Հ!k+Z!-<͛{)̙cܹs?9m}+ h5Ĝ1n|cuv<1?Ҥ۩S$7 gӜJ.WsP'U|&H6FKל8^̜|*/ MMܰ1f͑W.}nj[%5@>ݜjjzQ`F2fFd*c|Bsf߅:`Jo})AN+I!bU"ʁX,V&Ffn,6e =.bPWU,^Jd:yʴP%4gam۶Y_uUl,J30؛o9,Hٳg.vr &sz2)u!ʂ`ЙoKJS$}^N}o2eو"^B־B!~ *˩7FR?U=Ow0r*{V~Lʵ{;So=;ϮbI+*YDP(7ՋR np!LenU_ g@oVZ|fI  Z' */לU/m!K.ecǎe6l`/2[f 3 uvvojjjÇq6g6uT^|Ev5װZ,ם IDATꫯ_P)O'e1M@8$gd7CؔѨ~i eV].h>7cMItQ|T%RÊtzWa}Rb70UFMF:d" d+c&WQT"*]A!z}E/ *aum(B5eV_4ee:0AuMMG&%ak]"_/ƹ>54000N6qD :tȲرclʕlܸq]|쥗^r<^%?&)I.`U2֩B{:VSfH>- Aר:̜9CS ! [x2CXXVX侢QrSUr23 /b&Ə߇'nlS)7/5TAH)֮'X ^bf\!{Cui5 /C)?c arkoFLn 3&ݓ=*Y&"%`}ocֱ@n9GZE NzBꨃ:Tx- ։)97JNwypuJ Sӟkkdb'W"*$ICCC#TɔDLrUfGFMNOv?Dv"vD2ceq<~"dk0mWM^ |Z>H4ARe_>1>T%BtvnLYd1(>[βݪU_۷o,ܹs};q!a޼yhkk_hhT4]ʪ !sTl0P"o3 i 0{)̾|X eapM/N ~rX4*.F^dm8yjjp\yysGՀq-4*A6mN88~8}Qm~?>ύ4P(_=]CCCCD>Xi39vԔ۹o_.20ɓ "k~nN'a޿7P17ȩ"KFltmMQKL"fmרvxys}?Becg2RdQZ][g8(i7CbՆ'HF~`hqWɢ"_kswuCj$N$-"/}fykv iCNާcu|?H@ Oc&Աc椀y[5[EDW3kh,dO]f܌L2wqǰ]4N!s)) XnL|t`W]. Lĸ.2_PSmq 0nhy}L,Z\i-aq㼣_>rPݦ1.1~/۝9.U + BAw\}s7o +x/z-=CP{ő#GsNQF(fmh/!̙\wJww):8`'tGFo{;7 {sX{'LǢ:3 wZJ!σ{ܞ2|^wCK44ZӨhwqwKK ,X˗Gŝwiڵk`YֆUƍ߯FеXM Lt844*ZӨ,hllěo3X6GGĉ=  r oom>BE/C0Nتdeap 80C&<;N'p#B|s8ďX)}0_1glk|`&NE|,Eе yuwWVv`PM<7煎.(GhO=Y7 pE{(ÿbɒ%Q=jhhh {l {'[>4ðIF1cxkoʿwh1s4'd]Z~ tb~m ]QF% O>$~vލ'|O>$q!,]6l+۷G[[̙ogA׾۷5 ֮]I& ,m<_ _1yd֢ ؽ{wG]dkdj{1 CZ/3'ĭN?Dh"x(0cMM $^ QxiZ[Ptx~2 Ly=xreMWM-LS'ܞ j4*1m4f3 |>bꫯf'Ymm- l̙&wa;3g%KF#W^y\T?a_H4qeny 0JJT*$,mWɛNyQ+1PTHc~30 30'_ƌ#˫ݶk׮ҿYxl߾]VZ%111R&i/%Em[ӶmkYmڈj+ϯ| ))"hW wwk..mk˷oFM6GlҮ[gl1^Uۥh^qnm#P-.m n9r!9 6(b }PuV۟?hم [Fmr?^"M//"_UamKDQ iSq6 |aSž6"n5tN};_—_~iPVNNT* b<%%KO0u`&MpܹsVӿT k/m>v ӧ@||cOv/g8K{qm4{x߷q?]_ _ȵqͳ۵䓆KςoksymD rfG΀:KXv- :t"##b꣣V=P̛7:u2N{X[šgtmh-.:c <<>[?.S}h~gxzj~?+^)]\ʿ 4ž,=b+YoxW]1i(.֜?sFsiY鎠;p=?rF,Щ^oݻ;"h֬RkxrLL V C?x **6DGFVV/^Ç,p'Q/?o*YPԪ.oe7nZ.hj 4.۶-IͿtn2>CKDs^{ډ̽{\]+/l|74?{HŎ#Dh t7*DMDU8p .\5k`СYYY E׮]^{<++ ,#lrQomgOvme.h&r 6>(rYSSˋsHKKK5_jr9N믿_ &"%%%!11ƍâEuV;_}z-Fwww={VlҤIXx1RRR;w~{{ ^28VgT߽4wkg  Ӝvw/?ox]ָux֎ ̮}~qY䓚u3k396~#g3䰞~i\pׯ Dn:̘1(..Fdd$VXapFLV!z7(BQ,^+TX-[ɓ'd ]e2WuT_{xh?k8bbW;v߳nx^66%~Z͗cܮ@İmgz[)ū5r"?rv,a!م%O|[4EvTWuwaayq她,^~uUŋk 7Y^U[o~~[͖nɳ쉨rGΎC)++wDDva_޺U>{{-^ <77='l3u)GOߊx{Sپ߿jsSQ9~#*ڵkѹsg3ꊭ ڷf0@[|YS_d~eo}= @Sm[dn3ګ QaUMzGDGT/q'^z! ޡogkrOX^dnUh.ןiMo{}yM5?"C,ao?9[PoW]Z-[U=ҭ64gu9x w+3o̽T3lK~5i۲vo >?ʱ@'9wz#G;"rb.Le>nn]~6gŋ53k۲+W%%%xѧO&ݿ?>T*b|>I&w(Dl]@Ulvǎ5HM-k !44ވʕ+6++ ...&Ο?o6gD5_x .Dǎ1p@,Z;=GEϞ=ѩS'^ׯ_Gzz:nI&va۰~z{ADT vk Aa޽3gڶme˖!99jfe7ENjN[l-2^zz:FѦM̝;u3QC(9Jd7믿Fvv6 HHH@aa!^x 6 .._HN::\""]_eU!77^z!''Blj5z)lݺޡ)濪9DjY.''* C 1X_~v2fb#U8qJKKcZtt4?O7nٳgQTTdP_e"5G,s!DFF%>|جv 777afoGji/q76רq %ooolذDD Q***B֭k?UW,W_EnݠRpAdff[nou>UfXPZZ %''=1ICLTwJJJ/c(..FDD^z%5/7@pAD1N~~>zmֺ&|D$&&ݵkWHOO6G~3Gd>U V\\ EQXsEV^R<Xcc@wAHH?duDDDT:oEaaa4L%~~ƫf͚W^عsg%XW!<<8pkD6maꏼ<\r?8?!k`\VV<(((=5Gd͚5Cj Jlj\(**zDIcݺu())-?s n݊A1?DVV3Q ƙt^{5d\CD3p@`͚5˳]ָ_~[lAݭfGT{N}}ӦMz*\@36@Νѯ_?K~:ѴiS< ^PnnN6# sf0C#G#''6b#$$&&bܸq?l|WXlA8j(,]'ODCBBbccC!33...={Uo0՞S?4dXz5ESv!??SN#<777{x;wn_jΝ;kbҤI֔Ȏ,֭[HMMd?"Dzn:̘1(..Fdd$VXCVV jݺ5,YB_ ދ3g̭Ύz@?uYu 7oq4 Æ 'r="2=f0~wq Zܖ`#r,7o͛WzK,%K U b#.4¸1 IDATz)$''ޡ5u=3gz nnnẗ́qn˗ //Jp 1b#duLDU3s$$$^^^l9+?"Lƍ;;v;$ /{BDV4h ,]f_|Ν;#99fm#&&W_g}Q-?"rVDW#00SNEBB7nǏcܹٳ'6l؀>};Zq<==ƍ_#;;Æ $$$/ ʿݷo^~edffbʔ)m1b#r|<^XHJJB.]cah޼9NZiiix衇 ~=seK'xb{BD6J!C,OII/R=>0qD[YY1<^ 0`ϟ_7CN8T* :=zw(Dd#BddYhÇѽ{JoիWc8qn6U6GDΊc@}wDDuQK܉ #F0c"Q矱w^;":GDΊ= DLL 8IA0b#jxxar&"gGDΊaa^Ox T@@~x{{;":GDΊ%39+?"rVD  zd˖-صk "sD䬘 /q'DsEFzj{CDTgY19(Xv-Dޡ)?"rVD·z=cs=f())AZZBCC퍸8\/y?D0Y6l؀* Dff&j `#*))/>} 88...ȨQϟȑ# ___u]˳QĆ t3 4K.ŬY_sHNNFvvM}Wڴ"j,]_|ﯻqׯO{3Qm]x .͛71p@Ku {غu+b ARRM-Uڸq#l 6LÇq~ϱ~c߾}ԩSu ѪUZADΩ6K.\nm6\tvDHYf!==ݬm>C<3еkWFaΝ&c#"kj@RaȐ!SRR/LDT+.777xxxRnx+b#"kyDDDs@q޽5C4GXWСC4: 8|U۶mU#"di0anܸ^x.\@II VXuaԩ6CcV?"*EEEhܸr"׳gOݻתm4wuBHHO ==SLIDGD5JKKC@@d$''W  ѻwo-((0y槦n݊رc닼DDDٕDd,ZȬu.w8q"ڷoUVu>}:Fmۚ&yV3((H+U?XW#&&PrSt ͚5ctD z5q?Dxx8W_aٲeP!I5j.]'O.}1~x 4cƌ򐙙DlDDhӦMz*\@3 ˾}>C Aff&⧟~_mPRTի1cVZbDFFbڴi:tC#"+%%K.ũStey&#`̙ڝwމB(IE1u_Dnn.]8̞= 눈j:=DDDDDDDnql?ꊭG]oEY[C>[ı tb~DZ=A;Pp o.'~X9DDDDDDD:pwTڵkt_g}e[쯡ڵk|W-E e V?59rso0ʾ}ЩS'{c`#{X;k׮ѣȩDDD87΄19?:$qDDDDDDD:`ng%%%HKKChh(+Wڤ|ٽ{w-))/>} 88...0q}AR!00ƩSlȑ#M}fyf$''UV@`` xر&c3?k}A___o… m26sLYh\\\Rl2>Ks߆ pwCR̄ZJ#!!Bdd$>c/-cժUxqwW9[k5mܿŦ{2'%󬬬J??ƑkX#ڎMU\D  H~~3FE˗[[()v2)))uNٳ. ~GQT 6muITTʅ ߈#h0!CHϞ=?m۶%!!A%//c3?k-??_&O,+V;vW_}%)))(kVYcl;wN%44TT*kՌ%oӦM($%%ɦMd۶m2eQE&Olq""o3<#_~l߾]>c׿e{f͚IttQ׮]xbܹJhhx{{#2fi{DRIiizH-n޽*oM׺ytQҤgϞE}?ި .=ڬv>QEvܩ[VVV&:t]Z%Vm㴴}-[+裺)Um4cMU$Umo>[Y)Kwe}lj!?^nG999PT2d/صkM36k۔2bhԨnyXXzꅜWڎiӦF<==Ѯ];;wufNZ2q?-kO?W#c>777xxx`JĉmVff&.]^{iiF4i~;Ν;gV;999@׮]u\]]c_-U>8/+裺)5͝kscehϩU$~G>.Z8>:65 t;:t"##bxUZƍwww#))v "&&h?~~:BBB͛cĉ?,jػw/:tc؟&"(++åK6m”)SflUgHKKCff&nvtv &ƍxp`ŊXnNjq| "##zjkN>6mn޼i}裏k>sI>}:t0CUim{X`&sce\зo_!((bI|\q|ull[H:EEEhݺƍ^@L: hܸ1?sgϞذaciǢƍCD $$j}ǣK.(Gff&lق={f &1cۏbu6n8,X7xCw6c?km„ h߾=~i}I.] 77<yٳ1e,Xg\x=̙Hlٲ8{ߺu Sn k?G>VP֭T*,\>ߐ,Y5}aƌ2dw[gz*PZZjAAAػw/'ࡇ2J7F"1c`ٲeqZ3gz nnnEعsٹ[|!;;Fe˖HKK-.\ŋ1|]*"=z4ⴤ'O&M¤I^ x_bFq1+9u[Z{PmX:ה-?jY}ccKyl9EC_pGR *K.u.]2x_jߛ;vVZɶm#Z-FEQjG}$Ȯ]tn޼):tݻY6NYhuj~]+gΜh "տ8`ZM6{ɺjzDXs?,*J d0+eI|\}|DC,O>ҸqcYpɘ1cDQY|1bdddȆ d'HttxxxȖ-[,j{ƍzjYx("CիWիڵk""rQQT 6muITTqUgӒ( ,[J^^̚5K|}}%::ZSuΝ+< ;wGZc3?km2}tY~?\F!ss_jj ?7J~~o޼)$ ,uqIDATm۶+"nnn2qD7%!!AyQEF%]v???6m2h vLq 0Y|l޼Y(78⬘oq׵}Xڇ9w-s[zr'y,[}zKKپ}|GҢE }U9±NC,D&O,vxzzJǎٲ7xCbccQF*M6޽{-ne˖35..._XX[o߾}r}ˠAɓVﯸX  -ZvK/$Ӡ}u16s]w%*ҫW/YlѺ9Ykl9rT*j7rH<""駟JnW<<+Kɓ%22R|||MBCC'~ɡ⯏EscS<p~"""""""5DDDDDDD:`NDDDDDDX9DDDDDDD:+-[uvqq(鉸8ڵ YYYxW?辉\t);v,BBB퍿ؽ{A? FjƍѶm[w8}:Uӧ[nFb֬Y/ܸq#uF8zu999իѮ];c$$$* w.]{}Μ9'ڵkۗDTṣU BӦM^{ ^מѼysbС|n[nߩS8'ŕU.Vt)n&L幬, BQQY}DRK/$OQT2|:-Zٳr)9pˇ~(gڵ 6̠oW^cж(矋ȕ+WUVҧOٷo={V֯_/vׯ˔)S$::Z~wVG2d9p>}ZO.oȒ%KK/_.2{l󓸸JѣGC_֭['v˗EDEQĉv:$O?$""#G^$77WΜ9#? 8P֭[""r)QE%//ON:%Çf͚͛7EDOOOyرcrqYh\xQDDO./Νe˖lܸo"hUAAܼyS{=qqqm۶{WQFʏ?(vW^yEdӦMrI?~CDhZMr`ǎEDn3f^WWW?9sF,X ha#bNIHH%tiӦ-ZG}`'xB&NhlΝ".]$%'O(&Տ?Xի&cO`Z[l 믿 GFF4*?or(+Ы"";vٳg^6mtE#F?\iŢ(ݻWDʓ~[رc(8p@DD%11d{%%%-7XO.Q-1W>>>ҨQ#qww___YfQLrݲ)MK"]ݭ[7?~7oԭoξ}`T*Ͻ qaxzz"66V͝wމMVKAAt߷o.]ƍO?ܹs#G{U^yabU>|8/_@sdvv6J=v;~~~ E_t KdGAii)/^_DT3̣U[j giӦشi:hҤھ>ϣȠEQХKHDX5sr3g3g3xTߦn$f9T|CD0yd>gϞ5kVi,}j0ƪ]eeSu$$$`ٲev c_OFvv6v سgOmWcǎôiӌ^k߾=<==q9]DdQ x7Wĉx,vo!!!hҤ ;YsZ={cǎ5ꟈ9|@ߏ 52[_mKb'N3pi|g7oƏ_6SNE^^Lشiy@tt4n38x F ooJ|Aa߾}8s >s,aaa8u>/⯿}݇nݺᡇ¶mp9۷*0a>cXx7PPPPƌQ_rrrF@kƚ5k0|JlҤ ĉرc&O\eL2۷o?cǎXp!R0eL0+Wٳg?bOki0ƍ?yzzbȑ8z(ك'⡇Bhh(Eqk/S0ydbL@g*aիWǏ_{8s -ZZMu.ntgϞ3ȸq_7n,ӧO7Xe˖qhٳG#*J<==%**`B~M'^^^ҲeKcԖ""#xzzJNd"+'|"";'M$&vQL+=zOKBCC[yUVV&iii/2e1b'#ŕg͚eNIICz)׮]ŋKG  gqw`o¢իޡḲ5k>* LD9/q'Q}b%"gHd:YDQN2ADdQpo&2K܉Ϡ9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:+c!UIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BayesInfluential.png000066400000000000000000001377201176542545200230420ustar00rootroot00000000000000PNG  IHDRb*!*-SsBIT|d pHYsaa?i IDATxwtTLz#@jEE@"  <чć(EA"TAJ"B:3v dֺ+soܜa)윳&0 RJ)T3;zJ)RbJ)RRJ)h RJ) )RJ9bJ)RRJ)h RJ) )RJ9bJ)RRJ)h RJ) )RJ9bJ)RRJ)h RJ) )RJ9bJ)RRJ)h RJ) )RJ9R3 ;wrI jժR<֭[G>}[.f%K8zHJ)Ula0c Z %44޽{ӽ{wj׮˨Q8z5Mmۖ?)TXVF|_8 '3Ez)7}vTk0 у,f3/o߾RJ]&Lx +zKT~|||yJ]tFL)T|G( Xǜ9sqtJ]?4SJ)U/ٳ'/sg=/S|YR&+gϲb qww}͛7ӳG;ږB嫇ܣTy@L)+9Y/_V=JNUBp Jk3/*) lK8ږ;]\kjP6x3:k9\Rᒞkb|MKVdtGє4SJkTFXYYs,Aș32c2lV@4k&eüVIȐii[buv2B`FÜrsr<.IgpK-,)'z2.*)5";bceEYDf[H O%a>I̱'q?k)\{iܓN㔓UIL,g*U ĔR$%%q̙U/aH<#A_>>.^Pε5e‰9^{p=u ߤh7%;sV%k]Hw#ݏtw?\\d$lF"H4QǓ4Jt.M1*իW3y'OXW!O>9QFQJI7 w_5ja+3,T"y!N?50gPbgXKtO}jQ&}jQ$$ jp@lqUHI5,eE0 .eڵ%زVMJDTY/À );c?8ڏу'tEv ,ɭUT@#z 6@B$6ӁIFtm]|R֭U+9Z󨈆J:'^^\8&Mk2aâ/*9 ĔRGժ$%}|JP̂U.SSa֬dz]/ϴZQؽF,ne` F͘,`2anMJNw"&&9ja̦]N&жm@h$;zg5gޝ4 8ϟyXر.$JG1*www}̜9ދpr0{6L@\\w\xJs23aرCtw:9m+0'+f3AnwXN쌩ƶmg qD XpЮ<׷DB1ʹisT~2v$4U>|SZG:bJ]{ RS %)xxxzu&o˾}pv__+WN֭ ""d+7Z{[^{ğjnu*˗ßR#?9;Kթ;J*?Wa`@R,_}s YhH>}$jFUJbJ)U$XnAjc,eV/0 iin?9ލaaիLoo`QXV0hZ][$4SJBX2t*99],*˘ q2#i>#Ng_o Ch#Gd믥!7-۔R ĔR*Ð RN*VřXde`9|A?'8%]T]F[oNd_`ϯZ !<\gi R0 .S r\c֭g;`}n FTV]y I-f= 9_J]O4SJ)$ZԁZժ3(!_KPs|<41oru1cছEuGI%i@߾waU*3 ĔR^Vc˲s"cb`w +7 7ԩc£E%>~)[L&x=ӗR6 ĔRZF,ը!A xdx?0YG|눆+VoÆ .3qɦIw2J K1T#^gW??YE6D[JC^0arKH0$yDWjRW/룡R4SJUZ'N2TgbK?ݚp}?(Ð*;)YSfvD2`JkbJJ0$'l&hTf.žAo53ԑx%hҤ6m_k_[W w"?eK[$Te+* ÐYoHgKaV+W!,EE^E_WOz=q,Gk'RbJJ0$;sFV&XaAe*{$ѫiIH7ސ:` c߾ֺoZU))*Ð]99y{d= n+/ggOx -\6 ^y󴎬U n][vRR:ge6CǎYMX'[nz۶pm>{:x ص~SV.!$D-dMgR@L)u]ZR0o1}S\MFݺyGp2>{f}Z nnRBKR(.E1ukZ*$)^i9nVWw?e+E }62dx8/^͚5l7PFJK1uX 22HҘ]d"* { ~WUT8~\nkJ)u9);qq.Kfs lj5J$4O߳gY,'R.,oS!C~z:uv<4*bJJr2LOWrDM_~y\ G}3^Q賢`Ĉ}!ׇ/]p$7n,)ίR@L)uʒȖe2˗ȑpD_2E1 ٞ~Ο_))S,ؚ5-agSJ]w+0e]vlkEy ݝPVXQUrZefukpqSZ,Cy!rfi%8):z=kPZ3a zm)JNb7o< >GٓBg;w.f"**'|A}BWJa eZpzw0t7շbmR1c`N ?$F@tﮥ)Rc2 p :tsL4µmҳgOyW^>#G^6x`ܘ={v{### '""!N:$e#gK ޓ xx1I7F($,;^~YjԬ 3fHHÐݐ.^Fi>R4G^w{lܸqsswͭLԕ> "o-gQ[0%ˋEGeZ^R/Z5 ֯ Ц$+TYٳX,jժz͚59}t;4iYŋ_~ԕ;^͆0{¡GТw0#G-[aa >X&!%EH&&JN4SJ-+S FÆ quuA?z.ޤ$xA O"Vs}Zg xRX1ΪUիׅWg«qTR*UÏ?_T3g!!!|VK~c0Kx{ôi5e`@I޽t ͒2kvaAA#3a{*T@~i~a:vH>}:QQQ=Çxa֭[%44x^u&LPl /g0}Z0>K5c0hyg <ʹ].Űq~YORJ]-WL1 <&L@ll,[fٲeS1&&<c? &p|}}ݻ76lJ*J]N¸L6ٯ=|% 0,_hAh(,Z$33a}yp4F-OXuĔ8Slgȑ̛}H WN ӧۯs||:%I;vLzILWJAgĔRی0f l L Bvl$AwLON&N6EfX<<侃Pk6)ʏbJb瞓^Ko`>Ԭ0kt ?x{ȹ̂#l իr= )ʗbJ'%E2ԘHqf} ..DEIP:4kW>%L*Kʝ;I L)U4SJU,Ѳt̾?'Q`VC J~ބk .g? =[/\X >mR1_0TEJ!ҥrn2aL'͕{Ç[V0]ck\L,KÇK5k$cGm[X4SJ$֯sWW;zYfVfӦIR},aHISY)m'C,A;|6VJUo 7ɨ( j(OReJ;)J':ZfbcmAHfSr.lѩp8~\ ŋ% _@k͚oYlذ>RJ]:#*X bbukXUwmIZ59S^/9a;v} He6mի:q2!틪UJkbJ9{V.>,͚I6Uf\]>ܹ?r$_cJ+"I]{yQլYִ4ZU֯=al ~Yb9B3gJظq;vȮɎJ4SJ][%Ո9SV*Pv*_~)krsH o'3>v -0馔R, ĔRŗkyYHƼ$/^,AVX,K|䉁n,?_zzr/__RzRx C:n{{Kf}~:kJ#%=޺jriS#Iޚh T<=,EX ;駒RO=}0`6)YfהRzⰿrssټy3[l>}L<<,oI++O]3fO?|}}}ׯ<rK9P)wϧNC`VشI*]Y#KvMey&!A7i"RzTn… y7OFLXXmڴ~FVV;v;wcf͚ŬY W^a5l*U篿=vmMmͷgϖD EjruNJRdgÖ-٪U,(%ԩ6mݝ3x`N֐oYx1 ofÆ 0r*;`R[l5êWO?ٿ?e t"srdvlϐrshRW.y73f ~WXۛ2p@:u*HRS2>+rbnb^^RuRPqO>i/[a 9wqͻxtNf{!W^K vQTR7 F*TReoݱiƶ$i6̘ɣ@'M_-)۶_OLCW)TS.eSSJ#;[#KݰLMeeQ[N5h ;$]\Aeɑ>Uh^RpX믿7|S{gΜoquTeg+r/Qeߖ"3a 2e+S!m 0}xپ]|SJC3fޯ_*HJػp7n|ٷKW*;q{3f@60`46n\$hV)*kb?aRWë̑ܰ˰X$mL{-gVLJQ[iid-R5:uJ”Z3߷wᾌ)ܚ("ϟݺ{3%o_ZaVY̛REtݱcDžbapfٖB 9|0]v-q*U9K>H}+[%UZ<)օy쭊.YEq]ړR2)@lѢEȞZ'"۵-'Ȓh-߿?p>k,4iRJ2쳰|^]WZkƎ<;[vR;k #TVnŎ9ïR0yvq(Sac2N矷O5m _~iB֭ ;y!<\KU(yN)Ǻui++ ?(-@ϛg~I?SHK;޽'WfSJUbp4lؐ>>6lŋid6e]vlذ[oE puuVZ;rRy=*e)rsw.&E6Z^|BCel^ذAV9;u[VFKpp09>^x޽{ѠAc,YRFP)A0LNjd2_N#+ܹs wwwc޼yFttK/ޗ)S OOOcܹFttoAAAѣ aFDDJM5֭ CV GɹGXb͛,KL4^#-#NN5;Xo,X`aaV2Lކd2۫Rs،͛iذ!AAAEDpp0[n->bر o%I]U6;9ww%[߭a 8Ux))Vvf`23ӧO/ŇTJk*UW{gϞbPV|k֬ӧ }OϞ=8q"7t4nܘ]2a„Rbx5ym2IO+,eR>\RT.v^z05~BU5+xJ)usخnkײuVڷomFtt4lHQϟϫʌ3СQQQ]=X/ԫ׉pgRiMǦR:bC aڵ<4jԨ=GpT`+66ڵkw}ѣG3l06mJZZ=j-ǎ`h4 AXXX)>4-zzbj]wy@Lm@j*<ō1c>s/6VJ)GqX 6bfΜƍiݺ5 cǎ̦MXx1tM<裎*j*zY{Yz5=/1ÐE,f3999X|ڜ9s 87o^O* Ep:$mȴU1zH^l| RlliO԰\['%+bc cڴߛd?h0 ȼT_)Ui9lF Zj,Z[dGJJ >>>jՊW u,[B8q"Vs)WN>}Tex74oÆAb7l~*;#== #kJCo>l@yDzxey%KJm%(/}VV  dHy!g;v,'ORJU7R׃lAOQ[x1h̄a@)Y{$kL0n'79uG<<<3-ZhJ)u=px viOκu8q9r-ZD||}dq3]QQp]TJ+@,11:u^0TӰyn@$%y$Paw-; WF]> {@&WRN8q, ,vЦuo2E^?B%zza&s+EZLR.ÀH' J)U2 ĺtɓ'ߋo!--[oFTke?2JX8#CZRa 6p ̜)U$ l;rDVFåȫRJ+@M6նu< `̙7'''ƍWCTbIIrc^|Qv:__ӥ\EzR%ani}P!(T@odҤIqӨQ#vލat҅5j0b222{6QcSr~-2`ȲwHb/Qf ;wBPSJ)U: nV<==Yhԯ_;j8JULg/$%Juժrƨn]IwqI;k6%RJ<4~zΞ=TfH9{խ믗q11w?3;&cRTpSRMRիWtGx*_ }W:V%'=HY/ÐﻹIͰd;RN| *էRJ)o>8!(UqXo%`\JO% d7e礇zv(+l3a{v}m^B)T8,{WiժgROLTZ5 9mɪ/}dgRl>9"!-RS~|<=*yd%RJB8,Yܸq4mڔEN˖- +1cF9P)Ζ9{ďɑr>f t/rv1cz{Ky EjIVRea̙3޽ݻw u$q ̙%n !7*K⽗wT"?sFZVm[Tѿ&]TJaؕU&W@]-?׮RgZ?nVYI3 ~IfBC% -MRˏp؃5ReayK{+U>GIȐ%IE_~55k{5jH|xIsÐ4ooyRJa!(U1df½J=za)zfkO=%U׬ɶ'x?ul\D/ʨRJp_'OmV*H@ӦI_?ewLWP3gdҶ {@FRqX ֨Q#l;ÔN@ ǧďKN# t`we~n,G ̚lYa(*&b> QQQl޼QCPʱQS@֥z Ǐ[oIIl.X )%@\$dRJ]} &LNYx1xRfkCJ`y#Kiieewl3 )aqʒށQI)]=zbϠAI&Et֣EkOn^˖z\||ɵɓ%Zo$g|N ڴ)PRJ]bk׮w֭[4_!͟2 =Zf@?0+-+-p툴1eg,G?.$K<RWaؕniAWu]ص ~R1.~~TXLj 7ٳRiI؏_TCQJ)uuQ?Z)HM 912T>>H5%G,-M6mcR@bзo_V+}z J*{GDD˖-m_JUtII-O=ꑶ]1У|vխ+_ᄏ{Ϝ3U٤RJ@lڴi\5k_sW޾+Xb#F`ʕL6lT%q9"~7F?͛%eKزzм,ZUJUDE)r-H̚5 K}]tifL,eA~Jȝ;W3gdۢE䘑!n{OD)۶4VJ)8 K-/򾰰0BBBػwo9L2_f͂ JȬ,5Y IDAT6 rr|&I7d¥aHp 8L)TsX fXp)fWaVUReY ͕  OغB.3b _]6_&%w֭R %y$旲RJ2@QF޽GyѣGٳg /.TEdʴՉrޥ vq#vqٳ%<1//8x (6C$FlӦ+J)ʈcXׯ*ү_?, .*U ˗5vX)`p xCv;Ι#AYSI@r`~ikX(*CK?~m5q"t^i 9kLAx =[^|z̚HW%H)*n^`:t+WrAYfy4jȑCTrs%#_{_I$k:ֳ',Hz='RJ9^"ԤIh;uzeX^^JV){T̏=`xMyrе],;[ΟNtIR)*"0Ti,^l,$Kᅲ ` R{Fݿ"Uޅ?a)߸rUJ)U8,[jv3f(򾯾n5k֔*(ihбc?n?:Ucb $DO$$$\Ϟ]phժCRJ)u8,/Yf :u*Ν;frYѦLBpp0k׎ 6\nݺa6 wAqO`25"KCRZ=eR"ˊ+VHP5l$/X }#oDDH~^%UJ)u97Hf͊Yfԭ[M6.m޼y<38p=zгgObbb ѢE>}±{n&ڵ0dj9oO/$O?uGɒObر H*55p`g$;;ۛ+;3fuVZh#'""Z_RյԏMJ!o [{ǏK֥4ؑ#p,|ԺaJ)umpX 8p ׮];~GΪUիׅWgϞEwdgg_2jРs!$$i޼\?K5oT/O>>jՊӿO??Lǎi߾=ӧO'**ѣG0|pyw﫯b.CBBtƫ)+ރ[o-G=|O>Hyrse5tV0La@d,iɬXa3fJ)*&trr<,/(j{bHnAO|ML+'ULUZdcZf.)$"H( n"2ls.9sΙ sύѣGDKP`Μ9̄v `f&''?Ğ={(DAH?Sgd$Vo^ӧya,.]h]QU;wN5)j)ADFF"޿ ]Vqu\v h߾7Kԙ,/$nCDֵkur+J%ZUݸqbM1uk 9x[՗$]]l "24z'xҊGΝ;1bDt> K\0@\'̀}@2326VP/UY^."dZ}ټykNQ㦗 ֣G?yU^^͛7gϞ:;Y1k,9~'uǫԩu;ofo#b:p0oX W&N_AZYYbΞ]zZ Ky&BCC̙3u:̙3?><==1fTLFO?ҥK|W dyW_ 1/݄t|T*x\Seb"慩I)+*&F+sSmqIC=ȹaDDJ/sĒ|r,Yǂ ꊇ~ݻw`aadgg#=='NÇ+ln>f̘Iao… @\fbu1c30wnN> //`a# ,XPgq K;V\^T=*g@%I++q)3'G\¼x""2z bx70}tDGG믿Ʊcǐ 00/"&Lx?1ҟ-[l35w"n^8w+n1Y3 u(zK*7ÁӧE0?.K?k'5UL0|Y-Hzk&M¤I={رcHNNƕ+WpmXYYm۶FPPyLj$anwmN 0вe _·~S[nRnt 5U͙#Fz{vuݻE{剛8ĝ2e:)X 777K\%|iHef&GWII#Dii!ZٵK#n_=JJļx1K=w"1JnWqOr11![7э͍aDDNA֭[سgRSS;vİa`U>;wFYYKWl߲Et2A?cNuT ,L$xѸUG :uMMż֍"v\]Er36h_V&֣0""æ }vDDD,Zj O?>ˡF.,, 3fD@!F/o !DFn FUս%t߀%K>Jnڪv떸䚝 Lٮ 1R-:gd@/."III=z4rrr`aaׯ_?'N2͛7S I@$AK05O5j'WİTRxܥQuM/_^x^s sUV\"0@s=qJ3٢(QHJ0""c dCff&=8\|!!!())-“O>II CYY ^x2O ShӦv ܹ* &fTb٢kADhj2yyb=I1(w'hY`xqdQNV["""-w}{oٲ%aee27ϖ3b`kSC|>H|oj l\y,\];ў\\rHK=](+K<'2,ߝ;%]|~~~!L8uꔾ!bjjiӦaԩHHH+W`cc+&-[ ZT􄵲IZZj+bzo..@w+.[۴-E}a!/K bXYYUJJJU I_dda'W^ IG%I}(=&& j׻uKtItP2  աٹѰ+uPh@DDX1"^ >\gsm(yTT{ōQ/@˗޽ u rߡ0FDdPĮ^ovYq5Ȳ\j'NlXS\//1/.k1oX_}{^Vj: a}\wQ[CW"xQPw?}Yu' ^ԩ"|4n_YѪBY1VTHˆ<._u$ ^y!CčUe`ʊgfZ0""c FƣD ITxz۶\<CYɪGNōjc6 XHN .g#"2f bddYwU+`Fۑ;'k'MT\Au*6.03ǹsasXd#"2fO%H@,/:mS%_xAꔖ}*0pQ&ɧk/!Ƞ1s`b$6}%~|Uݫ?Fť_~Vmˆ^$öyf5 ҁ"">8PGB?}&&99SqM-.Sք!(0^Jכoӧ% v$_2ьu>)}[ԪH2~E1 12L "E:}%_(Y[֓eT/!GD[޽͍[c]'CQa#?@~xc_jvC}@,ⱭhշP+*?ѐuq@Rp*tFqq10uDhUˆ k3t{矋lb-m+SBwbؙ34\]]Ji:||2GDDd4x$ׁaD=xΝ̙w!z|ܽ$ł⒤sn/VGƈGp4kv_Dǎ"1Ֆ5  >СcdT1 u$r%FӁ GpXX/BK/:thKz֩S*KrNO[7ʊZRej‘1"" FTwG=ŨQ"L@۶ҥbڨn&&#]$Bݽ7Fj’ֶIjT*q)Ntq/,kPpㆸKW eyYܸ8/S4Q7kO{ 74;פLwѸ];g}.ij{91.I8,Ql ̝ݱ,:on-ڙ>,.OjLίCNkÑ1"" FMƍm*ƎL[=@VA9ك051"" FMҾ}ĉw|ǗV)VZs.BQb&'1Q,]Z*;vQ^dfye^^1 .QmSc#"2: bԤÇ 8Pj?$FBBӧy\\QSM곀aL'""1QqXUM,mi9DӧEdqJM_}'}W>5z b$y`ꆭNNc5[Ei)?]Ab^X@^-_V]{V]c#"2(#FF/7W\LJ[ q;8hr#֝lB,[\ܲyR+>~_112jn^ⱝ"j,O?'=h[CCkS7GHttUƮ]c#"2@ bd)ڊ;uy#j=&.QX[~lf&p0`/_;,UVCj͛:u*aaaoooرCO6moO? +[[#vRv K 4o^*x^?5 ҦM0k,_/0rH$%%EoPRRG}_Ѷm[\p6>>+ w1.ˁ͛"8XeqqboGǺ.5ҥK1e-V^]| i&C}O^ڬFaHⱕR**wVfeݻ;jѣ=^&"AH5W^^c5v튋/wީǏѫ|`@=8ic _sNH!׷nwYfe'Oum""jzĴSSJ_h׮]8;;Vc7n޼"XItt4tRm>ѡE+'c[[qYsqcz:_:UtQ JJ >*ՆAL ޽{R=&&#G~aRRRЪU+q.]8UYY"p;'ۋ Ts;xxˊ~~,]TE~OϺ>5M(^7oFzz:~mb'bܹGFFʕ+={6Ν;{b…Ӄ9{VLW6mD0Y#k;vvհ~d5RR4qH[Rhh(rrr0gdff;v!v8;t]va̙XbZj_?RohNjyyⱫhQQ׎jb$eKէOBX~h.K"""mI,J%$$ߟc3_ &ܩ}kmjcTsZ*AW5]4I`!Od}CXa!sq]C Լu[~`m ,Y" #[߹D+.~gE'DDD-dP&OCB"N` IDATP4~-,n^|A*7W>h֬~u156n&}}iXFܹn *dˑyyŋ/(B%ђѸ!5 W x6f &"Kd22Dﱼ+WGr1^DOW W""شtA,S֢0cF&2g!FĈtA ^q1phjc#F\]iww,`7~<`k12p#2ս;+6HL}~ʈ F\8sF\X?_\G-m*1uKE`> #Gą =yʪ̄&""ƊA.])S 44Xhzj$ mڴ""""ĴVRR :TcСCqj+((+1l06tDDDd ̔.PdggCRIc{۶mU1||g2d9ݻWWTT8}t5 5 bHj BPPPh`Ŋꫯ*Ə_kǣW^V05 bZrppiѯLkN#--Mc XYYU{O݊&""FALK޽{R=&&#G<'N0n8JDDDA`b͚5HMMɓ'NDxbᅬ޽{SNNJ+e˖)6`P`Μ9̄v `fv#r Ñ +++b׮]P-Q#"ɲ,+]QS>bDDDD a#"""R*,,DBB .A6?g،"1#t̙3J ߟa3l BĈ FDDD1""""}6 W006?æ~_JC`#"""R ')AH! bDDDD a#"""RBČHYYеkWXZZu3f .]ti:j*xxx8t%Ă kkkh!!!FP>`̙J3.]+++tJoFTTڷo ୷ނJRz9px o&&&ضm[}͛FRROM)04 bFXhRRRgdffbĈJ6m¬Y"99Çȑ#qK{`xאXX[[cȐ!(((P4×_~ݻC$щ7n_~+WUVJ.6l؀5k 55˗/ʕ+'(]Z⡇ʕ+ҿ?+WڵkqIxxxG5kzw dԎ?.K$(] 4S~7ܸqC$I޳gҥT~~ܹsgy޽A3g*]NÕ.ȑƌ#7NtG$y۶me'''>VRR"iF/(bL' GČ\vv6$Iҥ<$$$`СۇÇ+TUQQ:u*q 2ѣG>>>Xle̓O>={ %%_x'LΝ;+Wh177Gw `<' 6booqRPTprr޶m[dee)TUÐe3gDѫW/љ7"11qqq*_2dgϞҥKobCdd$,--tylҤIHOO7̠Rxb3FtN5iiiJԠ∘aggWVJbʕ(..6?t+Tn{SO:w ,Z W[ꑰ,N*f͚ӳ  EJJ ݋-[*]NXXX{}*TnM6 [nž}t9:#_ 㑘h! Gc[JJ \\\HJKKajj Up<<<񻦴25wPqD̈T*}:vQuaȨ܆,PcS-[ GnnΩoU}[nży_)PGD d߾}xꩧPPP333t -Z@NN;8lܸ׮]8nݺu8p\횓ލ:4vFtve˖󈈈@-tv^}򂍍M%nn݊oѣB/11cƠGƊ+ЦMsssm6l޼^?}Jm34p+]QKD `ǎA6mE8q"~j ܌})A={ЩSJz 
},I<{*'jxit . F{9ۣK.x?^?,, jc,XpA̞=aaa;::7ڵz˪QQQxͭΣa9s9駟g7ٳ0a.\++ݱyf`ҥUh4o޼bۄ зo_ܾ}111՟Uhh(<==5cccPo߾*cƌ v܉lJKK?@$ Qy7o>$!99֭CXX:w\iTJԭ$I={;Q_ݴiS$Ix*mB-7n[lKU>.]ܹstRªo8w\6g{:YW͚5ѣQRR 6h<믿"''m: Q4hoߎ7n`Xd ^1):$$Dc.HT${GRjz@ʔ)S`nnw}Ć @IRS۫tIbDK=Ὺ Vz={"!!:tO?O? uY[/"hPrcUAHc̙ {{{aɒ%:=3éiy$)Ɓ0l0dff/Ѿ}{1gΜնT]?'] +??$ەgzo=طof̘[[[l۶ fB@@<<<*տxyy_aiic 1m4@\\Ԭkj[;wױsNpqqݻ1`\~NSf IT*ˡR0`~={{{|駸z*?˗c@DDD}hCD~'иs41)Dvu덼*wngkkaÆGrr2[֩]ֵkWȲ\1bO=zӱw^;5khu'NIaT*[/KՆAԺϡC;,emm (**}aбcGc*='rGVZn ;;;ܸqzʪF%ܮ3>3T>}c1|pdffO>;H bD C=f͚Jnݺ "::$UX>[5ѣqy|o߾3fҪ$I9r$dYFTT|cUR 8z(v IЫW:բK;v,+`ܸqx?#f͚|Xp!2224V|~Vuu7n\s툚N ]eYϜ9#ɒ$-[vɒ$ɟyu>>>rppUQ /P{3?N$I655{)8P4h===+ҥܻwos q$I+-[si߾$?C\\\ .hdKKKY$K0`SNU9%@dd$:uꄝ;wѣHMMŋaii 777/2[؇~6leː$HT1PIdٸq`ii?N͛71p@,^X˰Ɓ0w\>|'N@=j*}zc>?#GpYE:t(1n8]ZU?7n_B$K믿j*lݺOFjj*ZlcС0gZ<  )) 077GN^CVzOOO/Xx1q9Ȳ!CTcǎŊ+;HK,7{Չ;7n)S(]Q FDD::@$\|m+YDDGqq1ˆ1""D꫸|2RSSacc'OVU1""\8pٳ'~g0:B8"FDDD1""""0)AH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RXZ F@@:T֭Ɨ)JJJX15V bui&̚5 ~!1|p9.\͛#+++33z+:Xt)LPbѢEի=F$iF㋈`ZII 0tPCÇ=pttİaХ`Rvv6T*4mYYYUv¯6m`Ȑ!8q>J&""FL $I>HII+W_UlƮ]++jR IDATNDDDcӒLMM+~eff]vZiiivڅzl||VX8,[L.]pċ aP`Μ9̄v `fv#r Ñ +++b׮]P-Q#"ɲ,+]DS#""jbؾH! bDDDD a#"""RBĈ FDDD1""""0)AH! bDDDD a#"""RB̔.k׮aΜphLafBP/>h.Q#pU> (GRQ<8ƈ/M5 g0aΜ+ Q#ph\qDD`ؾpttDl;}޻[W+8޽qqqHNNFVVn߾ kkkm £>@}GGGG]eI,W7CXg_`ݺu8777DDD`ҤIh۶mV#>>zR"""ғ bX`+C$޽;KKKڵkHOOlj'p!AeXYY_ƿonݺU QԠAyyyǿ/|8Ξ=ې%v""fk$v} q5K#""g}6l@XXXݱpB!,, ]t2z* CZb#)(MpttTJ""dY]vŭ[^ũS0%$$ի4Jnݳx6[v.}EJJ ڴiվHMMm=w5<a{ǩSpy&N:-Z2jL!.GVDDDEAlذa(**رcW>yyy7nn߾aÆBjT^~y"""â-Ν;sNxzzgAϞ=+W$&&b˖-~:Zj{O%R#䋤#z$""pi?Ǐvz}|},'ڵkg A3P:v|wMARd.]رcسg^{5<2d|I̞={A||| aVCiuƍabb~+4^݄-};? _'! "#bhӦM/}Rq߿?<==Ѻuklٲ>#""j3DK.Ŕ)S WWW,Z^^^XzuǨT*7 ,'y^,{6l|}}O?/ UxWII 0tPCÇ=nprrBDDCU&+Piq襤$;Ƅ ]lT*899ilo۶-<СCo_ ѽ>"0wA\\\y]֪ V0a+j rbEEEݤ ~5A"""-^0fU<==ѦM$$$J`jjZi+33ڵZZ222OTl+//Gsu7Ǐ_cODDd\VFළw^Tlȑ#+ߥKeYo,_:t.]T["""jLnܸe̫Bxx85k 55'OL8:tŋaiiYz̪zY[[#^DDDMރ#.^X~* PUBCC9s 33~~~رcGE .̬~zbǏ? &^|EFDDDOzosᩧ֭[1`#88-Z@nn.bcc0j(<.H/$IƍcʕEll>6m}}GDDD7,˲R/~eرOF^^Э[7I.!!G^.Dѵ&K/)Yb$B>"v:)KA$i,ː$ *""""?FJKKqUT*YFDDDdhk|=fϞѣG?OaDDDDz]U/ ۛwVQjwM1nnnXbҥ5FgΜQ """h͛7;;;K!"""j.`߾}1b 1tPK""""jzobbRkK NNNQ)rdM!!!xʈGA\/IDDD(5>bDD\v s|GPVf 33|GstyDAjtU> (GRQ<8ƈAur֧$" al5E3#]A{wHʲbT*UCGDDZ8z4 b$*q{,Ȩ4hi$(++YFDD rdUL($Iܹ;^=* j*b"VkDǵ^w-IMei.n\PS@DDY.yP&GA3Yg0W\ݻwquܽ{W\Y p)#ST7PD,dg᫯͛1zJ띜`tG{=c#>>1bYHD 4<== 33:99iӦHNN>3gΠgϞJ!"Ғ^Ez):ߚ${ĉ&666~4'c #ً%qXZZVݝ;w-[ʘbcc)*$ ` <3f ݻW6رcQRR˜Hʂnݺ֭[c޽f$l߾]prr38FqIGGG"44gϞźuܮG| #""KgMzxx8t8K.͚5CN0x`*H6=[pQ%`}""""zH;bXn;ׯDqF;v@~~>BCCѤIbIF;b;v@N0{l미x"IIIĉ?*ZW3,,,ǏW?=zE055'K>%%%aѸ>ԩSUNo#wjEGGcƌXd `dggW ,X$aɘkll, `jj*EC?>-ޑ >HKKDDDDzE"6{lt>=ސ}iбcGر^^^􄇇6mZ>_ !O*_$qX]n=DDDDJ".)!1"""")EH!,bDDDD a#"""RBXĈ"FDDD1""""HqIȺ>HHZ6l ٱYĈIZ:$ቈ EO4'"""RBXĈ"FDDDIT*SՒH.:Hr\$-bRȠqBXĈ"FDDD1"""")EH!,bDDDD a#"""RBXĈ"FDDDI5RtnZ4DDDDE"(J} """"$i+//DDDDcĈ"FDDD1""""H:F_'ߚ>>Ǐ!/_#55:tP HK9rݻ7e˖iXxSEXd yDxyy̙3ٳ$ىHHzGO˪3g@PLMM兘 :TvO> .-QNNN7ãc?[x"""KJUYY^7n̙3*cEDD <<ի֭[˗/cĉ0o^ ʨ(̞=7oF4wӚ7oMjkaa/""FD"m̙P|嗈>T-A׮]o>b06%]f 0b̝;gϖ5;I;wm۶lڴI8X޼y5#v=$$$)SHV077ǬY0i$)C"VӴ iӦpuu?,--eLFDDD$/ًܹs>%^tJ€͛7ׯDDDDAoMΛ7O/IDDD4I޽+) cĺv튄Y}ŋ/_|QwJ^zرcRH>؀Э[7OKDDDwd/bGDDDDzIyĈ!1"""")D1bDD Q~~>"#`lOgDEEFxDXĈ)//}FFbQHII@l(EQ$Q=͜ɣ拇% x\8"k,bDDw5k{?ZODTQ==x`=Ih=QeSɱnܸSXDDdl Vz"$-bk֬ pg:ѣG |:NHDT>>W6z"$ٳg7bƍCPPnݺPT(//GAA^ĉ_ ’%KKDL"; p @9xBTTHo (Vw?]gb l߾eee\4[8&&&>|8Oc*&11^^^8s zt"zG,E;wk.>>4h^}UlRxa#""jd-bOR(,,DII aee#"1""IљЦM%#)FsssC֭ADDD$ .bwݻwADDD$ .bDDDD BXĈ"FDDDE ƃ3U&yv3'"u>}F##c1(r$ 6vYƈQ999i)YW(>D?fQ }l /22!22 |B鈈#1QOžDdRfmG뉈]rES{?z"G&Ĉ XDDMcqrZ""""˄صkk .]BΝ[T˗/ɓ:`ѢEpssÚ5kK,Q`ff&sZ"""w1ݻLƍHIIA{OGR$&&"00Pky`` N"""yUYVz?wǘ={djFFF~޾^Ǯx ƍQv:Y|ծA/)Cj>|:vŤEDDԈH^ PiʇzºupeL8c>+399p}\~IIIh֬"""#GH} لA׮]o>888alKz .AtR,]~~~8t"@DDDCEQT:D]߿yyy S:$&&ˋ񉈈ӕ bܸqJ """7+b``7񈈈dEL=+,bDDDD BXĈ"FDDD1"""")EH!Y8+5?[׶mۆc՛Eڵkػw/ ̄h׮z聗_~ڵv;;;IG"VXXiӦGyyyM:cƌ+ЪU+N">} ##`oo>}}hڴ)p5͛'NJDDDD;Ȁ=V^aÆUrܹSNťK;`ǎrD$"""ߚLJJݻamm8U0PT>|8`ee~ Ν:""$/bСCqttĿ/ٟ}Qtƍ 5ѭ[79sFX:QRRkpppYVL;W^yڵJ®]*m3w\kM4?RRRHlj>ahX?/_ƢE"''C Q:NDGGcƌXd `dgg+Μ9)))PTTt4;u t (G'n߾}GEFFVZ֭[+M'̙͛7cݺu|2V\UVaҥJG{&'zUV@K,U7pvvƋ/h0=t} } Ԡ={VALOOW:JZ˺w.W(tn߾- }0{lxxx ,, 'O_|t4X|9;l߾.\͛|r|7JGMC]X'W_}/m۶?QF!33Ff͔3022t+'' ҽw}{c4?φ̙3׺çVUVF׶m[k-ԩ6lؠP"Zp!,Y^{ бcGdeeaѢE7ntNXnnЀ!O*3`͚5揹9tĠUVJ SSSxyy!&&FkÇѧORԩSsN:tJѩA… 8wΝ;$x{{#44III]o߾tֲt888(H`ddLRLDqvv2?~iwZ#Fٳسg4w`bbp@xx8|}}ѫW/W'Ntz}1b:u k֬˕*,X:IIIXlBBBLc`ee{X`ŋcƌQ0ut}m۶mI/m.]zUATT ?*Jxw|t-Z@JJ ƍQ^s=c昏{|rxzz.]$Caa!郫Wk׮BJJ fϞk׮/l333M6رf?CxgL_۷o?^xʜ3f~ ''')))ضmN8~ VVV燒n={(Ν;/RGNӧO̬"o#::6l@DDDeE72!dN* N0AֺLqÆ Zˎ9" W{9s戂 Z7߈ &&&?/fffj޽[TTطo_qРAb~~fʕ+EAĶmۊjZ븎J3p@QѣZz-QJX///OTT}iiw^U*e8'hĈ ŋ[~(8nܸj矋 :uO>Y^^^.XBAtppKJJ4^cii)߿_֭[(j_A,X kKIInݪΓ333EADgg*\tttAϞ=[i͛7Eccc\}v QcƏ&$:GGGݰ 䈢m۶Q_ ,S95k RVks!388ǏG~~>v܉w}Z֭[X[M^u4o{;wlڴ cI`#IӦM1x`|GHKKCNPPPNϙ̛6m Qq޽*uTӦM^ԩa׮]/֭S]zùfiiaÆaʕHMME֭q%>u{477oRlڴ ?3Ν;41"kW|lbErUbTBBBuDnnn k+,,Ğ={ꔯbޭ_G=ֿX[[ܹsV VVVpss(z'9HXĈ$4i$~={jWܾ}[֬:t(gqfS: Z$''Ç+>ZKJJZ/֛a#Gjp̜9'OwѣGc߾}>~ܻw/Μ9JUiؠYfy&k8}4~'a̘1ƀ3I?֮] cccaC;w1eEaܸqXjOOOEzz:F*\;Ə  &)**²e˰l2X[[kHx"XZZO?uEϞ=s!==ر#УGM'ڵk1|pj P۷!4fj޼9_ׯCS#BBB_Gڵ+ >\iqǃkq0Z1" -]&L@.]3gΝ; w}WgGfp)">>^ 1Dխ733áC0~xXZZj&|裏e˖Tw?χ ӑɓ_~' 888<Ѯ];L2ΝCkdkT}aĈPTGll,Ν;ŋq 3͛7瑖6m ,, [nuW_᭷ނ233qiᥗ^ݻ+=dzk^r%M[[[={ǎxPTOTU'""#;;V+!""ꫯugwĈޮ^ݻiii>q>={ 8w1a0:`#"gv9aaaXbґ ?$"""RGS)EH!,bDDDD a#"""RBXĈ"FDDD1"""")EH!,bDDDD a#"""RBXĈ"FDDD1"""")EH!,bDDDD a#"""RBXĈ"FDDDC&1<IENDB`psignifit3-3.0~beta.20120611.1/doc-src/BayesParameters.png000066400000000000000000001017171176542545200226700ustar00rootroot00000000000000PNG  IHDR,}sBIT|d pHYsaa?i IDATxy\Uu?׽,". * 5!P@GA +R+ԠRQGilDGGpFHAJEIDEB;ܟ~z>qs|QH$LRtH 6LDDDDDD& B""""""!bDAHDDDDDd $"""""2Ql(6LDDDDDD& B""""""!bDAHDDDDDd $"""""2Ql(6LDDDDDD& B""""""!bDAHDDDDDd $"""""2Qlشi._,D B""""2 xG~.APH$.v "}üDDDd 4믿>|8Ο?߿_~O?VYYXxxx`Ȑ!8p f̘b ~'SLcԿ4h1bdee繸 C !C_$I/^Qk2e ?dX(J>?d4wM-j1%âi}?>zYi1c:toV9 ='շ -^ƎsC{777ŋ0'*KHJJjgX]nl^c \q||s _D&cذaҗ_~)I$޽[_||i24gZʕ+<ѣG !$$D7,o{vL8]r9|كCaΜ9ZIMuL>x뭷aۚdJ9hjͽﴱ=!,,L;s銈_~$Pm1s^{8V8=1 @ +--E~p1?͛駟̙3GDDDnhBPh\UU~gXnhkMׯ\tMk ÇT8vtJ,]O=<|np%5J8.C}'NPPMg͛7cƌDsR{ӤǔӅ 0h !GDDqQ|G-^6rضm?ĉq9YǏɩfYӹsgr_q%lܸ癓LS6m_#::{˫wzk"\I4e[s=MH}Kl1꫘6mѣ8p@]kݻw[npvv._ []vP( WWWdggMsΡ ۷otjx1h @.]x4ciצMLLѳgOիWM6!((p|SoUjmMS_!|o"""UUUuPUUcɸpBmnNjLsOcܹq]ok)$''FeiK{qqqعs'8m>>5>+:tr5v4ksނ-[HFñfY^SlIL7Nt%)""B$IJKKJJJ4^Gs$OFC(--v-u]=$5?/}7*S;'{Njj?ZV{O]siym۶I$I~[oiYm4vY}\kv\u=rz9Aʤ0cǎUsI7n޽~giȑҠAaÆI?zO4x`t̙oI^*..SkcI/^lt?4Iqno&) O>) >1%Ô*-^X{ii4dRko$2$eCIǼdT 3fH ɓ'fddHR;J&MR_v'6e^' Ʀ515foߖ-Z$3Frpp tz{=]j۶Ծ}{G:v옎KM͡}I ;~4vXcǎԳgO)**N#/&JI Ǽz24P.]͛7kL$ ˗P(xyy!::CLL pi888"2F/_Ɛ!C WWWcҥ܃0a;v QQQ9r$*** ooo"2&:t(z 8tbcc1n8ܹxDd"j^zW^5:t7oĒ%K# )))њꊸ8ZJe'"₢"[_r|݋ǏG=zd8""m/QQQ$v>G0oڴ J=))) 1t3,Dd딱n:=FcH6665@TBT|Ȅu3ŋ(//W?{ap***t]T"2q\www[ܹ3,,,~.6̞=:u¼ypUܻw9sƆKD&Ĩ_\}uPu;;:A$vKD O?{ƦM#O>̙3QQQ^p) Qa|ȔM6'N޽Lܽ{W+#"VUU={QF>ñlٲz?ǼDDu9wHII'n:رG6l:uiӦaƌ+x\3mnڴ tݻ7U3puue^v-\#뀵蒘:S=zC^b7-?3k|aFaq(޿۷oǰa0`$!-- &MuqСxsssL0gΜAAAz$IHMME޽뽗ǘ^؛dee58qУGaq(;wDQQQ0ݻ ޽{'|X`KKD 55ؽ{7=^ |8r{=8p ƍKD(7oFSO;_~HOO1k,s6̛7SLs=BL2SNō7z‘#Gн{w̜9î]&x VM V^rsŖ'x}J%OxgssE<_"2 Fy}\ AiL?3g[.c OnnF 8P}ZrrjN_۾%Kpݔ -z&xlx1!^۶wM۪wW5;u((rbOg&=zKa:o2FVTWjUڥF~?|n@~nZ{`}6LS7 W^Uao͛7dP111BJJ ڷo+j*(=zO<`ii>}u1ԩf͚7n*᫨Pu]x.I\/ Ǝ &DZƞ6mR{PYY $''*jX 8F ܱc`kk> iiiXd ڴi^СC7nk.[@@@*X [Y{w;ɏ6^8u6l (:z-coJJJ8;;.^r 4pޞ3>&7qh~~>^x̙3ׯWOܢEп$&&BT{ ___l޼siA>޽wmpBšs΢s0/@yy vvvu$I(**\/֭vtXf UXM_)2a||<޽ǩSj*ucF}"99  ] x9s`Ȑ!xHtرƴDDDhxc7m6mYDg{UꙄ |YB6UD7SfT Ç?BCCq9aҤIu膺@?~\&"Bbb"ۇGƼ07?m]^^^(*5SCW Չ|xy7nƍsN?^@%4J+$ҦMNτ޽{ YYYu> WWWXtf&5ŨByy9.]cx饗cǎMjW_W냘 'Guث7꟟:Y7oj3g"==+-- 0qD׹[^ڵW] pbO>oߎaÆa5晛#44III(++SOCZZ&Mj0cTWq .]$c h[i)oЂ[dQ}TNN /WmSW TZmojZjj*ܹPΝCbb"'D=УGz?۵kWcM=}Ϟ=aÆK.۱pBH=~BND-77ErIT2^^^ؿJCDU000!!!Xx1$IR*xbYz5ƌɓ'cܹ~:Yf """"2B pp; j_X(((@׮]wyGѣg`h׮BCCf͚C.ɥQDL3QFm۶Xr%\ bŊuz8~8޽7ob˖-pppTj× (wMƈZƞgG!ַuP12+$3qx1b'cb(oh0}Nr܌&Xo2F0dLX 8Fe4!b5Wo2F0dLX 8lVKI~7#kq{2&φMT&;;իW~z8::b޽֭E4 .`uIXa sfX 8¯ϟΝ;QVV8<~m#"SDD9"AobHMME6mpq%#"STVV7xcǎENT**Z ppp%z磨H+DDKG',--ѧO:1bѩS'̚5 7nhվ裄M^HHx0''&M3%%%JDDtMlܸ&NP(5{.}]};v`ԨQ(//oҎ;[[[|gHKKÒ%Kj46:q vºupUobb8nǵ IDATՃ{UU[^"m~ Э[ӳL# Kcoi37ݺu ui׮`kk=z 44| ~`Ix0g_^=׷r-BRu gϞ͛1gΜZRoV+S˗T8¯N6 QQQ5ddd 22ӧOX2jU$?[~r&IꝮT*k4 <poP^?mxܽ{QQQ .SNgU7`Ĉ۷/:Қ\y <\6uCoXNNNprr;w0` :Æ ŋE4*oH;oKn:p`:ۦ(0O9ðO?OOOXXXsΘ;w.nRٳg y|}lxe9-[LTUUaȐ!۷ Ӈܔh :!!!:.m|ܹsO=bccヌ DGGٳ8rnݺ@ubmvvvDd7-[ wݻz{f,jDnϨ]GTXX'x _}2U $ >fNByy9V\sss̝;lr""%ҥKy؝;wtf+==J?PcYSFYWT'W4:~bUU 6,Yc6sSsa̘1(((g"##1~/BrjuS h)O9Tczpp0n*,,B:#*/>&7q_!lHNNlZ_xʕ1oQ Ŋ+p5DEE! Nenrs)S q1 ^cW/'chMnDQQqF[v-d+.^k2&ȜbZ<==q:\UP(Թ'++KPQn>7S 0Jv ã۷FIPZZ3fhݮipJJkk%ўƓkn"c)Ս˗/cFMz]=)cN_r䤰0|HMMz={Æ C.]۷c… ^얬>Ԙ%K Ah, k̞=˖-Cн{w33CH2c#WnJMMŝ;w#;w'|ӧvZTTTWzj~kq{%GN DHH/^ Iԃ,^^cƌɓ1w\\~YZf,JJf, kΜ9;ںΝS#F%Kɭa?r+7͛7W\ꎕ( 梪 NBZo6oެ+'}׈ᅬtxwˌ={ALL Əv!44k֬yկJJdN:m۶M6Ozjt~iomm &̙3zdCFYm z'1;7Q]09IsφM]Fwލ#GD޽ѣGlݺ<ֶe(=xѥ0tHZ^1'i0# ۷ѷo_TC:t/++Crr2 KKKtU=T}ЧOŠfrsΞz]xsXa sRX 8z <|0QRRI$APґ&TCn0޺ܤ[09I3φM ˜8p`gV'8""H0'\7׭[> ӦM]""5&"'ID$ᣌkAt0yxˏIL^ݺ}{L59IsφM cÆ APZz'1fn*++ocǢSNP*wL CnnVʡL^بޫ`ݔboӡT*}5=pFkkkt f7R>&7qw}7P(P(>IIIHpu] xO͛ظq#<==1qD{ONN兄ܻw1115jN> m1z|wvyb}`j7Dr/\5 |hTCaܸq Ŋ+p5DEE! NeKφM —^z ǎC`` :vXco&"Q\\\PTTu].&&VVVHIIApuuE\\VZՂ=!}zէ[7UBjr/ǧ-BRթgϞ͛1gΜmocƌ]""5rSPUVV"%%3gT7HNNfȄɑ$Ijp|:u VR7`Ĉ۷/ $2!E/>UTWI~t.^r 4<\pF~Ya9iܹ#<`;vL=ٳ`NX 8K.ҥKq}EV8{]Nct-]yvvv$IX^?m$[[[DEEa۶m8~8>C\~~~~׿T=_>&7qwpE|ٳgn KGػWNcgh)22}ETcIտ`„ @TTƎ:4oQT^b}6L-|2K/`Μ9οu{$IBQQ:wܢ375sR5bp_\]T]Gd T?a ¿~5;{裏D̙3Z++5MPoȕirN P)9jgM] /W5jVU5>`GX???$''ֶ,++/s(..TTTJJJ`nn: P(-Odd$:vXcZDD"""ZظQNc#Gn"Q594@90/]~vSßViHÛW=cG=5~?pi8;;7͛7qu!..|[[[FBBUgl6zڵk f,]qp0xO4#GnDO4P}~v1'!q߅$`'m&"bN""o޺u :u߿'OF߾}s!;;[+P(鰰@xx8f͚}{ Is׮xOjbIc}6Ľ30uTOcN< .iM2aܤ{09IsφMW׿b={6;+++曂KGDJTn:q`kk6mڠW^ƽ{d&?sR||&7q]l۶ :ud g ,5wSQ}^U,M1޺&"7͞=:u¼ypUܻw9s{o1ark׮!22VB.]̿x"1hР:<<w]<"2Q"rSTTڴiT N:aڴi1cƌSg###ѱc"""!KYH/cܹ3@氷YGaa! lmma Ŏ;BP ::^^^ؽ{@ %D䦟`5oook׮,kq{͜tM\~qqqjkk?HHH, WWWXZZ6Qy0#AAAA ] j\` #ĺx놮s p8qУGEkq{à䄴JUVСCػw/`ffP$%%ozѼ&7q*C AN*r>6NO<;(JL>x3 -- 8=B3bi~ c֬Y۷/>P߰>&7qH ` "elٲt///߿_@H $Ixx]AuS]%$""""ExѴ4;v,wKKKX[[G; lmm\30b]77UWAvcoK4z-c4lx F޽|roZWII  8cΝ4h^|ErrrJ$$$`_0j(ܼydڶTkCLR-W}v.m& 8cNaqGx/^}U$%%gϞ W_}~8js=k׮ԩS1rH37oƨQ'RRR'Í7}5G >^ )@׮WݧgoK4z-c4lx ??뇗_~]t+۰}a&HIIAXXy: $''z{=NNիΟo4DD)$j`5rsED |ؐ!Cyزe #G̙3G$TVV6mBjj*.\x"1hР: mՠDD I<5"ç Š $$$`ܸqѣۇ 6ڵk|2郧zJ͝;Ü9sb +[n|$H;;fBʀ'T$?[7q09I35-_ͦ[pvUݢ}8;+`ǎg}k֬z5K. /ڵ o&ܹKj̑رci /#G?[~r&j8cNsMM= ЏGa#Ax9_'NDrpp5^gѽ{w?J%VX_|:+,,Bqa}֮] /܀g^D40#7QXasX 8»;*+hw IDAT+qa9Z oooTUU!//{, WWWXZZx[J5T蒘[~MT8cNaqGxbkesss")) euRCZZ&MmaEn""sExPz6JK/~wƱcǰk.̜9| ,X.w"$${Err2|I8::b'"2|MuQ<%XYIDM9;v,wKKKX[[Gƍ,@aaam>~vĉ?Ϛ5K  f6m‡~Rtؾ};M^_~HOOGTTannũ<.QQ |MͱcL>SNg};… (((mZ^ɑJJJ0`fff>}:^xfs٘={FzyyaZ?5TNc#GnT~~>^x̙3ׯWOe{Z^ɑFѣGט6f\x|A+++}T_"..VjnɊ0#AuV -ZkkkQE!-pu] xGdnݻwmkq{˜dkk˗/P V3g $''m0#¥K1HDzGDn:|0O?ܹ3Ν"LDɑ$IBee%i&b…/ 9\pZ-! !CpAbȐ! .P(Ò)q+V=&סz'15ٳ0l0Y/X?{U_+'XD;c.rÇaff>}HJJBYYzk:^z%tÇnݺ$l۶ o񆺻hll,DGGL ȲD{Y'|]THF11o5Q-9M_5bcc]vEdd$yٶI'<ݺfNƦM:t'oߎiӦׯp# qqqF#>]FGȑ#ؿ?ׯ_g1 WzoJ7J%еkïUߒS]͉7Զm[\W\AEErssb XXXȶM}z-cfϞcǎ(,,k4yyya(++Cqq1S+$g&իGƟgx{{vލÇ .iطO)''}C3X1jIytZ^1'i0#hPPnܸR8::Ϙ1X2jsDt0cn=(cNaqGxPuj۶misڣ6d0&ID$]F;;;(/333#"Dlr} ݃]H:Bjܹ}=s=111RnWPPh477#-- ;voH%kl&%Gmxlv^Q=Ϻ6MtΞmo~m+ӣ}':nCSO~~~ptt@pKKP^^w@,,HOOnj3AGLL B6BHOQ^ZxnٲŠĩS |2ܹw6<<hllH$2h\f趉BtAmzII@Av*BQ{pƌQ__W_}PVVdd`2h\HM}3<*o3tD:z*{GmzocZZ:P(p 1]@^^'Dqq18|> [la* !!'OVY٣7_28 6^ۤLǣo߾Dpuuń O?u677ptt+NW%OB~ABA&]ܸqK.E޽q3WC7n_Z[YIX0}I4M!- ..zLJzjZ +WDbbbmmm1i$߿7nT>i?@VV,Y{&!Gm̙`߾}O\?"@mMEzMQtyC7o·]:w\u]ټy3^{5?>(N8QȿA1b&N˗III!!~&]}8r~W+MR(b&4];wZJb"u﷌>3XlJJJN><:+===z4ƌ\>vGvv6B!M3g"$$?r!M^jQ^ߑX*ogۤ"$$$`ݻ1ETCeo &) 4].]Bccc5φz50`"!ա޿!|71sLx{{Dcc#}Y\R}+5\;0k観[/4rAmxlt1| 8s1X5M$KaL7~}7!DHMMo\bذa ;4ooB-TކG۴o>ٳ:6!!...* TCeo &)JII4]|KT7!T BPPab4W;{nySY _jjjj`,\^^^-YT*U["""qB6tQDCxb[o8BխݽtmSii)ﻺ.!tMi!O3gΨ4p[C~~>Gxnbc..=6 >&ooodee둓VPi2ddtQ}6OtK0;;[[o777ڵK`̙i"zxIi#6*omň~Νرcz*{d6ҧl1Vk֬AttI78!CJ@&gTކg*mqZ2f^Mj;MU8---Nӵl2L6 xltQ}6Ot{%%%URR*"?II?,L&a*mΝ;sN'7}l,}.扎x~ʔ)xW_ꫯ0}t醤$@@uKk|;Ŵ "j!$B ᅬ'@ss3< {=#ݡfP )buBLMSBm!PxP*b׮](..q1`"E`h7p…Χ\ SWDm2>7}&iy޿!Tpqqȑ#t&%u|N¶FEɟĵz5u &v?TڤQ}6Otc2Bb²(Xj(*CH#'ybVw4={6B!hBBBLԴi]CB!BCeeSb B,#'y_Ƹq@UV677ptt+NW9bo1WbxXuHZ*6\r&ZjÉ%l:ضm0eq+((@tt4;v~Cdd$JKK ΟSPw$菺v$) ((nQ|KxjÉ%l2l𸢤$H$0|pX~bQ8Z!fK];x`@ TGGCHQN, gDǍ? a[1뛛S*;| ,-\Fff&ѷo_D"b„ 駟w hM[BC}B,C˗q <{ty<-\ƶmp-K8|0>#&&YYY|GHyL-mu!6d2Yd2cNIGmo/^^0n2+W'Xdeeaܹ;v,&M^^^Xv-^_w$ojy;h/+s*{buiܮcʔ)oPRRd#F=扎,n 1$$$Ee]||':n[F Hpܹ_~&׸BQ__W_}P!VbChkkI&aQ?8#D|gزe w8SH !X-Eߣj>($ VZ#F`ĉX|9둔OOO,YRc#P\ xz)[ðbVZ5k`ڵ7o^[fjGSH5IL)=YO.Q[b";õk4pWGvv6-[iӦ> 4:[ !ECl1<[qZ zΥu !DdeeoBClb55mEmS-T~V,\z5աM;wT~n44aۤm19W:D/_z ׿htcP~aD#'iPLkx殎[Kk QyU U*Kuc ըnFMc I g{=$B B)$Bw[ $B $898Ab+$¿_m%ۈ!_l Al#F,Y!ы*Yq)ʻU{gnSE%/0@\Hnvr,6*Vvm~Q}}lGŝ TީDeC%*TF]rw9Q"GHERP _.J!I!@*Bdc_P@~>QXEy졹Ĉ%v?TĒP}6&֕*2k]h)Cbm@_f 8b炀WvF WW3/vw_Np;Q'Dp!!f\b\bBJKk PTSKݟKjKPRWT6Tv؇@&cfWٻAf'wW$2<;%kpA38CHk?X{4!bq&nVTު"ܪ\JJZU>+S O'<q }pwng;gskJn _uoKw9u !Lۉա !DwM-MUs ׫zuܨR*$x;zKoGo^%S 'r2&N""QysTCeO,ܪ??g՟^uV_oS~>>q򁷃7"# Gx;zގp98s'MqO+%!;Wm𨼉ey'~-U\}- 0}=1-t@[dAوɐ}3s&ԩSذaBBBx">> 2t(PUս-omU3aß>&q) 8?\!_~_QI8:l:[ڮl]*uv<}@j 29Jp8$fiKAOSl:30?~c8_|+ʩ||GCE{(<|{Q^ኊµkK/ᩧ@ 9J3DrFWMKwJ˹f451ceh#_''gX-ԯjV֪}K^umWN*ygJJ/jܿxu̓6ﺦ.P MeQ{ca;i;2G.:W_8WtN_ J 6vA0d 00zIK4is~lLV!/'xBe̙33ɓ=z4OuscCWW\Tۥ?AWNi )|lYNOwtsUOZUxsd*Rsk3 J ˭_٢(+8{b Df؈yl6ǖ|d#44Up@~~Yv3 !44jDS]d!`WR}}LamZ}\`hX0b!^ChsmΏeuivaL&So*p|OuR`\  vX`% ؅R P\(ܬ;髼ZV7Z5lT <ɾ䞴N,K /0>$FϲfLOg,*9] aX`0 g;N?Gmy2q"UW6Le1RdXl4ӱ]y 77Ç; Bӧw%BtGaQD.QPPPwЕxvQdX.;}K!$B!+E!B!+EBB!BR!BMM DaÆ?Ř1c<<< J1f[b gggBx{{CaaQh!!!ؼyQ㈎@ <#F/Z$%%!$$vvvpqqرc%BeX&L`s X ggg"''G1hllDRRX@+sVXcÇcѐJ̙3QRRb21jV"ׯ#!!QQQpqq@ ݻ5nG9cOʱݻ?8|}}!ၩS"??_|.1.c} .."j{SSVZ@١_~5jV_ ooop777l۶MeM9Cttt餥!44Bǁ8ݼ#>>4䥺˖-S)/X8j$&&bȑ8z§~d+?# rb )qd2RRR4k C=\]]G}IJٳq>swa b>cf?8 ,''Geۅ -[C~m۶^z2֒%K8m޼٨łɓ'U/5jv=0___Ž9<^{5v9СN<ɖ/_8c}#>>ڲ7x9r}Wl̘1L(hq1Tʶnʎ96m$ cY |X{^z5/*~~~zˋBgCeTVVLab]YYϖ[nA$(--ggg/`ӦM!H:|Xq<HII~LL:7n3J7nlذ.]޽{&M¡CZ?ZZZk.bmƍ /`ĉppp233q!%IO?Ұ(gūm*gSi+ ,G]t_ss3^x8::b*igtYbzV͍1+**Tַ߮Fc<4R)D"Q:M;奲,X;vѣO܌#G(/jʋ.ݼ蒎r9ܹSoCܹsظq!MK着*p:E]s|ESy>הո51::u ---(((G%f̜9O?4bcc&III*GGG# ,*T*_l"##7|(qwAܼyK,1z'| 6GEE{=3J &L@pp0,YoooDDDɓxacc%1 @mc=Sdڡrkmmŋ/cǎa߾}*îb a :PWWW,[ ӧO OFy),,ĉ˗/"\eؼy3222#/Ͽ߮).JH$p㏫lӓΜJWyy>N ""#Fs=l`ڵFc֭(,,DRR***PQQ*VTT<{g'O4JH+^"111<>cD"L>]e_ԩSa,]F_ FC("##>>>T*ɓb t"iY5m߫Q[|cOiS1ٳg#55;wɓ;v1Fv&Escostt"Z466vC9uy)***/{FYYJgH]:ږWwk:˵kH> yi 8~R^^1Esx u0x`\pAh8%=ꄇܹskY@~F#??ׯd2d2Dd2Vm<c@ 0z(..Fzz:&OҀ#x{Ge;@ChcǎƍCqq1NR;VcxմmW|I10k,ڵ eMÇ NvWgIIH>5s_U^.Kyu7/Ӽ\z8YYYx_QQQ4zm//Ő}:puu[^9Wy@v%##q>s?0Ib>8SvΞyfkk23F9ggg3PXff&KMMe~~~lm+ #c4aq[`r)1߂ q_d'N`ǏW.&Qƨhn)&<6l۴irbzqWv~v8JrSn0pQ石`nnn]eر͙3G/OB~)䥰 298802ؚ5k"&H6k,{1q[j~zRTTspp`+VPI'%%E/y9{,`RKl˖-l̘1ʉ'yQ㇅1'''K/ 2[kO9ٳyΦ6jjjآE7lС&̘1 v5EEEl͍I$6fw駟f}ebb͛2FꨫLgǏg{fBI$6dn:*Gh&JT*eΠ1駟q_W1⨬d/f}aB988￟5j:۷/ Օ=#ѣjReffѣG3D،3XIIIĨm[a9S.@*Gmbi9v7@.}126F}Esc6M2 Bذ(H_gL,`6rHڹ^z1 dV;991&؄ ޽{|ۅ86sLeΝjLyҘSӼdee)ԥHy)**bӦMcNNN}D"6n8Eqlll}ֱ:655cžL!B!D+PB!BR!$B!+EBB!BR!$B!+EBB!BR!$B!+EBbpB$$$@& ~!jjj0}t899_~%ߡBDzz:\]]_~@ /fΜ9+DBŋM2@uO燳gbҥ?>x }򙌌 DEENNNxgQWWGuU\BLULL Z[[BSe3!tƍKmmt&O1c ##gΜ~Xq-*(իW;kmm5F8i&lڴIeb* BQUUk N8ĉP(DXXpY巄W^UC?Vy)߿_/񑞡o !B1Soaccz k-˗/W_Eaa!Klݺ#22g/<̚5 D 444wkװw^PB!3퍏> իqCf QMua}6_| ,@BBr{ Gɓ1sL1#GĚ5kzj 8vºuhH =iB!B}CH!B!V:B!bCH!B!V:B!bCH!B!V:B!bCH!B!V:B!bCH!B!V:B!b?X@QESIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BootstrapGoodnessOfFit.png000066400000000000000000002705261176542545200242150ustar00rootroot00000000000000PNG  IHDR H=sBIT|d pHYsaa?i IDATx{\Tu * Ki(^SQt]K׬\PleZfjV򲥆yIMSt0 EwCTDn3fc sΜc0~k1 @DDDDDDDDDDDDDDDKP.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@ P.""""""T""""""".@o 㮻 v?pSN`` >>>iӆq""NODJ*""njԩ>}CvZfΜɥKر#6ltԉ 6tRTB.]ظqc1=Qb DDSrlmԭ[ <ddOIʕXl-[,v˗/bzjV^mbnp8p8ˋu1l0 Drr2M6eժUk׮XH~)HIe1H@BB;7 8(Zjnqf65{ ` bҤIX,1@3βz W_Oc?`70X@59p`^^^|R^0jLae<|>q?)D0!W/&(((8駟&::SNvRLL¤IO1@2P x4硇q!0@ pQxB9gFMq8<@k~ᬞ Ҥk.5j=$$ݻwwHRv;}< ^q8tӧctEoС8by/""""T@=0`Y3gdd0{lBCCZ#Y8Z,ШQ#~1:d8wΟ7o.Tf$%,[fə-5.]2og?3 c5ɓmpߎpR4"""""Sj UVqE.\{n.\@n(Wg̙:t5jЯ_?&MD^7nL>O??R\9([˼eFn]i]aٲ{x_0dg:~-s7q`c`xlbXV<=܆hXzjj*``+g{)[ևW^y&""""JM>`9ba,XÇY&Ñmt///֭[ǰa4h4mڔUVѮ];g=Ʌ/xBy?=Jo fŋG}8tf1) W7ou뚅vjP2n.@l^y@_`-6[Y~&̙3 6822l&v8< |rh[9{g̷5|=66X^yBCCoEDx)V 2l"#wRt"*+ĕ@##N6{ĽBYK;l1&L? ,Vo͎K9$>5|| ,\̶m~'=7s\'0s09έ_/\1R)"[ttfoXnZ=8\!L<N2{77'%֭famO2{ Ú5@JJ N]׏@,D֭[wMcSIKKӳvgほobϊxx_!ܲ /sc]DJ; qe*e$&חq9i[f{7DDkN0b9t%X0{˖4Z >ߍoY4sb|RR}llKRRM왁qK."fco"R)W+x◖ǎ==߇=NFp]Jlb{6;9ڷ7K4gow L&,_ٚj GK.}Y\ڽs= zbvfO"H5Ew^ Nx"-$"Y+ĕE6laLgm?>^n7-kޏ7矇;qgϟ7{ٽ7a7w߭/y~ jGS67ddW'1#kANL)ShVnUbɒUl١ܴ@-$"7\!)6a 0b_suqn* o߾\ȜY OOW07ߴ 3?2ϯ`yf͚qAfϞMj^Jzӷ_ؾ};ͥlٲ? lL<8 x(jZB:3?r"""""Nƍٷ/mzˏ f[2rRR͵32oj^ %22eSOaZ/>iӦsW~}>c_==fn"UvmׯO&M?~|ᆪE:fmۖ&Mʞ={roܹ4i҄FĄ 9LNIIAbHKK&88v/^F%" <ԡCVXqKq3`ׯo~7Fj%..._ۤhؚ5k٪{bCujfo?`x}2\܍&T), _5:u`?ί>}ꫯһwo/_NXX;vȱ]wTϟyhт1b[fΝYm ,`׮]ݻƎ믋yH+1neիW_c, :tYf<9Q۾};[nv96)\AKJJb'5$ghެ \,O3m[ʞtY8yIII 6x@V+Fcg̘j_đKiRZ5:w}Gƍ Yf믿]wE֭Y|ysIG޽x衇8{l+jՊJ*GHHGھi&8@>}WV-Ҹtap9|)COyܹstܙcsN7nL&M #%%λh"ӓ}p(2p@Laَ6)|A\2q{exŖDF~A߾p#0x9[{.fz.T`m9{,SNI&уiӦ3f-p޽{i֬'N 66)SЦM-ZO:wLժU)_<իW/k$'!<pQzkƓO> SO=y' z3o޼\;#h?z(ݺuVZ9+9ruoӧOjժm§G wތ9 s Z>2Xd)}<==kȑs'}fgVY$"Ţv$$$0mڴ|?FÆ i֬Ya&aCnN8AݺuiӦ ={9r 6OP$$3+O?(m'NGO?Zj :_~jժ(,X?Nža>K\Qa`-]#'rܰaO>$_7t!i*UXz55kѣٶy^SyI:w[oc=?j*}]RRR !66u裏3#4 0_Ɵ|(OOB^y,3/dddz2l6lh̝;0  cŊaʕFӦM#--hӦx\wmR87); :z3:ãM Hށ)ٳgב[fƍCfyrW&9ח"Uzu}]fϞ͛?~<;w$44Xg'n歷bժUܹ>35koܹsxԩקm۶ԩS'=f?qƌ3&uǏAӦMiڴ)_|E3]0`5k֤~ԯ_5k駟%'Rc3{xx0oCZlyKڵ+=zZcǎY3/[>k?qEm4oޜRuҾ}7oL2X,-P9`dsB9sb+KiXH9{,+Ww޹:siر#/α=3k׎+fFXXX+w}СCٶmC7'"%ABS^vs!!,1maT:uÀs̢\ŹkZ*;vd˖-/""T}A)Kߙ3g6lqddx`i2 ܂֤@B1w.pRY9۸qаYWL͚5q88lk׭[H9BZZUTSN[ԭ[YOGD޼kY/o/0oM te;v\br{:߲eFͭ"Rx>|}"##QT!H!AIO ֤8@[Djj۷^(ZlFFe8q‚?f̘Q tÀoBj0#ĉ+\b)C@@%,כNDDDDDs!/|+[{߾}9y$[nX͆WVq|xzzI%޽pX  ipEvr"""""" ]vQ~!!!޽;c_~eRSS:t(gΜ!))yh"x"եAt4Tc@nл(ժbfn➐@ݺusWT)k{^Zly=z4z\B 'O㐔'a!9ʕ`swHQ u6l{/^LJ3j(.\رcSP| 5jΝЈvq= ^Ĭy4h|WYm[ÃÇR\G,WbŊ®;s|I. faf*QFٳ'Ǻ山4l0cGsg۷玈`ҥn%8p~RSa/S͟?O$ӧzM&M8p#)Z""z=HJJb…g̘AiժU֪Um۶h^ڬZeK}ixyгg/~QQQhE\رcV2شi9}5jW^qrt""EGOD$~{.]ܹ3/ϟN:̝;5k0gΜ̙39t5._P=d @Ϟ=yf7Ν;g_Z;o0o$$CӭT`9q"ŋ2gl~>]KIu*-[c=Ƌ/}Ghh):""=-O>tڕm۶1o޼l#[o7f͚ũSի<_~%/vSqիjY_?h /j0ztu`4̙3_qoooN> ر#934qS{;PL^^)S&={5̙3; q=ӠA75-ɤI,۷Ӽysbbbh֬)qq7w/|كCrX ТŵGO^`ǎ4nܸcq^zq!4i—_~ɯJ*UXr%C )EHI{n58xv6MڵK,O||}*UÓO>D<8Uˁ2%tܧbQ+}xEW(ffc6lBӺuofx۷e̘[.}ίG60bbbJ63n zuHJ2woi֭cJÈ5 0R N g?R… СCΝ;vaXwy福ߌg}ָ ooouƺuHIw9?pC,yFp_r=.v޽%);t@ƍ6l[l)EVyrE]+n60=踼=̝_O tSr2lfu,]1cFcrTL8ߡCBF>]x1AAAYN<<|8NZjܲT^tJ-J8Ҳepwg}ίTrplߞ0GaJ`.lY([֋A>=˱c>w.gHj퇯ozxJ".vڵ?G{HH`"ۃ(M.[.^&m„alԛbmbh+u`„WޝkR;WS^ 7B77}^Sm& ҁXf͒%+)_|!D,R29~'N>cH?줨/11J*hlKHH(D&Y35W>FϰfbGt $*j奰\VKwg}ίTrAAо=|ѕ {8v :vD?.]2'sHH;Glp8.`_e˶DD|mHiw^z<}:bHDY۶mfҵ\R)_ƪU3i۶mŢW:~)Ha5_L*K9ooP53w8 HOJ2PY](hժӧgѢEo?ƍSq9 QFl۶5kùsxW7nS@@93azDE'<|ݩWaH?),nԃ^ %&=K@ffn^s)[nuvrY`` ;; RCO rLJKY3lh[,秡"G9&I:s [laȐ!NLDh) R0gmYӜE>}K%lzW *djX]6Æ vrt""EGOD$TPG>cǎ3f4AAk.5k5uNo7<5{Ə7{m6ss)\3fpv""N'"?*Kΐ!COZ}3 jժKN8wgv؁bɶ(C׭VXRSaBC<=|}5]DDDDDYT a /9ˌpcZyDD|H5NOaf'}\h  $s8 m)<~-'"Rp*J?|̞Ça> 0KnS gΘC̉N4S:tOO.R>裬 3~Pl1bB)""8q6[}22³,ش jՂI`ʔ u׻$a`Z5sի!#O7'vugϞL0>^bڴi,_^{  ?}61q9alr22T3gB,Y ^^^:;*mGP.iifq$RZK.9x['D$"R~͜7BlY(S;Hiŋs78!"'"?^Bxzzb>OA}_ l`Ês' mV91͘; Ɉ2.=6l 44BTT˖-cԩOD(zKWfslo<=xyYIIIeV_ x=0 (_^םp[<<[f=9>߬Y)mΟ?_OD(+Wdڵ̝;7ȑ# :޽{c>?&&#G2n8^XbZPoAdd$SN'--^znxxXX,?~9aX//?=W_5CDn^Ŋ9}4+WbŊygXs^""RR)/|+[{߾}y'ٺu+[؉'RlYeμDP4ony~fh!<<,?Lfwu+v|9—_Ю];PAEkg)-DD ]vQ~!!!޽;}ƍԯ_ 0zh;v!Cn:3o޼"9aÆ4 "R@""z@@@䉉Yۯwl||<>`.]0~xvq=""X{zY- =g>r$TDhh"y{=oNN켷2G&00 Pɟu5jĞ={p8cccѼ4n ǒj;;adznw,]A߾m'sWa?>Td罙98n[nl6xnL"R #Q /{ARR .>c WNV<0 VZ}ʕXVZhQ$1H\\O>իAllYx"RSS:1ѣGY&&ɓcQ1s&xfݻ/Who|fYQn JJJp9hOz#vM5iƅ /ID,^SLO>X`}98 @xyy'NE 1o;VhSNaȐ!ʛ7oׯkGqqq8<ܹ;;;f͂Vc&~U5mN"2~ J07 ""T_ nN5I[F9رn LLLmUu/_a8wڵk']DKЦM euQn"ҮmۀL`֬eo[^Vֺϕ+xʎU}<(ᅊw[VsA1dҤl?uYr[޽.ffko2!"i1ӧOG~~,33QQQ=z~/~SmA`lH:nzݔW 4\\끶m5Á'ib݀5 9Դ?T/-[շ`Ǐ w <3?ZBVp-9sDPu[K7v21DO֭e.>[q yj5n  rBvq7 HIَ\ r8ͧ-ؔbʔXb>V\e, "!p%Z sEVVJ%|||СC#"IK^}U}jT媹dzJд]\ DFj^8}ANZZݐ}8v(+|spL=AFF::u$uDt8u$uHDe۶z# ?h@κOWϺuL=5}kobZk Yf>}:&Nv̢DzH.㩧 }Xի6nT,@wr>DIf._ƌlm2S:Ad8]po6Zvij>0P*54˚6U-mV~Su]w />}@))aܹUvm"ԨQP\\ WWWLM&@舨&TkTw˟yFs t>c@TMlc,?`宮@Q#t+?6 Haa!BBCaJKw-/ٳg}9rDQY˗/:"ݻkkAYÆժ%M R2-[͛?(- %yPfc^֐! $..W\l'02Q̙3#FRkDz 22R oe.~M5S}T;dΜΞyP?;kG?(3F.9)ӧ&V2.n@V @86%oN⧟~QdDDDa՝0 X!MLD[w P~5Jqc`~` roo $DQR}(--￟}3ȑ B|<`fj¦M5[ԼNDa^`b2`DUû7NxgQ}G-lP*cǀK4ϝome޲#"()^]5DYǏ6fWD\h8I tabbggd5{/%ܴ^{UuǼX^H{6o,35?UûI=d5nDyW % }r3}!"Ieggc۶m(..(/xJD895l:tqQET[%%+@oX5zСڍH@7 cƌ LLȯd`>?3˗/K.&M7|S C|tP$''K~gem ءYᡚIFGݸ=Y&жmUwWMXZY>g8u ˱j*ܼDwg 0B"*oΝ8t4ʝq9i"SNNI\8!A5)-MuAƍ @qj(  nӚ{xD6m࣏>Ç㯿Ν8'CJ*o{54nXBY@bjiYl&?oV,7XVMVV*D377кuk!*6lPtRIn)ٚVV@fLe2 ,d@Q ǎ[q .el xz6aw""-[t)qܹsfqe8p@\Qjfr * xeU2^'=X ذAn֭ {AYX5\~67"ztNDennnΆ7q5 4ǎ3IN<VMD ~?,+)\ 5SR,35DuwЉtUV;waթ?W-4uꃲN+Lu_f)??1EI LMKh&{w <=5xR}cDzԯ SӷRݻ'"i;/""-[j+֔E!** y+6mTc [[[XZZ[nؽ{V%tjLi~fK e-[*l߾~~~@|||ݾ}}={'~BCCo>L+;iSfܹJi%8}z.dJ.zO{o?,2xEͲ/XBgT233)u(D4h .\P?Zw֭B&7jW888*]bd겒.<}O=%RY#DI41Ք[?(+RO&//ODFNnnD[?9UI\*Ė-B=| cxHqĉ 999hٲMJJQ>f\x₀u F \tIkq|jf<<1c;w4y<;Xv]ys`i>CU/33gB.C Qz1qD}?Y۶mRRRÇqyL6 Çjy%%%3f ^u;v 3IaÆشi͛cǎѡC#Ӟ(X[[kEDD ""Beˀl@xPֹ1}P}`PH Ծ!*R c^#F ==]v-Baa!>C_СN?hѢ/ ۫;~=bcc[p6mR;hVs_33o_'[[[::[}Ѯre2k1zM U@󑔔˚ADTNII ޽eְdZ[[P*9;Vy+XҎBM9 * ȑ:M".na蔿rsӡZݗG}|ms1TF?q bرGhhb$"kރ9<==Ж0!!!A\PAcʎ=u222e%%%X~=t{{{M_lZ>8w4IHOD=권{}9Zؘ>CewqiRBDlHJJBppN EHH&L7n عs'6lؠrܸqXnΜ9GGGرcb :--V\~ ))):fqc`ʔeڵ9kX~DM2A?0{lTߠhذ!5jTe8I鞕$;113fٳQPPWWWlܸÆ ST*T*5!55ј(/,J}uPu2cdlF2BQXX1iƍ1b<.]*HKKC޽=wTT-[V<++ :uBffMBDtR_X|ԡh_ՔJUx AHjaժUHHHac|||Q&@TTnܸ8888h3t"2={uVA&A&ALDC$-[_m ;оtqiQ}Q 5m={pMmDDiڴ)\6-D] Cr۵+Шj{rz Q}x1H/QM) C -()Q}ɀ;Tmwz7DDS/薖Elll!..ڳgO]FDDj`gIz@'"B@BB._1YYYRG1cp TQ՘jN]q,\o&ݻUV8{,BCCʸu sr''Uqci .>"CGDT;li?1oc֭:u*nܸ!ux ??cLC΃1iR1z\1c!??0v,%qDHO{4oligyРAFoV@^^v"N%A_MB] c`#ҭi?[f@@'"2{{{\~舌 o۷oK>} N^ tt#]pDHf@'"Ҳ^zDFFbʔ)x0lذ*&Pր{ۉQ0 gq'"2BR x뭷ЬY36Љ ;;011Avvvzzz(*rsӡW^:tAc# DDZ퍿-[wd2l)Dc8}z>T411 0Ii t""-8s lll?šCQRbSR!&flmmȠ0Ii t""-h׮-[B`lmmD0fظlFBrrz6c"v@'"Ҳo/ѺukL2REDuDD:!!!7.\'O[nС̙#uxDDZGDT;lH&M0fڵ ,,,0w\"":?"aHGlڴ ?<|}}q5L6M갈f@'"Ҳ۷cѰo{{{ڵ ϟǢEZwQQsss`ӦP( +}i5n"2DDeֈ,,, 7|{fff:{Ȑ!8z(/^:`Æ RDDDDΡP(QּysmKDFv@'"Ҳ˗/I&:w۶mHIIA||< 1m4 >r;RuQ;5iǏoaÆGn߾'NZIIIСC5nj/"==FB@1DDZ }ѣkt{{{;Vzzz">>JRc;vʒd|,DD1褗2331j(c͕n0mڴCPT-KV#Gߊj?DVЪU+ܺu nnnC@@fΜzPTTrB/^Djj*vZWac#"A'ԩS'_^g͙3m5.QORR@+=333lذsEVVJ%|||СCL07n܀sNlذA9;n8[gΜ#` ,,,p ,ZrjDdj tԭ[K/!'']iӦGXb/8w:w &`q6l؀ dغu+ZnDEE!%%2 < VX333DFF'NDaa!FӧO[C:sA||ܺu K,1i$&LO>-[ 55WƤIJHH~㫯ѣrrrNLLLČ30{l7nİa4S*P*cgggsЧO̚5 :"2lDD5:Ij۶mu~W͛7+s,[ 999ԩS5.((@=0o<,]8p1qD|Xx1>S:u 999dx3gB&9sLi[nÇ=[nyfdeeoNիDa IDATWc̙h׮mۆ7o /hıxbY_o޼ +++ 4~~~x7f/'''OÇO@^st뭷ުqe˖i-KKK>tD\\4v Qe$Ν;ɓѽ{w߿>iii0`zɒѣGcڵ7F߾}>>>ptt;U;vRSS1vXPui+KKKêUM6Ő!CߪwsHIIȑ#aaaxWVVVV۷o"""_q˖-Rļy{n\;v\Eo.^\AaŐd8w>ضmoAii)J%֬Y`wn:בT i&?իWի6l@m}˖-6woƍûヒC,,,pƍJ Ŗ-[J n-] ,@ƍe7GIv1Վwq߶mRRRGcڴi>|emٲeAAAh۶-/_L_~ LÆ 7ԍb???񁽽=yQ\v w'O]G߇~#Fի|ՍA/{#;;>>>I֬Y>DD\\\ЦM9/_{2 K.5 /26n܈ɓ'Y}>3 4r2 VBΝ͛7_a*l!"2DD#FW^͛q5ƍ1b8pY:;;㩧Brrr۳ЩS'dff'bxyU[JJJ @ p-t .D~d8p-[.]@&СCxwЭ[7u cGDe1ՎA?q\]]+%6 3gܹs{M:Fqq1ڴiB!uHBƍ>|8F?ĉ1tPP͗0b\R興v~J׫l޼z{M`ر[oUg1ӛx˖-%uCP(ů !\\\++?"1z]Q*7n<888< o@u~F@@aQ}E%/((Po!^ylذk׮ŠAjTwll, 3yyy=z4.^|g޽{Ο?_~ǎSO=#GH-_f'OX ?رc !0~x( |9rbGSVJSLAPPP(0|pܾ}~M4 J%#o  v\P૯/p르4 ^^^/={Ν;L>]tg} ?qqq(;{Cd2Ɨ">KKKJ̬}M4jHw 88۶m={BTн{wrlwAaazsΡ]v5&"""""ߌ~ :^zرcuxzz͛?йs 簱//_.ŋkCM ƒ%KХK@PP̙_~9s=zx캉Nj޼9 >>>طo6lDDEE*ԓ󜐐 ^^^8p \xՍTw޽{?Dpp0U?P~)v OOODFFbӦM033+زe pttİaÐ GGG̘16:"""""222[xu.++ :uBff&A'zHAFF.JJL`jZ 7DVc|^^NDDDdЭۋ8}z2Jf`8thSTk|^I]܉ K5@ՈT.82X|^I t"""" WD`O>dlj 3SSSe׫_b퍎;"<<Guݾ} +:v޽{Z.""PRbw8˓NT;|^I t{pppsilk֬~gcرT3'$$ %%ǎÉ'0qD\|;8y$N8p9 IQQѷo_B.cΜ9:G^^"##akk KKKt wRDLMKT5nyE$ 6Irr111޽;ڴi/Bc_cĈwȫr-,Yk֬w؆ "((H3?}i+l"znҫؚ~o{W7":)LC12LXB!ɓ'sBW͛"+ǝ={V ooo… "==]U[g~j3j([o=Iʕ+B&9s+VL&>.+))" t///O89 J {P89m4:u  ?Ю];O<Ν;:e2 ///cÆ t{ۉ|Ed8Iw郟NΩP(W߆/݋[naРAXv-^~GsN:P8::gϞ|N"{*ЫHzWDƏwI9rA9sfϷo>grT5 2 7 /T@۶mqYΝSwO&Fټysuw 4qDnҫؚ~o;$wڅ> ze?_f ƌSi#~۶mܽ{xC]nn߾wBP <>>HNN=>?...(--E;{9=zp <pi 3f_-[@&ݻxWs=꘭-to]˭+ `"2~2i\VV:uLJ0Q}GDu]܉DDDDDDDz t"""""""=: "DEEMjtl^^"##akk KKKt wrDDDDDDTԋ!Cn:|ؾ};j}6={O>?;;;b߾}:_}۶mHIIA||< 1m4 >ryS|CիÇ:ȸ$XYYaСcƌŋ^...9`ԨQK7/F@?q\]]+%T{gKDDDDDDTF@z*7o^~իW<%"""""" .(X[[kEDD ""BH_}E.((PoXom%""ǐdd䢤wCLL4lmmHo1o{zz">>JRc;vXdggW(ɱDDD[yyyE>@ %rs3p:2*?~ zXXQP(1C{eǞ:u 겒_]t&""ڙ>}ɽ]p >t#]pDDzS}=44!!!0aV^={W_Ν;L7n4h?S}رcC">>)))6l~7,^XK"""Jdd{ۉj׮]z*V^Hر#W tP7]$ ͱi%["QtG^̟^tq'"ycx"]{P+U8'.8XRM$5CxM26ЉZ)ZhpHQlmmq&DF&m :t7Lԋ.±u!&?Q0w\tVVV8~8-Z.]:D lmm%**5%}|T 5@'"2iiiݻw=v<==ΐٳg#))c`mmQzi%e#CglI.6еf$"zT...5Qkq#((t{gaa8jqqKP4t0d5IXXXpO"S;vaU\5?"O8Iŋ]m?/D NDdĒq-ܼyىƍúupu 00^^^'h"r̛7O ""!?"2Dl7xϟ!pYmT*T*5uvvF\\Ο?;w}Y,"(HNDDDDDD@3nK>_;i2ƫ]W -^c]k3xma] -uR_;i2ƫ]W -^cƐak3=NDDDDDD@'""""""lGQXX,Iꗲnk/..$RGxj">^agצ둬,tI0LJFG{H9Gq) W\\\HscHp8"""""""=:`!** 0776mTc [[[XZZ[nؽ{wk׮-ƌ|߫W/ }>R.\@TTamm \kV]_{mk߼y36m GNNNܹsZׯ#wڅ^z 4@&MУG$&&jkSwuN5BQ^.#//ObG`` 6mF_~VbQc깭Ϳ}n݊=z 6+-ZRYqE;v@aaakkk 4Z~۷/lmm!1gΜ_!7Ʈ] ͚5s=hV^ \+++O?_~h޼9\M:t>ij&K IDAT,5k }xw?s~wb˖-bB&kkSwuN5ϑ8ݻzB,\PI&;v/R|Zqcͭwݽ{033ݺuӫXL&"99YݻWL:Ud2oj%lj2LDDDT(<==Eӧٳgի:9s|8*z%V\)+~(4h v]uѴiS Rdž 1bO?$ Xpa֓-6l(w}'~'1|aff&:wM_'OVVV"00P$''DѱcG 봾7oƍNj⧟~+V-Zk+O?B&ɓ'u !DII߿ .{v/)))5O[@#[n2LlܸQo߾AVy+L&Vwwwر<(@Qg׮T*?=z66U(b]ҥK1n8]u x^RO={jצjq#虙Sx=zT%Kh;L uT(B&5keBNjuĈJ M6X7ާ~{ŋEFȑ#oyW\U6ka._\mڴuZWy qu~ .KKK1q:?wyd… SL2LI=ս~*Zl)n޼.;033ӧOJKKEAAAJojf\x₀u F \t <붇AJZd1b1d730e0=L_ 3Xcm 1c eL" E)~ѭ{{x=9}9 ޽{8{, CR`nn߿L&v\uwmϺ.mYٲeQbEܽ{WZW^n߾_133Cɒ%Uڶ]Ņd}(O/Mn]Z vvvѣ.X-,,`eekkkvvvyӧ'|>vY ?ymC!Mr-FZוرcXd~W\W^a„ z9~fV};;; ]t222{nDrgggh;vi{fff϶ gGu||mZh7o  }a#pssYn]\r_OOl˳ j577L&KY޽{Qvj[[{^7n͛7QNiGGGteJY=e\tr9222~ƌG@?}ϭ)yQO?r=znnn CZ`aa'''|wHOOK9X?~={'aÆ!-- Ǐټy3o߮77oVVVYYYիW~?m߇nw}=gϞU7_=zѣG#$$+VK":88ʕ+%ʗ/!C˗:m+((:t(޽ׯ_?/{~:RSS5I9H<zYr%Ξ=%KJw[I&|򰴴֭[vO>E5-/S^DiU~W۷o[-[_|wwwa޽ׯ_C2"MWB}@PPT EM})/m2'] h+/kb͚5ԩJ33=}?~8"""T)J*a̙hܸ1peq8yFbw.1`r|֭~&7nd̝;^,##k׮EݺuvtڵàAPxq>|x%̙c%fff6lf͚yaxF!tv,:u*6n܈ŋGߺu+vލ/Yr~ȑ#(򯅅 Çe˖:i+&&-Z',Y9sӧOGRR.Dk2L/80x`8V~Ǜ7o.] h֬_3g@_ qppP{311QZӾrW]ݶҳ1j_*U@g_{~B 86l5kбcGlmmMjKK5j@zкuk[;vĘ1cr }=5Q]EɋTP-Zӧu_f2 mڴQY޶m[@TT#UmW7<<=2uĈpwwoVZ'O? 66֨6mƌ)SUTAzz:y[P>F׹1/1g|:tΏÇcȑ(_<$zs=Ҕ/\&LkkkݻڵCF0b,]7nāt֖:9NLLL&S̸.<{ x8֭?1w\g&)) ϟL[mM6{b#}&˗[..]my}m[r1h6o߅ꫯUVI_f鉤l<}T/_M۔ɋ9ǣU9aN<|G!tu~WZkkk|:Q)?7r2}Gbb"._`׮]uUqW~P+7&88X8q^x ?~yL2͛{{{ooo_xxxdR_NakkwU3j n 4nXVX{{{뤭իxj'mm@בΝ;#99[nUYJ*̌n߫W̙3Ҳ _7F (7lׯWIO!ھ&6666mkK_}ϯ]9z˗o߾jw777ri_mkD#==]ѣfGߵm[e܆O^T8t^}~bڵ+ػwpA:71+=|ԩF^ZJٖ:uJZk8ŊC:uP|y\pƨQt.}卮s6f͚`L2SN>DDD 22R@6m`ccH̞=[g @.]BZZr},,,СCl߾۷o#""]ty͛ؿtAZ3/hڴNڲg}/ ;^zu(=~iݺ(SXb8|8pdbƍ6AAABܾ}[Z&<<<ظq8pܹGUi#22RXZZ.] 6''')ѣGE.]ĺuđ#GŘ1c(S{-aaa",,L̝;Wd21|pimÅL& ONΟ?UK(׶swVg[nb"<<\?~\lݺUtQd2l2]۶s;i}F>SGرcbٲeJ*TR"&&ƨbMOOA,_\9rDL>]XXX;f!g~b]lds"<<\DFFiӦ +++Ѻukȑ#b"22R̝;W888:\x"<<\իW L&w.={Ƙ>tC/]7odO>7ԩS:oO}sЅCV̛7O=zT㏢xcǎ:mgϞ=L4o\ܹS=zT̛7O k{Uagg'7o.+o.<<]_.텗ؾ}8xٳ077[nS{]ŨQ| زe6fff֭[*=z$+hҤ8tv8 ppp zoڵkm۶bŊR ///?gϞw2L233SwA]w2UZU߼ySm7o޼y(Ye˖|o]]۶s;i}FF%DbńT/ŵk׌.V!HLL*TVVVvbzU1 !DZDjg~c]~hܸ(^5j'N)))F'D D% ,zUE3exBϗk>Oد_'NRɓ'o޽{E-Dɒ%pvvC  >6Bq9ѪU+QxqQT)ѥKq m]oYOm[Ѣ}dɒR۳gOZ|b<A'""""""2,Љ t"""""""#@'""""""2,Љ t""BcƌzP1^x@7[h\\\h"*5SddCgzk׮i ~|6M90U)jޏ ""O\ss|666Zo/ 1 GЉ#GѣQL/_ ѷo_,Y+WΝ;U;r6lTX}޾}+OII_~ ;;;TX ,7oߢrʰ7ݫu7oބlق&M8r䈴~sEammZjaݺu*G͚5QX1l7oTYv]v~=:v([na̘1033.;Ʋeˤj׮׫733êUйsg/^ߴ>oD>|8QlYL:5o߾> vvv(UzǏl)fСCjg73f̀~WXbԩ\:u믿GRjժ7DDDzn:899ŋ7n nݺ! 111֭틔@ll,ڶm>W^Ehh(֬Y'J6lN8}!22'OU߿?Ξ=;v ..AAAҥ ._'LiӦ?:t{l3yd,Z׮]'&OM6aոqO!CHo*_t0bL4):ك@t W\ӧѲeK;Pre̚5 >ă_Ř1c0m4aȑ߿?vޭ̙3ѷo_\z=z@~ɓ<7"!֮] ;;;DEEaʕXhQZѺukz =;w}69唬͛?uׯ_Ǿ}pDFFٳ9s>7nڵkk.}_|>c 0@8 """ҹ͛\.J =}Td2qQ!cǎ*Yr(^HOOϞ=bΝ/_%J1c!*i۶͚5kDҥ5/d2XpJUVsB!d2طoMrrϟW9EΝ>z{{6mdjXhʲ#GT?W?dbׯ_ k.m~5o\mpuu^g񇰰PɁqqqB&'O !) .'N*U9Ƙ5L>]ىTi٤IB, !_(F!*V(>}cd :d2L2$@LL 4ir???z HLLDFF7n,/Qԩ#>R͛7YQŋ9rdbʕ+?~2???̞=[eYsicc%JH?DTd2ڜ1k,Re]LL WGGGiutt4r)B̟?)))8w\\\wժUamm-vttrɿ\>vXر/ƾ}+Tx@'""3O[&74mn9rXYYŋ/Qvv.Ri<UcLf͚aϞ=زe &LcKt=zXXXX 66[sd\ :SN<ɓ(VVڵkN'''#&&Fz7oٳgVWrOvr9oammwfkRJRO>_Yy{{k s-ԩ'N,;y$֭~DdXB9FF7T&CBB<<<SQFػw/{̟?_=yG<((^^^Xv-&LW4V*x,Љ@ׯqqq7n~L2CJ.޽{cر8qbccѿ5kO>իq]\t ?#ۗx~'۷=z4GVO+V 5B ̚6m={`ʔ)XdIqfyY~sիW1a,[LK,g0m4q >XEDDDܼyժUCTT<== :`NDDD|"""?NDDDDDDd8NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`NDDDDDDdXDDDDDDDF:`Nz777f͚֭^|Y1o =z @9W<==ѩS':uJǏѶm[xzz'NPݭ[ҥKA*~WH_e˖E`` 99mڴ#QQ9y{{s}FFFJ9hܸԆr9FwwwcٲejKIIAF:uW^u,_@VpΝ/Qa9{3[nsl|}}VZÇ9nXb?~,xbxzzj¬Y#B運^o^,\Ѐ1cƈ+VHeˊKZVn]q<ӣG""**JTTIf.11Q8qBٳGԯ_?c֭[Wl߾]!DZZQQQlٲyb9ݿ_.]Z9s&ǍPQ_زeKl2駟 !xⅨ^8|rxz…m۶xPxBk u<B *W,ܹ#AIm+셆] !HMM_B(o^lذA!Eեz)fΜ_...R[IIIY=z4vgΜ^^^|Y!Åze˖&Mool_>>>B.RJO>*WuJAT*sh!W\JBEޑdyضmQB0)RSS\.:u 4+QD .bȑrĪVZ"**J:Ɗ+D>}Y!>cQ|yQvmiT}*U`„ W:uI&uF’%K bŊ!22'|qqqh֬1~xܹVVVbZZFٳRЮ];銠n޼oʫJB.]plǣrʹ'J*\q=q.\dӺz  ^ 9N]JeϘ1CeTFhҤ BO<[={2 S雭-+-Z1/jz3kxK|sss?ݻ ?Fr`fƷUT1==xX`z HHH@\\~[q+W,/twwW.\UVI7HOOǠAl2d\sdƵkװtjիrHLLvAqڵkHJJIIIXb9mڴcǤ Kz9>|ժU|RJXׯ_U5j>sxxxFZFEEztܾ}%KDnݰpB*|%ʗ/ }ӧOVZ֭[\uBBѣGcРAXbskפ$$$*#7]v RRRPZ5,_0ek֬AѢE 1dsppq˗BbŊصk: iii3gUp5 ]t*W-[Jz%4o=ѴilxyyÇxJ,rNlmmի?P%ɓhժ?/ `nn-[H 8;vD5j -- ϟ?Kiׯ… {dV^=<|IIIprrB˖-4QQ=e6uTҥKub6l222Iq)|q]8gΜ,--5Ɯ_ԩSB|7۷W_Aׯ_VZR\wԮ/݃\.G@@jQa}Sinn͛7㫯B߾}f_}ܹs憆 ԩSy3KKKaСx-ʖ-K}||w^TP!C,XǏC&A.cذa:FʝL={{FllCɦjժسgsvܸqpssӈ٣DT8b9!CyDTxb{_G@@bbb'?+WG(?ZxDY}Wѣ~gCo~-~oڵk>CSoѺuk8:: Zc(^84ivҎ8mÇpz>!c3.׼y0c GܻwuA% gή^ ^z8q"^~iӦٳgBٲe 9Qn޼ x{{+WČ30mڴ\MKKC \rXx1كy"GD t:tJ.[˗Һݻȑ#~4۷1c $$PaӧOԥKb8u5jx-PD i""cGD~z;v K,vJFFvލ@YѢE ر%"zoycԮ][zs (>R?Ǚ3g]HDDTXt#=!!!j?HMMguuE\\޼ySh'!" Ť aÆVӧU2e gϲ{Ο?W^6`"1rdfDT0oݺwŋu~W͚5CҥU zyD=!{(Mc#2nGd K3=99Çȑ#Q|y$%%taaaY%&&B&^c; .Dz"z_aaaظq#6o kkkCc4?zM”L@ ?~ya޼yۣSN -.]m˗/VVV2鈝aiiiP^ݺu5?(萈(GTgϠ@dd6m={6ѡCl߾oFDDtb^h۶-/_33Lyҹsg\zgΜedd`hܸ1*T`(GTg#h޼yk֬9>#iYpp04hcĉx5Mraر6{ٻw/RRRKهn Oakk`ݺuqAAAXd u놐8::bҥvNDEJٲeKKKCBDTTt"*rBr&"zDdJcNDqICADTT[܉PB&M:"GD(?DTd20777t(DDLUQ,Љг5tDDGD?>NDݻwk.CADTTJcNDҥK1zh:"GDT t"*tfϞǏС(?"2UXSԪNE*Vh0 d=*U-|||eݳg5k;;;X[[ !!!z4a#"Se*:9AA@l;O.cϞ=Pҥ ֭[3f`߾}hРzM6߾}СC(Qaaa8pڷoI&o)艈L?NEΉ@B Tcǎt<<< NbӦMѣyuƏ=zLu_%JΝ;amm 裏P,\AdʘTj:9M;:*^S־}{\xѤ.رvvv֭믿4kaa+++8W^%Tj3=** [Pxqԯ_+VPٮ_~033n)7W5k*^mH֭k he%W˘6 iii?~<͛7c0a^&"UDdL1-ϟ?; '''`ӦMcLć~ `Ȑ!$EDDCh׮ ŋ˗/1gCHT$1bS0]{{{ܼySeB. iP???CR988%OLLk2b~&MB߾}QfM=KVY֫W/+ 2)DdL@B۷HNNƶm۰w^̛7Oeׯ_|x *VN:a̙7PDE_;\(<==i&r[._ 9Nd[+ϩ@_p!ի4?"2U&yd 4ϟ?Ǯ]w!%%3fb6m o+WĨQ4xiG;f͚X~)2ڶm 2/^@ձi&߿6l0`֭[7n 0vX :]tQX1>|!!!0YULz&_;99IoH[h333̞= BŊӮ];o$ҖL&âEIwoߎɓ'cڴiHLL6oތݻKrri }3<".L= sss ))?PHP{7dH.#))a8?"2U3}ذa<'}L_L@ BP.sij=n{c WWWCAD:PX\NE>GD/w&[1h!GMZZ Xas9*濼1gЉ @@͚O];r\]]gPTg ZasM*o {>1b;fUѽ{w8;;:"Ia~vd~UT1 t"*7o RQXPsldn6 -MU.vDDd򎷸rC@nq.,w*_P@ء`#"S?,ЉH/Ѹqc*? 5U4Ԅu9忦M&$yDDLG0 ?à,t邳gbܹY&6l؀^zA.W^9)S`Ȑ!/.^6661b,MܣnumOWn\+G3b[Z*ڷz7=)]y&w--U07ޮbwL{;YvuyJ].+ݚ5@\ߕ}Qrhp^L~@7qE}⴬VOkP_rΝCFFF4Hy 77luhѣpssCXXjժ 899Cz"N{N˔e.#@I6mR)&X˚W2_|KJRoo 7(?PAhWƤ,n矫^VMu^&\\m%<|^E޽+'%5_jy{?"2Uz&HΝ;'s:/GGGkCP|+YRysd;6LU\ۂkU|'ٖ߿_d2q_kkkQdI(V^-N:%fϞ-,--E>}4WX6^L&S3/KeI֪5k77{qB1/)Jmd̟s(F畲%ߵyR+g |k՟̹fM(۷F(O4YL䙍B֭+++/^W}ϟGV`gg{{{">>Q63۲ܶMxj߽!.[ֵ9gJ\x/~A[]v?bE>ܐ5[T,74p(fuPʖLDXyU5dwy7oƚ5kpy{8.7on݊T*e~ws̱ӟ4^z4mQWJ1sa387اNM]]V92'?ey;{5n{K2ѣű8N&A8L颗Ttu+?oLA2 3ve/~kN'*پj;ߌ[+)r9~QՀW1(}yunc*JC{a'Nd`͟??ͣj*ءC,O86aV[[.x&!c*e.WX1e|{ߎO]]V=Ibpƒ%Kdɒ .q`ݺuxFCEUSL)SW]u|>+_p!*G$ĉ0 _^xa^p:{ZzmuUt7դXiQ=#O y1tte6u;\끃 ^s3zs]-r:kor@]byUx-`eF.e&U0a*jO*ᢋ.B*Çq磮ӟҶ{wDP+pNDAVi;eJ6ȑ#FI«:D"% ---ft;zxzg"<);6L8`zfzz'o/qYoZyCJztBԨ^ht t*~?f̘\{xg1 $>|۷o 7Pđ'*4ޞ* y{zZŕd2~yKШ48!QvQr_ǖju7#+WWd//2.|SC$BUu]hhh_cxgyf?pC=~X|9o`pp֭ù瞋/Y'N'{ ٮd8ߏ7Fɂd Ue(+D'l4RXykkܢ @96 ")1aokvq^>\LH63f8ǯ=XO@#Tde˖aɒ%;ߏ?[no~QhPE]c=~a̟?[l7<̙3cw};ꫯ#sk2SNyW5<R4^5J>,~['NYO_6T T Lxf̘7СCBss3j<Jfx J@)EU"taW<uyNum Yܮvz5_>c9PP-5+*d9$7\O>y zYG=:i >ܶkG"k a"~m9G-2QoQTQ(5OÄA()XV")t{ϼ|縻o} 7pΞ=ہJN!(_U$dRf~89z{;Ne[$N4ݝ+ݐHۉD9)2!7A`ѢtBx\-5$;eJ%Ш\aBi#i>EW.?W^1VB>J0lyjjJ#%{Q(b<\_8?sC1Oρ1+Y n|k|@fq.2;r:Ƹ1goOkm5;n˿o(NxyN4ƣQΠ'544 iwDÂBgw3q"yoyv@vcg^\1{gTSy=~3YaXz~w?ݐsΛLKƀ#GdmWS' n\zWF*lܘݾ^T)dS#=|O>zĈ>s\b=x\ZihhJMPJD9 ".G\Ϯ19y}卋r.gz-KpfǢ""ݹRCCr""3w\Aop8=O]^Fr$sQdgcWb3 \#R).H~^~-B}>kν|LΖWC絗*EiT&R۽[Aװ Oݷɘ%q; ކ_^s)T`eeEܲvb|9KƿtuqW2s`t"=j-5ѼFwpPAk3hXfMoj*[&Ĕ1u qm o}0 rs PZP٤@iL |Fy@U 6--VҢdҪDJ3m(HWLTa2ڞnb2f=F}s= Bl駟θ￟̙]ɿl!$79$BU<Uj)妗L˭Q޹_S@Jdշ+.?TӨQ^zPj [p"TJܟǒ W;eX/'HR)TNGEd~$qÁ9ömۖ5 K,ag;v`k֬aaN}`PM0͝;qR@Ef6FecXEr2IFvv?sm^铳h^0's剐LJ/tzK[.eTz2cVR$M1U IDAT$MJk~*grNdGeqTż|QsP9'_ӡF??[nM7+p!{ク馛s)}Y^wq?#1*c1DM$zzxr c${ ~O / ҚZ[̙qM9o\3gRk#/tzNo^mmݘqɟ@;t,8ј1iǞ1zNao?#?1c89].br m݆ѣGCs=zx㍖W|7|ӵ~}}}Vlp{GHzs겗E]W\~}DbZp؀a*|>` uG=,WP[&K&y:gmZ+_hz}̙.غ,Kٍn{у ;$WZ[=v}P*H{Y mml܏3g`ԨQ0!kv¬YҼs޽\rxPvǹGpfx˼D$#c8̘NF,N2!p+{E gB2i`pPɏD |ng2{y~_oyN|EkhhZ h]cD +,WNeTwUaM̒h)̛6Y\X(/4mֻ[9:ceҏW$I,^W\q~;([?~3fH[>vvH&hooGkk+-[V1'-aWjzi.na0>}ZmDڕ۳Gjt;]]SG >p9jCsJX #0SB!~R*ACpiN5EzA.9}:hҬ*@c "p3HZ'YWWz~1Q`^~^[eۡ8t4U^ qw`ٙDCO~}jkע mmmg5mD] C_%rA2 3g[j 08h~w0_2iyۋnh|EHihhhʁ65 h|֭Ï~#Ԡ'K&8u BT0Z /Y|<Qr AX],Try rT*DvkVnvV__ϒɤe֭[a_W}vfc׿ܷ_>mLRKѱJD3}|e&K|0R H oʩ 6$@vj' r} U~S0(EQȇQz,yaq26${mB/ayqO̙|S C."ROÎ;p]w)T!"J&XC(IdrɆeVjwG1-"p22)S!7 ^lr;V:D54>ҒHXGPr]cUnbS? ]<&+z[>+~A3eB@+e˖aɒ%;O`?яY^oV9r0f\~vW`̘15j.rbRېykm^V$#^ U9Tss544T? Ac싅cǎ-bllV\3Rs|@ 9'Q~a9roziMMf^85vCH%s)o^տ׋D>]]]Vy֚Lfnˏ?a؅!>ojFNsF>`{\(oގ >᪫WsϿ}F5tOۖ-|_b u~[?: Hd@8vB"K(D'0T^?95j/1nB 4yF9skS.S m'X#D\EϜiH{"w&yo:RA*ů .!h35S{;cfuu5ie sP(?ʀ6u]?좋.£>.꫸;i&̙3Emq zC!>+6&uƸr֋CFv,ƍ>@9)D<Ei޿_M2 :$m碫 e9/ϭ$VG7̉x$3hGPUh:9 G:y7I<nˎܭT 7ѹd&hs~6n//ˑeCCF v@~&W544*s玌Qd;ƾTo~n /00).c^{uvv{*F"'ngMV̥QhԽ0喪 s <qyct]?:_]k>,whl$Ms:v>hdp&ߒ@^f\"ZGN>&yaw^(Q@P xa?}Ǝڔ*E@^m%"aGC$rb  mTo*Ou"BNt>ndy2ekkeR "rDB"X^09H||r3 mWlY^VADC0nlkLĤ(^:!(MӨ o{jˬzo|~4e%rXEU7ࡓ[)Jquh4jJ1ƯKWCgt=xzA>T<9 וC54T?nabi F1 %47nt.2ÿ)F\r%]iB$xvOyiө^^H`ɫy':z8r+M=t#Z;m3N45}ƓmyNcq"r;1(aGgv%Ӧ+VuٳեWL Yr^:EꩡQy8q"v܉|&{Q~Zc|;e/|oe_Ca͚5Dë9spmi#Vn`&Ykq< $,/Z.JsӍ5=iOydW< wѳ'{Dp%AE݆- 9KɧFD:P{liwnpzӧ~L&Ն&.]j#f~w(LbyEy$а%5Пy_mYg$0FaMַPWWWя Ha̴T2ݲd*޺ Zj!#HpE!3] ǴbO=n!.2O[<Ι<ةSȥ~:](d8IF:fuV4ٌQjKfcc^# :(W Ze>OvOT&.o|654'I)G…\+˵-; Qi$!n2ՙ :lC!HHL5~|M7좋~Jt% Fl^ 4%QYKUQf&XmA~m[K0o嬗F~rvLcjsXzp[ALl|ωD ~}'# (*&ύ%8m@Ysk"3O}?>5ʨgy%[6\V8*rQޜAQf^m }'#\u|> w2еR[y(W [ZBe$bVȵ,KRw(2t%I48HD3pV736rP $M::ɒ44J^3g|V9HNTC9s)e Vu9x7w Q(1gFpKK2oVlS 9|$ {^[ zë =uVF"o*1f*[ z؜3nƸy' { >߶a&_Q#xh%FX&^,ȓ5ճ:в~@[px /pdS<`*lI 曭vϜɥb?NZ-Zi({Βnk G,+[ض-wGUrDQ$Ql~%B KC"G=~Ϊ\|4 ;K٪UIZåƶz5.@ӴaY$0x928}4{'>  O?߶mu]&M?~<خ]+u9"7*Szk_c HPC%+#d''rϚ~kX(u/=# /H@z̗SST^ gDL 'u M|S_c7Oum1tRyjDb\VRi{m>cV%ي H@EJaS=}8@H> u|Ò%KXcc#{َ;ؚ5kaq kuttw?97ogwݯ_'%ݣrYt794ɦsd@aXH/w"?*ڍ^xfF|ҥlҤI,T3G}ձnvR @DU1xN$q~~OV5*f^:'ƿߟN l,_7ծDjrJW4EP .tYz[>.:V k҃^r9:yrSjcz*CjÈc&V`O>$cLm2k- F ]! |L~kg8]qX 8y<ۧf M"N3c<.WB\K2ɉLb"'O HA-&KE UcyL~}Vxr:m1_.#C,F:Dapfp` DS&%GY H3wǏرcӖӲǏ{ٳhooG}}=m0sC ٺӬp)!r G/3 ۸J/  >Sp# NHppH&X3ΎXC w74û jȞ>Ӄ4cg$o2vNVk`kZ\57[K'(O7#ԺeRkW)YOzSY|758|>`"SU}nx"!9H:֙Tx?t_gδμgE+<T*[o;w3xgθ+K3 dh,qD#1LaXk76r*LϘF3ӝepb2q/+֤ 9g[ηxOob;\k_;EZ@RЋ_x,_n䡙0 n(4q 5N k?8+t?Hhh:31"iVr4= h8qU31n8ĉÚ5kSO'EO^v-xGmmmhkk1`7i߁v(&x5 JMz2U_JqM.^BeEcPW6HrQhS>l*c:&$2 sDk+ERY`q2 2O1@LxJ9yOB lr+(v|%HB8$s IDAT1vWrI¶?3π_(;X2MU*URKn8̵4sgqz[_qT*ۙc6mtr2>"IFVfb gK ^91f]LI< SRB$;+%/dSQ[a_S\0hOF' oR0h-Tƭ˷;PT"JQ@T`WpڟR#LKvNʊN,7S6):Z!?^|Ef۶me5\&ORTz'x1A$n'2浖v5{/=݉Yl:|LXZRNϘ^W(V U!Jn|j2KF" uKYϏfh$ Aa==N&K$!3Wf ɤKK*#[e^0hzV~~N)zr#T=H[rb%;/>54@O8l>nQkדF9q 4"1U2#ȟ֞yR\˲S$v2Dg*6X,jc6+Ţr9΃#淋NޞBztQ/Py<2"S(qPD"Μf55jWfr-:L&T樾rQ O5Cs"N()Ksfd KH*C,ݩi"P^z mmm>}:jkk؈VyŋhmmqJL "3 {RcZ 3凋UI&V/coH&tªUԄѣGK/+RY;xЪH$F#NB!yAv6^fl#@mBѵ* 6ѣ{7o *l߾}xW^y%Ξ=_@OO.2|E_g?6lYfq\}ؾ};}QDss3-[W_}uF=)=f:d /vMcd埗UˢxK!IUms!N*#3 .d@2p Kw"#M)%Ѩu*"J;S .m5B&}§MVUm#i:niFryI;SMT 0 O[/]M4%I}10o1ٳll…S{D լyk+yK7PmH35ԨJ瞛, b̙_8{,y0uT\uUxFlGa3R]yjA2)wR<` ^ ctmӣgz_-;1DlЭ(avx\UC3 3^"S2Duـ<55dR>Ƹ6n͍IC~U44Sf^{M} MYƩSoc}!a޼yiΝ;{ŐX Uligp!O2< .uB!ҍmb'?fjl{Q;:xh4 Lj3[Zܷ(ϧz5v\!T;Mպ +_H$Mq>alWWZ5 ./ػWI`׮]5k| 8w\ݻI2YDrH|nc1>s^ED]Ne􊑕D8Nw W0%&4H/'M5rth뮻088pqرcǎc 'O1ե~::XNkoi'?>Wq~?Hkmz_5؆{{7&2!YSP.|h+DfߗFu W$c1gZ9ϛq<ȯ3y>o e'Iy yR$DI-[Zkmu8Zo'NdHB98#;YeasڱcIP(R(=-ӗb1#.?Nj:xO~ ߵk_$D-2u><EcKj@'>ktZGDK<>mMH,>;~?7"T4 .cst'0ugZ65k Th3_!D2ɿw7 Z.{=ST>0c*^)OU%@gM$}FT*Gk\8p ՕЎrB&z_W7Eq FǾׯ_ /0#::ЧGM&^ .X]<`bgāAA#}D }{{S;:3g P#%![L'6-4vPɓ%gZ6ϜƚKd:Td=}rA /F4A{&51S4q:}0n8:FN#y'b1. Ew:d~?sɦI)W|?ޫFzY~ vdw*Plbda~i5j;]s5l̙ g&U *&b ;1 ,>g&lUUlF$¯HQZ(9[fVKnv95i} `|NvvtU#V62IU$̯ pڷn `K.efJ[>C~Ŕnϓ"GhHDƛ-R}o؜*Tǩ6YbXw `<67tknnVY7i_(21#b#. #SYdʮF\FeW2NZeC!kir̍XiR4 rʮ,J1T)IR^9ω.YX0 m6kM*Hysd;M8Qd񙐿yN*>v`ҥlرlÆ W^ak֬aamYMM ;|x<̙æN:;;K/ĮzV[[^}U[iջ{)?4.73Ih4]Q$=1SY\@P \y10Қl;ŋѣG1cưn߿߱b h/p3>ݨ 2pbIVk'JYtـv22ooxxvrd.ӽq A/^`s8q" liUV1:dY~1rJ6n8VWW.R/;!^H%Ϩ{[4|5{J:6NϐۄFZՄj@%TƼ&g7 N9Eˇ(* =kJYΙJ&bOg@|e4Wl7zgrJ#I_\\}1EDK/rT—%]WmKtben-Hy$쾕jdhrɂ9STuѢ⌳tPzTr}gGsUU\jJ&e{;Y>󋁁]&MB]],Xm۶y>ªUԄѣGK/+RinDttNFۉe>[ W`La޺s=?Ol2_>gؕH˶hb9S]rq5btߡ+1 ]m[Uٕ|L [r)uEsx4Ƽ 8v4D3KQ$F~k.̚5 >Uϝ;{n}͛˾9/~3fMXOU ѣwd2c#jhwɅ!cpмg}'ƌ7oN_N؉HNjARyr!F2TW@b 5 υfG559}}\G tR) =H9ǏcW;vxN81]V|h|hv_f5;fbю41[᠖{pR@8{qKZ|\\9a:77#JyrlP-Z[o>44ܐH/ HU>~YJ俴繌y2Neզgj R8 Ù4i^{^yl g=a0>m6`kL ;cfSj"QW7c|>BЎJdTfڵk@n߿͑!k7nlT>dRDbc'Y 6ۆB|x<] #wM'Ġ,& LE{cd:Op,>eVaƹ8"zHŽ./w44|P~52EiMd9c$ eYE"gL7rnd~+UzBV8O/2_@{/Pi9]1 |R*Sɟd/Zd*}Oq+3EX2WJUd5cܸqJO';Ke/_^xa&-IzCg&e>)VQ--|STba"R)M/jW?Vs5"k1a>駖\jŋ1>~y> J?5skjx:ɯ#G̉oR2iT `F1˩iz: y0zFuW R\./iƸ,}@zG*e_QUMVsЫrlpn^;m]Lr@/{X=ͩ)=r%0 ~XkAdznDȹ:~隊e« {LcI/y"/A{;w+/\<:\ d~ ˨I&hˋz-chT>H2'47oψ]V'r䑹T\"*Z,6K]%X2knebdb3Q濽π+\E/}UO6^L e[H;^|Ef۶me5\&OR=3 ={6Kl+ a2-RG,xֽ4)1;O+&S{؎ڋ,e(d+Э2]Zyc$[Sz ,GQg_\:UгCϘ*dZH{rSP(6TX5I2\? /0Bjp_ ,)!~ЂAdAS T-7bҥlرlÆ W^ak֬aamYMM ;|x<̙æN:;;K/ĮzV[[^}U㕛*%0,36Ig;C䌛lf//jץfl)n4oDjX1򏾛NV IDAT3l՜V^JؼʐhHgu7L${lsV8*=JD+2D(~uT?[%}>-=}@lL1ȸI2pѤD8lv]k8ڧ=&NȂ ?~G}ժUCY;v\7ձK/ˎǫ$%%J&:G*+!d@fXgH'/3oP>e%QU̓LӲ:Phg5.XKԐȵK%K` {'2^i-a0X+qEwީL)N3韶e,^CC.Dqb{;/`о򁈙3y"a#G{t8Zemb_`7p0Jwh@B{I2hY53Je VZrD<^C @˩E* "q/Iʀa[֛ ⮑wdbEºup}qDǢQp#*/*Kd'tIH V\dz5·pFmը7pkӇ HfJz}5CkT8͛7c׮]FM3A6(6Ɍ"#-pOx:uَ5f"Cf8`3խpBfVUȷjp3KpK흐/f (0[֪UJ/$T%UFUbI3gr@sY~:;iݾ~?P[ On[ձ0cFhV(hFa̙طojihhT%“ ò"x,&ꐓIx31~>:U?vgJyE rDh_Ov8dzp'3˧ KixA&JkhHC_{5gtk1U2 ?({kpO4@m&}r;/=.ZՔu"Μ+RGՙ}Rkmy?NLQrC0SZO0L^\#K; Q $I٠L$e25;4"nr"|#!3[$+{>!]$ $ij",͘RgNDAj * (9* s;7e$;$!0 ӭ0)M</r1,JI Ԯ*2{eXaPӧٽ˖,YƏ `>`v+WdaYf]SO{j2-)vl^`Q!FS 8ਸ|)3/JAEJ12r-u&NjB?]% ڎ&kh2UUϨO.yKjn *.N$JqFejY< `D"x'bݺuVZ_ؾ}ey]]ΝY+ X C[[zbGCQ/WVmUHbs'؅y YH{ <m yأFOa cbf'h/ ۅkz ubƠQ9(w7"ksDZX PSӆ;82$kTqipIOn}ngB!i"MϜ&ϱ˧}ҍtHd|<1=_3uDD.s=wB `?q$0AN!\2Jf+/oun\^Jd5kF˳ ?\-?qZ%#D"܂h=c šFIcܸqG6t>YDr7*oGsH NX$2 WK&v"iy3[o7MSODPr>;fFzy3ɥ3'ȋ:/*'XCcd! (2k088f`ʔ)?xw= AKLHZ&p+`ӧ&ryPdr'uٽwlKclhqCC'{,fz~`"`Jk 3qx0h1qk|9)]XFM. qJXihhZӨh ."|süy`v؁~/2z-=CP#GsNQF(fmh/!̙\wJ):ƙ38`'tGFo{;7 {sX{'LǢ:3 wZJ!σ{ܞ2|^wCK44ZӨhw}wKK ,X˗'=cڵk`YֆUƍ߯FеXM Lt844*ZӨ,hllěo_Ҵq>2=z4&NXahhhd\K|{;7hr/zŐMitV]'3,{4 ˿PO =jc7521Wap:!!ׅ>JtP];0v]]!/ftF@AUZd144~^zi# ɷ-J@$o0Nk044;FGǥi%~roOÇxOǎ9e^5]c|l4q.2e(:](ϫG}߼j⹑=/ttF9BAկׇK.C+_K,A*QCCCec;yݢLrw4 [{UutE>ǎcyX&~?yP_M&Î`A>9Q7s'BK/ Co#ElX r4*Umxg_ {n<3xg088Caҥذav؁۷㡇B[[̙ngAW۷5 ֮]I& ,m<_җ0yd֢ ؽ{wG]dkdj{1 CZ/3'ĭN?Dh"x(0cMM $^ QxiZ[Ptx~2 Ly=xreMWM-LS'ܞ j4*1m4f3 |>b'N`]w'?jkkY0d3gd7Xmy< t,Y566رY:;;]]p!kYGG~~yz{n>*Vf,2Lޢ܎0Sip<իo㢪 (%FiY)Je$-7m7*yS4ʋZ.y-".-*1ffQ9y{9#hW wwk..mkʷoNMveƚUKn׫۟ǰb{Um{}`NَWCDT@&qa{@֭[' WBBB֭[Un9eϟoooyMngK[$k'%@Ӹ}*lSRm(a1m0nNSY^/#L}`Ru1\_1 ~Ω/q ɁJ _I.lڴ)nv9sƪw*^aG}xδ~76g8۷J~uֵU0_4SKkr6ӗ۟?y{zpVviӀYm=zm.=DΌ@z)&&WFBBC!rXDDD\\ S}TT^ǏɓԩUbl缲bn b5;t@3szrrya /u}$v:Si z-mݸfիlMOk&4Uo,ߧ@y\ٳK E^̢ʉ 5E#˒GUk١Cy?έDmJK5Z9).͛_TӺu˰@תxƻ~i1oGDjK75}D΀@zGpp0sC{1k݂DGG[Z#GoŪURiii7Xd*>R/&kzuUgOڂ=5g+mWyaT~6^[VvY9L]{\/ngM}-r_ jq֗5GΆ: ׮]C1b̘1չp,\ЬuCCC&ϒ^7`ԨQXt)>Sn~k E5={ZUի/[?^3[P}E)/+:Z^E^]ZiߵWlW[k_]Y?VWWM [uMXUpwrX7nS1c`…غu+F7w1oȑpwwӧu&LE!%%عs~ǐ%SӪQl5JM5KsyvPmw3ի [ʋg\]`MZgƦǧ_ki*jv>fu7696~#g3䰞}Y?k׮ DfL6 (..FDD/_npFLV!z7(BQ,Z*TX[d ]e2WuT_{xh?k8bbW;v߳nx^66%~j͗cܮ@İgz[)ū5r"?rv,a!م%O|[4EvTWuwaayq她,^~uUEk ׍Y^U[o~~[͖nɳ쉨rGΎC)++wDDva_޺U>{{-Z<nhWԽ$%GOߊx{Sپ߿jsSQ9~#*իqwLDTWl]@U׾5_U*MߢEK"E+M[}'s3לeמ^_W6^ sj;"?x;9/U6}k?s]U_~Ƣv&s@s9w'Oj ~{nsk ?bNcǎ?a0غ2}k՚ޗm}nQV93m{V5Gd] yCDvfnߞe[rv?'%i&ӶeluɩZgy[nw(DDuj2AɁJ _Ů]jGD8jz;RDGGGƍv~~:N>"{BDT(9Jd""",yTTСCfӯ_?!00IIIfoGji/q76רI&%ooo[DD Q***B۶mk?UW,_GݡRpdff{ou>UfXPZZ %''=1ICLTwJJJꫯbʕ(..Fxx8^y5ꫯb̙ԩ8`h>?=cֺ&|$$$ݭ[7HOO6G~3Gd>U V\\ EQPsuEV\R<Xcc@wΜ9懬`#J'(443tx5Ѽys;wr=~c# *7zh׮<<<Y˗/'{:dʐg}yHC飣 ZmWEFF:>W8I\Ca͚5())-?un݊A1ᣏ>BVV3Q ƙx"|Md\CD3p@`ժU˳nݺո_[lA=fGT{N}}Æ r ._ @36wމW^kאf͚_g(pss]3qu2>z 999Y $&&"!!cƌ_0dggcƍXtA8rH,YǏG˖-G||},ԩ?1b#r<Qucbn1c~~~HLLĎ;xzz⥗^C!"+4h,Y3f૯wމddgg}ff&+Wbxmub#"gGxz50ydǣI&8z(fϞ޽{cݺu۷Cׯa_7oFvv6 Gaa!^z% :..Go>ĤIt&&6m,>a#"gGT@Ɣ)S0e{a1c;"CĂ j* 2D<++ !!!֭[?ظq#6l؀A閯_...;m1b#X5@HHH1c_!,, ظq#.]jp|ȑXd ?-[ GFQQ:t耼<{;vn=""""^@m޼=JKK ɚ5kO"==<ك˗MԦVV .gwssæM0x`#!!+VYR#D䬘?Ao_7oޡbܹ;wn-^/6Z?B ?"rVD _~ׯ "sD䬘?^NDDDDDDX7EEE>|5dD䬘 ٳgw^;":GDΊ= Dtt4IA0b#jxxar&"gGDΊaa^OfΜǏ;":GDΊ%ԥKomڴw8DDuQǏ?ooo{BDTY15|Ľcr&"gGDΊac^lٲvwDDus%`hԨV\ip 9+?"PW;":GDΊ@G|||]0b#r. %%%HKKCHH+Vؼߢ"|W6&Ks׺uЫW/T*xzz"""P6Zj/2틠 ##Fm;w#F@PP|}}q]w!//Fb#rn,0h ,Y3fW_};ζi>RRRpCD %뫯C=qӦM߿?N^x3Qm]p ,͛71p@Kuu{غu+bڵFbb"M-UZ~=l :TǡCp)~#..C.]j[PXX6mԺ "rN] 8<<==u m۶ŋ&c#"GRTT ̘1fmGw}nݺ䤘4j;w4YϠW#''* 6X_զpuuer&Z4wà8Jwww[YCmC <<\WO`߬?"DDDљ(C߶m۬9'Ks׸qpuK8f͆o,99ɕn)|s=f[PP`OMmݺ=|A=CFF._z,GD`^@ߔ^(<<Cxx8]ID … Z744@rǣcǎuzWWWL:ÇGMGDRײeK˕˟Dd ,Ыlj{984Ǣ;5o5ڦ6Kߑ#G0rHqqqMDdMW?xz5Z`yVVBBB f$"rVZaϞ=F˿;DD ?cݺeeeeн{w4o܎QC3HLLDBBƌ aaaƍtR(b$w9K,u;v, QFyyyDBBn6c""Ga\r/_y]e~ tKMMŇ~#33AAA裏/`9 E8+E\iӦ?Gqq1"""0e 2ޡUܕ%Kĉ{`ҥpܼyxG1}t_ID;@aa!@Q$l߹s/#77W^Ell,x '#"-DDDDDDD9&;;DZ86+>uq9_}p dm xplf?, V?slBA1ؿc kkǃc86aNDDDDDDX9DDDDDDDPWŋϺc5]zvu1ؿ裡1_]꧆>6G|g0ʾ}ХK{c`#{X;WwDN%<>~~~BDD>ꫯQQQ-?#<-ZW9wF ⮻B^^zU?N!)) ھg} T^Fսߵs5Y8}Us8r KwU9±JBv 2|ϗQF(l2uVQE233e׮]?%%%nĉ/{şaO?$*JeÆ f9>|uf5x`ݻ|Gm6YvNjY}lgĉecٸq(oZ}lgUt󓐐QTYk|T3 6((6lm۶ɤIDQ8q틈*=|ײ}vO_UK7o.QQQVGݺuzH-Z$wyJHHx{{ˣ>jV;)l2ټy<#.۶mJqn߾]>sJ%ʾвվbiEhJM5Yƒ$ʒߥŋ(駟}yfD_hv|pl t;Zn("˗/7X޷o_ [nY?mzj… R |Q1VSѲRiѢw}eYcl%44To[/<1B5jdG,}?T*)--5XݻW\]]wߵIZ7oޔΝ;KZZ۠hssy~ڬv>CQEvܩ[VVV&:unݺY%Vm㴴}-[+裺)Um4cMU$Umo>[Y)Kwe}lj!?^nG999PT}c*^6kh':t3gOұU& @:neͱ}gؾ};>Cb|dxzz,WTpww>^^^?~Mŋo7-#((ȨMoǙ3gj'''֭n+x ޽űjԧ5`}]{}T~7cMUq|m9*E^Ǧ&BcnGDDD\\ ޸Y˘1c???$&&ڎ;RDGGGƍVڵkZl?K.a޽ԩۏbZ /^Ŀolذ&M`U՟ -- ۍ^Yƍׯ㥗^QRR˗c͚5{[ǚϑrA~@sR؊%;qѲױ%G$s_׮]G}sy/4iϟoQgϞŅ  /`֬Y-[ӧO[[$$&&\Z픕!55* ?ZUW5Um{|gQ=d|,!!!xѽ{wT*8p޽;[͒hY2>{c݉ &&F]bɓmZCK{X .ĉkӱl2|V5Ϛc6mFK.aڵ2e \3fXk5Zc[jrss?Z{'??sY6k/aS{pe\~`ȑ)))Xx1Zje>vލe˖g5G9r$[Z !!!qeEj(NK{8vrss1Z˗/cɒ%0`{())Y0غu+z!<=z4|}} \|o5B`gO[BBt֭p3;Ⱪ[,(002źm ypu{ܬE;CQ"[ۃ>Zߟz 3gرcum5LmֲeKlЧO73g nhh(>SO>>}B/_lpopp0/^ n>0m4 <=zЭ3o<\r(--߇@ݻON```Z#VQtR8-iԩSHOO;777](++í[p%xzzZ`` Ν;`ybb"f͚YѱcG|e=z􀫫+NÇ}nos5IݳT]+[vs5o}Ν;kmMY wǧ.-9cnGΆZ6:G{&vk6__m&+blUWkLZSN!..Mӧ+-Ё… 8wfϞٳgGy+Wte}ռysh>S?9rM6ٱcGϱi&}zXslgJmf3<#nnnrq?Sj:Rϗm۶~%11Qe۶mg,z|d׶m[3Z!G}dQ ,0Hʗ^zI\]]eɒ%nŋK{sҦMٶm=z}Veȑ(JEQٵkn͛7SNңG2Kb" .4Nmۯ}]{ԩSA^Fs5YWMc+[|={T*4h¬%;qѲcS !@}J&Md'FEQdٲeVkᒑ!֭۷˧~*QQQ![lʕ+eѢE( 2DV\)+WW?,*JeÆ f-ZTYզ'OJBB̟?_n*yyy2c (]Lՙ={("<ܹS;-k͜5cԩSeڵOK>|(bok͜5 >9|_}+tD8P֯_/.ҷo_ۿyI``̟?_m&-nߔx>zDQ9rtM7n,SL>@ dԎ6_.*˖-M6hn"tIDATCZ]soq׵}Xڇ9w-s[zr'y,[wyGkپ}|ҪU+}U9±NC,D&N(vxzzJΝٲ3gJLL4jH\]]Yf${֭[Ըaan}}'' Ǐ[b0`jJ<<}dҥFZclgUfĈRl2>ss߈#g}&ݻw___m+"W\JJCeΜ9V޽{KTTQ֭uQ;%00P宻29Vgş;M{}T~ߟ-XT%ykĉ!>>>&!!!SO/PU9±NC?m T  t"""""""@'""""""r,Љ t"""""""֭[c޼y`ڵunj3₿jq1Z{D\xQYOOOtA/Gf͚!,, o&~н='e˖Ő!Cp%:n /ۿ'OfqN V]ĉh۶-ƍsYYY / "&;" NjJW^yEN<)999Rd޼yuZj%ӧĉ~>H eϞ=ҭ[7:tA~H>}ǠmEQ/˗/K6mo߾o>9}]Vv%׮]I&ITTȵkDVKϞ=e~9yL:Uŋ,[L 7ސƍKlll~Yfvm".]v:tHEcǎ=x("򋈈1B{/\9u2p@ [nȉ'DQ<9q 6L7o.7o~A<==^#GѣGe…r:uH~~9sF.]*>>>~}HG+W""rMyEmۦ[^FɃ>(?ڵK:vh_{5 6eرҸqcu>MIܹh>[vm2m4yyy*͓SN_,9ldC,"񺤠.ڵUVcO ܹS\\\ŋr$"rqQҤ'H@@\rd Lk˖-(7n0X'..N ^L/(@ntYx SL]=|pyG*XE{Hyt9rDEHrr$$$lD7X.Q-1W>>>ҨQ#qww___YjQLryݲT*{={'bbbtqh֬Yk׮1;}ŋhҤA, Μ98|{Q呇2_*]>aÆaٲe4Jfgg'#G )) -Z@ƍ @3N:?((t㏸{La6{ѢEED5ZVZl_fř~kڏ)x0ydzKLLDdd$qmAV#<<n2X91U6>Z ؼybDd)gͣ-[DXXzBjj*.c~aNܹ`Ν;Ѷm[W].]pai:u? 4o޼X; 2`U%N:a˖-*hXt)^X~ɓ'nݺSiەܹ30e:vOOO9sFYy|={D||<~m-?v.\;ݟ;vDpp06mNw\VcϞ=ܹs'"c4_e9xpcƍhԨAj7^N;vM'O/ܹs1v*,_9s& ߨQO?KNNhh 6 Xj ViM6>C;v ;vĉӔI&axq=z ,@QQT*&MqaŊ8}4~'̟?}Y"" QX~=~'2OOO1?3كFHHE1co⫯‰'0qDbL@g*n:+Wcǎ_8u.\ZMu.ntwsɘ1cO4i"SN5XuqhٳG+*J<==%22`B]/^^^ҺukcԖ""裏xzzJ.]d"졇___QE>S9a 777ӧOڝ9sJQL+pyE|_"裏䬲2IKK??? I&9I`48c vJJJgϞһwoz,ZHZl)>>>2`3ggqw`o¢ӧbccޡḲ1c* LD9/q'Q}b%"gHd:YDQN2ADdQpo&2K܉Ϡ9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:`NDDDDDDX9DDDDDDD:FqIcIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BootstrapInfluential.png000066400000000000000000000747151176542545200237600ustar00rootroot00000000000000PNG  IHDRd,m sBIT|d pHYsaa?i IDATxwxߖB H'A "(Eq E+xDQ)EDEY H/ H @ݙ@ BHBv3s_W.vfyvO<<̾c3MDDDDD,c:HAB&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S! TDDDD,B&"""b12XLLDDDb*d""""S!X-dIIIődu) l!۶m111l۶("""RB&"""+TDDDD,B&"""b12XLLDa9s4">rq ð:JIIIaݸn|%&&r뭷ngԨQȑ#у(hѢ/bb.4; $< WСC("ٰc>4WrjӦMԫWu`yIDɓ'pb Ξ="Çŀ9p3x?B@,FL|A Y||'0L3훔T85j`/|4NW"nw,PgKͱ뗞 qD{<@D$ !I [Rqrm!$CHv  pa810- [gڏӁ-({[Ӂ=Љ=09{[#m}e=Oǥv[%N;vÞqnK_cO}#G¨Q<^&L'+ju xYv̥j**R]T/a͇i?t$8p& A&50˜ "[E 'H8a #x8EC .JHBP]RƀRvI.'2)TD#\\YË6n3ɱJT#mrˣ(Nth)FUDQ:2 )_(\+FR8Ёfm,cx]R& 뜋?lw 6b{QFq.ÉɫI ]TarEhnkH_@N+2+c䦔eV.P)|JLDtiOyˉ NR3b$BF-Sd5IuvQxrg9n."y *5ZJYVe,'1*d"rs'ϱ_Ij!QVRgqqw@ujHJ6g0op펥~<BJVV)',elx~q@$Vq{j[F#f:v{K7%aSڄ*4r*_2& 3g%y~a ,e*cR`|couv=e3#@M7P֔kTrYvN|}_@+ 3-Z4woF|'Jʘ*d"_dSϩ*wL%*MJǎwt0%bѽ{^}ܽ)]9(ew0N>M镜L\[eL Hp E)48W91Gvt;ѹ9y啗ڵ-?gvԩLj/p8r/a,eǎ%dG9PLUO?!`geo oN|13_[IM I@[GФI VU5O_f){8C?uIB&g)n֎K/;%g`-ԃjn++d:uBjj c>pqT+xA֬Y,#Yʮck֯2&~FLO$O)hӄuz5NGf嫯ر%\^.(&kڵk뽞K,kʮFeL H>w6,{O9oڽ?s'i8an(W(OsMv{ V#o,g}BVP䦔[@D뜋?dT5|=2"7yTLFYOR(cnӬÇI|r29djӦ*cTD0Y1p&{ OP8ܪRw4/ ӺCk$44Ի)_-d [deF^N$b2|dٚoGW3oӫ /Сv\T#7rm[nɋXC^,u$dku'5ˉDB&<β:@ N~}6l`M}C,Lx^za(%/EN* rI?L_00t̚5iy7P5#R?~ҥK#W{c`3yキ bJxBLe)=%ŗf\.^~EqJ{gpy)<VG2vAvnH.1 {~DhhrI\NNyfcԨQܹQU[Nquxa۷=zXSJ6vG6Hi!GLL 47wG}u=x"+Dz{dB&~vsi :Iכ~ni@nX_N]9 ~(Ry2+e*co+ׯwބH"ФIs>SRRR,t9UV˘ewM۵cUĿV.$LeL9!{Opz8Eltޝ'3ow)R$2%KbKN49#bi92XBI^Q1t$:/̘1@` [74o^ec{T߉HÓKӖ ch8F[DD/|0 ~8 x+m9 z=Svh^`*c""rE*dݻ x]e-8?~W$KbW;6ؾ^^ݯ_*dY3 hHn]XkYRS}/ N-อg,ÍOT$KMMf G.JJ9@i#SP^ٟ2*Wu؟Xm5+Wx0YQ v7cn>BrƔs`eig@G#""e)~' w WjR*ZGelsXcm2&""L,EripjemC-N%"" Hg*m~d9>+J+eq*TDiXOӫDD_d'q$!&~婿xʼnDD Q!h`(TDDQ!omOQ<d'FL Ubߗw,N$"" X z}ַ*ED*dR`JX[=-'>hq")TȤ@zZ>$B(4XFL eҫ? VNV %"" 8+PYHDD :2)PNOgӗO2BA&Q!f(n[,N$""B&q2D¨XQ!4LR ^trIB&~)%%Çg~N/2H*dW֬YCu'<Jp\_)e NsZRDD$#DjELLIOf{@*ҟ{70'p8xtͺ"""Wy/lڴsߢ2{X@;Qx ]BC?!aaaf'! 3Mx8ӥKK֮]ELLAEDD@Golm9R[B-(QDDD2B&~!~q- @*NO-7U8H蔥 P~*c""IwA9p {~P2qJ7.gq"Q!|m4 Χ[HDD$T$_K @l8HΩIOO8iA'6*do2Ni+FZHDDڨI{@(>~D"""' Ybb" lٲаaClm;w\ZnMDDAAADGG3zh rjҁ~/  PB'v>1S=ڵk3f 5j`t0ڵktؑ3sLBCC:t(7ƍw!yei3ۊ'i͛w3׷oߞ͛7w^+֭}G%(((}]wŲe8yd#&&X5j7$^kn+-m:mT""Y~믿&"".]dX߳gO<ȪU2tDDDb?JfpV?~D"""gy!۴iї[.7otdy=Jbb"9gjnO:ʼnDDDwYO؊8X~ Yzغuemܸ:ud;lu;v`RҞ~gӚwLDD公SN$&&2k֬ ?cʖ-KӦM3ݶbŊY+VH^+l >Ҭ""_,?e١CڵkG~HHHjժ̘1ӧcxG:u*v| 4s=лwoBCCYx1G]vԔ폾oPTֵ|XHDDij,/dgfذa1xϹa\:c=FDDǏK.RB /`[;M7~@"a'kãF"NIx 4=RqRm3'2Iq'i`e(ۼʼnDDDGL|^v!F""߲~c޼ypIn7 r4jԈ[o[n]NrouyТCMxW쫯wޡrʴiӆ;RLñl9sCef͚СCѣW1kJկ\͡d @ݺuYp!AAAW022erӽ{w\.9ݺuw%**zj:{X]vW^'))ǏBb "".;5i$FI3-cWt:yy8qGCJ` J:&}9䥜_(T0*T **뮫ǤIHJJd\L`ǎxΔ'4SYl^'h^{aÆt \fz)QdzF/߿?7|3˖]K7dƌ^ &iDL:m?e ˵ t4gcl|o"""BֲeKV^M- m! ~Xlov>|$0b pfv*ϟ"""BVV-/^ݻ3o޼9'Nx0)`^=a|ٳ9xp/08q8gx](""%y.غu+oÆ H"jՊ͛SL6m͌6F'~`O@5s,X֮5l'NpaΞ=˪UX|9?#;/fFs\<:g. -NnW^_DD۲]BCC m۶m}1eԩ㕀~+} !{רV=@Zj9އ7eN:1bߟn۶m 6ӧO{%/ʿT(s]p^]|{W!""M.dugݺu낂Xn]&}4)'mL{MSO=0'Qq8PdvzmEDD$ۧ,!eǎӗ+Wƍ=J ޢ isomD\k5-[0ͮaq:'̂O \,8׽@!y\d֬/y뭱T(T!0%zV֮]EvoLo-X /:o޼\ }Fڽ%}ѹ`ڵ_Yf1w\:G}D*UroEEEOsȑXBB=ټ=Pg޲wpA}}N-{(ZG__DD.QF*UO˖-  \.VZW_}Ν;y5\ھƌ`e宴jU@"""Eeʔaڴiҷo_eʔ!""3gp!ѣ7xc'%1ߍM_.99 ӈ~˲QFLv߿Çk.ӎl*TJ*Q|yzgre4餣"""YN{1d^|EJ,Iɒ%")eP1!/ 0Ȳm߾ŋSR%"##_>zaÆyOa,ejM-,N$""2l׮]L0aÆѼysJ.?L&M4iecE2c&F/ 1 2-dÇt 2>3ga֯_|^F7i%Z?n)uά`{p=D"""#BqF?N||e?Kweƌ;vLO,_xtXm-63Y\Ufv=*/Cll,5:_:-臮/gʞގ38GQkXD FdzzjڷoСCNÉ!YWg2&""A3jՊ=z\sѣG Dƍ?I>4? #4@""">(Bٽ{7ܹ ҹsg7n @&;z*~ m#| .,k.ի}ԯ_޽{kȼ}D5B.N"B YKDDdy1fƍԪU ÑO|l,epU, ٤Ii&əc[x$B8rn 1K(gXS7ţ,N$""⻲?٘H6%O/[HDDķDaNCiZD"""ML!h<6O*drML$쭋G1kB&d󩝴iʝ'ɿT$L$͋GNJv~/Ԛo8Q!:wUL_~]GDDD0 Mj`#"""yHG?~]ζ{R~yuEDD${T|DB?:G͵Z) Qkk~M2QbEjԸmj6FBTTi6l}.㉧cD.S!6|8S߿oOLnJ EϞ뉈ȵQ!!zy887QfU}>xj<|r;ȵQ!!AAA\:thttYZ,]SkC*u1Cn]xfDDDsX~='O&.naP 3f͚anJ_N8GDtF*d>AL4k R7+oNۛz|?"""}:eY9?k|3'ԛ|1*da"eGAD'Jw hkm T .oZHDDD.P!+'P˛zQ&Ko}}VS8\JϭN 0J=w󘉈gĿ)|PU%D!KLLd-[6l_|[ڴiC… &::ɓ'{1q~(\X_ZOgq"{aڵ35j0}tvatێ=Çӯ_? Fhh([l4iloz-z g>eq* ٦M(Xݺuؼys._hfΜI͚5q:/_!Cܾ>WۊRv':U)"",TVEM>3رc 81cO?ĨQطoӦMZn_?n>0d,7 L: f͚Ș1c5jUVk 0 v |MJb FEzOZ^SHvX^Ȋ+vţ`_m#Gо} ;t1cX~}lܸq~qQ&1zUhHvY~qQzغu+adXqFԩl 6[~3_f}ZK&)_Q&T"""]N:ȬY2)[,M6tΝ;c&ϰ~޼yv7n̾䯟7I_^80,;t@vׯ TZ3f?2}\>(SNe׮]/_=z>}pqj֬ŋy߿8u6,LaũDDD$,/dgfذa1xϹaNO:N.\СCӷR cƌaV~}+uix,_B}œ`e黹a(SHnNcOûuS)""y>NqC48(B!TDDDT|i?4?6qB92e.ZU6x [v.lyi;$*d>>ϧ/|C/ 7Cs+Q!1)))ן+k&<<ٳge&O̺u0MڵowXQDDD_?eY # X́߿? 4M%K0tPE`6ppHXcS`rDEYS^=oyd##}HEFP!%3,2瑑>yd"}CLDDDb*d""""S!MRR'O$..(>AEF<2瑑>y\"'OT5{YP\\111Vk4jyF,ضm1DDDZZtLDDDD. TDDDD,V Ybb" lٲаaClm{zATTaaahтŋ_qEh޼9aaaDEEѳgO=ɷyym~m鷓+Y߿ЦM"##|'ߍ|w/)WDEEqy+ߏ|c…mۖRJ@Bhݺ5gϾx瑟~?,`ڵkg)R|ͥK{6m6g]usΙu1+T`~gE̻ 0-[aҥKMiv\h9}t\rfݺudooãNHD$%Z meqEKY%+XXHzi%e,!P $hHQ$A22LLf|9osΜiMllw㏛شi6Æ 3wq,˼n hL=ZKoz$''#G7xlݺ,]$&&STTn0Gc tR_ڬXl۶ͬZʌ9Xe.\n0Gcњ!*;Ʋ,xbaÆSYYqۗ_~Xeo0&99eke۶m3eW^yGg㽖MBBo'cp8cǎ:H0FczQRRRkԄ)SC4TVVnݺ'.xGk鏆 [иq\'MÇ+??m{dXhh./$?ю;tw+$򦤤GY5]s.뛪?}ˊ7,/Xz]=k]xᅺt IDAT!XGCQ-Ýue,Xw*ٳGqqq.,I mkvϞ=q9Q\\2駟 .P۶m'xBN|ƛZ4RFc{oHuǻC pWjC*--ٳw^M6RG},=Z㑑垔9׫k_=[1ZZKC~V^tiYFYYYzi&+*v9ƹy@h !![QQQnyYYsy]VW׶տzZc'wy$5YM-ssY8ސ|ScN͟?_FusY8Ó@X_Æ SvvFiӦe쏆 @{p޽[Իwo&$$h׮]kn[u:FKkzԢ70hʔ)Z`^u_ hH=Z%))I'Np`wj# NYXe,Y2>|pӹsg+˲L~~s̙3&>>ޤl\>ڛg,2{-Uw^|EcYYreOŹ>:_ qᎿ1p4b͛Wq?Sw?<>|t`O쏆 @fDFF^{lܸ&OlcOvyu̘1cL۶m͖-[\yfӦM3vXn:ctbw}b]-[cǚl{kךiӦ6mژ뮻Eϵ>M1,[,[dff˲<;W01 Gk c^xXeM^^gΝ.hh=?ƍgf͚eV^m}|r3j( hh=Z[4DrK/Դk۷V8q 1}W_}e&L`Lxx4hٰa[Τpe&NhJKK'#F.̴iƄ>}ٳg@eYΟ ѐz0+\jpOnj'={IJJ2:t0aaa /4_Yzz4?2&ަЊC@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6@V^^ 6L SO=KJJ4qDEGG}4h6n،3dGk3gh̘1$˲ӧ\6mҋ/+W/ֈ#e˖6O=I+_K=y5x_]EEESrr$iȐ!ӧ222}f3sc~nnz cK/|=E@X{QbbbIRQQQKO QZ} +++Sddd걣GɓڹsN<٬OdMG)))I#FШQ\~-Zd\<ܹs:ؼy~ ">>^<7YC>\ƍs+**eYs2eRRR\Ǝ?.˲l2΃<8ΣQsBϔ˲SO=ՠ/R3~Zo,ˬ[vF),,j-f׮]/e9?eo1.׿̾}\N# SXXh8΃<8G͹"X4)fv]tEz'5sz>|>sϙ3GӧOÇu%nΝJJJRaa4Ve9f}G*((pUTTh…8p0O=df}:qℤ,_\t7*<<\iiiեKIɓ/kܸq3g?I|֯_o4_}$9\l,ҿouUC]em۶Ն |P'OT~f]{v@3d-ghϐv2lF  f2lF  f2lF YTY*((VEE*5`@/eee(::͎@UII ]NR$KCںue c=[l4P=,&VŒ=,MZ6VXM!UˁF *,RQl2 %)@`#lݧKʓuHS3ak/V^ޒͪ2^y@ .::Z?k4pf2lF  f2lF  f2lF  f2lF  f2lF  f2lF _r+&&Fׯ,YҠmy]{Pv9sp4|# HرcceffGQjjRSS=njȑ>|-[?_V_^hhcիuM7iѢE?~s|***BޝwީUVTڵs|zt1ݹsTXX[иq\'MÇ+??aaaj۶KiӦY k={(..UIRQQmGO֣>RkZb{f7 ѣG<22ҹܓ֭ު{N~Zկg>f{ ƦM4rHp {Ծ}{mܸQO=N8gy}SN.cu~ldQQQn9{W^Zts,%%E>}&L=zy^xl,11Q{ްݻwKzq_JJJ5^=ˇ3h1cƨ\˗/w_`bbbq/\|A\EEE:xBB_+,,Trr̙_W:Ν;B߫s,sssqƹO4IV~~m_z%wyz{@gպ I***-[e˖ꫯVXXt\gΜiyϐ=zT###=#GGQffa=Sϵpf74]y_]r%{>**U2-))]GL}^x~lƌZb?]v޽{k޼yn{p޽۹O#I^qQ疺R Yvv͛+449ޯ_?ٳnjr-_e|QrrmoVcfիW+$$D\sM#y}رc+kWVV6 Ո#4tPw}:~wEiڵq#--Mڿt"I8q?{ѣGuWkƍzu;g^^zi֭_~5h+VЌ34sL)..N/m\ppܞ Ӻu4}tW^y233#x{j-7ZJ'NO<3fhΜ9O4w\ZJÆ \}73d#G[o\Y_?a =dÇ 4WUPPPk@|x^{W_}U/B{x^bׯ__ d?TRRRkTwx^Cɓ'c~OCz{,kܹ  c>uI7oׁs?zK~1yw}^O =d?t=bWA'lڼy;4sL_ `y^|EM6M^zYE ׁgs=t_ xڋ[}1u [n:_ (y}򪫮RFFmۦxfzC4Xd#]qgwdYnffΝJJJRaaot@ ف|0 3dվ̙3%@P:oWddK~_j֬Y^O yȦMh۶m w_wuZdx^?Cw}W?]ի>owBvI]tEn۶mׁ?yZ㯿RRR=@9st 7h޽:s^}Ukƍz|1GAi֭:v옺wUVcǎھ}~b+dl_ x;RAA**BVz)++CvOZdokƍ:vsg` t,I$ ux-!N>ey\GV~~Z?@Kzg@ c6}QFF}ٟgrss?_۠}+==]111 W~dɒF'PHH-CAAdK_eAycjǎT=T96h~{9]||3UT+c5T-x},--M-jW+hԩ@bb-Z$ݻ%I{vu)=Cz衇j- ^ XPƧ,'_1c^um9,X%'g~j=fQzz?+&&9?tSr}Z>%و#4tPw}:~wEiڵqLKKSvv߯.]cǎO~Rk;vTEEe|YYںu{FgOYv>CYYLVX3fh̙*++S\\/^rpp̚t5DY*(PUj^2%sN%%%$x@`3d6#،@`3xj+--zVqwie.- hР۵o$e2:T\\[+/He{٪06PIvڷedd79s2?TPPNrr(d~"T_)j92?V)W:@A Cai~r(d~(++CݻO'Q5ꐔg(++þ~(::ZyyKC6{x@槢5vOnY،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3 dJOOWLLկ_?-Y.]ѣGsj۶u-f !JKK5iңQW_=J7jҤGUZZj/=jcǎՎ;=z(''Gr8JMM]tEzuUW/ЬY۷W^-xj*))ѠAk߾IʒdIr@[W^EGG|p q1̏9];kv;w*))I߿NIՂHfi&N\mi_[иq\'MÇ+?? /e]C|XRU E ۳gj]KHHF?~8p@>cKPIG$=*FI~}TѪG*66xddsyCUTThɊдi|6ǖ37,'%RAո_!7C KIDAT/8i۶mZ|bbb&==]:urKMMǞ c>s"i{FY9vWcYVnݺy<^aad 휚tS#m3RLկL?5%%%vOh0o귃TY*((VEE*5`@/eee :3ԍ@槁 x lF  WeY=eY}dY=աCo{j etG CŒ=,MZUT+c5T-@*%KU@ zI4j92?ݧKʓuHS3a ?%U!U=d@C Sњ?YZ @'n2͊oP?f7O@d84Qߨ5iң*--{jAoqcoq coE +//Wzzbbb~iɒ% ڶD'NTttڷoAiƍw}W\sRSShѢ:;}~kӦMzrJ]|1blB?'~?Czj_^-%Ig}G}TǏWH믫HyyyJN>{UdȐ!ӧ222};o e<=*""Bƍs4i+%%={t1I ]wݥӧ/Х^ڬ0u=fyf-={(..UIRQQQ&&&oȶLF_!;zbcckGFF:{RVV\"0q{ 얞N:*55զ[6(Wʜڶzn۳gOgϞ:;mDݻWe|ݒ޽{{6!!Av5ސm?|ߟ0lg{ 3f˵|r (&&裏TPP… 5p@]r%6o_1Ӥ >\;vPffwEi޼yq>˕l߿_]t$}wJJJ5gEGGOy_^^{ ?C&I+VЌ34sL)..N/m\ppضm[mذAzuIOk֬!V/3۟!v&Kσ pE=\QWp 5A06'pE=\QW{U0փ@`3d6&'OԱcǴsN+zcǎɓAvܩ$@@+,,TF!5ɓ'G= ZϞ=BC6#,YyypOK,iж%%%8qվ}{ 4H7nt땒+::Z&MRii/O'ZC QHHHnק㕦СCJOOթS'7~FcZzCjz=.]ѣGsj۶u-G0Ǻu4d]r%jӦ:tkV+Vp~GcњAL:t ܹs͛ԩSeY歷ުsSN޽{]zˬ_ތ=ڴiƼ{.n޼ل1cƘכӹsg`N>ݜh-QX75ZSki&m fcYy7ݮ јz0HNN6#G4oٺuYtILL4e`#cҥ׿YbٶmYj9r,,\e`ԣ5GCU {weYf.Æ 3111/,l߾9VQQaMrr˺\sݻmf,2{-UNǼp~ǎu`ԣ51գXii 7SLqhL=?ܩ4ݺu3?O\ƃ?T T,sssqƹO4IV~~~SαPu]*((_|!I;vVHMIIQ=jÇ]7U5~^ojaYu_FCQs ɻzDGG ueСCα`鏆֣Z;!!!СX;Q5GCU ۳g\Y$3&&&={$As֣eO?\m*66VO?꫇' T,11Q{p߽{$wMHHЮ]jܶWOuh-ECKo"oaє)S`ο4Lѐz&KRRN8 6ԬG@㣝vYf,,Ye|s.ׯW^1e|ؙ3gL||IIIqY799$$$|7//Xe^}UZƲ,rʦySs}u!z\ c0iii&$$̛7C4Zx2|p ; T̘A4ٸqۗM<ل:N>"u֙1cƘmۚ-[cͦM6fرfݺu&''t$&&ε![l1cǎ53k׮5ӦM3mڴ1]w]k}Z cYlYl4ex9v` cV4<,ˤ۷<Ν;] zK7̚5ˬ^ڼffԨQn- zh d6^zi׮۷o?qDb>3L0DEEp3h aYnIII1&**L8є6y5UsO>1#F0]viӦ 7}1gxS ˲?!!!.)z!hMaLqWܟnݺ:NGC,1{ld:t`̅^hzzj hh=Z[4eLM   f2lF  f2lF K/.]4qL#G61Z\Z Ȁ +V8?ُkY,jc4\j֣%?eYƴp7qmc4\j֣%?B ꫯV6mԩS' iӦ .PTT~JRztչ]YY&Ohkڹsg[k<222R<{g}m N2 rm6۷O/U[@/eرcWaz!Ij߾W.:}J&M3gꫯRTT$iرڼy222T<iӦI.=ڴi:IMR^^BCC%I>VX˗{ߍ7kܫkZsW]uZ͟?_n_\k?nݪRuA)ShȐ!2 $%%kUBBnv_HEEE9Cرc|2gO|q.e)>>e좋.s*))QN9x:T~]:{p8tI-]T'Ovu4e駟ֽ;F Lhh{=ZJqqq;w*}駍OHHHTۓ1[Υ8C?]~>c1w޷/~-ԩSZz/_ptMn׭aÆ)44T򊒒uL-@kVoc+77W٠\رJJJ>z>Υ ꑔرJ .QǪ9+V ;`}ۨ5Uߦ\n~K& ȀSPPڵk>s/Qii*IR.]qF4Z]~ӟjܹU\\ɓ'm۶M^???siwWsu=+g=nGF￯C>ГO>ݻw׹1OsѣۀnզL+Wj˖-oWڵKSNUee9?o4x@:hݺuO+R?y=ZիW.S>}> Y-33Sݺu5j(_\!P{ǎ<:s\]G[k׮U߾}um[n3f>SEGG7XuSjΣZ߾}kFqqqnĉK/iƌZxΝC] ײUVV[no~S=̀^+--Ղ ;{: Tyy.b]r%;w=r,lC6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#،@`3d6#!nKrIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BootstrapParameters.png000066400000000000000000001050101176542545200235700ustar00rootroot00000000000000PNG  IHDR,}sBIT|d pHYsaa?i IDATxwXRV QAP)R"F ;v7`v^o,b bFcEEԠ&ĂDcE\~LX؅]v̻33 1@!B!QSvB!BB!@QB!B(jB!BHE BB!BiAH!B! 5 !B!!!B!4P $B!B!@QPc:u*5jm۶h- "%''K. -ZƛښO? kkkt}Ç%oǎptt#:waÆ555|+޽{c VVVXd Wŋ<ԩvMs 6w\=zTR^= 455cǎ*{1X[[s=##BѣGB2зo_lR.] 888FhTft :t(޼y}%55ptt߿'OTj}e߾}¨QPRR"2]]]1BiVZ555$''s*#G^~-v xDjÇ=z4lmmѹsg8qB4U;wGܹ30i$pӪʕ+";;;888}P60a`oo3\x3gpe1m4: >֘:u*Wŋݻ77ɓ9sD֮] X[[#$$Dt7W,bor#2SRR¾K6bcåYQQc۷oMW;̙3ٿow^r?~d.\o߾}g<==ً/a1x<g13֡CVRRcl޼ylɌ1ƊYYTTc8,r bg1>|>3O}XNNNrNbvvvܾj*6qD󬸯t֍:t1ӧ7dAAAU~x<^~`,==M43 vusN6|j߼y0sss$._UqF_H[CW-⾣OZhRSSŖ?Wqωnbvv6N"[(0޽{%.lll؏?N::tҤk׮1۶m4hȲח1VZXXDc<`of˗/g ,~cvvv,//1X~~>C;w[nqRSSѣGcyzz W؃c!m-[5k0ӧscqƱ?Ry;;;ɓj?KyYaa!+**bĉ"~Sq**QPJGf...ʊWGwƌlΜ9߳ݻwxy%%%EѣGU+((`0333T2nݺU\{Ŗ)06n(伽O?Ľ߸q#WU>|8򘙙c`vq{Ů\R)Ϗ/O8m߾]t 9KMMX毿bݻwƭ[M>{ [\}%;;5o\L۶mJ\~~>kժ+,,(F:x<[bsqqa\1<^~ [|9 ~t!IǏ{,##ҏښN o߾[l̙3BG!tյkWdggWZ^dd$ڵk33*:qڷo{{{e<"ݸq# Vgw4issj@\\zڵ+~'ݻw8q%<. ㆇ`ʕ_[nѣG2dzxx 66@K%˿L˗/ *$4mFΝ담4n۷oΝ;cܥ%%%6máQrm+++t۶m^2]vŹss0ư~|Ϟ=*Wq_̄P333dddttt`ii?CuCTqE̝;΍=hڴ)Wv͚5طox<`Æ b?/ӓTHHƏvډ_]v^z??jՐUffoDoErRyعsgOOO`̙&qyxnnn"W?%K`ii#**Jh.\Pm|D>+\~III3gso 6mٳg֭[pww֭[ޮM6Ν;9r$WoTƍ\j߾=.]7oΝ;8}4^ 022BBB<==xuDsjoyk4ݻ ݺuCΝxbՊѽ{jٓ{/IBT@rr2 ["[>畽W/f?~,^۵k'r@ˮ ą zj?ڲ\*sUi>}ʕ+1jԨJ;̺u됞^}i5#sCBB`8::I&@tt4 O>._@__õko>8q7֭[066666?3//@b,;w{n >n݂rssѼysz cƌAhh(BBBqF 8̚5 fݻwٹAcƌׯ0rH'j_(]B?n4iz˗%n$-Z-I׮]͛7anXُ= YĄ *ӲUU9Lqq1F ooo|li>|30k,DFF]ݻw1yd>|ZZZW?ׯ_#..FѸqc+ǏGDD !s ҥ LLL`kk {Õٳ'ڷocǎE||<͛72e ޽ >Ǐ#)) nmm]woD㢔֭[|2JJJ_`۶m3gN]QFFoAuuq9qBΝŋ#99ׯ,_]vmV)~*xbcuʕ+022o,rJ! 9}Eaaڵ033χ!O.ڊEdd$pmӧORcb>?t%L4 :tP<333q53Fhx6m;w.wƍ?_] ޾}[chkkcǎw]mиqc(Mcǎ/Pa?tuua?~^^^شiP[ɓ'P9tkkkGwܹO>y͛cԩgsss^BnNNNb͞=oƟuBֈWLMMN6ddd58iUQQ/^ ccchiiQ£+ 1ߟYlu|2߿sssɓ'߿?>W駟UiHTs>zHd6Ѷm[?GGG3gy$''cػw؊xu 6ݻ7:gxW 333UzuQXXYfe˖àAD^T4s~'zRFՅjjjB[ۆo-Zv޽{?%U=MЁ܂",a☙aذahԨ%8ɩfEsIUuIrב`֬Y ͛1k,efbyrctVU1118Q˨m,@;f2yT:ĴÇYff&[t)c?Y><e1o{!344dx={-Ϗ?/j_a1WW*o`.]i̙3YvXll,b{a?TH<_1ǏYYFF\%M @_]*Ϟ=+͇U=eO}/ƍEBecǎej]^^{:}?~\HKK٩ƍ+'Q]([/{:ֳg,##CNqY)2~q*h֥Kj;r~SqǏ'XjȘlrl޼yBْ%KD>}:#[fѢE]n1),,dCefffÃ-[|9:t`ё{h $-x<әspp`;vd>>>Ç^x<Mˎ;&6[2{{{:wFcq-[ rݺuuؑ988.]}amlmm=С[dI- <[d ر#ҥP/a{fլea y~`LWW5oޜs recbb#ennn\[ǎcYZZ_"{ {P/ϟ?g-[eB]T֖+[Wq c0wwwfooϺuƒqUV"oohW͛7ԹLj#ظqcy<ZVTFVҘ1g:::ؘEDD0J{Ü:u7>|(6_ٳ)_V&Flll(#=*6'߿x;u7ŋLSSH4ߥ@fbbڵk߷u/^CEEEq (͆ .uRTT$ԩӹСCe dg.]0{{{֧O.c e@f̘P,qqqؘ5i҄5nܘӧO3J;7of:t`SNzf͚%6֣GfggY^Y+qU9̺u넾Ǐg;vd;veʕlڵTό1zjfeeŬ:9uP~Sq͛26&)AXXX444~clW^"f,!!1V;w6l p@ 8/^N:ըšf666ROwiUҫsq{C/Ra(]M򕮮.7}+KLLdӦMSv_aB֢E X=H:99+V(!BRaÆLYnԖ=wPNR1oooeUSj0;;x444X`zzz*v< =sIG[HCU1;>} cccܸq}(dϞ=믿*Ms",, ݺuCZZf͚cʕ\9Q( xm"j?033"##+3n?Э`i)߸Qu3_ݻwB`bb᪚AH)PWWGnn7֯_@?бcG&L@HHPW!CMUVo022¢E`aaQ,+餥6$5nk5IÖX8qfhh|sE|(_R(|>NNNBJ@)b SSSCqqPwń"K5We4i###رc4hBHݦϛ7'N\\\g!00ccc[0h رpuuEZZ-[___hh(B1iUBBrrr/^`ժU`}6Lk׀!*{`Mbʔ)?>Zlf͚aE߾}1!DQނ˗/!::&&&,ʕ+QRRsӧqFe}:Z ÇFzz:6m ___ǣI&R+#׮DG~76"wy;V*׷o_hhhҥKr ,%;.U +\6{(_eAD{qA4kL 5jKKK%@B"Uxx8kaaaѣȲ1bϞ=x)1tP|խq Ǐe՗{T"T" -[v&M4AZZL#I)*_>|Ǿ}憝;w011Toݻ#%%SLc 5+*6oVvկ!F%˗hҤ̂"i(*_m޼ӧO?LMM KKK$|g9r$LMMѯ_?3wܩ !uկ!Flcǎ>޼yS >|s5"<<ֆ3Ŗ􄚚Z_PPRCR("_!11^^^BýpUƍq ==gΜA^2({?wq\+7NeR6"Sd(gQ6GB̟?_ą 5F]aAVV'N@nn.JJJ:k|BHݧ|@CCC[Fnni|||rJt|>ի^~CԼ9^\ّ"9Eկ!DRbf͂5"##~o߾c غu+tϣK.EIz"Ty4jZ7o"""pddd`.Zti; 2Ddc `rsѯD%9Ul|"ZMQ'|͛7/_ҥKl2G+jڧ;(gQdrK^^^/,HII+WpܹZNTӛ7ݻ՗?j!DdJJJгgOq]ڵ{ޡ(t>_Vff&233~M4~Crr2\]]kDPP؄WiXNzy޾rffGre+B*+###XU8zکS'۷?gsss:ק5 _aTTVZ%4ݻhFeסBQ"<<<aX044Dll,waqq1켏R?p v>F\|M4 y<aaa#GGJ]X~QT.b~h>UWs΅6oތÇ#!!ؼy39s`͚5Bn:hjjb̘1^>Q3(\pĉ8q"7BMM vvvx" ծ];uJ B\!u*+ggg?~K,%K`dd5k`ԩ\``„ xpYRoT… h֬"c!rFGd֥j|%>Fu򕯯/|}},b XBAeAD vBQ6W!DH؉?իW(..[T&ABHmP"!VeǏ --Ml9x<$IP"!DlÇϐ|^B~~>PKꠞd֥j|%>Fu+L3(jFlٲ7n^| '''x<<~޽CRRMb=%|E+(_BT3G&n݊FUocc;w}Xd 0aKjKBJ>h?W}WD(gQĞ!LKK7o% >}*`h;vc""Uxx8͡ gggNj- 55J/??/RQj6ǽc yyyBѾ}{$%%/JBÇ1|lذ)))߿?|||%'˽-RQj^2jddW^q۷o1x`nxII 233&mI!r|yfL>kЅ"::Xn]eg#テ=ΧKԇ|ȐҿU8ևmP( "{УGa͚5Cdd$vڅ/^@[[͚5u믑 [[[UZvy_Ʋep [lj !QD200z999hӦMСCXv2~6{բ?ϝtU9zhܸ汑I+BaihT[TY}탛v $''ĤR"8s Zn,$BH"|XOqqqr#GƍuD$+W)Ԛ,W"5eI^"##QPPÇsU)4fBH4obbb#˚"##ZxY}+V^U}N;K:u :::3f VZuuuxtкTMW/_"88999Ctt4w5CVV44jJJ \sIBm|/ڶm ssJ*… r #;.U +~wCCQFrwwǏ?; EϞ=q]*,Q{aKT "[ 0{@|vv6B |E+;uSNӧiq4U^2zUj 3f̀='(_B UW|> B__+S#9τ/bGիWѾ}{ED!R|E+T!_} CannCCCr(..F||<֮]+rzjRe͛7U=B'Ed֥j|%>Fu2ղepU|@hjjb̘1 ( "3;v L!*!PFJMMŰaÐ===.]L0^Ξ= ]]]IQg&n+:uh) >Fu2W?rrrP\\W^ppp*b <}.% "30c 6 {Ǐ!HLQØ?>6l؀>>>YË/pdddB_BTKF߿ǔ)S֭[WtGH!PTڼy3O@hh(uU*>|HB_BT쓙)O<{@"-E䫢"$&&bŊBýUt)/ĩS1c`ժUPWWi|WU#AHGZE*//{fW֭[#77Wl\qqqJoys̗4=_=} m[Сc˵hQRSe5v)u널:!|EQ5b;Yr%&MX!F(_B UWsr 1k,lzzz4h%!DQ6?}oߢҸ/"  ªU;IdzZ|~h=W صk5g8}4nܸ@???<<3(bk֬AqAgΜA߾}~>}VB=D&6BQWB7nكn} "##e QQQwΟ?/BTall,x< &4|ѢE()).]ݻ {vfk١uZannmmm8;;#>>^l٨( QTTT+窏QݣՌ3>}u sMO>0ի2[>Q>D ”XXXYfܰd$''C`` ~ B*RT:|0ϟ 6 %%2I&^9995Z>!SVСCu֯_BBWWBٳg2Y>!Dumz -ZvEùamڴ5RRR!!TCQj͘>}:ajjPXZZ"""B4<ZzB.eԯ0{l߿; %xB/BH&AبQ# +{fp|QB///^^^U^R{e˖Ƶkפ^6!PF͛xv MMMhjjoahhJqаiTBT/xPPP_M4PgϞ ]@TēZE*//Ru9 89sZB>}p >Fu2W}ERRn߾۷o֭[pvvƸqp-899ASS.\CRRk|:(gQ6b 8vˆ#[ 6 \ϟ#33VVV KK^_+;Z"/WU]. X[[=m&Be+===p/[[[@__666hڴ)L_'} !MC܈#::ׯ_XzP X IDATгgO9Id>^!JVVR.SD200z999hӦqrrC;mņ*\!j6{T~U0,X~~~(((@߾}qiGAD E||>>Ν;"B"Rz7o!Kl444*='s4 B$qd|}hBT"ռy0qD{AZZ066ƺuׯGnСC{۶mCBB=WURe|055gLR+Wx%;;;DGG@igϞaĉɁ\\\gggDۨ~EQ6ʔF߾}ѸqcnBCCC1fAKդ|GǏHHH@=qqqqއ(..ƻwp…Jʫ2UmWD(gQl.\~~~pաY>6mСC8x\%P"!DlرcشiLMM7oťRoS={ApvvF||D:tjjj2dHݐPCR(2_5$>Fu+L3(b;vɓ'ѻwo wޭQaAVVVedd`…ٳ'uLH|E!Ej6aeejgҲeK(͛7c)BCCaii;WFvB8E+B-WU#AXXXƍK4hiiI"$&&Kh^*vիW&M !D!Bd!DՈ}섉 RRR .vo޼AJJ lmm^x^^ nZlZ񈌌۷<.G׎ Kբ|~h=2Q =C͛7U^ +..̂{ƏݻwC__4pW" WU# app0{̛7/^)SqIII þ}```ٳgKpW:6mT*Cdffbܰ&NNNŀqqqTIII{/_c֭066*4W" ! wܹsajj g3g۷^͛9rX|9ҥK5 EӦMhjj8BHݦ|E!@JĞ!,cddM6aӦMx=޼y===4mT&˗FNN @VV44ćIB;_BP"jAOOOA!((H丸*ݻw㩯$Yj~]X,K+_5$>F+(3(R5Ipp挲 B![ˆ+<<ֆ3%СCPSSÐ!C~hBA9BgI4\׮e;|0ϟ} ;wE… ѳgOB!*J@ʎհyfL>PDGG#""֭9@ رczj\|_VdDڵԪ/C!]2J!(**Bbb"{yyիb[z5 1i$z6j=Mկo%!w҂3~gn|aa!f͚-[BOO Bvv#&(!l@g)١uA Phx֭+rxDFFcrh?\j* ?FDڵÖ-[ЩS'~aÐ]bΜ98wN>f͚a͛7VipRP PBjA\ݻw?~*--w}"tBII t.-ZO9!\nz $&&";;ۚqJT"22iiiѾ} 5k'Nѣ8z(9>}K.8z(#>?wwwԨQ#F5kO5kD͚55{yyV䥳C8g4o7oЦM$''s<")W&M’%Kwܹsxw#G)S\]]Ѽys:u͛7B0[\Dd?: cǐ 4X{Dd?tv|M?~ĸqP~}>>Xp!6lkעwT*~@n4g(_]n[\իOf*_0_'蹄 at-Z C>Sܺu˒1|EDjطo.\_3f/v1bo>믈Ghh(vjgKDRԫWAAA j !<ѣGQF={Y/B~0_U?綏Qb|8M6ؾ};6nܨY4)) ??ʕ+#G$I֭^}UJR1GNРA[.z=l{k^1_6^CHPuW>#+"5&C˃ [$IRb֬Y3GO|E8 Fann.Ξ=^_K.xGiO$!((V[]pBurիW#>>)))ҥKxbdggk$b׮]y&7oI &`͚5x4|:7oޤ2yB}v|u[ƍѸqc< Zhȕ,XѣG#..#55K,Qk3<1cW_СCB"x|EDNU e "WĴi4`Ϟ=/@FFN<ٳg[*L"q<""[ù(.Vm&u^^^===+,7nŐ$ vsfsLAڸ IѣG}:u#$2=K[jض ͲPZ2nڵq1ܿ۷oĉѰa >^=_SHD*| dggIRXY>I2bжɕQfMlܸ={TOHH@ff&Ӎg8yFy{WT"N*C|ʒ8 Q^0//..իW1b? Xt)*S """P3gp 4mO<9c" gҾ3_5 FzΚ5Ks{g7";;J:tѬY3u7ĪUp] 99,?ͷעEBaPsiB={`ҤIزe7o"&&hݺ5<==|rJD  9աCo";;{t邢G.0a~Glڴ Dii)zꅲ2Ġ͛%7Wy?ի1x`?'''xxx?of͚]v*_K|e>GG|qF?sԯ_C׮]q ,_k׮Ett4/oߎݻW}s1CN>.~~։^1g6:k8puA֭_Bpp0>39III<""Y0_|UXX_>ĒtE]-Z={,!LO7|ׁCT};DsŋѤI}> `믿/سge#%"ҁJ'SNf͚YFY///\|٬k׿ڌDՕ3%%%P|-m5#JKU Ӆ#_=| ԬY((({u#}_E||g^;wR4X=""WDDbU}׿'tv ѥK8qb{xxٹ|x{{}y -- O?2j2BҎ-b|U.99sEAABCC;j-駟"%%Ǐ[ƬYСCiN;w.wC!5YpCG*  5KH69!XH(k+U>=nڴ JZteҤIGtt4l2`ȑCO=9s0uT\5R]Uj֬i8vY+_-XGF\\Gjj*,YuV+Vh'`ضmƬD8of: e>ذq«W"<<*..W\Abb"Tuyyypqy%KPRR^zIӧcԩl5ϊ˶X#_9ȏ=hVXH;"c+RiJsct3H+kqAkCDd29󕩳"_^ȏnDT=laBB^|E HKKfLd!ؠ*k"o۶Mȏn`x# ClB&ɉ99d4&&B\|ݻw74{܎;,$>ẂWDdktf /]K.Y< ""SY+_qVd"*_!4(^BDrVDTU<""[Cعsg+AYF͇tk+G>"+w 4j lx̉9=`ݫyYicTpصk.\{aΞ=sXYBsk|ƏYB[\dߘژ3HSN_X+G$5g|gѽ{wEJD +/SRoxI:/_FΝqAt sE&M*>|8X~E%"҅S^ IDATmWo{%eΚ5 x7xzzV(www54ؚBޥ.. 䎔l!6mBz0sLH 9syA,]2xu.SV7sa"91g6:^xO=JJ\]]Q\\l|E hܑ֬9ɕvڅ޽{NNNظqc2ӧO/x ߔJ`\#rW1~Tonnu~#Ws'ٳ'`Ŋ8~8ѭ[7} aDDrrr \|m۶5{pDrx(.63\{g}VO$L:ݻwG&MtRBN:aϞ=osR`Xv-ѷo_A_8qRSSQRR!C 66R^ HIIAtt4.]Xdgg߿Bw'D\\&NZ,FRmlhqdf|EDTU 7cזxzzou `Xu b#2УXLO!F Ѩܑhgo?|?@hQWboTF嗇øqssTr+Iƍ$+Wh3fѣ>G]گE̋,{9 FB@5\>IǏƍpwwGhh(׿ۻҝbdffbڴicbb8DLb|U.99sEAABCC;j-S"33Xp!s"g|e3_z~~8g&!Vv5lÆ 3{ㅅ(--:D晝"R p!s-B[rf|e@xyy!-- ͛7`Kt$..w.7y2.?oЌƜA!6{;h""ǰ`=qqqXd f͚U|֭Ѻukɓ+ѣn߾SN>s 9 &L3 ̚5 1j rƖCH Z5jdRy8;;W8kXr+_q;J|́ХKI&|r$&&ݻ6l]hl۶ 5k֬rDd\ @Y9!Qg˕0RDdd$гgOt̪ Q#Ww"2\JΝ;LoiӦUы?@/O.]ƒjBZp-ܺuKU |||*=sҤIGtt4l2`ȑCO=YYY… 8rOV*GcVWT!~I e3H'8w\̙3֭$I”)Spܸq.\7pې$ =z3g*@\\ϟD`֭HMMUOАŋ\|CDDx 3DdWFDO+""cTfϱrJ 81c0p@4k <F(WhАҎRue|C9˨ `+1g6q۷oܹs+ @͚5C9m$I6y%'ooUQ# 7Wh*a 7}njji՚5kŋ#++ zC + q|5a}@۶SY[9phFu{P`tÏi]ۢaQ%UK__~u}?饇K/4 hqcyԩShժQ4lǎ3[PDDVÕ+W|U0qTQüyйsgرR1cKfȒ%.'+zڵ !Yaݺuׯnݺ:+~:PNHAAƕwϲŚ: q;2[<"+"5:;ݻwʕ+1x`Z =y&^~eܻwh;z蘯Ls-wd-Vzxߙ3/X/.+T_O>>ȼZ[l-[~UVi9ի_>fΜi͸Iڵ@= l:a!lܸ1~g 2Ʋe˴ W_}KHF֯; "c%K厂*+siC͚5clݺ;M{VDD:1_`""[CfƋab""|EDl!i?gݺY>"""""SC@8y}j3䥗!$Ĝa9.\z=oACHDdS i-hCDDe'/BU,_nܕ+?ax1ܹic wqu0g>GDd厀l;D&hȸ)!$y}눈 U?&Oz=T}Ch}p{, َ0`$ |u!ҥ-[DFZ>"2]xj3g!$!QQ@|ڶ_7ƍ٠ mBDc`0eT?*`Ёp6:1ʼ(歓_fڵ櫏9=99s> .[T ԯ^m$uΩ6}~BGcd̝; ERR:v(wX@Br c!8 j:{fО8R"j3y3ӳ2 :dߘ]vW^ ::K.Ell,kZ=eo=ԫWK$csU=YSy3?M=+ORVwR ennTgOÒeIBW~۶mѱcG̟?_/<<5k@$S{]`t3s,auWݺea <}Py'0Gzh@ugO`f\TbM7e܊DWWr's]A#_]n[gѐ]#uqɶbdffbڴicbbg`$ ٿZѣ[M;Okk/aO%2K@lJJ _o801Ց9q6mRu|q1,\h|눘Z'xto?3dku QZZ ///(((0{{V~q7\,>ٯ֭[_r98xд4rrv"n )+|bb4Ū37NgחKŋ6w1Tiiju`wB]$mH׳qBsp 󩎯rG8%_Uyuc ѶmMvy#%_q匍Fn.Tf*KtH:pvvkU~~>5=ĪzM1R”!}D11M~1WllqM;94ibBB;w kfT%1_̝|Yq'35 hpvz\k1cFEv9Ltt4:tqsDDbccN)(P\;;fHVw&1EKEWeePMQ> sufN3G*-U3͛Yw1k;C&MB||<e˖!''#G4{[ '6܌6XR9c O62/s+gg+j==a\\\D#,, \#l +"dCFB[NfK[:kʶem9 [{Mn x D<!$"""""rT9(v2jkらO/f|Ed9W|Ed9W!$"""""rT;d499pssC֭{nYصkz ___899aƍQCdd$PN'O-d<ӨY&jԨ֭[ᅲ-G}prrĉeiprr|||dŋ1dxxxFhѢ:$kLՁ%)u~>k(..T{ַs {0wL}~̝MGsyuc+SXn7o5j 44T3L4 puuE 0`\xQx7rH899aѢErIuO<6m //Ox]ÇaÆP*… eee_D``I5ۯp@V5jWbʔ)]?_ذa$Ilܸ1bʕ̙3"++KOxyy[n? m&rssũSԩS8t,_D``hٲ8q,1L6M˗/BYbBWƍ1cƈ'N .]v3gSu`|ej+Vu]|;Z_zz$Ih<*aY^;Zl!W'82={B!>+>#P(B\~][lذACN:~Zx~zѪU++-Z$K,999Ab~yyyb۶m?%8"222DnnυBV2OU;pHLLVF'nC!lӦ4iƾVZzKTlCk׮ IO?$w(jlߺuK{t_nv1w4>KW̝gc+:mʼn~i۷4h6>,$IN- .???-|X"۶V<͛7g(-~m(c7{ᆌ#33111cbbg] PZZEEEܹlq3zB.]dԩS^xY?Add$ "$$IIISX"_U΢"4j 6DݱwJoKZl cǎؼy7w4>KWgcK:Ueطo_]tSaa!$IBݺue ѬY31X22"88=z􀇇Zl+W6lK @FFѳgO1U5>sV~o8\鉂MBL8:uBDDlq?~QF5k'%UVȑ#;ZbΝp]t s,XaaaصkL~K,%2u6o| n݊͛7/ tcǎU*bŊؼy3ЦM[l1[Οg9ؔ,ٳ\^]X2mT(女{0yd%ٳgCTbܸqz۷t,o߾ؽ{71tPVf͚ =z@rr2ڷo7sgNhߔ!X ˠc"++K wʅرc}6֯_Aa툊jyyy?~#88XwVp̟??Y0w4>KWgckm*_RRPM!G<ŋQϪRVV߿{<$${g}XǏǑ#Gm6###cǎzar[Wi]vر:tP]RR8:u iiiW)/?tP?~\Dlݺ*6JQQQnD<<@YY5899Do<Ϝ,~7 NOS ^Z5kֈgϊ~[ԪUKe'Ç3Z-\P>|XXbԨQnݺ"##C竷wϴi޽{E^^8yxHKK%=b„ =eWLѯ_?QN>;JR̟?_抵k׊Zj:#lu`|eW^yEcYf4qy%F)J8p@7w3TɓСC?cyfq9ᅨiӦ '''aÆJ_Ә,^;G9syub+SWRܹs?JR/B!JJJD>}8zbǣ3JZ" 6WWW_ϋ>L( m6YС{ϟ_pww ,0OU+..Vx{{FFk+=B!HNNUnZϲQ>$II}{x[JJ, "jժ%yyfYbFΩ/[ի8r,DXXP*" @$%%Oua|Ν;kǫ{NWms=CNj{N]?M4JRmۊkV3w4>KWхN5L_BvZ"Jh޼Ə?gϞIdddX=mLY,_\ R)5k&[bD}/_Ɓg\x[nEڵ1j(&blV>}Xan0i$ܼy6m!2""""E9l޼7o'x5j@&M0zh},Yed# pqqo8z(**R߿|r!I>|Q$I8993fIhӦS$I<brID2jܸprr}9vڢe˖}⩧$ IĨQ*sY!Icǎ$`%\]]$ICXt]H$BCCExxpvv$aÆUwڴiB$1rH+\\\DDD Q / ={jbԩB$sUxpvv"::ZDEE󦇇ήڋN&alҬY$I^zy!$"ٕ) pB;w!C޽+cD$'m={V(ᅨ!IиCP(DzĎ;>}Zxzz IDΝEFѣG߿_ I*t; BlR#]vu I'|Lu.99YH 8P( ¯J\zUc߃DRRǐp(٤s޿~+FCD߀0annnXb4i\ZJִkcoFc̋ʐMrssٳ]l$Ix*wqqa0uTlݺl֭[j*޽{.>y( lu1VZPGiӱcG|zB~~>틷85jԨvuɮG׵<ꊦMȑ#8u6mׯ$;{ ƌ%K~ !׮]x2/%Էo_DGG Cxx8+W`rHDVV-nݺepȆ"..۷/vڅB}O=֭[;^zdr-s;UΝ;&W~mEAAApuuU%ŬBYj¢Eb\t +V 2,_\0pa= Z!"T>q^TT֡rM+ݿ+$IR粺up+;w$I:q`YY KJJ_wnF8HNNvHݻwkyժU{.7nV= +*<_}v W^˗/WYPeCHDDTEWVOwk4jH=;Qv₝;wbݺu7nqiY$ qqq8zݻ1qD@BBF' ˗/ҥKo߾Ç#//Ok;:u;qz-[0rHdUԩS1aM6W_}777|Zg$"D.0a߿?z)DEE7nޟ1x'<3~:ѣGk̙3!Q~֭Ô)S/ڶm@ZB~tU$Ix|rxzzرcpvv7߿;v;D"$I3g#'';wFzz:zUv*sy|ػw//ܹs 9s~zէk9L5=յ=+B!BB!B(|B!B(|B!B(|B!B(|B!B(|B!BB!BB!BB!BB!BB!BB!B(|B!BB!BB!BB!BB!BB!BC@!B!>B!B!>B!B!>B!B!>B!B!>B!Bq!B!G!B!G!B!G!B!G!B!G!B!>!B!P!B!P!B!PH\}հ, G`B!B(|M˗oG!B!B(|M͛7cРA;;p@!B!ˆ#B!B Cиj*,_I!B5֯_s9 .DR(g}cwG-RoshժB!F l4̝;s 2mB ˋUWWcРAosŊٳ'B!F#|`͚5RJzҥ ?N:f͚.]fΝ9B!PHiӦ {osZBWlХKF!B`F[!B!0yꩧ8B!P#B! !B! !B! !B! !B! !B! !B!P!B!P!B!P!B!P!B!P!B!P!B!R! ԐRt}B*!F #|B({ NB!G!TQ!4FI!r;L$B#BQ!4VI!׈BBQ!l0B6%ziaOB!>B!^!2G#Ri0Be`'! !@8O;!R,L$D/t\Y#aY7MBHaBHE^9e!?B! #|B0&aYndO=&B(|BH=]J]lBB! $y,`KB!&BiW@#B#BQP !7L$deB(|B(yML(~BtBhkI!G!dJoq!S: !P mnJ׬lN!G!E/z_9BHe&)Sk׮hݺ5Zh޽{cܹϜ9e~2 n$4zk ۳,`jW;,ο#R0׀t&MOSlݺs=X,_={ }O۶mk޼9B٫1BqG~pmaʕ';#Ph{BHcSVmcΜ9ؼy396oތv ;;0,YGѣB!#| իѯ_?|whٲ%fϞ=3tٽ֭6mڄn Dzeн{lٲnݺshժO!UF쪍1 !lkɯGZ__5z!L8 .D>}߷o_tӦM } *xVX^J!rVtxT*DQ=BH50͚5{֭-[)S`ƌFիz;u5ktz:w̓DQ')e)~B(|MJ++e-[t҅:BHbeORP+UK#Bk7Gq:t͛7cΜ9Xp!ϟ#l=z@MM X~=rhÆ :t(>#h}ѻwo&!QB! 4qV\^z !$X {oCTLm+Et>B!![9S,WMB!)& !B!!$*:Xʪ&0BB)BG!$ÔNB! RB#B#BJ,{] t*BpL!NB!-HB!>B!ekH1E\(}B(|B'ME#\!QeI!mF! ԗ+Cѫ>B!>BdO@ѣBi0BZ[(BB<#Pi[)ڔĝB)L$&.~ܿ=>aBB6qB)L$BS !P! qۦB)=L$BXvuS:׬R<&J!D>Bi8OROF!0G!L}v-`Uvޠ Ke=13! !ט/n̘I!GylN ֮^R)ŏBHBH}s.QiW}fB!>BH|F4kG!RaJ'!^oV^ItR_ߋMZwS~Y$mF!nK`mOuЭR"b~/ZwS~Y$ !톐7-?BLaJ'!"ie9iMVv--6Y$ !VɍCS4jl-uR^+Vdt^j9i*U _uS!G! I8/\Z8I-MS!Gi ,7/fyi/麏k9-^#>B_S#cʔ)ڵ+Zn-Zwޘ;w.ԛ|ߐ7iDܕ-ˍ݋B\:o,B!>R ;vĤIn:YGy$=X\C {ҊP}/TWʊԇDBmy8Cna=e]vډGD:H>ioÍPW?}))޵A!>Rqض9s`8C8 G,sOU$>BihK#dׯ;lgƞ{-[֭+h[;wFV8Flul3NsGf<%:_ !P+CᤓN… ѧOe}]A ֊+гgO:!ݻg/\WoҧO?o  IYfc=ݺuòe0e̘1#oN:f͚.]$RIRJX<!PH;-[tH) & Y'iRN8|Ghٲ%z聚ߟC+URD1FC[X0J# II<=Bi,Qò^PJ%{q(a+<@B!>B!%,]k< 0œB(|BXzn"DqBR<)~B#R >E^iR~,!P({y+y\\1B) F!d}jl7]/ 7Y&KQBBHEIRJ\RRIg*oj@!G!z\oPQRFcDKZ^Ɖ_copO!#R20JNlb:Tm-F!0G!TKvm P(_"ib-݅lw{Id(!P!4QSұ~VVdrwC7/\*ܾB/ !!P!d==RV_E\䎘^z/ܾJBBHqn\z;QCL"w'WR!)Z.ٳ,k}_)V(}B#R"ܛb'`R<>{&B/7) Ջ a*G[# !lXzΗ3󵊑9WK/m/CpSLkʗ$39?B ?C@!ۮF˂'I䢄b?iVl_ٶ:r^ʵIW(-!4ea םU}-x/^ Sj%Jq}uslI3~iǚ!G!MF_D!Iq gBi/|$ =iLMǯuR !G!dRɣZeEIaň_}I™fM-n!+e& by~OӰMǮ-?B9|BIR*UbCߤ[fPZ;I_)WC!T2B6R܈&]\ȴ&?(4*Yʜ&6FŦKOg=\B#RbM*yq"|ʛQfh/,Q3\;弶+StɰeU/8.M㤔B(|B(3B-ye qK;vBoQJ-rVhKx8лwKna8i6nٸ}O#z>BB(A챤i&vQ)&m~{Y%LL0)3o׺!8.swiXErB(E7 B(|BktRhEǤ]sa5Ǘ8,^X^KG^+DJjl[zG5EX+xԂWι}cB+?~ Ubr[H(K8@~m?EqrjdXdϕ8rˆ{1i[G1^۷5{BNUЦVQ;УK/m mPQL!>GMM;۷ҥK1`wޙHH7ingڵ#}\WUB'NFä.)bSՠ;Lr:hE_ >i,u_Vu+\yuIP⤰P4(dNBU}}m޼lق=z.C~8pC]J=6 iR>}̄K7쩔@S4ۖ/+uZ]pKK!xQfY,`ٲ&ULdв^~ :+vBnF>={\nFuu5uM6ᦛnBl2tޝIHwmYnd/&E/jimN@H8qq%P=N JEU )OJL>Y3P!} `Ĉxsa]vI޾}{6mZk/AYfK.shժOfxi f"`i{E1ї  FL]LJi!R%q_u}U. ȭ*acϥba4BU#GļyhѢԲz[oڻ 4hPAbŊ؈#!^!یk*qpvYN~troRѤ1)Urz[%u%  _FMM ~itرu+ܹsk:u"|t| k@Xw?ۖ϶+'_LeQ쥕`i$2JbdNa,g"lWʼnIuΤS!>q}[ h׮Zhe=M_d\4W1L#{Ets *>ܗ>3K#wi#gzZ*ܾo¤-|1+dyBm#zBC=?sL <~zTUNӆ 0tP|GhѢwPBqӅԍ_[[37w/.=b2AOb X0q"s >Eyie#(IM#ga^Jշ/m4-*Rg*}\SB#>Soh!dۑz͵իDwWڊ9qW,dQӲ!X{,+ײ!Z"LnEA£jy7E2b(BE2&Ayt`ݜ˿ >usn_iS? !G!]w1[eJz\҈_9/q='LirV\Fg> I„0SԅB(|B+-ˍǥ ӔJՖ!8/MY[Шz~q4u O|w]~}vݵ.ObUO\R>DJbXj/v-O߾4׳L>BB({ n1v{9'ζ%k m`RC Sx–9#O|;.ؘ}N@`]`^ͤKsX, V"Oq"T,&9ᎎ +LնebB쥕g !G! ȋ)!ы$J{,\Te<-JR,{=JҜ+6 g*1aǒAx ELeϤrj~T=x饭o)CBBEWJ[<)jU*SO}Y*[&9 IDATN! #a >(ʢ~j[3~K̓O~稔R5ZO"N Sչ+WyB#^ANΠ]A=ސ*Ӷe9c'q+h_QCasq"'IJc\f\_uEDPqX͆eb)K R!>BiWWVҸQyq/`㏯jp)qB$J&ו+*AYm_Dg2"?4Bqa>YHrw$̴ B(|Bы9Os]}Ngr_ , xORj?N5{̟™t\q0,?U0jťF/2/*GTd.lIsLG pPE=".RUd̅mB(|HE/N) c'/wTJ'&mKWnGa'ݜ'ᇻc{'t+C&<@dgǠh6O݋^y ?xii"ul)?o?BB3"gIsIu`[.ݔJdL\eb['.U]0KP>i!4QX^WqD/4.Y88~GʔIYP&^JL<1XaUL+}Hd'!G!Hʵ=unϓ+,[zїxErs 2~yd'w_&^>WuK8b7~3tP0RvNn} >kDH8o,圿sI.H#P!%TW̾*z(̢ϛ[lst׶}f03_RtϤhJ8.+RT tPyE=_wʊ{:&=!+v/L"[qb4Q65Î*~&J{g.MbA!>Be#tK#2Bw-ꙏ?>Cܱ:߸y sSU{lJM[(6A)uW#:tZEI]TzgܜV)}=_TФb/I_XT0( ŏB#P({%9JhY7*3JšǥXꂕI%~ GIߣ[6Jym߱ĉ^PԿՃ[ %@%I/C1O QIar.(} !@WlB[t44-vvTk4oғtȰ].TΩrX$OIaTۇ#o((sQ#m!!pᇉ'VhPƤV˿A&.ahqIYv>BB+MWʢ1Q;ЫW שu4|J_|97XJty3oVLzn7< ;轼ez(W4ڧ^d[J&ET Itd?LR?BBѫ'ً{жѤȍ~Wyu$&{yxs_Gy++L?M-~Rr b[<1(T~s2䡇ٓR෿7V^KʞmK J!˂YDe _q!}8ÊĘFƤms( !G: ꥕}mxZטXx7!*"uy[$ntA jۖyQ`MW_ ׷>e֢ E^%x`]hZ)lۆ_\ݍE)uMX֟6- IB(|d8iroR_K_T1BW ?4Ͱ!}5N]rѻH]nƵ[44=}Q $ // |U OJv<>SǦRCM &U4):Е9Yݓ !PR.6g]VWB$⊭Ө4ΨuDP靹"-oZ8G~ݓ@82`ɒbt}D][zJ!ǿ}W?o/<%ω^Xt/h~Dж%=tO~Ik ;_X3J1gڳO4}i%mį P!W6sbl"_px.eŜQ-ҧu1?̙7TΝDzR^ lÉiRx={-2ؒ!.|Pr-TA&#pG)N/,Td/in_´s>wT5-GB(WB+JB7[7=r#{zJgԹ~}Asw\g<ຢ0U6]q"!N7ի8Ll[ً T.X/SBV}RK4Nd/>.q'S>BBVZV- x S8R, Ҩ""ً:>=ٳxqMr{<3Y/֣ -(s)AJWmRwoP9B#Bh*%V0}1gYkik\dIUxumN0gΫFETҙkzl[I. ~BY^'{%tI~)T$bS-&Ҧx{(n>_Prל@n^ 5\/>z!G!ۜUdisZV.3s:Ϳ.vIE"/>Z^vBȅULӰq\LoȐ36b[5=^[beOJ5ѷ= k&BA҅qsU=3a|FHiE¤(N~IRYg> B.aR5V.t>s} .qRJض?۾~q-W9 .R14?g2YWZLw%{C@;_":pevt%|zQiT݆tI>u\Eڼyh?M ^uIZp<.}눒BS ʗzlY+ڗɑRB#Bn !l#阓Jb8=%;LL7'];Mۜ={Mwa/:,oQ:Υ}ɳm-S3ϲ,<|qtDb/a2Ꮖvviy4=R=-KĊUR$2g>B(|͉^1:rwE+j1\-C;_zem V7B1*ޔ&G˂ؙWZT̘"!Cz0M)Ĵiχ0n}R< >ס"zO<]X=bU3EL9}p)} Mre^szӹ}q^⮝qJ-a?B(|)U#pwfU]ݳBű$qI<|(b9Q8݈zVC[iI,FT"|ͯ8+vN,9;W0{ JρwziE/BqwConR3NݤQ.QB#l> 5$yrBH\wCZQ=YK8ߴpL'u0wT8^rh1g?;zU[+1lX?iχJ_|Ġ4IPg!+ S`ѣUULFd#j?+ KCI#`ѢHM?Vҗ$LiS>d$—m!>BrM׎k*<"b}n, 8iX%tHŤ Bs _pE4'Q,(XItVȔz\ɱs%uֱmLt \2Լ¨Hw,iথJ)`O!{UU8ᄮ­ 8uԼZ%7k#qqDTp혊^Rΰȝi/߅rB(|ҠXv_LʟBVkF,mȑ1i>HIMsA;ՠ=L䊑>)3_ȓsl;7P˭>-W[?q#\<)_pIcUU~q9Bɓt nټTMUE/G0::$RE(_X=W3 {/ <'/H_>E}a3%A1"ǔPB(|Ҩ)TLnfIYd4@nI=g/."ФФaG<<m3lNʢXj1}M.94Ѿ4_>J"!>B)5$T4 X:Я_.3 gthq Bqgҗ*,:hX~KǶmC *QLIާ60zaRb&N>Iu"ypMOȜ}zݶ"Bip+4>1m?K7-qz@<ۖ8?V8=!% ם/iL'__RJhܿaEV)Iz˯^Oŀ:f\-駭1f|b8чC7eTͲHyȏ鲧3(AA1?$_;_i>Eh@]jI}_җJi-}GBT)O|kH^U3K)CRqr{~ S?ܳ{]/f$ET=ܽVbԨBJˢ~ersr§B{iv7޸HqP9|WʮQm_~ l.h_/퉧ޗkN}ޞ7sGGy3t?KC=z~k8=^W¨/OZWu]e !FƊ+pyg?lق/o6mpIWDD.L¢yj _3K/m59}|97:"~aRe1fn]U$4lR7>M9S-BH׸޺u9 CtUr,_ӶTY}^N6_?]t+[pƕ"PV5T$QUOTKVh_GKur_6c_&ײ!*Og^%jn_jMQ# 0׸ٸq#ڷo `y3WY0W>%9i}Jq(b$ .Vfia%=jk%wqv^^ƭ;,m[0s d2˻ePoVٳV!"+QH=8:. ^8dmB&ۦJٌuꠝK.;0~H];|vq͘0a'\c\sͿ0v܊J°߃QBD1qQ~ @oo[Gt`؁K5NN;mʊ\z+jɋ H0x.Bࢋɟ*aɽUzt'>r+pnIX:uQ6*ǾB஻^DU|\l[geF [3EZQ+򯅯8֋"5V/ ]wO>B(|=z4>ݖ-[֭+h;wFV8dD0Jw1cd:7/J@Uj Kt'ۨ;:+i儈)|`^c$497n~OOͬ+ۖ⊓]t_^q=Ƅ յq 1Hi㪫jHmK l B}gJQ';VTQ0&.*_FEڢ䩖 ŋRA3RHoR> Y7 >l]=\2.`РAm1J_R e7*ң?3)ͪcI+y,[9B%Ii1Lƕ;&?'{G'ࡇ'}B`JZωo_O3臩SDʤ.#qu{QA}\ѫu?oNz@E9{EPg{<͉mC~ܼܼQ9n  )wc !IJ5U5XWR/|R ̚*Fwؼs6eB|ݧd{ዒ̰f<~as !>ȑ#1o<,ZKr:u̚5+g;w`F->S,|w?`{MN~ {wyK)׃sʓ!pϊqR]7+ f`z dOЊp7Fb/=4\g9URNJ!>q}[ h׮Zh"$AJlܔ3?A+FD^<#o#xQן,` %ՕT IDATd2'?ˤx5@b„yY9s#Y*seUBbҤ=A#{a¬R<=w&&N;z&N< 0zzeW}r\3sM{\צνvEY? q/>5Fzϲ,L̫i >y?~TrFH%TbR;Ӥ""א$PYnV!p!9s&"$*~q%zIS:S/Hh!Kͤ T03 +lGjnߵC].>;RDE߇fEN_ZI-]^u, 9l}F-;%Jx2Uk(?^P] {j'BKWuYcK3/}F*Y 6eK)eHJ4Ya+vkV I|ZK)SKt{'zsݹz\3+rmNpezBi{.FŶ%r΍_i 7a6b[aYSq-gSv'20|-EspAweY,Ex`/QIGyӫِT^T4Wc(@2 !,DaU;ܾBd HpA+Ou#xFomƅfR:^en8OTZ;3ٶĤIs;F͋?uQSTQJg5`n.0ypߟt Nɓˆ6 6Jw#notЌ{2\$嗟!ƏUUQ= 7Mct~xUJ_1Ƞb|Q@8-Y*%qW>B(|Ҩ/."|!s]ťϲ^ZK_K+}Q}jk% !$O_{̥df^V$nu6; \2'{J ?&L8W_}2?nH)qC %py==lj'|矧'}'%0|䬰80"_!lO:sƕ3ϼ R ~HoJzrCPIm31iҩsVYs_SrdϹ?3\Bu ѥNbn ",}/hoIi*~qѾ$I]J:BBo4Ѿ$),W~m6LY6ӟ-1tho~K=8Ossvܽ[y D?OSҦ~ xfJ)1bĔ%&O@⬳`3ϼI[GmYuy7mڟ~6l~6lRV!*ܙKgl:s(H_'&aR3{}'uȝ_o}&BҴf^"|g;N~MGXVr/I)~P!$g*xQ2T]z^3Kgy3ٶI'u@uK*K⺳{h B/S`6eYOǓ>RGsiymmrU73LNj"`>ͮckѧ{i}D"tÇ@`ʔ޺UdOqҕݭ[Lp .tv^zgP0in_0'ܳ*+i'uqo0}C1%W&Ͽ#hRzxHmK=K/mE'ki 4D*&? BHZ)d4Y_nL%O.l$-^!$fXQ0 \vҤ^NU ʞe9_/ĉC1f̝ڲ2+vÇߢ7wnla7n}SOwFN=:!qʄzkoخK_z`s~#2r_Y*V"F#G!%b|X:$HH] !QSflRJ̚2{2RT9)T"*r\铞2ppqp#qLnN (|R)ma7iQ7~S<'OerY]MȎAO?ߎ,> B顮<9"mdq20Ob̘^zު"(~qsE\T3yRTUY a}0t^(}_.h&{ ` Kyat̥cF틋Yʕe'Q/,k !PJM+8K??^\=p]+!De|Nop¶9|Ͳ$9gntx0q+nO8[Z+LF8v}ڸ=M?q/29dȵ^Q7b";?oӦQ]='xitw>Pi6 /Bdpnדּ&CS}mmR$mK~X:t؊G};RbT y !q=+U8{y7(_XtOɵ]/b)%.~TEk )%ƌqg=[_۶_z;^N!ȟ.s.g_ 8qO%nq]"-~7'834ʧR2+S:d lGDZ0l;϶<[q,4k/yڶgxJ+rj.ԩO:B%K iYVd$0(xgy+ݪ I-n9Xd>}`Y3xFq c9Z5D1]GB틒Q ^$Y=I=.GO_(I KĉV+ΦhnU$/ 7¶%MG_Z%l[{@⤓ЖwkJTDM/sE(O-[ ̔-ukw?g. fYtIK/=W?)}JǷICYЬ~rRT<{쿡Yr-,'I_Xx|;ͷ/ۖ۷ `oB/N~⢁iZ5BG(|Bbo8*un_9t~~`9CSw5N:N>;Wz֝rJOIzYw.M֩SE\\rWeSp2`̘yLm/wlʜN^{/¦Mm?R?3gO~*;yݬ1Uq\ u̜}:D[VRYx) W_G۶gq|7A b٢:p !c{+X ]χA%/'Ξn!|˭O]K"o3Iݍ%._ .$Yr)动j !J#*]S"us˂-Atp! Q`?m{GNb„AΛU oaȐ0sy9s  fIi=v\O+r+9kV[|u6.x_/P;W\R|ocͪ kkQkYxѫx{I\:^J5m~A!zA!2hN^6Lp"K.[3]CPN=p?G;Ud0'iNQN7eYc">G%-,[9I)nw)NV !>B!%rOٕ`UW+"̙#cA.E݊h&N#F/ 6 x챗xlۍ͝{8꨿AJ;ym-~'al؀3WF+@rlI UVQS|@3G_W*\C@gSsRض+F,KӮG&YkDU!2,w޵מ?ow R> +֠]_],K?VFh,/*R1m/ Gs<ć޶&);L*qE%mq}DㄲrkKQ~$—o?ϟ7x6mvm'8p'E< ҈/8,s޼w7=]R-smr?>M"~W\q;we˨j )C'B[vР 6N:بŒ w/zJ#0wp\w[?O?ڀ1?f۱]Wbo|ܦ5#z 17܍ha3D-ho@۪*|׬XfoJtgxd2NHEMjeCn!>VrBs/6w7D _XaEx!0} JN0gΫ>u Vꌓѽ(I ʞҔ=Nt.f̓>B+1/ƠA{彶rJ7nf͚:gB)̙3m>wnقOyӽī{^5WvB}ڪ*8jGxeѪ 83pFt:˫ :.x?Gk6j+8nhx ?>X7E_?x z:!]ח-E>w?'aIQ T(+ViRT]"(EWBRW,tPm'89d6;,yٙ$df'~=54nNc۶I$t${ -Rc6CvAwi|#"@obVhoo+ OXiHr7&k`]5k={ /tŭO|Hn? x׼LaY. )oI)xt~Bdʚ~~-E},/[YY, yggxn`&N?zkA70s 9y@вe/, Y (QoD5PX(9  [r՛\yض CǑRcGYFM<%L}=9| Pe>}xѩ:~;03<, t~3-;ă{{єt + L`/콜3π0PmFeQDaԩSueu]vt&"?^fX\0 W{\P PL#B૯cۺϯ}zlؐEŊ:u{cTXrNg{anޓ2L$ `4&ΝDJIm.Howyb4ywRX:̪\9Dh?N8݀ެYh֬gLZ=h֬J rU`ƌd71|yT@Sޖ-|M7llN@ֲ}|Kw@ҩu&܃RJ^n 9 l  xX,/f={3=3@-YZVXVSJݳjB-y]^4d[[y(/?A_er ]veذazi{gشi>ht&/ A PмyIz7B_pACei!$͛ }J3~b6NŔsZ,A)x/<{:nC|jV<3R*~4<78) IDATxSrw0q'Cu,(!f)IwVRRVz z f0״iWy N.|'(̝ :cIh,+ǢyJ:b{e1 s_Z.^Dհ,3h|,KUhp2}9nT{ss8Nl<̻OJ7 >A>MеkScه.c~}o /^̯pKn`_BQ@I3?d8%QD.]n:n,X@iذ!%J`Ν,Z^zɓ'ӥKLD_¾#sV&ۃK i(=Wg7B%={;INIK}^}0nB I.M<3>$KBMy"-`Џ=D^WoI,LfP,-l~%KnEJx>o?JЮGR DLKl&X9gAі Y¯(70g΋޸>>-+`.I>5i?3P۸qWдiwς(x3ofms Vuz3$a@5p/b8W$Q}s8W";OӰl,|g(MɳNwK5E%+c?_PEQJIϫw%&"RamXL2|ס*/ `f&0a'NL۷/x"&@Ng=Snd1[̚Y$:lhI3k\,'\^|Ǝ(uk 2;tf76S/7t&'; d~{7vJJNCz_5 kC@ сNƎʕ9x̘{񴢥𲜎3%HVFo w RF:2z~37rI@0M{1,A~hePl.Sg|g0jTo@pΓn{ͤ߯4䡇`/{+2#"[n'`|}ƌ)bxcO%3 +>hfqLc yO ʣ޾("+SaEE^8<կgjy&}|@/u>d},gFM8m٠YzESٿ$lwAsdҕtk&~rZsҤU%~M=;uj޿gV*\3]Yu`oڴ3zYF#zjW7 YYhԨ e߾J,X tr~G&upzL$עEZX؋eP1=f}:ʣxV|(8>l)Q{iӟwe ڶ}ɓ t(dn[F!tnl)Iٲ;Rn"'\2`k@@:cː40W0׋ܔ: uK?gQ̚=Ahr>3S̴6q/R> "";cG%~u?eY0f̜]^_8Gi뛤OE^3|xO,Kpϐ,WM)]B,M)ORrDPe|x/>!Lf-ZK4n+hѫ4hp-IFELE҅A>Mgβ,ZႼ͌RJJU1X &KY)a;P vRJ8\ye? 2eS䢋ͿRkf$XHc ftИ'\43hxXzYE"`uanW,Y2* ڻ(?uAMٮھd17|ZTHO]Z{P~ 㣏#K"+Y6;yZXɼ~# 'S҂/""+9qT9ҭ[Ic~/IZf϶D" oԨN[o=C;m_voQ lُ!C^@^NSz!74U̔!ǯI$G?u۵7h m ;pw@)]PHf@vr޼hԨ/L12rK9Sϟ};(.׿ۖ84,Գu6L>|_o[m֍g}1{xSЦb tvQѮ,+m lƲb{Ysr#D}ˬжᥗ&cYZX5u2"/`ѵc.@v%L|O t9 *}Dg3``+7L@)8\`+"("1&T4„Y? $Lo_`„ECaɀw7lٝ-Ý{|Btׂ-"p|3Mae v` #"("{@cc.d4~';j_eK/εLr 2Pr(_~'TNHH.ozT>ڨ.4 (CnDH.,\LzO?徸 ({g|AҠAGGx8ֽ˗Oˀ9 4z1ҙ:Q)8餶,^ٕ}&P/>?̟}͚uw{;Y39(kbpy}xn \8v@>zo=/=;0fdz~#w˂ѣgӣG3gHRz0aJF(fVIO/̙=#)ئ~d~e^X(͵(/(8l#*po {y!?[Nj"ϟi1 F& ʤ޽yS,x=(4~vo)gng)b%^Ptx`roYNqexel<KJIV==XLLip)Yd\@dٲI) o}*'_Pe_MuwP jպ˒xVYd֜o;P e ۆE@<:ksL& I,fZxm-cDaP 8姟n!y]f~l&MJhP/Zt ySP*7/(]#2[W?^2tI Z swg@V|_ɬpz%iM WPN[RX1sjּ3װiSQ2TdgWaʷUR,V|!pǜCJI_ hذ;$1=> .xI1*YN679Vqw.;!1,8hEU֙=I= }v,=ts+4çJ3,kb<&E#I$FoaԨ}B~ફL+ݷ<˲s4ӧU|(-ZtK1㖀CXhBNI']woER%lP)?L!;[g~;RV 謗"nΚ%x"-˖}@gO7AÆ]K%zXO=PqhiΞ-Z {ǐWPB˷#{>;=f"BmȀߧ/Я:J4/qECҊ!}`Kt@8ȌpPbY:`` w*(""(,+ 0:023Y̛]4˛_`  y,`eAә?yK'}rT|^.ju6jI-4RBM]Ĭ,{ߗ)>yݻvK޽x D-JB$_W)%,_'x xz%z[ҁ$%5W?ժ]f ?N5k^!N…ҨQl;ApX}Maۂoc%yI̛G4۰9sѴ)\p Em܏e歷3a=\{c(%'b9h:{7\2>z*um&M':%K_†tЧ0޴ddAb*G#"(" 2ttw(/w>%{n_ A(9⡇&`Hr|9܅,]SJq5}ۘ2e 7+~uc#VnB)IѢ̙sѽ| ~zڻ}{,p@e>cgIscL*^&,ٿk X|tضvY:5',M2<ܸ1, .%-׮eƧB\Y`ʔ<05: r^uߠ GJ_")w" LؿT5 /v-IW#]?]i`__OkƱGE|QDE̥ФI.}~ ~Q@^d,7N3Ias&VLg ;[ vۿb/;t>@v`nzছFTO3 &(@Ir[Jn\#s+U$GowZ㨀y `҉T0Y9 yTr.J ֯Т76| ^eAժxBjxY -B ]nݫ<WD`t l03lY5l} b)yY8yD ';/>&]RЛ&w/}.Hya5pB[rLl²㙼~CW*ϖK$ u㫰Pm;/'`…lܸwyK/4ӧOGp рFum0Nn^ɒo'⏢9{JY,P &9$Jjպt2B YC*U: >&++V+.bn w `YkP__9ͧK;`˚5Hh;Ԭy J9ar[kM5@X3X°kעe+1^]O,DsvY>O|3>|~8C}מ{z.PѭS`KP3'8CS43w5r/\Sxvi]ܒNIN9`ɦ~x7յu8qdgWaڏ*=3 2i_9l)? s66}@J 4[K*n%I}~jպ+d׼Y̟?+QF5X珯uP6׭˩SZU97NOS,sn z׵bBo$N|ye²wuItzsE~[)য়7~3zʕTRFq@{f^p fJg~E]2-xH$i&X֙:MmQ_{~}&[Hm ( (p}ioRFsc:<P ^_ğzj, w9F)4Ub?z`g`B}l[s5; 7gFcKJu$ׯ]jl[x7k֬Xl,p{O:˔.y[;Eoڱ9v$ r\gklh/ r=5.Q(5%gk;M{-]Zϥ܀&ӲCѷ~yS2(""Qre^~e4iBvv6*\r |AL޽o^NXbGng1ΤPd_3O9{ml[;2,&1l'n')CS*hR|f\ΑSJs7P4=~eVR@ D}&B^x+_j89m[][z0z}Sߒ3flv:5AJn^wa?Mg~QDAEZ84hЀuOUVСC hԨQ4QE1 -#[)gAw~$üR3~eRBsx 1w=/G"/~ߩYǑ#{е  zGɒ[P &M!tO8mi<%XR"&B(Z3Fxf:8ԯ߁Es@%^~QGz"%˴L2gPۗ.*Oöm_.ݒۿt'bGztFeL/ήe&\nwdII~zΞÝ<%խ{ߞx1[Xn deX馑ضVrNs-޲X,h- zsE6A^ʒN߰ #jQh I&Ki_zuƏOڵN:)(N_NT1Ȩ@D~ڇT/M_1良 *=twR{ wӔڼt8RJ&LΝ9UK8\ V OcdYVn2oRܹ/QXCx.R:x8bw 2k?F)XmY4STIY5b[Ո-}W*Ղo?S9`aYPR-ٰӀqq]ծ}?k "\Xqh@w&U0u_? Wk"*RrΪqr]ʔ)婀nR=s>y- 0̀>a>gKgއ&-zS-r>Q\,[W }ȿ_RBݺ˗GE|Q%KPjմ/ZT/׮];Eq!'r9t]-+zR]n?-xO ~'\wI[i, zzIn?/t,Ivx~4p8pƍTR~dyiFR)<9'DU6lc$Gk޳E(, hn7k]]x3, mW8)sۻgut*T8+ _Z\ǘgS֥Xmn/:͞=[/r Eek҈w޽\1cM.N[t<_ضBfI9啃)'ΘݟELf@1 r!vMj OXd E{|%ϣ(mDQDwXݻYrdŔ-[Ura^yFqGݺu9p&L`ҤI[`Fa ~Dk&0^h@m3}N`/5矴d:w[.j`;>S, ʔنHING-úܭ[9{M;v`:U̧3{&mRx'w#wH$*e$s.Kg@Q|);Be==ՁU*wI9AfӦc1c-_S4,Hܱe˛ 4h]91޶e?46~(3"8#GD2k$my}x<':p},35 zx\g% v]J<|4O37:+Zԩ߻>y5䷧ħ/7x=\KR.`|>*T3/I}L_,}P%_D􏀓C)XQD_6<\_~>}ЧOh࢈/\a`hI`, b'bJ%3Ln˘GE@EJѣE4fw9tk-x#?4Vkؐ'McsAJqt8[aL>Gc8{]+t=K$*V.YhJHuo Dž<,$_{=XR{gu۹s%JTbn]Yn`˖PyJ$=0=ށca.ʷ=l߳" gH¹)w>0so,.$@{?e&DSa+%8T=^ 5RC6?"(" D}0/d?b^fYᇫ݉o0b&ޒSEO+٘} r*^C`[&ndg H䀭}梋(&c'CYS .8R*n^F&M}@rY6S=, c_e%w( q+Tܾ4Ç}"E,,d9W)|#oB+wu xɏ\cy }RBǎ B0y2b1cNB[n*@_}z)@/"((fnLݓ RaψLM_|qRׯg7Mm !sFK~4uZB;~POzٳGӴiW,KҸq'Ghx,KQN;Lx}~/=8NRk)[{ض+JlbR:p,lcb()^na%$Ym7"XH<^')Z4Ss5k6fժwS&)m-z}*qku\ʵLWn8vXOR"_@(Uj ;vT9ԥ7,#Gf۶2Kost;_,Ruk)ͣ^Բ7`iK:I;˂7gZ&lye!Lps 7UAFJ8d}l˖C_zQDEQDӟ$3ByfJ0{N 2WO`Ή,o_ I)ٳ/]igߔ !7<z [^S`*MS7z8Вͬ9(wيSǣl;zIuFY5@qIW'^B$D6n(3(as<ž} n. P8BLJX-Qb ŋ3љj>+UYv*5k^N<.|#طOddGΥ?2="չ첾):vq^}.ƌnx^Fzp˓UZ71'8#"S Gyף.sMp疥7nWh Q9 / 2Y0eEEEQ)zPXHfw1XΙC]8ynݿq*WMڗ9BH6MXV/ >j,q{!Hq1u9ϻ(Sf[ wm 3&Y< 8X, tz?T@u: 3fw.q~LrSL} ePQabY:l@/"("+D}URP,3g'R!4 h ^}9}(3"ˏXm {ߎR 20~o=k+V5Z-͛diWg;::"5 :uq~wjԸ8Jg̶Jj効8ŁJPRHCHQ˒1:ǁxxEb-MgҒ@$TZ v$n*vUX@)U$:7ԹdvK]_R\kGoZdf~I {`OüDpRa 3{C(YؼsXl0tD4i9p - !'nx ,V.\mqveu]Y0dH~4G{r-+=Pƙ<*ϗ\~= wNGڥm"(I}yev8):QDEQD7XPPͫw/ i4o\o m ^{  ן({nFMxg#x w-< Cjv&O~+qD"7iٳTnذo~ y*fE~3*Ǹdg/roOaSH]vY_^)WcT.7~THu9ϟ4ԺuOlOr#ٍ5tǶAcۦ3g?'XO^aYPvw7aGC'Ȣ}-5j_ߜk+,$KT3naB;\=  9us`^o\ %E_QDEZn3>?d, NރM=`IpO; J~C꿭^OΦO:;u,j(*EYA6E*Ϙ8Qgdty"dbĈ^{$ *RuV4T҇2Xi|lF)vuo"EP.%t)^}f\O7P@piA>sC&ɫ_CE_QDEzC _0n&t=<3/,=@R5~po>P+!FD,KҮ#!޿?ڛ~BqZr2TؿKN^i[C8*?*T83e[*4`^_4q":Sԋ8`PDž8NIl[yce2zʚ$ʝٴT9ӳ;5NضЊUݳB8?xO Ԙ?Yw߄ߞ X5fZMVfݻ7 n0KKR&I/#=H M @`a^av'(""(ⰅO2=c0k֎|Or7- ʗ߃4cpmPJ1`[9ѧ8#[fذz2; p܉ξSZnʕCERs3\>9+^uKI$u("86*́Rߤd븯UdXQXRRf)c]{lJlI<Ќ߈rׯb,\8kǽUma`|kW: ¶mS3|z@ 6_eפ?஻?cҤ]!?cRX,KGk<Wଳ/؜o6=о{s޼=YSkذSDE|QDEQR a1X'Շk3|Fo q+90LaACJY„L?`扗zã0zz|tfOCMjhJfg./("|MsF*h5áR5Msb&*SK GJ"! [WJ:37"O?}=9(m(;?&L];KIlv &M:{|`B;殽BpyK<+,Eٲ\/:woVH,jQ|!draԵX5ǟ7FJ )-l;) EÆ]5sιؾ G@n7X 0L, YFK;ydg'aY~.#FL5V7^ٽtВX}v LnݡyV/SP,z/("?%虉TjIgEO :R56n̢b}ʼ/շ/e̎)gyl߸qwЮݣ^Hc̮bog\95$-[ވ8}[RZk~ԬQn݇(s-wIHV*Ւ~8f(طovl[!eCF2gHOf w˷@p䑧QT3,+P g!D5kVF^YY9餶.X+;vPM_}Q!Y^Aǎ .2|&ӿM!<{9qx!3fNFٽ@2‚n+7AŠp/(o pnOH gE>d};2L$Mv/$#xfGβ{ƹ07<ڵDpϒHab";fce+-ܲy3ʕ L 4birJ+!RAvvUo;Zo6oR2eZcyJRNCl~;W=.S]>qߘxFnENޓO^@>z73- ʕ%\o`+ɾ+*ce4OId~虀_~J^X;d"؋"("Տ/?t燳`Pn06`V0a D63vU;Ot07&,&鳌~: !W6u#([#M-[qUoX_"ȋ"("qTt[o~-xORLs=x J On{{y$ znw[p>(\3 >|WpiDӦ:`yUPJ`ŲϨ\%6Be})]%LA(B?5jA[-Z\Oa/QG&6-F7@,) B?; x5tv3=zR :?׉}~_R |"*4#W߻L5(""(8̡/_{t 8.}NЯgw2jzPJfINLJ'"w#'o[8qDBw1JBV4j+Baے"EMZ2%VDXTGe4Xoҥ[xt(^4ۯT˲H$aYVW;M\u$.W-5!bL￟<3&g2eTL~~^Y><>=z<pSRbےϿJaz'5a!md嗟@YsA@Gg"E5F/_N,Nu e!?#;,[6ldVR]pܱr":mwXV:"Xv;U[>9RqVvlT*Ùg $=z9Xt;_<1 =20u1\F YSg=/|6MhS taEa=tӟ݈1srf=k)^C<C*h!ych4SWønݎj)͹C7"3nJHRJUZ"\sc^) ~P9u: V0wkydɅ҉:%QB{~=;}&j7{ɲw{@/k /|S"!]`Ĉ!hQv~q$_\yQ\w_G27G=Xˢ7Vu.EJ =_5lH_! '6/4&tNj [ _gӲ(uݙ49/"]v9]BʌBHvءO,JfʷF,*[DE U*Sij|M)J%J,V(ce_=&+v4M\y0{z߷o nn"j(L#c DE (W|edddh-49ɓ{t 1&sNk` w`Gm8-\Y8k=;^iM 1e`8UFϹh|9:[ E Eykw{x3{h@Ңiw'/'ECT!O? Fٜ@tCFcX-? :x6).} !`c:5UmWE`!Kmb۪;^{urkmڜe݇a:e*SCXƎ !sBJ# KgY½EC07 qx={> ojV/zRЭ}9rf~)Y,9m[W'B_! Uȳ,ӏm os5M82M^l[0~<Ǝ"4FEeguRQm[p=qo϶Amk|t>mv"#p B}d8xZJ7ݓ5kR"֮ !8sT3gG'|#yA/~7:9+kނLxضZ*qX_oc@Slt/ R_W,UWyUL[JG* ~ M5`ѯ۪tRct͟/2?  m}O't`?<)m }v?rEڷ<~=&-D֔Ԯ _Fy9M{>r1c[c&;Ьٿ]v?"M }pc&`׀:Ђ$Skf̲`]㧟ƻnG:u\; Q1c$H >+@OSscj]coFJ8ò0UnCA(0B-ۆӫ׈, \}@#{ۘEm',^\|}Њm-o.xYLۏ|Wo]RM}Lf3[ꄥ~:ӿ' Z&#ioT3?:G q{LA[Z;AVpԷiH ^ΙJW VPQ>?'5Ǔɨ-~{y;3څ%27(|ߠ~lVl!$guTg!Ǩk,KpOzo7-z`zۯA5*,3Ac=UG@Ko\')Y?bPL=^P<322gddd_-^Dζd].5j[MQ!/8wvH)y7C&-δee\ض/{}{Eȿ϶UJn+VvLExz%YѯM̂ ׭L;j5ah%tt,MOJȑ3#R?{ ۏel(>####}UqU2fP/M^iGABҩSs7:|H= v1I@JgR]-3s2N"8nD^ۇo.4gdޜ9ohլuCKCg!] PiR:^GY14mzrN6,l{d2;/{5irv;=8م8QIyN̙$Zu!ҩw- \B}Vu־\Ɖ'7K͍@[\{ch#xe niB}лȩ @pUs{'XE[3$Y6d BlΤDJ{3زTdO?Re }I)OŤB5."+* 3}wkaSF`k;vle4n\Θ1*^ /#nK/{턐TV6R/OzrSO2qZ׬Es(( yfLj҄ !Oi)H#G U.XC˖g΃奵p:E;tq6{v;w/'<]C_1͛‹E= **vb֬Qnݕ3FW}V,=/oqNPжruab)3ƧbS5=A^*ٯD%OEC:m,E0԰ blJM 4>oߦt mW @\7p`doƌr/7V\^>HsS]|sQf1'4n\O暬 ot>ǁ]۠P 6B8Зh܍3t5kР;]̡bxR1qVKfnA`KΛ9G[䣆 #ҝɓ#̘14Tg6#3g$s:Rfd|B^{uB{).;`=O/ǺB8)'`PЎUlИ3FP=eYlEZAuŴmu}k[0X,]Z;hTPoj+AG1[F@vPȅ^){$T%}3{pKotn 32ڄUVB} /7c_1Q|_7WRo4v>ۆ҃;m"$۟ &!B]/tSG޽tᏬZ,K.De%HYX۾=/ Gw"S/iÔ=>o`n;|hmтkCqxlЈ5ЦM7Ѻ̚56 IDATƔ9cZܩusмyG|BΝ.ZA_eX̞=l, ڶ r*W{.Yǀģ뙳O߀"ફgA[L uW]u RB> <%Լ%oF8,6%((t_ >#A^.3gdhժU~LhM3hqtJ>"؊n_ǶS,u%JI\j^8p-ɓOΉ 8< v-x{,@u:r:|ik4Xu=tݻ|ƙ ғ+PR:w3]T&>]؜}-]weLӦH=sCIcY~Gβ$p{,[m5}=kP"ņ xT*)pn/),3 CBA-o|l[u|)[)|>GSƭs ca()S<^Ki67 y/2 k©mP*h\ic}ҩL'AO Wdh\ kʔ)u]̜9 sq'cdd0+")]e\uqC eS.ү#6U4qEf )=ی%ul~/\uQH&KfWvڶuNծc`S!\:AE*ҭf ݰ$Rr7p?tfPC͚ ]H~#c˂?e33 PF<}9sGвlٳG#%n}- !h @͚p?s2C)v/΂z:ݔFlۢgϡn;iN+qQX/۞!}e`qY!)t`+΢:7e3 #|[֮]KV֭'|c722yjrlNQSMɊ%?IAm y3l38}5ct8,J1/.S4v UTd~}~'M+E U3JUr\8@JLFAIη8jl{ݗaJs71Lk˂.Vuj\udRH >H)#U~g"tωEyNO{YFٶDJ)f6&7ǁuvvbYhb(8,Z5STKYYnxƩuKiËgРNky@TA߮|l;ʦ}VU=i^e>>ڜ##|XrA]WIZ/:.)-Knjkh40؄EפA^\ϝ3`kUV:!3͟LGA x!]4!Cz %w=(VV:ضDJ5/jۻ3>7߲7|v ۫ի{Co+iӆH6lP5kΣMss"N^i;*#<w[#6@ 4uNDAN%Rx=ܻb-Zg{w:9Ԫs[g{ïݻȊ- N"I)]!"0 <#~ O<1;&'ॗv; u䄾EARG idhb`) ΢V$Y2$UWeR_m zꓐѳBx ,Ϸ.yX#( wu NoO]D_첡NLz@TYcWbŶԫ3θ0vRxu|;~W^[YNsFj3eX. fݺF ]Byh<7iA66_If45݋ɪ bM~]?WD3|nd9p3'vnmیu ڵ?z`dNE3- ;oWu{7L}nۂEt~B y8ł5sA08:7Z×T~cͦq~H2ddhֺuJzӦMU9FFqlŮ_Xq+]*~`q4)k~29aæcYD 12ԓwl7ZBH.|(8dumVlPByf,KRRjTVتke@ Uo/;k-۳jHUd͚ 9Ћ2e@͚ CQ;e6жmw}!ta BC9 v?Y b^IqpZH>9 -m-+u)+S]tj=.hPg0ӽ:xkb#Q8 >bꈟeYzӣi/Ǝ"_6F06IO, O_>a|YFFF Go˲,ƍ?uFE.]Jƌ3ϴ6.3f.F!u=?h\Or[MwՌ>dt-wLFr1~ 5ZψCcu|pJ,=}r^T[o!2v }v?FkjUYBǎ7"eC|qϥ@  kf94Gq-}3H)\ wEߝS?H9`ԁ2eC:PdHKsm>9zu~mvv>c_S5␎4=v-B@n:r/O˹nLۃ>mۅY;n,j#Dm.ɖ R N9E֤҃/,s+}c8LBWm)j1N7u4kK&·I&<4k֬7mԜD#mZ ^\qw /|55vыj иzгhnqmzm,Kzǎz)o;xtZx|щx+RN)/xнSX:uRRN=/wYH>;)[K}Sۮ|6XL+**iz@Lyv.qLrZH9&PW\lZP93w%m]oݖ¶9NTBBuhO^ukV-ZyT ˲kN .h _.S@aOE,7ie5c _, VV:fhKM :3{Tq~-Q,' yYS4kDꌌ`,,)u3ט#h>'=Wup~]47nytY0|(ۖ^?!#Mݳo708~+C*C 3]q}::w?o?V֪ɍNb|d ?5aL˖,U)%?͞aK0s?߶^O"%ԮnX._Nux):z/|7ԮŷͶݶC\ձXEc_߽C3OSy:3^?vG*eqz-T3^Eo?!}J l{&z@YY ~ ' ^yP4PKs_on{~WN]Aƒsm`o/'>sM mAZf _}o?A.mAG^]خ^|MYW~kB^Ծ!CtϞ=8s6l9AFF[(U!KRRJb5ZTPd;rFmET?5hCLFrZ4l6)X iOM'"{QLuyxKԡrZ ?}${~7K697m^ χӹXHZ2ī[Z&_on ]Q_eAe91@שăo<.еkm,P:f0R>6wuBzڽ8؋3Y /qW,dH?D<-ݲ`%YQ|`hi˲TdO?6gdve+q6 \[#NT3 PHt /@嗿lj F:ujSsTM reY< wg.`1`^`e\nꈔA")ko jK x4]#xi}7;O g"k.9ͩĢkXC-ޮ?_o@ǥoQat?dVר/ `Y`^wV-qgԸfĈH uN?6Od$Xu{H_2X3UOJeY ^-TBھpgOI?Ip(7#gMiM힑>####D8e<惾R ڴ iB@=k=Cx_)pHuEClؓ ;N*gy/m^43@#\ @׮mϾݮM&c1fu8gscKUUpyDmRO;LTneSgJ^Yf !:!0+lBp5y=ݕ7c|:qƾ37`NQBD#ŹQrhժ >*OMPZ3Ͻ*h_.ȌOY{R"z&BOTqq¶Ǝ"W󧶥Äa/wPp_uNA:-~{2(hO< DR)^݀aE+wTVzxG*mpۍKRkN2+wԤ#}ZK䂷.* y)X}WpNt4O}tϾ}_l@!ME<8#ŰPҀ>####-}1Qmq0H>Rԩ˳hDMM(^4> s䬳Zf^{x) eBelz>ŋfVqOyN)v +IJ9>zgq'L|y܍r^-<ۅgNnDw@gol 6q鼂7;gJ ZÇ ./˳N]˃`N=ΝwwtIƙԝS,/> oP mL,KB@S)w Y,%݉Z$@ >whVՍN x\`,{ɲTdO?.X 3222*.ʵ_.$xʨ9̜m#L]W7Ir62ֆeOd$#N&4oQ/<): Ο&/ᄏ"u }mN?}Qp>eٍWh^x 4q#~~Jlw*`qRQ0j4F/_###ju6B0$\.`L|)AS.rrn&TJdG;yFPXs}y3}[nN6/z*v*żA,xڣ@حc;Oe&7QU1{~{vAF\/ |zRoNZhz#gRpqW~ &G(3u|Ϝd%Ws_M 6- 3222W{~ƥ_>|VH/&o;ǿչ ^TH_-s,7* 'a(eK/8~*Bнv_amWp5#BЗ~v#~v,Þ5b.:!CN w9ëՋ{+2kEr(VRpq}{դh%R{|%mm32gddd^!cI,p(&W,:NjOB닾VY/yO F!2jd z:_\\zҬ{!aʡ!d˖mtlV} |. 4Q _:3d=uʲ(tR"&wۏ%{OG׭kwc@̙&| @rS_1{K)W/A5eN6 1{;6 Y;<':(ǁ3)a菱,IE䨣0qԬnQs.:P2}A`R@kU7 IDAT[oeI4TV: u׍R83CX@.W\11w_7ꆅj,+ŲexW阂 V&NeEn/yKπzjN TJ: Tkgσ{LkOG7!}uy!1_T6b}7gdh x@/iDqheвW&g_.ք]/|tTKEuHLx`\ʧNvq'_O%99DEEh!v[g{Vޅ_G+Q0{=!+G"z>ضksC Vxwe+rJF#m^{WH:=m,KE4T32gddddQkSܯR/:I sŦw拖-I-&Z >%'{MeN=u/Ϸo̘x $o1=Ԅ&)TСB ϩRQ?ɕW8 Gpu*wm{Q[ny݆E;o ۖYQ qC[~ \{HiuΑ>#Vh=:; sտE;{a˕v !'^ /|Atu^d傮|"{"6U|{d=32gddddѤ-]\@_Ҿ&Me|E'L VQv*gV翯L$ϋow,+7M)LՃ2F+ԡBr '! 7ܑ[oL>ONKn)2/ުOE${?FƷ,A??SXL?;x !Akdʞ.O?r_ Z k`/jIF!76VFQRLzfuo7<&ςBlƍ*5#Ł\ܲ(Tϲ0.j-g%=ȵ,5n>dɒnՔ/7w[Ŷ%?:nJigIn7pτ_d|X¦WcD*6o deI ũ, _|z $:W\q;Zk(b`/ب%|A?p2!&EJB!.xsyp' YߕG322gddd^{ǟ|z[@,$}nk7@s_:!&^'yV 0AOᥗHxMiw!NJ{}lIǁ޽ @: 'QWc}^ uLMLץq%x7Hf`T*n0 J)8& F݉yDP`l۶u6mUlRm\R@gg6QF*C/hRtbٓj13(7$Clо!MqK#>$EGtzg盫zGR;~^&:SÝp=,PQ0ܵS v,+M7>)x 1[H~ }ŁCvwB/q}OњBA/2ǁ >*OBv,KEU}>6m ۘ|FF6qY'2[^|\W!З/ 4d-\ضr׿vGJx<苂)4?uDAO лtP wCNs %=㗫0\Y< Hfa=}UW\p(ؗ,MÆk=kC}IQ6lKU"64ܨE0q⼬SOzd_ЮvLZ:eF?NӧruZb&.7ٙG61 mз%Ԕ\u}@_ҘM>}ulDu,q9acFQ8͓$静{xwr ꎜ~&l x=ΔO4l{K԰7pj}OJgc#}R}}%^9z> CJ׌~:Q? &AG煵Q.5gddh#Д˸eB_!tI{"ǁoK/}m`d-zڸS2v{≹t7g/G GJN >˒ ~ "ʂgXxuz*vU͑#gzXyS;KkoQ3 x`->`mV1  U?dS8䂾9)g %߻uIn;oʄ9W*gݦMYVvzjpS N}̺q…582d:Gy7԰%>Qe2K/mAoe:\zi{ KN0GâI/\W.]'b,ER.FZS @ߣmc}'322gdddߦ>q.Fi8pAql&L1do{ $/ d$'[W>3|>i Þ Det,l\?x]>=zPlզGCx衩XW\p0j(󥆶0x=+;:S0nWΙq_4惻B}JI,rFΘ=EJM6.FF6c.ۜ&F M+$3_s]/1۸]"e_R:=Րݱ3eH/s^.Ͻz:q׵c5~Я3RЭ12dzI)8,XPƍ3jY@=^.I89f^}眦D *僾B׭'{FF &UI}@*>^#6? ^yǬ]>M/M`D,9t"LCc}sQWDl[0f C[lq3 ^{mBaTΪB\UkK.+e|zFF63* >m^krRH_@56Ke n۪/. }lXP3}lՃ3K_D;ؑJ4oșޘ<ctJml|R(@Kh͍zUMXЍ {Q VL^|_3gnp;TT8Ĥڿ8ϲ$S, 5cy_ceoGwn/_T1MdfЏ&E2W?5;+fYѣgy÷׋^(E_mx9UC0SFeN+4iی ~ʂ| (XzTUjMM##|FFFFFU =9Yϓ#uԽ3j7)|_u#Ζ A5hyFq]9s5aOY3׋L8/h<0pŃ![IV) q%AmU/łƄhu{|{{FF^ۉ $EAeGG @0sP.%3KydcI~V)}{ѳ,!،%.׃}q8xC}ƌq א^uL|0qI z^:"{?@f`Q*VBQbʶaʔۈ'RD?ldJ6kv'M/vO _uEޢ@KlM@.ncrL +Z&F}T^rd+L 32222oQ8LSK5pb:bڹ$umݖ%װaCs򌌌~F@FMd%fUx@Tع/ ,K2}C~؋vcARYmOx 7j R"d׼FJeh FJ?{Ə> R&_!@a}ɋ=JhWXpTv  U˙9s&7pChλロիW?uѪU+n&ڶmkNQݫ =~qPB^8,ZS!D~+q&#]QQ¨9z!|6}0G Tܥ. SBUtc^{:|늩%n5,322iɒ%d25jZ;p4oޜQFѢE VZŀСӧOe˖Yn}YIٴiSjժe.X5iS1Cmn*r` Ipt%m?x5dSBklT*.\Q\-zROmtPZɒQ!X4i$X҇\`R,lygy/zR786M Ieeenݚ_c=[or1<ٳsBY͚5h֬<ڜX?:_!|*KR]_`>KVՑSHהy _} :t蠚ksA_!5scL\k09}jqU`osk*9=##|[z9A!C޽;gu;Sױo߾iӆwߝUVqpidd jsB)B8p!x\,'a}{^evMs ;?(ŶV x Jk 3uԉKҫW/,X@-?~O?JhѢEs9,X5jp0qDs2~W,ժ,UBP0\Zj WRgB)nY*%BU[ַUZS V m_rs+0*J3gΤu֦Q!B:v1WڇbXbPʹ5Y^|j~Љx!b1B9\ c)32me"|FFFFFUUUC>|c'_)oW]/ I)Uӓۖ9;Oz oYF@7##|FFFFFFT(@E˕Z6:V+V7%NLiqMe^۶uQA]fcQ(Hq09$Cř6Ktfi\P&0LpUDPDq8A1P?ֶ{{?x<Ͼޞ=}NDt_V!Ϛz=w,XRɷ7_,#" 7 yumpg =Iw8[Ced*V]Sqma~kELB.ϣIݮa+#"eoB_)Wa>y+U*$ytT*'02""ݦmmNWS<!3c,?~֣׷@_PL3nEEk-Wo/KM"۳=voCrm`րΧǵ=VGDpȎ%rX1cFup]A,v,u=Leۏ=o Osw$k̓\̻kxW̖65{,W=젙[!7W/ |P r|So F~2xyPt=D!]o᪭-:̮Y+֬酆bbEI)_Mqf]c1%(:gzG}ϥ㲮H#%1yr9/lֈ']+8\63.EL }=zP`TH뗭7կ Z՗wWע?.!-bED{p9JI_ {mf_vݶ)Sz_3f@} 0e s-#B|B^1BK9uړZZ Py L,']$k_F`TD|8xl3d;n?Vd2⥗`oIDATtlϣ_qZ|L ܞa/޸ vz.(u0Q!ǧo=s ̆im9b>([0k>s z=O ?z_,SPH},k`RL/GDK/휸F% ko-\{`s4R/0Tt,ro1u@_tLBK;4!khln4"/P .%0BJaeo$vj 4w\LB)[̘QW,Ʉ&|hr*taz@`+F+Wh5ӋWEمCkڶ[9 @ލ\]/F5%Xzg*vC:E }-8yg?z97l oqݾC"cÖmNAmhH&{Wzz =g,Vd #Ş>[+L/SC8[+di|yTT?<';-LYnX2]1xIi\o7 4 ˬT&\ɷN}@5q \1}!ϻ-bڴ1mZUкe`Ǚ^|~Cz3@@Y=[tlkE462U繄\>F+F;ɍxo>\˴-Зz5"N8aTDD<CG^H /D"60s  >pW:N@ z:zVOdkk134sQ GNkNӭi PwxgH'Eo3}ok6};!PLC}_)u:4'/\z(I#;ᜅNT>RDuz3qKiXoxg.ænҥ1qĨiӦų>(kDr _mX*G:_O.\^7g+䘽Ew\ewg֗Ӏr5\7|sk1gΜ;wnlٲEqA۠%de;>o۷7Oz K={5{;^*[`r ujilb'6 s)e>Aeƌq)-ҹmʔ)1wܸ馛~sss444DSSSL:UJ/綮;Ng}RT*ӦUED /D"cѫOOeXt}s[! ]2!GiYd "{5kVf͊UV)0(zt=yK/45}MMt6ҙ× n=]ɎE2m-'۲$gAd555ݶ7.mۖ6wuuu1rHE`EDtoe?TGdy戈7o^Am((Pϭlc6;&1b~~g2w /X|Cرcb޼[FmmmL0!""-[&M1}$qZc{Bã!8묳:?1wܴj`ҤIz!7 jW_}u\zӧO;3xX``o|#v^{mlݺ5s?^qn7Y\v>>>Jc@qtPĞ=ꐏ#u`۳G@`ٵ+buHԠ57C"FT@ 6lhhPw}MMS Puu ]cc{!w:(#6DD$jPH; xÇ|0$Y^      |ŋ#GWxW{~2s衇*$ $7|s,Y$XvmL81<عsg{챱m۶Οk*& T*ncqQGo~طo_w}Yo[QQ_:>`⭷ފ{/f͚չ2fΜVzۍ7Fmmm\ׯWP aJP~۶mnǍ6mxN:)/__ߏ1sXvm֦ݻ#" uuu1rH/|sƂ """H?zD"̞=G+W:*XhQl޼9""͛WsojjSz@#??N<n۶m1ctnߺukƞt'O-[dΜ9sbٲe1q1bDϽ TWWGuuuT*5551{g}6nƜw߾}nݺnac%\EI[A"q 7c=6m Deee|ެYbɒ%-ZVwy'^|7}Q̟?_Q'^{m޽;ϟ~a466ƣ>FΛo;v8cSOŦMbɒ%1fE"Jrؼysy'OV1cFr)q-tn2eJ̝;7n&*d2=Pwy>3fLd<{9sflݺUqJ7ߌ[o5駟'hѢGࣜ8蠃:+!+uL_k/5k(L mٲ%~IJebe^қ={v{qG̙3cʕQUUwuP[[[tIqǤI;N\qqw(N/)tlj'yެU7vبد7o֭Q[[@ iW]uUV^K.[qJ)>nح3Ē%KO?E_ ><&Olb;C۶>:(ꨮV~?xuY۟x≘;w1d]y啱bŊx'#P~J"48xW.I&ŏca֭7w'믿mƍc#>xwߍ 6D[[[ƸqK1Owyg`)qofR]q|XbE5{1b*ŋW;w|0׿#<8%T]]sLm#G1c췝ZhQ}q|7xc|G1|) 'zk|_5knV\T"H%T2<ӟTqJhҥ &>ϥMzgĞx≴e]8%ֳ?sإ^?~|jذa:(uꩧ?)L?8R .T袋R555aÆF:sR--- S?p>5|Ԅ Rv?:|C  z饗kN8!FQ[[^xa&Nmc=ַ5y睨V, bH';oqgW_qT( 6L /cgϞx#"_6{',X~iDD$:P̐N6m}{o߾뢥%>hmmo{U, </***G*jjjbݺucǎ?~<1aE~R||||||      ||||q &?QIENDB`psignifit3-3.0~beta.20120611.1/doc-src/BootstrapThresholds.png000066400000000000000000001020631176542545200236110ustar00rootroot00000000000000PNG  IHDR6.̥sBIT|d pHYsaa?i IDATx{XTx!5Po3]L3 )JVu,M;ǔ,-,KYJY!jA) j h (c`f3ðg<<52k_֖1c1î+c1cLڸc1cLwc1c#c1c1Qqd1c1&;1c1DqǑ1c1Ƙ(82c1Gc1cc1cLwc1c莣7J%xϟGn?C{aÎ;t)--СC WWzG ___YFCAAq/t.s1P(xgP^^.̷C``322 Aiiȑ#xѦM;V/999Zn?ܠ_x7R <Ӹqm+ѣ+O?QEs]JOO\\\t/7}Ν4~xkFSN%""rss#Z]o<:uUUUѓO>I |LF:xbzwD?S]EEEtaZz5EGGHgŶrbbcc'۷o ӶnJgϞsimG?1c7$"۷oS޽i߾}DD~z;vuQaa!?ҥK4h *{!2Xbz>|Ξ=Kݻw-O?Dw聆08q<==?$"c￯s~-UWWѮ]KgC̈#hٲekS-50Bqq1uԉΞ=KDD3gΤӧ _xJIILu߿_trK.{Lx- mu[ܹs´Lڳgi޽KtM""KCJ""4i͟?c<}tOzE7nܠj:t(k-//'___*//7ԨoO>MGsҫ*iժU+WhꫯhҤIdgg'˗/ӯ*5k|/***O>e˖z\B۷'O{ԭ[7a;m͛7ӠA4CQQYs\g v-/ Zl-'V~ۿ+RTB<|MW^r׆ ƦJrrrl""ϧ-[ҍ7L5_.^Hm۶BC;Ǐ7… F´qA?i}3bڵkgϞ ǏOk֬ip˗/d2\=zh=uY~}:ICP۶mE?km/?uϞ=ȑ#^zI!YɓC}%"qiWmTTTdgRľ˺-\^~eq_Uo .P֭XTi)&͛7?.?C.n֊>Jv)8pG)Z9q۶mZy矧%KmFJcꫯ҇~HԽ{wy&%%%i駟͛77Yjok̟?_xq֭W^0*))_C=`=KJJ(((8PoO?D~~~ZڵkGW6 0`O Ys\饗^ 6lÆ )6_b}ѢE/_M6kS.c~w]kG%\.d43U-ݹs'K.8r(۷/999:O0ߏkvX]]_~´:x{{#??_KKKzj<Z???ZFx{{EEEwyG봋ڏP(+W{eeemڴ1|zzVCBByf\oV8 ߏ@7o/Y?%K`׮]pwwGXXFDD`޽47o))EEE7:&rytUxݵktRt_#FhM5kp:Q^^ej5\"<jݻ^۹s'n߾ lٲE_}1~嗑pL>n/\?:oGTTL|kǏC.cĉPT8p >,̟6mz-8;;}*/v!sxѿze .^_~_Z1Qw8q@hh(z]t16֞j*C~]x>~mNя̙>@k/t_b=$$=\"Brr2pe]2Lolڴiqx{{ظq# L+WB@pp0V\m DsA]Z2ǺéM6?T)O=mۖV^MDCӵDad"_]tŊ zGN"Z&"*--8zgӇo^8ԫ^u4hA铒"qҥ6iݺ5]zUx}U?~<р^Nkvݽ{rssk׮:cvM߿?;C?8=tٳ /Ae /ujӧ'P^v]? &R[Ϟ=oњTi)&]XxVN L7SNTPP`رciБɓ'k5{HDj*Gj]|d2V`m6a^uu5͝;),,ɉ ooDSя=J4j(;vp0ݻi ~ qO^8mmϞ=ԹsgjGwy3fA,..x>3{zHRs=GAAAkѵ[lI?]/_9Q[eHn_|9ݛh$ʕ+&]֭[I$"#G?t1ҥbK2G''' a!??pQ>k ~h>qAuY|(((?/LdZ弼;w>>>:߳111WGwww@֭/ֻY& {~m{`z݋z988W^1l}BBBp R3HNNƉ'o>l;fc=sܹsQPPo_|ݵߨ~̝;Wg=k%{wc>!󼼼#\[JJ ?Z:tt'O C՚nwZJ]D (,,DbbbSr.uEkohKo}*''#G~R|xg|`ʔ)r劰70֩S'FBLD?~GAPP io}vt{ӱyfG5qt{ذag,oooxxx`!Cc޽񁯯/ @{K/… HII1h}...uGpA;v VѻwoamqA&Cw\9.UsƤIYfo:QTT$Y4Wrga+jۧOG~СCWWW.CcsqkN8%,, ]tngRT κ7wі-[UVB4gj۶-?^g}Gt|2]|Q޻w/Ǡb{_NUU9;;k={6M24vYٕ4fzgͻ~^}U*Ѩq}xii+V[]O8QkOmyƍTWWӶmt^@?b?~t"etPˤT*)55Uk݇~4Yz/j p*))!"u* /ׯC=$/*--}ѨQr}Q#' okG+++[nt1")u{K/DÆ VH^^pD͛4h 裏t֧ аaÄb_]^^N}gΜ9z77]sW_%v͛7_5yzzRuu/qjKɹ#F~[g.CbSSYH?O bgΜ!777a0"%c>}hƌZӂ^~=oO "ڷoAg;988\.7Rzz:[nԨQZғO>I~~~G۷o%$$Ї~HDS d2RPPы/HDU*R)&&FN~~\.;R֭I. #ܹ&O,'\N-Z 777B3gP`` RϞ=)**Μ9rDDno?Q@@=3TRRBΝ#WWW>^R=(00"""NCRHP{ァފ 0`֩ԫW/ׯ]vMޭ[7NmE\.VZ yzz u|T*PE%|!jomFwF$k׮]ASrWw޽K9s& 0@2ׯ'$}_>($c6sc1$cbbp5̞=j* j%˗/#..jZBxx8كX 1˛6csQ]]W^y/^Dǎ1rH,]>6gGp*n5w%L-++ %Dc[~~]BCLbǤnRos͕%82ŹYSh k>%#y'N4w-,ǎ16gGƤۧ욻1c1Ƥ;1c1DqǑ1c1Ƙ(8ڰ,@&<3p3/nsqdL}Jo84//`33ǎ16gGƤۧQUm 0yrs2q3/nsqdL}Jo>c1c|đY[- avvD :ڼud1cGv2lR$$'O.hŚOy< ̛41fɸ͙Ǒ1)m}hj`|ͳ9hgxx׮5;;fc̒q3 #cSx6-(yk8@QfHPo嚣MŒcǘ%6gGƤۧ1xdffŋ(//GlllS׋1LcqbI詪wٳѩS'O>$y2&MB.]ݤe1cpbY"]1q!CtRGKrcƌKg5iEk ZsڪCmk2SDcRD~~>kٳ^GyؿV^vd;,۵"d8::g? IDATO?EA˖-ѽ{w:uI*Ț 0y$& H}՚cg ̙'''!##CoفήcĈ^6gGie۸}JoqN> JךpvvF^^I+ƚfXaky4Zs쬁WJJ fΜ7"""WFTTrrrY_|JիWFߖp3 qm>GTUU&׮]*c\kٲeGLL pBtVYCԩкuk;QgY]1)qٳ'rssQRR"gΜ3g`1Xc#UTT ++ Z###qA?ƸqdcևscLvǎwb̙z{.N xꩧL_;֤_n<3pիΝ;ҥK .a8q'O6zݶۜipsm)m}Dq|饗i&[yyy4in޼ "BZZ?իWɓƳ>kz38w236c'm͙d2A>caaaZZ ZnmJZ nsq6]ۧ8n}bbbp8p@7x`رM[Sfr@I ЦMspЫj.[ZZ-[`&L5=33!!!FZ4wۺHH?sEy05#;2@5w8]ۧ8222k.ر())A۶m1c`bboFñ_ EZZ.LOOOGTT[nEEEEX @3,R+FZ4wKH!ŚǼy86wY8w.nۧ#9uaȑ9r9c&kƌCDDñvZaʔ)Xr,ZHk?GF 6T*y/i ^WE(D8w1ƤHoqƍpssСC|={ˈ5ic1̕bbbp5̞=j* } ࠝfO:~ c(*?=+  bցscLHLF7[ˀΠ搙I(33"i'OEDh-y&"Լn즮~_֧\C&6.KsǑe۬}3)X jDTo̤U+_̌ñ.ڜZ kμXZ8]օۧ1GC\zm۶5[13Xka8vփe6צTjÖ1@:G0]ևۧq,((@AA`h ]Wyy9~GO>M\UӍS Gt0y Ź1fI oj z_~٤c1CqbR#ن ?*ɬ.Ƙ%:]vC=$8psAL'''t O>$e&u6 Tbp~L(-Xm>Oc\\vvvPTطo_3Tr8;ie͙QZ8wڸ}JoNߌ{bʕfDRR|||䄰0dddܖ-[`ggѣG7q R ?yfI93nsq6]ۧUUJJ fΜ7"""WFTTrrr꒟Yfdfqr +̌DZ6s/f>L(mlOic8ܹׯRo///+l2#&&pBbժUXhe0~x[8pnܸazcc5%]1)8޹sK,͛A&ʨWTT ++ oH.\GGG<<<кuk-ZWx]zUUUpssӚ޹sg\tI2Xn֬Y@3XSUz]Oku,0vc'm_̼͙Q8w6nG#++ &Lk L֭[8~8{9TVVbܸq8w*[naĉXf :vB-??0aj=N"nݺ-Z+вezzj? ~iV{{zGj5?s 0rHaZuu5E8}4||| HNNG ¨:Z=={c'm_̼͙Q8w6nGc^^ :tVW_}?>WPiMOOOǃ>XRqQ=z;{1<8z(r9I(hݺdYs/35]1){ım۶^mDWj]hoo___dgg73f@\\"""k"//SLB.cѢEhٲ%tƘ2Wb1S2Gtׯ }}}?VjN[{gٳgCP`Ϟ=HMMXXXw@80@Qc'm_|͙Q8w6nGgݻ!Cx 5k\FWbԩ8wܹ#G_~¼t[Nׯǎ;n[v8yfI93nsq6]ۧ8>裨@zz:`ȑ@vv6|||鉎;߇L&CBB*L{wo58;i3gJJJ 7niХK8::W^HMMmm98J.SxtµvvvHMME\\Zj . عsWYgg`P33N̕RRR0sL;8u(@]lrMmۚx8.VT̘yfرWJk|ܹޑϞ=O>-Z@ZZ}|G3gP,QVVtp3 #%]>' 4b⿧])3o^ֵ,ySUkbϞ=8wn߾ "[VlS&=7o{'7wM,24G=Puu5<<ۇ>}N1vO̕f̘8DDD <<k׮E^^L\.F):u*a֬Yٳg(g6]1)qr z͝Ff[j.nw8bcccǎ>̌5k4ͭh\HLlJ)v>_ևۜipsm)m}D8kȑ#a 4Ȝbf"!kF:)Ǝ6gGie۸}Jo#vڅ!C 22:置{6I%ccscLf7ob8x … `7_a _1KĹ1&eöc'm98J.SxtKJJĉˊ7o6w-,N8Ynsq6]ۧGϞ=q sօ1LcqbIގԩS&1&ecscLvMiӦ'qs֋1cqbIk}||oƤI0etY^BgϞ5} YoT殍eI/m48ƹ˶q6>"ǂו(**j 1qq&O<3p줍6gGie۸}Jo#~a8vp3 qm>Hی`1DcRwpc1c M~غǓñc̼͙Ǒ1jܺP*\CnZ6=nsrAA& 6l@iػw+Țιs@L tܵ,;e͙Q:8w>' +ۮ]֥9Iu߿ЫW/aF4fM殉IGs篤$t|rOg 6g՚&P^^GGGsTb5UۺU-rֲ7stpbuI}G;;1k$&NAǜV ރeg殅eIGs比̜97nDDDV^(S28}4հjsI,o:.ztwl0R>7C4_˖-C||>5BQjMDzoCSݻqQ6}Hz=m4|'#c 4 >\(رcZ?J!!!F׋1f8w1Kur#&T7|222}nC Aee%ƍר 4"D}!77nTc׌3j*lݺ;w.0e@ll,̙#_x1݋B`ԩ8rP1f[8w1,pQ߹bϷj xꩧQhEPRRTTT@&!))  hTl@v6Rm6wm, NZ+ڵk={6j5T*RSSS /_F\\j5ZjpٳaaaZ-6gGij)m}2o\pd2effjMwW^z3gPNNvΝ;(##Prr2effj=JKKXL"@<<4u0n{ ͵^ִ̕Bff&m]S怺S?SsmjlLjgih(ns{cBBv^-ɄsJ%rss٫L>)=\j8vḟۜipsm)m}DǙ?Y*`vvK6^99ifI3nsq6]ۧ8_(++C-j۷֭CII BBB0c 9K#̘1qqq@xx8֮]["m\.tRoaZ ŌWs3Z}ڵ #m}Y33gb1S2D,X}&M$L߽{7Fj_;v eE'&MϣEիۨ3Ufb㎣0gb1S2;}3 OhMP]]'")) "SNŹsp9r楧cݺuE!//(--ÇgcjmUb"Ph9vfŚ98J.SxtO:nݺ}´ ,, 7nĔ)Sk.cǎf03*Mͳrs"]c4q줍6gGie۸}JoSU_=zhM۷o zP*8uTԐ5=={c'm98J.Sxt[lRi?#`Z[n;wv1cs3[qRW&mz;ݺuɓ'Q\\ WWWo3BCC^|Y kNcs3I L5Ѩȑ#Gaرy&x \?\WQ5<;ie}HT۶9րsmkYsN|@B3-)rq̙HMMÇqa\.[oU>߿ ɚ@h( .ñ6_ۜ1LsK k5eۚ}k:EL?Ο"6m ##;wĩS'xwVjL>'Nl2[33N8YklsΠصEduu aq&lOi#qzW^1i8;C6w-,N8YklsцA ;"ike}Jok몮Fqq1Ο?ߔa1DcR`155<ڵkΝ;Gk… .]jJ2XcpbY"]֙s0f8юY0bݻhѢH;lقO?I+L1/n q.L(}l=N\'n.}D:۷o{///dZqw}״5e&w&gc'm_III񁓓ar[lFunsq6]ۧf0B ۇ4P}D ɰsN};MRAt'c'm_)))9s&6n܈^QQQɁ1k,߿B98J.y 3o#YYYP(+^jҊ1Xc+-[ 񈉉.\ݻcժUz[o׷)h1Ź1&ez;wEP^^VZR1v/̑***H鑑8xz-g^1-cRTUOOO:u UUU%%%8u1f,s䯫W nnnZ;wwÌ [Gd2>݋1&2Gi IDAT J<&kZYYLyfI[s/}?nݺ'b͚5ر#///"++Kxۜipsm)m}D8Ξ=6mŒ3P\\I& 󪪪pq,_7n On 3֬<3pЫj+`ȑ´j@-pi ??0a333bt=98J.Sxtr9v܉1c 11 ,.9::qر#Kd\\ɓc'm_ EZZ.LOOOGTTTJǏ^Ν۷ocŊooo@rr2JP^P]Gkm48ƹ˶q6>"G0`{aǎ(((Ix'k,e1C#͘1qqq@xx8֮]`14ms5; e);.Ƥۧ#3#wwk,kc1\cj+c4Gc1chò5Cdg7wM,ǎ16gGƤۧᎣMsq&O<3p3/nsqdL}Joرc$0V#X};ie}͙Q8w6nG}v9={6rrrY/k4_1KĹ1&ez;K,j5.] J>} )) 7n0gc(cs3[RsMÖofόꫯ";;+^z%t+^|E#&&Opׯk]ñ6_ևۜipsm3eLHN.\|ڵuZ;Ο +Vŋ/㏣۶mÈ#t vyfY_փۜip-.dy(@b⽯q4bT-Z`ԨQرc.^+V $$~!n|[899!,, z~xжm[i O?d:m]` PRyfY_q3 ee[}EE\ :tV?y;:ppp~W 3gwS0tPDEEPg_~&MoGC ql=yfY.S/fLh8wY?nȎcvv6^}Uxxx`ȑضm/"33~-q-̙3s5}-[x .Dݱj*ׯ_ɓ'G޽;>j }11fC*1XS O?ƍd2 g}?8C /?Ƃ D߿YYYx7GFF}۷o;v4L(mlOi#rjtt4k888`ĉHOO_]4qW+& *d`ǎ޷| 8yddmZ58;i3g2f`۷#88ptt?֬YceL(mlOi#rıo߾xgSO]#neʹ޾EZ wwwe.]ŋ#-- tooo@rr2J2  zق]kc'm_5{mܸXz5OOz]]]???d2">>...=z%L(mlOՀ>v41Ũ}D:2K4 >\(˽X`{hsrr(zc\^pBbժUXhQ=iӦO>Aff&bqb@5U ΛǷ1'4Mƍ__FWbƌXjn݊|̝;yyy2e 66s/YK.ҥK(--mtcf`HEDطorss1x`>3Lb"Pv[#:OWEVѕk0{ljT* /,,YVBee%>?>][s6 T@۶]±6sURRTTT@&!))  0zۜipsmi膏" 4onaKcSNԩSuKOOz}ܹ{Z8}xA 33zñ_543;w~+WWWssmQ9PTpP^n5':$IeQQQ8}4/_?>*tuYYYn}69vt .Sٸ57l؀ 6CZJN M>]DL qa$ B 8<CQ㍒$phDDɕ_uuL0.\@ 5k`̘1u>Zn֭[g;vY.,71XȽkș_ pBH nGeavQu<>8t VY hu픍zx1Oe89ED{]s#r,sH\<>kI)S4k̙3""g""go8!5$Ibx11xV5o\? O\Zƹp)=j $2~~s;*Sٸ~o8Λ7 cȵ8YYdn;`~w>?ڗ=tѝ0~<>㸵vݻ?:vD[SKs˹v$R:Scnn.n޼:QFI 1Q*sc~9w>7 bu!!#0\OeTfكEDΈEDJfسgO\|6lddd ;;>( !WKDd9#f)Ɇcjj*$I¸q"jܾ}pmڷR"" 11HL6m۶!::ŋ1zhVZHHHodsـ$iu픍zx1Oe1p'|ǏF j\ׯ_ǘ1cV$Gh(v'YN_+WD6mヸ8@Ƭ^={/7nulwc6ϑ^/el?4-ѤIC?:vT,Z /]Ą pψFBB.\P[6BBjrWL.`s/T64ղe0e$''#44 ,@v~zL8h׮{=x{{㫯rpiWU=~~LT/"q5 ֯_ݻw#77B\>77ՅK ;;s5oCKKKQVV|ЪvWniT@˖/̟oߚl^/" b 8'Npd=@/6FFؖ-ot'sbn;/GWqq1*++d0=00EEEW^AHHq2ӧ DFY|^ִl [bv)ν_̮l?f N80̜9]vEӦMYٙZ ̛ X@mReێK$ɢ~mo~z~~>E1++ ]tYF"Վ٥lr{']Sٸ4 xyy!33ZrdM :%%u5\X}ٗ#+ 5ΫjXd |MG1ظq####mS ޿HuR6G{#]Sٸ4_Ν;Hb1RG䗗bccgdd ))/^7x{5zūDnQ^/fXr+&D3p G7)9*RRR0vX]vźu됓I&ƌ,\{ל9s#44T7{Dlyc1?4!˗-["<<7Թ+Wb(**Btt4VX>}]ɓ3gqy,_/b?]'jRj $Dߕo ǽet .O" 7ȪW6f{l?f_t .]KiiiHMMņ УGYIII8uЮ];$''cڴiMZ+L9ٳp#eKI6당l.Sٸ4U۲e0e$'',X;wbժUC\\3i|mcVZ۸䉭_DD""%3p0`C h4ܹs Ȝ-1$ϘS G-1HL(ŨDPPTYY6xݾ}57qCJcݸT."l?fqnطo P^^>@?///i+??0z󲲲`@VrW\휇E\.wΏ<]ǧqp lܸQQQ"##NW͛ڑ :v"yQ|$G0x|*/_ƀpa/F۶mk,7n8!m۶:XL@^N@TTtbjԨQ<<VYN_8ڇ]S0x|*… V/#33 \׮]E`ժUزe ꫯ"''&M33g/_QQGѣs pQԹ"r/""[av_oav$!<<u."99׮]ӡV;wxES$ K,%K0`>_DD""%3caa!ڷo//ZWҰaCh4z2yd塼B>}222 UUU7gOO9:~zU*K٘]ǧq7,o… h֬͊"?:vr=ހ'av)˽ZmSkf7ot邜Z˗ѽ{wGպ5n'YN٘_ukܖ]ro<>mO (,4:s=qi8N0UUUxgqórrr0~x?o ""g"HࡇLtuߺ%odWՑ#Gb۶mغu+"""0l0\xB̞='NΝ;QQQѣG#))ɑu"wV[,Kg0lg-$D#YdQ$lڴ m۶Ŋ+~z >qɹǏ118n;ec~RPeYbl6xnl?fРAHIIΝ;qqܼyƐ!CвeKGJ6v,Ыt9*V\ŋXb՝>a}|p,[ SLArr2BCC`kV2|\\-Z#GaÆֹ ]eK||=rH2?Kd9~… 6YYhhMCDd)K ;;s5ڤ&"r].2eK@* y@XXnB#薫}DDfȕ_ŨDPP@Y."r?."r6U.]ݻw~~~í[p;===N(71XȽkr(-껮2ӧ GFFQFZ3] ˮ ǜS6~c~~~Wnn. I0sL͛(((͛7YfA$$&&"77W Y()$p)\WjuF<=י3gNWPYG]$?fݏ9l<33ヒOט#&&O?4K/ٵX`pNvBll,1x`􌌌z=;,, qFDEEGFFy "K]!!rWB0sNxgfTյk"44hpUkڵ6/._)))Xjlق|Icƌ̙3WTTѣ8z(ܹ=z999e|~-** ]tѿՋ1Vk/zEE[]L~x9tɢ4oǎYQ$-[9sj04@KJJNNƵk0}tj`Ν]xb]~j$IXd ,YoS D:A. IDAT]D{fUUΞ]r]Ɇ?N<78y$6mj~4ô[M3w|mG*ebv7͟mD6,KJHqs?]UPVVE;KJJ0j(#!!nE}8jYZSێzNeWEܕ1.ƜsÁӧ BS/ݘQ<3 {n޽xꩧЩS'GŶmpuH?9&MDpNvr=MrWt٥2߈ro9eSxghG:|0ٳgϞEii)|}}ѡC$$$ >>QY<8 =."R* G@;zV|| ZvDS}@. JK@VtőyS*ȔK.}}i媏`э{']#=sr:Î˕貋OV rںWTh/z?#W~#nᇁ'9q99mG rSٸp$"";HD8 UW۠c<D2hx2ED`ݠc:.W/_6mFW+϶h.ly2ż nG"c6x|*[mǒ}1n8\/FQQb GWj`<`@r3˘WQhI k7sr{mlݞ9lKFwǜᘖTlذ=z5kSN]~N@I}ksUv|l{3]Z2Ś[Dbɹ]Fguʆ)$OLdd$5jdl_^}{?^]ۮ9bYz?*J7gW~j.UrL2yeJ؎oҒ|cvٖ=ǖO2ǒs[;:S6Q*ZF˖-=ztfeeK.v :`+ĉڟd%m;[_sg^&ڲ kv9S&cΙ)a;ɺrrdW}Y}JLsQ謒B8cGݻ7.]֥K$%%aڴiسgڴioooW\PTcwok(FF2\t\%ݸxp f|7fW8:P^Di7oرcat֭ûヒ'O:D]D䌘]D]U 99׮]ӡV;w2Hј]D䌘]D8c.@noFvv6n߾-w)rZ窗ڏ,]VXy}(m۲XyT7Ϝ9Xx6LU/kgY(m*@y5XPڶe=ܩo8yl8Yl8YN8[)//>}ZJjj^j?:uنҲKJz]2z̳gv86mڄѣG]۸q#F%w.E.c~ٟ=سg#w9f!??)j^j?z w9.Ci٥ĿKzf1X=.o8ybÑbÑbw&MJ;#w)Fݽ{)))FÆ ѬY39rfʕ+ѦM ..^uM63rmz-T*L6MRL*,,ѣoootYYYrt|۷O<z!T*l߾]Z+W#<ƍqqq#[=;K͛Je f}0+cVǬ]XXXmR?f#> ?#!Ium`8w Z?rVCZZRSSh"/HLLDRR.^(wi/ԩSチT:t}tQ7n@޽Lx]Sumt7uX|9N>'N`Ȑ!ӟlYN)Y#H:~l0Yav 󲲲 ޽{ɶ DHH8u %Yȑ#B$q9K1Э[7b0SNoLYƍB$w^K1֭[}"==] 0@L6M1cHLL K$}v0:00P]V%s:u峍av92̊{{EDDM8VUUg%w9V+..$I=FlLe2+Pt>sbĈh޼9"##b rz||EIuee%lقR 0@Z%ΝC˖-?vdv/fq 㔞7nm^n8.Z^^^:uܥX FAAAQTT$SUB`ڴi۷/t"w9F}'8z(|Mw1'77˖-CLL ۇ3gb֬YXjܥ95g=䢔7&L͛7]vգ,իoŖ-[PVV}BVR=1+cV7obر]MT7 ___+Dff .]/&VX!cTW߿_?Oш'|RƊ[nXeMB$e0}ŢC2UU)S6mڈBK1… Eرci/U֠A1p@i/8#_J~Zш_U;vL̛7O4iDOԢ,s o,r fq 1+KHHCz=m U'|={yf\riHMM;#\9Ի^Q9r$󑑑___J4* 5PhٲLU7uTر}.SpU+{Ν;288:t 6TkpK.J:4hp@LL ~G\ׯwx-J///tQ]Ya<%g瑞>vA#^СC !1c`ܸqrhzm199999oTi^^^Ezz:$+33oߎo[{18qBƍCTTf̘F#gϞ5v9jJ\_rQq-J%ϝ"JϒwɓN^1+SrV_2dWn0GU{:thժ矅Zֿ4HKK>>>b"//O̚5K .]ɓ' i=."J2rC ///tRqyuV'p@iWii8r~˗#GVҎs^\xQ>}ZSR1rf̙3ŁŋEvvxꩧDӦMeav$ѰaC$KZ]/=0q}ףGD~DƍE DLLXl{zc"[bvLٵ~Zu?{  :}}mݺ釘$7x: IDLLLiԴiCpTZë Iɓ-ZO>$ٳg*$I"..N IMzWFG}T ooo!Ihܸرc«cǎFaÌB Q^^nUD2N%Ľ}׭[7mҤI&kQvDNo&TVKdK.㔞]v}1$Iw5saQatUڵKxzz J%[ ///!IXnUz뭷$I"55:׻wo1~xzjUυ$IbȐ!-ߣG!OHH$~ׯ !aE~W_}UNj?\h47nzJH$DQQQ«.1c$I|V֘_)=;J%Ο?o<($IO>OEPP$I,Y{WZ%$Iͳ3le3d9Z$իWטsaQa^?hܸk׮Oυ۷ox}$^{ͪ:,Q=8x.{I!I޽?$Ixyy/u$I,_]fr^yyu't3ׯ%5qJ/!p0x`\^a]t (--ѣGX&!!_~%<<<Oɓ2T8{}c~?wFggg,|||L.rJ$%%ó>Ν;o߾_mZU%y󐐐Aa„ ؼy3.TTT]t1ݺu?uW_YU+]5)ܫ~)g5,ϽÆBYz @ەH Zh8{,L\xeee1Y7 IxOqU{JJ 4 """0tsa Aii)2220sL9sFhhn 0 9C~#!!}EPP_]voN8dggI&3Mգ[~/Rf!g.ctTѠAܫnpTL]ɱl۶ ;v@ c,վ}{nϟGjj*f̘@HdyfLet~Æ ]VVV׬YM6|]u?$iӦ6l X_Ǻu~.U+0 9C~4= >,Ν;#77.^}Uk^Z_$.Cΐ]z*IvSW9|82>CB%Imڴ}]>.#{ !ıcD>} zB$Ѷm[iԨPTbϞ=F߾}[_cvvU5V_~봎_?*)B$YRleWu3g$Ν;L$IgϞ&;}t!I:t~C"0Lszw$I"""๗iǑuGy* 8|wڅ>}x_.ԩS$ ݻ7 n?<!ɮSէeξ}*,\?|ӳgOM֫';De.~1U KV٥jl"K4vU%͛7N<^za…:tɾW\ktYHHHymwqPRRM6g1\PPڵk&K.8 n,<(//nj30c סSw]ի:c~i7Ծ}{  -at/rw.-[dٳgqaHT#ϽL7TCtt~SCs=*TVV̙cΜ9 . M>[G{Rll!sN:?u&M7|ӪO7|{:tgW]Ν;FG Џ8ؽ{wf~i1]o{irVK46(՞7o\ڮBT*BǏ]橧|(((0WYY 6n4àAp5=+WŠ+h65ٱcQۈ\2Xz5 |AnٲnB@@ `t/{]u.!6mg7s/p$t_ӛz-+بӝ^ݯk׮4h4 F^QQiӦ̙3hѢ^xӧڴi˗1h j 6{ >#۸rJ=38p<<<0k,8pT*bFa#˺Zt)V^]d577C ƍ_N]6]iii?3RRRӧO7\ dt>;avY]8phذ!FiV{dwSNE@@h+&&F?mذa6#F@nڵkC=ƍѨQ+((oL3g~AAo^~ ЦMt111x衇exyya͚5իGvv6._FhIDAT>}B򫠠SLAf=z 22ڵCff&4i4իfϞJ<3h۶-}QtW\Abbyb:t[F׮]LDT wȮtT ܫ88HdRCռ5WL)--5J~u:tWLu.** ݻwO?<';믿??3? sALLu?F?ؽ>:$t /8|0rrrpQxyy}L:&׷eM.C(/㔞_#GDYY;vDbb"NZ^{5t ˗/Ǒ#GPXXhpȑ])=tܹ[F{ՃANbɒ%B$1eKB'IēO>iiiiB$1k,;W&F#E˖-ŝ;w.H1_!..N"K!RfQ?0`۶m駟>ǞF(Yeee,Q6iiiP_ ///!R ߿YYYxn8{"S]^r\Iܹ#ڷo/$Iҿ /_n5gΜ;v*J,^؎Uݻ"**J F#w9DR{LbK!R fKHFyyy~upa#::ڡ5hڴ)~a;= 2vP>8ue)K+w DR6{6\q$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""p$""""""UAzIENDB`psignifit3-3.0~beta.20120611.1/doc-src/CONTRIBUTING.rst000066400000000000000000000245231176542545200215330ustar00rootroot00000000000000============================= Contributing to Psignifit 3.0 ============================= Psignifit 3.0 is free software. You are free to modify the software under the terms of the license that is distributed with Psignifit 3.0. We welcome developers that want to contribute to Psignifit 3.0. Software Architecture --------------------- The Psignifit 3.x code base is logically split into several components: :psi++: The C++ *engine* of Psignifit. :pypsignifit: High level Python interface, including visualisation methods. :swignifit: Python interface to ``psi++`` autogenerated using the ``swig`` tool. :cli: Pure C++ command-line interface to ``psi++`` :rpsignift: R interface to ``psi++``. :mpsignifit: MATLAB interface to ``cli``. We refer to previous versions of psignifit (2.5.6 and before) as **psignifit-classic**. The following UML inspired diagram shows the individual components of Psignifit 3.x, and how they relate: .. image:: architecture.png :alt: Software Architecture :scale: 75 % The diagram shows all components and how they are connected. The high-level interfaces ``pypsignifit``, ``mpsignifit`` all eventually access the ``psi++`` engine via an layer. Depending on the interface language, the layer may be either ``swignifit`` or ``cli``. In Linux, building the software begins with compiling the ``psi++`` headers and sources into a shared library ``libpsipp.so``. Then ``swignifit`` is compiled in two steps. First the swig tool translates the swig definition file ``swignifit_raw.i`` into the ``swignifit_raw.py`` and ``swignifit_raw.cxx``. Then, the shared library ``_swignifit_raw.so`` is compiled and linked with ``libpsipp.so``. When accessing the engine from Python, the high-level ``pypsignifit`` calls one of the Python files in swignifit ``interface_methods.py`` or ``swignifit_raw.py``, which in turn call ``_swignifit_raw.so``, which in turn calls ``libpsipp.so``. For Matlab The situation is similar, but instead of ``swignifit`` the ``cli`` handles calling the engine. Dependencies ------------ This section lists all dependencies. The version numbers are the Debian versions we used when we began development, and hence they will probably be outdated by the time you read this. Compile-Time ............ * `Make `_ (3.81-8) for building the software * `Gcc `_ (4:4.4.3-1)/ * `Python `_ (2.5.5-6)/ * `Python/C API `_ (2.5.5-2) for compiling the ``swignifit`` interface for Python * `Simplified Wrapper and Interface Generator (SWIG) `_ (1.3.40-2) for generating the ``swignifit`` interface for Python Run-Time ........ * `Python `_ (2.5.5-6)/ * `Numpy `_ (1:1.3.0-3)/ * `Scipy `_ (0.7.1-1)/ * `Matplotlib `_ (0.99.1.2-3) for the Python version Documentation ............. * `sphinx `_ (0.6.5-1) to generate the html documentation * `doxygen `_ (1.6.3-1) to generate the C++ documentation * `epydoc `_ (3.0.1-5) to generate the Python API documentation Testing ....... * `nosetest `_ (0.11.1-1) for running some of the unit tests Build System ------------ We use a combination of `distutils `_ and `make `_ to build the software. There are several ``Makefiles``: :Makefile: main makefile. :src/Makefile: ``psi++`` makefile. :cli/Makefile: ``cli`` makefile. :cli/MakefileMinGW: ``cli`` makefile to compile ``mingw`` for windows. Note that main makefile contains targets to invoke the ``psi++`` and ``cli`` makefiles. The main targets are ``build``, ``install``, ``clean`` and ``test``. The main targets will invoke separate targets to build the individual components of the software. If during development you wish to build components separately, have a look at the main makefile, it should contain everything you need. There is a single ``setup.py`` file that can be used to compile and install ``pypsignifit`` including the ``swignifit`` interface. Since the source download we provide includes the already generated interface, this is the recommended method of installation for users. For more information about how to use the ``setup.py`` file, you may look at: `Installing Pyhon Modules `_. Git-Repositories ---------------- We use `Git `_ for version control. Our main repository is hosted at `Sourceforge `_ as `Psignifit `_. Clone the repository with the following command :: git clone git://psignifit.git.sourceforge.net/gitroot/psignifit/psignifit You can also `browse the Sourceforge repository online `_. We also provide a alternative repository on `Github `_: `https://github.com/esc/Psignifit-3.x `_. This is a mirror of the sourceforge which is updated daily. If you prefer to use the Github workflow (fork -> clone -> pull-request) please fork from this repository. Layout ...... Every developer has his/her own branch, and we use the master branch to do integration. Hence we have the following layout in the sourceforge repository: :master: the integration branch :ingo/master: Ingo's main branch :val/master: Valentin's main branch In addition we also make heavy use of short-lived topic branches, which are deleted after being merged. All branches except ``master`` are subject to rewind/rebase. So please base you development either on ``master`` or better yet, on the latest development snapshot(see below). Commits ....... To make it easier to keep track of the development of Psignifit, we use the following marks forto identify what parts of the code base we worked on: :C++: C++ code base :swig: swig interface :py: Python code :R: R code :matlab: matlab code :build: Build system :docs: Documentation And the following marks to identify the type of change that was made :NF: new feature :BF: bug fix :RF: refactor :FO: formatting :UT: unit test Example:: [build/RF] do proper signed tags with new tag naming structure Also, If you wish to automate the process of creating such markers, to increase consistency, we suggest using the following git-hook: https://github.com/esc/commit-marker Merging ....... For easy tracking of what changes were absorbed during merge, we advise you to enable merge summary within git:: git-config merge.summary true Execute without installation ---------------------------- Since it is tedious to install ``pypsignifit`` during development. We provide a so called in-place compilation. To compile the ``swignifit`` interface without installation simply type:: make You can then run:: >>> import pypsignifit as psi from the source directory. Furthermore you can use the environment variable ``PYTHONPATH`` in case you need to bring source directory into scope elsewhere in the filesystem. Maintainers Notes ----------------- This section contains notes about the release process. We also support this process with various ``Makefile`` targets. All targets for release are prefixed with ``dist-`` Since Psignift 3.x is still beta software we provide so called development snapshots as and when new features and bugfixes are available. Development Snapshots ..................... Development snapshots are made on a regular basis. They are invoked with:: make dist-upload-archives This will create all the required zip files and windows installers, tag the git repository, and upload the files and tags to sourceforge. Tags .... Tags should mark critical points in the development history in the following way: * ``release/3.0_beta.YYYYMMDD.1`` marks the release of a development snapshot * ``doc-YYYYMMDD`` marks a modification of the documentation that has been uploaded to sourceforge. Older tags may have different versioning schemes. This scheme was established beginning of 2012. Extending --------- This section contains hints about writing code. Coding Style ............ We try to adhere to the: `Numpy Docstring Conventions `_ as far as possible. Adding a new sigmoid .................... In principle every part of the library can be replaced. This is generally done by deriving from the fundamental base classes. An exception is adding a new sigmoid: Adding a new sigmoid requires two steps: 1. Write a new class that inherits from PsiSigmoid 2. If you want your new sigmoid to work with mwCore objects, you have to add a label for that, too. The mwCore class scales the second parameter such that w can be directly interpreted as the width of the region in which the sigmoid still rises significantly. What to "rise significantly" means is parameterized by the parameter alpha of the mwCore. The default alpha==0.1 indicates that w is the width of the range over which the sigmoid rises from 0.1 to 0.9. Thus, the scaling of the second parameter obviously depends on the sigmoid. The constructor for the mwCore class looks roughly like this:: mwCore::mwCore ( int sigmoid, double al ) : sigmtype(sigmoid), alpha(al), zshift(0) { switch (sigmoid) { case 1: ... break; /////////////// here //////////////// default: throw NotImplementedError(); } } At the position marked by:: /////////////// here //////////////// in the above code example, you should add a new case that defines all the scaling parameters depending on your sigmoid. zalpha scales w to the correct range, zshift is an additional shift to ensure the the sigmoid has an output value of 0.5 at an input value of 0. Adding a new source file ........................ When adding a new C++ source or header file you will have to: * add the file to the git repository * add the filename to the Makefile * add the filename to the Python setup file psignifit3-3.0~beta.20120611.1/doc-src/DESIGN.rst000066400000000000000000000150661176542545200205770ustar00rootroot00000000000000Specifying the experimental design ================================== In order to estimate a guess rate, psignifit needs to know how many alternatives you are presenting participants with. However, there are vast differences in naming conventions for experimental designs. The way psignifit approaches the number of alternatives is stimulus based. Note that a large number of labs use a response based nomenclature. If you don't set 'nafc' to a specific value, psignifit will assume that the data come from a 2 alternative-forced-choice experiment (AFC). That means, that on each trial two stimuli were presented and the observer knows that one and only one of these stimuli was the target stimulus. For example, in a contrast detection task for luminance only the target stimulus would have contained a different luminance. Psignifit follows a classical signal-detection approach to experimental design. For all other situations you should create your Inference object with the keyword 'nafc' set to the number of stimulus alternatives that were presented. So, if your standard is always smaller or always larger than all the other alternatives then you use the number of alternatives to determine the value that you set in 'nafc'. The easiest way of deciding which 'nafc' you want to set in your code is to consider the range of your psychometric function (PF) on the y-axis: - PF from 0 to 1 -> nafc = 1 - PF from 0.5 to 1 -> nafc = 2 - PF from 0.33 to 1 -> nafc = 3 - PF from 0.25 to 1 -> nafc = 4 - etc. Setting the keyword 'nafc' to a value of 2 or larger results in a fixed guessing rate of 1/nafc. If you are running an experiment that doesn't quite fit the classical AFC design, the way you think about your experiment might not correspond to the names you will use when analyzing your data in psignifit. Two aspects that you will want to think about are: - How many alternatives are you presenting? - Is the standard stimulus the smallest of the comparisons? Again, these aspects crucially influence your guess rate, but also the way you interpret your diagnostic plots. In many experiments we will record which response an observer chose and we will then fit the number of "stimulus present", "stimulus left", "stimulus longer" responses (or whatever is suitable in the present context). In those cases our guess rate does not necessarily equal 1/nafc. For instance, in a detection task, the observer might be very conservative and virtually never report the presence of a target for low stimulus intensities. Or, the observer might always respond "stimulus left" if the stimulus is presented sufficiently far to the left of a mark. Another common approach is to present only one stimulus per trial. The observers might then have to indicate whether the target stimulus was presented or not (typically called detection task, or yes-no-task). If your standard is in the middle of the stimulus intensities you will also have to change your approach. For example, in the discrimination example (ADD LINK) the stimulus intensities of the test stimulus vary symmetrically around the standard intensity. We will summarize all these designs as "yes-no designs" although the term yes-no is typically restricted to detection like tasks. The crucial difference between yes-no designs and forced choice designs for fitting psychometric functions is that yes-no designs allow for arbitrarily set "guessing" rates. In all these situations, the lower asymptote of the psychometric function will be a free parameter by setting the keyword 'nafc' to 1. Note that in this case you also need to specify priors for four parameters instead of the three parameters in an nAFC experiment. If you would like to read more about how you specify the shape of the psychometric functions, have a look at the section on :doc:`PSYCHOMETRICFUNCTIONS` A note on yes-no designs ------------------------- Psignifit follows a classical signal-detection approach to experimental design. This means that the goodness-of-fit plots are intended for such designs as well. While you are able to use psignifit with both forced choice and yes-no designs, keep in mind that you will have to approach your results differently (this is especially important for the interpretation of non-stationarities which we talk about in the ADD LINK & SECTION!) In a detection experiment, we typically have two types of trials. In one case a target stimulus is presented, in the other case, no target stimulus is presented. In terms of signal detection theory, these two cases are called "signal+noise" and "noise only". The observer responds to these two cases with either "yes, a signal was present" or "no, only noise was presented". This results in four different outcomes on each trial: hits (the observer correctly reports the presence of a signal), false alarms (the observer reports a signal although "noise only" was presented), misses (the observer reports no signal although a signal was presented), and correct rejections (the observer correctly reports the absence of a signal). These different experimental outcomes are discussed in large detail in standard books on signal detection theory [Green_and_Swets_1966]_. What matters with respect to fitting psychometric functions is that depending on the strategy, both, hit rate as well as the correct response rate might change. So which of these two should be fitted with a psychometric function? There are two general objectives that an optimal observer could follow in a yes-no task. 1. maximize the hit rate while keeping a fixed false alarm rate. In this case, we would like to fit the hit rate with a psychometric function (the false alarm rate is constant anyhow). Thus, if we want to fit the hit rate with a psychometric function, we should check that the observers maintained a more of less fixed false alarm rate. A future release of psignifit will contain more formal tools for this check. 2. maximize the number of correct responses. In this case, we would like to fit the correct response rate with a psychometric function. To check that an observer really uses this strategy, we should check that the false alarm rate decreases with the hit rate. Furthermore, signal detection theory also offers a number of criterion free discriminability parameters, like area under the ROC curve and the famous d' index. However, these indices can not generally be assumed to have binomial variance (or anything similar to that). Therefore, psignifit does not attempt to fit such data. References ---------- .. [Green_and_Swets_1966] Green, DM and Swets, JA (1966): Signal Detection Theory and Psychophysics. New York: Wiley. psignifit3-3.0~beta.20120611.1/doc-src/DIFFERENCES.rst000066400000000000000000000046461176542545200213450ustar00rootroot00000000000000================================= Changes between psignifit 2 and 3 ================================= This page contains some of the changes in conversion between psignifit 2 and 3. As of now, this list is nots complete, while we are in the process of updating this list, please let us know if you find any differences that we have not added so far. Order of Parameters -------------------- In psignifit 2 the different parameters were used in the following oder: alpha beta gamma lambda Psignifit 3 changes the order of the parameters slightly when you are using the classical notation alpha beta lambda gamma This is because you do not have to use gamma in all situations. When you are analysing a 2AFC task you will only have to specify 3 priors. If you are analysing a yes-no task, for example, you will have to specify your 4th prior (for gamma) as well. Specifying the psychometric function ------------------------------------- In psignifit 2 you specify a function from the list - Logistic - cumulative Gaussian - Linear - Gumbel - Weibull This has changed. In psignifit 3 this is split into the sigmoid and the core. Below we have summarized how the old functions map onto the new sigmoid-core framework: ====================== ==================== ===================== psignifit 2 psignifit 3 core psignifit 3 sigmoid ====================== ==================== ===================== Logistic ab logistic cumulative Gaussian ab gauss Linear linear id Gumbel ab gumbel_l Weibull poly exp ====================== ==================== ===================== You should be aware though, that by having the simoid-core framework you have several other combinations that you can choose from. For a description of the different combinations that are possible in psignifit 3 have a look at the section :doc:`PSYCHOMETRICFUNCTIONS`. Specifying priors ------------------ In psignifit 2 you could access the priors independently. For example, if you only wanted to change your lamda prior you only had to specify the lambda prior. In psignifit 3 you have two options, either you leave all priors at their default setting or (even if you just want to change one of them) you make all priors explicit. More information can be found in :doc:`BAYESINTRO`. psignifit3-3.0~beta.20120611.1/doc-src/INFLUENTIAL.rst000066400000000000000000000201121176542545200213640ustar00rootroot00000000000000================================================== Detecting influential observations using psignifit ================================================== When fitting psychometric functions using psignifit, we usually look for a suitable descriptive model of our recorded data. Thus, it is of interest to make sure that the psychometric function actually captures the structure of the whole data set and not of just a single data point. We call a data point that heavily influences the fitted model an *influential observation*. [Wichmann_and_Hill_2001a]_ suggest to detect influential observations using a sort of jackknife procedure. This strategy is at the heart a classical frequentist approach to the detection of influential observations. We will first explain how psignifit implements this procedure and then show how to use a similar procedure to determine influential observations in Bayesian terms. If you haven't generated the example dataset named "data_single_sessions", you can find it :doc:`here `. Influential observations in bootstrapped data ============================================= The procedure to detect influential observations that was suggested by [Wichmann_and_Hill_2001a]_ starts with the regular bootstrap confidence intervals as obtained by the bootstrap procedure. We apply this procedure to the example from the tutorial: If you haven't created the Bootstrap Inference Object and done the sampling, do: >>> B_single_sessions = psi.BootstrapInference ( data_single_sessions, priors=("unconstrained","unconstrained","Beta(2,20)"), sample=True ) >>> B_single_sessions.infl.round(2) array([ 0.34, 0.02, 0.19, 0.13, 0.15, 0.21, 0.43, 0.19, 0.86, 0.15, 0.06, 0.4 , 0.02, 0.13, 0.15]) What do these numbers tell us? Obviously, the last block has a relatively high "influence" here, while the second to last has a lower "influence". In order to detect influential observations, [Wichmann_and_Hill_2001a]_ suggest to generate a number of new data sets :math:`\mathcal{D}_k` by leaving out the :math:`k`-th data block. We fit a psychometric function to each of these new data sets. If the psychometric function fitted to data set :math:`\mathcal{D}_k` is significantly different from the psychometric function fitted to the whole data set, block :math:`k` is considered influential. Thus, for a parameter :math:`\theta_i`, we define for dataset :math:`\mathcal{D}_k` the following quantity If :math:`\theta_i(\mathcal{D}_k) < \theta_i(\mathcal{D})`, where :math:`\mathcal{D}` is the complete dataset .. math:: f_{ik} = \frac{\theta_i(\mathcal{D}) - \theta_i(\mathcal{D}_k)}{\theta_i(\mathcal{D}) - c_{2.5\%}(\theta_i,\mathcal{D})} else .. math:: f_{ik} = \frac{\theta_i(\mathcal{D}_k) - \theta_i(\mathcal{D})}{c_{97.5\%}(\theta_i,\mathcal{D}) - \theta_i(\mathcal{D})} :math:`f_{ik}` is simply the distance between the fit to the whole dataset and the reduced dataset :math:`\mathcal{D}_k`, where the distance has been scaled such that a value of :math:`f_{ik}=1` indicates that the respective parameter in the reduced dataset lies precisely on the border of the confidence interval for parameter i in the full data set. The influence of a data point is then simply defined as the maximum of the :math:`f_{ik}` over all parameters i. Thus, the relatively high influence of 0.95 for the last block is still not really serious. All parameter estimates for reduced data sets are still perfectly within the confidence limits of the full data set. Typcially, we want to visualize the influence of the datapoints to get a quick idea of the influences of the individual data points. To do so, we can use the plotInfluential() method >>> psi.plotInfluential(B_single_sessions) .. image:: BootstrapInfluential.png This will give us two plots. The upper plot simply redraws the psychometric function. In addition to the psychometric function, the data points are shown. To indicate the influence of the strongest data point, this point is marked by a red x and the fit to the reduced data set is also drawn in red. We can observe here the same things as we noted before: The last point is marked as the most influential and if it is excluded from the fit, the psychometric function is not seriously altered. The plot at the bottom displays an overview over the influence of all data points. In addition to the influence values, there is a dotted line to mark the point above which psychometric functions fitted to the reduced data set would significantly differ from the fit to the whole data set. We can note here that it is reasonable that actually the only serious difference between the fit to the whole data set and the fit to the reduced dataset might originate from a difference in the lapse rate. (It is as you can see if you calculate the :math:`f_{ik}` manually). In many cases, the lapse rate is considered a nuissance parameter. Usually what we want to know is more like "is the whole inference influenced by this one data point". It is difficult to derive a riguorous definition for this kind of influence in a frequentist setting, even in a relatively data driven frequentist setting such as the employed bootstrap procedure. However, in a Bayesian setting such an influence measure is readily available. Influential observations in Bayesian Inference ============================================== Instead of performing inference on specific values of parameters, i.e. on point estimates, Bayesian inference treats the whole probability distribution of the parameters after observing the data. This is the reason, why a Bayesian setting is well adapted to the problem of estimating the influence of a single data point on the whole inference. We measure the influence of data block k by comparing the posterior distribution given the whole data set to the posterior distribution of the data set d_k. A suitable measure for the differences between two distributions is the Kullbach-Leibler divergence. High Kullbach-Leibler divergences indicate large differences between the two distributions and thus a strong influence of the respective data block, while low Kullbach-Leibler divergences indicate low influence of the respective data block. Kullbach-Leibler divergence is an information theoretic measure. The exact interpretation of Kullbach-Leibler divergence would be in terms of optimal coding lengths and can be found in introductury texts like [Bishop_2006]_. The influence of data blocks is calculated in terms of Kullbach-Leibler divergence for BayesInference objects. >>> mcmc = BayesInference ( data, priors=('Gauss(0,5)', 'Gamma(1,3)', 'Beta(2,30)') ) >>> mcmc.infl.round(2) array([ 0.42, 0.46, 0.12, 0.15, 0.33, 0.05]) We can see here, that the influence of the last data block is rather minor in terms of the changes to the whole distribution. Thus, Kullbach-Leibler divergence does not necessary give the same results as the bootstrap/jackknife based procedure described above and suggested by [Wichmann_and_Hill_2001a]_. We can visualize the data influence again using >>> plotInfluential(mcmc) .. image:: BayesInfluential.png The plot highly resembles the plot obtained for the bootstrap case. At the top, the fitted psychometric function is plotted along with the data. Again, the most influential data point is marked by a red x and the psychometric function associated with the data set in which this point was excluded is drawn in red. The get an idea of other typical posterior psychometric functions, 20 sample psychometric functions are drawn in this plot in shades of blue. We can immediately see, that the red curve is very similar to the blue different blue shaded curves. The bottom plot displays the Kullbach-Leibler divergences for all blocks. We can observe that the strongest influence on the posterior distribution is from the block with stimulus intensity 2. Note, however, that a Kullbach-Leibler divergence of 0.46 is still very low. References ========== .. [Wichmann_and_Hill_2001a] Wichmann, FA, Hill, NJ (2001a): The psychometric function: I. Fitting, sampling, and goodness of fit. Perc Psychophys, 63(8), 1293-1313. .. [Bishop_2006] Bishop, CM (2006): Pattern Recognition and Machine Learning. New York: Springer. psignifit3-3.0~beta.20120611.1/doc-src/INSTALL_LINUX.rst000066400000000000000000000134461176542545200217130ustar00rootroot00000000000000Linux (Debian/Ubuntu) ===================== This section details how to install the Python version and the command line version of Psignifit from a source download. .. note:: Currently (Jun 2012) we provide experimental support for packages via `Neurodebian `_ for `all current releases of Debian *and* Ubuntu `_. If you have configured the NeuroDebian repositories correctly, the following command will install Psignifit3 for Python:: $ sudo apt-get install python-pypsignifit This option is the easiest route to getting python-psignifit installed. .. note:: If you wish (or need) to install from source, first look at: * `Obtaining the Sources`_ * `Installing Dependencies`_ And then continue to install the desired version: * `Installing Psignifit for Python (python-psignifit)`_ Or: * `Installing the Command Line Interface (cli)`_ .. note:: If you need to build the documentation on your local machine, you may want to look at: * `Building the documentation`_ Obtaining the Sources --------------------- You will want to download the most recent version of psignifit from: ``_. You will want the ``zip`` file, for example ``psignifit_3.0_beta.20120207.1.zip``. Extract the file, and enter the directory by typing:: unzip psignifit_3.0_beta..1.zip cd psignifit_3.0_beta..1 replacing ```` by the date string in the file name. Installing Dependencies ----------------------- If you are using `Debian `_ or `Ubuntu `_ the following packages need to be installed. * ``make`` * ``gcc`` If you additionally wish to install the Python version, you must install: * ``python`` * ``python-dev`` * ``python-numpy (provides python-numpy-dev)`` * ``python-scipy`` * ``python-matplotlib`` * ``python-nose`` * ``swig`` In order to check whether or not you have the packages already installed, type:: aptitude search make gcc python python-dev\ python-numpy python-scipy python-matplotlib python-nose swig Packages that are installed on your machine are listed with a leading ```` In order to install missing packages, type:: sudo aptitude install make gcc python python-dev\ python-numpy python-scipy python-matplotlib python-nose If you are using a different Linux distribution, please refer to the documentation of that system for more information on how to install the required software. Installing Psignifit for Python (python-psignifit) -------------------------------------------------- System-wide installation ~~~~~~~~~~~~~~~~~~~~~~~~ Installing system wide is simple, type:: make install as ``root`` and everything will be installed to the right place. Install into a Custom Location ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you do not have root privileges, you can use the ``DESTDIR`` variable to install into an alternative location, for example the directory ``psignifit-install`` in your home-directory:: mkdir $HOME/psignifit-install make DESTDIR=$HOME/psignifit-install install The first command first creates the directory ``$HOME/psignifit-install`` where ``$HOME`` is automatically replaced by the name of your own home-directory. The second command will install Psignifit into that directory. To use psignifit from, you will also have to set the ``$PYTHONPATH`` and ``$LD_LIBRARY_PATH`` environment variables. Either invoke the Python interpreter from the command line by typing:: PYTHONPATH=psignifit-install/lib/python/ LD_LIBRARY_PATH=psignifit-install/usr/lib/ ipython Or, you set the variables in your ``.bashrc`` (or equivalent) file by adding the line:: export PYTHONPATH=psignifit-install/lib/python/ export LD_LIBRARY_PATH=psignifit-install/usr/lib/ Testing your Installation ~~~~~~~~~~~~~~~~~~~~~~~~~ Open a Python interpreter and type:: import pypsignifit pypsignifit.version If you can see a version string, such as ``snap-2011-10-28-59-gda5adc6`` you installation was probably successful. Installing the Command Line Interface (cli) ------------------------------------------- System-wide installation ~~~~~~~~~~~~~~~~~~~~~~~~ Installing system wide is simple, type:: make cli-install as ``root`` and everything will be installed to the right place. Install into a Custom Location ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you do not have root privileges, you can use the ``DESTDIR`` variable to install into an alternative location, for example the directory ``psignifit-install`` in your home-directory:: mkdir $HOME/psignifit-install make DESTDIR=$HOME/psignifit-install cli-install The first command first creates the directory ``$HOME/psignifit-install`` where ``$HOME`` is automatically replaced by the name of your own home-directory. The second command will install Psignifit into that directory. Additionally you must add the installation directory to you ``$PATH``, by typing:: export PATH=$PATH:$HOME/psignifit-install/usr/bin Or, for a more permanent solution and the above line to ``.bashrc`` (or equivalent) file. Testing your Installation ~~~~~~~~~~~~~~~~~~~~~~~~~ Now, you should be able to call:: psignifit-mcmc -h psignifit-diagnostics -h psignifit-bootstrap -h psignifit-mapestimate -h And see some usage messages after each call. Building the documentation -------------------------- We recommend you to use the documentation we supply on the website. But in case you would like to build it locally, you must first install the following packages: * ``python-sphinx`` * ``doxygen`` And then do:: make doc The documentation can be found in ``doc-html/``. Point your browser at ``doc-html/index.html`` to begin. psignifit3-3.0~beta.20120611.1/doc-src/INSTALL_MAC.rst000066400000000000000000000056241176542545200214130ustar00rootroot00000000000000Mac OSX ======= This is the installation instruction for the Python version, not the Matlab version. The easiest way to use psignifit is to use the `Enthought Python Distribution `_. You will also need gcc. You can check whether your machine already has gcc installed by typing:: >>> which gcc If this gives you the output:: gcc not found you have to download gcc through the Apple Developer Tools. Register for a developer account (you can use your normal apple account for this and it's free, you don't have to join the developer program) which will allow you to access the developer tools where you want to download Xcode (this is a very large file but as far as we know is the only way of downloading gcc) at the time of writing Xcode 3 is free (and has everything you need) so there is no need to pay for Xcode 4. If you are not running Snow Leopard, you will have to find an older version of Xcode such as 3.1. For OSX Lion Xcode 4 is free, too. Further information can be found `here `. You will want to download the most recent version of psignifit from: ``_. You will want the ``zip`` file, for example ``psignifit_3.0_beta.20120207.1.zip``. Extract the file, and enter the directory by typing:: unzip psignifit_3.0_beta..1.zip cd psignifit_3.0_beta..1 replacing ```` by the date string in the file name. Now simply run:: make install Open a Python interpreter and type:: import pypsignifit pypsignifit.version If you can see a version string, such as ``snap-2011-10-28-59-gda5adc6`` you installation was probably successful. Installing the command line interface (optional) ------------------------------------------------ Download psignifit from `sourceforge `_ and extract the compressed file to a folder in your home directory. Navigate into the folder. You have two installation options. By default, the command line interface will be installed to a folder called ``bin`` in your home directory. You can change this behavior by editing the ``Makefile``. At the beginning of the ``Makefile``, you find a line:: CLI_INSTALL=$(HOME)/bin replace this by e.g. ``/usr/bin/`` for system wide installation. Once you have the Makefile in your desired shape type:: make cli-install If the installation directory is not on your system search path, you may have to add it. To do so, add:: export PATH=$PATH:$HOME/bin to your ``.bashrc`` (if you use bash). If you use zsh, the same line should be in your ``.zshrc.local`` file. Now, you should be able to call:: psignifit-mcmc -h psignifit-diagnostics -h psignifit-bootstrap -h psignifit-mapestimate -h And see some usage messages after each call. psignifit3-3.0~beta.20120611.1/doc-src/INSTALL_MATLAB.rst000066400000000000000000000031611176542545200217450ustar00rootroot00000000000000Psignifit for Matlab users ========================== In order to use Psignifit from within Matlab (mpsignifit), you have to install both the Command Line Interface (for your respective operating system) as well as mpsignifit. The installation instructions for the Command Line Interface can be found in: * :doc:`INSTALL_LINUX` * :doc:`INSTALL_MAC` * :doc:`INSTALL_WINDOWS` Obtaining the Sources --------------------- If you have *not already downloaded* the sources during the installation of the Command Line Interface: You will want to download the most recent version of psignifit from: ``_. You will want the ``zip`` file, for example ``psignifit3.0_beta_28-10-2011.zip``. Extract the file, and enter the directory by typing:: unzip psignifit3.0_beta_.zip cd psignifit3.0_beta_ replacing ```` by the date string in the file name. Installing the Matlab Version of Psignifit (mspignifit) ------------------------------------------------------- Within the extracted directory, there is a directory called ``mpsignifit``. Copy this directory to somewhere (e.g. the ``toolbox`` folder in your Matlab installation directory). Then inform Matlab about these files by typing (in Matlab):: addpath where you replace ```` with the path where you copied the ``mpsignifit`` folder. If you now call:: savepath you avoid having to call the above command everytime you start Matlab. You can check that everything went fine by calling:: test_psignifit psignifit3-3.0~beta.20120611.1/doc-src/INSTALL_WINDOWS.rst000066400000000000000000000024771176542545200221500ustar00rootroot00000000000000Windows ======= This is the installation instruction for the Python version, not the Matlab version. The easiest way to use Psignifit is to use the `Enthought Python Distribution `_. In that case, you might want to download Psignifit from `Psignifit3 Downloads `_ Choose one of the files ``psignifit3.0_beta__win32-py2.6.exe``. Executing the installer should install Psignifit3.0 on your system. Installing the command line interface (optional) ------------------------------------------------- Download the file ``psignifit_cli_3_beta_installer_.exe`` from `sourceforge `_ and run it. This is a windows installer and can be installed as usual. Follow the instructions on the screen. At the end of the installation, you will be asked whether you want to add psignifit-cli to your environment path. You should leave this box checked. You will not be able to use psignifit from within Matlab if you uncheck this box! Testing your installation ------------------------- To check whether your installation has been successful and pypsignifit is working properly, you can call:: make test This will call the standard test suite for psignifit. psignifit3-3.0~beta.20120611.1/doc-src/PSYCHOMETRICFUNCTIONS.rst000066400000000000000000000316461176542545200230320ustar00rootroot00000000000000Specifying the shape of the psychometric function ================================================= In this section you can find some more information about the different shapes your psychometric function can take. Which one you go for is mainly dictated by your data but you should also take theoretical aspects into account. A variety of different parametric shapes for psychometric functions have been used. In probit analysis for example, the data are essentially fit by a cumulative gaussian; visual contrast detection data have been reported to be well fit by a weibull distribution function. Fitting visual contrast detection with a weibull function is also theoretically appealing because it corresponds to the quick pooling model ([Graham_1989]_ p. 165). Psignifit supports a relatively large number of psychometric function shapes. These are selected using two keywords: 'sigmoid' and 'core' (this is independent of whether you are using bootstrap or Bayes). To understand the meaning of these two keywords, let us take a look at the model that psignifit tries to fit: .. math:: \Psi ( x; \theta ) = \gamma + (1-\gamma-\lambda) F ( x; \alpha, \beta ), \theta = (\alpha,\beta,\lambda,\gamma). Here, :math:`\theta` is a parameter vector (in forced choice tasks :math:`\gamma` is fixed). The critical term that determines the shape of the psychometric function is :math:`F ( x; \alpha, \beta )`. We decompose :math:`F` in two functions, a scalar function :math:`f:\mathbb{R}\to\mathbb{R}` and a higherdimensional function :math:`g:\mathbb{R}^3\to\mathbb{R}`, such that .. math:: F ( x; \alpha, \beta) := f ( g ( x, \alpha, \beta ) ). In many cases (but not all), :math:`g` will be a simple linear transformation, while :math:`f` will inject a nonlinearity. We will call :math:`f` the 'sigmoid' and :math:`g` the 'core'. .. image:: coreandsigmoid.png The figure illustrates how sigmoid and core are related to each other. A sigmoid does not have any parameters. Thus, fitting a psychometric function with only a sigmoid would always result in the same psychometric function. Two such sigmoids are shown in the left column of the figure: The first is a logistic sigmoid and the second is the cumulative distribution function of the standard exponential distribution. In order to have parameters that describe the shape of the psychometric function, we use a core object. The top row of the figure illustrates two core objects: the first is an abCore that can be requested with the keyword 'ab'. We can see that the output of this core is simply a linear function of :math:`x`. However, the slope and intercept of this linear function depends on the two parameters :math:`a` and :math:`b`. The second plot in the first row illustrates a polyCore, as requested with the keyword 'poly'. Note that the poly core is a nonlinear function of :math:`x`. Again, the two parameters :math:`a` and :math:`b` determine the precise form of the nonlinear function. In order to illustrate the fact that each core object represents a large number of different functions in :math:`x`, four different combinations of :math:`a` and :math:`b` have been plotted. The four plots in the lower right of the figure demonstrate how sigmoids and cores can be combined to allow for a large number of possible psychometric function shapes. For instance, the lower right plot is a combination of the Exponential sigmoid and the poly core. The resulting function is the cumulative distribution function of the weibull distribution. The combination of logistic sigmoid and ab core corresponds to the logistic function that was the default setting in earlier versions of psignifit. The advantage of separating sigmoid and core is that we can now use a different core object, to specify that a function should be fitted on different axes (e.g. logarithmic instead of linear) or in a different parameterization. Also note, that the figure only presents two sigmoids and two cores. This results in two different function families for the psychometric function. Psignifit includes 6 different sigmoids and 5 different cores, resulting in 30 different function families. The following two sections describe the sigmoids and cores in more detail. Then finally, there is a section about common combinations of sigmoids and cores. Valid sigmoids -------------- .. image:: sigmoids.png Six different sigmoids can be selected. All of them correspond to cumulative distributions functions. logistic the logistic function :math:`f(x) = \frac{1}{1+\exp(-x)}`. This sigmoid is symmetric with respect to the point (0,0.5). gauss the cumulative distribution function of the standard normal distribution. This function is symmetric to the point (0,0.5), too. Combined with one of the linear cores, selecting this sigmoid roughly corresponds to probit analysis (although typically, the confidence intervals will differ). cauchy the cumulative distribution of the cauchy distribution (i.e. the t-distribution with 1 degree of freedom). this sigmoid is symmetric with respect to the point (0,0.5). Because the cauchy distribution is a heavy tailed distribution, this sigmoid is less sensitive to lapses an inaccuracies in at extreme x values. Here, :math:`f(x) = \mathrm{atan}(x)/\pi + 0.5`. gumbel_l the cumulative distribution function of the left gumbel. This function is not symmetric: it first increases slowly for negative values and then approaches 1 rather quickly. The left gumbel can be used to define a left weibull if combined with a proper (nonlinear) core. However, also with a linear core, the left gumbel may be a reasonable choice. Here, :math:`f(x) = 1-\exp(-\exp(x))`. gumbel_r the cumulative distribution function of the right gumbel. Actually, this is not the classical gumbel distribution but its reverse, that corresponds to replacing x by -x in the left gumbel, thus :math:`f(x) = exp(-exp(-x)`. exponential the sixth sigmoid is the cumulative distribution function of the exponential distribution. That is :math:`f(x) = 1-exp(-x)` if :math:`x > 0`, and :math:`f(x) = 0` else. This function is clearly not symmetric. Valid cores ----------- .. image:: cores.png There are also six different cores to be selected. The first three are simply linear transformations of the stimulus intensities. The remaining three cores are nonlinear transformations. Typically, these will be needed to define a weibull function. ab the ab-core corresponds to the transformation that transforms an arbitrary normal distribution to the standard normal distribution. It is given by :math:`g(x,a,b) = \frac{x-a}{b}`. For all symmetric sigmoids, this corresponds to the classical psignifit parameterization. mw the mw-core is similar to the ab-core in that it is a linear transformation, too. However, the parameters now have a useful meaning. The first parameter is the "midpoint" of the combination :math:`f\circ g` (i.e. the threshold), while the second parameter is the "width" of the interval over which the psychometric function is rising. What exactly "rising" means in this context is given by an additional parameter such that selection of an mw core is performed using a keyword like 'mw0.1' or mw0.05'. For an 'mw0.1' core, the width parameter is defined as the width of the interval over which the function :math:`f\circ g` rises from 0.1 to 0.9. In general, the width of an 'mwalpha' core is the width of the interval over which the function :math:`f\circ g` rises from :math:`\alpha` to :math:`1-\alpha`. Obviously :math:`w` depends on the sigmoid. However, in general the mw-core has a form :math:`g(x,m,w) = \frac{z_0}{w} (x-m) + z_1`, with :math:`z_0,z_1` derived from the shape of f. linear another linear transformation of the input intensity: here, we simply have :math:`g(x,a,b) = a*x+b`. Although this is the most direct way to implement an (affine) linear transform of the input it is at the same time the least interpretable. Therefore, we recommend to avoid this core. log similar to the linear core but on logarithmic coordinates. This is particularly useful for contrast detection data. The weibull function that is commonly used to fit contrast detection data is obtained if the gumbel_l sigmoid is used with the log core. The log core is given by :math:`g(x,a,b) = a*log(x)+b` weibull the weibull core is at the heart very similar to the log core. However, in contrast to the log core, the weibull core uses more meaningful parameters: the first parameter can be interpreted as some sort of "midpoint" (i.e. threshold) and the second parameter gives the slope at the midpoint of the weibull that results with a gumbel_l sigmoid. The weibull core is :math:`g(x,m,s) = \frac{2}{\log(2)} m s (\log(x)-\log(m))+\log(\log(2))`. poly While the weibull and the log core perform at the heart a fit on a logarithmic axis, this core performs something clearly different: :math:`g(x,a,b) = (x/a)^b`. In combination with a exponential sigmoid, this gives the parameterization used in the classical psignifit version. Combining sigmoids and cores ---------------------------- As already mentioned above, combinations of 'sigmoid' and 'core' determine the shape of the nonlinear function :math:`F( x; \alpha, \beta )`. There are some shapes that are particularly interesting in psychophysical applications. This section explains how to obtain these typical shapes. Logistic function ................. In this case, we combine the 'logistic' sigmoid with one of the linear cores (ab,mw,linear). Depending on the core used, this results in different parameterizations. logistic + ab This is the standard parameterization of the old psignifit version that was based on bootstrapping. :math:`\alpha` can be interpreted as the 75% threshold and :math:`\beta` as a scaling factor that is inversely related to the slope of the psychometric function. Here we obtain: .. math:: F ( x; \alpha, \beta ) = \frac{1}{1+\exp( -\frac{x-\alpha}{\beta} ) }. logistic + mw This parameterization was used in [Kuss_et_al_2005]_ for Bayesian inference on psychometric functions. It reads: .. math:: F ( x; m, w ) = (1+\exp( - \frac{z(\alpha)}{w} (x-m) ) )^{-1}, .. where :math:`z(\alpha) = 2\log(1/\alpha -1)`. This allows :math:`m` to be interpreted as the 75% threshold and :math:`w` as the width of the interval in which :math:`F(x;m,w)` rises from :math:`alpha` to :math:`1-alpha`. A typical choice for :math:`alpha` is 0.1. logistic + linear This parameterization corresponds to the classical parameterization used in the literature about generalized linear models. Here, the psychometric function is modelled as .. math:: F ( x; a, b ) = \frac{1}{1+\exp( - (ax + b) ) }. .. This parameterization does not allow a psychophysically meaningful interpretation of the parameters. Cumulative Gaussian ................... The cumulative gaussian is obtained by combining the gauss sigmoid with one of the linear cores (ab,mw,linear). The parameterizations are precisely the same as for the logistic function with one exception: The scaling factor z(alpha) for the mw parameterization is :math:`z(\alpha) = \Phi^{-1}(1-\alpha)-\Phi^{-1}(\alpha)`, where :math:`\Phi` is the inverse of the the cumulative gaussian. Cumulative Gumbel ................. Also for the cumulative Gumbel sigmoids, the parameterizations are similar to the logistic function. However, the Gumbel distribution is skewed. This implies that the alpha parameter of the ab parameterization can *not* be interpreted as a 75% threshold. For the mw parameterization this is solved in a different way. The lgumbel + mw function is parametrized as follows: .. math:: F ( x; m, w ) = 1-\exp(-\exp( \frac{z(\alpha)-z(1-\alpha)}{w} (x-m) + z(0.5) ) ), where :math:`z(\alpha) = \log(-\log(\alpha))`. Weibull ....... There are a number of ways to parametrize the Weibull function. exponential + poly The classical way is probably .. math:: F ( x; \alpha, \beta ) = 1-\exp ( - (x/\alpha)^\beta ), .. which is implemented using the combination of an exponential-sigmoid and a poly-core. gumbel + weibull The Weibull function is equivalent to a Gumbel sigmoid on logarithmic coordinates. Thus, [Kuss_et_al_2005]_ suggested a parameterization in terms of the 75% threshold m and the slope at the threshold s. This results in the following equivalent form .. math:: F ( x; m, s ) = 1-\exp(-\exp( 2sm/\log(2) (\log(x) - \log(m)) + \log(\log(2)) )). gumbel + log As the Weibull is a Gumbel fitted on log coordinates, a Weibull can also be obtained using a gumbel sigmoid and the log-core, which results in the following parameterization .. math:: F ( x; a, b ) = 1-\exp(-\exp( a\log(x) + b ) ). References ---------- .. [Graham_1989] Graham, NVS (1989): Visual Pattern Analyzers. New York: Oxford University. .. [Kuss_et_al_2005] Kuss, M and J√§kel, F and Wichmann, FA: Bayesian inference for psychometric functions Journal of Vision, 5, 478-492. psignifit3-3.0~beta.20120611.1/doc-src/QUICKSTART.rst000066400000000000000000000147711176542545200213220ustar00rootroot00000000000000============================ A quick start to pypsignifit ============================ This document presents two example analyses of psychometric data using pypsignifit. The :doc:`Bootstrap Tutorial ` explains how to fit a psychometric function using constrained maximum likelihood as described in the papers by [Wichmann_and_Hill_2001a]_, [Wichmann_and_Hill_2001b]_. The :doc:`Bayes Tutorial ` explains how to fit a psychometric function using a Bayesian approach. Parts of the ideas that are implemented here can be found in the paper by [Kuss_et_al_2005]_, the rest was new at the time of this writing. Getting started =============== To get you started with pypsignifit, open a Python interpreter and type the following:: >>> import pypsignifit as psi >>> print psi.__doc__ Psychometric analysis of psychophysics data in Python. Full documentation available at: http://psignifit.sourceforge.net/ Getting Help ------------ All main classes are documented using docstrings. In ipython you can acces them using the '?' operator: >>> import pypsignifit as psi >>> psi.BayesInference? [...] >>> psi.BootstrapInference? [...] Inference Classes ----------------- * ASIRInference * BayesInference * BootstrapInference Diagnostic Classes ------------------ * ConvergenceMCMC * GoodnessOfFit * ParameterPlot * ThresholdPlot Subpackages ----------- * psignidata * psignierrors * psigniplot * psignipriors >>> dir(psi) ['ASIRInference', 'BayesInference', 'BootstrapInference', 'ConvergenceMCMC', 'GoodnessOfFit', 'ParameterPlot', 'ThresholdPlot', '__builtins__', '__doc__', '__docformat__', '__file__', '__name__', '__package__', '__path__', '__test__', '__version__', 'dump_info', 'interface', 'plotInfluential', 'plotMultiplePMFs', 'plotSensitivity', 'psignidata', 'psignierrors', 'psigniplot', 'psignipriors', 'pygibbsit', 'set_seed', 'show', 'subprocess', 'sys', 'version'] With the first command you import the complete functionality of the Python module ``pypsignifit`` to your current workspace. Then, ``print psi.__doc__`` shows you the most important classes and ``dir( )`` provides you with a full list of functions and data types that come with pypsignifit. To get help and documentation about one of these functions, you can use the online Python help by typing ``help( )`` or using the ``?`` operator in ipython. For instance: >>> help ( psi.BayesInference ) [...] >>> psi.BayesInference? [...] will show you the documentation of the ``BayesInference`` object. .. note: Hint: if you would like to copy and paste the examples from this website we recommend using the `IPython `_ interpreter. This has a special magic command ``%cpaste`` which ignores prefixing ``>>>`` from its input. If you want to obtain the version identifier (for inclusion in support requests and bug reports), type: >>> psi.version 'snap-2011-05-17' Experimental scenario and data format ===================================== The data [1]_ that will be used in the following tutorials have been gathered in a 2-alternative forced-choice discrimination experiment. Observers had to discriminate between two simultaneously presented stimuli. One of them was the original (standard) and the other one was a comparison of five different stimulus intensities which were all larger than the standard. Different comparison intensities were presented in different experimental blocks (num_of_block = 5). One block contained 50 trials (num_of_trials = 50), 25 of which contained the original and the other 25 contained one of the five different stimulus intensities. Data for all stimulus intensities were repeatedly gathered in three sessions (num_of_sess = 3). Different experimental designs are described in detail in the section `specifying your experimental design `_. We will now create our example data set for which we want to estimate a psychometric function. The data format should be a numpy array consisting of the following three columns: stimulus intensities, relative/absolute frequencies of correct (or 'yes') responses, number of observations per stimulus intensity: >>> import numpy as np # numpy module required >>> num_of_sess = 3 # experimental parameters >>> num_of_block = 5 >>> num_of_trials = 50 >>> stimulus_intensities = [0.021, 0.079, 0.154, 0.255, 0.30] # stimulus levels >>> percent_correct_1 = [0.5 , 0.84, 0.96, 1., 1.] # percent correct sessions 1-3 >>> percent_correct_2 = [0.64, 0.92, 1. , 0.96, 1.] >>> percent_correct_3 = [0.58, 0.76, 0.98, 1., 1.] >>> num_observations = [num_of_trials] * num_of_block # observations per block >>> data_1 = np.c_[stimulus_intensities, percent_correct_1, num_observations] >>> data_2 = np.c_[stimulus_intensities, percent_correct_2, num_observations] >>> data_3 = np.c_[stimulus_intensities, percent_correct_3, num_observations] >>> data_single_sessions = np.r_[ data_1, data_2, data_3 ] # concatenate data from all sessions Numpy arrays data_1, data_2, data_3 summarize data from each session with each line representing a single experimental block. It is assumed that data are entered in the same sequence in which they have been acquired (often in ascending stimulus intensity as in classical signal detection tasks [Blackwell_1952]_). The last line of the code concatenates data from single sessions into a single numpy array. Again, the information about the sequence of acquisition is coded by the ordering of blocks (rows) and it will be used for the assessment of stability of performance in the :ref:`goodness of fit diagnostics `. Now as you generated your data, it is time to choose whether you want to fit your psychometric function using the Bootstrap approach based on Maximum Likelihood estimation :doc:`Maximum Likelihood Bootstrap ` or to chose the :doc:`Bayesian Inference Approach `. Large scale simulations show, that especially for small datasets (n < 750) confidence intervals estimated via the Bootstrap procedure are often too small, a problem which does not occur in the Bayesian Inference approach. .. [1] Data courtesty of M. Maertens. psignifit3-3.0~beta.20120611.1/doc-src/TODO.rst000066400000000000000000000157561176542545200204010ustar00rootroot00000000000000============== psignifit TODO ============== Python interface (pypsignifit) ------------------------------ - enable fixing the guessing rate to an arbitrary value (? which?) <- This is actually possible by putting a strong prior on the guessing rate... - what is going on with type checking in psigniplot.GoodnessOfFit? - add a dictionary to the data objects to make them know what they are (stimulus intensity, ...) - ROC curves for 1AFC - Blob size reduction for PF - Deviance Bootstrap only one sided test - Error bars on PF. Simply streched bars? (Not sure what is meant) - 68 Confidence Interval - In 3d/4d, we could also integrate the posterior without monte carlo methods. Advantage: We get a somehow analytical formula for the posterior. Disadvantage: Might still take quite long and complicates things like CI estimation. In addition, it would be difficult to estimate the errors originating from the fact that we approximate R by a compact interval. - Plot MCMC diagnostics for all parameters (Not sure what is meant) - Plot the blue line on top of all the white ones, in the diagnostic plot. - Alternative view: Shaded region of the posterior instead of 20 sample PFs - In diagnostic plots, evtl. ad a message on top (what does this mean) - Replace "model correction" with psi(x) or psi(stimulus intensity) (for people with less elaborated statistics background) - Influence for Slope and Influence for Threshold seperately instead of using an aggregation in the Plot for the Influential Observers. - directly use swignifit Python interface (swignifit/psypy) ---------------------------------- - speed! C++ engine ---------- - noninformative Jeffreys Priors - seed the random number generator - Goodness of fit - Unit test with gamma as a free parameter ( works in principle, but only very rough correspondence to psignifit -- should be stricter) - Bugs with different cores -> no convergence, exceptionally high deviance with ok looking fit, ... This is only due to the logCore-Kernel that returns -inf for contrasts of 0 - codes in sigmoids should be constants with ' const unsigned int $VARIBALE' - add 'void' to the clone method calls - In PsiMCList, getdeviance and setdeviance should be getDeviance and setDeviance - Review the documentation for BootstrapList - in PsiSigmoid getcode() should be getCode() - Use pure virtual functions in PsiSigmoid, PsiCore, and PsiPrior, instead of NotImplemetedError - Make proper copy constructors for rng.h instead of relying on implicit ones - When using [] to access elements from the vector class, we need to manually check that the index value is within range. Alternatively we could use the 'at()' method, which is index safe, and throws an 'std::out_of_range' exception. Consider replacing parts of the code that do th manual checking with calls to 'at()'. In this case we would also benefit from the swig exception handling for all STL exceptions. MayBe: - implement fullmodel, nullmodel - Implement alternative SimplexAlgorithm (Numerical Recipes?, gsl-Wrapper-Object?) The current one depends heavily on the initial simplex! * Perform some gradient based steps after simplex optimization (doesn't work good) * alternative: Perform some gradient based steps as a special case of simplex optimization (e.g. particularly good points are moved in the direction of the gradient?) Documentation ------------- - add a delete/uninstall possibility - Makefile/setup.py call for doctests - List _all_ dependencies in terms of packages for debian (python/numpy headers sphinx etc...) - Figure for sigmoid/core philosophy R statistical computing language -------------------------------- - continue R interface -- maybe swig? - Diagnostic plots: Influential, Parameter inspection - MCMC convergence diagnostics and Raftery & Lewis stuff Recently done ------------- + GoodnessOfFit looks better now + math symbols in documentation according to http://matplotlib.sourceforge.net/sampledoc/extensions.html + allow for the gamma=lambda prior + optimize automatic proposal distribution generation + swignifit solves psipy problems + negative Gamma prior + Influential observations and outliers for Bayes [OK] + improved search for starting values [OK] + influential observations marked graded [OK] + posterior predictive Rkd, Rpd [OK] + more meaningfull errors if sample based plot functions are used before sampling [OK] + Inference objects take relative probabilities, too [OK] + nonparametric bootstrap [OK] + Sensitivity analysis [OK] + Add ThresholdPlot to Tutorial [OK] + resampling of chains in BayesInference objects [OK] + Like ParameterPlot but for thresholds [OK] + move numbers further away from the axes. [OK] + warning message for Rpd: "Try other sigmoid!" [OK] + unit tests [OK] + write a number of simulated observers [OK] + complete tutorial [OK] + setup.py [OK] + More Sigmoids (gumbel, weibull, gauss, ...) [OK] at least for now + log-core to allow fitting data on log contrast (i.e. gumbel to weibull) [OK] + unit tests for logCore and linearCore [OK] + linear core ax+b [OK] + Unit test for mwCore [OK] + Outliers and Influential observations [OK] + MCMC implement dlposteri und dnegllikeli [OK] check hybrid MCMC versus MH-MCMC [OK] can we put both MCMC strategies together to have the same base class? [OK] + Documentation [OK] + pointer arithmetic for datasets [OK] + low level Python interface + refactor the python toolbox to have "strict" data objects and plot functions working on top of these [OK] + Convergence diagnostics for MCMC [OK] + posterior intervals and posterior histograms for model parameters [OK] + Using linalg matrix routines in leastfavourable [OK] + Don't use asymptotic values for the correlations. [OK] only for Rkd, Rpd seemed be be based on all blocks (Why?) + copy Core, Sigmoid, ... in psychometric [OK] done for priors too + migrate to boost-python? [OK] decided to use SWIG instead psignifit3-3.0~beta.20120611.1/doc-src/TUTORIAL_BAYES.rst000066400000000000000000000335411176542545200220120ustar00rootroot00000000000000If you haven't generated the example dataset (same as in the Bootstrap section), you can find it :doc:`here ` . Bayesian inference ================== Bayesian inference follows a slightly different logic than conventional frequentist inference. 1. In a Bayesian framework, probability is used to quantify *uncertainty*. As the data are perfectly certain (we measured them), the data are typically considered fixed. In contrast, the parameters are uncertain (we don't know them). Thus, the parameters are modeled as random variables. 2. In a Bayesian framework, it is not common to simply consider a single value of a parameter. Instead, we want to get an idea of the so called 'posterior' distribution. That is the distribution of parameters (and the associated uncertainty about parameters) that is left after having observed the data. The posterior distribution is in most cases relatively easy to write down up to a constant factor. This gives rise to two problems * The posterior distribution is not a proper probability density function. In order to work with it as a probability distribution, we may want to normalize the posterior to have an integral of 1. * We need to summarize the potentially high dimensional posterior distribution. That means we are looking for expectations, quantiles, marginal distributions, ... Bayesian methodology typically starts by quantifying the uncertainty about parameters in a Situation when no data have been observed. The distribution describing this uncertainty is called the *prior* distribution. We set up prior distributions for all parameters in the model (see `Bayesian model fitting and prior selection `_. ) >>> priors = ( 'Gauss(0,5)', 'Gamma(1,3)', 'Beta(2,20)' ) Typically we don't know much about the parameters without having observed the data. Thus, we will usually be looking for relatively flat priors that give equal probability to all parameter values. These priors are *not flat*. They were chosen here to demonstrate the interaction between prior and data in generating the posterior distribution. In accordance with Kuss et al (2005), the default parameterization for psychometric functions for Bayesian inference is the mw-parameterization. That means, the core object of the psychometric function is defined in terms of a 'midpoint' :math:`m` of the sigmoid and the 'width' :math:`w`. As explained above :math:`w` can be interpreted as the length of the interval on which :math:`F` rises from :math:`\alpha` to :math:`1-\alpha`. In the default parameterization, :math:`\alpha=0.1`. The priors we defined above say in words that * We believe that the midpoint of the psychometric function will be somewhere around 0 with a variance of 5. * We believe that the widths of the psychometric function is positive (the Gamma distribution is 0 for negative values) and most probably somewhere around 3. * We feel like having observed 50 trials in which 5% percent of trials were lapses. More information about prior selection can be found in the section _`Bayesian model fitting and prior selection`. We will now set up a data object that allows inference based on the posterior distribution of parameters given the observed data. >>> mcmc_single_sessions = psi.BayesInference ( data_single_sessions, priors=priors, nafc=nafc ) >>> mcmc_single_sessions.estimate array([ 0.0601, 0.1029, 0.0114 ]) >>> mcmc_single_sessions.deviance 17.8015 As we can see, the BayesInference object knows a single number as an estimate for the parameters: :math:`m` seems to be approximately 0.06, :math:`w` seems to be approximately 0.10 and the lapse rate :math:`\lambda` seems to be somewhere around 0.011. These numbers are averages of the posterior distribution. How accurate are they? Can we trust in them? Convergence diagnostics ----------------------- As mentioned above in point 2, the posterior distribution that we can directly write down is only proportional to the 'real' posterior probability distribution. The get an idea about the probability distribution, the BayesInference object uses a technique called markov chain monte carlo (MCMC) to draw samples from the posterior distribution. This simplifies a number of problems: Expectations reduce to simple averages over the samples from the posterior distribution, quantiles of the posterior distribution can be estimated as quantiles of the samples, ... Unfortunately this simplification comes at a price. The sampling procedure steps from one sample to the next, to make sure that eventually the samples are from the posterior distribution. In other words: The first M samples are usually not from the posterior distribution but after that the typically are. Furthermore, it is important to know whether the samples really cover the whole posterior distribution or whether they remain in a restricted area of the posterior distribution. These points are summarized under the term *convergence*. Although the BayesInference object will in most cases try to use sensible parameters for the sampling procedure (using a procedure by [Raftery_and_Lewis_1996]_ to ensure these points, it might be that the chains did not converge. A good strategy to access convergence is to simply use multiple chains and to check whether they eventually sample from the same distribution. Currently, we have one chain of samples: >>> mcmc_single_sessions.nchains 1 We draw two more chains from starting values that are relatively far away from our estimate above. If you are unsure about which values to take, you can use the extension .farstart to generate your starting values: >>> mcmc_single_sessions.farstart array([ 0.0610, 0.0489, 0.0098 ]) >>> mcmc_single_sessions.sample ( start= mcmc_single_sessions.farstart ) >>> mcmc_single_sessions.farstart >>> mcmc_single_sessions.sample ( start= mcmc_single_sessions.farstart ) Now we should have three chains: >>> mcmc_single_sessions.nchains 3 >>> mcmc_single_sessions.Rhat ( 0 ) 1.0028 As we can see, now there are three chains. The last line compares all three chains. This value is the variance between chains divided by the variance within chains as suggested by [Gelman_1996]_. If there are large differences between chains, the variance between chains will be very high and thus :math:`\hat{R}` will be very high, too. If :math:`\hat{R}` is larger than 1.1, this is typically an indication, that the chains did not converge. In the example above, :math:`\hat{R}` is nearly exactly 1 for parameter 0 (which is :math:`m`). Thus, we can be quite sure that the samples of :math:`m` where from the posterior distribution of :math:`m`. To see the same for the other two parameters, :math:`w` and :math:`\lambda`, we can say: >>> mcmc_single_sessions.Rhat ( 1 ) 0.99907409825082549 >>> mcmc_single_sessions.Rhat ( 2 ) 1.021888809239619 Thus, all three chains seem to sample from at least the same distribution of parameters and we conclude that it is very likely that this distribution is indeed the posterior distribution. To get an even better idea, we can also look at a convergence plot: >>> psi.ConvergenceMCMC ( mcmc_single_sessions ) >>> psi.show() .. image:: BayesConvergence1.png This plot consists of three panels. The first simply shows the three chains in three different colors. These chains should look like a "hairy caterpillar" [Wetzels_and_Lee_2010]_ and they should not differ statistically from each others.This seems to be the case. In addition, the plot shows The :math:`\hat{R}` estimate we had already seen above. The second plot in the middle shows a convergence criterion proposed by [Geweke_1992]_: Every chain first Z-standardized to have mean 0 and standard deviation 1. Then the chain is split in 10 segments. If one of these chains deviates more than two standard deviations from the mean, this is a sign that the chain is not stationary. In that case, it might be that the chain does not sample the whole posterior distribution, or does not sample the posterior distribution at all! In the middle segment of our graphic, all chains seem to be reasonably stationary. Thus, there is good reason that these chains really sample from the posterior distribution of parameters. The third plot on the right shows the marginal posterior density estimated from all three chains taken together (blue staircase curve). In addition, the prior density is plotted (green line) and three vertical lines. The solid vertical line marks the posterior mean, the two dotted curves mark the 2.5% and the 97.5% percentiles. This plot gives us a good idea of the posterior distribution of m. There are no strange outliers or discontinuities. For our special case, this is again good evidence that the chains really converged. If we want to select a particular parameter to access convergence, we can use the parameter argument >>> psi.ConvergenceMCMC ( mcmc_single_sessions, parameter=1 ) >>> psi.show() .. image:: BayesConvergence2.png The plot is of course the same for the interpretation. However, in this case the prior is a Gamma(1,3) distribution that is only defined for positive numbers. Again, the chains seem to have converged. However, the data clearly indicate a width that is larger than the widths given by the prior. Goodness of fit --------------- We can now use the same goodness of fit function as for the BootstrapInference object: >>> psi.GoodnessOfFit ( mcmc_single_sessions ) .. image:: BayesGoodnessOfFit.png The structure of the plot is very similar to the goodness of fit plot for the BootstrapInference object. However, the interpretations should now be taken from a Bayesian perspective. The upper left panel shows psychometric functions sampled from the posterior distribution, data, and credibility intervals for three thresholds. Data and credibility intervals have essentially the same interpretation as before. However, this time, we have multiple psychometric functions to describe the data. The dark blue curve (on which the credibility bar are fixed) indicates the curve corresponding to the mean of the psychometric function. The other curves in light blue with different saturation correspond to samples from the posterior distribution. The saturation of the color of the curve is proportional to the likelihood of the psychometric function, that is the part of the posterior distribution that represents the influence of the data. The plot on the lower left shows posterior predictive deviances. For each sample from the posterior distribution, a data set has been generated. The deviance associated with the posterior samples and the observed data set is plotted against the deviance of these simulated data sets for the psychometric functions associated with the samples from the posterior distribution. If the observed data are likely to come from the fitted model, all the points in this plot should lie around the diagonal. If the plots are mainly above the diagonal, the deviances of the observed data are higher than expected for data the originate from the fitted model. It is possible to calculate a "Bayesian p-value" that lies between 0 and 1. Values close to 0 or 1 indicate a bad fit in this case. The two plots of posterior correlation between model prediction and deviance residuals and between block index and deviance residuals are essentially the same as this plot. The only difference is, that in this case it is not the deviance that is calculated for each posterior predictive sample but it is the respective correlation. Interpretation of these plots is analog to the interpretation of the respective plot for the posterior deviance. We can observe that in all cases, the fitted model describes the data reasonably well. For more information about the sensitivity of posterior predictive simulations in the setting of psychometric functions refer to [Fruend_et_al_2011]_. Posterior distributions ----------------------- To get an idea of the posterior parameter distributions, we can again use the function >>> psi.ParameterPlot ( mcmc_single_sessions ) resulting in plots of the estimated posterior density of all model parameters (blue staircase) as well as the priors associated with the respective model parameters (green lines). .. image:: BayesParameters.png The interpretation of these plots is straightforward. Also the ThresholdPlot() function that we applied to the bootstrap data in the first example can be used for Bayesian inference. References ---------- .. [Blackwell_1952] Blackwell, H. R.(1952). Studies of psychophysical methods for measuring visual thresholds. Journal of the Optical Society of America, 42, 606-616. .. [Fruend_et_al_2011] Fründ, I, Haenel, NV, Wichmann, FA (2011). Inference for psychometric functions in the presence of nonstationary behavior. Journal of Vision, in press. .. [Gelman_1996] Gelman A (1996): Inference and monitoring convergence. In [Gilks_et_al_1996]_. .. [Geweke_1992] Geweke, J (1992): Evaluating the accuracy of sampling-based approaches to calculating posterior moments. In Bernardo et al., pp 169-193. .. [Gilks_et_al_1996] Gilks, WR, Richardson, S, Spiegelhalter, DJ (Hrsg,1996): Markov chain Monte Carlo in practice. London: Chapman & Hall. .. [Hill_2001] Hill, NJ (2001): Testing Hypotheses About Psychometric Functions. PhD Thesis, Oxford. .. [Kuss_et_al_2005] Kuss, M, J√§kel, F, Wichmann, FA (2005): Bayesian inference for psychometric functions. J Vis, 5, 478-492. .. [Raftery_and_Lewis_1996] Raftery & Lewis (1996): Implementing MCMC. In [Gilks_et_al_1996]_. .. [Wichmann_and_Hill_2001a] Wichmann, FA, Hill, NJ (2001a): The psychometric function: I. Fitting, sampling, and goodness of fit. Perc Psychophys, 63(8), 1293-1313. .. [Wetzels_and_Lee_2010] Wetzels, R., Lee, M. D., & Wagenmakers, E. (2010): Bayesian inference using WBDev: A tutorial for social scientists. Behavior Research Methods, 42(3), 884-897. .. [Wichmann_and_Hill_2001b] Wichmann, FA, Hill, NJ (2001b): The psychometric function: II. Bootstrap-based confidence intervals and sampling. Perc Psychophys, 63(8), 1314-1329. psignifit3-3.0~beta.20120611.1/doc-src/TUTORIAL_BOOTSTRAP.rst000066400000000000000000000321441176542545200225220ustar00rootroot00000000000000Constrained Maximum Likelihood and Bootstrap Inference ====================================================== We will guide you through a recommended workflow, consisting of: * psychometric function fitting and parameter estimation * assessment of goodness of fit * sensitivity analysis for potential correction of confidence intervals (!! required for smaller datasets) If you got here directly from the Table of Contents you should jump to the `quickstart `_ in order to learn how to organize your data for subsequent fitting: Fitting ------- Constrained maximum likelihood provides a way to estimate parameters from a psychometric function using maximum likelihood estimation while imposing constraints on some of the parameters. Parameters: * :math:`\gamma` is the guessing rate, or the lower asymptote * :math:`\lambda` is the lapsing rate, or the upper asymptote * :math:`a` and :math:`b` are parameters governing the shape of the sigmoid function and can be transformed into threshold and slope * :math:`F` is a sigmoid function. Here we try to fit the data to a logistic function which is the default setting. For more information on different psychometric functions see `specifying the shape of the psychometric function `_. For a 2AFC task, the guessing rate is fixed at :math:`\gamma=0.5`. Thus, our model has three free parameters: :math:`a`, :math:`b`, and :math:`\lambda`. We want to keep :math:`a` and :math:`b` unconstrained. In order to constrain :math:`\lambda` the following considerations might be helpful: * For observers who exhibit a low lapse rate :math:`\lambda` can be approximated by Beta(2,20). * For observers who exhibit a high lapse rate (typically observed in animals) :math:`\lambda` can be approximated by Beta(1.5,12). For more information about prior selection you might read the `Introduction to Bayes Inference `_. >>> nafc = 2 >>> constraints = ( 'unconstrained', 'unconstrained', 'Beta(2,20)' ) Now we can fit the psychometric function by calling: >>> B_single_sessions = psi.BootstrapInference ( data_single_sessions, priors=constraints, nafc=nafc ) Note that all inference functions assume a 2AFC task by default. ``B_single_sessions`` is a Bootstrap Inference Object, >>> print B_single_sessions < BootstrapInference object with 15 blocks and 0 samples > You can access estimates for all parameters by typing: >>> B_single_sessions.estimate array([ 0.06098965, 0.02276219, 0.00983442]) * :math:`a` (threshold) is approximately 0.0610 * :math:`b` (slope) is approximately 0.0228 * :math:`\lambda` (lapse rate) is approximately 0.0097 You can also get the threshold and slope more directly: >>> B_single_sessions.getThres() 0.060989653562317808 >>> B_single_sessions.getSlope() 10.983127014070762 >>> B_single_sessions.getThres(0.5) 0.060989653562317808 >>> B_single_sessions.getThres(0.75) 0.08599647282382343 Please not that ``.getThres()``, ``.getSlope()`` and ``.getCI()`` return by default their respective values at :math:`\Psi(x)=0.5` .. _goodness_of_fit: Goodness of fit assessment -------------------------- How well do these parameters describe the data? The deviance is a measure that describes the goodness of fit for a model, based on the sum of the squares error metric. In our example, the deviance is approximately 17.4212. >>> B_single_sessions.deviance 17.421204439061146 Is this a high or a low value? In order to decide whether or not the fitted function is a proper representation of the data the following bootstrap analysis of the deviance will be performed: 1. 2000 (default) sample data sets are generated using the fitted parameters as generating parameters and assuming that the data are binomially distributed 2. for each of these data sets a new deviance value is calculated relative to our fitted psychometric function 3. the sampled deviance values are sorted in order to determine 95% confidence intervalls (see goodness of fit output) >>> B_single_sessions.sample() >>> print B_single_sessions < BootstrapInference object with 15 blocks and 2000 samples > We see that ``B_single_sessions`` has changed: instead of 0 samples, we now have 2000 parametric bootstrap samples in the object. We can use these samples to assess the goodness of fit: >>> psi.GoodnessOfFit(B_single_sessions) In an interactive session, this should open a window that looks like the following. (In some cases, you may have to type ``psi.show()`` before you see the window). .. image:: gof_single_sessions.png 1. Top left: displays the given data points and the fitted psychometric function. Thresholds and confidence intervals are plotted at three levels (default: 25%, 50% and 75% ). Mind that the y-axis starts at 0.5 (the guess rate in a 2AFC task), therefore the 50% threshold is located at :math:`\Psi(x) = .75`. :math:`D` signifies the deviance value. 2. Bottom left: histogram of bootstrapped deviance values (default = 2000 samples). The 95% confidence limits are indicated by red dotted lines and the actually observed deviance is indicated by the solid red line. If the observed deviance is outside the 95% confidence limits that indicates a bad fit and you will receive a warning message. 3. Top middle: deviance residuals are plotted as a function of the predicted correct response rate of the model (x-axis corresponds to y-axis in panel 1). This plot helps you to detect systematic deviations between the model and the data. The dotted line is the best linear fit that relates deviance residuals to the predicted correct response rate. Rpd gives the numerical value of that correlation. Note that the residuals are scaled to account for differences in the variability of a binomially distributed random variable (e.g. maximum variance at p=0.5). 4. Bottom middle: histogram of bootstrapped correlation coefficients for the correlation between residuals and performance level (same logic applies as in panel 2). Dotted lines denote 95% intervals of the sampled correlation coefficients, the solid line marks the observed correlation between model prediction and deviance residuals. 5. Top right: deviance residuals are plotted as a function of block index i.e. the sequence in which the data were acquired (WARNING: this graph can be properly interpreted only when stimulus intensities were fixed in separate blocks). If the observer was learning, the fitted linear correlation between residuals and block index should be positive. 6. Bottom right: histogram of bootstrapped correlation coefficients for the correlation between deviance residuals and block index (same logic applies as in panel 2 and 4). More information about these parameters can also be found in the paper by [Fruend_et_al_2011]_. Sensitivity Analysis -------------------- As noted by [Wichmann_and_Hill_2001b]_, bootstrap based confidence intervals might be too small. That would mean that a 95% confidence interval would contain the true parameter in less than 95% of the cases. It also means that you are more likely to make a Type I or alpha error, which is that you are more likely to deem two parameters to significantly differ from each other when in fact they don't. We suggest to perform a Sensitivity Analysis on the BootstrapInference object. If necessary, confidence intervals will be expanded following the sensitivity analysis to compensate for the underestimation. If you compare the estimated confidence intervals before and after the analysis you will get an idea how stable your confidence interval estimates are: >>> B_single_sessions.getCI(0.5) array([ 0.04655731, 0.07565797]) >>> plotSensitivity(B) >>> B_single_sessions.getCI(0.5) array([-5.35198839, 0.07944721]) As you see in our example the second call to the getCI() method returns considerably wider confidence intervals. These confidence intervals have been enlarged to provide a more realistic coverage. In addition, the plotSensitivity() function should open a plot window showing something like this: .. image:: sens_single_sessions.png This shows the joint probability distribution of the parameters :math:`a` and :math:`b` of the model. The dark shading indicates the density of this joint distribution as estimated from the bootstrap parameters. The red dot in the center of the cloud of points is the parameter estimate that was determined by maximum likelihood. The red diamonds that are connected by red lines are the points at which an additional bootstrap sample has been drawn. The expanded bootstrap confidence intervals correspond to the widest confidence intervals from all points that are marked in red (i.e. the maximum likelihood estimate and the points marked by the red diamonds). Parameter plots --------------- We can also get a graphical representation of the fitted parameters: >>> psi.ParameterPlot(B_single_sessions) this should open a graph similar to the one depicted below (again, you might have to type psi.show() to open the plot window). Please note that for illustrative purposes this and the following plot are generated with the B_single_sessions object before the Sensitivity Analysis. .. image:: paramplot_single_sessions.png Each of these plots shows the estimated density of one of the model parameters. In addition, the estimated parameter is marked by a solid vertical line and the 95% confidence interval is marked by dotted vertical lines. The confidence interval limits and the estimates are written on top of the graph. In some cases, we may not directly be interested in the parameters of the model. Instead, we ask for "thresholds", that is predefined performance levels of the sigmoid :math:`F`. We can get a plot of such thresholds and the associated confidence intervals using the function >>> psi.ThresholdPlot(B_single_sessions) The plots show estimated densities for thresholds at looks essentially the same as for the ParameterPlot only that this time, the threshold(s) of the model are displayed. .. image:: threshplot_single_sessions.png Reparameterizing the model -------------------------- Psignifit3.0 reformulates the function :math:`F ( x | a,b )` by means of two separate functions :math:`f: R \to R` and :math:`g: R^3 \to R`. We can think of :math:`f` as the nonlinear part of the psychometric function, while :math:`g` is in most cases linear in :math:`x`. Often :math:`g` can be changed without seriously altering the possible model shapes. In pypsignifit :math:`f` is called the 'sigmoid' and :math:`g` is called the 'core'. Using different combinations of sigmoid and core allows a high flexibility of model fitting. For instance, Kuss et al. (2005) used a parameterization in terms of the 'midpoint' :math:`m` of the sigmoid and the 'width' :math:`w`. Here width is defined as the distance :math:`F^{-1} ( 1-\alpha ) - F^{-1} ( \alpha )`. To perform BootstrapInference for this model we can proceed as follows >>> B_single_sessions_mw = psi.BootstrapInference ( data_single_sessions, sample=2000, priors=constraints, core="mw0.1", nafc=nafc ) >>> B_single_sessions_mw.estimate array([ 0.061001 , 0.10004294, 0.00982475]) >>> B_single_sessions_mw.deviance 17.419559245740842 >>> B_single_sessions_mw.getThres() 0.061001001373125807 >>> B_single_sessions_mw.cuts (0.25, 0.5, 0.75) >>> B_single_sessions_mw.getCI(0.5) array([ 1.4842732 , 4.06407509]) Note that this model has the same deviance as the model fitted above. Also the obtained thresholds are the same. However, as the parameterization is different, the actual fitted parameter values are different as can be seen in the following plot: >>> psi.ParameterPlot(B_single_sessions_mw) .. image:: paramplot_single_sessions_mw.png More details on sigmoids and cores and how they can be used to specify models can be found in the section about _`Specification of Models for Psychometric functions` References ---------- .. [Blackwell_1952] Blackwell, H. R.(1952). Studies of psychophysical methods for measuring visual thresholds. Journal of the Optical Society of America, 42, 606-616. .. [Fruend_et_al_2011] Fründ, I, Haenel, NV, Wichmann, FA (2011). Inference for psychometric functions in the presence of nonstationary behavior. Journal of Vision, in press. .. [Gelman_1996] Gelman A (1996): Inference and monitoring convergence. In [Gilks_et_al_1996]_. .. [Geweke_1992] Geweke, J (1992): Evaluating the accuracy of sampling-based approaches to calculating posterior moments. In Bernardo et al., pp 169-193. .. [Gilks_et_al_1996] Gilks, WR, Richardson, S, Spiegelhalter, DJ (Hrsg,1996): Markov chain Monte Carlo in practice. London: Chapman & Hall. .. [Hill_2001] Hill, NJ (2001): Testing Hypotheses About Psychometric Functions. PhD Thesis, Oxford. .. [Kuss_et_al_2005] Kuss, M, Jäkel, F, Wichmann, FA (2005): Bayesian inference for psychometric functions. J Vis, 5, 478-492. .. [Raftery_and_Lewis_1996] Raftery & Lewis (1996): Implementing MCMC. In [Gilks_et_al_1996]_. .. [Wichmann_and_Hill_2001a] Wichmann, FA, Hill, NJ (2001a): The psychometric function: I. Fitting, sampling, and goodness of fit. Perc Psychophys, 63(8), 1293-1313. .. [Wichmann_and_Hill_2001b] Wichmann, FA, Hill, NJ (2001b): The psychometric function: II. Bootstrap-based confidence intervals and sampling. Perc Psychophys, 63(8), 1314-1329. psignifit3-3.0~beta.20120611.1/doc-src/WELCOME.rst000066400000000000000000000163111176542545200207130ustar00rootroot00000000000000======================== Welcome to Psignifit 3.0 ======================== Psignifit is a toolbox that allows the user to fit psychometric functions and to test hypotheses about psychometric data. Compared to the "classical" version of Psignifit, the new package comes with a number of **additional features**: * full Bayesian treatment of psychometric functions including Bayesian model selection and goodness of fit assessment * identification of influential observations * detection of outliers (potentially to be excluded) * new philosophy of defining the shape of the psychometric function allowing for considerably more flexibility in specifiing psychometric function models. The preferred interface for Psignifit 3.0 is now `Python `_, but Matlab is also supported. In contrast to Matlab, Python is a complete programming language that supports virtually all features you might wish for. Python allows you to perform numerical computations as flexible and fast as in Matlab. In addition, Python provides features like object oriented programming and simple creation of graphical user interfaces. Python is easy to learn: even users with no prior programming experience can master Python within weeks. Finally Python is free to use because of its OSI-approved open source license. However, even though Python is similar to **Matlab**, it is not the same. Therefore, we also plan to provide a Matlab version of Psignifit 3.0 with the first official release. However, we will not guarantee support for this toolbox in future releases and we encourage users to use the Python version as this will be up to date. We also noted that a growing number of statistical toolboxes are designed for the statistics environment *R* and there might be users that are interested in using a R version of Psignifit. Similar to the Matlab interface, we provide a basic R version of Psignifit 3.0. Again, we do not guarantee support for this R library. A very rudimentary R library can be found in the folder 'rpsignifit'. Be warned that this is work in progress. We would be glad to find developers that are interested in supporting these non-Python interfaces to the Psignifit engine. .. raw :: html

Important

Psignifit3 is beta software. This means that it is still under heavy development. Occasionally it might not work as expected. This might have two reasons: either, the documentation was ambiguous, or you have discovered a programming error (bug). In any case, you would help us a lot if you write an email to our mailing list (see below) or personally to us. Typically we can solve your problem within hours.

**************** Getting in touch **************** To contact the authors and current maintainers please use: psignifit-users@lists.sourceforge.net This list can be used to ask questions about usage and installation, report bugs, and request new features. If you use Psignifit on a regular basis we recommend you `subscribe `_ to this list. .. note:: Non-member postings are allowed so you do not need to subscribe to the list, to post to it. However, we recommend you mention that you are not subscribed, so that we don't forget to include you in our reply. Discussions about development and Psignifit internals happen on: psignifit-devel@lists.sourceforge.net Subscribe `here `_ if you plan to contribute or simply want to follow development. ************************ Authors and Contributors ************************ Authors & Contributors The Psignifit3 core development team currently consists of: * Ingo Fründ * Valentin Haenel We are very grateful to the following people, who have contributed to Psignifit3: * Simon Barthelmé * Hannah Dold * Sophie Herbst * Jeremy Hill * Marianne Maertens * Manuel Spitschan * Felix Wichmann * Katharina Maria Zeiner * Tiziano Zito ************** How to install ************** The following sections detail the installation instructions for the Python version of **Psignifit (python-psignifit)** and the **Command Line Interface (cli)**: * :doc:`INSTALL_LINUX` * :doc:`INSTALL_MAC` * :doc:`INSTALL_WINDOWS` If you wish to use the **Matlab version of Psignifit (mpsignifit)**, *first* follow the appropriate installation instructions above to install the Command Line Interface. *And then* see :doc:`INSTALL_MATLAB`. The Command Line Interface *is required* for the Matlab version of Psignifit. Installation instructions for the R version of Psignifit (rpsignifit) are going to follow as soon as this toolboxes is ready for use. For additional information about the structure of the code, the build system, version control and an extended list of dependencies see: :doc:`CONTRIBUTING`. *********** How to cite *********** The following reference currently (Jul 2011) provides the most detail on the implementation of Psignifit3: Fründ, I, Haenel, NV, Wichmann, FA. *Inference for psychometric functions in the presence of nonstationary behavior.* Journal of Vision 2011 It is available directly from Journal of Vision: `http://www.journalofvision.org/content/11/6/16 `_ Bibtext entry:: @Article{FrundJOV2011, author = "Fr{\"u}nd, I and Haenel, N V and Wichmann, F A", title = {Inference for psychometric functions in the presence of nonstationary behavior}, abstract = {Measuring sensitivity is at the heart of psychophysics. Often, sensitivity is derived from estimates of the psychometric function. This function relates response probability to stimulus intensity. In estimating these response probabilities, most studies assume stationary observers: Responses are expected to be dependent only on the intensity of a presented stimulus and not on other factors such as stimulus sequence, duration of the experiment, or the responses on previous trials. Unfortunately, a number of factors such as learning, fatigue, or fluctuations in attention and motivation will typically result in violations of this assumption. The severity of these violations is yet unknown. We use Monte Carlo simulations to show that violations of these assumptions can result in underestimation of confidence intervals for parameters of the psychometric function. Even worse, collecting more trials does not eliminate this misestimation of confidence intervals. We present a simple adjustment of the confidence intervals that corrects for the underestimation almost independently of the number of trials and the particular type of violation.}, journal = "Journal of Vision", year = "2011", volume = "11", number = "6", pages = "", month = "May", pmid = "21606382", url = "http://www.journalofvision.org/content/11/6/16" doi = "10.1167/11.6.16" } psignifit3-3.0~beta.20120611.1/doc-src/architecture.dia000066400000000000000000000123701176542545200222300ustar00rootroot00000000000000]s6+\NUߌ 鞪dgSթv&7s%Zݞ P),uNK&_?$4~d^^$a>J㏗o/(0"\OL˻puW=2/HޓyrqW..^`}on\Ezs_&x|~:\ZY^\|V_W\gϱg8)݇+z뇝yj&;chl57ON2)_m;ٝ;dD~,Tr-n.붻,/"N.o~{W,)膷tz쩻1-8o|-YrѽķB:9Kו%>v료UB,/h7u0͋I]o߻'i`X(Y<4D8/,WCiqՙ&E M Nc~mz3atOd4<|*YpR<3q:wAspMd;hw=ܬuz[}u1 lF^Gg#j22e3<uA{sho`~TpJt \Ay=h@{=h{E1J%;DIh l ZjD ԙ;.\%ŭakGs2{^Lx1ń^Lx1ń^Lx1ńJg;׳*@Ip*m^ h<(i+{ع(=z+`|0>OA/3_,0K",ΜW!|@> |@> ۀ|<"*k kQEW. L|=h@{=hڟ6HKoi$l}ΙFL#kT#H5Ǝsк4#grD>QݤH9#pg w&ܙpg w&ܙpg w&ܙh \5TI>*nB$Bۃ`{=lۃ ~OTuOT"(|@> |@A>oȯ*AxEBQ;(g+ E囂o|P>(A|P>(? WWJ?mB|Du? QB"|߃{=|߃'{A U|^>#smY|k~s|p>8zSBe~C!a s0W2 ^CP?%a6_ƀtY9b'B;~ޡ$9ъwCaPj&}M6ڄkM6ڄkM6ڄkS0ig>*I? T #'JcK)X٤tQ\4=J|>|>T?%K^{@W,/{=|߃{=|*{ygkPJ~o&|>|>".^J6C"ݨ{eIQ|>Gq12tx/P=>k^(aTCAPARk^w֖F Ď^m'wi+l;zzr|$v8߱=ksGe^!9$u\s%y^jr aOa?H~.E_Lo#|$%Sae!6:56W2ݭ> RDvHbւkblUjY;bB!ȹ4DtÐ(QAb;Bd lӚd ~e̮?RB .&MVv JWKT6ԋzU/Hv^@rA:P.\\~c߄!)#ˣnE]VxPƒȣF Z-9hY?߶ UmvSnPV4ے0:{ry̭s\%Kɷr˃Tkݪ2rUMP6 o6MSf1mkmvnk.Vێ?'c#?l}w[/TcfrylniWlFZtgxY n:&IKJl0# :~D' y(d-Ck deH!Cҳ Ʌ c[H dfnHBC:|키"* AO O_~tK 4z=zEÐ[8ZփhԠ P{oȹn>wqp8GJ~5L74\V*«no߶ $Lng ,0|`>0&@ɡn!"3QNTtP3tD.+ZUp(w=!Q{&&[ 7|S:籶+=*ehwor 879l>Ua&voMi FU@,"j+E 1##ہ~ty:i76^irE {b@X*V U a@X:IjUħ|MGT w0|`>0`~j~}5J)QlMCYd?Po',1d?1&lۃ`{=lۃO پ*4wPfaLdz`%]Sv@8A |>A |>ĩ HziBu) |Dl`*oW$2P^'\_q tMgi=q5EsQE&yٚL51tMHԒ?}P܅q2yʹ@'S~S1Ym$7 2״?W\f 9=ژ' @k\kf[(2ZpТmyXjY Lzo$zlUд ո?Eo򧷻œo!̩s I I(~3 [JUc>5t 8'9! qNsB8'9!;hwė9%kwkr6^?V|p>8|p9ڢ}yHrv$o|>OmT.CH'$>#j>Rqts[Z{=|߃{=D|J9Q|ϖG6єz#>ˍ(xK<벚(p{=pODq3) RBlAQU%tpali599n|`>0|WTT9Ҹ &jMF[䧂F>Kl l_ $b~;vDQϵ☚ JY[â64wa[IVDm0hyku%pYh>k-HaHu[Wؒ7y:yESb,Xe* VYʂU`,Xe9*KZ $ '>EJ[% 8&ţ<9T"MKsM4 H"B xD C{ӆ$)MabF *"40R"ң@};U2y{of>'k,7Ru1eG)gNX$ĜiT&b2D=#+Ӷo (FC: ݧ1:*)-ZyBׄ4|7BΎBH߯S : !٪ nt4گvr 2 }_2RFG#*ߋ+Kfn6ZAD!KD.^gCR|n|xZ psignifit3-3.0~beta.20120611.1/doc-src/architecture.eps000066400000000000000000010275161176542545200222730ustar00rootroot00000000000000%!PS-Adobe-2.0 EPSF-2.0 %%Title: /home/esc/git-working/psignifit/doc-src/architecture.dia %%Creator: Dia v0.97.1 %%CreationDate: Mon Feb 6 21:31:04 2012 %%For: esc %%Orientation: Portrait %%Magnification: 1.0000 %%BoundingBox: 0 0 1622 1235 %%BeginSetup %%EndSetup %%EndComments %%BeginProlog [ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def /cp {closepath} bind def /c {curveto} bind def /f {fill} bind def /a {arc} bind def /ef {eofill} bind def /ex {exch} bind def /gr {grestore} bind def /gs {gsave} bind def /sa {save} bind def /rs {restore} bind def /l {lineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def /s {stroke} bind def /sh {show} bind def /slc {setlinecap} bind def /slj {setlinejoin} bind def /slw {setlinewidth} bind def /srgb {setrgbcolor} bind def /rot {rotate} bind def /sc {scale} bind def /sd {setdash} bind def /ff {findfont} bind def /sf {setfont} bind def /scf {scalefont} bind def /sw {stringwidth pop} bind def /tr {translate} bind def /ellipsedict 8 dict def ellipsedict /mtrx matrix put /ellipse { ellipsedict begin /endangle exch def /startangle exch def /yrad exch def /xrad exch def /y exch def /x exch def /savematrix mtrx currentmatrix def x y tr xrad yrad sc 0 0 1 startangle endangle arc savematrix setmatrix end } def /mergeprocs { dup length 3 -1 roll dup length dup 5 1 roll 3 -1 roll add array cvx dup 3 -1 roll 0 exch putinterval dup 4 2 roll putinterval } bind def /dpi_x 300 def /dpi_y 300 def /conicto { /to_y exch def /to_x exch def /conic_cntrl_y exch def /conic_cntrl_x exch def currentpoint /p0_y exch def /p0_x exch def /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def /p2_x p1_x to_x p0_x sub 1 3 div mul add def /p2_y p1_y to_y p0_y sub 1 3 div mul add def p1_x p1_y p2_x p2_y to_x to_y curveto } bind def /start_ol { gsave 1.1 dpi_x div dup scale} bind def /end_ol { closepath fill grestore } bind def 28.346000 -28.346000 scale -8.900000 -35.450000 translate %%EndProlog 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 24.000000 19.000000 m 24.000000 24.000000 l 47.000000 24.000000 l 47.000000 19.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 19.000000 m 24.000000 24.000000 l 47.000000 24.000000 l 47.000000 19.000000 l cp s 1.000000 1.000000 1.000000 srgb n 24.000000 18.000000 m 24.000000 19.000000 l 26.125000 19.000000 l 26.125000 18.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 18.000000 m 24.000000 19.000000 l 26.125000 19.000000 l 26.125000 18.000000 l cp s gsave 24.100000 18.700000 translate 0.035278 -0.035278 scale start_ol 960 3136 moveto 960 1792 lineto 1496 1792 lineto 1817 1792 1996 1969 conicto 2176 2147 2176 2465 conicto 2176 2784 1997 2960 conicto 1819 3136 1496 3136 conicto 960 3136 lineto 448 3520 moveto 1496 3520 lineto 2083 3520 2385 3251 conicto 2688 2983 2688 2465 conicto 2688 1943 2386 1675 conicto 2085 1408 1496 1408 conicto 960 1408 lineto 960 0 lineto 448 0 lineto 448 3520 lineto end_ol grestore gsave 24.484638 18.700000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 24.869276 18.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 25.253914 18.700000 translate 0.035278 -0.035278 scale start_ol 1664 2752 moveto 1664 1728 lineto 2688 1728 lineto 2688 1344 lineto 1664 1344 lineto 1664 320 lineto 1280 320 lineto 1280 1344 lineto 256 1344 lineto 256 1728 lineto 1280 1728 lineto 1280 2752 lineto 1664 2752 lineto end_ol grestore gsave 25.638552 18.700000 translate 0.035278 -0.035278 scale start_ol 1664 2752 moveto 1664 1728 lineto 2688 1728 lineto 2688 1344 lineto 1664 1344 lineto 1664 320 lineto 1280 320 lineto 1280 1344 lineto 256 1344 lineto 256 1728 lineto 1280 1728 lineto 1280 2752 lineto 1664 2752 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 40.000000 20.000000 m 40.000000 21.400000 l 44.137500 21.400000 l 44.137500 20.000000 l f 0.000000 0.000000 0.000000 srgb n 40.000000 20.000000 m 40.000000 21.400000 l 44.137500 21.400000 l 44.137500 20.000000 l cp s gsave 40.250000 20.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1518 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 40.819466 20.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 41.361457 20.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 41.900950 20.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 42.472913 20.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 43.014904 20.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 43.409530 20.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 40.000000 22.000000 m 40.000000 23.400000 l 43.982500 23.400000 l 43.982500 22.000000 l f 0.000000 0.000000 0.000000 srgb n 40.000000 22.000000 m 40.000000 23.400000 l 43.982500 23.400000 l 43.982500 22.000000 l cp s gsave 40.250000 22.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 40.724555 22.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 41.274037 22.950000 translate 0.035278 -0.035278 scale start_ol 512 1320 moveto 512 3264 lineto 1536 3264 lineto 1536 2946 lineto 1536 2687 1533 2296 conicto 1530 1905 1530 1775 conicto 1530 1391 1552 1221 conicto 1574 1052 1627 976 conicto 1696 876 1807 822 conicto 1919 768 2063 768 conicto 2415 768 2615 1012 conicto 2816 1257 2816 1692 conicto 2816 3264 lineto 3840 3264 lineto 3840 0 lineto 2816 0 lineto 2816 512 lineto 2573 216 2301 76 conicto 2030 -64 1703 -64 conicto 1121 -64 816 290 conicto 512 644 512 1320 conicto end_ol grestore gsave 41.843503 22.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 42.238129 22.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 42.712684 22.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 43.254674 22.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 24.000000 7.000000 m 24.000000 16.000000 l 37.000000 16.000000 l 37.000000 7.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 7.000000 m 24.000000 16.000000 l 37.000000 16.000000 l 37.000000 7.000000 l cp s 1.000000 1.000000 1.000000 srgb n 24.000000 6.000000 m 24.000000 7.000000 l 27.665000 7.000000 l 27.665000 6.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 6.000000 m 24.000000 7.000000 l 27.665000 7.000000 l 27.665000 6.000000 l cp s gsave 24.100000 6.700000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 24.484638 6.700000 translate 0.035278 -0.035278 scale start_ol 0 2688 moveto 435 2688 lineto 900 521 lineto 1282 1920 lineto 1657 1920 lineto 2044 521 lineto 2509 2688 lineto 2944 2688 lineto 2318 0 lineto 1898 0 lineto 1471 1487 lineto 1046 0 lineto 626 0 lineto 0 2688 lineto end_ol grestore gsave 24.869276 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 25.253914 6.700000 translate 0.035278 -0.035278 scale start_ol 2176 1378 moveto 2176 1864 2000 2116 conicto 1825 2368 1489 2368 conicto 1138 2368 953 2116 conicto 768 1864 768 1378 conicto 768 893 954 638 conicto 1140 384 1494 384 conicto 1825 384 2000 639 conicto 2176 895 2176 1378 conicto 2624 201 moveto 2624 -402 2326 -713 conicto 2029 -1024 1452 -1024 conicto 1262 -1024 1054 -991 conicto 847 -959 640 -896 conicto 640 -448 lineto 887 -546 1088 -593 conicto 1290 -640 1458 -640 conicto 1834 -640 2005 -455 conicto 2176 -270 2176 133 conicto 2176 153 lineto 2176 461 lineto 2065 228 1873 114 conicto 1681 0 1406 0 conicto 911 0 615 374 conicto 320 748 320 1375 conicto 320 2004 615 2378 conicto 911 2752 1406 2752 conicto 1679 2752 1868 2646 conicto 2057 2541 2176 2321 conicto 2176 2688 lineto 2624 2688 lineto 2624 201 lineto end_ol grestore gsave 25.638552 6.700000 translate 0.035278 -0.035278 scale start_ol 2496 1665 moveto 2496 0 lineto 2048 0 lineto 2048 1665 lineto 2048 2027 1922 2197 conicto 1797 2368 1530 2368 conicto 1225 2368 1060 2148 conicto 896 1929 896 1519 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2284 lineto 1013 2514 1213 2633 conicto 1413 2752 1686 2752 conicto 2094 2752 2295 2482 conicto 2496 2212 2496 1665 conicto end_ol grestore gsave 26.023190 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 26.407828 6.700000 translate 0.035278 -0.035278 scale start_ol 2496 3712 moveto 2496 3328 lineto 2010 3328 lineto 1779 3328 1689 3236 conicto 1600 3145 1600 2912 conicto 1600 2688 lineto 2496 2688 lineto 2496 2368 lineto 1600 2368 lineto 1600 0 lineto 1152 0 lineto 1152 2368 lineto 448 2368 lineto 448 2688 lineto 1152 2688 lineto 1152 2864 lineto 1152 3300 1353 3506 conicto 1555 3712 1982 3712 conicto 2496 3712 lineto end_ol grestore gsave 26.792466 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 27.177104 6.700000 translate 0.035278 -0.035278 scale start_ol 1472 3456 moveto 1472 2688 lineto 2496 2688 lineto 2496 2368 lineto 1472 2368 lineto 1472 868 lineto 1472 562 1587 441 conicto 1702 320 1989 320 conicto 2496 320 lineto 2496 0 lineto 1945 0 lineto 1439 0 1231 195 conicto 1024 390 1024 868 conicto 1024 2368 lineto 320 2368 lineto 320 2688 lineto 1024 2688 lineto 1024 3456 lineto 1472 3456 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 8.000000 m 25.000000 9.400000 l 35.295000 9.400000 l 35.295000 8.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 8.000000 m 25.000000 9.400000 l 35.295000 9.400000 l 35.295000 8.000000 l cp s gsave 25.250000 8.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 25.524737 8.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 26.094203 8.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 26.476344 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 27.018334 8.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 27.412960 8.950000 translate 0.035278 -0.035278 scale start_ol 2624 4544 moveto 2624 3840 lineto 2062 3840 lineto 1840 3840 1752 3761 conicto 1664 3683 1664 3488 conicto 1664 3264 lineto 2560 3264 lineto 2560 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3488 lineto 640 4028 933 4286 conicto 1226 4544 1840 4544 conicto 2624 4544 lineto end_ol grestore gsave 27.760135 8.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 28.299629 8.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 28.774184 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 29.316175 8.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 29.715795 8.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 30.547512 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 31.089503 8.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 31.471644 8.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1518 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 32.041110 8.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 32.590592 8.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 33.162555 8.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 33.637110 8.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 33.941819 8.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 34.513782 8.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 12.000000 m 25.000000 13.400000 l 32.807500 13.400000 l 32.807500 12.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 12.000000 m 25.000000 13.400000 l 32.807500 13.400000 l 32.807500 12.000000 l cp s gsave 25.250000 12.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 25.724555 12.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 26.463859 12.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.738595 12.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.310558 12.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 27.880024 12.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 28.154761 12.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 28.746700 12.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 29.128841 12.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 29.528461 12.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 29.923087 12.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 30.462581 12.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 31.151936 12.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 31.456645 12.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 32.028608 12.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 14.000000 m 25.000000 15.400000 l 33.137500 15.400000 l 33.137500 14.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 14.000000 m 25.000000 15.400000 l 33.137500 15.400000 l 33.137500 14.000000 l cp s gsave 25.250000 14.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 25.649620 14.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 26.124175 14.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 26.863479 14.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.138215 14.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.710179 14.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 28.279645 14.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 28.554381 14.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 29.146320 14.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 29.528461 14.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 29.928081 14.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 30.322707 14.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 30.862201 14.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 31.551556 14.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 31.856265 14.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 32.330821 14.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 10.000000 m 25.000000 11.400000 l 29.510000 11.400000 l 29.510000 10.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 10.000000 m 25.000000 11.400000 l 29.510000 11.400000 l 29.510000 10.000000 l cp s gsave 25.250000 10.950000 translate 0.035278 -0.035278 scale start_ol 512 1320 moveto 512 3264 lineto 1536 3264 lineto 1536 2946 lineto 1536 2687 1533 2296 conicto 1530 1905 1530 1775 conicto 1530 1391 1552 1221 conicto 1574 1052 1627 976 conicto 1696 876 1807 822 conicto 1919 768 2063 768 conicto 2415 768 2615 1012 conicto 2816 1257 2816 1692 conicto 2816 3264 lineto 3840 3264 lineto 3840 0 lineto 2816 0 lineto 2816 512 lineto 2573 216 2301 76 conicto 2030 -64 1703 -64 conicto 1121 -64 816 290 conicto 512 644 512 1320 conicto end_ol grestore gsave 25.819466 10.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 26.201607 10.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.476344 10.950000 translate 0.035278 -0.035278 scale start_ol 512 4544 moveto 1536 4544 lineto 1536 0 lineto 512 0 lineto 512 4544 lineto end_ol grestore gsave 26.751080 10.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.025817 10.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 27.407958 10.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore gsave 27.857535 10.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 28.162244 10.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 28.734207 10.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 44.000000 7.000000 m 44.000000 17.000000 l 66.000000 17.000000 l 66.000000 7.000000 l f 0.000000 0.000000 0.000000 srgb n 44.000000 7.000000 m 44.000000 17.000000 l 66.000000 17.000000 l 66.000000 7.000000 l cp s 1.000000 1.000000 1.000000 srgb n 44.000000 6.000000 m 44.000000 7.000000 l 50.745000 7.000000 l 50.745000 6.000000 l f 0.000000 0.000000 0.000000 srgb n 44.000000 6.000000 m 44.000000 7.000000 l 50.745000 7.000000 l 50.745000 6.000000 l cp s gsave 44.100000 6.700000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 44.484638 6.700000 translate 0.035278 -0.035278 scale start_ol 0 2688 moveto 435 2688 lineto 900 521 lineto 1282 1920 lineto 1657 1920 lineto 2044 521 lineto 2509 2688 lineto 2944 2688 lineto 2318 0 lineto 1898 0 lineto 1471 1487 lineto 1046 0 lineto 626 0 lineto 0 2688 lineto end_ol grestore gsave 44.869276 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 45.253914 6.700000 translate 0.035278 -0.035278 scale start_ol 2176 1378 moveto 2176 1864 2000 2116 conicto 1825 2368 1489 2368 conicto 1138 2368 953 2116 conicto 768 1864 768 1378 conicto 768 893 954 638 conicto 1140 384 1494 384 conicto 1825 384 2000 639 conicto 2176 895 2176 1378 conicto 2624 201 moveto 2624 -402 2326 -713 conicto 2029 -1024 1452 -1024 conicto 1262 -1024 1054 -991 conicto 847 -959 640 -896 conicto 640 -448 lineto 887 -546 1088 -593 conicto 1290 -640 1458 -640 conicto 1834 -640 2005 -455 conicto 2176 -270 2176 133 conicto 2176 153 lineto 2176 461 lineto 2065 228 1873 114 conicto 1681 0 1406 0 conicto 911 0 615 374 conicto 320 748 320 1375 conicto 320 2004 615 2378 conicto 911 2752 1406 2752 conicto 1679 2752 1868 2646 conicto 2057 2541 2176 2321 conicto 2176 2688 lineto 2624 2688 lineto 2624 201 lineto end_ol grestore gsave 45.638552 6.700000 translate 0.035278 -0.035278 scale start_ol 2496 1665 moveto 2496 0 lineto 2048 0 lineto 2048 1665 lineto 2048 2027 1922 2197 conicto 1797 2368 1530 2368 conicto 1225 2368 1060 2148 conicto 896 1929 896 1519 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2284 lineto 1013 2514 1213 2633 conicto 1413 2752 1686 2752 conicto 2094 2752 2295 2482 conicto 2496 2212 2496 1665 conicto end_ol grestore gsave 46.023190 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 46.407828 6.700000 translate 0.035278 -0.035278 scale start_ol 2496 3712 moveto 2496 3328 lineto 2010 3328 lineto 1779 3328 1689 3236 conicto 1600 3145 1600 2912 conicto 1600 2688 lineto 2496 2688 lineto 2496 2368 lineto 1600 2368 lineto 1600 0 lineto 1152 0 lineto 1152 2368 lineto 448 2368 lineto 448 2688 lineto 1152 2688 lineto 1152 2864 lineto 1152 3300 1353 3506 conicto 1555 3712 1982 3712 conicto 2496 3712 lineto end_ol grestore gsave 46.792466 6.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 47.177104 6.700000 translate 0.035278 -0.035278 scale start_ol 1472 3456 moveto 1472 2688 lineto 2496 2688 lineto 2496 2368 lineto 1472 2368 lineto 1472 868 lineto 1472 562 1587 441 conicto 1702 320 1989 320 conicto 2496 320 lineto 2496 0 lineto 1945 0 lineto 1439 0 1231 195 conicto 1024 390 1024 868 conicto 1024 2368 lineto 320 2368 lineto 320 2688 lineto 1024 2688 lineto 1024 3456 lineto 1472 3456 lineto end_ol grestore gsave 47.561742 6.700000 translate 0.035278 -0.035278 scale start_ol end_ol grestore gsave 47.946380 6.700000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 48.331018 6.700000 translate 0.035278 -0.035278 scale start_ol 1471 2368 moveto 1124 2368 946 2109 conicto 768 1851 768 1344 conicto 768 839 946 579 conicto 1124 320 1471 320 conicto 1820 320 1998 579 conicto 2176 839 2176 1344 conicto 2176 1851 1998 2109 conicto 1820 2368 1471 2368 conicto 1471 2752 moveto 2031 2752 2327 2390 conicto 2624 2029 2624 1344 conicto 2624 657 2328 296 conicto 2033 -64 1471 -64 conicto 911 -64 615 296 conicto 320 657 320 1344 conicto 320 2029 615 2390 conicto 911 2752 1471 2752 conicto end_ol grestore gsave 48.715656 6.700000 translate 0.035278 -0.035278 scale start_ol 448 1023 moveto 448 2688 lineto 896 2688 lineto 896 1023 lineto 896 661 1022 490 conicto 1149 320 1414 320 conicto 1722 320 1885 539 conicto 2048 759 2048 1169 conicto 2048 2688 lineto 2496 2688 lineto 2496 0 lineto 2048 0 lineto 2048 409 lineto 1931 176 1729 56 conicto 1528 -64 1259 -64 conicto 849 -64 648 206 conicto 448 476 448 1023 conicto end_ol grestore gsave 49.100294 6.700000 translate 0.035278 -0.035278 scale start_ol 2688 2112 moveto 2551 2246 2410 2307 conicto 2269 2368 2100 2368 conicto 1701 2368 1490 2099 conicto 1280 1831 1280 1323 conicto 1280 0 lineto 832 0 lineto 832 2688 lineto 1280 2688 lineto 1280 2147 lineto 1387 2440 1608 2596 conicto 1829 2752 2132 2752 conicto 2290 2752 2426 2705 conicto 2563 2659 2688 2560 conicto 2688 2112 lineto end_ol grestore gsave 49.484932 6.700000 translate 0.035278 -0.035278 scale start_ol 2496 128 moveto 2321 32 2135 -16 conicto 1950 -64 1756 -64 conicto 1141 -64 794 309 conicto 448 683 448 1344 conicto 448 2005 794 2378 conicto 1141 2752 1756 2752 conicto 1947 2752 2129 2689 conicto 2312 2627 2496 2496 conicto 2496 2048 lineto 2322 2217 2147 2292 conicto 1972 2368 1751 2368 conicto 1339 2368 1117 2102 conicto 896 1837 896 1344 conicto 896 853 1118 586 conicto 1341 320 1751 320 conicto 1979 320 2160 382 conicto 2341 445 2496 576 conicto 2496 128 lineto end_ol grestore gsave 49.869570 6.700000 translate 0.035278 -0.035278 scale start_ol 2688 1480 moveto 2688 1280 lineto 752 1280 lineto 752 1265 lineto 752 813 981 566 conicto 1210 320 1627 320 conicto 1838 320 2068 383 conicto 2299 447 2560 576 conicto 2560 128 lineto 2311 32 2080 -16 conicto 1850 -64 1634 -64 conicto 1016 -64 668 310 conicto 320 685 320 1344 conicto 320 1986 665 2369 conicto 1010 2752 1584 2752 conicto 2097 2752 2392 2411 conicto 2688 2070 2688 1480 conicto 2240 1600 moveto 2230 1976 2054 2172 conicto 1878 2368 1548 2368 conicto 1225 2368 1016 2164 conicto 807 1960 768 1597 conicto 2240 1600 lineto end_ol grestore gsave 50.254208 6.700000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 45.000000 8.000000 m 45.000000 9.400000 l 55.295000 9.400000 l 55.295000 8.000000 l f 0.000000 0.000000 0.000000 srgb n 45.000000 8.000000 m 45.000000 9.400000 l 55.295000 9.400000 l 55.295000 8.000000 l cp s gsave 45.250000 8.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 45.524737 8.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 46.094203 8.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 46.476344 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 47.018334 8.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 47.412960 8.950000 translate 0.035278 -0.035278 scale start_ol 2624 4544 moveto 2624 3840 lineto 2062 3840 lineto 1840 3840 1752 3761 conicto 1664 3683 1664 3488 conicto 1664 3264 lineto 2560 3264 lineto 2560 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3488 lineto 640 4028 933 4286 conicto 1226 4544 1840 4544 conicto 2624 4544 lineto end_ol grestore gsave 47.760135 8.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 48.299629 8.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 48.774184 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 49.316175 8.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 49.715795 8.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 50.547512 8.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 51.089503 8.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 51.471644 8.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1518 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 52.041110 8.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 52.590592 8.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 53.162555 8.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 53.637110 8.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 53.941819 8.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 54.513782 8.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 45.000000 10.000000 m 45.000000 11.400000 l 49.510000 11.400000 l 49.510000 10.000000 l f 0.000000 0.000000 0.000000 srgb n 45.000000 10.000000 m 45.000000 11.400000 l 49.510000 11.400000 l 49.510000 10.000000 l cp s gsave 45.250000 10.950000 translate 0.035278 -0.035278 scale start_ol 512 1320 moveto 512 3264 lineto 1536 3264 lineto 1536 2946 lineto 1536 2687 1533 2296 conicto 1530 1905 1530 1775 conicto 1530 1391 1552 1221 conicto 1574 1052 1627 976 conicto 1696 876 1807 822 conicto 1919 768 2063 768 conicto 2415 768 2615 1012 conicto 2816 1257 2816 1692 conicto 2816 3264 lineto 3840 3264 lineto 3840 0 lineto 2816 0 lineto 2816 512 lineto 2573 216 2301 76 conicto 2030 -64 1703 -64 conicto 1121 -64 816 290 conicto 512 644 512 1320 conicto end_ol grestore gsave 45.819466 10.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 46.201607 10.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 46.476344 10.950000 translate 0.035278 -0.035278 scale start_ol 512 4544 moveto 1536 4544 lineto 1536 0 lineto 512 0 lineto 512 4544 lineto end_ol grestore gsave 46.751080 10.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 47.025817 10.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 47.407958 10.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore gsave 47.857535 10.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 48.162244 10.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 48.734207 10.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 45.000000 12.000000 m 45.000000 13.400000 l 52.807500 13.400000 l 52.807500 12.000000 l f 0.000000 0.000000 0.000000 srgb n 45.000000 12.000000 m 45.000000 13.400000 l 52.807500 13.400000 l 52.807500 12.000000 l cp s gsave 45.250000 12.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 45.724555 12.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 46.463859 12.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 46.738595 12.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 47.310558 12.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 47.880024 12.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 48.154761 12.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 48.746700 12.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 49.128841 12.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 49.528461 12.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 49.923087 12.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 50.462581 12.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 51.151936 12.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 51.456645 12.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 52.028608 12.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 45.000000 14.000000 m 45.000000 15.400000 l 53.217500 15.400000 l 53.217500 14.000000 l f 0.000000 0.000000 0.000000 srgb n 45.000000 14.000000 m 45.000000 15.400000 l 53.217500 15.400000 l 53.217500 14.000000 l cp s gsave 45.250000 14.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 45.724555 14.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 46.463859 14.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 46.738595 14.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 47.310558 14.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 47.880024 14.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 48.154761 14.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 48.746700 14.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 49.128841 14.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 49.528461 14.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 49.923087 14.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 50.462581 14.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 51.151936 14.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 51.456645 14.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 51.931200 14.950000 translate 0.035278 -0.035278 scale start_ol 1316 1670 moveto 128 3264 lineto 1243 3264 lineto 1916 2296 lineto 2598 3264 lineto 3712 3264 lineto 2524 1676 lineto 3776 0 lineto 2659 0 lineto 1916 1032 lineto 1182 0 lineto 64 0 lineto 1316 1670 lineto end_ol grestore gsave 52.445716 14.950000 translate 0.035278 -0.035278 scale start_ol 1316 1670 moveto 128 3264 lineto 1243 3264 lineto 1916 2296 lineto 2598 3264 lineto 3712 3264 lineto 2524 1676 lineto 3776 0 lineto 2659 0 lineto 1916 1032 lineto 1182 0 lineto 64 0 lineto 1316 1670 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 58.000000 8.000000 m 58.000000 9.400000 l 64.987500 9.400000 l 64.987500 8.000000 l f 0.000000 0.000000 0.000000 srgb n 58.000000 8.000000 m 58.000000 9.400000 l 64.987500 9.400000 l 64.987500 8.000000 l cp s gsave 58.250000 8.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 58.724555 8.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 59.463859 8.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 59.738595 8.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 60.310558 8.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 60.880024 8.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 61.154761 8.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 61.746700 8.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 62.128841 8.950000 translate 0.035278 -0.035278 scale start_ol 3008 -832 moveto 3008 -1408 lineto 0 -1408 lineto 0 -832 lineto 3008 -832 lineto end_ol grestore gsave 62.528461 8.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 62.923087 8.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 63.462581 8.950000 translate 0.035278 -0.035278 scale start_ol 192 3264 moveto 1211 3264 lineto 1761 1014 lineto 2314 3264 lineto 3190 3264 lineto 3740 1037 lineto 4293 3264 lineto 5312 3264 lineto 4448 0 lineto 3304 0 lineto 2751 2244 lineto 2200 0 lineto 1056 0 lineto 192 3264 lineto end_ol grestore gsave 64.151936 8.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 64.456645 8.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 56.000000 13.000000 m 56.000000 14.400000 l 61.242500 14.400000 l 61.242500 13.000000 l f 0.000000 0.000000 0.000000 srgb n 56.000000 13.000000 m 56.000000 14.400000 l 61.242500 14.400000 l 61.242500 13.000000 l cp s gsave 56.250000 13.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 56.919371 13.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 57.588742 13.950000 translate 0.035278 -0.035278 scale start_ol 3394 3200 moveto 3238 2368 lineto 2932 2525 2628 2606 conicto 2324 2688 2053 2688 conicto 1744 2688 1576 2604 conicto 1408 2521 1408 2367 conicto 1408 2276 1499 2221 conicto 1591 2167 1861 2106 conicto 2047 2071 lineto 2687 1937 2943 1726 conicto 3200 1515 3200 1140 conicto 3200 573 2747 254 conicto 2294 -64 1486 -64 conicto 1148 -64 795 -16 conicto 443 32 76 128 conicto 234 960 lineto 519 801 844 720 conicto 1169 640 1509 640 conicto 1841 640 2008 716 conicto 2176 793 2176 941 conicto 2176 1044 2084 1100 conicto 1993 1157 1706 1217 conicto 1520 1252 lineto 942 1370 695 1601 conicto 448 1832 448 2241 conicto 448 2794 866 3093 conicto 1284 3392 2061 3392 conicto 2401 3392 2730 3344 conicto 3060 3296 3394 3200 conicto end_ol grestore gsave 58.063297 13.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1482 3264 lineto 1597 1020 lineto 2590 3264 lineto 3425 3264 lineto 3546 1026 lineto 4533 3264 lineto 5568 3264 lineto 4063 0 lineto 2946 0 lineto 2837 2244 lineto 1832 0 lineto 741 0 lineto 512 3264 lineto end_ol grestore gsave 58.802601 13.950000 translate 0.035278 -0.035278 scale start_ol 832 3264 moveto 1899 3264 lineto 1256 0 lineto 192 0 lineto 832 3264 lineto 1088 4544 moveto 2146 4544 lineto 1978 3648 lineto 896 3648 lineto 1088 4544 lineto end_ol grestore gsave 59.077337 13.950000 translate 0.035278 -0.035278 scale start_ol 2489 561 moveto 2236 272 1974 136 conicto 1712 0 1402 0 conicto 843 0 517 363 conicto 192 726 192 1354 conicto 192 1689 305 2025 conicto 419 2361 631 2657 conicto 891 3016 1227 3204 conicto 1564 3392 1950 3392 conicto 2298 3392 2535 3251 conicto 2773 3111 2935 2808 conicto 3024 3264 lineto 4096 3264 lineto 3535 434 lineto 3364 -442 2802 -861 conicto 2241 -1280 1243 -1280 conicto 936 -1280 651 -1232 conicto 366 -1185 89 -1088 conicto 245 -256 lineto 495 -417 745 -496 conicto 996 -576 1258 -576 conicto 1782 -576 2063 -358 conicto 2344 -141 2441 334 conicto 2489 561 lineto 2192 2624 moveto 1800 2624 1540 2271 conicto 1280 1919 1280 1387 conicto 1280 1085 1419 926 conicto 1559 768 1826 768 conicto 2215 768 2476 1119 conicto 2738 1470 2738 1993 conicto 2738 2301 2598 2462 conicto 2459 2624 2192 2624 conicto end_ol grestore gsave 59.649301 13.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore gsave 60.318672 13.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 24.000000 -7.000000 m 24.000000 2.000000 l 37.000000 2.000000 l 37.000000 -7.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 -7.000000 m 24.000000 2.000000 l 37.000000 2.000000 l 37.000000 -7.000000 l cp s 1.000000 1.000000 1.000000 srgb n 24.000000 -8.000000 m 24.000000 -7.000000 l 28.435000 -7.000000 l 28.435000 -8.000000 l f 0.000000 0.000000 0.000000 srgb n 24.000000 -8.000000 m 24.000000 -7.000000 l 28.435000 -7.000000 l 28.435000 -8.000000 l cp s gsave 24.100000 -7.300000 translate 0.035278 -0.035278 scale start_ol 896 353 moveto 896 -1024 lineto 448 -1024 lineto 448 2688 lineto 896 2688 lineto 896 2335 lineto 1012 2539 1206 2645 conicto 1400 2752 1653 2752 conicto 2167 2752 2459 2376 conicto 2752 2000 2752 1334 conicto 2752 681 2458 308 conicto 2165 -64 1653 -64 conicto 1395 -64 1201 42 conicto 1007 149 896 353 conicto 2304 1344 moveto 2304 1851 2128 2109 conicto 1952 2368 1605 2368 conicto 1256 2368 1076 2108 conicto 896 1849 896 1344 conicto 896 841 1076 580 conicto 1256 320 1605 320 conicto 1952 320 2128 578 conicto 2304 837 2304 1344 conicto end_ol grestore gsave 24.484638 -7.300000 translate 0.035278 -0.035278 scale start_ol 2051 871 moveto 1942 589 1773 128 conicto 1537 -508 1456 -648 conicto 1347 -836 1183 -930 conicto 1019 -1024 800 -1024 conicto 448 -1024 lineto 448 -640 lineto 707 -640 lineto 900 -640 1009 -527 conicto 1118 -415 1287 53 conicto 256 2688 lineto 721 2688 lineto 1511 586 lineto 2288 2688 lineto 2752 2688 lineto 2051 871 lineto end_ol grestore gsave 24.869276 -7.300000 translate 0.035278 -0.035278 scale start_ol 896 353 moveto 896 -1024 lineto 448 -1024 lineto 448 2688 lineto 896 2688 lineto 896 2335 lineto 1012 2539 1206 2645 conicto 1400 2752 1653 2752 conicto 2167 2752 2459 2376 conicto 2752 2000 2752 1334 conicto 2752 681 2458 308 conicto 2165 -64 1653 -64 conicto 1395 -64 1201 42 conicto 1007 149 896 353 conicto 2304 1344 moveto 2304 1851 2128 2109 conicto 1952 2368 1605 2368 conicto 1256 2368 1076 2108 conicto 896 1849 896 1344 conicto 896 841 1076 580 conicto 1256 320 1605 320 conicto 1952 320 2128 578 conicto 2304 837 2304 1344 conicto end_ol grestore gsave 25.253914 -7.300000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 25.638552 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 26.023190 -7.300000 translate 0.035278 -0.035278 scale start_ol 2176 1378 moveto 2176 1864 2000 2116 conicto 1825 2368 1489 2368 conicto 1138 2368 953 2116 conicto 768 1864 768 1378 conicto 768 893 954 638 conicto 1140 384 1494 384 conicto 1825 384 2000 639 conicto 2176 895 2176 1378 conicto 2624 201 moveto 2624 -402 2326 -713 conicto 2029 -1024 1452 -1024 conicto 1262 -1024 1054 -991 conicto 847 -959 640 -896 conicto 640 -448 lineto 887 -546 1088 -593 conicto 1290 -640 1458 -640 conicto 1834 -640 2005 -455 conicto 2176 -270 2176 133 conicto 2176 153 lineto 2176 461 lineto 2065 228 1873 114 conicto 1681 0 1406 0 conicto 911 0 615 374 conicto 320 748 320 1375 conicto 320 2004 615 2378 conicto 911 2752 1406 2752 conicto 1679 2752 1868 2646 conicto 2057 2541 2176 2321 conicto 2176 2688 lineto 2624 2688 lineto 2624 201 lineto end_ol grestore gsave 26.407828 -7.300000 translate 0.035278 -0.035278 scale start_ol 2496 1665 moveto 2496 0 lineto 2048 0 lineto 2048 1665 lineto 2048 2027 1922 2197 conicto 1797 2368 1530 2368 conicto 1225 2368 1060 2148 conicto 896 1929 896 1519 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2284 lineto 1013 2514 1213 2633 conicto 1413 2752 1686 2752 conicto 2094 2752 2295 2482 conicto 2496 2212 2496 1665 conicto end_ol grestore gsave 26.792466 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 27.177104 -7.300000 translate 0.035278 -0.035278 scale start_ol 2496 3712 moveto 2496 3328 lineto 2010 3328 lineto 1779 3328 1689 3236 conicto 1600 3145 1600 2912 conicto 1600 2688 lineto 2496 2688 lineto 2496 2368 lineto 1600 2368 lineto 1600 0 lineto 1152 0 lineto 1152 2368 lineto 448 2368 lineto 448 2688 lineto 1152 2688 lineto 1152 2864 lineto 1152 3300 1353 3506 conicto 1555 3712 1982 3712 conicto 2496 3712 lineto end_ol grestore gsave 27.561742 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 27.946380 -7.300000 translate 0.035278 -0.035278 scale start_ol 1472 3456 moveto 1472 2688 lineto 2496 2688 lineto 2496 2368 lineto 1472 2368 lineto 1472 868 lineto 1472 562 1587 441 conicto 1702 320 1989 320 conicto 2496 320 lineto 2496 0 lineto 1945 0 lineto 1439 0 1231 195 conicto 1024 390 1024 868 conicto 1024 2368 lineto 320 2368 lineto 320 2688 lineto 1024 2688 lineto 1024 3456 lineto 1472 3456 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 38.000000 14.000000 m 38.000000 15.400000 l 42.702500 15.400000 l 42.702500 14.000000 l f 0.000000 0.000000 0.000000 srgb n 38.000000 14.000000 m 38.000000 15.400000 l 42.702500 15.400000 l 42.702500 14.000000 l cp s gsave 38.250000 14.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 38.919371 14.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 39.588742 14.950000 translate 0.035278 -0.035278 scale start_ol 2489 561 moveto 2236 272 1974 136 conicto 1712 0 1402 0 conicto 843 0 517 363 conicto 192 726 192 1354 conicto 192 1689 305 2025 conicto 419 2361 631 2657 conicto 891 3016 1227 3204 conicto 1564 3392 1950 3392 conicto 2298 3392 2535 3251 conicto 2773 3111 2935 2808 conicto 3024 3264 lineto 4096 3264 lineto 3535 434 lineto 3364 -442 2802 -861 conicto 2241 -1280 1243 -1280 conicto 936 -1280 651 -1232 conicto 366 -1185 89 -1088 conicto 245 -256 lineto 495 -417 745 -496 conicto 996 -576 1258 -576 conicto 1782 -576 2063 -358 conicto 2344 -141 2441 334 conicto 2489 561 lineto 2192 2624 moveto 1800 2624 1540 2271 conicto 1280 1919 1280 1387 conicto 1280 1085 1419 926 conicto 1559 768 1826 768 conicto 2215 768 2476 1119 conicto 2738 1470 2738 1993 conicto 2738 2301 2598 2462 conicto 2459 2624 2192 2624 conicto end_ol grestore gsave 40.160705 14.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 40.635260 14.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 41.109815 14.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore gsave 41.779186 14.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 -6.000000 m 25.000000 -4.600000 l 31.675000 -4.600000 l 31.675000 -6.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 -6.000000 m 25.000000 -4.600000 l 31.675000 -4.600000 l 31.675000 -6.000000 l cp s gsave 25.250000 -5.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 25.821963 -5.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 26.296518 -5.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.571255 -5.050000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.143218 -5.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 27.712684 -5.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.987421 -5.050000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 28.559384 -5.050000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 29.098877 -5.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 29.481018 -5.050000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 30.020512 -5.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 30.325221 -5.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 30.897184 -5.050000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 -4.000000 m 25.000000 -2.600000 l 31.420000 -2.600000 l 31.420000 -4.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 -4.000000 m 25.000000 -2.600000 l 31.420000 -2.600000 l 31.420000 -4.000000 l cp s gsave 25.250000 -3.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 25.821963 -3.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 26.296518 -3.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.571255 -3.050000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.143218 -3.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 27.712684 -3.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.987421 -3.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 28.559384 -3.050000 translate 0.035278 -0.035278 scale start_ol 512 4544 moveto 1536 4544 lineto 1536 0 lineto 512 0 lineto 512 4544 lineto end_ol grestore gsave 28.834120 -3.050000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 29.383602 -3.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 29.765743 -3.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 30.070452 -3.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 30.642415 -3.050000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 -2.000000 m 25.000000 -0.600000 l 32.010000 -0.600000 l 32.010000 -2.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 -2.000000 m 25.000000 -0.600000 l 32.010000 -0.600000 l 32.010000 -2.000000 l cp s gsave 25.250000 -1.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 25.821963 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 26.296518 -1.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.571255 -1.050000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.143218 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 27.617773 -1.050000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 28.167254 -1.050000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 28.561881 -1.050000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 28.956507 -1.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 29.498497 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 29.973052 -1.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 30.355193 -1.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 30.659902 -1.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 31.231865 -1.050000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 0.000000 m 25.000000 1.400000 l 32.392500 1.400000 l 32.392500 0.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 0.000000 m 25.000000 1.400000 l 32.392500 1.400000 l 32.392500 0.000000 l cp s gsave 25.250000 0.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 25.821963 0.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 26.296518 0.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 26.571255 0.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 27.143218 0.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 27.712684 0.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.987421 0.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 28.529411 0.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 28.924037 0.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 29.318663 0.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 29.868145 0.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 30.262771 0.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 30.737326 0.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 31.042035 0.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 31.613998 0.950000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 58.000000 8.700000 m 57.000000 8.700000 l 57.000000 11.200000 l 62.242500 11.200000 l 62.242500 13.700000 l 61.792500 13.700000 l s 0 slj n 61.792500 13.450000 m 61.292500 13.700000 l 61.792500 13.950000 l ef 0.100000 slw [] 0 sd 0 slj n 61.792500 13.450000 m 61.292500 13.700000 l 61.792500 13.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 56.000000 13.700000 m 54.403750 13.700000 l 54.403750 12.700000 l 53.357500 12.700000 l s 0 slj n 53.357500 12.450000 m 52.857500 12.700000 l 53.357500 12.950000 l ef 0.100000 slw [] 0 sd 0 slj n 53.357500 12.450000 m 52.857500 12.700000 l 53.357500 12.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 56.000000 13.700000 m 54.608750 13.700000 l 54.608750 14.700000 l 53.767500 14.700000 l s 0 slj n 53.767500 14.450000 m 53.267500 14.700000 l 53.767500 14.950000 l ef 0.100000 slw [] 0 sd 0 slj n 53.767500 14.450000 m 53.267500 14.700000 l 53.767500 14.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 45.000000 14.700000 m 45.000000 14.700000 l 43.252500 14.700000 l s 0 slj n 43.252500 14.450000 m 42.752500 14.700000 l 43.252500 14.950000 l ef 0.100000 slw [] 0 sd 0 slj n 43.252500 14.450000 m 42.752500 14.700000 l 43.252500 14.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 42.068750 20.000000 m 42.068750 17.700000 l 40.351250 17.700000 l 40.351250 15.950000 l s 0 slj n 40.601250 15.950000 m 40.351250 15.450000 l 40.101250 15.950000 l ef 0.100000 slw [] 0 sd 0 slj n 40.601250 15.950000 m 40.351250 15.450000 l 40.101250 15.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 38.000000 14.700000 m 35.568800 14.700000 l 35.568800 14.700000 l 33.687500 14.700000 l s 0 slj n 33.687500 14.450000 m 33.187500 14.700000 l 33.687500 14.950000 l ef 0.100000 slw [] 0 sd 0 slj n 33.687500 14.450000 m 33.187500 14.700000 l 33.687500 14.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 45.000000 12.700000 m 45.000000 12.700000 l 33.357500 12.700000 l s 0 slj n 33.357500 12.450000 m 32.857500 12.700000 l 33.357500 12.950000 l ef 0.100000 slw [] 0 sd 0 slj n 33.357500 12.450000 m 32.857500 12.700000 l 33.357500 12.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 45.000000 10.700000 m 45.000000 10.700000 l 30.060000 10.700000 l s 0 slj n 30.060000 10.450000 m 29.560000 10.700000 l 30.060000 10.950000 l ef 0.100000 slw [] 0 sd 0 slj n 30.060000 10.450000 m 29.560000 10.700000 l 30.060000 10.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 45.000000 8.700000 m 45.000000 8.700000 l 35.845000 8.700000 l s 0 slj n 35.845000 8.450000 m 35.345000 8.700000 l 35.845000 8.950000 l ef 0.100000 slw [] 0 sd 0 slj n 35.845000 8.450000 m 35.345000 8.700000 l 35.845000 8.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 1.000000 1.000000 1.000000 srgb n 56.000000 -7.000000 m 56.000000 0.000000 l 66.000000 0.000000 l 66.000000 -7.000000 l f 0.000000 0.000000 0.000000 srgb n 56.000000 -7.000000 m 56.000000 0.000000 l 66.000000 0.000000 l 66.000000 -7.000000 l cp s gsave 57.000000 -6.000000 translate 0.035278 -0.035278 scale start_ol 448 3520 moveto 960 3520 lineto 960 384 lineto 2688 384 lineto 2688 0 lineto 448 0 lineto 448 3520 lineto end_ol grestore gsave 57.347175 -6.000000 translate 0.035278 -0.035278 scale start_ol 2752 1480 moveto 2752 1280 lineto 704 1280 lineto 733 811 978 565 conicto 1223 320 1660 320 conicto 1914 320 2152 384 conicto 2390 448 2624 576 conicto 2624 192 lineto 2388 67 2140 1 conicto 1893 -64 1639 -64 conicto 1001 -64 628 309 conicto 256 683 256 1320 conicto 256 1979 613 2365 conicto 970 2752 1576 2752 conicto 2120 2752 2436 2410 conicto 2752 2068 2752 1480 conicto 2304 1600 moveto 2299 1950 2099 2159 conicto 1900 2368 1572 2368 conicto 1200 2368 976 2166 conicto 753 1964 719 1597 conicto 2304 1600 lineto end_ol grestore gsave 57.741801 -6.000000 translate 0.035278 -0.035278 scale start_ol 2176 1375 moveto 2176 1848 1982 2108 conicto 1789 2368 1439 2368 conicto 1091 2368 897 2108 conicto 704 1848 704 1375 conicto 704 904 897 644 conicto 1091 384 1439 384 conicto 1789 384 1982 644 conicto 2176 904 2176 1375 conicto 2624 347 moveto 2624 -347 2323 -685 conicto 2023 -1024 1404 -1024 conicto 1174 -1024 971 -992 conicto 768 -961 576 -896 conicto 576 -448 lineto 766 -546 951 -593 conicto 1137 -640 1329 -640 conicto 1754 -640 1965 -415 conicto 2176 -190 2176 264 conicto 2176 448 lineto 2042 223 1833 111 conicto 1624 0 1332 0 conicto 848 0 552 376 conicto 256 753 256 1375 conicto 256 1999 552 2375 conicto 848 2752 1332 2752 conicto 1624 2752 1833 2640 conicto 2042 2529 2176 2304 conicto 2176 2688 lineto 2624 2688 lineto 2624 347 lineto end_ol grestore gsave 58.148920 -6.000000 translate 0.035278 -0.035278 scale start_ol 2752 1480 moveto 2752 1280 lineto 704 1280 lineto 733 811 978 565 conicto 1223 320 1660 320 conicto 1914 320 2152 384 conicto 2390 448 2624 576 conicto 2624 192 lineto 2388 67 2140 1 conicto 1893 -64 1639 -64 conicto 1001 -64 628 309 conicto 256 683 256 1320 conicto 256 1979 613 2365 conicto 970 2752 1576 2752 conicto 2120 2752 2436 2410 conicto 2752 2068 2752 1480 conicto 2304 1600 moveto 2299 1950 2099 2159 conicto 1900 2368 1572 2368 conicto 1200 2368 976 2166 conicto 753 1964 719 1597 conicto 2304 1600 lineto end_ol grestore gsave 58.543546 -6.000000 translate 0.035278 -0.035278 scale start_ol 2688 1646 moveto 2688 0 lineto 2240 0 lineto 2240 1632 lineto 2240 2001 2093 2184 conicto 1947 2368 1654 2368 conicto 1302 2368 1099 2146 conicto 896 1925 896 1542 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2304 lineto 1053 2529 1266 2640 conicto 1479 2752 1757 2752 conicto 2217 2752 2452 2471 conicto 2688 2191 2688 1646 conicto end_ol grestore gsave 58.948160 -6.000000 translate 0.035278 -0.035278 scale start_ol 2176 2304 moveto 2176 3712 lineto 2624 3712 lineto 2624 0 lineto 2176 0 lineto 2176 384 lineto 2040 157 1832 46 conicto 1624 -64 1332 -64 conicto 855 -64 555 324 conicto 256 712 256 1344 conicto 256 1976 555 2364 conicto 855 2752 1332 2752 conicto 1624 2752 1832 2641 conicto 2040 2531 2176 2304 conicto 704 1344 moveto 704 865 900 592 conicto 1096 320 1439 320 conicto 1782 320 1979 592 conicto 2176 865 2176 1344 conicto 2176 1823 1979 2095 conicto 1782 2368 1439 2368 conicto 1096 2368 900 2095 conicto 704 1823 704 1344 conicto end_ol grestore gsave 59.355279 -6.000000 translate 0.035278 -0.035278 scale start_ol 576 576 moveto 1088 576 lineto 1088 0 lineto 576 0 lineto 576 576 lineto 576 2496 moveto 1088 2496 lineto 1088 1920 lineto 576 1920 lineto 576 2496 lineto end_ol grestore gsave 61.000000 -5.000000 translate 0.035278 -0.035278 scale start_ol 448 3520 moveto 960 3520 lineto 960 1383 lineto 960 817 1156 568 conicto 1353 320 1793 320 conicto 2231 320 2427 568 conicto 2624 817 2624 1383 conicto 2624 3520 lineto 3136 3520 lineto 3136 1324 lineto 3136 637 2796 286 conicto 2456 -64 1793 -64 conicto 1128 -64 788 286 conicto 448 637 448 1324 conicto 448 3520 lineto end_ol grestore gsave 61.467056 -5.000000 translate 0.035278 -0.035278 scale start_ol 2112 2560 moveto 2112 2176 lineto 1932 2272 1738 2320 conicto 1544 2368 1336 2368 conicto 1020 2368 862 2269 conicto 704 2170 704 1972 conicto 704 1821 814 1735 conicto 925 1649 1260 1571 conicto 1403 1538 lineto 1857 1438 2048 1255 conicto 2240 1072 2240 744 conicto 2240 371 1954 153 conicto 1668 -64 1167 -64 conicto 958 -64 732 -16 conicto 506 32 256 128 conicto 256 576 lineto 491 448 719 384 conicto 947 320 1170 320 conicto 1470 320 1631 425 conicto 1792 531 1792 722 conicto 1792 900 1678 994 conicto 1564 1089 1177 1177 conicto 1032 1212 lineto 621 1298 438 1476 conicto 256 1654 256 1964 conicto 256 2341 520 2546 conicto 784 2752 1269 2752 conicto 1509 2752 1721 2704 conicto 1933 2656 2112 2560 conicto end_ol grestore gsave 61.799240 -5.000000 translate 0.035278 -0.035278 scale start_ol 2752 1480 moveto 2752 1280 lineto 704 1280 lineto 733 811 978 565 conicto 1223 320 1660 320 conicto 1914 320 2152 384 conicto 2390 448 2624 576 conicto 2624 192 lineto 2388 67 2140 1 conicto 1893 -64 1639 -64 conicto 1001 -64 628 309 conicto 256 683 256 1320 conicto 256 1979 613 2365 conicto 970 2752 1576 2752 conicto 2120 2752 2436 2410 conicto 2752 2068 2752 1480 conicto 2304 1600 moveto 2299 1950 2099 2159 conicto 1900 2368 1572 2368 conicto 1200 2368 976 2166 conicto 753 1964 719 1597 conicto 2304 1600 lineto end_ol grestore gsave 62.193866 -5.000000 translate 0.035278 -0.035278 scale start_ol 2112 2560 moveto 2112 2176 lineto 1932 2272 1738 2320 conicto 1544 2368 1336 2368 conicto 1020 2368 862 2269 conicto 704 2170 704 1972 conicto 704 1821 814 1735 conicto 925 1649 1260 1571 conicto 1403 1538 lineto 1857 1438 2048 1255 conicto 2240 1072 2240 744 conicto 2240 371 1954 153 conicto 1668 -64 1167 -64 conicto 958 -64 732 -16 conicto 506 32 256 128 conicto 256 576 lineto 491 448 719 384 conicto 947 320 1170 320 conicto 1470 320 1631 425 conicto 1792 531 1792 722 conicto 1792 900 1678 994 conicto 1564 1089 1177 1177 conicto 1032 1212 lineto 621 1298 438 1476 conicto 256 1654 256 1964 conicto 256 2341 520 2546 conicto 784 2752 1269 2752 conicto 1509 2752 1721 2704 conicto 1933 2656 2112 2560 conicto end_ol grestore gsave 61.000000 -4.000000 translate 0.035278 -0.035278 scale start_ol 3136 3264 moveto 3136 2752 lineto 2892 2977 2616 3088 conicto 2340 3200 2030 3200 conicto 1418 3200 1093 2829 conicto 768 2459 768 1759 conicto 768 1061 1093 690 conicto 1418 320 2030 320 conicto 2340 320 2616 431 conicto 2892 543 3136 768 conicto 3136 256 lineto 2882 96 2599 16 conicto 2316 -64 2000 -64 conicto 1189 -64 722 424 conicto 256 913 256 1759 conicto 256 2607 722 3095 conicto 1189 3584 2000 3584 conicto 2320 3584 2603 3504 conicto 2887 3424 3136 3264 conicto end_ol grestore gsave 61.447080 -4.000000 translate 0.035278 -0.035278 scale start_ol 1473 2368 moveto 1117 2368 910 2094 conicto 704 1820 704 1344 conicto 704 868 909 594 conicto 1115 320 1473 320 conicto 1827 320 2033 595 conicto 2240 870 2240 1344 conicto 2240 1816 2033 2092 conicto 1827 2368 1473 2368 conicto 1472 2752 moveto 2040 2752 2364 2378 conicto 2688 2005 2688 1344 conicto 2688 685 2364 310 conicto 2040 -64 1472 -64 conicto 902 -64 579 310 conicto 256 685 256 1344 conicto 256 2005 579 2378 conicto 902 2752 1472 2752 conicto end_ol grestore gsave 61.839209 -4.000000 translate 0.035278 -0.035278 scale start_ol 2549 2204 moveto 2714 2485 2942 2618 conicto 3171 2752 3482 2752 conicto 3899 2752 4125 2464 conicto 4352 2177 4352 1646 conicto 4352 0 lineto 3904 0 lineto 3904 1632 lineto 3904 2006 3769 2187 conicto 3634 2368 3356 2368 conicto 3017 2368 2820 2146 conicto 2624 1925 2624 1542 conicto 2624 0 lineto 2176 0 lineto 2176 1632 lineto 2176 2008 2041 2188 conicto 1906 2368 1624 2368 conicto 1289 2368 1092 2145 conicto 896 1922 896 1542 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2304 lineto 1046 2534 1255 2643 conicto 1465 2752 1753 2752 conicto 2044 2752 2247 2611 conicto 2451 2471 2549 2204 conicto end_ol grestore gsave 62.461120 -4.000000 translate 0.035278 -0.035278 scale start_ol 896 384 moveto 896 -1024 lineto 448 -1024 lineto 448 2688 lineto 896 2688 lineto 896 2304 lineto 1032 2531 1240 2641 conicto 1448 2752 1737 2752 conicto 2217 2752 2516 2364 conicto 2816 1976 2816 1344 conicto 2816 712 2516 324 conicto 2217 -64 1737 -64 conicto 1448 -64 1240 46 conicto 1032 157 896 384 conicto 2368 1344 moveto 2368 1823 2171 2095 conicto 1975 2368 1632 2368 conicto 1289 2368 1092 2095 conicto 896 1823 896 1344 conicto 896 865 1092 592 conicto 1289 320 1632 320 conicto 1975 320 2171 592 conicto 2368 865 2368 1344 conicto end_ol grestore gsave 62.868239 -4.000000 translate 0.035278 -0.035278 scale start_ol 448 2688 moveto 896 2688 lineto 896 0 lineto 448 0 lineto 448 2688 lineto 448 3712 moveto 896 3712 lineto 896 3136 lineto 448 3136 lineto 448 3712 lineto end_ol grestore gsave 63.045568 -4.000000 translate 0.035278 -0.035278 scale start_ol 448 3712 moveto 896 3712 lineto 896 0 lineto 448 0 lineto 448 3712 lineto end_ol grestore gsave 63.222897 -4.000000 translate 0.035278 -0.035278 scale start_ol 2752 1480 moveto 2752 1280 lineto 704 1280 lineto 733 811 978 565 conicto 1223 320 1660 320 conicto 1914 320 2152 384 conicto 2390 448 2624 576 conicto 2624 192 lineto 2388 67 2140 1 conicto 1893 -64 1639 -64 conicto 1001 -64 628 309 conicto 256 683 256 1320 conicto 256 1979 613 2365 conicto 970 2752 1576 2752 conicto 2120 2752 2436 2410 conicto 2752 2068 2752 1480 conicto 2304 1600 moveto 2299 1950 2099 2159 conicto 1900 2368 1572 2368 conicto 1200 2368 976 2166 conicto 753 1964 719 1597 conicto 2304 1600 lineto end_ol grestore gsave 63.617523 -4.000000 translate 0.035278 -0.035278 scale start_ol 2112 2560 moveto 2112 2176 lineto 1932 2272 1738 2320 conicto 1544 2368 1336 2368 conicto 1020 2368 862 2269 conicto 704 2170 704 1972 conicto 704 1821 814 1735 conicto 925 1649 1260 1571 conicto 1403 1538 lineto 1857 1438 2048 1255 conicto 2240 1072 2240 744 conicto 2240 371 1954 153 conicto 1668 -64 1167 -64 conicto 958 -64 732 -16 conicto 506 32 256 128 conicto 256 576 lineto 491 448 719 384 conicto 947 320 1170 320 conicto 1470 320 1631 425 conicto 1792 531 1792 722 conicto 1792 900 1678 994 conicto 1564 1089 1177 1177 conicto 1032 1212 lineto 621 1298 438 1476 conicto 256 1654 256 1964 conicto 256 2341 520 2546 conicto 784 2752 1269 2752 conicto 1509 2752 1721 2704 conicto 1933 2656 2112 2560 conicto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 61.000000 -4.000000 m 61.000000 -4.000000 l 57.550000 -4.000000 l s 0 slj n 57.550000 -4.250000 m 57.050000 -4.000000 l 57.550000 -3.750000 l ef 0.100000 slw [] 0 sd 0 slj n 57.550000 -4.250000 m 57.050000 -4.000000 l 57.550000 -3.750000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 61.000000 -5.000000 m 59.000000 -5.000000 l 59.000000 -5.000000 l 57.611803 -5.000000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 57.611803 -5.250000 m 57.111803 -5.000000 l 57.611803 -4.750000 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 57.611803 -5.250000 m 57.111803 -5.000000 l 57.611803 -4.750000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 44.137500 20.700000 m 58.621250 20.700000 l 58.621250 14.950000 l s 0 slj n 58.871250 14.950000 m 58.621250 14.450000 l 58.371250 14.950000 l ef 0.100000 slw [] 0 sd 0 slj n 58.871250 14.950000 m 58.621250 14.450000 l 58.371250 14.950000 l cp s 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 57.000000 -3.000000 m 57.000000 -1.600000 l 64.800000 -1.600000 l 64.800000 -3.000000 l f 0.000000 0.000000 0.000000 srgb n 57.000000 -3.000000 m 57.000000 -1.600000 l 64.800000 -1.600000 l 64.800000 -3.000000 l cp s gsave 57.250000 -2.050000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 57.919371 -2.050000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 58.588742 -2.050000 translate 0.035278 -0.035278 scale start_ol 3652 231 moveto 3243 85 2866 10 conicto 2490 -64 2152 -64 conicto 1259 -64 725 427 conicto 192 918 192 1727 conicto 192 2259 360 2730 conicto 529 3202 858 3592 conicto 1246 4050 1792 4297 conicto 2338 4544 2969 4544 conicto 3312 4544 3658 4462 conicto 4005 4380 4363 4213 conicto 4181 3328 lineto 3899 3527 3614 3619 conicto 3329 3712 3003 3712 conicto 2325 3712 1866 3183 conicto 1408 2654 1408 1861 conicto 1408 1350 1690 1059 conicto 1972 768 2468 768 conicto 2765 768 3098 876 conicto 3432 985 3846 1216 conicto 3652 231 lineto end_ol grestore gsave 59.175687 -2.050000 translate 0.035278 -0.035278 scale start_ol 3648 2643 moveto 3648 3165 3420 3438 conicto 3192 3712 2759 3712 conicto 2185 3712 1796 3179 conicto 1408 2646 1408 1843 conicto 1408 1332 1634 1050 conicto 1861 768 2266 768 conicto 2595 768 2852 912 conicto 3109 1056 3289 1338 conicto 3462 1609 3555 1947 conicto 3648 2286 3648 2643 conicto 2925 4544 moveto 3799 4544 4331 4051 conicto 4864 3559 4864 2765 conicto 4864 2224 4701 1742 conicto 4538 1260 4228 876 conicto 3846 403 3325 169 conicto 2805 -64 2125 -64 conicto 1254 -64 723 427 conicto 192 918 192 1715 conicto 192 2259 353 2741 conicto 515 3223 828 3610 conicto 1204 4080 1724 4312 conicto 2245 4544 2925 4544 conicto end_ol grestore gsave 59.855046 -2.050000 translate 0.035278 -0.035278 scale start_ol 960 4416 moveto 2374 4416 lineto 2948 2070 lineto 4436 4416 lineto 5888 4416 lineto 5056 0 lineto 3965 0 lineto 4602 3259 lineto 3053 849 lineto 2434 849 lineto 1818 3259 lineto 1181 0 lineto 128 0 lineto 960 4416 lineto end_ol grestore gsave 60.649301 -2.050000 translate 0.035278 -0.035278 scale start_ol 960 4416 moveto 2831 4416 lineto 3546 4416 3949 4098 conicto 4352 3781 4352 3217 conicto 4352 2871 4219 2559 conicto 4087 2248 3840 2015 conicto 3572 1763 3202 1649 conicto 2832 1536 2272 1536 conicto 1528 1536 lineto 1235 0 lineto 128 0 lineto 960 4416 lineto 1932 3584 moveto 1692 2368 lineto 2316 2368 lineto 2714 2368 2925 2554 conicto 3136 2741 3136 3097 conicto 3136 3333 2985 3458 conicto 2834 3584 2550 3584 conicto 1932 3584 lineto end_ol grestore gsave 61.236246 -2.050000 translate 0.035278 -0.035278 scale start_ol 960 4416 moveto 2091 4416 lineto 1236 0 lineto 128 0 lineto 960 4416 lineto end_ol grestore gsave 61.533464 -2.050000 translate 0.035278 -0.035278 scale start_ol 960 4416 moveto 2091 4416 lineto 1403 832 lineto 3383 832 lineto 3221 0 lineto 128 0 lineto 960 4416 lineto end_ol grestore gsave 62.042985 -2.050000 translate 0.035278 -0.035278 scale start_ol 960 4416 moveto 4009 4416 lineto 3842 3584 lineto 1923 3584 lineto 1765 2752 lineto 3571 2752 lineto 3401 1920 lineto 1597 1920 lineto 1404 832 lineto 3383 832 lineto 3222 0 lineto 128 0 lineto 960 4416 lineto end_ol grestore gsave 62.589970 -2.050000 translate 0.035278 -0.035278 scale start_ol 2172 2496 moveto 2552 2496 2748 2669 conicto 2944 2843 2944 3178 conicto 2944 3388 2809 3486 conicto 2674 3584 2384 3584 conicto 1923 3584 lineto 1703 2496 lineto 2172 2496 lineto 1555 1664 moveto 1233 0 lineto 128 0 lineto 960 4416 lineto 2610 4416 lineto 3341 4416 3718 4145 conicto 4096 3875 4096 3349 conicto 4096 2818 3797 2474 conicto 3498 2130 2986 2080 conicto 3220 2031 3376 1838 conicto 3533 1646 3650 1249 conicto 4032 0 lineto 2883 0 lineto 2558 1093 lineto 2459 1420 2318 1542 conicto 2178 1664 1911 1664 conicto 1555 1664 lineto end_ol grestore gsave 63.204390 -2.050000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore gsave 63.873761 -2.050000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 40.000000 26.000000 m 40.000000 31.000000 l 46.000000 31.000000 l 46.000000 26.000000 l f 0.000000 0.000000 0.000000 srgb n 40.000000 26.000000 m 40.000000 31.000000 l 46.000000 31.000000 l 46.000000 26.000000 l cp s 1.000000 1.000000 1.000000 srgb n 40.000000 25.000000 m 40.000000 26.000000 l 42.000000 26.000000 l 42.000000 25.000000 l f 0.000000 0.000000 0.000000 srgb n 40.000000 25.000000 m 40.000000 26.000000 l 42.000000 26.000000 l 42.000000 25.000000 l cp s gsave 40.100000 25.700000 translate 0.035278 -0.035278 scale start_ol 2496 128 moveto 2321 32 2135 -16 conicto 1950 -64 1756 -64 conicto 1141 -64 794 309 conicto 448 683 448 1344 conicto 448 2005 794 2378 conicto 1141 2752 1756 2752 conicto 1947 2752 2129 2689 conicto 2312 2627 2496 2496 conicto 2496 2048 lineto 2322 2217 2147 2292 conicto 1972 2368 1751 2368 conicto 1339 2368 1117 2102 conicto 896 1837 896 1344 conicto 896 853 1118 586 conicto 1341 320 1751 320 conicto 1979 320 2160 382 conicto 2341 445 2496 576 conicto 2496 128 lineto end_ol grestore gsave 40.484638 25.700000 translate 0.035278 -0.035278 scale start_ol 1536 926 moveto 1536 625 1646 472 conicto 1757 320 1973 320 conicto 2496 320 lineto 2496 0 lineto 1930 0 lineto 1528 0 1308 242 conicto 1088 484 1088 926 conicto 1088 3392 lineto 192 3392 lineto 192 3712 lineto 1536 3712 lineto 1536 926 lineto end_ol grestore gsave 40.869276 25.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 41.000000 27.000000 m 41.000000 28.400000 l 45.137500 28.400000 l 45.137500 27.000000 l f 0.000000 0.000000 0.000000 srgb n 41.000000 27.000000 m 41.000000 28.400000 l 45.137500 28.400000 l 45.137500 27.000000 l cp s gsave 41.250000 27.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1518 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 41.819466 27.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 42.361457 27.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 42.900950 27.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 43.472913 27.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 44.014904 27.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 44.409530 27.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 41.000000 29.000000 m 41.000000 30.400000 l 44.982500 30.400000 l 44.982500 29.000000 l f 0.000000 0.000000 0.000000 srgb n 41.000000 29.000000 m 41.000000 30.400000 l 44.982500 30.400000 l 44.982500 29.000000 l cp s gsave 41.250000 29.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 41.724555 29.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 42.274037 29.950000 translate 0.035278 -0.035278 scale start_ol 512 1320 moveto 512 3264 lineto 1536 3264 lineto 1536 2946 lineto 1536 2687 1533 2296 conicto 1530 1905 1530 1775 conicto 1530 1391 1552 1221 conicto 1574 1052 1627 976 conicto 1696 876 1807 822 conicto 1919 768 2063 768 conicto 2415 768 2615 1012 conicto 2816 1257 2816 1692 conicto 2816 3264 lineto 3840 3264 lineto 3840 0 lineto 2816 0 lineto 2816 512 lineto 2573 216 2301 76 conicto 2030 -64 1703 -64 conicto 1121 -64 816 290 conicto 512 644 512 1320 conicto end_ol grestore gsave 42.843503 29.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 43.238129 29.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 43.712684 29.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 44.254674 29.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 31.000000 34.000000 m 31.000000 35.400000 l 35.702500 35.400000 l 35.702500 34.000000 l f 0.000000 0.000000 0.000000 srgb n 31.000000 34.000000 m 31.000000 35.400000 l 35.702500 35.400000 l 35.702500 34.000000 l cp s gsave 31.250000 34.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 31.919371 34.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 32.588742 34.950000 translate 0.035278 -0.035278 scale start_ol 2489 561 moveto 2236 272 1974 136 conicto 1712 0 1402 0 conicto 843 0 517 363 conicto 192 726 192 1354 conicto 192 1689 305 2025 conicto 419 2361 631 2657 conicto 891 3016 1227 3204 conicto 1564 3392 1950 3392 conicto 2298 3392 2535 3251 conicto 2773 3111 2935 2808 conicto 3024 3264 lineto 4096 3264 lineto 3535 434 lineto 3364 -442 2802 -861 conicto 2241 -1280 1243 -1280 conicto 936 -1280 651 -1232 conicto 366 -1185 89 -1088 conicto 245 -256 lineto 495 -417 745 -496 conicto 996 -576 1258 -576 conicto 1782 -576 2063 -358 conicto 2344 -141 2441 334 conicto 2489 561 lineto 2192 2624 moveto 1800 2624 1540 2271 conicto 1280 1919 1280 1387 conicto 1280 1085 1419 926 conicto 1559 768 1826 768 conicto 2215 768 2476 1119 conicto 2738 1470 2738 1993 conicto 2738 2301 2598 2462 conicto 2459 2624 2192 2624 conicto end_ol grestore gsave 33.160705 34.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 33.635260 34.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 34.109815 34.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore gsave 34.779186 34.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 39.901855 28.500000 m 38.000000 28.500000 l 38.000000 34.700000 l 36.252500 34.700000 l s 0 slj n 36.252500 34.450000 m 35.752500 34.700000 l 36.252500 34.950000 l ef 0.100000 slw [] 0 sd 0 slj n 36.252500 34.450000 m 35.752500 34.700000 l 36.252500 34.950000 l cp s 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 9.000000 24.000000 m 9.000000 33.000000 l 21.000000 33.000000 l 21.000000 24.000000 l f 0.000000 0.000000 0.000000 srgb n 9.000000 24.000000 m 9.000000 33.000000 l 21.000000 33.000000 l 21.000000 24.000000 l cp s 1.000000 1.000000 1.000000 srgb n 9.000000 23.000000 m 9.000000 24.000000 l 11.000000 24.000000 l 11.000000 23.000000 l f 0.000000 0.000000 0.000000 srgb n 9.000000 23.000000 m 9.000000 24.000000 l 11.000000 24.000000 l 11.000000 23.000000 l cp s gsave 9.100000 23.700000 translate 0.035278 -0.035278 scale start_ol 2496 128 moveto 2321 32 2135 -16 conicto 1950 -64 1756 -64 conicto 1141 -64 794 309 conicto 448 683 448 1344 conicto 448 2005 794 2378 conicto 1141 2752 1756 2752 conicto 1947 2752 2129 2689 conicto 2312 2627 2496 2496 conicto 2496 2048 lineto 2322 2217 2147 2292 conicto 1972 2368 1751 2368 conicto 1339 2368 1117 2102 conicto 896 1837 896 1344 conicto 896 853 1118 586 conicto 1341 320 1751 320 conicto 1979 320 2160 382 conicto 2341 445 2496 576 conicto 2496 128 lineto end_ol grestore gsave 9.484638 23.700000 translate 0.035278 -0.035278 scale start_ol 1536 926 moveto 1536 625 1646 472 conicto 1757 320 1973 320 conicto 2496 320 lineto 2496 0 lineto 1930 0 lineto 1528 0 1308 242 conicto 1088 484 1088 926 conicto 1088 3392 lineto 192 3392 lineto 192 3712 lineto 1536 3712 lineto 1536 926 lineto end_ol grestore gsave 9.869276 23.700000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 25.000000 m 10.000000 26.400000 l 18.967500 26.400000 l 18.967500 25.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 25.000000 m 10.000000 26.400000 l 18.967500 26.400000 l 18.967500 25.000000 l cp s gsave 10.250000 25.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 10.821963 25.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 11.296518 25.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 11.571255 25.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 12.143218 25.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 12.712684 25.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 12.987421 25.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 13.579360 25.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.961501 25.950000 translate 0.035278 -0.035278 scale start_ol 320 2176 moveto 2176 2176 lineto 2176 1344 lineto 320 1344 lineto 320 2176 lineto end_ol grestore gsave 14.293685 25.950000 translate 0.035278 -0.035278 scale start_ol 2243 704 moveto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 1536 2816 moveto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 60 conicto 1755 185 1536 448 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto end_ol grestore gsave 14.865648 25.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 15.415130 25.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 15.964611 25.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 16.346752 25.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 16.821307 25.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 17.203448 25.950000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 17.598074 25.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 18.137568 25.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 31.000000 m 10.000000 32.400000 l 19.710000 32.400000 l 19.710000 31.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 31.000000 m 10.000000 32.400000 l 19.710000 32.400000 l 19.710000 31.000000 l cp s gsave 10.250000 31.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 10.821963 31.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 11.296518 31.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 11.571255 31.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 12.143218 31.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 12.712684 31.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 12.987421 31.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 13.579360 31.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.961501 31.950000 translate 0.035278 -0.035278 scale start_ol 320 2176 moveto 2176 2176 lineto 2176 1344 lineto 320 1344 lineto 320 2176 lineto end_ol grestore gsave 14.293685 31.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 14.865648 31.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 15.140385 31.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 15.679878 31.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 16.251841 31.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 16.821307 31.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 17.370789 31.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 17.845344 31.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 18.227485 31.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 18.502222 31.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 18.976777 31.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 29.000000 m 10.000000 30.400000 l 20.465000 30.400000 l 20.465000 29.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 29.000000 m 10.000000 30.400000 l 20.465000 30.400000 l 20.465000 29.000000 l cp s gsave 10.250000 29.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 10.821963 29.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 11.296518 29.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 11.571255 29.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 12.143218 29.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 12.712684 29.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 12.987421 29.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 13.579360 29.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.961501 29.950000 translate 0.035278 -0.035278 scale start_ol 320 2176 moveto 2176 2176 lineto 2176 1344 lineto 320 1344 lineto 320 2176 lineto end_ol grestore gsave 14.293685 29.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 15.125403 29.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 15.664896 29.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 16.236859 29.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 16.778850 29.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 17.253405 29.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 17.635546 29.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 17.910283 29.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 18.742001 29.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 19.281494 29.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 19.663635 29.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 27.000000 m 10.000000 28.400000 l 17.162500 28.400000 l 17.162500 27.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 27.000000 m 10.000000 28.400000 l 17.162500 28.400000 l 17.162500 27.000000 l cp s gsave 10.250000 27.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 10.821963 27.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 11.296518 27.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 11.571255 27.950000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 12.143218 27.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 12.712684 27.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 12.987421 27.950000 translate 0.035278 -0.035278 scale start_ol 2944 4544 moveto 3968 4544 lineto 3968 3648 lineto 2944 3648 lineto 2944 4544 lineto 2752 4544 moveto 2752 3840 lineto 2101 3840 lineto 1855 3840 1759 3757 conicto 1664 3675 1664 3472 conicto 1664 3264 lineto 3968 3264 lineto 3968 0 lineto 2944 0 lineto 2944 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3472 lineto 640 4020 935 4282 conicto 1231 4544 1851 4544 conicto 2752 4544 lineto end_ol grestore gsave 13.579360 27.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.961501 27.950000 translate 0.035278 -0.035278 scale start_ol 320 2176 moveto 2176 2176 lineto 2176 1344 lineto 320 1344 lineto 320 2176 lineto end_ol grestore gsave 14.293685 27.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 15.125403 27.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 15.599958 27.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 16.431675 27.950000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 30.949707 34.700000 m 25.974853 34.700000 l 25.974853 28.500000 l 21.550000 28.500000 l s 0 slj n 21.550000 28.250000 m 21.050000 28.500000 l 21.550000 28.750000 l ef 0.100000 slw [] 0 sd 0 slj n 21.550000 28.250000 m 21.050000 28.500000 l 21.550000 28.750000 l cp s 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 9.000000 -7.000000 m 9.000000 4.000000 l 21.000000 4.000000 l 21.000000 -7.000000 l f 0.000000 0.000000 0.000000 srgb n 9.000000 -7.000000 m 9.000000 4.000000 l 21.000000 4.000000 l 21.000000 -7.000000 l cp s 1.000000 1.000000 1.000000 srgb n 9.000000 -8.000000 m 9.000000 -7.000000 l 13.050000 -7.000000 l 13.050000 -8.000000 l f 0.000000 0.000000 0.000000 srgb n 9.000000 -8.000000 m 9.000000 -7.000000 l 13.050000 -7.000000 l 13.050000 -8.000000 l cp s gsave 9.100000 -7.300000 translate 0.035278 -0.035278 scale start_ol 1598 2401 moveto 1679 2580 1803 2666 conicto 1928 2752 2104 2752 conicto 2424 2752 2556 2499 conicto 2688 2247 2688 1548 conicto 2688 0 lineto 2304 0 lineto 2304 1529 lineto 2304 2094 2239 2231 conicto 2175 2368 2004 2368 conicto 1808 2368 1736 2221 conicto 1664 2075 1664 1529 conicto 1664 0 lineto 1280 0 lineto 1280 1529 lineto 1280 2101 1210 2234 conicto 1140 2368 959 2368 conicto 780 2368 710 2221 conicto 640 2075 640 1529 conicto 640 0 lineto 256 0 lineto 256 2688 lineto 640 2688 lineto 640 2446 lineto 719 2595 837 2673 conicto 956 2752 1107 2752 conicto 1289 2752 1410 2665 conicto 1531 2578 1598 2401 conicto end_ol grestore gsave 9.484638 -7.300000 translate 0.035278 -0.035278 scale start_ol 896 353 moveto 896 -1024 lineto 448 -1024 lineto 448 2688 lineto 896 2688 lineto 896 2335 lineto 1012 2539 1206 2645 conicto 1400 2752 1653 2752 conicto 2167 2752 2459 2376 conicto 2752 2000 2752 1334 conicto 2752 681 2458 308 conicto 2165 -64 1653 -64 conicto 1395 -64 1201 42 conicto 1007 149 896 353 conicto 2304 1344 moveto 2304 1851 2128 2109 conicto 1952 2368 1605 2368 conicto 1256 2368 1076 2108 conicto 896 1849 896 1344 conicto 896 841 1076 580 conicto 1256 320 1605 320 conicto 1952 320 2128 578 conicto 2304 837 2304 1344 conicto end_ol grestore gsave 9.869276 -7.300000 translate 0.035278 -0.035278 scale start_ol 2304 2624 moveto 2304 2176 lineto 2118 2272 1929 2320 conicto 1740 2368 1545 2368 conicto 1250 2368 1105 2274 conicto 960 2181 960 1990 conicto 960 1817 1067 1731 conicto 1174 1646 1599 1565 conicto 1770 1531 lineto 2096 1468 2264 1279 conicto 2432 1091 2432 789 conicto 2432 388 2154 162 conicto 1877 -64 1384 -64 conicto 1189 -64 975 -16 conicto 761 32 512 128 conicto 512 576 lineto 752 448 971 384 conicto 1191 320 1387 320 conicto 1671 320 1827 438 conicto 1984 557 1984 770 conicto 1984 1077 1415 1194 conicto 1396 1199 lineto 1236 1233 lineto 859 1306 685 1480 conicto 512 1655 512 1956 conicto 512 2337 770 2544 conicto 1029 2752 1508 2752 conicto 1721 2752 1917 2720 conicto 2114 2688 2304 2624 conicto end_ol grestore gsave 10.253914 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 10.638552 -7.300000 translate 0.035278 -0.035278 scale start_ol 2176 1378 moveto 2176 1864 2000 2116 conicto 1825 2368 1489 2368 conicto 1138 2368 953 2116 conicto 768 1864 768 1378 conicto 768 893 954 638 conicto 1140 384 1494 384 conicto 1825 384 2000 639 conicto 2176 895 2176 1378 conicto 2624 201 moveto 2624 -402 2326 -713 conicto 2029 -1024 1452 -1024 conicto 1262 -1024 1054 -991 conicto 847 -959 640 -896 conicto 640 -448 lineto 887 -546 1088 -593 conicto 1290 -640 1458 -640 conicto 1834 -640 2005 -455 conicto 2176 -270 2176 133 conicto 2176 153 lineto 2176 461 lineto 2065 228 1873 114 conicto 1681 0 1406 0 conicto 911 0 615 374 conicto 320 748 320 1375 conicto 320 2004 615 2378 conicto 911 2752 1406 2752 conicto 1679 2752 1868 2646 conicto 2057 2541 2176 2321 conicto 2176 2688 lineto 2624 2688 lineto 2624 201 lineto end_ol grestore gsave 11.023190 -7.300000 translate 0.035278 -0.035278 scale start_ol 2496 1665 moveto 2496 0 lineto 2048 0 lineto 2048 1665 lineto 2048 2027 1922 2197 conicto 1797 2368 1530 2368 conicto 1225 2368 1060 2148 conicto 896 1929 896 1519 conicto 896 0 lineto 448 0 lineto 448 2688 lineto 896 2688 lineto 896 2284 lineto 1013 2514 1213 2633 conicto 1413 2752 1686 2752 conicto 2094 2752 2295 2482 conicto 2496 2212 2496 1665 conicto end_ol grestore gsave 11.407828 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 11.792466 -7.300000 translate 0.035278 -0.035278 scale start_ol 2496 3712 moveto 2496 3328 lineto 2010 3328 lineto 1779 3328 1689 3236 conicto 1600 3145 1600 2912 conicto 1600 2688 lineto 2496 2688 lineto 2496 2368 lineto 1600 2368 lineto 1600 0 lineto 1152 0 lineto 1152 2368 lineto 448 2368 lineto 448 2688 lineto 1152 2688 lineto 1152 2864 lineto 1152 3300 1353 3506 conicto 1555 3712 1982 3712 conicto 2496 3712 lineto end_ol grestore gsave 12.177104 -7.300000 translate 0.035278 -0.035278 scale start_ol 576 2688 moveto 1728 2688 lineto 1728 320 lineto 2624 320 lineto 2624 0 lineto 384 0 lineto 384 320 lineto 1280 320 lineto 1280 2368 lineto 576 2368 lineto 576 2688 lineto 1280 3712 moveto 1728 3712 lineto 1728 3136 lineto 1280 3136 lineto 1280 3712 lineto end_ol grestore gsave 12.561742 -7.300000 translate 0.035278 -0.035278 scale start_ol 1472 3456 moveto 1472 2688 lineto 2496 2688 lineto 2496 2368 lineto 1472 2368 lineto 1472 868 lineto 1472 562 1587 441 conicto 1702 320 1989 320 conicto 2496 320 lineto 2496 0 lineto 1945 0 lineto 1439 0 1231 195 conicto 1024 390 1024 868 conicto 1024 2368 lineto 320 2368 lineto 320 2688 lineto 1024 2688 lineto 1024 3456 lineto 1472 3456 lineto end_ol grestore 0.100000 slw [] 0 sd 0 slj 0 slc n 15.000000 23.088197 m 15.000000 4.000000 l 15.000000 4.000000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 14.600000 23.088197 m 15.000000 23.888197 l 15.400000 23.088197 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 14.600000 23.088197 m 15.000000 23.888197 l 15.400000 23.088197 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 30.500000 6.088197 m 30.500000 2.000000 l 30.500000 2.000000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 30.100000 6.088197 m 30.500000 6.888197 l 30.900000 6.088197 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 30.100000 6.088197 m 30.500000 6.888197 l 30.900000 6.088197 l cp s 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 -6.000000 m 10.000000 -4.600000 l 18.585000 -4.600000 l 18.585000 -6.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 -6.000000 m 10.000000 -4.600000 l 18.585000 -4.600000 l 18.585000 -6.000000 l cp s gsave 10.250000 -5.050000 translate 0.035278 -0.035278 scale start_ol 2310 2688 moveto 2559 2688 2687 2809 conicto 2816 2931 2816 3168 conicto 2816 3402 2687 3525 conicto 2559 3648 2310 3648 conicto 1728 3648 lineto 1728 2688 lineto 2310 2688 lineto 2346 768 moveto 2676 768 2842 912 conicto 3008 1057 3008 1348 conicto 3008 1634 2843 1777 conicto 2678 1920 2346 1920 conicto 1728 1920 lineto 1728 768 lineto 2346 768 lineto 3378 2348 moveto 3751 2242 3955 1957 conicto 4160 1672 4160 1258 conicto 4160 623 3730 311 conicto 3300 0 2422 0 conicto 576 0 lineto 576 4416 lineto 2256 4416 lineto 3158 4416 3563 4136 conicto 3968 3856 3968 3239 conicto 3968 2914 3817 2686 conicto 3666 2458 3378 2348 conicto end_ol grestore gsave 10.859426 -5.050000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 11.373942 -5.050000 translate 0.035278 -0.035278 scale start_ol 64 3264 moveto 1108 3264 lineto 1986 1049 lineto 2732 3264 lineto 3776 3264 lineto 2403 -284 lineto 2196 -838 1920 -1059 conicto 1644 -1280 1192 -1280 conicto 589 -1280 lineto 589 -576 lineto 915 -576 lineto 1181 -576 1302 -495 conicto 1423 -415 1490 -206 conicto 1519 -116 lineto 64 3264 lineto end_ol grestore gsave 11.895948 -5.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 12.437939 -5.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 12.912494 -5.050000 translate 0.035278 -0.035278 scale start_ol 576 4416 moveto 1728 4416 lineto 1728 0 lineto 576 0 lineto 576 4416 lineto end_ol grestore gsave 13.209712 -5.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 13.779178 -5.050000 translate 0.035278 -0.035278 scale start_ol 2624 4544 moveto 2624 3840 lineto 2062 3840 lineto 1840 3840 1752 3761 conicto 1664 3683 1664 3488 conicto 1664 3264 lineto 2560 3264 lineto 2560 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3488 lineto 640 4028 933 4286 conicto 1226 4544 1840 4544 conicto 2624 4544 lineto end_ol grestore gsave 14.126353 -5.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 14.668343 -5.050000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 15.062969 -5.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 15.604960 -5.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 16.174426 -5.050000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 16.648981 -5.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 17.190972 -5.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 17.495681 -5.050000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 -4.000000 m 10.000000 -2.600000 l 20.377500 -2.600000 l 20.377500 -4.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 -4.000000 m 10.000000 -2.600000 l 20.377500 -2.600000 l 20.377500 -4.000000 l cp s gsave 10.250000 -3.050000 translate 0.035278 -0.035278 scale start_ol 2310 2688 moveto 2559 2688 2687 2809 conicto 2816 2931 2816 3168 conicto 2816 3402 2687 3525 conicto 2559 3648 2310 3648 conicto 1728 3648 lineto 1728 2688 lineto 2310 2688 lineto 2346 768 moveto 2676 768 2842 912 conicto 3008 1057 3008 1348 conicto 3008 1634 2843 1777 conicto 2678 1920 2346 1920 conicto 1728 1920 lineto 1728 768 lineto 2346 768 lineto 3378 2348 moveto 3751 2242 3955 1957 conicto 4160 1672 4160 1258 conicto 4160 623 3730 311 conicto 3300 0 2422 0 conicto 576 0 lineto 576 4416 lineto 2256 4416 lineto 3158 4416 3563 4136 conicto 3968 3856 3968 3239 conicto 3968 2914 3817 2686 conicto 3666 2458 3378 2348 conicto end_ol grestore gsave 10.859426 -3.050000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 11.408908 -3.050000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 11.958390 -3.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 12.340531 -3.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 12.815086 -3.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.197227 -3.050000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 13.591853 -3.050000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 14.131347 -3.050000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 14.703310 -3.050000 translate 0.035278 -0.035278 scale start_ol 576 4416 moveto 1728 4416 lineto 1728 0 lineto 576 0 lineto 576 4416 lineto end_ol grestore gsave 15.000528 -3.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 15.569994 -3.050000 translate 0.035278 -0.035278 scale start_ol 2624 4544 moveto 2624 3840 lineto 2062 3840 lineto 1840 3840 1752 3761 conicto 1664 3683 1664 3488 conicto 1664 3264 lineto 2560 3264 lineto 2560 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3488 lineto 640 4028 933 4286 conicto 1226 4544 1840 4544 conicto 2624 4544 lineto end_ol grestore gsave 15.917168 -3.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 16.459159 -3.050000 translate 0.035278 -0.035278 scale start_ol 2944 2432 moveto 2804 2497 2666 2528 conicto 2528 2560 2389 2560 conicto 1979 2560 1757 2296 conicto 1536 2032 1536 1540 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2752 lineto 1741 3086 2007 3239 conicto 2273 3392 2644 3392 conicto 2697 3392 2759 3385 conicto 2822 3378 2941 3354 conicto 2944 2432 lineto end_ol grestore gsave 16.853785 -3.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 17.395776 -3.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 17.965242 -3.050000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 18.439797 -3.050000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 18.981787 -3.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 19.286496 -3.050000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 -2.000000 m 10.000000 -0.600000 l 16.892500 -0.600000 l 16.892500 -2.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 -2.000000 m 10.000000 -0.600000 l 16.892500 -0.600000 l 16.892500 -2.000000 l cp s gsave 10.250000 -1.050000 translate 0.035278 -0.035278 scale start_ol 1728 3584 moveto 1728 832 lineto 2125 832 lineto 2804 832 3162 1185 conicto 3520 1539 3520 2213 conicto 3520 2883 3163 3233 conicto 2807 3584 2125 3584 conicto 1728 3584 lineto 576 4416 moveto 1788 4416 lineto 2770 4416 3250 4272 conicto 3731 4129 4074 3786 conicto 4378 3487 4525 3096 conicto 4672 2706 4672 2212 conicto 4672 1713 4525 1321 conicto 4378 929 4074 630 conicto 3728 287 3243 143 conicto 2758 0 1788 0 conicto 576 0 lineto 576 4416 lineto end_ol grestore gsave 10.914377 -1.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 11.189114 -1.050000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 11.728607 -1.050000 translate 0.035278 -0.035278 scale start_ol 2752 576 moveto 2533 279 2269 139 conicto 2005 0 1658 0 conicto 1050 0 653 478 conicto 256 957 256 1697 conicto 256 2441 653 2916 conicto 1050 3392 1658 3392 conicto 2005 3392 2269 3253 conicto 2533 3115 2752 2816 conicto 2752 3264 lineto 3776 3264 lineto 3776 343 lineto 3776 -447 3274 -863 conicto 2772 -1280 1818 -1280 conicto 1509 -1280 1220 -1232 conicto 932 -1185 640 -1088 conicto 640 -256 lineto 922 -417 1191 -496 conicto 1461 -576 1733 -576 conicto 2261 -576 2506 -353 conicto 2752 -131 2752 343 conicto 2752 576 lineto 2047 2624 moveto 1715 2624 1529 2381 conicto 1344 2139 1344 1695 conicto 1344 1239 1523 1003 conicto 1703 768 2047 768 conicto 2381 768 2566 1010 conicto 2752 1253 2752 1695 conicto 2752 2139 2566 2381 conicto 2381 2624 2047 2624 conicto end_ol grestore gsave 12.300570 -1.050000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 12.870036 -1.050000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 13.419518 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 13.894073 -1.050000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 14.276214 -1.050000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 14.550951 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3136 moveto 3136 2304 lineto 2924 2467 2710 2545 conicto 2496 2624 2266 2624 conicto 1830 2624 1587 2371 conicto 1344 2118 1344 1664 conicto 1344 1210 1587 957 conicto 1830 704 2266 704 conicto 2511 704 2730 785 conicto 2950 866 3136 1024 conicto 3136 192 lineto 2891 64 2639 0 conicto 2388 -64 2134 -64 conicto 1252 -64 754 393 conicto 256 850 256 1664 conicto 256 2478 754 2935 conicto 1252 3392 2134 3392 conicto 2391 3392 2639 3328 conicto 2888 3264 3136 3136 conicto end_ol grestore gsave 15.025506 -1.050000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 15.500061 -1.050000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 15.804770 -1.050000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 0.000000 m 10.000000 1.400000 l 18.262500 1.400000 l 18.262500 0.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 0.000000 m 10.000000 1.400000 l 18.262500 1.400000 l 18.262500 0.000000 l cp s gsave 10.250000 0.950000 translate 0.035278 -0.035278 scale start_ol 4544 353 moveto 4118 145 3659 40 conicto 3201 -64 2713 -64 conicto 1610 -64 965 556 conicto 320 1177 320 2239 conicto 320 3312 972 3928 conicto 1624 4544 2757 4544 conicto 3195 4544 3596 4460 conicto 3997 4377 4352 4213 conicto 4352 3328 lineto 3983 3521 3618 3616 conicto 3253 3712 2887 3712 conicto 2208 3712 1840 3330 conicto 1472 2949 1472 2239 conicto 1472 1534 1841 1151 conicto 2211 768 2892 768 conicto 3077 768 3235 789 conicto 3394 810 3520 855 conicto 3520 1664 lineto 2816 1664 lineto 2816 2432 lineto 4544 2432 lineto 4544 353 lineto end_ol grestore gsave 10.906886 0.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 11.456368 0.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore gsave 12.005849 0.950000 translate 0.035278 -0.035278 scale start_ol 2752 2816 moveto 2752 4544 lineto 3776 4544 lineto 3776 0 lineto 2752 0 lineto 2752 512 lineto 2533 213 2269 74 conicto 2005 -64 1658 -64 conicto 1045 -64 650 419 conicto 256 903 256 1664 conicto 256 2425 650 2908 conicto 1045 3392 1658 3392 conicto 2002 3392 2267 3252 conicto 2533 3112 2752 2816 conicto 2047 704 moveto 2390 704 2571 950 conicto 2752 1196 2752 1664 conicto 2752 2132 2571 2378 conicto 2390 2624 2047 2624 conicto 1706 2624 1525 2378 conicto 1344 2132 1344 1664 conicto 1344 1196 1525 950 conicto 1706 704 2047 704 conicto end_ol grestore gsave 12.577812 0.950000 translate 0.035278 -0.035278 scale start_ol 3840 1991 moveto 3840 0 lineto 2816 0 lineto 2816 324 lineto 2816 1524 lineto 2816 1947 2795 2107 conicto 2775 2268 2725 2344 conicto 2659 2446 2546 2503 conicto 2433 2560 2289 2560 conicto 1938 2560 1737 2307 conicto 1536 2055 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1779 3112 2052 3252 conicto 2325 3392 2655 3392 conicto 3237 3392 3538 3033 conicto 3840 2675 3840 1991 conicto end_ol grestore gsave 13.147278 0.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 13.689269 0.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 14.163824 0.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 14.638379 0.950000 translate 0.035278 -0.035278 scale start_ol 2590 3712 moveto 2058 3712 1765 3326 conicto 1472 2940 1472 2239 conicto 1472 1540 1765 1154 conicto 2058 768 2590 768 conicto 3126 768 3419 1154 conicto 3712 1540 3712 2239 conicto 3712 2940 3419 3326 conicto 3126 3712 2590 3712 conicto 2592 4544 moveto 3657 4544 4260 3931 conicto 4864 3318 4864 2239 conicto 4864 1162 4260 549 conicto 3657 -64 2592 -64 conicto 1530 -64 925 549 conicto 320 1162 320 2239 conicto 320 3318 925 3931 conicto 1530 4544 2592 4544 conicto end_ol grestore gsave 15.317738 0.950000 translate 0.035278 -0.035278 scale start_ol 2624 4544 moveto 2624 3840 lineto 2062 3840 lineto 1840 3840 1752 3761 conicto 1664 3683 1664 3488 conicto 1664 3264 lineto 2560 3264 lineto 2560 2496 lineto 1664 2496 lineto 1664 0 lineto 640 0 lineto 640 2496 lineto 128 2496 lineto 128 3264 lineto 640 3264 lineto 640 3488 lineto 640 4028 933 4286 conicto 1226 4544 1840 4544 conicto 2624 4544 lineto end_ol grestore gsave 15.664913 0.950000 translate 0.035278 -0.035278 scale start_ol 576 4416 moveto 3648 4416 lineto 3648 3584 lineto 1728 3584 lineto 1728 2752 lineto 3520 2752 lineto 3520 1920 lineto 1728 1920 lineto 1728 0 lineto 576 0 lineto 576 4416 lineto end_ol grestore gsave 16.211898 0.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 16.486634 0.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 16.868775 0.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 17.173484 0.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 10.000000 2.000000 m 10.000000 3.400000 l 17.522500 3.400000 l 17.522500 2.000000 l f 0.000000 0.000000 0.000000 srgb n 10.000000 2.000000 m 10.000000 3.400000 l 17.522500 3.400000 l 17.522500 2.000000 l cp s gsave 10.250000 2.950000 translate 0.035278 -0.035278 scale start_ol 576 4416 moveto 1978 4416 lineto 3005 2042 lineto 4038 4416 lineto 5440 4416 lineto 5440 0 lineto 4416 0 lineto 4416 3224 lineto 3377 832 lineto 2639 832 lineto 1600 3224 lineto 1600 0 lineto 576 0 lineto 576 4416 lineto end_ol grestore gsave 11.044254 2.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 11.583748 2.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 12.155711 2.950000 translate 0.035278 -0.035278 scale start_ol 576 4416 moveto 3648 4416 lineto 3648 3584 lineto 1728 3584 lineto 1728 2752 lineto 3520 2752 lineto 3520 1920 lineto 1728 1920 lineto 1728 832 lineto 3712 832 lineto 3712 0 lineto 576 0 lineto 576 4416 lineto end_ol grestore gsave 12.702696 2.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 13.177251 2.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 13.559392 2.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 13.834129 2.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore gsave 14.665846 2.950000 translate 0.035278 -0.035278 scale start_ol 1981 1472 moveto 1632 1472 1456 1365 conicto 1280 1258 1280 1049 conicto 1280 857 1421 748 conicto 1563 640 1816 640 conicto 2130 640 2345 844 conicto 2560 1049 2560 1356 conicto 2560 1472 lineto 1981 1472 lineto 3584 1878 moveto 3584 0 lineto 2560 0 lineto 2560 512 lineto 2345 211 2076 73 conicto 1808 -64 1423 -64 conicto 904 -64 580 232 conicto 256 528 256 1001 conicto 256 1575 654 1843 conicto 1052 2112 1903 2112 conicto 2560 2112 lineto 2560 2202 lineto 2560 2454 2363 2571 conicto 2166 2688 1748 2688 conicto 1409 2688 1117 2624 conicto 826 2560 576 2432 conicto 576 3264 lineto 906 3327 1238 3359 conicto 1571 3392 1903 3392 conicto 2793 3392 3188 3036 conicto 3584 2680 3584 1878 conicto end_ol grestore gsave 15.205340 2.950000 translate 0.035278 -0.035278 scale start_ol 1600 4224 moveto 1600 3264 lineto 2688 3264 lineto 2688 2496 lineto 1600 2496 lineto 1600 1146 lineto 1600 924 1694 846 conicto 1788 768 2067 768 conicto 2624 768 lineto 2624 0 lineto 1694 0 lineto 1085 0 830 260 conicto 576 521 576 1146 conicto 576 2496 lineto 64 2496 lineto 64 3264 lineto 576 3264 lineto 576 4224 lineto 1600 4224 lineto end_ol grestore gsave 15.587481 2.950000 translate 0.035278 -0.035278 scale start_ol 3776 1703 moveto 3776 1408 lineto 1280 1408 lineto 1319 1024 1554 832 conicto 1790 640 2213 640 conicto 2555 640 2912 735 conicto 3270 831 3648 1024 conicto 3648 192 lineto 3273 65 2898 0 conicto 2523 -64 2148 -64 conicto 1251 -64 753 390 conicto 256 844 256 1664 conicto 256 2469 740 2930 conicto 1225 3392 2075 3392 conicto 2848 3392 3312 2932 conicto 3776 2472 3776 1703 conicto 2752 2048 moveto 2752 2336 2565 2512 conicto 2379 2688 2077 2688 conicto 1751 2688 1547 2523 conicto 1343 2358 1293 2048 conicto 2752 2048 lineto end_ol grestore gsave 16.129472 2.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 16.434181 2.950000 translate 0.035278 -0.035278 scale start_ol 3531 2745 moveto 3730 3061 4003 3226 conicto 4277 3392 4605 3392 conicto 5169 3392 5464 3033 conicto 5760 2675 5760 1991 conicto 5760 0 lineto 4736 0 lineto 4736 1705 lineto 4739 1743 4740 1784 conicto 4742 1825 4742 1901 conicto 4742 2248 4636 2404 conicto 4531 2560 4296 2560 conicto 3989 2560 3821 2314 conicto 3654 2069 3648 1605 conicto 3648 0 lineto 2624 0 lineto 2624 1705 lineto 2624 2248 2527 2404 conicto 2431 2560 2184 2560 conicto 1874 2560 1705 2313 conicto 1536 2066 1536 1608 conicto 1536 0 lineto 512 0 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1730 3102 1980 3247 conicto 2231 3392 2533 3392 conicto 2874 3392 3135 3222 conicto 3396 3052 3531 2745 conicto end_ol grestore 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 33.000000 21.000000 m 33.000000 22.400000 l 37.702500 22.400000 l 37.702500 21.000000 l f 0.000000 0.000000 0.000000 srgb n 33.000000 21.000000 m 33.000000 22.400000 l 37.702500 22.400000 l 37.702500 21.000000 l cp s gsave 33.250000 21.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 33.919371 21.950000 translate 0.035278 -0.035278 scale start_ol 4416 2854 moveto 1577 1885 lineto 4416 922 lineto 4416 192 lineto 640 1544 lineto 640 2232 lineto 4416 3584 lineto 4416 2854 lineto end_ol grestore gsave 34.588742 21.950000 translate 0.035278 -0.035278 scale start_ol 2489 561 moveto 2236 272 1974 136 conicto 1712 0 1402 0 conicto 843 0 517 363 conicto 192 726 192 1354 conicto 192 1689 305 2025 conicto 419 2361 631 2657 conicto 891 3016 1227 3204 conicto 1564 3392 1950 3392 conicto 2298 3392 2535 3251 conicto 2773 3111 2935 2808 conicto 3024 3264 lineto 4096 3264 lineto 3535 434 lineto 3364 -442 2802 -861 conicto 2241 -1280 1243 -1280 conicto 936 -1280 651 -1232 conicto 366 -1185 89 -1088 conicto 245 -256 lineto 495 -417 745 -496 conicto 996 -576 1258 -576 conicto 1782 -576 2063 -358 conicto 2344 -141 2441 334 conicto 2489 561 lineto 2192 2624 moveto 1800 2624 1540 2271 conicto 1280 1919 1280 1387 conicto 1280 1085 1419 926 conicto 1559 768 1826 768 conicto 2215 768 2476 1119 conicto 2738 1470 2738 1993 conicto 2738 2301 2598 2462 conicto 2459 2624 2192 2624 conicto end_ol grestore gsave 35.160705 21.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 35.635260 21.950000 translate 0.035278 -0.035278 scale start_ol 3456 3136 moveto 3287 2304 lineto 3073 2461 2865 2542 conicto 2658 2624 2459 2624 conicto 1939 2624 1609 2284 conicto 1280 1944 1280 1415 conicto 1280 1077 1485 890 conicto 1690 704 2064 704 conicto 2313 704 2553 785 conicto 2794 866 3011 1024 conicto 2847 192 lineto 2587 64 2324 0 conicto 2061 -64 1796 -64 conicto 1024 -64 608 284 conicto 192 632 192 1273 conicto 192 1676 346 2055 conicto 500 2434 787 2737 conicto 1106 3069 1519 3230 conicto 1932 3392 2472 3392 conicto 2721 3392 2967 3328 conicto 3213 3264 3456 3136 conicto end_ol grestore gsave 36.109815 21.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore gsave 36.779186 21.950000 translate 0.035278 -0.035278 scale start_ol 640 2854 moveto 640 3584 lineto 4416 2232 lineto 4416 1544 lineto 640 192 lineto 640 922 lineto 3482 1885 lineto 640 2854 lineto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 40.000000 20.700000 m 38.851250 20.700000 l 38.851250 21.700000 l 38.252500 21.700000 l s 0 slj n 38.252500 21.450000 m 37.752500 21.700000 l 38.252500 21.950000 l ef 0.100000 slw [] 0 sd 0 slj n 38.252500 21.450000 m 37.752500 21.700000 l 38.252500 21.950000 l cp s 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 40.000000 22.700000 m 38.851250 22.700000 l 38.851250 21.700000 l 38.252500 21.700000 l s 0 slj n 38.252500 21.450000 m 37.752500 21.700000 l 38.252500 21.950000 l ef 0.100000 slw [] 0 sd 0 slj n 38.252500 21.450000 m 37.752500 21.700000 l 38.252500 21.950000 l cp s 0.100000 slw [] 0 sd 1.000000 1.000000 1.000000 srgb n 25.000000 21.000000 m 25.000000 22.400000 l 30.420000 22.400000 l 30.420000 21.000000 l f 0.000000 0.000000 0.000000 srgb n 25.000000 21.000000 m 25.000000 22.400000 l 30.420000 22.400000 l 30.420000 21.000000 l cp s gsave 25.250000 21.950000 translate 0.035278 -0.035278 scale start_ol 512 4544 moveto 1536 4544 lineto 1536 0 lineto 512 0 lineto 512 4544 lineto end_ol grestore gsave 25.524737 21.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 25.799473 21.950000 translate 0.035278 -0.035278 scale start_ol 2243 704 moveto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 1536 2816 moveto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 60 conicto 1755 185 1536 448 conicto 1536 0 lineto 512 0 lineto 512 4544 lineto 1536 4544 lineto 1536 2816 lineto end_ol grestore gsave 26.371436 21.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 26.943399 21.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 27.417954 21.950000 translate 0.035278 -0.035278 scale start_ol 512 3264 moveto 1536 3264 lineto 1536 0 lineto 512 0 lineto 512 3264 lineto 512 4544 moveto 1536 4544 lineto 1536 3648 lineto 512 3648 lineto 512 4544 lineto end_ol grestore gsave 27.692691 21.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 28.264654 21.950000 translate 0.035278 -0.035278 scale start_ol 1536 512 moveto 1536 -1280 lineto 512 -1280 lineto 512 3264 lineto 1536 3264 lineto 1536 2816 lineto 1755 3112 2021 3252 conicto 2287 3392 2633 3392 conicto 3245 3392 3638 2908 conicto 4032 2425 4032 1664 conicto 4032 903 3638 419 conicto 3245 -64 2633 -64 conicto 2287 -64 2021 76 conicto 1755 216 1536 512 conicto 2243 2624 moveto 1901 2624 1718 2376 conicto 1536 2129 1536 1664 conicto 1536 1199 1718 951 conicto 1901 704 2243 704 conicto 2585 704 2764 950 conicto 2944 1196 2944 1664 conicto 2944 2132 2764 2378 conicto 2585 2624 2243 2624 conicto end_ol grestore gsave 28.836617 21.950000 translate 0.035278 -0.035278 scale start_ol 640 1152 moveto 1664 1152 lineto 1664 0 lineto 640 0 lineto 640 1152 lineto end_ol grestore gsave 29.141326 21.950000 translate 0.035278 -0.035278 scale start_ol 3136 3200 moveto 3136 2432 lineto 2794 2560 2476 2624 conicto 2159 2688 1877 2688 conicto 1574 2688 1427 2616 conicto 1280 2544 1280 2395 conicto 1280 2274 1393 2209 conicto 1507 2145 1800 2114 conicto 1990 2088 lineto 2781 1984 3054 1746 conicto 3328 1509 3328 1002 conicto 3328 470 2939 203 conicto 2550 -64 1778 -64 conicto 1451 -64 1101 0 conicto 752 64 384 192 conicto 384 960 lineto 706 800 1045 720 conicto 1384 640 1733 640 conicto 2049 640 2208 727 conicto 2368 814 2368 986 conicto 2368 1130 2257 1200 conicto 2147 1271 1818 1310 conicto 1628 1334 lineto 903 1421 611 1657 conicto 320 1893 320 2373 conicto 320 2891 685 3141 conicto 1050 3392 1804 3392 conicto 2101 3392 2427 3345 conicto 2753 3299 3136 3200 conicto end_ol grestore gsave 29.615881 21.950000 translate 0.035278 -0.035278 scale start_ol 2085 2624 moveto 1723 2624 1533 2377 conicto 1344 2130 1344 1664 conicto 1344 1198 1533 951 conicto 1723 704 2085 704 conicto 2440 704 2628 951 conicto 2816 1198 2816 1664 conicto 2816 2130 2628 2377 conicto 2440 2624 2085 2624 conicto 2084 3392 moveto 2941 3392 3422 2933 conicto 3904 2475 3904 1664 conicto 3904 853 3422 394 conicto 2941 -64 2084 -64 conicto 1225 -64 740 394 conicto 256 853 256 1664 conicto 256 2475 740 2933 conicto 1225 3392 2084 3392 conicto end_ol grestore 0.100000 slw [] 0 sd [] 0 sd 0 slj 0 slc n 33.000000 21.700000 m 32.000000 21.700000 l 32.000000 21.700000 l 30.970000 21.700000 l s 0 slj n 30.970000 21.450000 m 30.470000 21.700000 l 30.970000 21.950000 l ef 0.100000 slw [] 0 sd 0 slj n 30.970000 21.450000 m 30.470000 21.700000 l 30.970000 21.950000 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 27.710000 20.088197 m 27.710000 18.200000 l 29.068750 18.200000 l 29.068750 15.400000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 27.310000 20.088197 m 27.710000 20.888197 l 28.110000 20.088197 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 27.310000 20.088197 m 27.710000 20.888197 l 28.110000 20.088197 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 27.710000 23.311803 m 27.710000 25.700000 l 18.967500 25.700000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 27.710000 23.311803 m 27.710000 27.700000 l 17.162500 27.700000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 27.710000 23.311803 m 27.710000 29.700000 l 20.465000 29.700000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l cp s 0.100000 slw [] 0 sd 0 slj 0 slc n 27.710000 23.311803 m 27.710000 31.700000 l 19.710000 31.700000 l s 0 slj 1.000000 1.000000 1.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l ef 0.100000 slw [] 0 sd 0 slj 0.000000 0.000000 0.000000 srgb n 28.110000 23.311803 m 27.710000 22.511803 l 27.310000 23.311803 l cp s showpage psignifit3-3.0~beta.20120611.1/doc-src/architecture.pdf000066400000000000000000003342361176542545200222540ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream x}Id9ܾN'qN}SkE3H>w_$qA@O .G?)Wiğ^rO|WrzR~TOQ 4~9~R~=4Y&kbi[ SϪO ~YmP?^^P Vy'OVXEt拃lqLC?SǼbY*%ى d_uSp _3-fCH?kd/YOQ kXjzrkEIh-g -DV=g9 i7$|B65ۈ<ՅiQ kz׵a-Yc2]c_[W9U$t0+ƚGk6;Zȉ}全VYcwBUHkU " k(%[#mEjb%_}_ f 'D-EQfM,Uϩm V{w9S4mPv$0QDEr$ ~P>M75S&:_+[`J5#D^c[` (n, ϔluh dRʡuBĨWiL> fd>slb/pc嗧<(H#Ͷ@㨢!bZ_=W|ҋPCȳ)[-D<([l)~_C8C?Bʚ6(;~ ~NbH ~_!#XXJ$9S<ScƾEG%Ū3Z_}.o*e+D'jr \> OZ0 PEV5*++$pW쩧UٕB?g ~gI1{v3yɭOfW)a^|9-7|B|a[Y#7dKKF.!F}_'G\:`_4YPȢ% q%46~1n=E^KĜRzb 8&SK [fd b.Y#N=Ԉ@fKa3Dac={K~16˨/ >ۜX5!P7^tx0pjqZ_> FPFY_k)I!8ϼVjdq$+ 4543L qp hEbVVW\7b#̽/i*O|(`/lEX]AY밗Nk}8{]J:] ic ;@XN(% 3_`Xi!cZ9k/2uFMkEKUCnYB-D: RsQ-a( 'a_6j奥фqfZDžد/ڀ@ h`me:/(л;cYkd͸p Yc"W C7i h 8Xvt(\_,r)._bqA} M5U!*dhXE[t|ւSq0WZtGW9AEZeo~DLg%!Web q"iƇ3׫ĪqxPA (@yO(Q%wfkjQ9*OOHkIx`$>EKdcJ>[&{;fۼX''\iuM\D gx\mDrD}Fڨtg\ }Y[ҚL.=wŵD5Jcd'Zi`%$)</VW {yOVuX"Uck[-ȳ"+4[V 5I=SUu1kEI`ueq`{HziYk )S+Вe)Z ~b;},r5lM,;gzi@4J*:'Y/ԑZ2!$E Ogz-&VPVyHCe `ys2lt|VuCvtMܼXMRc:b >}k}:m>Ͻsl}Sd1r4sQ[MRbKR\$GtA%:KAoPQ{9REt~)![A7.tY/[Ao9/F༠-)WnfKAok3cpjr 1YꭜK9o?MNQIK4]9ߪ98oTM]v w|CL5oIoռdTs'W_R.C5om_7/ W9h~^yPcj61K|B/ ob%MS&Ye) ]$ =6;2:A !iD̈́*ߤsBh  a,k|3YEhk,̮yѼ,R)u[J$T\Rp6;Aすh&6YS0b۬s& 8=՘Eu +suWn4+3JqkgH rѼWQq*Tn vL=oX 9rLq+u&tbSEx.'Ќ~&"]' P\NG!b̸Q&Y:Oݫܵ[$嵵1k,ŬsiD)fʑMDZei&00iʟ}r"A\( 0iR 46el&հIY$P!hKA=ZUzɰ0`u$h_,n1](Vhxz`u`!P1hZWJ. 78exTYMRYD-Ԉ&ՖJ*i51b@YDA"1Voq7 8ߨ9ѯIVY4F\1K2ߊّJ<ƦAP},Dar6jJG1uұ(m6 |A Ox>D0Hȕc#Fhi!&ѫ R!ƒ)0ⅶw-=U#Ţ\ӤSAdJ!RV:ea^?/q+ع\\L ']pXAcwcDA!@>˕^`@ t2-pc4|k@=_T~ze.Vbh- (9хl: ӑn<K3lOf6:k'ͰPHp@ǠxsJʵya ϵeMUe+-D+`"3/B!]emV2ynA}QKlBTE^D \YBjZg> D,i Eߐ!k8%eb&P^ ~:#*\x>Dz|Ī%ʳE!\Djgy >{G!:kVǪ:61%mo"s{;`&Ö3/`&y(i77=X6D>@dI7`=w= i b#Ƹ\ 4!QCЊXP .脪ԋ)E= 7R/2Xvs=vV0Tc;&Z gYn v?#BzXgN!F92(`r4" m[&>BQ9<7e!`P""}NaRt1i|fpCrW7S d)-Ϗ\xpyt*9(ݝ."햩lD{c/V/rd9T4"c LJeסNd00* 2/Dg .IN(6O'mRy_ZO8-)LƙLݶ:EEcjzfVvJ"y|V!ka-̨>(6 43W))"M˸OceϦ"AԂ=\gKRpa!?8\JQ2<' {Ďfhx*ڇDz 0RmܐMC:PMʂkfhRm3^P~S'P.AZR'|aӄf@)YxrxyS熀d6#uX'ǃ ʭ~Eh-]&v1!lj؛κXo>ϔYy(`@#yJj}aWbPtOȌZEeH2%7Bx09ihtj"kڳ'hF?l#f>SF?z&n4"{Gz?S9;+__T#fZq$.ߨQl~Ün;em~ÌnXl~ _n򃉟?K3:R\bagfoa$?',~S7ooCGs}m Umʉgy|dcƗ-G{UzS|oCR^"2 D=JyQ;aV||k^U~sDE"3Q~nUcN~b?@ %:˻ouVYu2h6w!;[8fhhfk S6?%(n\ⷎzT7I@S*ѼT~.C;&w1f0v{O]V ks n l"fWW;TZ^>AdA6^\e]IVg.AFXa5c ztt9_dbehyu2O=޼Ȱ}w_T̽ԴgdAޘUV,r]5 sP%h[@lt&w^EegW1«DߘS ewACr5w븮%hDKkٮ,L]M|Z~D8_dƈu-}YU2<".2#ǎhUj^.08aI4..Ӏ.`dl &LLzP:׮Yقu `KoN)rCxP#2cgS/ܝmdm(vtAP{S0 'Uڀ9"t."vd>uƭ^R̙rAiq+\tmvAǽYq~]f!<_,Dq4 v 툃$Y&a^{cb`y.][!؞~eCNZ@]:Mw˼rLPSe(&~ȰĶHn^ˬhbo~xv Tх/A+gt3:c\/PU>Vws[4/@P&Ϩ͐W2B\A3={\ Tp*h2@ݍ !DP)s,]wY2Wl?g0)&d(f9ĜjAax Ї9X OV/io&::.M Ų]$U̴ǔ2*smv0% g۔˰, SzV 5m(!BC쒶BW8-qy4=iV cq&PvV+  `Ј eثR1,z`4WS*L h|*f2Fėײc_gҦ /4? $/qukEK*gn]bi۷lEM&e'E|(=u`dVi̳&-;oe 9B}|Bl"/bXN@6`un$۠2S(D;%sIVh&;<@0e)U6grt%@JQ<%7rlș&R/'DrRG(ďʓDI:dLgy0!RF>U7O/lCMfBw3;& fq2X|-;Y0G SgUɞC/o+vf+NNiE}B{ Wlڊu[uL^ Rp+ x(!ZT{K.4hSn@}T]צ*#'8ӵ417+[漸 Uy\: q]87?oƕl&Vt>#u!֋)DI7p9y-'=' pU>5I{=+7]pZf/orlD]nwb:,!]&;sFuP!>PO <(]12kّ K*O[O8N@!EM p-lo!^ jګ 1& AΉo6hXE7TRin0QgK7QH1U]cR{T[jW- R싡mN*sy0`|{}PrPh4 1(flbw86Zh^2m06d CɴR6\ ҄23D48 /2*4^9_`kTLGؙ*y#4,}ZA{ҵuF&i}C/,~c@7$zA) lBġ. MDKKҘކZe|?VA9\JC {YWXՐ]jl&XҘ^e5rerj}h~?VP7;K;!gb*\GנŚD⸷"C&:۷6D[ʌ\eK6Va)H_ R1"*.݁,x37fN! ."rD,#jC˨+uN%:G1YA8 >nOX8݁41qiL!^\2(jԋoV+ZTEny 11Xp|&u =xYa ]m( Yg"k;QsЩy]&^W5(;OuQm=l~j˵ٸĤf5\E^jvGXqNE i$/;ˑ'5_?I T$yȫ01qXUV*O\- (<4k![lU[w'X&.Yr:j:иn ǼPYNDn#!2 +8HuVfY )rR=(S|lhigߐP:(I ǃhWYY!0Y1~I>!m|Z8 rzZ ӒlndIz ҂̬M2x!,6)J{-֟@MJU (#6Py*"Π")2,ICf5L1jA`۸/bM)]/օ%-3&m^mQIO .NRKfUyCdR8nm/!O2 te*5f|BAS. 5FvLKp=\-NgoPjl'r![,NU{6dH C!Mh"kQtA%D3hځ1˜v^AnlBr!rJRRpJ'ѡ/C᳗Ͷy}MutLGRwdSCF \,Ζl"c7)yHkX-YGx( c0"g<Q#BC#;Byq7s5t6t1]T\bg uSy"xlpr6e*r~Tؗf_6O5QdD) 95\Eׅ7 Ok#T/F0]S9'' #Té'b|!4Ȯ>d *(NX9®/8M d䍖aPIu CuWsETɼh0irrFE\cof۰/HsL~v 5ldlN?;|d!E;emx>81u^_d=4:8W TYs7ؐ5l7:8FF?8W&7?5jZt[2f԰csElz5SC_:6S h |Axl^b9ͫL96ѱy,f%x$O *:4s}h&sh^hҡ[$܇ireRo 4C*EVJ!scxsI׳gAmu/bA6{qlEԷ9vckME̱ܥ{nݐVxŖ+*HU2ͼ2,e ԫlL IJ)*ҋf*x]_ |1$M S"m˚Qaf2e 8ܱBRn_3KX- \LFſ"S;|==|faC2χk=y{Pl1Q ]9elșjֳa_ [1޵>!RG8*3rrX"pӱRjx>Li}܆L#r~G#mibQ*H~XqO].~.70[o ~4RWf ~ A\GW8C*\ocmroPIEwѿ D FvqDHM.n"я2^c!9o<yLcT/&]!?C͋ 3@6;#DkdumW-5.{y$Iܐq  Sa{TyM A4Iͪc*OuBxݺ!O@4ӂppԅ9A7[K0'׮*v_ +;Ebj~!fn:Quҧv1{|84'WLG`yM#] I{ˊo; Be$BKm4ǽZ쥑6բLdf +oTD 0"h sq"+Dnt*閔1|>7g'&4(4䮨ƴ%> -4(fQusikxTbց䑿 tjۃdzlkhژ#9d&,0bd%Dr"Rm HjK1{=2iERsҒ~>.yi;N{_laXJȗze݂d~DPɉlO\-ICgХ i/5^ԋ `k}Bqq~Ul< .a4$52[D6oR9s5DV"2jAxk!Ն[05gw!J>Bg4>Êl̜DOZڋR4,y &'),;nL! /vy,wA4+ 3hҝd$@l9K9d^4 Kt0~[1;{v7>j :cKimנ`;(9=Y:ka܌X)KYո˖E+*C̹;~gV' |xG?Q^5A~séF=ҐHqf`NMbގ XΨ^ !b%FN6 teO-Q R4ӏK.aϺxqM'4ܗv)>YCO!KrѢZ9sV#v;K!9kh]XjCvK'䪕ݲAp'~ !eN &^"49g L8Q"vޡ:dɞ'd(jr֖/oV1:Z@_{IQgUOF K,6t Ck>|>֘ţq0fw@h۳5*}s8ΜLv^ <Ł6/FUull:H~gjLQn3dD ;<3h6q 1 BM+k}@l~ߗN [Z vyW*NJ̗H 2nsdwrwØN~"5ږd9dX3YWaB* D0R }x JʢD0-͡r|TKb!7§i3HrUc 괾Ud IF\S&.ԪP衞'jة\Wdk_ D9z4z,nTi@A}RD J($!tX3$1*Ɖr6d AA7HSdSEa[8rdbd@;XE&y*23\ܚ:S(쑗AW!]MVpQFӁ~Cz;_ Wi_0.4fPi~ Uf;}Mi :o+Te %jٹ"fxBWF!@y>12/k;$ҬkI8+ЧAYò#/2 b(\Ȅ_Vc؜QMF Y!aBM.]|({j> FOyswr{DUWJ5/{N(K|aGcUDr1͜z1'86UzT B/Er7kT\}69/P&G݇{jw'!K۾ Vy$9M]GHG`<{qD"Lbil붨ձ8u-6~H:ƢslÝ xNh033 cbnAF_rM寠^N@h[:>Ť(6m}wLB8sVaܛ^C4; E&f(̭Xlk \tLfs*~%< YuugN.AtEA2#4L}iHkE8]穊L,;q|fᐜx . nqp x!nL?ׂ,kf>vٚ Y_hؐDL*j靰 ZNQ예'y!f4M = VlTc36'ΕhriY# [ 4W iRn5Ly7~{A,~-"6E,q+]t.)9І3*$Z];2Z |"zʹRZ@<"JSbw(1BJ|_¬ߘ{̓smr_4A VpXbo5/hc|nJ뛒8">d۳8yavzYIMR.Hc85yY5뫫_#*u RdZߠK盢w osٰtOL2="'exj W->Z|53[hKTұTd ,[b<4%j)4)Al v /J܆㵞2V^ Iy YWw@nI5S滷1Y-_RqaΎ[ &=<ٴ@I`!g* t=Z5#)L2n ˨9| &[E"7耉HG2E (!:زƬ[ʊ2Q2$MK臮E^ lVa(w~-CYM~4$=zp:5ғZZ9F ؐ-1uQ}M 0 n86YHB^ebm,yya A}⓴6 M6HFs)(p2n|r~AD+\څRrkYƒq6)1-cL6l'DKRȇś/pY0MT~e23ٿEdž-YҪÍ)P=/W9lA.0A.|BI 4.deX1$s4v5Й}{]K+/ >SP1l|JOK˨0jb[&HrTq\ͨRoEVr搭fvpJnr1iDp%m;dk}BZ|)nX3υ} "CAjX>g .n3k4k('*+zvy٫٫ ۙ[ZE j#Oȡ$ Lor6d֫ZߏjW5fky}ՄPRBb4 YB_Uηf' jO/*zO,S+$5ߜ4^z}Җ0>OHDW܆s{dlB<TqaV[_tJv[DeX0bE, l͝' BX|R5۲A*ţ)1(7JB9_j F |I n#l!#Xk())j ̻x 7d`ސ̛\z$&{xn9],i|cReG@rm"3`zI;y osd(Q;LܧYqVePIEAeܸk垰U6=a IImwl+-L.WwHzO I]a$6i=E6r8q|a X0"ڝaTr9 ;ewarO#e=: [:ME´0Et1~v2wU~iܔ7fm|@OA-@3`Q7Ll.3LO CHz$gs$ sEſ2`?n>̌ɾAzq>MB&GCo# la AZ47L fn).98`8kXpS%gsG8=!W-WZ!J)ߛ^v;nG:*}NIy#gRs:kJx~r Ibu Q=((cw^M.QBPxQ9hn)ko66Tzcl֔2׷Tk.-!9͒~ZKg#+!>T*M_IJ+<cNYwJYzKK ܛt6ˋ)[|KL;XE zwiW!CGvA3<SvErL&Q[,PnXP9禘eTT6Mu\OnFn5*8X!K C50^ arYOSo28ytPC|\J pJSTާ$!5l.8Ꮾ7n AYGO!CTp ]$=6p|ABIsl1t"ǡMcWij<!$4J'I6 )nN^nYoߞփl;: DѺ!=D{jOB?zeMg]^)Q4RRNclSed;`M@-z]ջv8h ߃B.~s\Zѳx'\jz\Ԋtcf晛^,z6ʸg+@g +y͟@d(\ܳ2z's܏qO4{.4ݖMɆl ^J}vV>QOJ,-㳥=Rt@tgH du6EoI8Pb+6S %>21|hEb="zd cE/B ʵqwyO9}l L;kt>'.dz8{iPLMqg]k,E%,@&} hEupGk" +n'@V0x۰qBZz%E;u\)&5R0HM+ o][(N% UЍiW9W?KіA㾈QTe6AsbV8 B2gj;ݿY@O0RPq52 Yը.0ī̹lg%eᄕ#{A4Rt7ܴ>vAkI0xNg&e0Mq~ F !V ;C:Ծvw3@^y-@sOkU>Ve'nuxua²گYP6kSh:HKG/jհ> ! S] E_̄/鶋mg (7J/xnuAf ;]Pݓ@r?rx9~vOQ>!gtVɵ=~&6^>J0 I.uQ(lܢ ')-28tғ` :֕ @>!cd/ pArZFtWfSNvY@FS^҉G*s'1Q.Dy_9.&+GđMh{9Ȅ#c`Wz5 qrF絜7izW /A;o=TUy3*b{i!R%)6Ll쀾6ːp;6! x,/֭u &_Uu gRsT.&p($5e zOT<c;9d[e$|Qe܏9F=@h UoYn)sA6UD^Ǧ6=:MͦwhS6=+t CF:=LB͢ݨ$4i#QEsQe[6]VjvoۦTZ$dÈe{tlzBilz Ƕ衄12E@̢*}[Pھs *iPq?yjR_4P$xDui[6lz" &0s4:F=@"ˍz"rQrJ[)qm\Mݦw MmbP0&IMPQ?EN?_V[+yXͶ,{10 v8_Bƒ0GI,k01iS_z1~WYY*TCP9IHݦfmGQny\ cB*>m( < g&Ǎ+`S<~ǟkD\!Ni]UQ6Nze;K׬aׅq'jh\U NKs8eD2 *!>.<{H>ZA 1kvC\XQ HdA򽐹Sp |!Tni"V9E i@/oX%6oa{Gmyg@| \8s}$PԠD.lYTňW9ǜA!!([`k P@0 $M xG: *jj8\ynWY+ ;*<\<۶NCi}W~iŵЭ5땰Tܼ&p[/pMT%5{|C-Na=Ƚ"6k0|ѣa*g@66B6ʡea!^ H @ΈVD'RpކQՌmPjTJt>Q(#/g 56G#~qL82GƱˌpڤ7`qW* 45 8wf+r10Y| /Ry?y(,!i=z Ec?|gR#=e/3*/J wM0,ՀFd'(@ZuwS| {Mf?|-C V $G$F O$?IQ`rt6%5l ((C7 ':FcC~,wsA:8d(PuXe;v|^P 9dd9t~<{/-*rrG5>&e_F@w:Y#y"t{3ibȉN SȈKV^5zuEm( kQTzux&TkLLvQ`Bas6;ΥM7 '.ChZI6v.ڙx]*[dd@i| n8sas3.PҼ33aa볆&Ҋ!lNԛȸE&i Hq(\g,̚Bk|!L!!`BRY|g۰I v`4gU.LuٿhJ"CqA,FR$Xv ,>(n(UV[*>!TYqȘ삑Љze*ki皺 R ;ݸR]0J)bь9c r8+t!dBs[쓩'Rwb84_ܧPm4%"m 碘'd!=Tn5qޖ04}ixvY8L| .(DF8쯩Lk=TA6l"HUӈ@|aZ~a>!9@ " 9ܐķ'H$u=TL0Qh)urDg~ cJJUb <8Q-!Ѐ4py,P RB LL!&bbn0q+]9,Ģ SԈz-'UT @65v>!H`1D`>XhMK j>ZmATon96?nq?.K]ލԔEOA+3*Ɇd&S/J;.׋, Xu=J^beҙJ+o<6/ˢOwmQ}j: >ʉxNNaWx0sgRо1jmZ|}4Z18F$1eF7[8048$1\fXj]pPMVPr; |gii;8ifU/T0M6EjQa&"]?$2~yB wٵ*!Yt;5r&w@4/h8`1DZSOLH/M"gCޑ@F I'ӎ7ҍßS/r qL+ pKNk5 t2T2RbciQGQZ6kؼ#U^M=k35{e9"JT?$CxB y6EЎȀLRSrr2f{_oH_~@Fy? /H#̟cdLvĦ@:v@f~cIDMXQ(J^>萶k>T:c (}b0!7) dLNt ,2 2髙.@a6 ;_Ef%@:CB: c".Sq#uK逬P6D: +]R_>3)љNef\Za7gʘjr 7pYl'z,BqNEl ln$^~Lc{E"۫;$zn{ݐK{m:|B@!%nFQޒX.*_^A+1H+idJMr SV\+ }EC;i*JEmTFH9pdzԇ!khIYPY;r r!!-Uk%Ӯ@i{RcK~}0mFJ܃;(b"K52gy+{y9P̊xIC,&d<`^ '*[ Zid1'9;5'xw= /n"ͫYO陼0…}a߇ {%#r}}(aq ތM#0-쁘~%ԅ#J5\ ^>!.ی .t}UGEvt,<mNC^*Nc.T.%&,.k~{'"&vln=m{-& ϙIќ/W|l I%D~䧶B˜( D'ڽlܐZ77Q>YeӻeqA rlDY wȅh%"tRrf {Ri>GT&qA`$i _@X (ț+?1ԅ^'4FsEK1 (GWk,Ӽ,ŭPxI6YZKO>1 gi@l=,r blPcb{oR7bF~1&~Y/*G)]|hLbxԸE̷҆|6Ƞ3@e*Ƭ#g EtQ=ZA,“ bX?gm62m-o*u1D٬J, mzI$3b:h5:f|GR_U⽕r=\q3Uv?`4ŵ a)nB.n>!! -E4' 9dSVV@(^I.2W4st$FЍkdƉ|9;|!.i> Gׄ3$f{КE>HtN̤p4&Ss"ӔN酶SfKm 4zmNC :_8t85E~V 5 p?5Dx..L 6.m׏Оԃ _M0xTe/w9szJA΄cm0p{X\"Oi#iyz4mV`ЈU$]O8l ,+8<[Mari AT\)!Ew1iC"Š<`h\q&ɒ츲"51vFro WK "?-SU44rt4A@ ti_fq]wˑvX ҴwܲT O2KQB}-!%>в9g3ZM'[1G84 zD hU|nkOZҕNTd;([rP B-KVɖ´O>wk]IM{Oņ [Ҧ{Ù@bΦ@/nS3G:mEPf@*֧DCir'xIɎlcRWhl"! ,ySTj>}D Ȥ[ 2b3@ۭMQO܈~ޥVNbʏu.F F^ς&|v3֮ pSgpxY]tVNqYKpYǫHiZ0X`F̡AĶs(iu@B~}α(IYGy'=qi.Wԣg9vNAѵYE\ ~'6A[T9Z wy zlQ%O+W"7…&od k2w}D9 `=E6es7+bJpn&_#)k3dfؤc Z)q4LrRI7):wNJEPK&<ʍ١Э%[ה]Pl/As?Ӄ.Ϣ~xă§JHw 8bq#8Llq3q SVs#1}A|# " Q0ښa7Nq9TD::VCA0U.G-BZ v8bnmhnC- nPzq1Z q u i/]?Q"W| =jzaz?Bбr\f/ԴMh78G8DG4čegDCeh [O "ZHѷ wOI_}Sbk%E[k1,Qc[ rbik[/lEZ빵2- 1mo*۹(:[Wd,'z=ڏNm7{V^eyqkGT@7 Ƌ^{ 2_ r+'! zGF#L/o^I^b֬o0~ӏ^/uj^/y"[ɀ_TE^#nQ.*?⦾/#.8w(Q[|![FGWo-"TCFxBn#%!F!f%AE *"b4!F#ه:.o꿉>1B!cl|x*\Q>=̟!C̙V$LA5 m&:;An?_M =>Bg=ޛeր,UeۑRmU(H[#"v: 6i#3d?uE6lcoVibb--geHј.raMxZqHfpKԐ:g [g]KUuPR }Pz\J&,~,%0ThÙgE-9gϸ͈F[[mQO?҃ >pdycy_ ZDz$CVoP}ѵWA{EU<,Z(,OapN7zcL#a'DQŐܡ$g}]0?UM*p]+CimiLe A,vhs >/xJ>- (i3*H@õc#7h=,ׯQ;.̩2.B &L/HdUQ@/9=FXv擺[kmPvѨG]Gòx[FK:5SK;VQzٍh!!] nNeY/G=5C|\ZIě̩b/LDsTT~Pޝԍ xtjQ$r|e6Q}M9Wɢ TJk,uAZzP{NM E *$*W~r̆뛂j~UGQ>r|s_Pu`_}SǓ"5F/"%nEmK9g̋YJ IQBQ8dou &.ʧ=:+WSPqNʏ?%k9(Hc}kUn*:'닯GJE5}@0.tht @:z(E6Z<oL;q~!NEq,괸g`@?` J^rno;} M50 'gx1Dg@vG#7^c ~i+nNo)nNi"ƕA,ӴН`[ z4{+f6 hR²2臂ʟP [;"D~! V< ]]i' g~ԂLT)@O%wZņ/l*PGിsHWq56n[1?e^|`l/ym@ʛbNC?q3񑣋}w6ik/D)]E7Rٝ"4dA7lCm_ "}N(@.OxaXnmuaMMAvq@P_niP ~a"w  ;QcٜQin7~})m Vouzlt9u,NU!n˼ϴY  Gtn ኱q p:>&_732aNxseM=(ĐSO&;P^'`cΟ)G9ůuNϭMFck^07_[<}5Ab,mӫ15X*4t]pk{0ͣ<ˡs%\7Xxq`knF~0L[,[C9S{UooVM5DtsڗV,F|mw6s4kʱ}p8yZ%LެsK!_yS#ҠCIroJ:e/Z3)UOS񌶞i<)4,MAZ Рh+!kxtl.}('o}wvm<7gAҺ/0&Om s|K]'&K.sФ28!Ls& rJ0\a)ɺ3='~RAM7}&^tl t@h:A0/Z9EV6Z4S](Ya(AX\g@m?kB0A*p% <  yKAi'݂`0A7o lD7T& oGB4(u,} "APª 9@69@+;! tJ AM|]A=o@_%uoJdxvzo@xz\'hVδlEϕpW 7mhnhj ,} " D Bx mOܼNQnHuOAfqA1A'W8<88ӶЁ88(8Ɖ8<88(~wGM4J_}Si/,QmS|QqP @ρ0K,U10[)ܞ9d IbL .'GX J-%mBkϮs{[9llfR,ǒ/4 l﫞\ (TNJgd/؞j~A 8 rir tg1A-Cc^tP`x(D@16b AmQзC3qKԁA0A= h r@}1ƙs_w@>rC0ƀO+#]r+@ :2wH[7[?>8 lK^n |_=]pw A*aF@ZcSX- )xTRz(wD4F>h1bwMm%O$zo`o9 ofKO1_@A-Ntx7`^7E d!PF_'l}&پ#`pA0ACl6nqк`s!o r~%JQNHYKY7~~mVl%Wߔ+٥ϒENI(8`;!mJiF*ޙ\Ctr̈,r? M91c-WN]PDNZlu`f:%rup0?PJ:e-d7A}KNl}vԁNI1^A' UQr;3L4.{#,nL0^a ~ WM֟{*NoQE;P8xzR>g<>8)0I >8w'r oWd4JcUZ训&i9>7+l+ho- V f̌كWnBjR=].R&;j]&KZ"Zn xfSYF)-*i?k4kYWLrj&%`C-}lY胬.Σ7ܓo;#Gr>{JiWƭHx:`®zr]uЉաVP6GAOיf^rZLMϊC Mչk C0 >s'}2Tp7c;)e}A)bbxt\8m!)VVԺ=3Oo/Ŵk?[]VC+\,|YQZW ტ֫})էa1Me39%Nr`J>]W[:WWB鸺n8为&ḺN s(^2ݓ.pS6sXs\Ha@Cqw[$:)r\]u'mMq2OZ~6qӋn䡬m30XO?봸涺RO/'[AH[$uuPuS@:Sjqucg^POw ȧ/X~;}(VV{V鶺޷EWpAq4Kn6n9%Vi)u/Xkӱuվ:>en+_ݦLH9`A为jGquҞ+Bt\]ݧghGDզ9t] s'8::(Ik6\Mͱ|&zX&Byu1W鼚lwF("ݳ.H]w_9v(uTǢRPT~(gy~ vpoSro (Yr ^Wiu+QKxҗ2?44q$d:1<鵎DvHqwƤ]Cq  rtE:'㒡+)rE c{XI~/柯=}=佌z99D S:joy`$N9M뽲Hm'xɩ=0wNeWd{D=  '8Zcj.\ۥ(c]Y~sVp)oӝI+u OӸMP^ZٷZrz g$mԡF_ӚA9Ei-b(4ʬŜX^=5٤z,?gUN]}2k{Sr\E#}ٓW~h ,xB(ЃD }X3GQgp5s:ZR+f;d!(K/GqF@z}3S5#ʋp'VFUXQX~xLf0AXZ+_ZX~ZU\YתAq[#/z,DH+CnxcbE:b9˲ϔWߔ\nϴ.?}Q)}S2JM9*gE-~W3f{7zu޺uOBfάCk~n1ꌛl-/ߔnӚXv[PՈn.':)oʨN9*9(c wFmc2}Ҋ,g1s۰U3737(980?QU}ϏpJ>R*xn? 2^JtNHVPy j[jUבe;RixoqL], ߾*",71S o17e-+öw@mZ=%.A3a1Z}4$Xana<@ZNj3p3a7'Lm_{?,̀cJ#eJ,3D\S(0A%.SdžpVϴ t[8be#TØm&T:OIڰDЗ=yPt0IdxT m|14 #8n;@bqOr,G+盒1M|/`YӔ)VmOV*Vj׋r3,d}b!ۤ'xncRNPaXl[ďXP2FC CMi ~!kP"}N(p ʔ5o0|N{O:c0 pl m6>f14ǾĶ5Ֆ7(taT O7Z"G>ۃ?V9עb-VL<$f =$}zLzvE?=a/*:s>"3ߓ;t#TBNSۇ)yq/ 9|Y )WR4JBP_}S)3M r2PP*Q]k܀ګEɖW,"d-rJkW#Ӎ~V8<=$|z +aMnFzBpbV~1hQ:7 hdr4CZR*nLg_ @÷YcSpIc 7a ۚtI4~9,[Пhf2f 3MiY;GAeeb\tj&4|nD]ǁ*KkȡWv6"dba2 FO,&X]@O3t9]]` hvf'bZ0t$^l!5Z55**U̗>یto-)tɐ.Je314[Qdxq&C5i`0y?8ok"rVYJ˟#a*W ԆYbU[:S;.t15"2-Y1kmzDC*l&[)9nmB3UT%wk͑c RMvڮgݤ4:MʙSЍBifH}k_UHuZY{QX|@/ꢄA4bZiBb[*I$V<[bmDWlf_Ķw%?fQGFӪÚb@0R4|/ 9>1-* ` ;j]Z8\Cat@^Ǿ_L͹{ȷ@l׶Vӱp䙣XkL]c0pKn3 1nF3z=&[e"$ o, z򀸐7!TY+g`\xBVM/qXy b ;bZY\?iCq.7`ҝ \4Ӫ%D=P43ӉKCG˓CvD^nnb.$|iM >[>#Z/%2m{tH(~ -LUFxHrؗ*ԃxTPfz[x2EnSp@SHk`BQn̠x:a1㾭K<-KH: r! |}OQu!q~̈́nWۯ!AB3k^(*/&AK.r;|.mc~lSED2Zl}u)"׫E_Sjձ  G0>s΋#S_?mw92qm[P \4xy{ƍ.㋟(Xl!yNhm ΍ l0=i&o0_{PȽ:FJNOEV+MboskiY@VoZdjFFXU(Xl/Za 2Zi Ի6l K1a?gҾUwBS7g6aܚ1@ԘoR0<;*uvfl/4_ ~z[|o@:덺t0r(/c6Hc:EU'xY8BGNlߚq´9&(@5zTmn)W)̇EtibC VS4tpwSaEyq7a,̏;}x/ يvL5.뵭J.󓕑56\Nx-( @o \z%j.[~R9E7{@u7e)Jw5f M _u@M`7mʛv)mPLC t^~Jq&uXۭZ|y%\jE&Z+#~ QM'*٥15Clru"oH-GO^Þ#Lj8FwhG+/<;'oC;ԡ$}2==s[>;7I&.~[wz|>nțrd)-%T).)'غsrzQbt/Yd(\0 SMnÖcTRsQ+˹C;wqv _;esiYՈ+Ei6szLrc wc Qn)qXͼ\h% :$h")E k֥x쭱+-t}Sȁ;X3im-0UiG.&9o5rH~<::G/Jc8l?3iI}Rb>Y*VA2jefh i'fH_Z5N9y5c,mY:йa!Tiaxj0]Zl.y[b Q=}9]f`ח Žsa|TeA!JRG;%e.gJ 6S?P+nO*ߔha|%9# 9#.U3 WSfWS/&{I8.UGCFHB I⦘l7G,> L)G!jNABS֋BDTmi=L]f2MɯfR|dzeoaNɕK?Sb47%GoBcZ||XLo%ūť{)BP:P2%նH= YKsH'ŧQI`AkD )} !Yn~z#mKfzc %F:p|V9)AC_A? ae7rс%PF(K^#\lԚ KJ2fEP_EUsiQ͡Ov6dsEvќDshGl[+$ĢO$9:OW# ntP&,Owy<:U&JKMWT$d |p4SH;d\^ B6dY,M5L6q[*ȡk|0/-s5z.-蘫;`-HT'Nb]rI Ĥ8ACK@FK? M+CQpbØa=Xd(3XgLe2X\-X\|!xD:4GX}(xVY&z|X\-BKUZ5Lr7(Xؓ}̋ݡ\>KAHW68ab%{X>.č0:қt96گeɇzlWb!Zn2$ۮ߮eX E#JyvEjXcr? ,V(ij&کϝZ & qQ(NcVD H Q@sbF?2&DMαM@JnSܢ m4ұM۴tsMQ #6-p]s_]Zn]ZnHMZTBۤx)7iY6)eJ䫞f#޹CaBجoXv(Z]C?vvԴ*)~ Z/JIT|Ǔ~![ ;Kgո]-(CDsv7Ds+kN$9*P75: Wq2li? @&" QB:]r) Ul 4#%Tb}_Ez7Љ1ޑ@mhM(n']`}2㥈!4!&tϜIze~# Pկ 4z<4>UmDzkɻ@?U_}>9/?'Cy֧Oejoa%D#JSQ n9gG,)W5qKm56^1zqڑcnPcM[[83g:42)jq6HFmsA |'5A& >Cӳi~iF, X@s a5$Q64[Hc͚!P`/̀7JaZgdtksm0.K 5VZxD0ҰM%4^^-: Yǻ1at0LT#]AK }Jh{l EQ]ˈ,! 6\~]#E3ԍ/_>Aa{L/sE 4Dh=#(#Vz7εlLdc4gJUo9Pլ&dA ఆ^lϩJl!/ 6Qd&}լ#EuzJSjF2.644jܴziTkAʞى2&Riw6dRUo@Oe`Egڰ <6{;sa/ڡomp7. :}6)k&.7P.2BoJ|׫dQΒ] &jo:}P[C0 $yxsz̠e΄~[ u%!#2,Gi_.p Kx=2dZL𚑟ˎi+ZL̼ ǀr]Q3B-_cҶٳFO^4aﶄB<7E.e⎇eV1.b'/=0]Ntq5=Qk)Ezv'(\)Ml6.{5\[ڭVo_3~QoRtl7 e+[rvG.8q+VD),*y:P$4iDgHD5%y6OPĽatoE2g?9Yl%1}`zߙ IB}Yo"0f?M%f5=^`ZAOY$T Pv񝨏GT>KM7Pėx;V#7H]oCPW.]|=HpqhѫRIQ=N鰾Y]и ?~?i-ŧM Ђt~%F+WN " ").0Wߔ!`ՒL=(k,?R7E~P/Dg`G -l-Wxvղ۽ᷰƯ_WfεR>qBK'N>%~N42Y6QCt :JEOل#-GdCOcK 7 t :^Nl|,W,,2,{qͬUlU C`}`JZzoeAF !)`#m~sw:-K'Yu9`IjB_ws)Ǚ7m =S1:߹^D_˸izcG7]i$ $ߪ|{k$AHӫ߃\+8|͎֛%>6傦a^c圊#Jqg㸡' ,}Kx(մ)rtۨ.86pr)xxN;qY5~Av_m~G07o9ZQW7`[Vඵ.abAkGGN.“୯ӹ:vk_Sw9gƄZl;ׅ{]6\PmAa;)8Z9t^JyQ;>4r=Ȏ`8' 0$%: Θ?S _}SE)q⍄B=C|͋?C.xR"/9(ᣞbHy&ouiv"#!s40:d2AQz)\!mLMko)!-Vͭ5stS 2v뭐1'aab&(/B/G=F/z8]C|y4{īC`1 U.j^C7[ ˞pi?\Rpp}zႵ1lAF5D!%:Xhny`%ȗkIF7i\ȡ@~Sbe7:WqԂֹR=8Vbk*L.*ض˯1~asf4*Xa.J*{ O;)#s̷o )n;#%-ho4љNǮEc0vV 4r/ۅԥzb tYV8cFz,nŤ-ti*Q%7^nݎ E7vxAr|[4Eن*3J(϶5)xI YR̓W`׹D-TasgEX戻*FIg=G:z.񽜍G1Hh{[^"֓\IY8O|P,,ӑv!"(E/)~_MNR &ӈ_,IǽM~ ~lOK3#"B㾝X?%Q.Apm(}5C^הo03m@l_斨1?b6\*Cڼh7~Z߃"R"~@k3恬rXcS`WXF36މE6G [wxfm Ԧm;jDdr؊Ox`f 'bMnv@\m0̕'u?,y!bw-$U swȧwGm<:-n0-Wqq+%E1i$k{NXVD.&edQ9Nz(-;@X&[By\Lɱ `ם`X%0{1v\Zv9Kitd(,VXJ6rs.z8t`$$^zHxL! =z҅հXN4V0<˜bnaK.s7M+ vWk f "$Ȓf=uO&p>R$$!J@$ؤ@RY<t3P̀cj,of":j& 0LTkkfwNf+⚙߇f~ˡV)f& f&J0Lokf1褐bDBYj7(ynΘ?RFSt )M.-!mz .Mt߲/e$ e?#( t/W֢BD7(&|218%Qfɼ.Fgߖ' '@vo QtO(>K?)8`(l.Mzvv;j0o Ye wftyJ?lV{`4:,VPk!]hO?WBi}c5\vo)arȺmFyc7Zz71nAA<=Pw]]lE+tKaFwpXQ1=g:ۚ±dh4he'F^3MXt)a(7Lxy03JKӿӿp?LĹm0?;[|IEq=L 6fG.WҖU!-=Û4nԔƙ|Mw07CL @E0)kM?0dM_l4;'p 7G34^ y&0!f#٪)adq?&kٍaFvc7ۿp? i' @ue&4a^ƬYLtd1Oj:_yfeW6#>iF)Yt>#-hZZ`^?Pa 5et/㿉? >ߔ)YT┣ _O6}ğmxn7Q7 a<[#YQ"!fV83^reqR$Jn׿3wVyl0( b}䝌 6]0c(n{I@Ay00r:p7rӾ_Aentò>ʫ!`9 =Њ"8@4PR)MaL!)^aӢv-}=#hÒx{39l,ݞMb\r]VK7s#>dݐ.m]"F} n}`ntPʂ6qlK[>މ X/!Gmq~M9\tQsg7)$n!,˳hw4߷ktdLS=Qam~vrƱNǤgYY/6bb(FV|qNSTnfMw'ZJX7~ Ϲ-߄!y+#yc]L}"(F+S$rv9JTt#c)Fn.'UćZegexQtoh[#ץ-@svdu"Q=9j8%.ΟZG#)O͙C>)cYhkg uj蚮f-Mn !82oMt ~ Gsc1sޝw֑7xoཕx8_Yb-EbWɳJOg?=b$c1|c3b`<\ĭFw@Q"V7PfkS0 xGX`h57w (4ī %M}ֱJ23qd&zאm z}?@{`S*@<\7qL|7x cPUiD0ސ&DqUSxl@Ok&!4/m [@3H_g(y!BwDI7t­HcRp"X)vt#[庢Tp/t<)sl^da6y?}(4k`ãIDz&Yڒ*AaTXU}dT?BA $Oha.\Àcc!ЙNE" 1ĩ%K~I[ye mxRt0Փ^ICF, ]@i2xbp)J>{9 0iI|Pڥ~+4d2&ֻ%$o(WB3w)TՖ.=_3!QzZ.g>NNd 6[7| h&"NV q$QYlZIV1;Պd1Tw.dQh_~BkE%"EBюҭ(pSpMzo`2[rI?J~aer.Z^UO5X'aAǾaռ#T_y!LsXȪ >HPhA !~I:o Rq5FHW8Ŭ^ SXnFq#V؍0Z23{Ǒ㶣_WASd=5v%n+aLE27vוAWfA, <'q(bq!$rjٌ_OtNNPt!BuąahE2  =6>Pq0e6fmAzJ|A3.[8ć7 P1+(70OWSo񴖷[.>,xrp ȹREͶKʟRLT>tneNbcsh3Ӎ>+9DJH¦7 #%ڿh|M!9~th&tH1M%[_@qƸc7օV؍qCO/?4 nk?on8E(^E8 6XgLZ2ܿpycR`챹%T*z >-<6;sO"ِk vb" n “rk ^rLxP:'[+X)5`yr4QǧDbgw{¥M1Āo_ӛๅx>sNqB$fl[|)w3-D.G-xʑv,Y(ނY+l p }c+f(c+ts)BF  ΐA_;xe98sNr;?: ::ԠsYC/1W@<йa91&! JUu]{(7 RNBp{RJbiJws ag%2Mn1%-m+t%iA5 %#-NF|PJC`yr3!BB0p%IiKx8!ւXAw3t.9;ӉB1[ t3ܐ!\ A$oTf)"4t /J2[pN:喏!83y:tt,@-ь}%<&զ矯C5][8AGj82xs5U<(@a:'"nᎠfF_nJ䒼dh?ŠbsAcCKR#Go\}>tfAA$<j1_]bypM4TC扦V A“.v؉\J$0mGQIࡦ\#<1P(gWiU(8o.&'Jp,nsƁ`C`tBt*v3.y\6zIjPx9ryt6%"n \'kɳ^V7MrҡI7Ξ>Z1Qm=o /ʭm@.q{_@qmEmJ ؛LP zghMޠNuίG @_Iʀ0 WJU.Ӿd"N|o!;Dx/5y?#Axbcik|3L#뗍 `_6ЊfteAxrt ^C( }m찍 *<IYUCV֜r|ʭ'W_H9FK@,w}j'z+8ۨԬ^w-#a֎=Z˽c|Co5 CaILJ厨RԆmCgVj>Z%n:[[c5/`d/1߻j`J}l$NOE8ײ8o- C6^PʮHk`9VU²} \$t:0TqaA$.mvTv}3GL֧hV8³sCNY,߿fi||9$>F ([l'C8뜩y׼2lh#=-΃'%$AׯD9&(}4CIƑLθ!Fm-d< T\Mm1D0S~k$$8~,rd|mk"1m[a'I"wci`比Dh[dH4#wy0yvY4{45rbֱj뵎}Jyd^K߻ؚ[]&ןsQGzۉJi^%m_uF?cx~7o߻$ּƶK-0i;e^iQUL J?SMYZ6'go\ˮ#(4cGa>pw\2Zvd"V%pL?qRlK:C^ XN㧓ZeR2RJ7lu@uW1/٫i/| -cG_g^SF_{X '?H7ڇ lso7?\-qqDkE)PN{|oɲvr*7'sBxb >|&s~:)[57пk<[iqRkQ\}(cEϹUq N6$;{.`i6#u(U| ?u$ \drMPvxG$qq+o V:/~$6QU~G[mۏn%r )oJ8'%~7>zDG=?(PD/7wrqFPƒYXMa@K9Sy]etC#x~S~40QC[aRVV*3W,?KܩYnykz3\5km6hPӹ%۞`xٽ:o}1g>fW g7o b|e4m܉h}eލS4ܖ8naӴfDK:[SROcY@)DsI /HBaS{ȃMhXCuѩ{]ofu{").Yu o u$M =K#1͇JܧUm Ӏ)n!ʒJ˰h&'"W;*VҨi=z?jGwַNl[|[=yKj[dͺIqֹ*M޶'||i2c 1uJתG|wԜĮES3|i֊L/נs6icjcJJ!`(8mns`7Ѝ5ʽt$|_q@pʮs@gZC*!jXj49'(gW=knUٶ#r6kwog٘biי̅xg96VScy|,dmZmlF:g$e[JA c7cƪ.oRAswh=6glN톖t'8ۿܥ7bs$ 7Ð7 o[{a6/f3o.ɰ}A~K֖~_=Dpq/6LF9KCGN\Ъjjŵ.ލ܍CPsZoݤ:+W)oVA|#FIm~s(=ƃă,HSw ]ݾb~ }%Zd]둥>p@ ^ؙTǴugZP ꥼH2BU^dmy($"M_u4?l~bif0C4nf Zwyv*Xlt>7g۴gnFTgR×DkxkǤceﳗc_Ձrq[oVxB9BٶL?R}5SZm~W;.{֤-.־^zh<7?{9Nj)/0^(j= Ygiû߼` e:2b?>޺#sibc!~7=KalxYݵ'obk<#]w?لs|6PRR~\'IN8ɗkrWlOY\!Kyəv~sb^}} "Z &EM^^D'|F"FZ9ډ{<~>jvr,'%r[uQg*x'Ͻ ]8 !$SlX'e:7DO 1Ҥ8CBEZDž*ӣO1KNC|>GMm0hm۞-O6=jl/(\*Fu0*~c8HqĘ_)^ c1J6lCˢ,E[54۶۾ᇻ1gCgǜ9#\*+r1tGBgqnm/L5>ןϤ _HPb=1m>.@wss3WLQ+zG,7@}ؿvq7eOӭ5r1Ulb"*SVy۟9. xoӎsx)-f~@v8gy {.ƫ7.G{qZ7&wwRƱ uzqYGs7dEyԋ8jFܻ͌_afr}\5>ͫ747љ['f{ slK4ぽ|rMs<6:GW{\ڞXV⽣d-G}[y`nf œA(ۅ35ضgLM8ݜgOw^ѸYi6Md86 z9y׾s\80=']mϝKQ>>\xbjH9|UsiNoMS)Pnڂ`~hkDZd?' n?v*}[t,^$0Q`We(kXwߠ$K~ WM ]>avÔ'# 3H/JjÄ<0)bd\3/e2MA eX h=s)ٚ9[l+uCfu}R cQEMwłz)v.FFG5EL2#U[I*fu~,UFΗy :\%FȗR+ ^{g x8@twg>n]i9O  dA!6ۋM +V0)kxln6-& ٓnSa$ ñdŒhv瑳KS~?Q4h 7  RAg;`C2kcP9@L @w?hqjP:Xl̙V?WY`R|So@6l}E0v3zrKV[SV280[~f-Whe0v{7vcNζ9Y;TO]O =oY}ì5Qf/4 ac/ï26}=@es Vv}nh8Cq "`OC/Mס^J.x@Vt3sUW9)A198bP̟3͵5/>OjgC/Os&1]U)7Da}T.8.dF\'/vL֮|˗VXk*QrY#٠1*ijqOq7>Cu7 -7SVJ`FFWPn^ ulR*Ɣsmtfkl QQ;΋)9"Pv}|.% *8e[}{3x鰮\.Ϗkaʡ^Z{fQ{긶.]3fsSXzQ?_pB_uc.{V3hVMnRKNo[ o~jB23u.Q`)Z['9ƒ&")s1ؙINuro{j袵H{^c.='q 䤅@/k?)^?ozށTځ;OtB<4F3r0JQ ÌYaJ%iӚd)%" mt1j7I%4FF+<>H4{o=?e[b}q>KPmdv F-]B׻Mk 4\8QcIh0+ J,Lmz%4#VjOO|L1=VԮ8%Zw-VΖTDK>.~/QK[5T/x=pywH-wϚ.ۆ|ׇ 01e Ͽ5"C:,' ,6Ev 5axzJ:>‡/ƍCe;޻fm\OhrI_x*:F r+fﻑ*ev.w$ k^?|G}Қ{'n\KwQj8[*sc_ N.rܠeK»9yifp):=j|" ac: eR9cZ ,sj2w#5}1&m!SyufrcjД Ea= kӣ)Z6lPO@k3T>M#lfG<~%j_S.7٩-pf&s)r;mL,LOOvn4  Ji6]"5nr/q\ kژ҉x]eu]3JRl~Rf2\.]WS^PrP\oܿRd^-I[׫/ރ(K E8xC+m';+$8P'c(= e)YJ} ,Aux~2p)F&wxb0 ?Y.jOF nϫSr 4?(&EoF(HHP'.fzԯK|1Hܢ7gdmO@PM߃0!Omz_ʂ86s0` |_{ІmߦJnlҮ}Rp;ZLr=#˻tE găo88[ïTe`0QWWɰº 2m!P^/s,թ'aT | k:)hzo0/S~>r5tṇ2M\Gjԭ\TAZ{[=Weq'Wg~wq>>h5;ܟ r՚Ou5ߌh\j34 vRJۤhLPME3 IiĞj!-Ht i\ԧ {6k|y,=\O&=\PJwQZag:̭ O}B0MrM2`rIjTuqjp/ˁ.t.ZUȤ$`dŴ @ο%d-Oʵ(rvk_Cc Wa ^(Xpf!t˹Ւ:cn5'*HI)b87`U#7(ek Iw%c.1C`6];=sq}Cz 8."LJ K`r%χI;\;ixq s3iw!Co cu9w=1U?/ݖP8#V uěO&;nH얚;$vĎ}?$NAb?@H  9bf ~o 1T! âDq]RGIi PDUIx<43ScD,C >Q>Xo`))[Qw3d"Ve3l1u><܆ IA#Zn}wT)1̖L%Cw N3'>\ U: O?u*.H vș@<ŭO[LfΝpv67߲`fdbH1egWڔʸ:{eا) B# -9H).CnPrrFZT\>+ wA@2Ȝ"6l-\#=0Qf4(7c<<;r;}]5SM!pt  \6Ļ#rqbkԦSY9x8FrA)J бemJ6`#AU2+^.LAA/~T[@("椺 \trd8JOͱ:^{-<܏ %Q|0O. Vxi=sJWM6ښeN\c5 -mLSG,1jOCsVZSC}"oϯ.0c(o$ȹ mbB!)PވИ^B{\ܠCrU#pv ToḆKi˹4kh,S3U /4 @if]Γ*XAC7uHe[d wD0]Gf)X.H7Ve@`@u6,gC>o(Åׯ(<6U͠a* X "hn"[֢IHe Y̱OH潦5z\Fa, Qэ%5"&ſ"3q)_qK#P-X 6./)R"V03n$\rמ-[YjW!Z5 AńfJ;: |)Y&oI.eE-nIӪý:sتkR4+cP15T4r=z ,^ޖ<((.mrxOk öZ`eCy<PoU^pDplQS('Aoj|0񆏽ߓsDM DHn* 0 2bX-լLF]q'ыNZ4J~LWϼqX8'EPQC|#GCiM?6;5րe)²UA'+.E&;B\8i:Q+F_j%xD_NbV3 'IJ5yw#)>Ġ?j8 -W+F/ 3u2޶As>BoS!{jN!9ο_(Rč.?m KVy!sa)ͩm\azAvN/E;uj&N @':(N;{|ā۶dnNF/? ?ACRA0f3 DЏm:L.K 5ȰƘN jgnYW<2A1NG:_ʞ%$H{ƴ{xSÿM9/x9? :U^Lmh o!ыS6QԟxgCa#M>񫋕na;nbz\ Q=S$AM vSbeyh O"ڒY͆0q_Amk.#`@*&mR&hW9g)V_)oX+8ݴyKN@l--afgR150i\uPIfE5E%/TjGlHkհE"-1-4h9.M]AaO+k#]؟V7?~}djefW&_XZ>[[4j(Rٺj bs݈Vٗe)د\`Ė5#GNsxkSqWhlZ/&O`P{ Uަ QuΦTbH'-{Q: zR>f)x+/e[e"/ y粿\G41SKLG;.G_uԡs)Rw{|Nڿ,/)I]\w P? Te#pՃX~ٚ>;0W֙J3=8)຿iO1I 4ZQDscHG҆^'ESw+Q q Xiˮ(Cc4iib?]x*Ú.XW)='g5A0^ y Nd &n4'97q(*@~B}XU |nFu|V]l-<= q읎?"N&(z{̤S,w: lܒѣh?- Jq(٢V"l2Wn€N; 51ό 3A>hK9fԖ&.1V݋r!Hx8-&Ѓ cMU@(YLu@^ bD+T CY7+]@$O-j6)gzJ6i4blk_}GсbuGb 9•mm*O<0덳Aإ;_+tӏi,!z2]X}{԰1V(Z)}x)pzĉ,pg;\H<ѸQ'iQT :8[) #5L1Z5zee*phr#(6co b)N_3nPEn]Otu lGޡqDEUfAo(`xL`h4́ AT5.OͮFŠve"]OT~P5BO~(X5>P\ttU׏Ʀ {zV䌋+ra(@ ƈu)lŃCk!cG殅~DZkqoZ\^9U#fsۓvGߵpqZ&kwrZe&wmRwmWؓݼs2}乞Fk{eܴ'Hmr$OnZ4Nܴ*poڮg¦ƞJ[JybGH!;rbNiJm­d޻ {JU`;[#7*el60QyFfܨLzrgiܨjިQ}a6{"(boMHqߨ{bCAn-`QmJm-4yܹ7#}sJް{%oj@H}w.o"9%[[ju)"DF%[ o,--(J_ truc}u޳0?Œ./F|(RŁT!/x9zZd>wt 83 A>>5zɂl|1OeSvLgG|iu ܯTY>-*< \HY}_*ЯG4Sܿ,D\fNXݦ@ &%jD\Pޅp`UʠF \PAr"ΐ8)04rw{7^+'t2 <(MyKeU۵ ]_-9xHϮquζ`e4TOMR:│wF3W7F7[14륊ki}0!S*U.TNLX.rb2ZdWӀEi£ϣPrIbK:)c5L$h~N)\!@LdsN֣d.*nb?*w\\ڕ>2{rFZl OAPpm-,!{;oRbL<2 ~!27wwI)o[b+7_p5X6STAo-T[P${s:tTywrChYy@e _& kb>31ػL)En= lJu a ?e1RJb,qyϚkZ^mWJ B5ΠtkE{v̺B0Wy|G.)xsf~VRڗ pbk"tcAX'nmx͐jMdoOt.31,`TJg9S aw41,q{)oeb0->M(>W0Na ؒPw =yCG8Cbrps .W2 P?QyUť` Db -drEaǪkH]K3 IgF9<1!TgbNřy ] I,Xp90@o7.c+!d/%:ʓS۶C e }c1s7c{b 0@! r(iڐKj~Ta 邱RPnL\:0?b/ 3 Ww @@g59{Yr <+ʘ(|Z|Fe t?`aElwcL& *o WœҌl7drgCT ܥG{r#w̅K#W0dҭKA4hW`-ai\ pb{?574Vj7"a -(0PtlĘd\ڮ8Qeu "lQw~RlzEz;?)ϢޕP"HE lwa/bYK:<)7G=RXh<F[D=ZM īµxn[kkCmcB'5L01=FY#]m❈|~Nf$F9OHck;¤?9;6oJdRP#JHnR-N Pfj4deDf8N'Ù~3x[iamӬp1|͐BXtqg+L/$rg&/j*v:+ӌڋD Xˊ>^ PզfvFtβfϏ O$o_Ȩv4 G/ wcf^Id_AgU'Ԛ O@Z|@zm#-l@+{Nr4t8oO7o77)({J)cQ# e}fc!$ѻnJG }DdS \(JtzPe ?aj2ʑc޵5a_@=xBUu"z}+[y(,2A܌Dq~$׳~dkݺnX0 EH r`,We>cH97u%u4 <WfquV}q-t%RiGNȕKIq"u .@;?))RW"eA򭟔|m)@kq0~}R%(X ~nHfq!^Y4ŊLdqKOJJ'e(߫| aJo!6G'%ޔ?Eu".pE !+[riL {4ϏyVQ>q<)ʜ N(s _C&GPA_I^'<S|)S)M]S'+QJМ1`]Ls.?xT׫N \W+%I41qsSM?EGǷ ˌevKZ0ft =C-V=%[`Wq\-eWbQpHuP^M0XФCHtz: JW*( "XvQOSpu)۠)(&297Դ-ӖuR i+@[4W$:%e 9^ UKxL>z?ɒZ܋9tNR<^7x| SGMWt3(@嵮aUZyR}  t1A  ;7J1?).R{jZAynJA{|10֞# Y$BYs.d/do/do}.䩸4  o yj F.(G'} o72sشu(no,p|BiG#3ijY%IkX<񂵡[,oE$@5@qy zalcs58'b >FosA.SؓR'/?UdgƲAv^>lUy9{[^\Dmo~oFh깞Mea< b [QV})kD52s6{0uASFM/ūP֕~9֦k?{u qUǽ\('#(kC1Fs.T'2S+%$x%iMgq{&oKg?BU9OP::|lr?MhnvPrK=ommNnvYr[{ . l)$.o8''c]`.̴( [O넑م/7u.&]XNvaF0%#z,saQmmVv/iՂ#_aֵL ϓa|[يn°Nbyv.r0 ;2b,K*`*VaFOYINNr0ӠP/0F3 'ˆFa{Lg`\$IաA!|BV'3 3X 4aFmv=9ڗӝ"020IXi[$\cgM̎f`4o_iV/334223 FJXM@cɑ6&U[<0:I+'p3.8qB}L7kzEN+11a45y ?4|MQޔ Y k m)G>ZCHf3˹`{Xו`E1r]8]I s{u6c¨e,h:dr`?#a *)J4~onBiϢ| BxW7J 'Oii~j"*Q :|{!r:t*T [<ޕV$C]DŝQERLuFދ xc އ|c UVW-'mNAt w KWoN1jNy)5R~w͟tу*ҖQ`c:\ 2%T{3e9`3yf//Z`f>o` h%|S $O/3/ nuxOJje\𖟔C/HNc4 Q@yG6^,;r] CG'GZwZ8;w$E^pJA@^XȊDP7(빷qV lCpAѦ#Bb~c!Y}> u9BH'2~sK #2A|#py^Q J:jSP儺/h#2x9.LXNC'-!U:W|La0A|o1HCs.nKarzA]o œT{ԅ^P֐.ѝz ]tr"] C#]wr 3-h#|佸rv9J ]]Et-G`pǸ.؝҅yOw >PPmu!]ŔB٠.ХZ0@,b#G=S):NG #&]0d]^GQv Xݠ.(]bPDV10~u|`Vx {ԅ(1uO xhHh݀1 Fda@/'%0 +ʀ.G­fZ L7J džqGx Ǹ0 +qA \ouATL< e1A.Pri0Gd,Ux$C@e%0N <0:3Ka>0a8(\tKs' 2ɀ.: Ѕx]x@|I''z)(]PhIrv 0''!2g]gq㬳sXiB1csiO .tɲF4ӍWL76UlFJ!Fޞ;%UNqUl:b\[6,-ŖTXtVt$ϝzpƘ.?; ]lA2bd4]lVl.s/UB7fjb t٫&->5m؂$35eI8MM,g\b7Wž3R!U/q]sؘP~uGɇ\_ RC9fķIcA.uBY^V49Q-fPLjb ]e+h".V"5ыgr\7Q+Mᝩ})66ʴQ~8{5H7r>Jh@:#D? u)c :3,KKK!va2VP}icl6(+F%KKtꮍ%$DTmC|3kcQV BKd SF9Na$[?)-CkSƒh`Yɜ7Xq^aL;̿_Jي'6l,6S~_|Zx` :/39aSG iGp}t?/ZQ܏phE}[]EU-Ue~K jx9B/g|9NGk$YI_Q lHXpŴDd+1բ$h""GQ,FPo=P+agk]HqaH.pj>7^>`M.M&zZ]Fnz > (kE 52dpE sJ* _ξk\*V&+GEN\JJ3 KK @ZG8jy T+,yW+.0r}(WXt*`/Vr0!j8,a`20"taQǰ1GcXl&0Bǰ45+vE1ԫ2e(ٹ<È~*ԪVe w # a%\È -|È0n|`E` LP7ڗQLEbr? ye5-omr{z7̋t <A?0 Ǡ>2ϰIgD {;DmszU-=<8dg@y619<ڈu_r8Ŝ**r-&fay;䌳bc^7Dvl\ (g]t7dQܻG;fݝ*FT^N>^\Y}BI nUݪ2WV )[䷅L_xHuv+d߹)mކb}F"ly"bV0[E9VA_(((n6{:"wze_\`oo9UY+|'%Uk Zxg)dgYJ\aX+ze#C2PKhtj0#EЇBQO[9<zr$hlj}gQ:)!]+n cɔbQ1/ñ9@z̩2X]D;5|v~#P&Kx[3̸KS?y<*J#Ke'՚prt> DzBSSlt3kN!' G/g-p sLx!f^i3׆@0H\xCs_d+ކWl_aىl0AA+ lx$ _1j:9: 07D9W  }L~ECZ:-7˯0s].vrHmB~L%WS|dp"7KU ;q*I B30B왺~`QXGnB&؉D znw:n֞M+_MqCNTYmD,} K94yI 4jp(oDWh$Zv݌|v'v8<Gi&,'vt'PhN!+ )%C̶+aT^RxYCo7zQ0lg+{OpR5VaU83'lW9AP YDu}coVz~e+m1",%~ n+8~`1of,8sO5΂(M!J"̷\ dp;qWMo' "-,ؼdN,4vYvM6f_ir `Lw84&tfB͂.4؏?+< l'OJd}3 dMm>2((wa8p2L 'Zi ΗBE890ˉ' P %'{p&8o{UƖKC9k+Sk%D L([np̠\"Zu,befP@bPN0q2\75&ey3O8߳ Hqw^0NƲ:0N;<k8 q 8y^kI ƉOm0NA_[d['%_ W[O0Nxq8gAΧu;x9o8z C $9Ȳ@ӕqmryԥ8)l;k8'TD?+qZ˦rPFgA U Ο008K :]3, 7 Nińp|ڎ|v;58|ųӱm5 JWڞDpIi }%z Mr7S^+79XO r5_eM̟-ћ):|)ߔܵIajk9:jc7& IYiUu&̑G/'~3xRWJd^3jDPQ "ɛ`-67ӿEqN(ZOʑQ_NKi==ĐY$/pR6jW>"ԡ(dM4CpR*!8D^KI1S2"er25.mI@`?.#vyPo$վ8r%bB 9 -\% v% Aq5!Bw~_ƕ:I6 gېM@](+=h!9&Ptfhن1HaĎQ4#v/ukٕƒmoJ6lY lYCOn6Ȅm:{&wপ'_h~ClMS Lnr.Ȅ5ȄpvB&lD:QAz٤tRKbV)P'l[xIg]bNzbҏ'QpLvn3C4XZ2/ʌAy`D=}OʖlօQ\/` ؽ(!݌,S-}>Z6A*Q2he1׌Sp$bO#x'Fਛ!Zpɹ-29o/w'yNBOSˡ;*露O<(~("2i1Q%ӂOρk-?0@ޘBG~\28+gPj_JwƛjCs'!ﳧ,wclyLa% JrenDI[򭟔4T^[`JL/#u.]랔XQOk݉[ju(ovZ-SRm]LLHh?z]UwYugZĚZw&)\uϲkݓ";q%Lyn{4Oq:Q $\cJbJk·tJ̨̮wWO3q9Śz&5?n_tuaa,{TIuB)2Ӻ}R~KZwBeʓdK3,5toqtй O!\%:`w[QR6~pL.'z6?dU[rzUCl 'W&]^pL˿%% OazR•!]Og&]îDIQ:(1<$IJNa~|m)nAqmݮ(U@)m߲y_72jJBGCnND᛻"c`صʺ(C+-goڶ"tbugb,fKj[n~նW/ h86| { X 9 ?(5{7Jk|~Sy^;T-`VRY5GE%vO}68W]F 1% d@~ҫ__ _/P [kDze bJ`";0ھOs~+xZ8޶\ZYh 94gW6~}2qtf>i_J/Ze 3ׅE#ы6λK (o?bu oٸ1N\xde Hr5k߬@(O 2z9A~Y~AGVvd&x{! ETP@|qQ_cw~%e"j5D2rׅ=*y2ː; MD2K/P /#@o@ ; `GҬ^ ք߷<%m8_?=~ $~u`kM/,GRJܭnЯ M/(RP$0_7 ;?)e֤s~%W) ;pƁ n<2$]"[9X (#FR/^OdԴoPꂦ[6RNZ^6 Z;=I SS8R`Yeft3R/ySCz~ * Zkԭ.0ןp/c]v/Py+{O]>D.?BqerLosGq/C`Z9cQeE(I*K`eΡ|,_8"I%b@셈\umzqR=_ u%ҀaL/άwZ3k OHT vvc&|Ճ(Zu__ZbM>qa~Q VF쪴Wܷc0G$\//R"];@Oz~)%l_30,:0> ! J ?ò%71н?(Kx_;/~_g3~("5(9mڒ❈?ݍM€wG2tJ)^D2V zU)Iɷkv B A!)}th`1/YF /zͽV=NY |;zQ?([ žޔ!hA~ K;ifGSD1F)RDqU`߫yHQVl(,ߗ|B_|2rn+{ Ā7F%Q{}yʑ|_hD+|_}1{r%}9O/2-agn _Þ[PNBCtHe/ٺtc\}[|}{alyGzoC(۠:~aT%:Wd8Ji_/D7_ [v^(ʆ-[1-Ju]~6 %R'4~!mz OJĠdz2ޠ _ʋ[5vK[o~[yB  0r|_VNz'}ZթCzz:(Qy/5KlPeanTo+'䀘,l+g|߇- .5r%ץdc8 .G,1oW[aLXeJD@j9E&NVN=ћz<+xtY0 GcUevHjPh,ھAߨT/(^e\WpK6>f @/6GU!&K넞>==(rܾ 9-Џd7umleVɡafײ' `|&_͓{싋KY ` l[dvV cVzf|)eH_kQ6W(<_D ;FW9cЬ=e ܥ-Ɵ]LBڲ/! »ʶ͆aB)! i!ͷu iNR+#ҚÙXl[ygiTy4!utCńtvYBzBz"q4G3iݰB^siN }es7[HBUa"A&W .9&a8_Ј&iG>{,L:C:.l]l]8gI)gHgJ]C:kkHϓPыMT$9P-9? !r c|cw ChT_M`}eF\+xC91(U! U/B(,rBjW~Lǖ"sR/guGOZh3-j ٦IWr4_DJrmQ?YiD;7x@!H7BA̛zv20<]؄ˏĎV"5a_@M,63g\֛u9y/p9%KR~/ f 0{ ^0ZB1.f \L81u||P+#G4l* 6f5cx%,Epe>l2\׷8W!x:iZg\lp8 pjk_Bp!Y!'=LEޗ먾e 6+?sw\ptC~cf?Q*("\\" "=*T5TRsĹ(Pl q J¢ ߈ YR;H낲b9mLڋ`$Ƥ!MUj2.""3kS#&aآ ]2HŊ(MV0C +X|JQCA3#tm vH{qaXݾ9*f-\ٚV'X'6޲[:zD|/$YBȱ>$\cSGRvLh8 {CT|#撽`_5;Y_XcR JzDb5pg*m>׋59G^C/M Lk*6X1l[8YPM93 A*<^n[RDVLf7#7>@+ |]̍Tieй꣕5MgM~Ex^!wE?˒UL7iAڄ,/2'1.\o\S(7\ͧ'N(b8Le?o Xn;E,32ؘk@op)t<_=0D0$ݢTT@xb_ MF^0 L%A`6%m_|Hr Z!v)Kp%ok`)ė2+a{CLT|#@%jb <($x?<w6-"nuPeBBR#mW=oč x3D? 7i+3,.E--V/qظDI2v-h6Ay6ܨ/.vT-Ԣjr@ u؍6izQ%&6eRS߮wAR3&PK@CoG8-o &Ёz7zJ|@#PpV+(.kT:d:ָHl„Jȁl;PR(ciJ?AҚf &Mj|ਾG`r liQ*7<Ҕ٘!KS)J(wNAeA̳lWV8̽ZWL7DӮ۲KjP\4CiIe/M |;Ċ{YE1φ6mBlxy%J@cfÓ}Xfv``Q__X JA5Z+ܯʲw%_BNp ~FSQkl讖4h(S@w@j*0u 3p3N&ӻ4GIfFTy7{\"{v9sQRfv@D1c˜euep'C&um.lnEWT2g`5&i^N{&"B*9tIc Xܙ(̱riDw j==K] v{%ö6q9(uUO4%B%z^Hq C%z ?tަD03'bH,p? 7fRVqyxosZ\O 4U+ [V%;Mr 4SխX\ޒ=nN%\]'L]ɇJt4ojXP94A%N[|4t }g_.qu~_3Wl_QC< 8Cc_\}-<ۆf-U۸Qfvf LI;)']a-ӳH-`^K[Ԃ]a soȀ =p*uQВL$gN璊$9u]+n" slD`$zQ97 S;4_#WC@7TlVgqh J@4+~`pA\9LcؗilhfL]{[ z,+-͈L.>}"2 AiFq+ϲ#v#IP&:zl(AM8pXb,%h\Qo'Vφ ǍH6 +﬍qhܱ]+o&:8ʝ/*'PTa[GJc a[VxqɱS0,aSW?P!8LLh|E ޒ+{çnig@T{~-!.:6E1&ub~_GdRJ̌.6qʰML'ͺ*Mĕ~]B1˦]MbfLM t`d EBbM ʼ'?2qeoj(ͽIDdNJq&ȋy2}4- mE:4]Z3p}]\Mfs1J}=PU8_V1V&~S'G̋ls'CV2lkavL 3K?Uv5U6V;CBAKyL1Ol,Νʋ@4BsJ#ۂ^V&Ul9g3 j4=@^/t 7E8㭪ˤC ɚGJolFy>!SD[qM]qM;R+yGy]מXe2ͣ;0,;-n#p=,>)ץz=fJ.yp:a(rDuds'ܱܖ!#Gi^&{;XJ3 勇/;^Emw9uTbRZ2qͼa4&qh: xmgdas7E mLtK˪kcx_[wXmxaǵl?1E^m2ۡwl'$9=E bI/J eOPmmn(=my> ^6$5T7NA /U?Rv:Ȫ|_4 P1ZP'|턈u֫&kYN+Qsiž(. UMo]JNL [8vb_l}JS4rrBL gn%8~fӜ~nG\0.Vl_0#o^gh9ep`pZn8-cc7-čkSI8Kcn":! eG@t c2wA6>7 B29dOb;EWEM|n'`p;N utofыqD/%8m5 \y $ W~q:3jHDE;DbMn+d;*;) Q/+ߧ( JLfa`~zC5Wn Ķ&dA%]g@IQ } ?}m۩QdDao)IH"Kj6e*\#BTQ@sY|m'fT[˦5Bj޿$ר6tlh&Æ~oWHֻ Ȱؑ>zwؑT(n_*aGT0+<v0}YI1 wdҖ{zMn,zbr_u`SX?1=6'մix ϕu,W+r_M]O; ɣȺ2Xy/7qwΝ dJ$Ox{(.VjMSm5ڄ[emkWy k[p:RQp$7K dW$6}(°?R-eo 8`2mU>0/>U"I=gA3%<?st(yFHTH +0V q5sWC)d<Ƚq#{VɽQՈHkoB0\2hO&pa\Pj{ W e(h_aSo{Fy |·7  FOSm䯯D('| Nm Wen>"{k=C-{3fFW_Km0,*sGF}^ ^Zl^gFd-v ͇|!XU؅Dy aO@7&7`[(t21@ DLwg;3vMxBNA&r ,BN •:baJ_7֒I=X\{EJ? gHVⱶ7XP|E<ܻxڱ6A0 6 cs%pv&:;آ Ď+8id=A&6`ݞ{cy}y^}{>;;:a{?:ig#gu'Goޘ7ɛ 6i8E#=oDOLE'l.6ן[ógYن)Zu(Ik̩:Vr6f6nwvt~tЎF !LsCp3}>'_nOh D3!OB,ܡ6l DMLsꛂN~ LS?FQQBᲦ$Ŏ5LB3@̢j-#AJ9(+Z+0̐mGWwf3lUG:x8PYh-R}QbW_?_ aeYtFӻ\'!58DRTu]ɔ Bzݡ#fJ8. a B`S PDgYNj:uA#2ģpg'F谢V6^S70+ē|oթ"A32"E%yX P) Yfʩ8Ui6M#]&&3/Ƴ}e|66E~;6 ~ӓTDgp7I߷Xz'IzGmKfAMAPɶf]()M3Q\2 i'@Oŏ]xk~Ck_dLzm|6'q&ʱ%^.i!Xq*1Qs2e i^aBp` 2w=sYo}r5\**Y/z\bYG|iCg>GP<0VQP W?Mt4@ʢӶO'z? 3]M+y < )OdrHf%̜rX(0~{>(Ίϯ)..9:0{upYFp*e.XNYk̆(;\C|WOeޖBE+IK9N?ZaVˏy͸jea&d^6CyarP#?I; Xi3 byYg~YBLLa#N\ V;g3ɓG K~P~ڌgB&26H(g3>tſ/ 0>}kncɑK06(^>Y0i3͛;p[,m4ʹͮv ˏk)""JvBF *(8c!2UzꤣB1G{y1R%k y^ g<ۣ?_+h"Ռt/聢4^WU 3w"` oK"ʟGoUZ!dIXσӻ5\ Q `ZLtڮ'c3]F1GJE~RwۮϮ!ϡ5:aB9(ű#L"dC8*ƙSE'牽קBl0~T 7= U:'+(d3ߋt=,,FrfѷE. t/bNSፈ7)U\Uô)-ͥ1zğ7La$M>}r(LkSy-jgPBt :8 h2|IH S>os Fjk:sr͈tLf0o)\ffe>l^Ot]͘F@E|'#0zh@3r($2_XY qeX/F ҽyUp7B.1k}ω@&{(GVO|7Ct Ux$&y*XǨIޖI΅x ڤVRGDSvu4*UMŝ3۪<X3)[#g{Q#8XṠJRXTGC`,*vlfe)5X"%" {*7U\j Nolr 6k@EG!Bc ?'褒xڒ5XnbT5_O6"KUof~+bM[Ul (Y%N]Vje@Ll< 7[૬J8&OlWLU{l}b6,}lNVX g~_rE@8-I1o5~]pV7 Ɔq FWEdKκ{6\2z΅K&Va%8KvEeEH ř0JpaLUl߼1;iƏp/8a6aÜQ3<`%%I.*̾·Ey.Č`N_:˶?ܺ_K煅u6,$,8_P$8oV\vq-ȼvDdaC \9CžX KLU8ө\^+ ]>ďG/2(k> w?$*zA_~atoG:N'gbBh\t]22uءm2T!˜ fsY6x] pY֔ Nu <1](8|WM. `tWg}YL#:X FwY␟I8 #%9~K+Lr}N[3 `(ZA 0Em;h/[B|;LR4~Qw=Q EӴ'RjPW;\A8Q1T-OZ=^|4kQT-B$]AلmO0ߣnÝ>t-$~"Lt_؝A1]α>Q֥kjN+;t <gt0c[ϱL؇mZT,]ukXy\^s9-De44,|=rxbaִnMbDrT,mubo?7X sQM @0 |fQ}.,4l.rh_!:7me7k_amYC&&˗%,x'0+s gI/t "iT~zYn|dµ?o.A%R ˃0[8=bYhG,(v!k,6رiDxvZ9lS*~39$D9Smڛ ~k𳵸56dU32mŜDQǎ* ^_>i3P`׼OS<^SO]k4,'/ ~ۛ:07Av$nE+:=UAb1I~֥uSoFvzWd+ӟZX_4 0g+]Y~S5Fs("Uzms&o$o\r&ܓr"DE2 lbEђEU FGpxnCP_[\*"([4ۮ_9kFe>L GPJܺDG38W<} :)-h'< ٨?lQ|Y:Mp:C3t52'34bI'+w~h4`*Leo// q-SuNDIY(ًz4)SJHìJ@~p%KJhKrv;Aw&G|IyžiJsԔǙnX *@wo(U Y7ŢAtZ}@|v?A?%3#a0IH]Y#TO)Jj%#z4>1r㉰(t *W4qхH%d8uJ=<*\8zD* -gPI1^U;SAPDT;>Ddn*1XL_,D1>6EX`QX=1:)VL\mDA1%MfsHg'ӶQ/,b 6C珕Wg*JH`d7AQ }A7ʀP6ekFƂs0'*=j[`1UEjaQݼ@d3ѫ^mȖm$%`Ieyνe6WGq=l^+'D"0ER>i]8q6gCj&ℋ*\bs{$5r^7ꄒ5bDdIax*ϭ8`9!Pƍ”A)S*6cK|p"҃KO !!\}^ex/*˭X pf6`vωN20=PюQoyoNT1kVd%e;%#`PK|B,tm*ydTUK/@S԰wL`{".YZk]-db)R.Ymzp֊M\]qxe)ʑQ5Nxv *oSPS&o9v#Ėc2YEQ Fۼdn!{9Uv="qY-K)H3@DΫ4jAY?*5`^ֵiOIflҤQ3G`s GpTNoD2UCQyXYerR_ErKC쳐lqCeD~HJn"&_#+)]@1ilXto4Өw48޾)Uɧlu}T Hά}yZuޚFBIJb\SC~<9] J貃+.˪8貼>)@~#鑦qt[t*$;eeYJHYyF3C:^:R#[JpB,.1_, I2 я2;~)Ce72ŔYT5j(inevԔs`x7#;|?q%vy;[A:[qi%Yd;re(4Cґ&e;(ƌ;C(K[z""֗6<6ݎ6fE,@nf, G,.rxg,J4k/eveqGtY8Sf1clG;lC(e6(֔Y2;K. ~CYZX}tYXd.;:siMeS>o+LN}YyvbqäL#ĂFR6OL*5lXQq#b^GD2Y؉;mo, F?f)g~R}xBem(jJ!CSj~.qO&2$fg b\]aj=(g6[!MqC UsϏXO ZNr_k!!hY' w$@ǝVFD$|<\! -n괬O C\&BWЩvt(ho 9;*:EЅ;ir<)1A@۳Єx4R,ujr`j?-Ό_繯vOPseG[цEF蒋9|cLX>(hc^'#xߐc ~DR ŮG6:q$ѫ67 "!dX!Ek:./JVCOf 0?;8Bb?(K hp7֋EW1k#.,7ζoqI!:ơhę)ϥc5~k}tGRԝS͆4cDG"ǁ;b5+n5~pux108SO@-'nN褱F0gTrsm&@g({z¦ -wFv~}n?2d0fs" L9Ǹ3ft QRr5¢S0!C-AOL.,1P @sOJ=0z5_L(\Fg$~@*@g QӇ7y ̥g i >*SQ# 夋r}%xtkʹ0݋ ih'&^{mVf9f lDPy[/@[,싥n۴jI\Qyw2=Ucs+d%TF*+)ik.6xmK9cC[_OLGR-fo.~NI@44|o7s|2ƶT`>vrd1֒cU*A+-7g)RXk'ȋtNs:P蓏_[GvT2LbZMXXB3ƕIT:Ef[B\x7ْ(80Q2tO5S,gDTJ.S9HξYeqB`3|ܨ>3R<]&AӞvTn&/_Ԯ1d7hk:(%3ROh/V\dI6X BZK6[Wgdv6G a(v?,91]\fjtw A"`Y5 ?>XFd9k|3=f}q4Vq͞y&(M~$#wE<?/1Gxpf_p< xQdzБ!6v8xQv8됏 S Kc&#he*+l(="}_lf!q ,lqJTm&=x0D7s{(4[01(10Q/ Ib1j6pcJ9-?l.[0i|'P *(j}턻F 1(9Q&o8ﯴ,U\=;1` 1D§51I Ys L'gB8Z ?(7bN),鸖yW6/QNP?/LOvtvtJÉAX[uLy'eH 0hJ `dH4ln} 0 X3Ld{E}?V@`q:cC8N?P9a~S cjMƀ@1q"\jp,xCEB)_,u9)^~׹>c 9 k~=!N7iR-B.pA'p9$(lĠ$հB4!صp/âED{ފ3,kY!>7JqD dLRsa# Fe)4zzyp eDUTn%BF8DzSqegr]oLyyB(-oBKR)Ch638r48̸iX'. w?9F(*)&?b'7`u!)Mly>Y!UKECajںx1 Ʀ(PA\ReFņ\[6\VTU} kBB}T=*.ǯ̆\"دe]f M3q\pѭxBqxƍ|dlBmƒ<2`p43 q:^W9ܬzB|F bLwjazVHr1ښ3WI"OC q 9TfT(%Zeh.FDnaD[#/D9PquH9h|'gCm3!orĴp)^QZW"4L(b_L\]Qs9? eno$>3E&y8FW!MyQi#F*@P|b1n!,F!rm%ґ!lSI[ȅWzZA{kP3@qq *#lx0Tnw aj9* [q3bIh oLc`J1C !f)ֱ ]pƽ †V1Z(=F t%%wv{pbۀO7vW%3sX7?P}~I DV /w/*h<O^K@aXb@5e7$ƜMv-_ .n7FF7{/[B+*=r_fxdabQrVm^^{//J`;~^a$ ҳ(ӣB߷+]k[1;u^O(̽2A ˧]U՜fwT~#C/l2biIIڪ{-5F.%6M[-Ȍ 21aMk"Ľ{-Oۼ ,@^ˌET?k)8A?6qIr5ҧ-|`. cɵ&U$(P,2㯎=:Jve8M[D?걎15gNl_|AxdLY}$vq ĉ|C(p+sW+c˛PN=,cH %0~E9jtPFd=fj407s-^G:[=ƒjjdRIa4>mj KZʏU.id|<Sh|bƌƇհK.Ř<5hx(\^,1/[80 ѨvFQvlF61(f4>)f++$ecUȕoF3̪4 lo d4utّXV#F)nmI8dz3-IE~X B(rҲp|++‰F*x|,MVN4X(t ~ m#H)'30(aL -|$rJ/z>.jAWMOW<3ѡ D0;ǧ7y҃ctVi:3~A8 O@]҂7 ؎o<#ї>P]ώ0 ힺ%3i Ma3?Mz1h!1Tvya)۶ㅪC<&ʃظmY>cte| F݊7R;_tʞ'2|`0ob?Cyo:k@6{q,pUM',FIUbTSEnaBOv ʈnf-~r~JH0L~[Dr4mr=yQXqP/L + ]4A'\KXn%B%v66k mh>!?T7hOɍ9j\# 8ԕ6E S@^V[>ϳ1J<R1kANVu}KG ㆟EӔ*yQ(p^ OM,n"|%ų?[g E[bpωiK!'YBZi)PjZM'@E%[')Xm]|J%3KNPy4;Qd ؅he =,),6NG(:0 7̶) )h` |1!i`8F*\YySLcFDD\P}>E)鄫A q"eiژͦNQy-fLG,+nX߷uȁv<: Pb4L69q8>lT6`SgRӘʖOUhxFI+;=U ES)/4\lIp=ڭ.nHSA ȥ(.>q)xL*ch<`Rort27(Mvx9Us8vKbs+L=bV}Vl=++gsXa݊úU "bg+DVVvV@q}hi=V$HpiʧN+^s>F+|Yq^:!+R+fS\-+Sb^ /㡻^n@: ޥ JtE81YU%F^ەxkOO BRx3E簊=>Izi̯`2\_,~$s#|C~T/I 6f 1 &?-yx6AuVaޥr2Tg:Fi( t`tV\C1m PŠ\F*`\d+f 4 RB>)סԏ<6q~ ;s۵sQ_@O;GPk=6v7- A/(} ^I@$8WVB-*=g'y36|}F.F.N1NAmZ?tGl* =B=? `t14!O~gp3D{DelJ)h7izS~Fxk9IΝwvՙyfTxhr%32oN9r(ǘ5)%%^޼͙5LjKfLJ'JhQGBQt@+DnŵiQ gx]JYf=D1ݴ(x(BG]Z2NG;jTC:)+RHy/\^aq}\:O+R>ծHkmPyه`ե ) G~j ,$rykU<6E7óe{߾ăez (!wQ[5I3}Ffs r}zY7P_z/i0bچ1Qk_ﯪ=W޾Slƙ'Ϥ'c)~QvAXE!vc'Wć7*+"nPf[e6hܞΒd?QWV8.KqK~6a/Pgf9gC:7efj?*$ F)c9w(?/??/nendstream endobj 6 0 obj 110287 endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 7 0 obj <>endobj 8 0 obj <> endobj 9 0 obj <>stream 2012-02-06T21:31:19+01:00 2012-02-06T21:31:19+01:00 Dia v0.97.1 /home/esc/git-working/psignifit/doc-src/architecture.diaesc endstream endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000110586 00000 n 0000112220 00000 n 0000110527 00000 n 0000110394 00000 n 0000000015 00000 n 0000110372 00000 n 0000110650 00000 n 0000110691 00000 n 0000110720 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R /ID [<7A1AA7902485C38E8CF2650623AA3DC0><7A1AA7902485C38E8CF2650623AA3DC0>] >> startxref 112443 %%EOF psignifit3-3.0~beta.20120611.1/doc-src/architecture.png000066400000000000000000001574131176542545200222670ustar00rootroot00000000000000PNG  IHDRxgJbKGD IDATxyxT?$3쀲U!*.IP@Ȗ"ZõH-bu["mQ E3a{F2ι93d2y=3;|r?_{ѱg!x6w'HwZFoAN wǫֱuV""""@+x_<}Ջ?C9ǫrH+gDDDDDO~ -ꩧ?i>BDZq<#""""" [JKKq뭷z]'Qp OCCzDD3""""t;v,"##pBdgg#** /2^@bb":u|J/#F@NC߷2ihhYЩS'$%%aժU6yu:}!,, ׿~yjZZڎhȐ!رc򹾾 8w6 ZDDDDDMٹs޽[wٳgC?qD9\pA&N(=R>55U6m$R__/wKYim…2~x9{\xQ&Mп{WN>-555tR2d[cee}xꫯʄ ϛ6mm<裏,cGټDDDDD'&IL& 2h4*FtUܭ[7o G׮]ܦ~UVV*Ek5$..NΞ=+""ƍw}Ws`!"""" l'@fn6mNH>,2h DٸqPӴ֚xڊþj<1cXB.]$R[[|g 6<JhTՓFٴi$$$h>ڵ|6;듧iܬ x_J>}d͚52m4g &ߢh"\x.]¢E0ydeȑ#m6Ԡ555\ދG}Ν˗_ndl۶ ?`ذaSO= &xTYb\{#RWW'?KLL1Bkz'kJLL$&&/,!!!.mOW%尿,^z%t|g(|_ˉDk9{$''i3˗1~x̚5˦h4?Ѻ L%' "~ y*r,!|WD (?"`*:i=z7Ξ=Э[7ڵ z|wܕtx"Z@]]:wF> ?я~-x L! pAxGD}n5\~] תWuD?0~awH+xo۶ `@Ϟ=3Ϡ&srr-Zl}{źu됑jYܭ׍7"##ĉQQQ-[(鉉?>4M{yfdgg#::111EYYM^cP| ƌDGG#;;7ovN^^C;j܍6۳oSK=h]u4@|U}jfTTTC=$$==f~ffRzzED2l0F%dڵ""r)ڵj}111rAȑ#U-4gҥK]ϖKK/^(w\d2/|RVV&uuuj* ݺuSOVV>|XL&HVV|%ֱþ|%8Q\\,&I%##iG鬝,)))qXWCm t]G3 GD0h\mnv ֭SȂ W^IeJ%K;wf9H={X%oZZ)ƍB)//״̖ݻwۤ_rEHhhI-iS]ԥrMX:tHIVҭOEIHHj] $x9b^RR"$55UI:vطm L+..vѲ:kٲX:c͓zx8OQΝ;kWz, ݻw^{Mg6eѢE(2i$T~6XknnSNɂ xʼiӦ XTVVJXXtIjjjDDo߾@߯nL8o].KlvX^Wyggm.[5LzӾ3|MMMtNe' 5hn2Z-6]mcZ;|-*++gϞt'//2kYZ{gg|U]:u$2h yw~zeޜ9sTpEYpW%<<\dٲw^%޽{e̙һwo1 J ȕ+W.5>kٖKm^mm,]T,.YYYetx_e3<#999wIcc:tH&M,*C~9aj FQBBB8p/}O@k9Rn*W\,FQ͛'$==oY08|Qq}`G;v,,Nknn>==]^z%~zIKK^/۷+󚚚dٲeҽ{w1 ҿٰa;X3gYF>͛ڧ`b}Gŷ~Ǐ'駟?˗q= ''17&NYfٔٵka4qY?/ma"""""" * ܒ%K|r].]BCC+L0A3i$<#8wΝ;~'Onqۏ>(Ο?㗿%e̙YfᅦlFqqM_L#G"pO +8qݴh"o`!+N^y}XmC""_cc>}#'#Gk0ȐM6)Xx@l~~]g}V$**JO.W^uעI-[&ݻw 6(ׯ_/iii_~}vOZ~c]Z!^KFD,Z3(8^Ͻ+;wA (XݳvH_{C=x}+3˗/ŋݍ*8W_w7zL6 sG+R 3x(X=%%%>}KD-%zr"""""" j PG@Q hNsѥK=7nl.uHu~)zGDjjI;(Y=DU_d™3gpl߾Ǐc=ZNZZ&_̛7:>7~EKDl6_|_"+G={VVD;m_q%""""3xBCCѳgOaQQQ;㬬ImfYq2l0:F%dڵ.ۚ;wW^ymnQ?*Cm>21 IDATv$22R>%deeIIIL&))), ӧO*~  v풦&"YrtM/o޽eR[[rݙL&ٻw^z9ԓ%vX|}u]m&uuur%yǔt-5c  /(&I.\ WyKK͛í[JuuΝ;e̘1^_Ç21L/+7|I]]ZJHnTbGxZEqqL&).. A-Zž/ٖk$)))@'Ojm1,ߕVu!r*C&@֭[9rĦ ^uϴ4 )ƍB)//jyۧ:F,X zRN -^w%fI۽{M+WjZT/66V{S[q֮7;c{!%ZI>lllN'!!!u1_uofN_jZ>z2:I*++%,,L:u$555""ҷo_ waСeeeaڵ°a0vXΟ?w,oʊ`w}i3gȑ#6j(V^^`ԩ(**lFMM 8^x.kǏL2۶mCmm-g}^ @Աi=?Y5k`6qa̘1obϗ㬻}JkϟXf |MٳKDDDDԑ-Z\o4%!!A5_BBF 8@jS^^8szt{ljj.ZWVVJϞ==3~ַh}_-lrZm{--'blKֵDDDܮo lV ""|zGԑ@xN=22R  =3%FL6MRRRDKJJL:U ߓ۷onݺxݻWfΜ){ ᒖ& ,+WhݺӧKN$<<\ $z{=̔HѣGKII./^ J߾}%<<\Y?gϖ{j^~_ե6V.]*h ,ٲeOU<5e:~]VV&-)oj}ֲ,jju bJ9sQO`CDD"'r<&Ҏ480_i[h4JHHh.O`CDDU8qj˩X=رcvᐮQXXos5kcƌA#"""""`dBjj*n<^?t<DFFbXvBDDDBv[jmx"j}p=ztOzj^{CDDDDk҉{ 8x@ȏ~#%@Ⱥudĉ@wurΜ9syjkk9_r45|ܮW|Ν;ۤt: !!!rwrv)c_g|2F|d̘1;wĐ!Cرc^Yz5jjj0oj;pq%rˍ7ި\'y|֭/_Ç~͉'ݻwwߒf}emnnѣG1k,Ϧ̱ccȐ!?xɘ4i>C466:M_ĉ/HDr#" Vm~ܹs%>>^;p@Yl|>)3l0 _~gff /r8%-!!AȥKѣJ(ED$..N%""ΝSdq kL4IDDN:%$11Qk)jݻ\|&QjijܵxԯO%%%ţ`2:-ZDDDDDDD6Νx={cǎ|rFp~NsW_=;Ƶ^6yng0pcΜ9سguh=kX~5=poɓN3xgqM7a̘1D||˗oxS-1CDDDDDDdW^3geL0eeeXx1zL\!xInݺܹ۬;vP? ѹsg̜9z\+WDRRM^7h=6AɄcǎW_U[osWA?)ͼ'ObʕD^h"bĉ_3gW^iqDDDDDDD`رc1vX\r7oo]v᫯‚ UcbժU3g 444`شiN?ަ)Sg̙3؈^Gii)֭[5k~#11p;cǎE1}t%]˖Zzlߛ:̡5-Z{4g=ʧ__5&===]}Y{nik:,7 D>X݃f܎(Xcɒ%_gϢs8p rrr_JLCC~wŷ~&t#F?ls$&&… 8qr[3;wFUUΝ;\d)q1W,O>T4gF#z9~UTTgϞHNNFee~YJCСCF@ WwBzzp#" V2C-<|2QkՇ,3"Jci1`DDDDDxQc(1CDDDDDDD!""""""" p V}+wt:!66]tpw㮻BHHj`~ Q~LDDDc2Wp:to6Əl>} NB"""""v@DPSSro /{bȑꫯ v\D1X:*_WX 8 .Ç%%%XjM>nذAI@~Ϣ&7|1c &&͛|޶mrss={gAssMǏߏ]",, ]tA~~>;fxGH#-- /W_ٴo4kuuuXl XDDD ;;|F:7nDFF"""'[lQ1|444|7oތlDGG#&&(++~nkm<}|ncݺu@LLͭ@ee% УG!11'NDii:wc3ZWff&t:^u:,+CuQ{#W.϶m 4eL%zz駕<ϾNWyҥKmMJJR͗$Jޑ#G}gŋҿ崶n{M… w! n&׬yh n--<O?utU9xw72l0:F%dڵ:tm_Ym_""|zGԑ@xMO䩮d{ իdbpzRѽ{wٶmɥKS-O.$++KJJJd2IIIdee >}`0ٵk455Immʕ+妛nҼn͛7OYޭ[JuuΝ;e̘1^ÇKYYL&y嗕oYʤNVZ%[nNcwv/,9|~պٷud|ѻwoپ}֪gg̘!db4d2Ʌ d@rrr<mӒe2$%%EHQQRɓ"R]]P?< o#" V 9v੪r੩ H^+ˤ|b6xvmʕ+@BCC=rMޒ JZZZX̔qIaa{nYjo>޴]Kv'H$$$i} %ܾMO('㓥 guj3Oߺ]Ox,Y"dܹJZaaٳgOb=#""'r<<~oњ6m˓ ^/Ѧ 4c6m677{\ui߾}2`>zy74g}0LiUMMMKӹܾ %ܾMO('Z[r5yv=0ԩԈH߾}߿_~xul 9ve{Ν ?ϝ۲e `!_bb"ᄈIojY Gڤ[>[?<8u>slܸ0x'Ýd\U!!_%|2=u0sxy2Fi=,c󓒒ʛ'ORZWrr2&M*lذCYYj|]x?I/**ѿ|7ׯ~a,oʊ`w}!ߨQfBYYf3>3f#G̜90(--ŬYl@VV֮]* 6 cǎENN6a)S`۶mE}}=ك(̜9Gq- ~n͓1J>RyyySf5558p^xQi?z,t7Vi^0|5kofϞ+~E4|p9uz^Mx--e4%!!A17//Ϧj_KHc߾Uom,r~nfkE˛uTYY)={iE< le1|p 6k-Z%"ͧD T:N0IHHԩSe˖-ު*>}tIeРA;喝_VV&-)oϢк\FQM&)))%%%ENpw^9s[ KZZ,X@\bwҭ[7'5tR{lٻwWt,Nײ,֯_3gd}ADD"'`u`uJ[צU[g|ÛUQQ޽{A0`q!2A8+u$Czv-ر;vpH(,,CǨ7gYFS!!!6o"Q[i}$Qp [N&\շcL8UUUNZںu+&O111ذarssmo&MDܞ Z֑:kݻw#;;oh V&X|j mn{58t萿p#"""r/W;v &L@UUƏ W^իWQRR^z Æ G:шI&سgPWW={ 77555]***ZLrss%::Z[nM69,,999r׊^=zҥKɦ3gܹs{b0$!!A&L Gw%yᇥO>!aaaҧO)((/|+Na IDAT,@z!峞㬜zճa:t5\#&L(_y衇i}@v@c^EWy6m$rDEEIttHiiM^ZeeeӱHcu^{M*J"bwui]h݆Æ n::֯_/dȐ!m:tHHzzo ?"""")--MȾ}4YQQ!III$O; DX/<dҥJSNI׮]U#GԾ|}gsϞ=@\.},)))$%%%%d^wz9,w.۶m:tX> \"$44TIKMMuUZhL7nJyyM;ZuϡCj%īQt:8o-cԾ]XT\\lEc}YO&K-d,vW'pɒ%@Ν ={6i{V]""""6=a|'l@mL& zޫ.Zl6mnnv_Wž}dz-e;ϛsmN x:x)ZSvݍ[yd?Pjr׎Һ^dVVVJXXtICD߾}߿i =G0-X@TvZ*yjuEheƍs(vq>C-^{?\Aoʱcd2Icc>^.?óFL6MRRRDKJJL:UܓGH̔{E'U""/={ DJh-&4~kŁeHu8(ZQ>(Djъ8N0tp?1D@Q1!A|~9$皜d'z^{^{gs`;,99ْ-++fϞm7oۼy͜9lrϷyڼysϵKIIs=͛1skf#Jڵk-77RSSk׮6n8۵k_HN[RRb~gyƤW*)\DwދՒ~m>szj~s yf$xAM~VAƪ>.ڴiNLysG;V?ϔ48p@0L݁$y@p=<.GH [q9efm-@K}Oqq?/#iq=#I-j2̴hѢcfj%ׯvء^zoUTT~w͚5()))2dz!x[NJKKSzz TRRҬ;nMYYYJMMUrrt-h֭~m7#кƯy9R))):34i$i={ԭުfI$Ú;w9%%%gϞ4iQX@tLJ$y<&Ɇ fffV__oÆ 3IO/77׷hѢ&Z222,ƌpmk/\/X f}[߾}IOO;vXKcwyI%Km3iЇ@guɓ'_~&֯_offMϪ#6ol,33I;yyysN]vY^^IS6)lJLL4I[oY]]UUUYaa=vDy__|VRRb555~ .JJJĉGIOn쮻}YMM}gl2dǏfk `\@guf\pV__oÇ7;ꫬ[ff/]<Ovv]L}M[Lurss+%KXiiiT}xuQQo} }O:eXBBB}.>;d?t-~oB'L9y#A3g8ydnƈ1קNۿ&h2(-[XNNN6=Z*k]]]r~?> 8LK%<58/@gu4/Ydy睒;SAY~$iժA_3xsssc}z7kܹwu}%$>-]t{m~+> 欳Β$Ś{, r"#I3gT߾}%I}Ռ3B*TZZw^M6-dwVmm٣YfIƎuyyyZb***4j(]q?~$ѣ~e$IQh$T\&L$p *,,Tmm*++}v=c }e~D9M2%hZ8 ۷o_De#s„ ~q:4l=$I>l /s 3h73x馛ti)99YÆ s=ڵkTuUƍos9'7oެ3gjJLLTrr4&1ap~$<`@CL17fT.<$oFzHrU W'x/kڡ.ѣ?Nh 4H_|hU_ps=z/B?x;=m^v`Ϟ=K81X(I=***c=/tt/<TWWSMQaΈžY$ז-[.nݺYRR1֭[gffw+))~f_[u6tI9suziWV[=\KLL?߶n=T *ל,mvVZϥGV^^˭G4h?l v[nݬ[nv7Zee_bj[׮]ֲ-))hO=o[mm˿RSSmҤI~74WK6hl{N}oEl̘1vA3gٳ_RR?Kz)& _~_|M;t/믿̮Z2eM2򗿄|۷^۷Ç}O:u^x;3}&Md/ѣGիmҤIa*k~uw`#+X^__of6sa(0~?+P|KKKw޾Ǫ|?䓨< 9gVQQ6>;fWژ1cqFUVVZڵo t=hɚS;vL/bzƍp7E-~9 @s1~|Gꪫtw/ 誫mѣ>'NÚ?~Tvm6mmۦZ8p@7|o34k,߿_N͛IUUUUQ@0;z?dKOOѣG{~QKMM/Ҏ;fvQw/ 0`%&&\`ğ=$]V#EI/ 9bz[}߽ JhGeG 믿^See>]q3[(I .… @{hK$x K/Tݻ>S׿wH$Vqb%'Mx?FG`: ؄ aI iCi ۏeH$xDM߿_9hO JӷI-t"^4H0~:2p9>DБ4|bˑp9<.GH #r$x\ˑp9<.GH #r$x\yē8p裏>w@0~V~~6mzrIfWؿ0vLg? ~[\rI #r$x\ˑp9<8r'aD7સۋxYg8OZfMڜ?ZI[]ٴirrrx|ۼ;ϛ7ODga,O;xG6}t.MOM|$ȑ#:묳 :j\R><pamui޽{%IP߾}7nD{8Nf@]޸q D 4H6ޯ;ܹsu9())I={ԤIgϞq\R#GTzzWo۽zjΚ5k|uhȐ!z衇r =1bu릔_nVܑ?#G*%%Egq&M2_޷gϞ[U]]>lnw"9~M6M}URR飩S꣏>jR￯ &(==]iii׺u뚔;vn6eee)55U-ܢ[Fܟ֭S~~Ҕq=SM^+^xaj8cg޼y~ɝGU0~0~0~HSffю;|V^-qzjߺ;vqeff>}M8uT7ѿ{o*p5){WK9\\@ko#0I+k]=\/^l} X&==vѤs/T;ff,ZW???qG,XТ> v\ќ۲2;묳;묳̯lciØ1c"*Ϛ$5jT:ƎklŊ裏L 0N}Ig555gٲeL?I=^{ͪ>ۼyILymذ?n'N6qf7/JJJƞ|I.JJJĉ$Y~K>tM&l׮]VSScv t u$},YblA|YX:kƏǻ0~O["=OG1q,''ydK.rrrqO:*..kE`p"齫%q6F GG 1ތW}}}ԃA!Xu7FԆ7mDw8uuu7>^qi,z=u_ٚ&DH ݲe49cV wc$Ç[RRviVYYiffwIm۶m kƏg?Ot);;ۺtbUUU_za֣G;ʺtKN4>6p\sS^)\p"w5#=Z;×,@3tusPK%ޟ k7ׯUVVt&z%Iھ}{'!!pxDrn_R;3:ρ &D?38/./$YJJt`MkZYgs5hG-Ə}Mm}?h\.y230c&:df__XJJy<Ks~E+cl{\8Gz2k^?G{iA,pёx{򁶽kMn ,;ϒ-99ٲlٶy Un&;,99ن f=\UUUxb>|Yrrw8bf}4:ў}ٍ7h{6c{n!Cݻm񖖖fkk׮mR͛m̙6x`KLL󭼼 ZZ+Wԃ>eh7D=m!~0vXg?S~~t=#z'xiۺKM6ŤΆC\eΜ9Z|ĉ>G#99Yrf̘?1_=~ ^uM{<-Y$%tbꫵjժV?99YO*u⧵ΫѣGtxyf;<S;>).swjS0~GOG#ZWr eˑp9<.w0~~xc1@7p9<.GH #r$x\ˑp9Oxr'!t*EEEΎwbmc1$YCrrrT\\0 ?ZD<.GH #r$x9#q"~O+PH@+Cvgyh7g}p1~1mx {zw [Ph)E3>rss8z&YF / ֺu딟4@%%%r-m'3vH?Zgo#0I+'lj}7緄+ߜ}YdFjرcMX"Z222,&dgg$+**23? d޲@0  `b! IpёK.½U_MM$Yaao-!!ufǏy\,//vi555k.3I6uԘ}@_bEĎwa4^H0~41OjRxi !K_$5?WrG'DPFG`bEއp9iRGzo :\}GрC)--MTRRm۶i!KN:;뤤$y<:udffj߾}A[1~b);;;h9 >nM<׫o-[ѷzkVZfl٢]x!ٳgL;b ?(" KХ%EZ #6#ׯ$i*//W_}_]7pCIII˜[oUߟ~iIٳ}}`̙ڽ{jkkg͚5K4vب 碋.o?'z?"kD˙$H{~CCC =Mifa3qo߾ &ؗd5-P4^H0~thXxjpeD… u9Oט1caÆz!߻I}wGO<ɓ'+---׮]\k׮7n~ms91m/=:4Əش/|Kt$|2:|ɲi5lذ4N_o{;j"_*8AtFGe@̙#q4h kĉ=4v93cZ7_G?'|jܸqZb۹[n4~@gƔ΁h#a 1h!J./:Ct: av(;;[EEEUcY[qqrrr+13ap9f 69? 3x\ˑp9<.GH #r$x\ ljw脊0@(p9f$3wrrrT\\0H0H #r$x\q6ogӦMɑmno؆ tСxc@c@D:ӧXuuu硽mذAF҄ ;a:7<N̬ٻw$V1k ;. ȱctm)++KJNNVVVnmݺW.33ShǎuW8Zzoݎ;8233}kĉJOOWZZnݺ&e7nܨedd(11Q ߯8{߿jq=Ѽ۰ʕ+5rHձf_ 2D=;-Pq[NJKKSzz TRR++qSO5^qx`t\۸?o#0I+7f_@׌3LX·nʔ)&&O[b d3g KYYeddDn2l _D[~ܹA ƢEbϡ dddXYY=&Fդc6ldEEEff+ȑ#C- Legg;WhwN$.艉&z-*+,,G}._իW$1cYFFuzaf5k2uT`qqXqq]}h7n'N_|a/}냵mk9;x`{׬*dۼyILslΝVSScvcz5w\+;zhӆ t+))Icƌ+m۶NGfϞ=%}+%^~}tm8֯_//ƪ IիZUTTh͚5ڲeJJJtj!֭$'ȑ##k4,K K$Gl1~g޽{} ~H@b UTThԨQ+4~xIѣGzׯ_B7N4n8ܹS֭+رc%IfRIIjkksNM>=$IRaaaIZZw^M6-`s_m9svޭZٳGf͒[%I˗/O?-I={v֭[+D?h9ߔ-h@"O!+O0lEEy<KMM5Iv!3zj8b***BҜ_A[СCB$m}K&׬yPmqo߾&\|&RRRۇWPB _\~"afѽ{wъN{tpt$qy@߼y͜9llYYY6|+//oR6tP#F0_ۈ$+((4KMM\{gL\h-p1k֯_Vy@nN;4KNNaÆs=th9X=k׮\KMM]ڸql׮]c$3gN$+Ѓ:  ƏA["$8H/cƌ 6Xyyھ}l޼y z1֜`߾}`lݫ: 0~0~\s7NA⊥.Ns 믿_zǣ%K!"̙3G˗/8q 6 TPP 6(###u?/YvW_ѣ}_9`]wuڼy ^ZVj6 ԧOV@~1~4_pdi7ظq|ޅIݯgOĶl2-[ch<hbh #r|(<XW:S}Wڰax0J=233hѢx!1@Q.=-޲ԇ+: N8:4LnH|͖+;tP{?>&^y?֯_o&L[}{3I{n33gKHH0Iv5ט$kÛYh;&_j;t͟?… cii-YĆ +as΍>ބ̐!C&v iЯ$8Hx@`f< j@3y<^BիKWy晾/~ [|yYAyyy&}];zرc쪫2I?oߋ.$ٟg33k8pI 6Dtӟ/I.]|L>C' GG:3Qc Ƴq fK,ҘrJKJJ+((%^/^l^ݻ[^^}G֥K>|~'O$KHHr33իIO?ԯ_|ȑ#A|A>|/挌 c jg$8Hx@`f< j@dgg$+**j"5\}:FGy8}>/{K/5IvM=ַo_Ȱjӧeggwalݺu~MޤW_}Wv޼y&{ IDAT8`<5w<)))6i${饗~NsG`TI\veASN{۾m633<=sMڼkLZʷEO>&/^ܤl{衇X 9xRP<#:N8:4#nK‡~h ..؀g?UVV}|1:ԷK.1I~jkk={UUUٍ7h]vݻ۸q쭷w}:B~*P|yᄣ#/~'%K~~~̮ΠAJܯNtZ$:c'Na Ɔ|PO?ݫ :u>裈@nݺ5N^EE~.uwhΝ-̴tR_w{GrG}/ŋ5rH~JNNV^^֯_Ub-X@ ѣj*UTT<a|vtAN8x@#FPnݔ|˒iӦq1/:1Bhڴi;Ѳe|Qmذ!p#f:dƌ'5c d+V2eIɓ'֭X$̙3YVVf$[xqvi;;wn:rsshѢs ߲2;묳9묳,h6m2Ioff_~-\8㌠zvf #V"fkjj쥗^I&YJJ/#GҥKm-oxklĉ۶modffF\ltR9ro{JJ'?_~jjjWsi{ήPwߔmHc|N}Ƈ??WUUeC 1ItR߾?I?N8q`&Ol33{Ϯ s'h|޲͑mutF'N޽{#G;,\ 'I?h쭷޲:B{G .[zI3fY]]eddXݭGV[[kf>Y&hSN5I6j(+..+..V}h7n'N_|a/}냵mkIzK/$ٖ-[싑>sO幉I7Mį5Oss'>/Os˙Qq $_o_I 6;N{F8Q<8a%pv B<wѣG9X~[n]DQW^`n]t={."o ֫Wg<~I@ $eҒ=lXy:͛nhD$(tH8cǎG{{qF۴ĉe?63Ç$;~x̾Dsa{GlܸqoK.yҽ!4bH։.C4;Y1bD(65 <_;Nc+stx_رcc۸qc>CYlI;n&33W+C|ߍMUWWG6D̛(>D$K/dffvԩw;Ǔh&s\>aۣ˿_ٷL4ɞx ;zhիIӧOG\r%9>󘹺q=zԞx 4iR(5k+Qm<-LJ<>8#xٓ04I6yнl\k]}oŃ `#tW_m?񏭺N>mgΜ^{$YVVVDo~dLR6IvwWy:Xkښ2,7(6y,4`޽qXtEnnIW_}Ξ=k|}ߎ:_{s_k8`MMMvkL͛7/q )~mڵvuYFFI2y fl͚5vi;|p#f̘ZNAAIojjj, ڑ#Gg7q8fdd׿uO~buuuqץ=K,s|B:[}}>}~mP\yy~˳Z\V^^t\4]}e$'1BG:v9PO>="ɓw&?YNN~;yd<7>󚙍3&f$wth}ڷcv؀ 0jjjb[#^O);z=#6jԨvs]w6d"l|:Nq5}Ѩ#bivؔ)SlΝּ;/[^^eeeYQQmڴ)TQq*x x|0;uժU6n8͵l+..23T\\l͡COY3gXbx =x;NcAG:vT/)9shΜ9NHwnG8QF`W+g}Nu"@Ʊ9^D^qx<Q8 <G(xqx<QHM^QQ>_7i:{E@tx<Q8 <&OI_qxxuz5wt <Ou|>YHK$t Fn= B-33S3gΤ:b$_ ]NZ766W{=vmڇ;3Q62335vXmذA7o$ٳG7ԯ_?eggk„ /'|xi#I3gҥKuq |?ׯMˮ, @*qOKTX2eL qx<Q菋Aq"F:<'iRIϧ8FxII<<ѣGRFtsц ~z͞=;h>waQ8 <G(xqx<Q8 <G(xqx<S|N9shΜ9N#ڵ+ia(/QUUUܘzIݻnjҗ &th~𘌌 xjllLdɒ?x1TioT@3h -]TO<$fR ҥK;47Az[jϞ= <Q+VP>}TVV W<Hx }QKfwRFT97 0x7 <qnF0zHoxaslݺUӦMS#F衇RKKKDUZZÇ+++K_|f͚6|CY+У>戸CiSnnJJJyy?kjĉ Mϴl2wVaan6ގݕ$"?~c>^QQIj[jU(رc6tШqyyyo߾e;!ۃ>͡=;KKK.oɮ k.d%%% t'Hx <1u]&fΜ믛$4h5440;+ޥ^j[nF;qℭX"4ݱh"d+W 駟 /`lԩ1sV^^n 4}&ɊUUUYqqqߙwȑm۶6c&vi`O㣮O F0zZR$k׮uuu&z6x۷o(ޖ/_nb~(.??$ف"jw2;vu Cٌ3lv)h4Z7hx$ҁIxb  o0f>ﺏy湊իIykwѣGۺuCFuF@Ҝ/ D'Q<&1zJoɼ7dw_~&^z%73SNYf2#xC-\2zIŋU]]`0j-^OX/Nl^xdO=-cQa ]1̠At]wiРARnfРA~[_~Bz*//>?l;Vׯo#FԩS޽{H6m:)//ŋ5rHeff|y|N]t`t‹{_j} :t>郞ZvO[okUIIvڕt:M _4C0N~R=NZ_җTWW4:#x<Q8 <G9 IDATx$}DZ*++uiM4)թ/_O]tQӑſwpJtM;v~ߧ:xP0Բe˔zJ N . <f֭Ft|R%_B---NOC=S,cƌc=cǎu}XnnM:ժ.M';.rrr,++.2+--={ty>죏> ؐ!C,33lϷڄ,]$s=1߷YfYFFFh}:;i繮~׿:|󚧥{16leeeȑ#??7I6x}g&L`\peeeW_m|&222?] .0I矇555ٝwim>Cȑ#Q@{}~@tҭ |V^mcǎ(2\x$,8& xn]9p@|UUU&E^ޒLlaaI}ZQQ͘1V^mv_G<ϫn^k8q W^y%a||&ɞ}6]z&ɶlbf_{b.ML"oB亨әlaGF8#tOSSS|@$oWݻmmxnݺ.'yꫧxZ;vlZ{qF~ 2IM?~O}ؔ)S*ĖŋmȑiVXXh˗/U^n4;W7o|;wnY#Z' <͛g} .Lb;wQF${w"_z%+..<ʲ"۴iS1U 4$%}&G*A{%*8 =x;s͘1kMMMv){wm&ƍ:Cu;xVp͞=SMwŸhFҦMTYYӧO:nm߾}*++SYYY )*~~˕HutQFiҤIN[3fy]~Ә1crJUVV_jSL)sE:3%֯_@cts#O]ls={R #x<Q8 <M@Ku |1GKG檱Qe]tC~iLk6l}-[B[*,,mݦw}7"ȑ#Zp, 2D ,G}b^:k׮ĉب~XW]uW_XUZZÇ+++K_|f͚v3@:7 $Cl}q͛$;tPSzɓ'Go6p1ڈ|><ץQfW^ye;fCgKzׯ7I6{$m@H#ϧlI??8+7ސ$ܹSjhhPEE|I?>wUUU@ *fd$wڶmdfK~߿_ڲeN:FBw}:vV\}zT__+W&_pN3zg̙3b3Zk&kEEE6c [z>|8".??$ف"WUU$۷kܹI7sLI-ܢ[AgΜ;Co}[ӧKΝ Ak޽Zf&L:"pVi{!\4}P\MM 0 j܀&/J)ZǏ#F$guvp'`x\;F魼\/ȑ#ljZ~}(nz4o<+??_s{ァÇb^=>|~/iڲeK]tEڳgVZq)77W*..VYYY(nРA~[_~Cr뭷_ftE]_ׯN<#Fĉ2xH2wSef 7w̛k4a„6q<{1':|GWǤz뭺[\\\?msnMs3;$]HK6ޔf0T0 Na>PI&D+/F3 xx+ x_Oy\WS-DǛz Sqx<Q8 <G(xqx<Q8 <G(xwB}>_g,Hk٩NгYpAR<)#xf^ nΜ9ڰaC _1bQHC>/\/ <GҪ:g׮]=z~;2Z? k׮ѣÇ?yޣxCZxReѢETssxLuT^3<{N?OU__;vwq={o:U')%IGСC#8Heee5j$K/ڵkSHqFol޼Y%%%U^^MF~gZl ջwoeggPv}6 w!p SnnJJJy6[jڴi߿2335b=Cjiiڏ q.eddD yO$;6#Gh…:t4d-X@}Qc̾k׮ĉ/rrrtWGI /9r䈾򕯤: ͘$(nDkPɓ귶ԼڪUh>$]lZ8p`؁;6QDƌ)**|],ٳg$[~} as>?Lu":LqpĈ'$[---1cݬoćfֽwnX6Λ7/vZCKFH&uZG; :dFV;vva7n ݛeС1/)<.e:92eL%}$18?x<QN2O|Nã#x<Q8 <G(xqx< |X vRIII mqֱJJJk׮Tq2afxkVoV|[kS: <G(xK~vڥѣGs煮:Jw>ιJbѢE\;'%<tcf]R4iχ~(I:zZZZ"煮@ϕ3v*))Qnn4m4ӲeTXX޽{+;;[YfCnP^^rssURR͛7u^oݺUӦMS#F衇RKKK~|>_s%(###2h^aNƍ5qD /ԬYT[[/XwqΞ=F=úꪫԷo_䨤Dj77Etqj_Yf2_~йFNN =jnn;t萦O.w]V'NT^^^hsN3dhV[[L۷o(ޖ/_nb~(9uw2;b= UxIDATGt C똦@A~6z6lo֭ٯGx: FĶČusZuֹ|#D>L"9͛*W^&;KXp{HSZ?^y}i߾}:vvء7T`P{oe;pr8tPyz ;[᭵軭u4h$i޽r~ٵkWmAhaHNn΋(I:|pcUYY$饗^R}}LNjL.yb{^sxb8p@`PZd$_ɓ'5i$x㍚:u$O>lgK, ~-Z(,IREEE;sLI-ܢ[AgΜ;Co}[%IsUEEw^YF&L:OUff>C-\2sŋ:tx?sНtِ1څ^h555bOE,'/lN_Rhy6bW[sqwa ]&moD ݤi&+**޽{[>}lʔ)VUU[^^n/#GZffegg[aa-_{A6mZ޽~yx9~/Db۶m6lذ./544تUlܸqkV\\leee]O4x9QO,q/ܲCjzNZ4F!%Z]1< <@IW(B PKPzǡ' =ЃP(=CB PzH#x< |Xy4mڴTHCٳgkNIN0\O>ٵkF-zyrIئөIi-Z>uSum]Li9̺|ᇒG%ʩ'apN ?>f ,0I6i$@ `6qĘ'^zmݺĉbŊX[hw;]}vA φk_Zcc=S&Ɇ sy@M;YhI+WZMMO^0I6uPh]̶gQvC UUUmϟW^\9rm۶"oбy˖-v)kll7xnP\gQto)/8p bzUUI$۷ٌ3lv$yRk׮غ6''捷~/~M;uThzEEEhzSS|>M˗[AAAi~M?nշoP6(dE,NFFpw]kn)ݻ;rbs3 <KN655EL&Ea{n=ztuCQN*`DlKKKX7=7{Qi狘޼yqOxZ/;qݏnQWoDy%-bCFpw]knӉίZh# yݺ@ w:Č{xn~q;vva7n ]=tИ;TWWG,'7u>&'|n$K/df9ҥ|n͐!CLR_ISj$ʫ=ۢ5.t:˨T'xHw>DD#xC222LRx뭷:2bϞ={_gQtO)c:pdI_)..֋/'OjҤI5uTI'|s2,Y* jZhQ'QbYYY.y"Tnn233j…1ӧKΝ Ak޽Zf&LMf?v6Jf+m@w8=ydIۜ'8KҰa$IVR]]N>۷kܹI7sLI-{wy*")"/0jkk%v9]9M"<Llx-ϟc6>~׹r@Mӊ]1(W/{=˥ TpeL,޽{^ 7ܐё*]U|+R˯5XW:7L<W+@ x2NqerUUU9w^<W< 0^<'8@ x2Nqd <+Nʱ[ȤJUuP<WH_Ӓ%KR]]]MK,I_믿~>{7ӌ3R}}}ZfMzJӾ}R[[[jhhHoN?яŋSUUU4eʔ_*6Υ׈|ʹnݺˎgg->mڴO|"=… eR:zh҂ RMMM͛ӿFrbspԩcOkIӦMKk֬Iw0QDJ)/߶G)]vȑ#0m[n-:pJ9~P9;rH\{E]{c:ߥ'?9lRLSSSö~5QysJR:>҅@<2OKKKꊖH)͛ m#/b\p!N<_'?I|St͛7GJ)VZrAÀo1N?o^l{񴴴DWWesVjM}}})Xhec\9۴iӐoڴж=q^?\8={ԩS?)֯_?LJ6@U<9x׻"/dɒH)5\ͱaÆhoo!ollRtvvh9hXK/ h):u u+}lΆĉe˖XhQ!o\1 Whws`H)ūZh/&l;#!^+~4+ZD0r>O̫xzscՑ{z_2:O3gH)EMM͠'~6:ΝXjUEH)oQ\cz8x`aJO}}}bqx뭷;9˯ ޸qcm{ٻwo8q"N>/r|_x&%dS *̙===%]nݠS7˖-twwǜ9sFuEk$#O̫xcǎhnn>}zFWW׀ŋ:jkkcɒ%e˖rÇG[[[G]]]477O?) P_p?7'/B,\pOD _€ٱcǰ5}GiӦ9sf㷿Y!ƍ1r\466ƽ; ܉(|7j8ydlݺ5VXQ[[---sQ_gR@<2O]6q)|Ug9Ϥ$ly dV_z.Kh3g S*]xٻwoS}}}N7pCSGGGjkkty9l aR~u\ƺZ3ȆIj%8@ x27Y*HVd^YVף <'8@ x2Nqd rT<_c@FYqd <'8@ x2Nqd <'8@ x2NqJe.`Rt<gW yٳSo; d <'8PISRJw*]@ xJ;)gSJ5- <0~;?NK.-krYlYھ}{zwg. vh"JBAbz{{㩧n-L)S/c…QSS/}{qH)>|&f͚555q뭷RL2%>ǯXFӧYf~"t%[IL3Ů];iӦ+WO<GSo|BX`Ab_ _-Z6G'x"V\Yxڴi/9v}}}h  xP<OIσ> aٲec?+_R̘1#~ٳgwlٲG{/͛)o[={6~ؾ}{<#%);cq⡇8Gӧ_s_>0ۆo7o޼صkװG箻R?o1RJgϞ>w_)m?!KR\p!O^s> IL3A\gWO~QSS)x""⦛nR]Jbc۶mbŊB ^>J+)~:;w;ctVZO>d;vl}N)8}?p/V]])6yǎ'|2VZUoڴiqwƮ]Og4}W 䀧?0~_>5T FJ)~ӟӧbÆ ,Z(RJq]wEOOO?>=?+M^'bvmSO)Z/7Y&Q<;v,mMMMo~@cʔ)quEJ)nZ_b%kjj O~L:09N<7nӧǬY5^|hjjR+?33f̈hnn;vM  x*9s&6loF;w.?z|+_RX0OޥA(k6ש͛]]]J xAO]y YW̙3m۶["Ō3bٲe#\Je)cR={vM)) 0)Lt <'ȸ\ rLnVdZƞ1rIENDB`psignifit3-3.0~beta.20120611.1/doc-src/conf.py000066400000000000000000000143671176542545200203760ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # pypsignifit documentation build configuration file, created by # sphinx-quickstart on Tue Sep 29 18:07:58 2009. # # This file is execfile()d with the current directory set to its containing dir. # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). # # 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 your extensions are in another directory, add it here. If the directory # is relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. #sys.path.append(os.path.abspath('.')) # General configuration # --------------------- # 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.autosummary', 'extapi', 'matplotlib.sphinxext.mathmpl', 'matplotlib.sphinxext.only_directives', 'matplotlib.sphinxext.plot_directive', ] # 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' # The master toctree document. master_doc = 'index' # General information about the project. project = u'psignifit' copyright = u'2009-2012 Ingo Fründ & Valentin Haenel and others' # 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 = '3.0' # The full version, including alpha/beta/rc tags. release = '3.0 beta' # 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 documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['.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' autoclass_content = "both" # Options for HTML output # ----------------------- # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. html_style = 'default.css' # 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 = "psignifit_logo.png" # 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_use_modindex = 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, the reST sources are included in the HTML build as _sources/. #html_copy_source = 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 = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'pypsignifitdoc' # 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, document class [howto/manual]). latex_documents = [ ('index', 'pypsignifit.tex', ur'psignifit Documentation', ur'Ingo Fründ & Valentin Haenel', '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 # 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_use_modindex = True psignifit3-3.0~beta.20120611.1/doc-src/coreandsigmoid.png000066400000000000000000001737171176542545200226010ustar00rootroot00000000000000PNG  IHDRXXfsBIT|d pHYsaa?i IDATxw\AQF*^7],29 l6\h8g@Ad܊z><㺏 }_oRJ!B!!B7` !B$XB!F& B!I%Bad` !B$XB!F& B!I%Bad` !B$XB!F& B!I%Bad` !B$XB!F& B!I%Bad` !B$XB!F& B!I%Bad` !%Իヒ($B!J0Ng%IڵklذܡbL)e%IB"bƌXXXp+VwΝ;iW_L2epttdȐ!ܸqܹ3>lJ)6lH޽~Oŕ$XB!DꫯҼys6nܹsٴiݻw'99>m6kv/Lddd裏8s ͛7sE>Wq" Bs1h ׯvvvt֍,gT^eұcG9RQdРAL>v1zh-[Fhh(֭,]_Ҿ}{?ׯ_o NNN,ZHoEhذ!=z0` !D ɉ {npppsΜ={69aaaY5kEǎt[oy߾}aΝܹ₋KTz:cϵkp[n?xK! f͢o߾iӆݻj*իǒ%K2_n]|}}ԩ `֭$&&2g3D/ U}^T)퉌$** jժe:1 >~/^Lٲe6l/$BٳiҤ ֔.]+++N:ӧ3o}^zu* <%%(*WUJ:rO=w ?cǎt 5ksq;FΝg?Ν; 8Ǝk;(,B4Wfذax{{mbŊX}vZB<~~~.]wwwN:g}Fy7dԨQ̛7RJѭ[7^ʔ)S]6޹ըQ#u֭[qss+[+6%,11ҥKm vڵk>y&{cǎ Qr+!!!ӇI&ѫW/mۆV73g+ݺuO>ݝSRtl;?H/ի B޽{|r4h@-8z(sΥVZYV^#F &&OOO( ԩ:'2qħ'Y&s%$XBQ,Yرc$99WWW֭[ǔ)S2Ut:s 4{ѪU+V\) KLL$88CaJ*e$EB" ooo"""7/_LcРA,ZH#IB!L& !B$XB!F& B!I%Bad` !B$XB!F& B!I%Bad` !B$XB!F& D a֭#K?n*&$$pun޼IBBBϵkxQ"G,!DqM~'wn8믿?}РAL<ի?0tPyru͛7_;gΜ1QBhN}ϳd>|iNȑ# ,,>Pt:M6-EմiS>|Cɖ$XB!$$eRjUQ^=.\?:uz۶m"::+͛7czaC Ν;899O͚5Mq϶m@e˖q!Þ={x"o& T}=ڵѣGӯ_?UV`NrBQo>UFʕ;w.֜>}:?oF\\*Ug۷.ۄ!&&ɓ'SZ5> pͼ ¤N<ڵk6[ III\ 0|pƍСCoL:lj*رcҥ g=l=~zxhݺ5n~oǸB#?rssS)))J)FJ*ݳjڴiiWZU͝;W:tHt:q>T/矕RJݻwOب+W>5[n)NV^Zjѣz988|,k7nO>Dt:_ezԩSj&!!))I]pA)Tǎ՝;wݻw >vÇE2rӓIBb͛?m۶aà(Wu6coFh(;wCY7|uYYY_~j{yiʖ-˾}pqqIV|y)[lsDDD0dYׯŋst;|iܸq6F 6 fu͛7qIm y,--_>өzɦMػw/?#*T׽$XBbcTPAo1cׯW^y%RJ4j *55 2vشmB 4h1ݻvڥ}իW3zZ"RJ߿?)))&?x;;'L/..0ؽ{7/b'$$͟}6]ƍǓdlNx^o׮ɚq>@թVZ_sιNvPVIKQl$&&Ҳe˴Wի4.]"!!gggKn^7oqRRR!B;J)f̘All,M6ٳ|W4k֌RJey9r666ҦM,--o˶˗裏xW8wW\A̚51ݻKKK/_tK.M{QF&yիe>6ܙ2e ϟgݺuL0 Ν;9r'PjU\]]y8z(htŠ+h׮III888.^HXXFJ֭[{hXXXplSRR JK*֭ʕ+پf=F` ! &0|pfΜIjj* n>p@~̜9/RR%9V)))䄵5+V`ʔ)4k֌Fh"֮]KF?`ڴi|}xƍU:ur/!!Aڪm۶m[n>\M4)w* 뫷_ݺuqFc1=LrB ?i?~ش9w\499sLuqǏN:zzHLLnݺ>|Xɓ'_>O&''gߙ3gի}qUWhAtnaaAǎ>*U<)))$'')Tc #"B cǎٳ=z3f0~xʗ/Ϝ9s5ksO!CS믿ouLôhaKKK@W3<Í7<&00ҥKvލGk^^^̜9j=^9޽^{06oСC3Z>UV1h ȸ8U!ze>[NPXI%(:v숕_5/^-!͚5}lڴ)Ws_=666)-] &t_;w#FjBnՋ@KB&MD֭Z*J)>|H2e6lݺuJ*%kZO5FIHH...<ԫWk׮O?ą W7nLӖ8]r97o_ſ遉'O}VR?3ctU3f0wB_/*m۶O>zC'5jԈgy&WP^SZ`OfƆ \2|ׯ_g˖-z=^x?p).]D׮]y9{,eʔT|$''7|!!!8::һwo@Ɯ:uիӢE ,,,h߾=/ȑ#lْo6ܗ8ОH]f Νcʕ____5kc}ʹsؽ{7ܼyjժ|SރIw Bn*88X)Ԝ9s#*XV* UÆ 9/_^ ǵo>Wk冡͛Մ RJ 6LZ*W1=LrBT׮]Klܸ7x։'M|t J͉֞!!!U}{ܮ]h׮+V a0=$XB!K.bb`r]jqE@ݰ'xT0K,)H%ȇW_}͛7mߴiZ*DEo8u`Û*ee 0ؾS,^ 6OXL&qWZToaX  !K.ӇSJ>uT^yڶmkE!$hD6g_7w$O>? :D) ?&mĝ;Ll;O~J9r&`I%ȗuŷ~˭[Y&ƍܡBH)ȿFt=MCP[zJIbb7ʠCBnwm0|*98PK/eʔaΜ9̙3ܡ"=_*|ҮN;sS>>ܑdA)90{ăLaY2TiŽwvй~ <$BQ |2}t;z񜇹)֬W/sG~_~~lwKJICNǂ x)]tk` !0jp =^2eM0n֎у.Y)nmrK"BaR1dվ+WYo\\wOwմ)̛.ŵBnI%d iδK]tܑn]Zqo[2D($ iӧh (XfuNG-O,)mrK,!FgH;?q6vv,m QN+V@jLq|fv!$Bat9cJJc8XZiS U|RS^{ V5w4\5m,Jfۅܒh!,[ lmm01$2 "}Ⱦ9x}sGȃЯXYodi <aA* RBō70a5j޽{GINR~P_7h'k9b]F}{8;3Z5\{pwwbŊ_30êp|}vvvfq.,޺ s;>9=ON:\b "."^lqqa}ӦT.]~'N*,,_61 M~lݻŋ2w8 m0eCd2;;`:bx1ūM,m@*X"&ծ mnoKx_;"Ύm|>~o9)<cDXIۅ<8ݻl,,hUNN6wr̿/Ϛ|;E)f]’7HJYr̭_NFXZ>\n̘14i҄{ܡ3K;K:mF!Ƿ^a_$<ӓ=Hۅ<KLĩLުZ*Ks79Ut>r^Qٲi&8cJ;:Ϣ7p.[s^cnB/94V"w֯_?GƍbŊz<<bF Y)z\')]^d㰫Ax\znb+L]>y +%WeK+QJxหg3)rΝ;ܾ}y1/E_+UDٰa&g|RE[C mq[ ewz($*Ɵ?ϒ7\nvvT*]0SSu)_ޠsf7s=5*oUHLM%6%[KKʗ*EU^;weS/ݻwe*M(ܤ񄅁L^{O}BPZ|?8`($*V3zu'*$'SRK ?C>n1V/G“2mKd\СC>>>*Uۛ!*ajҎFkZ \2~fMy h6EEg$X%@Rfݻ\zF"\ȳg\ˌhovrJ %H~k!ESbŔc0wdxèRcI܉šu0q"|9|( W>dcd$## aj*ʔKNo{{Ɔs46׮Q:S{yXCn ?}^ ˤ,_>-Az\mWzrCSQe*D^c0I;[a8]#Vn}1y. `BIw/-7.K7;;pr=鞒/h`K7fsx^LR/Ϻ&MrQ:o }چ꽦.MIj">%QgpQ..1Ҝ7Nԋu,qұQ!Dq +.N[g00E/L ²e4҄x [oâEd]Ä'&%*l{deo]*Uβp6:%Z4޾V%GHHK"/ooxL0- t;zqql)O oax8wSNwGo},-%BN-|XȧM*ElzT-@(IbHD+:iIr%DQbc/HU%&jsz˸ɕ^QtIr:@Ϟм9kMbŦ(6GE%+Ubl͚j!==ID:hdt!R&;%'kOsLmFg^y~ 71ܤRccd$!Y)+GGz;8]k# BLLݎ!4>afIs+@f;Wm9}UKP1=n8!6tTo6C܋IB1e;2-&M`٘n>>p4\sdv*e]4c*6 Ne^tXGOq` !Hcv IIw=p!> Dl,Ly;GP>A YY~[+uރC(v%K[al۷og8pׯS\9ZnԩSi۶yS;Ȥ$zZS`(9S[{/M >>DEٹ?mV.L(Q0qBXt)L8Mqwwg֭;D }k:x# @fL(UPQ09%yiÇUZT.]<&88X*88\{ei6Xfz=55Uj.7:_?WZ5S*)CBjN)Pj.^4>#F(eoݻ6dqSn~))JMśnIIj]xz)obNewz ӭ[*|.];accȪ^<}$xgpۅ^0?%X};FԊW@3xLbPDюT܋͛orv!22ef..yQ05IF3m4|}}Yh-Z<}HcܸqT0^၇GT>1Tq{v ]Y Z=)KZ,쟦Q093B3fP:N͙3${boILTFAA*21Qm۔jD)NѣqA܋S\9.]j#nN5]T(5y6}P>4а-n^Νq>5)mdx⩤%7//O0cuۅ,g ;w?hҷeSۅn܀!Co̓:](3у޽{z֭Jn1`]ȭ)SƢ[j=>v!Xc=0.Q($B䙿?:-[et:)))fLdv 7i]ȭ={oZXBzi ޸%VÇN'm fjT!4,[o1||/Sa}5#}?аP^=|0\8ڹsCHߎOm#WgU.ڍMQ΋vdk>Roޔ6 E$X(-jӯq?.GqJѦ|<|y|Ңz z7q?yY;*C; 2s>>OP[^mEN.RB*j$ w~Cۅ1cH:yf6FG͛FKEi_ul#1\=67;g戄0/|cK:2DǠcܿmI䨦\9sqʕ'|hKuJ"8Tm 24a;;\?sdl:m?O xvrKJؕaآBJsI ߻MiZl7kI))3%KYf2NN})T'DaS;SRqɸi]B.%$1hwwlm_v]ۅTfӖ-lC  m0IJ0*9VR weձUt^ٙѡ4rhorjA4gK>-:,}e))*sMOv[/9,lq anWP?? (ΐ~A* 8Ɲ3R.h1lbSTlm鞔ZQU[WGӦp[]SRS֠:vO 9JvAwn{M c$6 wL /Oe>{#¤$*SjW> w/Z=|sҨQ#֬Yxxd~rMFv gѼ~AʢbmB`iɆz6M.91^{C7QtY^kZYlڴ;vVСW\aĉX{܎Y7#SA*!5nGOā7Ui$;tP āh8V"k1<2oMJRgCҥ4 ~a;㶎ߨtqҽGrXC%^]Tݷ?)sI/Mx<j23)â(0ObɵӁhjӦ J) pv`ÆZKpwJ{#P (P.bZi\4l0v{{ׅi:E_{@ V$|}}[o__< hx T~hu$q v Y+ 6m Czf[n& ($ƍGŊOzxxDDSX4R#Yiv|KP5sq>scie/wppВgyҋAI%3,TQQQigg2D NTwI&Z;N t"| ?ƆC ԸAC]'3N:EjjǏЬY3sUl͛C_dS;mXmru&D:E~¡re6n$WB| !lƲ~z+Vf͚jL/juwGo<Ն'a$YC \\nq5eP??/.8`j}:={СC2Y=28ΜgՆg=\]]ӆ ̴`Ux8+ikgg[ē "_ʕ+ǂ X`C)2FEkM/lpVM,.ox8/]!RB P n Qٴ*Ojڝ= |0i;:2nݜ/((RB3xv3SA xčA{E* @:mqG ٱqc&D!" Ba88uJ^͜ U!6/f|wU,.HdRҒ MJ;! BBp0C,wunxl KRSxQҎABJ*XBabY]PJx5Z0@ ;=:'z; d:cRBJRXY+wPqΟ1Iy[HIY^|Q6CVqW 5j?l̘13esbtm,QsjWJ;!!`aao%wjCw;ke7jddi×Nr2 M=nEfKjܹгv֭gx._rQk.:udоG%iӦˢEhnͼ7+m#PYaCA*ך^8uȶÚGf:9I;!(IJ77㱔d1gi <8g̀ ?K'@ǎа!L۶iv._֪aYINaV{|qvvfٲe[vLۼ5kg?OX`-[u-"LeˠI d &!9Łlǰ7:aO3Z5d*($* ᫯`j-IJzZz>l93޲e0{6L}6Z}YnG{ph-˯,RjUHLfB[)X~ _%̙3bԩL6E)fb: ߁6II:v KK64mL($XZkFCnkk- *żb,_k" 6|<==ѣ{&(Ãϓ+r,H)%S&;,O?MMrӎ@˖ҎAb@ 1Q '.]Knup 4x6Dh, 7>NɁ|bpot4]YYbG*X`ӦIr% .dG1!@,Q4w2EۅH;!H%(Lv!;ҎA$(vbcyVMCZgO*4ڷzVޚ93Un1ѬcKQl(k3guF""qBWWm;`zZe'7V8;K;!JIFl2,,,5s,H%%i3۟y~E#ʎcBdE,!Dݸq &PF"Πм9|V:{Vf`O$$'0p@4h6ͰӧRS/$($B{g;]vZTxQ"ڭk!W=o!z$Bիٻw//.*ǂAg枙:VH;!D&ҦAg7/.v!;})ْKgcƌI&{r&M4#77v BP` !صk:u2h#GѣyqX6<<2W˲ qq;d`vrӎg%$XBYlA֩SXƎˇ~#$&&%24`\/>>ܻwt[\дrӎfͤB$X(,ցOKVU0e1Tgv@@Ц + ܴcX,0'_|q_e~ԁoK0/i 0`APV]־ 2wd9KIY^|Q6CVOW 5jƹ(Zn QQl {L썎f V)u!J!DQ V `ޭ=5>{Vd> ʢEK¯BٲгgXq_j$# xi ",ܴRR Ò%ɭ2di <بafti6a6mۮ]`*/\Uò Æ-|q>EcB$X%@r2|^ .h+\?mDF$E<]܃kooU+D!\Я_?ϬY27k}x~s9}K9!D ̝ j Mz6WVA~#11/ԡ<1`cB$XfQ {ǽ޽P|Ugا,gW=޽{qqqٳtؑ ҥ ӧO!$yA9DڳGKd{BBB={ۛ}1n8ڷoo zr [ԑr BSY8Bsg^{j'NN:sE~G y~ܹ 0;wiР-Z19OOO<='>BQիo=Vw'|pEڶm|v &XիW'00իcoo !D$ ҥKD׼>|;}p{{{?rU!( dt??,Ƿn @&M<&!/KTx z-ƌRƍȘ1cرc%"܅O-99 &|rpsswތ?BOa$B!e2K!"I%B$B!e` !B2IB!r$XB!L,!B\& B!D.K!"I%B$B!e` !B2IB!r$XB!L,!B\& B!D.K!"I%B$B!e` !B2IB!r$XB!L,!B\& B!D.K!"I%B$B!e` !B2IB!r$XB!L,!B\& B!D.K!"I%B$*@/hӦ %J‚ &<|G(Q… /{n#F,B'I ϟOZZ;w@=ֵ)))3sL6oLRh׮{5fB!ٱ2uUXh"## iҤ Znݺ|:t(1 !Hz (߰aիWL,--y8raaaBa$2gΜN:َ׮]I!xnIe&pvvvޱȼI!xnI%rILL4u(B!D\Or$##a ...DEEe;~KsΝAhGG,<==4Nz\BPPAAA={0"## 22?>ydQ(LbE.D^Bq1"oq'I`WlˀϮ`[/""`r8p+W/R llBc.>G?GM{}0XqIM Qvew?GA-BBj )VO6oKK BqvLǽsP:,cz @Zrvƌԯ_hgݻٲe ܹs TѢEY&ʕݝŋB3PhPB]D+Wue;/? )Ctm}eB,J ~wZexEL@'XƍwϵkCZRem}/1zWՠ\ jBҹI_g'+  ';g܊CI;cge-6V6gK,>˗yfvMRR/Zߧf͚ԬYWWWID}Gg.G_BgA#F߇zS.[gix4ۣIqGG::RH*jmLIqbE4 BHNO͓r,Îsyh;@%"T,Y֮5TE\]l3NN89`々.4J IMI_ϏmڵkСvvv|,Y˗/S\9_֭SND̞= .sN_EL4:PZ5IQ蕞?/G~f녭89Y˓/敊hT~ e0\^"|[99QpaO ={BPL #Fe_)E Žq,gϐOE!jg88%QHY*z-;t*EzOKzr27RRTZ2I`0~)׮]*k֬a͚5t:\B,Cڵ/AHzEz9 1vXΝ}e/_ԡɛ'ۏ#!Gx7 ͛J=$aٵHENJoU}Z`Ӧ?j3Ǎ?{yQ@)EXjjf|_"u=%%]ikkSޞjvv`gTXY{"KNN櫯bƌlْݻwSR%S%@PxVv"$6N?a#?0E;8p~}-XNJ9s!(Yt1+_m[HKgKcrғhV_OQ 0x0$&ȑ?+cNKh\G8ˑ8n`QΎ*U*{{ VRŒ;~~ EP*N+ZNSեjJ1f2\9},y;-(h6lzscP“_Ȫ35WlѲ|K>1Y'$A jFs">>3:˅+h@2eh=/R9y3B,111oߞ3gΰcZliꐄXwvil챑bŲȠ[PFG3ݝ 95JK\\~J RSgFxE_?COvmrz2M*mc#;.ep$ ΋x ߹hbb8ORXtsp3Uf`]x ^-ZЧO/n}6mڴڵkڵF:$a&Vڞtٝ,*ty,vmZ~~װ`/u zmph|NIJImqe3Kh\(}e#y酜/78<<[ժ= ȁR3 숎fGT{!Yښלti-J…~Nz%XJ)~G222o<[.=z0aJ@@@fB|#Alz:^0<篿9ԷnyЧ5+`mȪIؼW7+_wށHmCt։SpG?AZ|!Z j 3`sD+ERȯt-Q'qf>ڶm6mbń}vzꅍd"z(_<ϗy "Ϝyf04vklW/jղbHOUN/;v@5Q`FV̜s7{}o"#Xi^/z=ȑBUw*F{P6EDӴhQre(!=UOʕ+ӣGRSSquug֭tԡ 3xb>L@@E1u8Ld3Έ# CCJ*<0Y:>^[mA_țΝpaSZFz5ܹZk/?M^4tmȮv=|uV~j?ֵyH"ZU^]}*###kd 2D)RD|M kkl+#($KnMɓl۶˗cm.xFLMQ>i1_R͝;{wm6foomZC37w⫯j_'&ayD_!ꔪ7ݷO[5Х&J*< Wr>)N..Qzj0ٳ\pa̙3xxx`L{[xg}FJJ #GdzrJ֯_ϗ_~iԸa}*TȖ0 aLaqa,8a/ 3/ʕ2o ˖Hzme˴~HXVtF͝Wu䭓l{o%W7ojYnpod(pj=Jޞc vmILDz Hdn=EFFxmƍwҒI&'`k׮rJ~x~86V6 l<;|JQ#Xu*~t),^}#HHڞ컾~9{4{i{PJ>"qW{ IDATp617YT:͝#:vHׯ fL08ShVf̘AbM0#9:Mhh%nٳZjմvwƙ;WKz6 ( Ҫw.|-&ZUlt7+rgt{bbhĂyI|C`/UTTT 45jzcM6ҒQFC1'O2^TTg.\32LJϰO>Owxm ~cxE\c҃us.YЮ];ZǹrʬX;vlٲ >c,Y˗)wwЈ#Oҥ }ޞݻw3uTZnQז-[gРAE/[cj4}59?RŋhC-f LSXT0ح1?n5"fTh(Qpa^|Љ/g+wpBBBg]4֯_ѣ7nQQQxxxrJwFףQJe߿?̚5nݺF>|8cǎ5K1KK,aÆԨQԡ3E?fcaac%<{@#  f(sKű_7,,`mOf͂+Xq#3V+VW`aJd{\\ծ'11Q-X@/QR=7ݾ}[YYY3g:afl'۪zUfe7*Xlvc7h׮5^J@e5:pz,]W9nn`)Rdzn:zE\\vvv$''JO6u9j*ziH9QJBztm1m|oEB2^è߮]0f Ϳ|r 4OoΦi9ûjѵ pO?p%[!`;va Wnժ7vK֭)S zm۶a#=\Yt)=zS"O=>ÆA|^-ꄓ_!!0``ѐ|[Wl8z=˿̜7RRxΡ(،`%$$N;ڸq#k֬|?U&r\7dxP乵gҢB *8f/$ KCz3^^^`o^lӓpKzR#)54/RIpq6s qa;k>ߓ&lEL@e}w7njl,]ʕ+ӴS*)$%.:wv.2P:x>퓳hQ{刱cu%߯cF ^@2e/<M;Fܹ3SLYfK>̔)SxsXz}réUJ)N}pwq%ߚ5ڼ Lb2CŊ0uj\$&ƏhZ)N[hx9Chn^ysFO9x 3fϏ .PdI&NСC)R7dߟKx?^ƍiѢEc?%|||(Wu1u(Œ蕞-Ыv_ܷnisֻv2w*nwp6Jd]#4.1d9My3CB,YyժQ$<:w .p򤒻cǎ͵}zMj 0Ts+'{nݺ;Ė-[O!R z-yxquxp՜9092r66-\7n 0x_dnfv3UY^~pt;{qq̪ZO]]ѥB.b:~ʽ EP 5oc-i5ӎ(¾z gi=6@yD3J7cǎRJxyy=/ #2|p2kaܹKKK0]tرcL6 www-['zGԩ:u*cƌa={{{Ξ=mUyWM03>>YM,d:x}uxp6GerY͖ĥK뾎y?Y`oV_+Ťkטp*m{;Ξ h5 1vP:qD+wXt:#LUy6uܸsC5jǾF)++Ξվr*wJTJRz BbCT)E`*)Iŕ<8ktiW\Q/~Cm¤҃uU PJ@/KNǘ҆ ppp[nY{yyѫW/>cYfakkˠA"TɁr\*RgI*mZ7hӪ<<6##i}OG ]?ʎ &jDDh}&$V-:;x:t-[_/Ls_Njjsiii\~!iU[OwvR`Ee37nŏ8xjlSP!4h@KH5ؼ,!{&Mz)жYp! 8q2e^O\\K,ॗ^">>iӦ1a*Wl(l߾?ԡ3.R2Rޑt- h92ER6n[mkԭSs ? Uh=XBBr\\X^E_ 'O®]pwA%Xiiiܹ&mmmYl5j@ӱxX^6<}R.U91@^ώ(V kCX"w=o5%Xb襋°ere,=zƍM"I%0a&L,pӧ1Bxlmڴa 0+++ƎKf}aS+V@guij=d/uf+pGј1c͊e˖_4u(ŒW=a8mCGG&OJ-s0zho_cxtv/ポCfVԩ|xMIڰݘ[zr)=Ğ`eaDU-A-J=`pZ06B:Wˉ_~Ӿ}{\Bfؼy3NNNFyn Z_akkK GAuq4h@``z -ZٙM6:aFnܹAesd^h"k WÍ~=4Ml>w'yk,ﲜo/`8)Oco6jwk.m \KF5}t21b >`HW]6wy/VVڎ^'W>[+aЄ ħ3;7.c<Ț\[J$}ҥKԭ[ІO,X{Gՙ8q"… E\5w]]]֫&O~~~z:t`PKD82}z))1lbs0qq*(Q96Tv29$D?gP,ґ~.&ݎup…л7B`kԩq!uѣ3mٲ_!<5 2u͍z:aF r9ִܹf nntUz\"⧼K̠Lm*A۶0sY =rpp`ɒ%۷OXxZJ 2z[L~'11l>wjEުUV48؍K/kx&YApp0.]bƌE˗a!l9n Oo_bW2uyckĉWW,>dܸqC._ u 1bXxNXYx?wc;vpS':V !S‚CѸqc,cq?mOs︸8Q"UV888cPرv˳ z꙽Q`Nj +"e֞^qƙ$%%Zjňe3iiZݾu+Ӿ=]\$Dr3x.&&{/#Ȑ"̚C|(kG[Ǭ RSa0u)KKF߭9({f`l޼ixx87n0QdϘ1cXf QQQT^3fLB͚59}}/RlYS"[qD׿h,x?Pb"mxcƀ%CG¤`mۖbŊq%m۹|2Ŋ7ҥKԮ];kÆ 888Э[,ǽ ÏԩSaنFœDRV^rS.|']~ &Nd;$XBɓ'3~xJ.x2e믙:u* 6;̙3xxxd+{Qvmzٳgo3g 6ZחciiiPsnR8|X۱h!n'ަ{(--QgSd$u B?t+V+WPlYN EFFxmFFtڕv9mZ&իW9s  /=eK|~3% [YYX%27]B &/_Eꫯf;h"ʗ/@g?r%|}}CfK==={bf˖-XYYѦMS"s&A\L}&:wni|<|96{IOI09'X#GO>ƍ(Q۷of2Qаa\}VY쥊7N:\~ԩϑ:wYv-ݻw))2J|"ϪYXXi!SNqUԩӧ3Tڵu 0X*W̊+رc˖-,d._Lr(V-[vbŊnș/ժUJ*n,S>NUnsuwYq8t `Sd$ŬxX1E.W\x{2e`mm|.]ʋn_qorQV\e #\t:RJ0?D=za+J)r _׊~4o5ƈ:8;S"Oօ`sѴiSy7(Unbr* .̌31cFm~w~G?7C3 Ǐ',,L,a4;wj΅G7o⥲/QpI6+|yjr2'uwU`5 777vܙ[x75jׯ7vB<5kPxq5kfPs(!AVժd_ؖcazuU#"h'n7`0wlK*۷C)Xr%]v9/B䦱c!, vGv_MbZ"\_Y;gvcD99QT6w"0`}bb"sXBRRC>|k׮ѳgOS"CO?ĉM\hUGgor;wd,www-[fܪUd(VZE2ehѢCϙTmH^̊ HeutqhnPtin޼ɲeXz5Cdddj*u&;\7uV1xpoD&EOд) շoRѢQBaۛ[n1i$֭[yΎ)Smx&',,LE;uJK[7?NAGj_?<5(fJ]6!<W_1`> /wÂ_iU Xz&. ^ /%裏q[!T||<֭cȐ!2<(rEr6lY8? +t` ->>["31B+ɰj)bAXt/ѩFgMhj**e܀OW!88]vDhh(X[[ST)W//EK.;viӦepDu?%KdҤITZ0&OLӦM9t5jWQ0(={6;v4" a~֬ٳ+C%HJs*T-x !N)Lij?5kNNN4jԈ*UPD lllHMM%::k׮q N>M׮]9r$i֭[X"˄msLo߾M%|ݛ4hЀ@ׯ{/믿h޼9۷oM6Gpk8,_eRл7l܈7\"18 UB/xr/Eܹ"ܳ`֭ݛaÆꫯAnÆ 888Э[,ǽիiӦ}0(^8F_R oCб#ԯn 2Vy,4IN2\ %])˔1nBgR0ʀP~WΝK+cǎlڴ3gΰ{n#G;Μ9G^ڵk<|˗/s,Ʉ֭[]d?DGCBM ׻bz_kP,[ R(mmmϤ`/^ɓ'?:AQOddZ^whGFF>a.+X`VVVxyy:Q@.p6<k8ݺ̞Y^';'\NHJ Y:z1 Rz=1`ڵ=Cf t~W<==qr2KNGQ `.Z@s];mEXyv5 n<8{*_tvf}BgV`6F-\\\ REEEe}eٲe,^N:=sϘ1l&/[7n0ٻ︪ @Iq@+=2JMsW+Բ,---KrGhnES8@dP^{??EѸ\9}Eg?omPrJ9S־e t`SڿaashM7yߣ))\[K%IzT &4jԈ޽{ ~(7ÁV-t-Z<7| 6vZƌX˫<>3*+KODU[XFqQH\)[5kr1ܾ»_Ek++z>Л,Iө%XΝ?`ǚ6m+ٳIOO7`tOnСdddsB7l؀:t( 6j*^u}[.] C"C2,Ozhq㆒\cPZ#ީ=/޾u]$L||3g*r.99Y,[Q>}{{{zjq11qDR͛ ?~011~mRĄ 8{lҥK>WWi%ԩ#ƌcPrHbh!b. I&M)8o3wfZVttI4?^Z=D/I>T9X666L&Mҥ ]tg%66Fcݻ;w.#)) 777n jhZ}cۇJbݺuE6_>aaaeV+WΝ;|gE*g`h ֭@:С`k\ݭa죳yKtMws:5C+I*7*D%mݺsssZlիW9uѳgOvU*Re䞚JÆ :t(V2t8R9$T/ΝJA"֯ނN`׮BfMsZ?OKKK[N`YXXдiS\]]quu_:Q+V 66V&XR!>̛7СHJrRйh40k27M+/S bW~Etn.N$I҇ 7}РAxzzT3gxL*vZ.]3Es3&OVjs]3p|Ҭ&n&$U 6e޼y6KƦyo%vZV^͒%K/{7}`eWkהU> -[ƍr%9$YPkԌ},5-kCt>Hr2_FDytg$IK.ٶmǏԩSdAdPPgfڴi̝;WRv!z-&O̤I jnn 7+#~..]lܧ4ld_Si{s1"nY"fl` /񑳳ߝ$IVMLLX`7n`ٲeL0ggg5jD133CVLxx84oޜiӦ +&KÆ o߾,_\ JEp!\Tg_/`:QC)>aBV!߁o[^B\W`clF77MI*uuO^^?* !++ 333>|8m۶JOiذ!۶mDm}€v-txEqq?VVS#V;1/ȪAbDLT*nMVJT>0ǏgԨQ̘1>ZhC"`Ĉ兕C))Jb7 /Td/X##2Fv-ء[;OjEˌ3|k&X뙙 v x{xdfw)IRY+ ֭[Xv-M6`t֭BWJN?8p 7oɕDn.߯$V)Â#GТ݋n߆_U7S/-*5a;qUV^͛mmbaAwwꙛ;$P}K/ѭ[7j׮M.](H-88wyÇ3c ,Y"{6+1Fp&eUJ i̯9AR2*U`0Phαw2uTVyγIP6ܾxGG7jDUwS*r{{{N>͠AˋcccCΝ4i=&&&'̘1''',,,`۶m%joA5s;vLFff&sΥe˖o>;\U2RjRĂ#C>#HJ@8wNPMt/tͥ@Z]˗jyy A߾`k[i+/V_Z;}݆oz.\s;/w82|&թ\ggjVTaUɓ4hЀu9~~~\|x~WjժeH4h[laĈW!ۗ"##-rJ~mΞ=Kh4j +++|||t{,!l$e'^˝|#1Rq'/]숏dJ *ck/ZIRWh4ݛ={0{lCH'Nd$''Jnѣԩhm޽{ _hs!::ڵki4%XBu>>>x{{s)166GL4Cb*WX'g}4-q6F^4Viј$ݕdǖ-ں -7op1"b.p1"o_&KEju>nȵ˕LT*/2fM^^B{HTIO";;˗O?:vnnnEzZl @@@@ ֵkѣGՕ`6!dgg?Ldd$DDDITT999ѡCz-wNǎ~_RQsQ2N3}կpqA5jZ5y<Ԛ ԩɨ5d!&wǝds;;;\rUPWj~ g`j^|+6($ HVVtgapTI$UJ2"<uncwxbbbs$%%\m{)''D8::쌳3Z^z_7o39wRrس1ZZ#c#s Ћ2V^ƀWCQyVu*ؘRJzne -,0%I&X_%3c l;jԨNwXR%8dC$I*J`7:{ ?mӦMiӦT}V $I$, D:@ElRgңVZ6mJ$ILʉCΝ; ߰aNNNk qF:v숣$IʨRi([PhՕ-[)4:a<== +G۶m ֨Q+W֭!ߖ$I$U8rV9{nΝ˼yHJJ͍[2|kZ-Zj=SSS=ʬYxwÃJ$I@`I$I$29K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$K$I$`֬YӇ5j`ddK>..7x5j`iiIΝ9v#$II&XHBBWFV3tPT*U /pq~KZׯ [$I*C \INN 115k֔ڵk ٳt{VZ1k,|||$I$UF6ȑ#JJJ \\\hӦ zz!M$Wƌ;9sKڵK;LI$I*\W_}ŕ+Wԩ͛7m۶XZZR$663gΰtR3g:u2tzu5zQx˖- $I$ `-Y7o2sL7o^6n~`Ν,^ GR )) {{"KLL,r.++ 6mJժU$I$U&ԩ3g|v...|w\~?E)'((mҭ[7lmm 5jF2Pdң!իF\\\WvvCaddfff|nff_VgsU.^&<5Xb3b >&e'A;lV j=0 f50t6Sp"ܼY%ۃT>ؽףZYJͬ`LUTFATCTsH1T3 }l"LE bQQEkVݏ*XP 0Jp #+RDINo֬c<(oHJJ*r1b.[6m-6Sx{{o>|}}#5UbggGƍUZf͚^5jʪPenn^a{sp><Ujh]sVX8M:䩬.34;1a2%RC<}Z5T?ON&,&QgMT)\~u1*ؚ`cn=cca-6f6T39ƦOb\#U+zPa~4jٲ^ IDATZhQ!IQ~~>gݻd֭KΝׯZUV899$켾m8y*FUh؊.uу$3g$71\LLxwKKZZZ ss+Ḿ5alxMptDFreܾ•Wy؂kҜ5иf#znJݺqS5'-1jOϖ\3#$g&*N~~>::t(SNoPl6nHǎq׿fyf BCCi֬SNeСi'_QQ?9 W6Rڇ__!M`cn$s!:yF TNWLB`h8|>,(*VŘ'"NpRrRad#hcK.q>*@$W%,;l²%2'G˝}a[0hTRzA"!1yyge|"8;[h^WȈ8Ғ5TO<<=kM25U*\i\*/UNc TJc MM^%be9?Sn]XO Up%ڶm%1˗/3bbcc_=zC*!ߞ|Hz O%f\` ԭQ ΝJbu4Ԫo<}O}_v/; 6F>i9 RӲrQV6_ds;7ei4\|ZӹNͶ&&[Z*Sժ4HS@sWS#GؘΝ;ӵkW:uD:uu떡Ó:y$͍ӰaCC$U~-׶aYL ʢǕ+T52oWV{7?CRl0?(+4BuËVLk?7=Υaap^ + "'#Mefs##<@;kkY[¢Ӫ'X^^^\vhΜ97~-l۶IR|||4h]t?!I)^SöjW\s3;^Ą[S3ssaJe"wNL o]<46 <<'qs:2 oήx0Uu̟:xFR g@;h8¡$&'Ғvժ1NY[ҲJ= `P^=իGΝ9s&Bύ7۷C"\Biݺ5{ɕTf杘K0d*"'\mɕV 7?(%> u2nuk)/(ӟΞckœs5[~5W+,_?VB$&%q:5~6\HOgӝ;숏'6/FF &'NV+į ae%:.O!@1chffBܾ]6o Fclum(J%Ĕ)7BOnden||Ǐ-fܸ!&%Fo-O҃5nܸV׭[0 Vu۶mIHHR*-[m6nJ:u TIh1ggkΤeD]\h 0e lL.rɓ0lXXп)O~2b7rZ$oad8I:w}tݻ?_+JWN^tӱ665Xٸ1=mm+}U%:~x,!Dv <kkG\-Ie+::S2rHFapJs?㼱bQ|z~>ҡZ5>rv.>0`*өt5gxMY>}P+} 2Ryۏg\Z薣Y9`%66nx  sii|Ůlk֌XqKg $=mf̘AժU TLcs_KuTyyjժnΜQ;;éSBjeNO?)^ږ/Nmۇ_f=1c\$W;oʜ+Ҩ(Τ‚e 2fM*%OcV/11|AFT'';9QW^:ӓ7|ۓ̈́ 7n4jԈy; ###3f䄅%FEnݰ 777-ZV}tcI>s\]]eTRpewzUfQd$&*:~\4a2Hr(ٗڥSɜ;qqJ 0]rsxiK=t=t>{؄슏 L EntWW\}ׁsjZTJEbڵaYлwoagg'VZ%N8!&N(T*ؼyC8p@T*ѯ_?qqI1sLRӋm'`韟 Tɼma^S;B 嗏,!/O~]ph}8ϖJLC* SSSj֬IhhC~wy{7Ν;Wl[LMM1{`[ kkk9ǀj57ofر ]eDŽbYK?{BdgÐ!ʢ@//|}r Ӧo~DPܸ/Tԗ|k^ipuU*iv<Yפ mҫ '`5lؐ@p~w$]Fkyww􀀀bN6\>`֭޽?PqK;pz=$I6myqLΧ3ѱٳeOWOGÔxUpwWV-:, .)^SvwzoeRbrx^j5c_:VF@v][\(z_EأGN<ѣ1c#FҥKp5>S}P`eҖHÆ &&&۶}۷aÆ=ccc fΜGڰa[СHHTj'OnH[}{Weq{>hv: kHNGK˿"۳SvGQ{v IZ̜|(= L !O777ԬY97]6'XK,!77W_}ccc6nHnn.SLaʔ)q%[?~3`&M%ǎcp̘1[[BFŨQvȾ} Tl33^v{Y|!ԪTeGeOS?_N*+== _pj~wԛ?_f|C/h;w/ʈ'|RD?:v(ڷo_kׄJW.mEvꫯJ*NNrן˗ qC"U2-W#w, ťW':*BC03wK7rjz!T*!=vxgOvp!LLXࡗ-ΟV36Vh'{}VYGDW:TQwwwԭEŶ M )Hشif͚EDؖcfw|<ͪVn{azX @r 'r)h}ټkvl͜ns즋Cᯤ$rM^stC!'¸q ^%+3d̰að{ ͛zСCYz5;wd7l؀:t(mzpBgϞ-8/DΝ;ǚ5k Tl؎}\uBWRcjT'*Q6#ܳG-q4ןp.u*Ob8* ֮?+",d[ pp`E*JeM/߁cǎ1n}b,qwҥKvɆ 0`4oޜ:u`}cH~~>GfTVЇ~ѻwoLBZZlٲCiӦ? &IXXuV_~:u*/2'Njժ;vEѻwR8rB<$6/~w,\68:Tgd(W)9Kܹ!!t)7|3hd7kVJ_< Ca\P;^=>__|J% yY055eҤIL48.\@XXԮ]N:Ѷmۂؽ{7se޼y$%%֭[ hiZZmɓ'cmm͊+xWQ8;;{'TjYf<3EDsN.46 J%svb|9$$?U>|U8ySkVW+{>?#<'͛3FTTI'-Pdd$RV>CХKh۶-iTB֭+$4a;9#6s۲%c(nKK@>xs5w[lY:̆!xNAy]e\DDʮ7u*Z!8N3$ɐ>H[~}|||h߾}sW^Ch4}c8s FFFtޝ{!IeDGGӷo_C"U2ġIUZ~>SSaC.^͛boϙz 9}uS35LZjX<ԝ;YLz]1G[3? : qK/ĉ'BR3do.(177{Ed_~Ş?BͱЬCv|YY^Y /#C8L=pR01)rrz:}p45pV8+ӠV9rիWsNAAAJ`` vvvrŮ|DXRYDpwETz^J}ssNn-^cddw##B/33$}277qǚ4iºu%~x{{A;ʘ? 3zbwݻyW@!N)f'4)oz7[ޫҒZ G_zzѮ];N ʕ+6lXfff3zh}Pa+]!11ݒvirrrd%#aGhsrs>8q!,P^}yEةSХ|ePk=>Z-qvKKc?llE ?ᐣT` 0`c匌 ͛G G#88&M:~ 8i$vUI4kp$ hv|z:'M(vc2ZV+C`obC7~#GMFVicm͞-U 6uV̙S'+""gggVZ͛7 T\xg}Vn]!ФPZҨedƉflޫgx C|[WoOg:=VwwmK˗^ {erUzBB^^^DGG_y۷o`BUB_-Ipo,KbE)=ӱNeTJ0غV9U.&c+[?RQQd\kj9ֺ5ǰ{uq  L&NȌ3y]VVbhbcci׮C*X_\l]y^#9\<$wZU{H|G5g^iʓh*ժjvdfA=Y\{{ƍsjuV.iŞ -kRvom`Ie7WAYYdj5ܰfҤb.Ra:x5s1.ŒVo3'Pk0o9-ZZR+00 ^P,}JYK*+.\'''C"U"ZR%.>;1 T/6܄?󕘨x͛O~={Xث\\Xߴ)/ܭ%OzOj׮Y/Ÿi\FF3f <<<ضm[qss_~c=.\]vrTBBIKhJ:DViuY :v-ewV.y-_ؚ>}8q~}ԪUJwceffG}7111ߟo5aV/2|g_k׎QFe˖G]h ر#GAԒ/AЦv_Hvj55*[!x-=DX1? :{ O+$C$w!W\} 4+ޞxzzgƎݻsK9r[laĈу>a IDATFQlO/1-b} FXX2؋غPUwp-53jXM֮U&(˿1,ϵhD`T` lc]!=ŋ:guu6mݻr }eXXX>icmmͫ7nGܹstꤻʊ+077w)Pܛ8ye2`|j/7}X9IIiu78eoq__jr(އҧ~憃xzzr>szgk׮V9Ŷ͍;vФILLL[.gFV5nIIׯ%~.LHSMK7X8Qo;Dv#DİpZB{VGZn/b.?7`T'11 9nwObbbmIHHcŸqQϟOTT7n[rd~*ܩIC%-DZڷViՍ֛]RzTN1 ,YnRUf[rI?~MZ-xzz2d:vHFF/f~ƌ^3j(F׸+!СḤ&o& hWޫT8x,W^xJ8NՍ?vyWU>Od8zO4 'N,ؓPRѿj׮quuez{=驷6TIII6..}:ޯ_?/^̕+W`-[6m_$/!!"K]}z6tNph`f0YE3b_ۧV3%A/Ѣ]͙TNEF␒w/I`-\m۶|rnܸ\޽9|^_Z17:u٥ݝ"hݭvgײ6д铭.'Lt;v b3䘩iZ®]СT~U=zu,yȯ"²;NNtYzY{a>sMFj{4jԈ7nZ%KЮ]vϜ9×_~I^^^]JFF;w,t|Æ 899ѡCb6 !(t|AzJ9N)$1WJotQ_ՙ`ef_ޫ|2A AT1wB0)$,45oo3FJ!h:v󜩩ޓYfΧ~2's4lؐEuԯ_?z͔)SHKKՕ-[p!6mT 5a<== nݺL4D4i±c:ujuR ~Z2fM/`eg,bEo_ʅM+MeY/[6G9՚5`n/@%{UfMҥKs!!!|9smР/k 2IIT"R"Pk:{N o ZAkr!s3+{2&%A(&7n GG+^|_ 0 WhOVV?̊=g6KKK-[FLL 999\|Prʤ~FsvvvOƒK``L@PP. ԫqss X!!&X5DCBݸK]]! @1z E ʢqƌ?Yf'|4 W^eĉ899R喗GXXL29T+={JÒ%K←^:UTÃ| >[h4rP*s4o MWk4it@`~z$%nnPïOVyzu%ݼ SӲ Z*seRhё,Uvʕ+:u wN Ty,KS! cZ 'Up ?>KټdÃ_DDղQ#e̙3J+WVhzzZnoooL"+LcmmC*%X?bJ4:IIrx!AUӿ@ylVDG3u ޴I/֭ Lz<֭[&??Jűc" I*SAAA4mTrT:" Vj*> ̿^ m: wn(4df>:F-SS޽b^a8(nHBww///rrr +%`uqI(TBB+|0!܏U tB~4M4:Dx&5,tqrHH+`-YѣG믿b|/$UpB8pC*J4xy)ׇY.0) |}acZ\\}6j}oʊoi򍸻Tq+..I&JT&ϒ$`oaO ipRA+'m/P#oԚ] _ٷ#>4btLسG齒,777IzY&XRY5%sGIjZ\"Qr{JEoޘ_`VGaa vpݿ'UQ&`ɠ`}|2ɒ*PeY*k:mlsgk/=*{"!+|h RD沸A'6oNR9X?# 4hЀceeU䚽{; I*SԬY ]J$0ѠBNU@lZ.O!8dbuk_aW] VZ͂&ծ}'M삖 J=XSzu+Cz f̘xxxm۶Ǿ-KC"##[Ð*dhhoin.?ݻ+_uugϲ 9y W;W9 lѢuK/|bn%+{U*=ރG؀ /sE/^LƍٴiFB2cW\aҥԪUKgң"nKEEPyT.(IV׮ױyyTRk0= [CHV{3n8&O,ӳ(ك%T%ӧD^UؼÃBW;WT^/110|xD+=-$c͚5=}2f֭[Z.W;ּ@q㈉ܹsǢEHIIa !d%?i`2տřNR&+$D%b:VhV k~emJnAT=JMMSNL4wqQ_geEӲX\%4K4!V.-FO^mKf@%%+o.)**@ e 02 3|~ ̰y g>s>{>sޟCaΜ9 AEE!t 㨲>;;k֬W_}ۆ/ !1x{L;XWwMzSg_4/^ypuG_J=Xt}ڳG-.E+::7nO?@&aҥKAWm%dy2Lwۺ:XU|yW@wqEE(R*DWffĉt?E(J1@O~A*z+Wj|Jŋy=\]]uRj^%//˗/g}sssPxCyy9`SW6lAx8!//fff7I!ɯoO ˱աF`]p#Dk./AQz0 Zi^tMt)'X_d>{Ν;ooo^íZה 0 PTZU@nn.jjj`,XΈ.L]P~~>|||hMbP1, ֫_GhTdᘡC I9}4,%ܨ>]oRw#&Xҡ`M:+V^{5888Xb/_|?ٞ,F뱅4i$ )) /7x7..>>>V`h-c!** ؾ};||| ˡ'1ܮ՚1X7nꋌj`]K+HOEHQW6u5cM H{KK 4O>CwŻ kkkBCCz޽{ -kJsa?9r޸ٳgcǎͅ/1sy0yyy!1:?}Z'S`y6*¯y"jx 7s~O%%ȮFIBC''EL:,kkk:tG!g}= l퓉MlN}!::˗/Gii){n-JJ84L)ÍbTT. ;J%`gf.15 Y,ܮ5`m((S}^p,s% gPC4|nnnG/[[[lذ٧oߎ۷'NGRn/χԂbJ HKz{._ԳdVUTy9vx^ ?ހ 9s)))QFa=B:bܽ{n+,7EJk׀˵)jXy9tHNc`tP?X?〯 aiI&&ဃ#& ֝;wkػw/l!?Ij`ciXd%ë ^aQ|5?_ΙuuQTzО4ލYOFK: .^GźuPPPR]ǎâEe'J4,ѐ8:}h#n܃EPTzu RR 0/.FU]ug /0b`%&&bժUx sssx{{'VZDC ``cc+!B)(`[Y iR?iU322lum~ܺݻW_={矧釺8j|mذa:B =I 1|MVz:jN]kk oR^tX[z;=+p ɾ~]܃] ְaÐt2 1ETdCYMhY^S٭^8;kOG{C/_Vd]ml𜳳 lmՃH& /&L-"""`ggJ$&&bF!00a.&B=Cdl5$XW?"Hc'^kH{.͠k^Bҥs΅uGGG̛7OSpYuza0HӰ{Zz|u*,םw-֌bL`>>Apppٳ'ND=`ii 777L<YYYH$("'/*U'523VLtJ!rv 3<=e݁0I:<l!99Yk OYߣ<{Wt~oJ^z%ر+VÇ1tPDFF"!!>sT*DZe\~!!!6P%XXRusCZzU~M$XW^y?K=g)ݾ{عxU@,>+##ӦMCXX.] `Μ9ؿ?y]VMD~qM,Z  =z4z#&&FDHcBI#{Dz:{zAB/ƀ79%9P)4=XUU@bqg4C<~p` FJ::{<==h|Gɓ'M6R_%Z~cʔ)Zg͚B?^ﶺ]w(((=֮J"MoKPU{te һwuo `^ R ,fSߗ0Sa"DP(􄿿!idff߿?>uo1vu`cV{A?<]SBeJ/JԿp{=#jM3PT>kРAJHLL޺x"|M̜9)))ضmǕHNNƥKpuݻ7 g}ݻTIT*̞=gΜARR|||Z&** NNNZ"##)T&I*RQbp*u%lNQ49t{*B8KZ "CToL&Hb2Oqa<`RQ[[[|w9r$xM|@HH1x`ڂ8TUUA,̙3Xn<==tR\]]uRj^o c sE||<[L0UްaXLH$-[B U7.$ޘXy  ɽJe+X9yp%#C]$kjFIL ٳgammr={2 ƍ ΝkbvZ_Xpaݸq6mBRR>S7_0`Ra]rЯO1̙3qqqضmɖ!1nz+p73DB=XȒDzwc;?g4M\ANƪUpL>7`ܸqy9M{cXl/aҤIHJJZ kf^8|7A󮮮%%%`VK͢Ȳ;v]T«Vu*ir)d]TT*IDAT_ZӉ -[`ժUxqQsƍ_~[x'ڽ}@@V\K,B s=#66'Nyp|g³gφ5.X۶mìYЯ_?;wN󕞞nSTd2c`TI b1{R Jǰuq/.k9@PRB^ݛ7oƒ%KzjߟJV*aBڷo|rw/YGRARi%?38ömۚw{衇ks謨;1iP׺ۃPD4\E[*JpNF0:gٴ 1nEݺuCuuǯ۷=bÆ (,,DMM ӵ+ؾ};гgOͲ7nN|5`cVIaqW`=uJ%z1=X~8TZ۵$x`+_:> %X꫸,Nհַ\^s(P(V+ "5NĤ42 66V.D"_ǏE 1yݠkj%k`*Uy dnۧѳ'УG6l\t,> O[ %y{~]Sdnm5/@ʼn8~Əؾf bIt Vdd$._"cx;x zqM,ZuVdeeٳ6l`ԨQ8p /^s<:#DX[[;ŔHl5Tx4Yuׂaۧֈ߿?!L&#: ܹh^קT^[m &ώ… d2"BW!;\mix=֨Aӽ{e bѻYS:%p5 u(kvvR*Cҗ0YYY!((AAAիƌ @BBT*8+W@Mmn0hР B: 8z(&N\nP4ir9G A]… eعs'OOO&B"vNN*vBB?0)8 gƎ;)T*1x`TTTO>lق 99O=1OBt:-۷X|9JKKݻwTTPTZ^[ZZرcXx1}]TWW#88B`B!`B!,b4 Nc(}_G_LhJt_0>߇P:u}δB!g`B!,B!Q,»j䴸^YYXsTR0F2H}tXGuuԥ:Xwiiir,^cǎD"QϋkcŐ!CӦXk5OIIH$u…6A̙3Ҟxڋ4۵kO|wprr!ۼ[na…FEEET*ŢEr[G/ѣGk}饗pE|xGHT*DFF~<ϝkQPvsII bbbI&!66ǵ)>Uyy90{l x7 Hݦq[=mfx뭷10~x`СaQAAeo6/{ĉ̙3]-..nу=쳚e`DZݻwk;vXx=^kZ]>7TRR8c+Wlv|_FzٮmsO88c}ɘm&%%qǖ/_[ĨbccQ]]>sN>}_~%X;uwwo = 4~cʔ)ZΚ5 8AGAFglW| ]^Ɯ۵݃wX!֭[!0{l%XĨN:WWWdgg#((QYY#** | y/^̄?D"_x=^K גڮ|ОkZa֭8t.\ئ}ϟ 8::",,MɄj3HJJ˜1cгgv WF=aNNNlƍٳlΎ=䓭ɓSO=yƌm+,--YZZfY߾}ٸq㚬[XX8c| kɃ;_נ#vZYەT*m-B]sc7`1㘹9|lɒ%СC,>>3sss/jBq۽|k~wƘqlÆ MUػw/b999XBCC[ܾ~[l8}Z˅GxumGqرcޗ]QSGNsK.Ǐ(fff>Vo5oL.޽{V/T2dssscJ]۷=EHxV[Mׯ#44Tk2 /Ɣ)S4ڇ\.;# eeeXYYaݺuDoe+WĚ5kG5y26۪ܕJ%u9lmmOkP/,, gyjWԮ$̇\|}}5mnDXz5͛>ycxqF(f_a˗q%DEE¢M>0s4o2Xvv7n0غuݾ~&MԦVX8cVy󘽽}qٳOAAGDڕ>|ό=xV{Usqܹs-+D{8c uh3 ,`DZ6o("FuQ8_~%86}MM KIIa'O|0fccN<٦_UV1ؿ/:tq\GLRz<}:+jW>{AUsx fnnJJJZ\^Ջ 4Ufjjj >|x %XƏlllڵk٩S뙭-0aBٞk׮eDZqƱsαgj}54vXbbbܹsql׮]-sB\cvEJ>g;x ۻw/۶m8l޽l޽Vo[t)ۿ?KMMe?1c8}m:rg̘V\8N>;[ֿfii٦S|ݻw3Xlll%XܹÖ,Yz,,,C=Ģh@̙3}5jD:E"ֺr{ˋYYY6?ҖE{]k`lԮ]c={7o=j֭lĈٙ1ggg6zhi->bdvvv̌ɓ'/|c2{{{&ۼ-8YB!DF !BxF !B("B%XB!<B!g`B!,B!QE!3J!BxF !B("B%XB!<B!g`B!,B!QE!3J!BxF !B("B%XB!<B!g`B!,B!QE!3J!BxF !B("B%XB!<3guJ)B!B!B!I@B!&# B!d$B!B$ B!BD!Ba2!B!LF!B!H"B!0I@B!&# B!d$B!B$ B!BD!Ba2!B!LF!B!H"B!0I@B!&# B!d$B!B$ B!BD!Ba2!B!LF!B!H"B!0I@B!&# B!d$B!B$ B!BD!Ba2!B!LF!B!H"B!0I@Bccc`Ho|XXXY`4m6mzSNM4Aݻw¨"kI"f)^8 lٲ7 g= Rpaz=T\saĈ&[j*&M&Mbڴiԯ_ϕ:,LyD<ܹ3kf(^8BaLBEo7tܙʕ+s,XC_pttLױ+^-%K͛IHH`ر)ݻNǁprrzsTFwޔ*Uꥏ_k?~<}aǎt=SBc!0#Fc-ZΝ;9s&ǎcܸqܺu>,ǚ?>,]4Sq=yիWӪU+J(b}pp0@L>@{+VJuTRTX еkWXpa#" ȳ2ZC3h n޼Iqrrښ&Mpe  ٙ sd,_|8c˖-4oޜǏӥK\]]:t(_mSreZhy}18w7 44K.Ѹqc8qZJcBhР^^^\pf͚ڍ6mNcܿiӦgԨQ;o駟8{,)ԩׯ_K.*TETܺuzѽ{w?~֭[iݺ5/fI+֭bŊ=֭[իW}F8p:Dn(^8aaa\rk2sLNݻr cǎM]<;ISNeҹsgJ.M`` Nb˖-n:M4aƍ߿#Fd)ܳ̎"WPBQ7Vza{tJөE%[7g锭?~|uvR:N1"ҥKE&;!!A-[*^LnJө*it:7o^9Rt:lٲ 'N(N}Rdɒ6i]7wUI?%!C8NS P:N5m4ٲ!C(Nƌl[TwMZvZTUlllUZT1uTԩSuEzu֭q$NSOu=|tRJ7>!Ų~Mt:շoT#L#gРAI uVy?B+VdԨQɖ=fƌֽX[[o%[޼ysv'ٓ5k&-#͛7OZ.8gt6̊Ç/5z1~xʗ/lٳ)\06lH= A666/7@LL ׯΎo&ٺ+˺u뒖Yo`gg3tnTOgĢEXxqY+bw/VbŨXby$ "Wر#%K;;;zd7ϋbҤI-[ P|yKbccM0ڵkXVHUE*^9iunQǏO͛ӬY3~Ǐ֖uf1 eR2fmmMƍt,֭[DEEoP@8ƆZjJ7|ѣGuV|||2ty (x,Cdƀ<;V޽{ gggS{Mx6miӦcmmMժU1cFѣnnnXYYQP!j׮͂ HHHH3;w0{ljԨARG.\壏>"((Ν;3i$뇯/ HuV!]veڵtԉѣG6mݺu3+|$ Mmh7ɖ%&&ǎlٲѼys8u~~~\~F%XT<.D +ȞsZS'Κɓlmm3|=P .>w޽پ};+W~W^.]u&k {Y!!!ghҌ Ik W=>ܺuΝ;'}MϞ=hذ!xyy%uzu[nz ӱfTtJ~[Q<+$e .jBtڕ]ٷoK.m۶\xW^y%C{=ivJMb/}^aaɒ%|I˽R|*:t(+V`̘1ԫW/E\nI-Bd\%9T M>=Ms`ʕ Vh-Z 44O&opرd]}+ōӧO_cJ֔,YMƔ5ɹs簶J*35+Wښ .b}b\vU\t)O^4mڔs2yd8p@ěČP$v_Kw{ObETP!Eзzrqd,X K,I|7ŋaÆdStIIWqM4I$ʃ9r$+W&i~__dtRUN ,aEΓ$r֬YtdO&7oεkػw/)~ӪU+޽˒%K:u*/Y8n޼ɝ;w%iΤo߾XXX0w\n߾lݤI M,,,۷/!!!L4)ٺ۷o3{l,--u3߿?~i1_L2%>}tnzo+ij]=|0=ztRQec]b|0:uꤺ5X\-gfڴi~Kz=7oLv@&N+BB#?z_Hd5%r;wPn]BBBhԨmڴΎ|q]֬YTYtۧe/[ߟ5j⒴yL6ǏӣGTy73f ǎr\p'ORR3rPjUʔ)ݻw۽{7wHzϞ={ٳ:t;8~8*UJuԞޗ)S3rHjժ;#3NTR%Tie͚53gΰ`Ο?O&M`֭xbʔ)}ټy3ztؑXvkƍ75b̘1ҴiӤ.]ˋ2eЫWm[h9sxҥ 888$+He˖||WTTΝ;ST)9s kfժUI,ٮ]U 3Ik,^O6H<1/Lxv _޽{ԫWH f~GN<< k l۶-ź={(N<<<%ηbecc0Vje˦vJ׫c&[ *zV RRqƥkH-iӦ)Nz}'iş'OB -[I&Y?ȑ#UVAYYY * & 뿤7 Q&LP*TPVVVAjJyyyz(_e*+++UlY5ydt:ڵkMz}: 6mR=zPJYZZ+c*7oRJɁT6mʟ?*VС:zhdgg5j/PDj=Ղyga>}t:]vc={tj)]r%n/Kk$KرcSM@t:ھ}{/\t:j֬Qc";=zʗ/wC1SN)N&OlP2lÆ i~ 2VRիWWVVV*(((]$|PRJ͟?_aR2D(R {/i[777N<ĉٷoJ)TiժU *Dz)B!B1?VZQT),--N:xzz;4!r0>SZj z 80i.gVjȽΝ;G֭qpp www&N!/HBCCZ*J"<֭kЄs6oLLL ;wD4hЀGh"BCCX"ݤ 988;!r UK\/Cڄ0|`kklmRG!H/02qqqb <lU"##)Z(TR=:DyŅ#FCdd$~`ذa)!/ȆΏ?hOfΜѣS6 Ç&Eɽ{hݺ5Y~ڵkSn]^yt:'Od֬Y;v~ ȵ&r#c^knnn?~:Pt#F`i'ךȍ'{u%uq5vX/_>5uT]~G~r_:zt#]߿_t:5|'dZK˵kהj޼ڿ:ZprppPnɵ&?Z^!- FVT)J*@ӦM|W :ŋ'۶lٲ_*U4αc2|l\?ӧC͚7|oڵk.\Hu\krx7nзq &`ee...Ӈвek-y^{F;]w.~6XڵIHH;ER@TBZLisk6`L>ރu}rysqݺuի'%j׮>$/^ky}'^%0w.L=z]&^Md>}|Q|ys"DQϵdRsLj޽P~}ӟ\\͍Wls(S94<=/q!T"HF=osN֮]˧~C"KEEgg$<AZQ$=xMjS;E{polϟpü;$"S &N?aZ4wTBMJeZ+6K[o;*!rӽkdl$6w%=Duh" xyyѻwoݱm/;4!70o̞} O?UVHu˗/ӢE lmmqpp[nܽ{ 9QQ{0|8 |d^I=)#qqq۷nݺ%%KiӦڵT! aJBVPVC!2)$D UJ5.!~ӭc;mʷ1by$ &ŋVCyԥKZA^{Z#ʜ۷o+b]5GLL"=}87a6 ād^]v8::biiI%=yUwjtϠ=~};[ocƋSH,S9r$|gEAGh̪U34zc*ŤQJL L(ݺ]ްs'loƍߟ={n:`0whBhc=ڶ.WӽkJ`辡ls#nkF T$ &3e6nŋymcǎ>ٲ޽{ӻwoc(ra UzV1y6mĦM- 1ɲ\kvD W\ckÇ :aÆx 409HSp^VwUJ1HV5гzO#*Ib̘13g2bĈn?|je"-J9Z`aav~ej׮m9낂t888\kTaT1CkX:s>M}-_&L` "#S'78|ꦿVRDz2V~3bY2<<<~&NhpD}%}+V70rammիWS?P20 mֹY`%pi~:5k‚E2|p>}jD^e-@RO>aᅅ,m 6by?gʔ)G!Ч,X+HF?~:vΝ; KZN8A׮ҏW@: WksCի̙3|_vڙ;<h398?{W沰Bf@Ej ̝;SҦMڷo瓭7BCAgjOZs= Oz_}vڷo5tЁ'_|A"E?~9yܺu0t6$$$_͘1c{, >ǏӬY4V"KiO={0tfɜs]on6JE&M^W:.ŏ^OuK.)@]tъWW_U^ӧ&3k77dͳdhѢQvvvk׮Ν;FIVj(@0y~7NS7nH޽{Jө9s<&G*իR+O}֙Yigt 3ؿxd<a^"DĵV-m^*5F6øqP`X1sGZhAQJQn].]Nǎ0.`(X֬^2~d|T#f6)-vـ$ B`+Wj\;v DFje׭?ٳst׉n݊ .`0PD Ǝԩ4YRZvt),_2Vc`;9-HMH"DVlgȗQ ܽuKҧ#2 __;W(]`62?72x`6 %F$"ѣAZ"B֑#Z/mի;"!r/ٳa|mPUlkvc@,mTlF DF;?'|$BRZE6m7|aӧkMgk3`ه{r:nD"8:unxvf*??s!Dx Ю/SA/5Bdo.33ζwR ;&^'gGx{C۶`0cL;H` iׯk= m@`D-<9C}[Ҿb{6t@~fW"/^\N)'O,,ti޲"v쀁L`ŊH\j 8~86w{Kt߂E\:].!Bdcg[oi=Ν˞GRls="e+7cnTzqq}PЮ?/ɇFZq` pƌeYv~y>>l&_>2dIJfHLZJ+7P J;Ʋ#<  Ss$Dlk-]/?庖Tu>1b"I"D6@X~&Vs0>SZj zs%Ev-|yx~o?HH`kժ^=Ɩ,'OS_>&M`JmgK>bb~fWpS*[복Z5Z+8=zŗ/:n$ 6N,T7 ݯM&[VZ53E#rӧ KKmֹuѿHP{ɯŅ*._BmUad߁lm3֎F T$ FFpp0,_=GP8͈y{#\][$s΀ *P7;=lM)X@ذ!lE;*wT+Xi0 :66+WE Z Z. ߡٚf8ph8t6b$1C̕+ZQ = ˛J)N0LJ2eVxݡB)%O С;ìYzk  חCAAXG"E붶9ߙ3С4j >L!i- r1*j@)H"?u}P&,MH`0jذrez)Uvr% >={bccC2e 40wX"}[WsrU~~P֖+һHl5JL9wNYV*|lm3:=Ո SO7!LlOc|FH\?CFGё#B >]5v럃&Lq8::9sФIOVz~s8 pTn8`"ER85 2OPBŋZs͚wNiF\BdF T$ BЂ0nvbEZ_HϏ؄-ZJLeiF=ǫʫuҩS'jԨ $$$Za:7}7#"eͣGk*W 30 9@VP ;4_ۜN <&' H64vXvݻ7{6SD"`D=[bw,< 13dIF(A1#f=6mbӦM's"AF;_Zlllԩ , ::4%ʵj-i Ȕ)-Ǐ494' -TCgD!!! Ws6ؼ\98x0CXۂ`N 7kfÇ,I|<=\\T .'K vC[ll9Yܹlls8wwwԩC…ss`0rJ[d?qqZwǹswo1;)S< 6OGGvVF'',L+82r+Ѱahڴ)IiBpeggGj3>觴Жx(ZÈ sF+ȶmضm:wRti3G(myxVifͬ=0y{ߟz=C\]S$e20aVE׭]\}bbVT-[0{l"##qrraÆZʤQC^5w`X6pJYYqRWLx^}t.[ⶋ(s9sׯ3ydOhGpX æ/;k1PHbdw5w.]k˖͚*8\ooSʊy;3 FH lBJtҤIL4dӅ Zwǘާq?RCC41qJiH>wwpuCs%;J`ѣG;YfQxqOBӦ ǏCt܉ˆ{Kn@Ev! YaM/o_ZGjڲJ{Nj=;>fEWE]l0jԪX.Q"k8&`fD嬭ƀbŌ:\Zbcc^XHW2 Z4I2rHVʰaÌ~.C ZG\: ^{q~a,΍$"࣏ }ӧܠWCCO`r /Qg3 +*UOѢ;G |}ĭCyR0oLMhu23^T+ V0: bQ)Z;$dāc5bnX3WWWN8,SJ1k,N:šCpΊAo"{ڴU_#>!A{Fβ'9LhVaYmk׮?. ||_yfښ6DGsf]TXO_}/#$$70}} P|)Z!Զ3~}m_bm{bq*SZ|ѨQ/ӧж-6+{CF6vH*]$" }kÆ~T ||Xn0@"ET)^-dik_ tΜxv_sy?h m6n??ccypaW;EP(_:9Jfۺ:.>4Y,<:tk״"ӣb䁑c5뺬gF Tnimclcd.QY5e ݷuf' :xmyQxI{B߾PV#=JH`x !~-ȦIRgg3$Z`SM8Z;;4ZUV; alЩVx=:R|xC]\ʷW+1PSH"D:?=)ZzTJ/0ޜ Ž@/bŲԬc5>+gsX[XvV£~}[m0!2 !<&$h1<(:Zg|fku(,u/ckI$"wf'ppH{ۈxDFΎժ䕒_RY?b =%햐_i#^KXZK@._6Y"wZ=3`D g?<‚]]y5[Ma7麥+>O|s+w~N~~fVm(S%&z} c}R|~s朝Â6 ƋS8+WС۰a6gjbbX!K}} kT>&{x,]Sxj}KkX^``Gmժp&쾹SpI~cJx ?-~mPʕZ:uLbcwo8|X{ּyv~z:3dn7HAJ!Ҡu>-zo\ g7=R=WW>,Qie*XT\vc獝Gr#O՚ MCB 0dVRQ([6BQҒK=WW 0mЙϔSV:*$cJx@}wQd8OKrwx|}kf3GF Rdx=.Պ ~YJ)͑`JXY1lY/}6Q!Q!t܉_ʮx7 /̛Wj{K%Gl,|Vг_?X 5ܓ't IDATx l'Z);:F[''#鳳Gɛli֎C޽nݗz*ċk۷ku옡睛㓙xN2R"˙wJBQdPqX\=(:!Mpj*ĺ*Ux%tH'i +SŊYRwn{-op6X2-^ *LB֚alܨ̀E1x&5/a En 石m6\2'NgO: z\% HkPl,|}Y!~11wrbA4sx|_B*ڊ۷a|G|hzܸ̓jr\io-OP!!x |tqvf~4G5aaTu')cǣa.DZc`g2Dkmؔ#aժ[3?0όf3rw0.I@k׮\xo+azMBB{6wx9Ц6ӱcNd E2dIؘ;,˃_踩#% л(QvW8gv3 #FhgCr-]ŋS$=k=ыz%걻vw?^O{گl@'2߇Fs'Ây@tpqaUJeg+nd O փ_KJ?tj/h؎*Ukj5-\% gh W7O30Y+Ya|ɮ]Gɖ4>}pׯoijΜѺ]rS>\ 䇊[h.^2~#w n+u]hX]^:Y]m"M?*_6 :Wll|y-R se~~3=@sr^Yu6Phl*-,"SJq- c:35UO^ɵkרRJ5j௿l`N^чa(۳F ::QJqʃ{=8-B_mw5?-VIwTѪMAD5ZjTV(Z$"qHBl!VV͚"HdʒDy~Wj䐓39繴yy < Ǒ#謦ZxBY[^ɒFu( k~[Â_0'&SQHQk6in!Hx7o2tP6ʆ05V Qv<^l~.Rt^zDm/fy܈Fe&[w7L15P{#<VÍH o"D&Պdu]T@Im[*O3SYru3bbk Eg #;KaB̘Kއc# U% i9$3@kRzԨU*SXK jOw1))|5)PQ=fHb'PQA>jɸJ4/QBiGBqV{~Nu9F6$_2R+VW_d^z!S>>4o+Ww_L:2e<󘓓Ԋx? #$)}T-C(UHOt!qʦ\vkJBR=XbbVow<״Vj*x>&Qɢ|Zom-(nd{/N29Č?DAK>$#f LgDGtBgK6mJBV?S~57n׺ѲeK.HaKt4+SDtcC6`H7Fl,]1ǛjBi9Dk/xt6Z[6s-$#a1m(`'黭/u `P OWH)CZbooOJJ Ok-' 3=%E3g61Ն$۶oxm6C`1R%;M7QxL8CވBN@V2) 8?XYڳvFP˼`UJבj<_rv6bbp|r2V 3bEfb9 3gjt}""ƍ]uÆllMDD~}ubݮ'GU #hJ[ ܹs`iР۶mcͨ(±D\8u,VO*VB) > /hd+eh<=aPaX`WmNǝ*by}[r2l!-'ظ1verwStd8tH0x$/t  >>ж-v0jGwj¸ )WGKҋF$#/ݧ;,~ i/N"-233 777]b2jİ"<+))453cs P¦;CݺRDqAݻĄV3%h NMNL{="T-R/TaU[Tu4l(Umo}A˖bӮ.M:Gb٩e n4}7RvzNpp0;wphӦ >uxҋ%~wwfE_떮)[)Y8[K!$de!2Տ(#۲e n֌.eSr}; :A@ha*53&¿7Y+œv?tAވ(ĆHbcV+jܜcWpZqcVfdf޽a(QBcc>3365!;r?|wݝXfΜIFHJJՕN:q!:uۿ_ 6iԑV-xwZjvEKk/N$`ƨ(jYZ2J=$_|Æ y9c(SLOGVNcwow[vudb23Gd$Ҩ]_W(++,;""` 8^Tt|}[$7CL m+>4>W.D\`g<|)Rz_qnPguKG͝1/jΑG(_e2Rc\8 ucmݺ|0LWLVjX&_ޅ?@K籩m[p>@ךưW22bcd$iX8jb%^r(b+ĴiЮؾkD б0 Mak9=WIJJ… t5F_wFX费 舣T0o)IyE& ^I+2pQnܘad8PlU1c~kn:xDen֭_{ ӃdN:I dqqGF?."8V8kkږ*ʽ O§–-0u*,[MUII;= *qbΫV? g@.G]ƽ;c[ͧ ˤIHKKcܹE:sz6mͫ$/$ޝ)hZc#a]ZJL@$=(#5."YXQ#ZfxL/1ӠJ^eV[/ck]LOߞ*Ry| X2DWT22hQka%sQ* S, *?EEҡR${wq7O\>$Q@a~+Uz/7kРys-GsGL7TI{>{DORZnZiC%66Ϳܺra}tMZOt4+¸)JDհ!-,(ACA4ٷs8f DGkᣏ4[zڕ3l$})T V#6HB1/XVVI'ڮ]`,\DqF ;F5~wnϽ{lk!hxb\\\7oi&­[УH>4K@HN~ɑ'h`@7l%Ib339"Ern]ڗ.-[DEE~ܾ-qm$Ҏ)ԫۨ53g 洟7yI/w=5DGM2emЀ}ÌM(سGzC&aNq^/γ.]8K:w:SxyΎ=K /n++ .;;;Ξ=۴iA%~--E9GRz}0!Gɇ2ϧOY(LQVVL\ŋk^"{̚%5"Z 0{6LF4=m׷j&%C##9  1ښyD5DkD埨({x%"x=PjEŸЧ^{iϯo>LLL "((號13K |$g$ӷ'wpl1X6brv '8EQ8kX{,\ժ1bŗxZ,#̛lq*6wi5joO20`~y ngPAydH.&'hRrr^,ѧ\9 e}Tv^ZLШ\;rraq+6 о[$'2y Z5ǾUW$i]xH>LMEaYiYi֗+QW8I;+iAfN&E.cE̓'GF=&LEwr,QejԬu.\=E fde| a104#v}eksh!jg-IZ)|dg+olYh[ܑ F*<HjZZ2reQFDh!9~'ov.\eVP$L}F]w^\9Q!BZjⲲ{D7>FѢ̫VQVVT,R$Ϗ%V6}*y~׻{6nDEAְnH>[RVNbٕ m2 76֒ሉGj*vXed2o !B?t?b{2ђ-Zĕ+W|2qqq,\ :r\ TLTɕ*Eҟ.W99ШQjUuYS: Aj=-V6ۘ8qΝ;ggϞuQGF36/_UuйLLP S&cNJyT͕vǏC20lFKDcRc?_+IN2qq7!A$rjc#봗5^Y)I -y14o{{{<<< K/GQkX$%QX1Vծ(++ƙ3л(m=xPGwfAW߼Y$ډ[A.{1n8ڱa |tzN3חdSTMK^,YX.ㆇ}ܗ/cvuK[\Po/b3 ?l|y8 VbU(WtwSDQDS~ѝ'ccmC*̛RIIIIÇba\4Gݣ #AյbfN>PE!h$2#5."l,,iЀK17nO>}W7E_ X||P!c:U EЂuSZ\:0BEAQw0=(6FFAS33jƹB߰-&EK1>mӨk盹|YtQ]fJJb6(bbSy^=*wZ]~INy3ņg3NkzWL0GGGh۶->I,Yj5q`|< BY[^ɒ$FR*L}@6ŋr$׬WXR~\W?/F5oǖ<*oXZ~V(L?MW63k1PIz;2y)BpBaaNHr"|S*VGɢ794 3S\,XWBeרhQbz"GHz}z/ź-s2YI5Z{W{{^jf`N9h$ q#6DDTfH 6jD%bbx!tIؾćgA4xl&%w->wٳ=%de{d$RSV(Ta5apbbD/b O_txyXA=wۓAY$ E{* {dσ>gF|",ɸKPUD%=hR1\p1P5*jqjD $[O2$`:~|C^c~h(RRV/ϲZfnN=R?wNlM>}1fn<8X3bCw^eq+_#RüC7(0ehq%˞|S>k˺.ɇddb`Ԋ8\ ILFѢU1֔eg'eDLK=W???l^&i}T}=w:gIʅ))#AcMl llDx6S}[Xm  z*+'釧Ռh6uv(VHHFfs֭ѣ5zU˧>e*|HO?ޤJ;:)mJ¯aC-,(GDۆq.V}ccEYO??Um4#O^tK7&bt#g\pu닓j?CY.2oәMxA22S7SSYOt4MLceŔʕ迅 p(ш ,O?woЉ'跭kqV%tdDSss^zNf bH CIEa݅uL BJuɼ-pT*?+:t̜9GGGLS;XP$ ӧk}%)JFE~ZFs0.ժ֦ ?֩Ǖ+**'G (;llsgx6m]z?=|zкRkN:!)(Qڵ+4o/R1OPq\]J>Ҳg LVrl1|@J,ɠAy|DDDp9EVٳEa;A89лnoo_,b\>C*TQ:zT[7_s%1QGG8|X\uyYs4&Nxp޼,p'|,Y"$JE_2LcƈpA fM{3p]$iРV94iAm۶Ehi1gH@4pQӣV F$L@Alm0b:c(ªUbGmfإи}[0l?=NgYeW3odCvqH:yӻ7|{ԓwo"n0Cv TR ͭ:$%}xe^bsuwp#G"%3~9zDv{FN&9f/5.E"YW,bdFrF2vb筝m?.rs(W W9L:2e<󘓓qu5Nj~ FOߞTarQTTgKLLQ4C& RefV__/ybJHwBkcpP11mr ]jvuHAAUڄi+qԫ'5#_CriӦT*j3@]@הѺѲeKƨS~~ڨQ%"/ç+4f> wыK.aqOd"JrI {?~""Ĕ1iY s0߽{ArF2!BhaB!IFa}-b{`Aqxy}3M d䮑T)]S|=]$iwww/M6QR%}Fc0t(89I n]J-ݨ[.RHI-*IC& kEG%v^eV*v6nX1Ю< HI"9juH1=9i0Hi&V (#a| l8Ͼ"ҭ[7&L'OU*Çk{b>ptw6mҨ)؛tJrTRڋSL@WsGtMK'Y(pH<*UĆcAk"n0Т!aaf<%0dekgA(4 >Zj=iGC}n{jvܹsY`4hЀm۶="N9|X${sI?鼹3V%y1s-*Iǰ Hpp0NNNԬY… cnnNϞ=9uꔮC˵ŀB̙t&MgO1|VQ>}'W}鵵Uc#CRRR/޽;_t]RdIqpp 444#~;w`lr*W<#dGRpQh"/aQ9<0_~L> nnnDDD˗1wuɅr?n]xw\rqr__L@ݝ(fΜɑ#G&--N:qq]ZRZ_cѪzuQr{W)8Mq#?ݝ,큗?ر#۷i߾=?ϰ_z(G!{:6K|bR27Cs |f\Q6oɓJ>~}:{wƬGYnJq%XZf*<7{Ԯ]K?)􇷷vek ~ܦyȑbp`ݺ 253`ٕp6K:/wjuz$$$bK`+ƾ}($Lԩ%fnP!>}{w M/a2s2t'ƴ^k)ZÒs4mڈEsF͝)dZc#a]?$ <|)Rz^OQaH%CM_5'>d#٨ w:v֍5=װR|EQ^lۇ?@ժUԩSQ#Q>z4o1InΨ 8~:nEw^G|HyQzܲ%r?#29.]P+jC4e˖ʖ-($$$`ii7|DpwŒɢ^fMŖRDFysh}( k~[ôhW~,G%I_\ݺA:p }OuKW BMZ T L@rĉt9WϽr Ο?[fZx@SRy/< c*r{0$'ȎN6_vAVN&MtPTTǜ9sVZ/;w皢s"ؾ]vqnŹsu֭Ȩ4!'?RVsFuً~ѽVw,X>}sNRRRyÇ?~bbDQ>t(J-pak#0ZۤΟ7C7E*m9?L>$H>G]-_&53^[{q3&o7$W@Օ bkkgϞ}mhKLT]+ppooƶZݻ5ZQ6H;>Ol>aM54 7Ύbtqqޣw|W`*T_/YN$!h÷ўTĈ]#vXȂ 05$#.,(k?iSp% UW{wӒ}abbBPPAAAĄuXB-THL-2j>D,eggss6Ǎo'&5=CЧ^]$I)V>j ~WIN~=#9Uj1PI2|2ђǏEԨ.*0n(bX&Lիlzv:;.68qI@hhh۲eK@~~M.cvy Ώ;/H+&FOUW4x^fN&rI =@j$n22fĀhѹ'4T'oDU' i (r|y3|؇z'lf1>p2bhb"?\1{N5:i1PI2rNjZի^;;X?ii\d^1 y'GiWC Xf&|8֮5XB\E/ddE(QvU'v:쿽@@@%ɸĐܹnn%jTWG K=h:7݈-&sJ]JDd~Ǐ7ρt8Bu$iORaabߥ/aԮQHi1PI2>2wOv/uU/|IX-xh>QJ* bI(i/Aɓ9F&H  ro$ ={yǎA&~ZQ3vXTUlsFFރ[@Wbl6p_//\uhRSԩwi趥,qrI|HoLQDecb,ŋedgɾOw,&dTL>$㖚*Jo%~VZQ3a6_- j4HJ+ hV1}я|>qbHV:>0u*,[&:Y'89{x:$IҮ4._GP~Ά&C$7H IDATD˝Ұk;D)HD=P0a&7mCzcAv<ںV4l!29_F"镂qrrf͚.\ssszɩStZAX\ Ea=3()I製{mؖ-skE=8Kk9>Vg3n8\w]c*9YzcAA&hJ = NNHEa噕tJ 8"UzOaIzݝ(fΜɑ#G&--N:ܫ7)(O߱}*œcsXyv%kzax-*IY,-s4Ea k.YO0wfF4$q#pss]G];u3.RT~ Hf*Tcݻwv,]NxEV "J4w~NJ+zw1PYY^KԪϜ눴/iU}N{m$OÂƟ߉v{BB'7Jy>(R#<<\Rv6 &RZe ,eH@|mR JMpvuD =|zωQ'hU1%e`]G}ogX0,[pn9Uh$#ą ڵCy=Zl)5rKGf}8KKAJһǏɓbݻ|\JۍmRgqj)|Hy}{]G]jE zzQ8?L><3i$Ҙ;wC/ƍ]%T*IR?3~.? %%*:ܿ'N@HW{KZsziꔫ$ $%Wu\Dc y )WN8i\z1|nʕ+iѢE> ^CQİM[l> 4fbLLL$d |z%`Ztcxp:T;(YC$p5* .-CӳNO]$ᑫVR?d.]ĉs>SNL2 H>277}Z 3fYoد%R2S7cP9xC(~(܅s89؈cf䭽$طo&&&LLLQd/% Ӧiҽ1AS&O䙦EMbb"7n̘1㵯[@"<5멘:mt>(IciiiXZZR`ATg} Rޫ=UKW'd!iAVNWWQz"i Nҷ^_{S$yrD&L Q"tR>׾.8XhѢ{Ã)F6aCsM61H]$Iozs|F!CC/wIKR?u SSSƏOŊ_>>>Sٷ/P` EC9B!IyEcbb1Zj|f^zannιs^|MG1Bfs-u#lOOS,[Qq:4v["h1PI^F& aeeŘ1clllPՄ2qsseK㽰ݣ^;~0+l|%2]_t 뗯׹ټn(皢(,?~E]P9(WÒtUQcEQۣ߰UVbޭVݒO&|tI (@ڵuN(~`xp7.]2b޽$&&Ҷm[]֒3q p#_2Yt>(ݴ}; GZe KӃM7t#I:&W@`ҤI)S6mPlYعs'|嗔+]<5OsN߼sR%>> :T廌 F ?Z&:$L8b΀?JժU)Uŋgɒ%DFFbbbBϘ3gAOCnFu k~ ,:$Iҍ{? ]؛tJ2 rTRZ Tܒ 3&'OnϩCC]$câ*g@qaQMsI5\q%KRs{5|sIT\ɴL3MP2-SRp}_CAA/tXfa?5p0sϳ]y>lܸNJj SLetu.+C(~MM<:u~K?pA-)[,{o^ !C7wnu;\e{IM~i;Zb[(áKhBBku\DU-pq`g2nJ# ЋsQhܖdO-ZIv FXFmƳw `ZWc [+[? iޅ0A2 so銦ZrpAI>xS4 6|TQ<C&~=XVǍxE!v}2E1P!DNI"ԯk5J`_}T*Q! aRm}6Zﳿ~*U6vXBϑ#Ю͐$nݦEP "FPxy}E)%%̊+`:vbM5ȓ/q'ᛇY~1C `;v ڶZ`(Z2%ɉWI"rMQf_7B4B4oݟ`w4 adOͫW[X1zEZ{qwcB ]D0b"5%H!DEa\IU|T!ZJ , JhZ =*+"r,19^{M,봌߫N O PV\Ȇ#f,tVTt|);vku$6܊EDJ1P!D^DÄt3Goecύt! a\n7?tuz;$!ehBM:vGxVKf["DdG7N? qIzܓ%88 u5vHBիꂃNN:81t"pSBC2Ddgi}c80$BdAQڛ98R>( pai vAٲ::týB$ BgpqK[!#ԝglق",_VKlVj򑒢&u_#19.?vl ٌZa* Ɇ6+6f)QXYJ(H/ʝ;l깉ήy֭[;r#wOp{k|t;c[y[9\a*DҒ?wڙ^a|Xh-8#|4dhݺ5vPL jjG*:,Op6܌W#B I@ MF( ~~ : G?bmim찄۱c>>>TR+++i׮tcǎѪU++=ݻwʕ+9%5 ;'siƵAcٷo|Сp|Taɩ|^ӺjD-05ٿ5Yrj2~Č3hjvl2޽˸qعs'AAA$$$EDDD}o<==INNfݺuXӬY3 oԓ(ڭn`n빬}w-El! ޽{=ʕ+݃ٮt;Bߍ}FXGjT={TmggGhhɓgOړm%>o1vHYhN/L٦M\\\5k^^bذeU?SZ5ΝK@@^c=vv賃-Z4|p^u ,ZՑ_3k ;ndL!ɒD7U|gG'|rT1QFQt_IIIZ?---<ϧ~,OQFmc |'jSBKfcpw5hrC=US{8;$! >&M88d\_EQx!Kγ8n=Eu=8z(K;.e<;RL W^̝;sfxޞ.]~\ť( c?Ỏѷn\Oa$yc4UZĕ킋 [?JyMl? Eyyk֬aѢEԫWO/qbߵ}XK%{QFFEC*[,&RQCXX%KUٮW,jAr„I h=z4vvveW6֞Yˇ?ij'=B)f žpx% UX16fΜɬY6lXp\tt4{{ƫK]S|͘chZ)k]+I0:CKybaao2Jl%&Nyʕ+Fyk׮{QP=jX>_a*J{)OLQ:uhiӦegϔ"E(C\۶mWW\8^ SQ>%)9)[ !=_~Jbrӌ=3|Q0t]3G T[J*'26>5>I>}:>tԉ3gΜ_NDDcƌU ^n\@Hzꙫ an 98L(2!$:7Y& a[qFrNax/6-=fo-S! aR?Cݸ>Bf)d~CW|Q@{f4Y ]!^ٟX5#%BO~<#7g`,jH! 0I@Ki9vpv&߿ډCb쐄0K齾7fiǥҽQNStXʞN"ƝWSjk*A31|"|WH!(φ>|ƇlQ>X o;~hD=kZsa0v(B IURoMW}yXje!^!Q n9[ޏi俁x7~ȺX~1Cj쐄B,-3K׵]9x ҭF7c$B!D$nݦv\Ύ>;hZ3c$B!D$Emp[Sj;$!B!^JSn銦Z%B!$ Ж[h5J`_}T,Q! !BI@W.xxvlB!:$P{g0p@b]u1vXB!Bd BRRSmF~tLj6IVnB!ݻj>9y%c]]N}W/GHHH˖k6];vLJ*U`ee=ڵׯ__7B&kiopqqaeJ;/eDfϞ͡C=j֬ӱ& as#[\Zlweܸqܹ """"666ڵk}gl}Yf ?-Srߙ.[tҳjժѰalw#ޫ]}wQC a-ZSmmڴŅYf9 3!nnݺ2d-J޴iS#F%ȯ$3EQP%[ݦ.E_Xj-90%]WWWn޼9EQ~(!y ~CB邥gCPB(QooLh,R.ɇKddd](]4TX#GC#D)yڻw/ԭ[B QtiJ\\B3'|4o.^ܹs_M6ILLbRE;p;7&&cǎ,S)[0/@Mrc$$$0iҤtiذ!uAѰ{n?6ù׵w_Ϋ[ncz쉿? 6ѣL03gΰo߾L+uw,Xe볮xE8yd牏Wuf|ppCfMU47TgWE(ϗ&~i{Zj2S~hpk(pW55iс˗/iߊ+f- ,ӧfi۶-T\YdP[n/PV--}3?̜9Yf1l0l߾=>|8祮 sȕ+Wh۶K{ZJpttŋ iѢE㥮 sk]YDeʔayz9S IDATʖ,Y^zi9B[ԩSO{L0![*k\5i=nݺ>|8CzwV?H]J&& (>> 6P^=&m닟__qzN{l۶-[ШQ#$ȿDOG*UhРŋ̝;;wb c'I7oSLۛ:pСt{x\vAѣGU(ݻ/Zj avZjEǎEQA达tIBdQGYf)oRhQBqrrRwDFFtǕ֭[+*TP *)RDqwwW;ƽ}vgϞRP!NV߯rEQq)[VJ,h4eԩyz?X)WRpanݺʏ?gY1SjjiEGG+k)VVVL0AyAb)c6 Z]3MC޿ ʄ J*) R*WL4IIJJ28_$u-I]3=l L8'NGrr2#44www_gܹ޽7RN>#fΜ-[ݻw7n;w$(([QQQ,[gϞѵkW ~9ѭ[7:u*aaagedF2z=s{FDDBjjjGJJJ~lܸWS￙={6Ŋ3H9ecAkip̞=k׮ĕ+W1c 28_$u-I]3=lyJ*˰-11QPҪU+(E(yrӲP6m+)))yRΫuK~,u^嗺f8M7L|Q~kFZ@{{{)6kkk\]]y^7%3Ć (V=zHܾ};ZZ^_׫߼T>ǂXL|Q~k^ky^嗺fj$1qLLL =۶mcر!66Hj֬irҙ3gQZm[v={a!_OSue J]3~-MՅ)u|H]˟d,7tP;,,,5k#G4h Ç'!!I&ܼ\\\2lwppH{0i L!VkЯ)ܿ08kݻj:=N:I&Ixx8#F`ĉL:U>ǚ5kꫯWAYON_ϜI=3Mg`غfz۲f>̽3i1777/_Ӿ+Vm^^^hZf̘)Wu3g2k, yAiϛܼ97' Z]3zR׌QuX,e5sRY3wSWV4r!3uTE(ӦMk9YtV+Ŋ0+HHHh=Oy.]|Po^(uMcAkR%5C)uM?叺fj V>w^,,,2WO?Cڵ+񄆆۾rJʗ/OFi7H]˙ZL/uPqk_ꚩ.X&j၃<`1~x5Λ7)SM8tP=<}.]@ѢEi֬;vpLbb"gϦvRD ~m֮]S>>>hZݛ󡡡hZFkU$f4hЀoի3vXڶm֭[iڴ)7oNbb"-Z`…)SѣGX r&sXe /^Yf0tPzѣGi׮?S~IIIiӆI&0bùsa„ ,}]/]FÐ!Cʄx cO%Dn]rEh4JӶnZh4ʼy~JqppPҶO6Mh4J>} L2/(66V9wnk8;;@E(V2xB.FL81sJ…{{{ѣG(̙3Ft5SF߿?_|]Rpa_xQh4[oח*D"͛7ٹs'իWO>I\ӦM۷/>dÆ iWZ%K ?~A"+^8իWxE|ёiӦ΀aƍX kČ3yC H0I@9~8^^^>߲et=z˗/SZ5J*azKO ?XYYe?~Zt-YVʕ+ӶEGG3qDjԨA"EUVOjs>dذa/_j֬_aݻwj<2C,--3lo޼9Wse\\\(_|}[jӇE놕D`` #"$f'66LwttLߣGt{{Q+Z(5"22Ǐm߷o;&<<F_v www̙k_ŋf噖٘OҢE 4h111|nj1BIVUϷƾ}JѢEݻ7ΝKa۷/VVVپ!KavJ(f=.YmԵhтt3ބciiW$55TBŊ۷/nb˖-1sL,Xٳgiذ!F޽{:r8s _| .̙3T^ŋo߾x! ]ޫ*/]4Fa.D.H"NzGfv@5qvvܿ?YMW({ޒD#<L;ɓݻڵkL2D~gbh4̛7B mgB:ijg2lV^=-J*UpnʰkRV-z-֯_ٽ{7͛7z9!Aav*T@֭9wOÇ ]m۷/)));67n`Μ9[ָqclll>DGGs)Zlh<-Z?0u [KѢE3p'rzBk<`EFFb ޫHjj*1iFEEFa:;l0>}6C C8I3ҴiS>mۆ;7n`ݺuh4Mlܸ`Ξ=K֭eݺu4nܘ_5ݬ#B iӦvMjj*-[_L2GVMK@2[U!^F=Zf ?MŲexYB\u$99uֱb Ο?OfͲ5@Zsl2޽˸qعs'AAA$$$EDDNXr%JxBJ`ɭ[puu_~,Z=xRJ1u +{ٳK.-uuUߴ(߿SmO>777vؑ+WdDFFʘ!DI ,_'O駟;!򽬾'INNf˖-t=-uv'///6l`0y/&+͛7u:(2"$ѓ{ȟIݺu)TKfС;h<|ǎPJ]v8p@߿O~(U4i҄]vvիu?FSbz-kĤ$ B!IIc/K(UJw>j:Mjٳt)t-[ݻw7n;w$((xi(O>e˖DDDpB6oLҥf޽]=t 9vyB` !Ɩ'OޭjB#Go)/Z''tڴi f+c{Ξ=NF7`:tH  Qh |%@ƎlH"BBx8{\ VS ͛CÆ`m^L>quu͛/=vÆ %ݛ>;wPVn)mBl$ "HL 52v4fC!_;Ǯ]pF//h(O]IV^ߙ3gh޼y7ٳguK@,,q_}AѢ9[ڸa@cGbV$B!!6VR}t\N٠-[9RNBB&Mz~888d|ۃt/t1֭F|94knnƎĬH"B䅔uoI6h20oh~~~YEQ^=7zh?J1c)\-D]LHx8!꩓(OLL2!9u.mc<|%Js,np=z:̙35kÆ {DGGg|+1|ׯ =zj-_Oߟرc1O!BW))p+l Ǐ[aX\jU^S1׹~-C̫[V&L)ڵksԩ O> @Zt:OΝ N]PS왺G>F&i$1˗3x`lmm3v8Bx|}}YnѸ1a}c&Elڭ_֎(U۶'Ц:'=J<•+\jUb5JT5xt9+Rx-oegd???cڵ+Æ ȑ#4ldL2ٺvKÝ0E7E lH̒$ p-ƎKrx葱°Xn݈?z^RSSȹ+W 7޽qŲ IDAT uFڷWgT%q}/s9`X[XSٮ2*Ө|#ޯ~ߕ*dVu͛ǔ)SC`qe*Voѣ*Uŋsvܙs;ևڄЋSt I@ `Ȑ!xyyaggGhh0`ju%g=ٺu+;w$$$$ţy\vq( E]y|Fuӧo[ U+UJwHJj cs1xx1/obj_WGWڹg{gWL2N0^e˖-h4 KF!%%TRSSQŁ?#GիǶmh֬YrqVo%eu"+ْDςٷo'}BΜo`xDa+F=m߿?|qz)[ؿ֯W^M6&OmQN?8Ϲm\}Kїx K%*B  ?UPg;gl R#""t/00 ۝Xre5d.:. a*.;;z# ݻwѣG@rvUYP]ѹLoAp>i3gPF ^ Mγg"?&*ܹ#ZsŖb.wz΅\9?{ g{g9TM6T{kvalʖ%KԇSo_GR믿ΐ!C_ ׮[o?B׮jP=y...h4a'?a=13I@ >>#F0j(J.@ll,fz|0%N3׬].eS~\1V]Hp%N;ũ'I}5Ge{nh-QAcj:bEq+fqY/GX:uRm#uM!iu\ڵƎIQQQܿs2w ӥK֯_oȁ`,uʕ.@IԩSRSSӍi¤'si=Ή'8y$g': XP%*GܚxMX>0lB7ߨ_ujH̞$ zPlY"""EQ`Ϟ=QdI#F(viԟ5k3[~Wy+]veٲe{m_r%˗QFFNFLb 蝣scwqy,xΐ hs\#XQݺC^oт_F01ZAj?I@ƪqcǪ㓄^Ƨ3cmmM3l ‚~Q 43XmؠXcbkjx{{ӺukʣGZ*!!!l߾իW@I9vۑDގB:usBE[.S4;=XlEFm[m`ThZ 2nܹ֥SZJ(+$ h0mÖ-&|߮_I&1ydQ?ca:RTO<[9rg!UI҆zeѮZ;|Ҡ\\]|Es}jՂٳ)EׯL>=eMj׵+Ȳ ! eFw4|pԩйI'2|ϟoPD&bc9|0nuGOhY&*4bdÑ4,ߐKki$&-oF p&`g}+Ox a;v $ q (T5k1&Jn>]9u 64ؘ M'QP:uΟWW!^ys_vn܍j),\uBӦƎD(.NNwޛu*Dѱ#8;ÂBӣGjǨQ$=|0_j׆={@/q5*.lcm캲dD*1-)_|N .bgT3fࠟ ap83g>";VuhaP2Ts(r77įG%pA&OZ8/pf䶑>m_t;c-0{Gb:jjך$'tI)ɇA3~xڴiCRjtʕ+j>߿wA~dIޝS_5i]C@Xvw_&?%J87ϓ(Y$gJ)چK伀o…?,VVG]ȶ(-[Fݺuڵ+˗/T+W-6L$WoU1B6o+W/DI"9IMUZ%J`;u2J(ߙ1(勌oOrpqp_~գGJ&LQ(J7YRE]/em"azcGR`I"9XZW8ic?8Ϣ#XurItމ/Zc#o{dpOZy5J`lx5JȻnPV23r0K:tOOOMF͚51cԩh-L͛UBƎD,6U3 -2?EQyy'g녭,RogH!T*Q cǎ,n]O rҫv/ꖩX߽ f])S`YSƌ/_iӦAb8}4xxxpAj׮6n>͓D䝫W!4Tf.\ۘ I@ȯC]8)*Jm1Or&/OF7Xy>}(l) R;6[6ی֒.n]=-s?EcH(V,o&uִn:FѱcGܘ>>1cԅ)ޔTWOCBB I;IG.Sp$ B7tjiMoYpxwбzGx/~ ,=K/Q˩ӫv/muqHNV1cUWL8tK?~wN`2[Ƚqjcƨ]FuDy홵|C4oɇٓD$>XV_=>?!19>u0K tw,8U'V^D N ;Sޗ%-}aacǪc.^D,Y9bD]phM:QaeJܐDEk`:[zt92, m0)WLf2}p Rڶ4ޚCpc"kpꔺX̙M!ۄ뚕>/_9¼%$>(J*'25G@N?8 I@vރRk֣[?eǖa[ȖO~F#qU IQ.1k,_OR5YJzꉵ xQy&uаm6?~L\\gϞ%44Pgaqe*V@ǎi޼9oE̙3j>}?31GK,aVT`!R1p@~8_6+`$-Ym ~Q}c|-E aۓh$ŭef#CR헶KHoĦX#ZCxXm;W]#$Dm=feذa\v PN[u֡hr *U"55cê,KQ1'ȕ+W\b̝̆OK̲rƁ\B-q$GAAyB"..=️r8~o6Y5j۷L2o777j{jԨQW :>}2=/y$77oo M$ BVZ|5[K6"&'f|+7/}rQޜ]v](jCO?Uy|W)&(((}JS_!exq?¤IFi*!((ӍD=뺮\ {iW4==4ƍeӟ?1,t[NVFp-O`YMvK..vzwY-Q)cw\˙&t@Q6\'{?!*6 6|3 YCٳ0tZj89Sf.Dn7i,]rcG#r;EQiZ赡ul밫.J*e Mo !2#hVG 1&Ku$Fp+]uu+*ꘫLm=UGl,LVjIuDWT _NU"=ß”)jJ*m98$ Ç~?|18 ~>3b,켐C:EQX"jT /v|Ph_yhTr5eܤ+}%ܻ,"EQGwzK". 2@FauH9# ߿WWWUŋs?~ء&$ڷW_om$={ruUƼ5 ;2**'ҩS'J.i:t耍 ŋ%SU~ Ag,ߣ]waV-?٤)uJBվH:'Dj|}1e*<}z*K-$ zd߿τ 8pV"::GGG|}}-wԑC7Vf41ql1w_N¥ur~} aɒ%ѳgO4+A]|mϦMX|9W^UV2tz?ti~?v6?@ǎ>SG=t8&Ѹݻjs9!RA׮)zOt"IdѢE&֩S'jԨ9sptt4Rd"׈V#:J>9CqLh9+sJ*<~P.]X[[k.XШQ#j֬;wAbNV죳R ]N"e V :xP'D~QTnr}I1ѓW `gg?cD3{7ԫSFEګ5 zJJ>^rWdzk.\\\J*֭[ b<B=st:c.$j5/I>DwʕƎD&o Ei`Zhg~I>HF@ (""ӧO!PD( &;v@f9>e@p qtcnf`s7nCTu~bcc2k达;7:l ߹΍?s~FNuB:̙0p (`Dnp:cGWBΚwstQ1bB=z4Lɠ08_xr7XLMYOU,9OybWҎ7RDuno @)(QEQx1eh OΚw(U®a.п?بM,•0ӧӱ.UnaE{-pvN|8sL2}/_h Hb0nnn[EѠAc#/\^?tp7 \BupN9wN] 4n8]ϥ:}RǶQE ԅNNV*IxϞ6״6vD˜'/F?v]EM}iTm~ $1fϞ͜9s5jT?bŊ%ꊫB4I<N"EQ0}>H1kV;a4ZѨ|#}||8ysc?~jܽq777*W+fTɒ% KXXXOtZwc=yl﷝"Vh #F5jo3<O*ooom 7R4F6mx{O?;a,ZeK egѮf׍uam) j>}h3fdo@@(Lt/_bRԮ(Od4 eYaUA9~葢h) RFwyGKLyeb5J麶sf(8XQ7VkkEY0Zn|1XL#F(JɒZa6nTP#GV<VuzZk ͜9Nw a6u~69^^î/;]w\9={S"##x">>>t=<*,Q R"[\!fro+Ym 7vd" ɮ]h4ݻ{&{Lѐ`DȄ?_|Ʃ}6t1UU2QFqm@}lڴM6h RJǤIݻ7oߞ'їg!t^ۙ%oaF>֯Auk5}5_SYie˖qEN8AӦMh۶-gĉ)nɰdnBcG# 36>xql=ߨ$___c 2$:`޼lbU 1֕[&TU2oÆ ٿI):.')YH#G4 IDAT%&ٺu+I9 ૯޽{+WNafMɒj|ի7a?!־ߏB94^Y&&Kk@_u`+¬#md{L& &ș{gՊWχ?cKapi6ud0n. S;a$̙WS+.CKGH"LRLc)s}?@hgL%ݖ`in8E~w;|[Em6aZ^׶04~AP!1C>K"7wH>dջ91$y'&)DG 5SdA\BlO̒nKpkEBB2d:VuYQ૯q!LP5SDEخw}?m;$DH}& 3f;cG=N_칶.Sc٦( 111xuL73fw(YdM?OA욛;u-[]D^\L^P rHOD$ ymѥf%rl_ۇ7Rh^թW$"W[.W.\NSM===iذ^bKUǎй3LP-FQ9j/v/H-Q>s 5u;%LRd|%o;5꺡/P~c{LJ;w5!::aÆaiiݻw:t(kצO>x{{s˵kט2z5 7v4">熞:cP\(G&SIy޵ 2u( 1WI>r`~&@¥wCCSdЃ4jhdB8x 'Ndر<{ gZjeaZ,,u> w 4c0^I#I@Iy?JL:0W:uMBf57\ =Qm8(ɇГ4+붶XBQQ0{G磏"ϸ~wּ j:&2MƮI\.oCC{O~7CA5W&kb٪Ua&/Bа!/n>4_֜mibNq6 KݼNa"17M!>3Ok:.zq؃RJ11gjvEs!L5 ,1v4"W+*T?5WWZn"ϓ)X$E&$S̮OS)cGqLdZs}Xy Z#ȞK.,tZHaºիpB7WX}%Ʊ>p=]vUX! DȄ̩YS]-}q3JN|F>⛈3*Zݻfα9T,Z ?֩_B̛۶ Zx?zeX[ӜvI@IGyjA&nO>).x:hJ eyϙ3y/y-0 X衁ّ#駠NBJR EDUL>0oabˉm?)ғ'ClEq VWD&$TzR.* k,~O'_ZJ.Bڐ!Ъ:chj3A1>x2üÇaRwenlv)Ma" A.j2D߮cs~+!\OM^nOaTR׷o QE>y3/nśO}߃110bh~$ $$$$?gK@NmWFi- ^il [nO|X^ e؎a)Ϝvsr0-U~Nz0xzuB>jքRBoV_3m PGN 0I@ɉj7R`6,_V080]~>3GeٻA[: #G]?$Uڔ'm d[m7FGD& 09 *lE3ܧ/.p8maEn{,XW?K!rFγgWgҁILm=ݖbaͿɓ ʤLQ?~<*Tښ ace"YL@50 ]&쟀sI&mRZ5(^8;w:t耍 ŋŅ,_wߍ}((tӧ 3FBPvߗVXY_>4@zWдcG/<fWLǙ5|…j:u 0lAիW/N>ͼyUk׮V3Y HbYL@֮U{7kGoe_Ym)% i&kɒ%sf~$ңK8v͓ؾv͛E\B.ޗԩC8Z5X>:vLwH[pd0vN <ەN{gVwjaŊ4G>֭[O>ɶ2`N:e?HYȿ}}}?Շ/xp/o;}+ s@?$mg׮]$%*Uё[f麗B.PJ HLKY.ޗEAQ}h|A0jId4_֜0 9~j}e 䓒nRe8/^hp'DM@ƍP:4ih:={Ҫr+])^ӧRG7nCTWԭ[ׯɲ11||S7 ?ÿw<}k׮XXXPdI\\\{٢EP"ӧƎ&8q-Զ͠ѣjI25Ihhhb:$Bc5Q! V ;wB~%}/s;s}=z4Ly4ck(י(<~8Sz Hΐ!PV%}B ̘15kϼy8<͚5… z(ȑ.Wv~U{(Gk?x=hR(Y ٺ3;|+h1,,JP6wMгg=6R||^,oܸq;w. 777֭[ǢEhР^r # j=:vHǎ޴iS=Ssڵ_)Y͛Hղ3kZ-? .NM>Zume**E'zRdT&%=5k(X0ٶ2Qԅwo5_z3M׎Ph⡟OLht(S[Oqy7IF\v 777*W+cٳ3gFJXk(504 גh+VW bH\]]W.4W玧\ХW_kԔ-[GGGN<ᾉef(Nօ3X`bEa֑Y3(:-,3 &L!(WNPv^k"#FPllld۽F8q"1 *L7=%, ?)ʀ)6?}~c 1\?>}h3fx\\RP!eȑ){w;;LަV[e)&LP"EÜGl赖C)W\cbcukE)SFQ1v4F|B:Jy#]/sA7o0sKKش TdQ:qԛ%KX2v;~Æɔ6!Sɉ;2rHƻrNZ]3w`PZE '($ѧ-[0e ӷo_cf4/g(ނEm~e;î:}ivڅFa޽ݻ7ccҤI ڷo3=vmbccX\k;%VVMFxyyqmbcc)S ۷͍5jVz ݻ_eM݈8uA|LB͛J8;…0f T ;" |',,8>8v2w`tZ>4N,:$ hԴ#yL;^!!жm?nS.\ea*FxuGPB.Gz}cGwGnT~2{C9LV~ S)& 09f/`FB"V"t)쳷.kV{>D !ryC<.]lӢb frV.8߽oW{%Lӄ __hT]\BHV cin0\z Xٛo4&!D.ѨS/tE>ӟ?{coz`{2|(  +WŠ:A' 09fVt`ip08:&ͳg o8\! QE-&5\lm@np䈱#EQzh*wf\qsYGtWL|HN&0EMd$ 䘽OoEu+?]FZ%=F( %4:% ժ S@ufj,ȍ 9Gg3<{;4( orNMar25`f}Z5=Q+8X9nBְs':hcGmOc}}wV_Ɜrb%$.Q$&'6y;> PH&@oX/ƒ0zY;pj@4/BBNnƎ(B~U{>oc@?86Vd)BJ` cT7)XOCFIUˡ, }SnߢfY/(~AD,66L] }':~=i1 QF(<\]!gO*&EHl,4n̽3\ ueA]~})pzO!YXL.3F텑[M֒[ԩgg}|,D`IK# /Ƕ-3D@e}7+NN Jw9/ꗓZ$:t^yz,LE=|4gjm/P/I"Lyk iMEoEQvyca&GeuЫZG!R3b8ΩƎ(qZD-ma(wСԫ"$&*];+\λv*Da ͛2JmZJAjiZE1vT|w;\7үN?vU S{|| %K7XoI"LE# yi+;}OP"e(Z ׭eSBTU.1B] %e |3&+3_AuO}2Z PlD%66ϟÅ ︺;bmimEn6{I!D(?z Xʠ! : {ujYN-ң$ $-BKeuu6]fEn޹tu5v$BKxQ>h~8sfߛX{=㚎 Ek^'ؿ^] 09Ե\~`ϵ=h4jj୷P4hЀ 6d؇2x`J.M…iѢsPRݻ_FrQh-=ҷvߌ:~Z2/]#i&Šx3 .Ux5U+uzeQHY)rxX~yիVbݻ&Mw?Ne…ر2eđ#G }>ӹZ}uzu8QXނ{82U? u!&FiTH$ 09fę"+WV~p/m>vu07޽xb>CڴiïJǎ0aZ6c-[ŋٸq#ojժĉ ,`qC*P2 6ˁif~eKRh^ DKsKAKիIӯnV-VikEs بȃn݊ }I}Ȑ!sԩtiӦI0`[&D =[,ᡮhHE7j,{}/mWzz*Ū$!!Am$8f /ZYխ.\P.ӭO09# Nr%) m*KWwBQ)00^`YE/{lzRl 1 IDAṮ" JI (v킚5](ƍjFWͻU98 % TG9Μŋ*~j)a0u!ZJa n*LƌF@BCկZ˛eߤuq#D)rhuQܹƎDl F)(Q"񴄅%cE6XX@׮WTaXPݧH5Ayu(ShQN>}G)^ (WN-)uSUVy{{(nhI@I7נy obRAA}rW uGyTɒ%S Kzc|c#(9sF)AބI7פ>R".NТb #D'rC zqҥծ.\@tu_؞cDD։헷G;߿WWWUŋs?~ء _Zp/Ū A;wN:QbE(\07fɒ%:t耍 ŋŅ )(E׳gOI}ŊTP!YԎ|2GҶx֬YCf([V$Zpd0Wsx=Y" ,Y3a8U___cg5h_I@^MZ~:476Bd"""7xǶmۨW}gN˗i۶-lڴ˗sUZjEHHH΃9|X]) 㜜ر##Gdҥ2b_EaÆaiiݻw:t(kצO>x{{s˵kט7oɺr˚Ʊ!xI,5 zh"l_tNԩS'jԨ9sptƔ`A 4mgaj ĵiӆ6m>ر#7n_eʔ)Iݱf׮])RFQfMϟܜV:xTjrv!r-[0e ӷoߤ}Z-Z2VVV ("/0CHa \ JTl2ŋ'/Ϯ]pqqIJ>*U#[nE.\OOOٳɒ///TRX={i' ye'WvrTIb@>}ڵk;`n| Vb'r@rRŘE!>>p-[ƞ={/q111i6H~:V:ˊ 0P_ !n陥Ѓ5;}ҟJyѣN6DG«# r8|ū/x#9r$VVV(Q?Yf1vؤK MQ?~R]^!(Œ3p|c6HAK5 sΥzG͍uֱh"4h9a[ac=^m‰'h8W_;SLaĈDDDcK>}uo5__]ȅ9ZM` gUҵk׈yK.%.cccC͚53OLgҥڷbŔs2=<<={6saԨQC6 M|H tnWxbf̘+WNW_;+VL舙fbĈ/_>YZ 4Mu#Jv,STch[t\4g畝,w9C u]FE 0!JW^0 $ʖ-СCuGɓuȮ s^J@݃ Y3,Gʖ-Kݙ1cݻwQbݨQ#Z-wޥ|T^kk4լY++]LAFƻrNZ]vđ5k࠷p% 5I@h̙xxx0uT܌xIѯL*W+!W+egDZ995j‚nݺeJXwח?< hBqN iz\n|M=ٵk{wdi48RB9f/5"w6JjF KFXl/ɓ'-Z7|5kпdǤIݻ7oߞ'KT,0rrl"coT)V=$ zkD:W+ؕN4t,jذ!m*!6OJ-V(j쐄;+Lbay‹)XO˕Jj &/1B=鳩={nI>ɐD$9U^.]`1up$ BQ)0f>i \Q`$&I4"qEрT2y׮A|$ BKc؎a9:o:~÷uyϩQ=z0v(z鉕ޚ-O0I%# -"d KUqB;Oc}}wV=WE/\… y&fuo틭-3}tbbbtƎKV(Z(fff|i?j(J._|ӧ*I@IZ$8 Xb NW`Z*'U>ݪvsƀzE;믿SNhShҤ ;vSN?E2c :vHlll5k,~G/^]m5^keeرcٳgOsy$ $%[؄0쪬][QQQ? *`mmM ذaC]bfff~=|Pϑ}Ah%o7ȏN;;$֭#44Ç 2|||Xf 8u...?~.ڵkDDDxL3h XpavF$)X/5!WB_ՋUV1}tK&Mpuu;Xb'OLUD =Fw[?ԟF;$ EQy7_gфQJVlիWS@vl{PPŊdɒܹs'cO>KKK?aL~~~\|6m윴]_d:h۶-իWOzQ\95kƖ-[2Ca K,^߇rv%j70a\Ϟ|g8pŋҦM~W:vȄ j:O:ux뭷}YXHKy6+PhE=NՍHѣO䣏>ՕбcGMUرc4nkkdZ*˖-?YQFq<<}m2d:u*SQ%wOMoBJ-94mHѣG矩]6/^ӓo@+ƽj>}VKS= #G777V\իi߾=_}Ur 5kL5k( ׮]S͖ p Wn[XYHH(Իm1*atxøqc888`fcݺux"͛7<]vѣG+Vm2c jKŸ;R,-N={K24{{(TH\r%-_#HKKKϟOFɧ]zʕ+yo͛G6WWW\]]s[nːCBm:!鍽 㺺8ҐZBhh*b͚5[.'N7ޠCY+*uI_S.%&IӧPТ1uNc&!r{{{.]b۷1cnnnIC*U@ɒ%Sx7d6ޔ-[GGGN<ᾞ4\$y$.]8|0{oI H$N tSd_+M};w.'Nt2w\Le"J\ k׮hUK;gRtz^Y.L5 OB\4є+R._L -[C޽;ݻwOږxw^z\t)E .䨙|+rS}oO> ( GIٳgyimvvj[nyNݱ'00;;;MJܻwon޼ɵkר\reHբj->Q^^^ܾ}Xʔ)CqssKV~^\6PL=vdŋ_~_~TRу3gbggGٲepavIl߾Fl۶ѣGMׯ_z-OMƾ}J*L6ɓ'HZ;YjUFCPPPR#*UH@{ 0 fȝPjKbBBB' OOt+ٶ1%+ϭd؎atمSRǍ)i4Əms!!!*ߟ/˗'K@ƎرiW?ۼysmp)7fy>|FbiӦ1mڴL'ъ+Pqe̐5 $(EDq!D( se i0-m#xQmqqq|ge dĉ:tG?Lɓsu+66.]hƨ 2"LJM@ahV҄=z$# BT%hOpkG[,X͛7Ӯ];lmm cϞ=ܺunݺѫWnj;iӦ%ȎӧO$d^-2/&$$$u! 0If/րh0 Bbcu /mfq|8e!uЁgϲ}vBCC)X vvv3O>$cv횁#5O>$ d8 3Kd {L"pzOfz0vHB:tN"g$&2q HVXZ@ Ͽy,BB'ymg>v,B7KbffV0Ǐy^ВE|\*ϙ3gС666/^v8 ,BB;3l"."nXji,H M%Y"jJnVni L@{$21rdd;?|frf;3|߯׼;{ν xy(+Y') gٝ;wh"ݛv Ys5WT[ŋpwwGcc#ߏ۷3f JJJ迏BHޭ<1ffȟ.! j6|xxx[jQ']zBQ/_###9rƍC@@=cg$]:_3N<3mN5ڳg~Gl޼F**Q%bmVillđ#G.]HHOOW<3Bs$`x|?{t3"iQ&Cdd$л7=шǀpMM1M\"$Eϕ+WPWWAɼe(@!:1X;2 /7C}CmN5 ŀ0> h*a3~(EOii)]=1w6ݿ*/!܈GÜG䟟@Ob4mΆB/4hRRRp={Vͥ#/G`&L4TWWKҸy&0yd3f"Zuu5+++*_3g &&&xqq5X=;Z.yFmڴ W^Uw۷ocڵ񁵵5D"wfya̘1033@ [?$$VVVXh*h=3l߱cꫯjTi}4waVlŋ/,^X|9zw}WKJ{{UOHURR?C A@@ }Ǝ`ӦMѣ1n8dff>׶9DuCƿ2гKOm>֭CQQe9sHOOJe7|ѣG#!!A%'w9)!:I(J7@O; ӳgOl矱b L8Æ%s@S^]+=|T9Q%syg| ?8]v{\[| 0^^^*3** pssѣGa`L홴B#XB_SS@C<~ /{ȑ#ѳv-[~O"v>Z-Ogg,44 X=u'1J}|XYYqqqXdIDxzzȑ#044lW:!gwYD' 8,Fn)x@JJ > U)))HIIbs ud[pp01e۷x7P\\?XuyRLtC߮}GQʰaÉ'd+,,DMM6ׯf^^/_GGG111Sl1,XѣG5|^5] @N8zȘF7xgqؿ?x BhnnFssԣ"ǎk޽{Ȑ켦;W3ʄ2Q[oZo-zzz_W^^ B$'' ԩSe\~@f͛[b8tB] }/,,54z&=5B.. &Btĵkoǎرc=z`Ν<6oĻ߿g C5Hꫯb޼yɓ'C(055E^ЛaEUULMC֭[O% 46l… 4d􈍍Ŷm`ddc2e:t(&N(?;53gXYYaݺu2egg-ۇ5}^ۥ (5#hl߀%#Ϗ#DYIIIptt֭[uVt&Mʕ+ 3iÇ1uTO>D`` ϟ/uLHH;` Do7nqÚ5kdqf̘!={_~pk׮իOtӘ6m~#XDg5 h Bw@y7cZ4l߈q X=v5De!22.\@]]n߾DTUUҳoM:VVVؾ}0477crIMMESS$ 22Rj;v MMM"|555䟓vK8yΝ;Cxxxv謇z(75@t^I !P ~{z!ɯ'#|_nzr XCC<^IqY>qΝ 5qD899V}}=6oތ,z^fxXV w2BHgx\)}w[wmt"6l@jj*<==ѣG!##ׯ_DŽ 0ydc°eHVǙ3gT)JJJBIIq!|謲n!)]O(!ú\zC]c~#YvH'BV\"BKh,"NѨ[yxe+030C< >1ɓ'1~xXXX@$Gll%׾}t.?D[uyVTvv6O?$? ///[n ĵkL c@tZ[jDGGVVVJ]vb믿*ˡK0˱pv1Q: vGѣGx1i$mE-!pOݻ֭vލ,,[ .\GHHyQYk֬S^R\xhll}v\|cƌAIIIۙk.5]WySRR? vMqsN~iaa|i\2(QM6իXjZҿ}6֮] X[[C${AzzRi"11lll `nn1c``+++,Z*I1 jp̛7Gbbd+ຎD `"2y;({{{K|rȑ#,WWWck=\Օ"aڢ/#_|E8p cc ٱ0Cq 赫 h[mm$88pZHLLڵkaggwAJJ 2337*^zCii)RSS1g|HII:F$!,, K.ř3g0|p^Gw@/Ç{i(8с1*#؈#G 00P|@߾}/D@+I֯9=ǯ>|}߆P(ġCp)444H߭ɓ'1j(I!öm0eL:999{|/$$.]ªUT~$  UJGܐ,?^$iUVV8Nٳgc3X||TZ[laDZcǎkϞ= )_y2dd[nn.8%''zjq?K^m3Xlll}Nwe]ve&Mjqkƫ@,;q8 8UVVJ3OOOqldDZ aDZ%K0۹s'8yyy\0kkk.^RZlРA8wg8^AAQz}XZZƍSx___ٳ2Q5!ϢdggZY'NDBB=zXZZd/++q֭gYIIG8dZkJU={N:>: .`ڴi!p"j#`lkvL](bp}j˗/b7nD^^>c/5٣RYc;w./̛7*tR;w fkk z6J3d>}Zf-=ڽ{ws}t-}FFF_e9w!A}S:ܘP(dǏW[1v5fnnܹsyIެ[n>cْ<[^Fmcd}e{elҤIL(-rk.viWCCCǪҮT*yRgUڳ*uV%_U˘j}m]&>UQXNN89;;K͂#!TVV2}}}6j(镕}2###믿2;{,344dcR_vqlmm7779s0㘟{B+V0؋/(S,YqǾ6{WY߾}Ֆ_꘍ /)G2d~a}aMMMՖr>~U97ofDZSNI5662ggg6b-r_vjU[:ҞU*uH_}ZwQΧگ*7==RCaڴi駟p]-~ UJO챪gUG?R?MyVu_Ӏ9r] qFt[n_ ooohhh>}t466R?>^&+VH#~M}`ŊسgdѪgbȑ_A::+ڞU%mtk@5"2 O244Dtt4?gϪ'0w\=iM8Qj ͛1~x@j@vvܕ_~z1oK P1b˗#==]S>ܞ|oGKںX{ ]: 6 55ѣʐׯc„ K Uίd?eU5oyz :uJ㔡j֞:+۞3=mO_Ry5MռvM'///(--!pBDDD=F$X%՜ @4gϞ%-WWW477֭[m~Xollxb|4hۇfeŏ@ 8P[EU'_iP_ٮhPW8])B:unO{|#Uα"}I]Y[4UVuk@5>yyyR9QRdfDmy.4 pIDATVdu>Sfdd0Xrrv___fccÚyɧ-|K|r~qӒm ٹy[;w0SSS6ydQ]ZgUG:=Zg>Q{K|gu51㳟IDw@:Pcȑ@ii)_"::ZmV7l؀7~~~29R-eddUUU!~FFFJwܸqƂ J6W[u>5~=gƗ_~WJ͛1e ~)ּEEE@ ʕ+[v:*uV=]gUU+ڗuk:?}]#D%H;l۶ˬ[nLOOu֍yxxJ3@ YIɗ@ Pkތ1fkk+ߓ ҮfW^ 2D#uQgZ9sܿ{،3%322b/2;v󎈈`NNNؘ>}z+"J]unoުYwUWsh_Ry拶ii~UktI1!BpuuEAA g2!B!h  B!B!1B!B4B!BPB!B=z&MvQ">>".\PKB!M6իXjZoG022#>C)Fii)k"3f oy+r -:B!Z]>>>8p9}4^|E:t>>>VXooo+xxx ::AAAt̙)S# 9sQB!B݋R̙3Gmy455a֬YCJJ ك5k Dnn.+<۷ocXjpyiiiHMM9nƌشiգB!.0`(++-߽{7 'ڵk077%n޼)^MM  fqE_8]P<<<0ap' !!!zꅑ#G"-- ( @!B ;#* Bff& Ž'Oadd$mۆrL:MMMBBBp%W^iLYYYqɼggg{{{ܺu W^mo@RFP(}777<|PRPB!Btҏ?-[ϟG||<֭["ݻR9s!B65Çzzk.@ll,$ۅB!֯_WWW/_ ׯ_inܸyyyѻwo,^سg媬tU Kܹs}lmm]oPB!BvCh<WW 355Bp1cȼ7dHm+++1|pC  ==ּ];=Fz? B!Da(x΀N@[;IpqqA~~> ///%W\V$$$ **  aiimճ(!B! 3N{1TVVJmYoѧ8 EEEÒ%K.#ǂ<^P8MX~=cǎ{/g[)B!4l00p QSS#p舢"888 &&yyy 2]zׯYf 1tPdee)Tl @!BNz뭷111xd{}}=-Z$+/MAAA HNNS9~:L '''8qlonn{?L+Wq1XXX'RXX5jB+"B!:W_żyg'OP(Çajj^zI}733ѣ*>(Zpp0nݺO?...AaÆ Xp!&ٿ:;v쀧'^uxp1`xw/~ΝFxf̘!=;;&&&ho @!BJJJ#n݊[{4iV\ Sjӧ#''ԩS%?]&?piL6 x1u o'B!? WWW`ذa.NsM"((_}d{]]dffGTT>sܸqCǢZi&;(**Jiի?z((Ӟh !BYߗЀ(W7!qq={VO8s|Ӛ8q"/G}}=6oތ+|("B!:kÆ HMM'z聲2ddd0a&O,sLXXlق8py9sFKIII-$`ݺu$ @!BBaa! # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os.path from docutils import nodes def api_role(role, rawtext, text, lineno, inliner, options={}, content=[]): """ Role `:api:` bridges generated API documentation by tool like EpyDoc with Sphinx Python Documentation Generator. Other tools, other than EpyDoc, can be easily supported as well. First generate the documentation to be referenced, i.e. with EpyDoc:: $ mkdir -p doc/_build/html/api $ epydoc -o doc/_build/html/api ... Next step is to generate documentation with Sphinx:: $ sphinx-build doc doc/_build/html """ basedir = 'api' prefix = 'doc-html/' # fixme: fetch it from configuration exists = lambda f: os.path.exists(prefix + f) # assume module is references name = '%s' % text uri = file = '%s/%s-module.html' % (basedir, text) chunks = text.split('.') # if not module, then a class if not exists(file): name = text.split('.')[-1] uri = file = '%s/%s-class.html' % (basedir, text) # if not a class, then function or class method if not exists(file): method = chunks[-1] fprefix = '.'.join(chunks[:-1]) # assume function is referenced file = '%s/%s-module.html' % (basedir, fprefix) if exists(file): uri = '%s#%s' % (file, method) else: # class method is references file = '%s/%s-class.html' % (basedir, fprefix) if exists(file): name = '.'.join(chunks[-2:]) # name should be Class.method uri = '%s/%s-class.html#%s' % (basedir, fprefix, method) if exists(file): node = nodes.reference(rawtext, name, refuri=uri, **options) else: # cannot find reference, then just inline the text node = nodes.literal(rawtext, text) return [node], [] def setup(app): app.add_role('api', api_role) psignifit3-3.0~beta.20120611.1/doc-src/gof_averaged_sessions.png000077500000000000000000002072261176542545200241450ustar00rootroot00000000000000PNG  IHDR H=sBIT|d pHYsaa?i IDATxy|db5"T"*"҆A[*ű#JNm*'%J6j[-Q$""T4bLf2y?q&}>.b """""""vbDDDDDDDDCP.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@P.""""""T8"""""""@ڸq#T^… ?ώ;:ʕ+OOO/N-زe9?ɯT8 peFɦMXd oח[fznbb"m۶e֭̚55kPBؾ}{}Q`X,BDDrߕ+W(_|Dj֬7n9s0h vEӦM0LPD vmEDrBOD+8r PHԩ鹫W+SH޽ٻw/QQQHnQJHr ?qǏAiڽ8qM?T@BB$!!ޡrmƌq111-[6MtSG'"pF'OI&8pƍ;Ν;&11wwwUC+0ƍ_>s5jdkZL2`늈dFOD "bS cHg|ʕ+OOO/N-زe #{1!>|~J*ӣG SڵkGj5 իY֭[#ر#wNׯ_? *ooӭ[7BCCٴiݻw눈XMODQ_v p=0 VH۶mٺu+fb͚5TP???on˰%1{lQx)F# b* 2{y%5j?pE,;L@oS#[9r&@Vt~t*YZua0X~=͛7E)[˖-S3͘f,KJ[…ټy3 <Ν;NVuDD'"׌TDGGL``C3g b׮]4mɄ%JHujwweƏOHW$&^bi&_a2]g| C۶mt.gqiL@72+23b>Lonݾ}+$QFb0Tg޼CEOD *? bz?bxyyF޽{w^r;Dx ΝX"XF dIh׮=s̱k9u:uz#|;/>cƌL>=ӣ/_N\\,N"}x>忯"""""Y+г4h M7'N$Ξ=KVm|&AcrG!yX,yw7o^Ś>3vރɴCy_2<P#2>ʮ]rԏH~!bbb([lmydݻwС#7nd TL#ɣC8]~'i#&{.fsOE6{ ťl7), Gl8hPCB_""""" t)0~$IIY<|KCLjl+<<#9(&S?.\̭[u&SVֹ`4 }{HHCL2 *F_L,XLj4 rjcyiO`2=Þ!>VXA߾}S1~驙puUC>7GM~1x` =ʮ]尧#7o|vr n݂Ν-11y{v^򖔔z3nfsƛ`۶dC8?X6÷X,r:LB_""""" gݻz $.]JfͨX#k] &K9&w̙ qq͛xV&o =l4&og uqy`x? Xyo[sA<<*qV 6mܺu7oɳ\;RX1ǒ%K8{,U$O o2{luԩSdΜ9>}M6H\v JLr$&F jAR%x {)`+\8 /\AqkKev:Nڵйsg`Da4駟+3@8p   `0p9Vll6Z{pl޼QF1x`hԨj^_GΝ;X,-Uqu_'RWlY_ =X]^ʥKټL 2QGfsΥ&)UxT?W|yBBBv رg}_C .y/HR\Jw;u5 HaOIJ??tF{o(%*h|U9/""""Rp] X:trW`6h*k:uruzwHJlT`Cݺ޴l2cҽ{w\\ze)Vk)T(7^G?TKg6Ï?&*Aɳ);'OwUx^$ff x;7B3ughٷ0_ӳzzE%,lLR_5qqy{puN֏w.5kDDDDD?$$!Ф Gaw ) 0#WhQHla?۷gԩD`֏_hH'Y{J,iY...rE/^O4h 4(Yr>/U+: """" ,Ͱd W@߾c֝_n]ƌɣY\]fj|و15 Ę1c0vc ڒx`F'(q_OF|bŊѧOիWݻ)S *˛"""""]Çaؽw)SF3qD.h`P,3,v\]X6@ҥ``ԩSqW$%܀/1o >}k===q?"""""HC{ƍ'7᧟`\.\q0Fv[B\]mRJNڵ+'N҄B>^:QJ>DFg͚os8i]֩Sp&?Ξ+o &LkY Z4p ]ڷȠAС..u?`0OOcXy& .]b2{@DDW2j4$#&zӦL"R={!V~M۳7kԪUӧ3qDV^͙3gqŊ\rtܙǬ}=3 *URJ;W\EW9sf 0 0f~y/_vZ"]D R.dcK IóXbӶCɟuJgLfԨi,^;C\JvvpӦ%/lsgw@ 6s<:C_oS'{G$""%%1N?8Q.vw*o.֭4qH& MRED_wkg!* mSq.""z'{/"2χGMl,tZJMDUKWcP.d2uVΞ=Kll,nnnxzzҡCʔ)rk'?.""""""TK\zEfrRͷXR֋G[᭷`Ȑ """"""Adg}ȑ0\0_>a2`w|IJBѢ%h؝?7b`B"""""RPi52ȑ#:t( lX 0@1sfGcdә>}:꩸]ɻ<(͛C…y$$[,"""""4.Yr)}`4Uy G,y4iBmv8yCVu֥aÆԪU,m6|,siZlIÆ i֬JÆ iР^^^L6-uhԨQv"##iӦ eʔrl"dDzڴi8&MDz[.*gթSB  @˖-Sy{{=z4>>>P^=,Xx%sA,;w.FIIrGxz`4S6 r8>7|Cz^z<6/j_{5 F=Xn>|8qիWg˖--[84i“O>/?8Ks^R2e |G6."b_屬ahr&+_oÇc0hӦ 7_Nu\2e8tP3f`)-ر#e7|Ä _>~!SL **ڵkөS'*V%cAݺu (:rG8j+]ZxFEŅ[unHH...nW\qRTT:upYmۆ}qx{{sc{=WNYn]s%N:E=xvkc6mJٲeۛȇ^ݝ-ZNO__ 7nЮ];&O #GaÆ<}]VO>.\B ѷo_V\ gվ%K|D(Q"GqK4.V #>>Þh|9s/Fh"k׮`6l? .hE$', ={ЫW/FMϞ=ٿ?͚5K+((:|ǼKi/\@ǎS~~G9|1ڵׯ{ŋ駟Xti̞= .d6]v ɽ{/9[]KjժquYpa_>7ФX,+ ~f̘AZx"5k֤Et҅~֭[yW)R}aҤI@7"ŋ̟?J*ФI.]DŹx";wlٲٺ؆Zfy,**6m3<իW_S'xoo?zEoaꐐ:uF>>Ԯ];;~wҮ]TON|YGÆ K2]VlY,( ]]p8ʕ+3a.]Ν; ȑ#4k,/"aܸqsCƍ $44]Ҷm[֭K˖-QFG6+f͚&MJNpppC_~%+V4iB-?y~DTB9z(UTa̘1Hdb4h@ڵ+f͢N:9[2f[;0bbb>H53=SNܽ{իo0jԨt8x M4NѪU+`agU473g̥Da]F3\'a._^:UV)K@cضm#GLKR@ޥKOPPkfٲe`63MׯSNtЁ0Xv-Gᷰ-[R7'ObIk;䍊+ݻ3=.88ةnPJ∔D$/8}?i&BCCSF[nMdd$#GGW(Qo6eKL IDATgySNR t!8] x4X0?uhH>JlM6ݻadHODlA_z5%K[n˥KسgO纺Rp%KRP!zꅧgEW[#L=MDKؼy3͛7w(""yJODӏ?~u%'2L.Vbȑ5bŊn:VZń l#*Y$ׯeg{#&j,D`"AAAo޶Hpnݺ͛7伷rJ yRbŊѯ_?,YٳgR /"[777?ԩSqqqaĉv>""R hj֬lٲ)3SOn:^yf̘hdĉ{ 8hԨ7c-bs،0%I&1rFE #,, sZ*fٜji5kxb"##{.*Tm۶7.ݼ*"hD$q='nJNxx)^8[laܼyɓ';Diٲ%V]GX0b24J 9\]t//o&N\麌"bΝ{1/fũ <"|D$q#Q򘘘wEzڵ㭷ޢaÆ8qH^zvNDvDDW F%w\\P_̙CF|2+VB 8p={9:Q^AŊD$d…iǍghDD򟈈T ߂`"5 J~?"ѣG>A6DD$o)d t1jքs֏HAҰaC3 L&G#"wDDG<ԏ?ի0>*dhDg;P\BܸdAT)Z5 psM"M5ͦ("H@/NۡI׸qqFfCq4tvNQ؞򟈈uTp^^30sf}o?4jw_ ܟuI^| 4yHPA/ܒgeo8ukce|_ҥxHFL x$|  СCQD&DDtIwinjkdwwwJ*ETT+Vgh""6'"b=Kq˖MkׯѣGR M6O>p̞=U;<Q tIzu8ޑ8@ݻ/h޼9KfٲevNDvDD]R o…xR>׮]3gEr(l"ĔDD]Rܻ#F@˫ ; <'"1b|8y-ш8___ %h[lGX""6'"b=@tto ;g̱c8t=?@ 87`d{G"✂m2e 111yHQAy HҫW/ {!"DDR^Y,P lhD ={;PIKp˖lܨeDl?$IW^e݌1Žؖ򟈈T`7nȑЭ<qnKN `Zj5Ν;9:Q lO?w$"/$$!؅򟈈TP{œ9#;Q^ݻCÆ0hq^~;6 ZjHDH@/OO^Zm^p՟9sfh&MDΝi֬wfݺu3^!؄H<+`~Ə#I{G#K.L6z+m,\u1|p;D("b""٣u  *UH?痦}lܸ ?@gBCg[ Ryxxz4}vHD$o(XOz>x| ރ-HA6a?AAAL6  mvxFE%K׻r }ӓŋӢE lbxE(XOzp68kÄ F`ӧ7nh4_xbF#6lo߾6kX`H=mۖ[2k,֬YC c6YD򟈈 $q;0bbb>GVw駟ray:t(q%$p` J>w8qFr9yL^ 7OYZ5_$ϤpB/8qviӦiFݻm8?K.߿ j׮Ͳel6SNeر 01c?j-ϼr$lߞ׭au,^"(..RJ|l)ykxyyr `4ݻ7G&**J*v"DD ~M62b޺uk"##9r$=z%'8رc:u*^JO?'4ick'11!%ХKtڕGy~޽Y3HL܉cذXD$seʔ˔/_2edx`d2ad9~8[N ' KOD${@_z5%K[nKϞ=ٳg͛7O?E2x5S.\w78p`G")m+LJl|0^xEŊ\ {#ޥKvklٲwwMLL e˖M~-:::C|BOD${@?~8uM3J;۷onݺ1qDΜ9CJݻ7&LPB6ѣ<ׯ )kc2MB RC6m\ :4ͨY@@C_+'"ztt45kLnЋ/r5NPPue͌?~K,"##i۶ׯWd *< 7 àAٳg}ɺҥK"駟pBj׮ʗ/o &&&M/&DDBˬel6sM,X@߾}i֬cƌaĈ̙3?tP:wj "ݺ[?0``*EnĈܾ}Ç/Ő!C]9zhcǎP~ID!?9}(5w@=<<0 t!ULfYfM-+7۷}vY-ΓdOXX.]"[Ο?OzXj/SLaܹv.}icbbX,@Jc2f3WW\!lْ#FвeKvW_}ӧRM=p@"##aaaa08wUVl6c6Sݐ,\07ofԨQ <5jDxx8Zi"wCYx1/N^|yBBBl""sw3f Pn]T#=uuueƍ=:իmT.z+>E$ըQM6i6m;""sw/Npp0.]Ν;:t(UqwOM&UVMܹs"11"✎;޽;W\G?nDDlKOD:@Ϗ[~-z>E$SO~21RDDcƌst""'"b=aÆ.\X |y:@D·~HPP)R$m۶ܹӎؖ򟈈T;(wwwz u>`AO702pۚ]ĎN| Rvm;G&"b["ΣCطOŹ-9#Wdɒt-U{߾}t{yhSN%66I&aXlkצ{t=O~9+>!!!]rqQ_.\=mקq6OD ?ʕB_r`?Kp='fΜə3gXnC|nŊ^{.Ϯ+>={dϞ=>A`XX,SDMOxy_+WWWbcc%)) č7sN:t(;wNKHSdIjԨ״ر#xxxеkW+?W ̚m;qADDD`6S;v H~|)=gϞΝ; 2e˦l;w$""wwwF鵃YfMeDĹ >Yf5}_ҚW|*W̄ Xt);w$((#GЬY)"b ?r̟ΥnOk;ߟ rJwBʕiڴi5jԈm۶jX, :8/^Lʕm8;vuV{ի``0<>j*{Jvh׮]M6_ˋ@V^CL2tRRSr.L 󎽣sϏv1`Qlذe˖Wԯ_?,YٳgR KgI_ҥIJJJwHFJ./>[ߘW|2RbE|}}ٽ{C J"(؛ŒxqR tUV1fnݺ|שFf3f߿+"!!!y~ lN^y@ ?w:tS8w\N:@ ҥKܹsC*/^dJmݺG2\\O||<+WLW|2r%6oЙEDMO$YB3Ϊ # aʕ$%%zh=K"* 6O 51``#5&16cKlDјh|-c]h0BTT(n X;+++]u)s[f9gFܹ38qQQQd:uc%a\<!C%P.Πی30|pرcx7QfM\xz7..}ĉѡC:tk֬Q[|nݺM6i+: IDAT6mqaxyy-^"*{@.Ǝ!tMKOOG&MABPvmDEEwްѣGQ~}L6 7nN#W#2'ucGB%3DDp [ <|bժU HǏ?橖yys^ڱNDd5j{HMM={O<1fhDDzH?\]3vk$o6l֯_"&"* iO.nU{Ywg+{A'"2r#`ooM6:t#"D))/;윗ML&L򮢈DDD/ ""aG>>e<`HO;oooرcŮkr?;q8|;V@!cHO5j7nZjhԨQIϟ02"*=܀9s?֮>0goKND'.\@ժU'"ҥD`4`LQfm l 76Dˁ|w`(`Xv+DDzRn]UNLJD%脷iI1qv6P ?"X̝ 8Cnmmܘȸ8:TV }# 7Wll`bղMe;禈QѼ`pD;DD/ѣjժaÆ!55a9sRE1R~+W'&m#RvR-k1E&t""֭6l؀7n`ƌ8uZj7x'O6vxDd Z8[Z^R^ŠW;2ePJЯ_?l߾G Lb찈H.^T-uKq\effС@ZQy׻78;;2eУGvZhܸ1_5aOe̸Qyr$Ç/,-__DGq'"2V¦M`aa{۷oomЈH>OAQ&IQ3nlʣ  ?ƎJvЉ [nҥ ~tܽl5OzfeL ?*nWpPBtt""y&*Ud0n[ۗe8(AwqQ F/ عx뭗SIt""T?/>233(.7vvv Cfŋ#de:t(8:u@kcĈj_]?9!)Iq&cǗe5k-[VV/[4||dʄ&MR/}}Qvh6m/CśoN:X'99;wF*U1/_\^bE ooo˿n رc 0?c{ߒxb@ʕѽ{wMsIIIaccOѭ[C׮] !uo~-Ο?@nZexwQNk%9rjޥB ##2 M41bDL˲ŋ v==~2||TrlȔIp P#!*\\➝H8;;Xvk[nv XZZ =z@FF.իӧO#88R<$tH_VPA333X;" ˋܶ(էWcVwd"##5kb„ 4hPiR/^rr2vڅ]vK.q+VTUX~-{#FF[Yp!Znc8URYYYo;A0x{wB~T"bWK`@2Ke$%%a{qe5 ={LV7oVHM6]6̙TJѣ;v,$IǏQFHNNVv5kÇ5j[okkk>wCŹs甗n_ iӦw3+ڵ+;d2xzzbٲe pqqAƍǜ9s{nA$̞=Go߾Xf  www6^^^?> I/^M!z U.Dџ*5ke٣GkgLO>mݙh??,9NL޽=:ۿ?FD'J*ϟ^ZH$߯>Dhhh񾩠L"Ív={&>}*";;[-[9*2>}M67n7oM6 777ѧOc3l`>!)~18slcSRXNUU?~ xzz8K@1uK p.]2ȑ#q<|...1vH%vBgϞ$$*-Z#<<& .4rtD;tHqhj*P͛WWĔz3v @j*O2勱?S{2v*|pww/P\\vvv1bb╥/jժ!==a"&&s_!<<<3Dňǟ~ ^LTWAq9mad/+_ 9ˁfRf9Ve+r a8;;v_>zRmMDO*U`0,׮]t *9;XΝ }yJ2?cgܹ\:B 8+WDtt4Ԫ{ܹWys^:d2<|aiL~"""[[[j ;wsdL).O_J<*Jq5o`KXN?0aCm[9{2w}}}q) | bbbtR|z4KsSPi&Ӌ zDժUUwǏjժ);)))Adgg/ I۴nZٳGwWB1qDO?ZJSRRߒ$oV!˗pႎ2'2 ml߾,P>c !IvZ۱3OU- 1+{cGAₐ87'Nĝ;w5kW#!U.k I-[e˖nݺpr(vލ&Mqʲʕ+СCTڴihѢ\]]ڵk X)))6lr999fEֿw^̘1<9Ν;OЯ_?@ڵ={^z}Hi&O8Y#&m= 4n_^Z/."CcW˗)reŃ+t[[[̝;s-rhDGG]xQߡk$}o [[[r9͑VK8999___z؄*1L3yznKL7pĉ)lJ,F cGBdXd*"-- |=ػw/ 5576mZ`UVEƍ1geYff&]VlO<ϕ/Z:+W`Ϟ=NDDXXu3QΝSC+2 5` nPys?9\A' 6?ӧO!IN.] ..Cflذ666PL 0x`,]ŋQV-L4 jg}V...x ӧ@VV̙:u =mtttT鶀bvZ>9eg)DTۿcVKqAp+vɨZnC(oժz~uEffJY͚5W}?~#G*7}ĉOȄbՐ*3ͤ;V\)*dxyϸ$ qc#*M!R%DDeTnݐ 6n{i*rssb h5uYYYo;A0x{wB~zw^yiP6 <~ZTpʔ1(6 8x1Q3DDeThh(1h ܿnnnXz5mۆ+W*o0`bccq  <<QQQprr… qY$%%3-DVfqd*퉔prrҺSf ?I)ZWGT̙x15ׯ~ "*gЉʰ8'NDp!YzRS4رcڴiC",, 7oDbb"Z1c{9oEP|5bYZq.lڤZ>b$v"ҏ1/TjvsHByHmhҤ 8H_>T~tݕsСCѿ xb4h9sv1C?y=zaffjժap㍟Dj+mퟷw'<^v˫ 22mۀeg[ xmEpȄiyc bb- QKɤر믿p%ԭ[WG)ͤIg$%%jժ;w͛v/ڴi@߿?vޭȤ暡9^,/\Z`n,xxPr޽u. ŷ=3Ю /q'd5k|Mয়~RYtR|'ݻ7-[òe˔sh۶-5kV*TPv୷¥K4KJsLbf_|̞Z;vΉ Xl{J{^mfx1?go젓UXCRRٳgn۶ ለ@LLvwޅqUdddRJW\:uBzzk={6zUnDdښ7pѼNW22T_,]ԓ-{"&N g͈遖-{P|6wm*n)9#C`>xxxB y&`ʕر#lmm鉚5kWnWJ9rDpvvV-[ްӧ… >}z "`֬ps@ ьR6r@^Y6"aIT۞ҤJ`>`0cG_!NFgee/\t)P^=ԫWϟלq3{llڴ *Q䄔W8:8""Y[+zDFz@Qs{XN7E1UO@s&Fe!p82Iiiiu_,QNܺu*V#GbXn>dھ>~k֬ARR*qTr PgMٯmL6WCPppㆱ#1<~xJRW$Ae˖S (Fmo߾=VXI lgʔ)ڵ+ڵkF .D͚5}?#G޽{hӦ ѲeKeJDA SwC"M=~<$)Ì0ZHFϠQ=ڐeffPLqVfذaVčP[>z""Ҥys/|^z 6ƍN:֭[+[Nlܹ񁟟3@DDDd< ZeXHt2IUDL IDATHOODZc0x`!55U흝q9rO;LRM6ѻwO2֭[_͛>DFFv܉#Gܹsƍ8z(n݊/RȔ}5ᇪevvw8"S:` 6 gVk}KKKXXXP8;;/<<< 7ng}@o׮6o 8q:vV5jI߆-k?aDDDDר[ډtN&iӦ;_c„ ={F OƨQ4˨[uҥKg~\x>- vx^yƜp82)yg۵k#Gv} x"##1|pO:gժU>|8,Y:u}.?~8kJguM 9LϠI9t|||=>~YXXؽ{kx]vm/^DzC||<222GOɓ'ѥKDGGUV%MHoƍg眨4ǔ*۷o󑐐f͚ իW+++r[7~m}ރޭ[7Xh^;vܺu $ HOOW^~)tK,AvJ>Nm_׫W7nLD>A'zиqc`ؼy35kֶGE@@5j\z\v uWXWWWlذ&L+= 4i_x{{#$$ .D5+4h???L:[nEJÇGvv6F<}v]>=DDDDyr1v$DTxt"i-==M4AZZk%l2VwŨt""""R(6pwn|Y9Q{ЉJ.]U  Ϡ, * _}ffƋtt"""""w 0c_Ǝ\tг gggX[[k׮UkLDDD hժvܩ爉<|8azo;5k^zankv¼yի#44{1PDDDDT??vvƉ $^={5jz ).] ???=0XDDDDT>y?R'W37nUk׮n>#zʇ]O_mm Pb""('NӳYr@FFF(Wg["""""uk; "2e™۷oݽ@ryQܹ\Omq0o(1EFFJ**ezB^YYY=zRSO"7 Ѽf '''cG4nlf2Awtt,L;wˋ6o=Ms1[\"""2LjΟ` 'ObޞHIYn"Rba:=达8uL&yq@Æ ǎ+PζDDDD2fw/[@q (Zo1z,GD&m(nݺ!;;6lP)m{i*rssb h5j[DDDD%z@Q8/)0ePcРA>ܰzjl۶ +W$)~!0`bccq  <<QQQprr… qY$%%3-""""YW^,'"R`a:tC>}0qDtš5kTkB(,--ciCEXXn޼Dni$;;pvv5vZL&+ȉH"_,/m(gsܹs\'::ʫU=FGD?ݻwÇ1sLXr%z\111P)+l J"2͛{ɃPOh!?"0境NDT%$$ )) WFϞ=|2F={B&{T 6D̬YwoO?-8̚ޙҊf{aJ%DDƍaggp~ڵk8xZBCD ))k/.x0xyuADD\.f{aJx:q<== %ddde˖ON*U ((SL^b&"qrrBtw(i<t"2pww/Pw۷SLA-`ggǏ#** -ZDDVh۶Zպ`+@Ν၉'bƍEn*UK큙#t=@ZZZQ?JK,Qkڵk =KtrMըQmڴ3xDDbGD ;z`cc?HjԨk/V^ \r(F'.)I -gGDNDTFu ذaJyLL >];v5#ҊgЉʨPcРA>ܰzjl۶ +WT9 4`… puut󃍍 N8(d2L:Xi?"*A'"*0n8L8w܁'֬Y_e=\\2߯;qe<}իWGv0a„BGG&"2%l4DֈvMիeƮOyΝT׃կoYgÐ1Ys3vMLy0W7vW~x:vJg}̭tg;DDDDDDD&t""""""": <&Ç{.ӍR16v̽C~z_I0^bt3d}̭tWs3󠛐t4ia+iiihܸ(?Lc݄<|O6vD劇Z#2<r: qDDDDDDD&t"""""""egg#22ΰ?֮]ֶlmmѪU+ܹuвeK CVVA L&+ )Q"##*U@&aE5_׹[]v ,--=z ##C/]ʻcǎ%~޷oߎ ԨQTZn8IN){$&&^&!33Ӥb믿"00+W<==?%<%>cm-[uְC 鉨(rǩxn݊7|666R pIŚѣ'''d2LMKNN.rwtCHH9vn:'Hg'$IbժUncѰaCQvmj*$v*,,,ݻUMNN[n"))I\RѾ}{(Uof޵kprr!!!wB$|BGԯD.]IJe޽{źu넯j^bE]TW֭cǎqqqbb͢K.B$b IN){$::Zy|I*3ffffbȐ!b֭b޽?^b6'Ox^w),--EVL*D!I bbȑB$1|pĪM6m$^z;v8+ŋE*UDPP2ɓ'&Cԥi[.… ݻE|| bΝ:K4-99Y >\YF۷Ol۶MOH$MܴOGT\Y8;; ;;׮mi}k.!I*~vvvueffZj qF Zn-*Ud=vud˖-B$f,?^ ,$(rssPYYfaÆ*ۿ`r>|>rפ~]瞙Y,++KX[[O>DgϞ-B sQ^=o:wM.*wR6/紴4}).Ç 333w;L IIJetBX{-ǏUDʕu6hРwkׄnݺQ'MҜ!_MҴyfǏ Ѿ}b-I^ԧ~[Ԯ]utR>msܹڵ+V|i}A?oԨQB Vݿ_899={j?]%:qF!<<\_~vBjj*_z*>>}@&{ҵl+W^vyj$I[}nܝ UZj?,+*ӧOC&[y^.d2TTIL[wr'="?$+D%mb?>0tP}BןK={ePJ,,,t6޾}gΜATk֬ lڴ gMP8JƐGI_궵ժU+PVB4hРJ6{3N}yJۊ+w^,X@mɯ$4<7nD۶m,CݱyfJUvuĉTDy_q޶_ĉPfff$I/zܹs`ooKKK#11%[]]S… teE~ TR@;ϫy?ǎ+{>\.Gnn.0c :u #FPO?~vbN:Ŏ`XOOO_ 49\]]W_ٳgzWۘ_u2/6<O} OWHi[I+in>bW4cƌA`` p9̞=AAAزe BBB ⵹f42qDLw5Rdr9 cÆ pvvV{[m;ԩ͛Z=|ܿnŠ+зo_<~Wk{mrWr2dHp0sĉqF#FJ.U'Zhl̜9'O,Znn./_4ok.t;vħ~ [[[ܹ'Oƃ;D%Lcԩ={6#22999B8+OdLڶ&LU0|;\+inƍç~{!>>_}rrr72+In6loG# ֧i~~~~Sݼys1c젛*~K舣cݹsGm+nۼ [ fffz(u䩻:tʕ+0E舜u|P=Gƍ#$$ È#}GڴQڴi$m%I;CR @1>MHH͛7vӦM+0&S~V S\n2d իݻ{{!''Ggi[.='O=$I2tũS $pq@Æ ǎ+Py!ZQzuPuWrז !' &&K.Uv+*w___ܽ{=Xun߾I&xX_S7iOv8@X~[_B]t)*T>}<:kffwqu˨_~7mHL(s@=Z;tPӜ#wM/6r1`!Ē%K̙#̛7Og:8850$x(oi sUagg'w0źxBw5j033STbsuann.>ĘGXE&M OL[n.?CWr{HNNwV>EhhwE[O QNѸqb3fPr劲,o^ziC!!!A,^XܹS 8PH$VZ\\ɓ'aÆvbժUb[nRٳGdaaa!w.o.V\)\]]k{ݻwbb۶mbĈB888n!X~X~9s$I 2DYխ_2DH$  8 RRRtrX^..ۗ=.M&!6l „$IbѢEz]ݺ_;N:Yf[{E:uʕ+kX={&4i"?{n1i$ann.X9OTT$I$%%5Nmb;0֭HHHbĉR\wHJJb̙QtҥD?j"!!A_^,[LH$}ÇYR!_֥i[;{l!IСC㇔zK4/__E߾}$Ib̘1:Mtٷo볍P>M۷]+ 333QZ5ѣGqaO:֭\ȑ#KNDDDDDDD:A∈L;DDDDDDD&t""""""": `NDDDDDDdA'""*傂0b׏#Lrr2d2߿@7ZDT2ouŏ?:5ݟMr*A'""*$I$ICg>={V֭yi"2Mon5ݟڛ֖Sɘ;"""*033z_VVVR{}I jDD%tgЉ ((Æ Cdd$PzuF߾}QR%`ӦM*޽͛7jժ ϟ?W. ;;;ԪU ?C>}ѣGVVVhԨՎҥKdXv-Zjkkk4lwVwYmдiSXYY?̜9nnnP4hX'$$7ހ ڶmK.,/rx4mְGXXy|2FL},ZHVX\&aҥ֭lmmQvm[N獈ٳg2dQjUL0oCʕѳgOdffSTRhcǎ.o_~uօ vо-1g)׿x"*WKicHObccꊣGbȑ>>AAASDo6pq899U-[Dz<җ/6moߎUV!66V9:Q511ѽL_w3}O_: NYA+ifffZ }1UCV߇ * :uݻi&̚5ۨ/y}[:u 11=zrYɰt"""Çk>|G˖-SSSL$$$(}}}4jJ럽}SspQ+@W^4,\rS o"""R^VZɓ=1x0@'"""UODDDC܉ DDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDdDDDDDDD:`NDDDDDDd#www ?\m\r뇛7oGAVnݺXzֲ 􄗗o߮,;w:u,+Uŋ~~~h4h߾={=Ui+ҧO\ra\pHKKáVYfwMpwwNJ+e4h\]]޽{֭[Wk׮hذ!`/X...XlmUn[.\@ǎhs_Bnnnx7>~U]}NN|}} 5jݡVcǎ]իSV9K/*ŋuΝ;kmgŊy0駟жm[xyyqqqJ!Chvһ](y';wбcGc̘1J۷o#88JڿoL<^z[*[~~~J]3g F777l۶ 1cԩ~*TU/ڵ+vPeR .ԛ'==]=nݺHOOtQYVabbxܹsxxx`ڵU^o1vXӧ nnnGvvJJ:rHeه~WWWxyyѣJ… _*E;vDRRC ?^;]FZ ʲSN!00^^^pqq)Ss̩Sj,,,jժ*[Px{{ AAA8}vQZm*{66Vv%͛7׻ޕ+WNﲩSg}&*RTT$={WjΖVZIvvC^booϟƍKzzzǎ;;;׻]J%YYY:""ҭ[79}1B1RVKRRR_Kɓ'iӦ~uݲeK9~vٸqo^ D81p*UU/ڵ޽˱gh4yTd]/&&F]eV߽{W7Ar.$&&ŋBye…z+{NV_r!yDD$>>^ /TTBB8::Jjj 2D}]yo9sFDDw.+WQղsNmbaa!nzrk׊HbÆ ""?H֭Pg>>UxTZ^^ɉ'D~eS Z_Pn]@aa!ݻM[rD1~x@ӦMsoǣw{{{h4JUs5j?|ݻW:%W=<ZBPPPW's $&&_wŋuo666z j׮]g,r”nݺB^^ abb?={D-򚛛SN1}rr2233ѥK+w^_#GD:u̲#"nݺ-ڵkO*oNNN+ /sOIhyyyΆ ##C9.P^i %K_-FAhh(m6)Qزe}[~r^reVVV޽ Aׯo߾F@9Zn6m(W]}ߵu 333^{5{:ya֭˻~gǎ4hƍ+wի{{{eYH,y:OЫW/eb(={ cС<7iΝ;#99Y8]6S>>UxT___-{?=m⫯|w1c|}U# ׯ_ʸvNNNJ'> ?p%>|y氱m+E@|ƙ3gаaCJJ˜1ccƌJ}9 6LgaGf0rH@m6Dž e߿ΝY5ž={p5Sse={,:$&&EEE CDDP<8q,,,۷o#)) z׋7]~] ;; @dd$LMM#GbժU:u*ݻ[bzӱcG8pÆ T]e ukkkl۶ đ#G ,Ao׮]nݺaٲeĨQ0bx{{pttĸq)PwYt)Ν믿tT*?~ɨ[.~ieY^YuBBD!!!qj5{=gEHH5j+++4m?Cu񤨨ԁ^SÇܹs1l0;v Je˖)Ne-^Xg8pgGyߢE [$-- }Y~ƍW\իWO+:#GT#J:uһNVVaҥnž={`mm+e `ݺuXz5 GGGmԯ_8r:u> 7n^yׯMy_Qݿ֭ϟ۷ocڵJtRt|ҰpBl?ůE!55 011QA74nO= 7n#Gо}{l߾|m嵋jǣ?8TV쑫);]Dd@˓'+&VJWy)/_,y_ŋuѣgeewŋu>tvڵCܿ 155UjݻWǼs >\<<-M4+WTwܑ'"2qDy뭷tO>2ur N.^"2}tyd̙Zy*6lp?*2~x{bb4mT'_QQxyy͛E|yʰ>}HLL^^^m@%H&M֧>jZ~gM6I>}/AAAVeرh믿svQǧ9]~],--%--MIh٣+Tm= Z +}ATTVZݺu/cĈm%7o+W@(|[n-[bΝJ2]4_NraYZZV^:{,7/>#899iӦP=z@Dzhkk ԩS 8pF 333aðl2,ZHoو6uVxxx ..Æ СCѤIr󗼖zz:v988 66͛7׵]zUkMi7n@HH,XA)饇o6mÇÇ1j(2WEy}ڴix 8pvvvz333S3fɚn gggx{{cpQ̟?_S+Sן~)}]@DDBBB}}}q}dvUfXgƍ__ŝ;wлwo믿FQQLV;ѡCr':q푗teDVye˖Vcذa P|\0`rmԨQx+'=kkk899a׮]ܹstR喳J077?zj dee믿֚D`Æ x]_VG)^ve1tP4m˗//w{o DPP=,w}ǝ;w[߯e(ǕUr}tT*;4o\yy߽[n>^4ir9uT=z;a3fNeEkȑ#EÇEDd-[F),,^xm]vƍjɭ[ݻҥKykIII֬Y#;wKD'G+,,dʻi&qvvׯWoV999]PZZtY7mTZYܫe u_z2͍7H/_ Ƚ{~HqwaaL>]'//Ok׮իWm߾}U0tPI7n,:*ϋ2o-zz쩌?)ݻwRmJAA 2D&LԽr?v옘>oV|}}%''R}ҩS'NRY2ȥKQFʤb+W9s^J΃bbbΡe/WJLx888ꫯd"R|~Wׅk6رf͚IjjN/vvvgݾ}[?(Y233_6nܨ=)pymܹ]9fLy1sQQQwDy>>Ux$R|~۲eK9pVzE`E5H899_ﰚ޽[G\\\dJGFQ~gҬY3kkki֬>>Zã4rPoE|||$00P~G%_ZZ ]ٿtA}rYeY޽cƌ FQ+WOOO3gUWQm?((HG֭+͛7*[IpBEﷳ7N BK?^V_~EI :|P%J]egP_`~2O?$jZ :T6h(m&mڴ6mȿoDEE_ܺuKz!jZ4:tHY6feh}u]8駟Kݕrsseر,nnn,.]RQEPeȑRPP 'Oh4*AAA&nnnZOعsΏ:u*wXȑ#unk)mDV'ow{IIIһwoqww;oi7nJԋFɓ'+KÌ9RjxyyZRSSsʏTҫW/qww>}h뽐Qk׮wwwqwwc*AѣGED8 F<==Y-[,;unZ^{5 ׭[Z맷\2ydiӦh4yEѣC<==eԨQZDot|HDモVZNy=J*rƀ=awyG﬙D<3fN{wP$Yjnݺܚ={R`h֬YmRJ~[ W_}34lڴ qqqkS_D@3W7c8>=,DDT~̘1km`"((?cOj{ bj+sNݻ`Bٳgoߎ5k?/n쒓ѷo_9rzO%='O"<<\'=,, SN:0e}KKK<3۷uH899XjUMQ_[DHTjI\\T*^ ^^^Z<|T*x111Kj?n8_ڲ?.X;~\(~}ܸ!hQ+sҼysK/$VVV]c˗/ߣ*>=DCq zWnN1>氮 NddoZZn >}Zg3gEyn}OFv|'RRRjc#cv0IJ 3334mڵƍQTT_*i J'| 6~:> ww > t!ٹ<| {Lϫ9ko 22ǂ tשSömې_~qqqZz96lؠ 6@Raն¶GƈZaTWЪU+mO=._ܼy}oٲe !C+ 99gφZzFEm۶ž}vZ,YDg 3I&aÆ T&ܶm>S̜9vƎ!C"C᭷ނƌlc}^a]~-B^ЧO/Z_a@߾}1{ldggc…ǴiӔJocc=z;v,jtt1bZzziР 4H;w$bkk+aaarm|xbiѢԫWOdժU@?V?.AZ~tAT%88X>s%Ojj_Zh!fffR^=quuٳgݻwu GG׮]DT*?Ǐݻ<2p@|{*'''ra;D H顝8q8~q܃y{B辌#0!zl=|2رϫ9k-l{dخ ɸw;y5uMm۵¨&3.\{* ...\ǜ womfϫ9k-l{dخ L6m?11A:`n63QDDDDDDd$wa{{̬KCDT5=2Fl NG->pt,~%"2vjj #kt2n@ll+cWsXT[]+8ĝSO={v)jú¶GƈZ+DDDDDDDWЉ\pAI%s]*ʊ%""[R;k͚viy.\@6mt}0|VfYbbbFRb#cv`N]`^`̘. Q3>OUq}Ν;mDG%FI/Nv)k2bl{dخ ɸyx ] "a}^yW+ 5Ȁ뚌#kt"""v]>XP"'FeGӂjt"""A}>ˉ*AFD0@'""VʉjNFҜD0@'v?DDխHBmT>kt2n͛ky|¶GƈZ@DOZy|¶GƈZaR """""""DDFɓѣaffKKKmk׮{ tVVVƠAp]r%`nnVZ_GAAAu:[w)~%2b@LL <;vǏǒ%K|ϟG׮]QPP͛7㣏>Bbb":u;whmsɒ%o>L8ј4iRMUú¶GƈZ{ɸݼ ,^ t88viM.]ХK\t k֬y .vڅ ₘ,](7QQQΝ;#??GDD7)8y5uMm۵:7{KATkqU@AAvڅ0%8͛#88۷oWX"<<\k{7ov=}^enee'(~ceW^پj۵:"33[nŞ={trrrZ333+5jvvvHHH!#FTzGQpڴiS  Љ+5kLMM)S(666:@D^zkmmle2b?`Dw2o,=B Љȼy0n8ddd`Ν3gx-GDD6l-=I*,v"2.s;=^q;sxy`P]"cGGG@pp0LLL^jj*T*ENNuTX˗ϏRcWsXT[]+52nvv1ůDO hݺ5,,,pi|gΜ @Ol?)))Sձϫ9k-l{dخ ɸ5n\Ȇƍk$DСC0553ԩ~a۶mT\~qqq8p֫W/cÆ Z۰aT* PS@U>氮1bVp;4i6l@ %%۶mç~3g*###}b… aooiӦ)۳` $$GEdd$Ǝ 77U""""cp]氮1bV=֭ t8qݻw1h \rEvV\ 777UVxQPPPŧG`W""c>氮1bVm`hҤ T*ֲϣk׮(((͛G!11:u;w.Y>^I/QFCBBB5=.@4i<<<0aSRR666:lll "HKKS֫W:ymw (رϫ9k-l{dخFu-[k.:uB,~%"2vjj #k虙̙3pqq(>}ڵSHIIWeZ|9f a4zƍsҥK? 66vvv055E~m6Lׯ_G\\M߫W/cÆ Z R0`A""""""2jF׫W]tIajjΝ;+i@߾}1{ldggc… Э1|,X666 ѣGcͭFBf&p VGDd5=2Fl Ž,JuU\]]qAԭ[Fxx8ڴiC);w./_-[gϞXz5̙իWnЃJL:t(~%"2vjj #k1޽#33غu+ZlwSL瑓+W`…055ӣ;y5um02331sL< LLL/,, &&&:<<:v ç~Ξ=h|?ѲeKL4 'O!")e'Sشinݺ%̙3// |r=R9w\YYYťKCOdd03Ukۘ1c<==~ػw/F`ҏ}^a]o R  O>̙3 6~իWmu#*Fbb"GZ[|<?l2bVҙqGpvvFttV1y5umPك,ܻw@qe@>}cbȐ!pqqСCx뭷1c(ѣh"m۶طo֮]%K _ql{(뿯'9#6(]p5l dܜW"#V68zIIIZ饟Rn]ϫ9k2qD\v Ryfl޼* W\SO=cɒ%y&T*0e̝;WgᅬMbʕ->&MTm … hӦM1l dܞz ٳKAT+222p1t]+9wA&M0`ZW 9ú6(W\o;vTz{uEhѢ)V`3jr^Wk۵:4i1o<%hLDDdj*>.DDFh/j**F`""""#[R;k͚vijDdd$,YhL8`#NPTG%_1bV0@'v.w/PjvV"c={vs#d'/T[]+q8=!x D?{W}}x5!PH D(TM&K㶒l5e&xA ZےKDkmbG(F4(I+1T^0EPrΙz>qtw3=~32 sr` 1qmz_~*=DS&t_~Y-ѣ5fڵ^E-w-IԩS] [L#Aشi]kХK50:彅M#Ai<C{Yrs%쎘=kX;_HaoҊ`w'yg;1{8ְ }vD61HCiw;bpaB;wr^h Hao]TO-1{8ְM^aazmu3`[a[ܿ %&&ꮻR@@u}iŊu*!!A!!!r:4i_WddգG⋪-+k$mMl3g{??鮻vZ?-X@t >\Ryy5tP}pͭK,Qzz͛D޽[iii:v|Mv(I inIIԩS-n[%Æ Ӱaj-9r:zLM6m۶8EDD(33S˖-$kzꩧxbIC=/*--M)))ʷl!!!Bk|Pi} 9V<=kX F_@fI =:\~mU~#NS_%IUUUڴiMf&xmذLгUYYZ%''kڸq z㾉;x`Lҋmv-1{8ְ }kwxM5&[&aҥK*++{mٲECB}s111ڶm.\˯uwCڿw\&@T~3g`[G5B߃n5&[&3g[o%Ijժ.]9sHm]BCC\hh Pii:wbiFAAAu:N.kM\ U+];[A5B߃׸gd}zꩧtмyty"Vxhl5ZK׫GZx?0IRIII+))saaaTEEEek꺑=#^k׮u6Ƶl5rom۶)))I=zP@@N~a}u2$oe~8]|YGQϞ=})HeO8bEGGt?z%%%iciȐwVX'No\1L3YUU,ZJСCuԩZu.YD)))͚5KK.ٳ{p1{8ְ }vD6ܹSZR^qin~g5n ի5h sիp84~x )0Pwx uԩֲDKK.U||${M3zc `Gkٳg}}tQIvf7D5B߃ѯMJFuYkNך5k,קOرChA.\w}W `us-޽{Ι3GPEEVZycp+yñU{#vtl;1{8ְ }vD6q;-"BںVwc `Gk :j)((,@QW֕K QDDvF+HNZgI:U_YvAtp#A篼ךkUܹs^n-pA:z쎘=kQVV^رQo\%$$($$DNS&MRQQQe_uEFF*00P=zЋ/*Ok{#׉{+uQ79/uW;1{8>ԩSZb.^ &H^zUUU,ZJСCuԩZe,YM[n*--$kʕKOOWPP6mڤmJL-[̬czꩧxbIC=/*--M)))Bd"O#7ⳏ@$谷vQnx1{8>0zWUUiӦM6mKRxxa3AVeekՑ hƍ&BݻQ?Iaw# IS}1Ubv!UTTo߾uh۶mpۘZuAJ}p &$W< ; AKBCC a*--UΝU\\6m(((NYiW߂ t {;zTyñ GZv6Ьf  hVڳ{;{VںU>cݬIJJJ+))4VVVBu8zۍesj;hͲ_{ :{=fgϞ Ҿ}SDD$|N}߾}4hYĉ*..Vttw}#=-57NׯWYYȑ#ĉeGV``V^]իWphj6+hֶl٢ϛ#߿_֭$3FAAA5vX͝;WJOOWNϚu9Ni… ȑ#g)##C3fPdd%e A@6k,>|Xp8,9)<<\}ю;ɓ'_#FPffz+$$D˗/WfftyiV\&/$$DnMF{͕⤽{%O=kRTTRXm۶ͥsќ9s,Ϡ4~*M&t[xbE;1{8ְ }>ک([ i(J-k :n+-,:0]=kX&poxWoW͕n~m"AG#56zoaB<+ i :Xnr pӳ4V͒z9!A-F>^r+Wbb:v(???edd)7m4ys=u^xQ֭7xkmFnE3VI>VRw7~m :q~Ws)XBׄ rJ9z)''β͚5Kk֬ŋ5p@eggG?Ν;yyd?D<5YIc `Gk :Y[x\nTZZ*I*..ʕ+oXUV4hMۿVZKg$=C*..ŋOtoC}g T}|hhhV@@t۳m۶)))I=zP@@N~a}u*!!A!!!r:4i_WddգG⋪;~9sh֬YԂ {7}nRRR#z]myñU{#VWWXzt̙3z[*>>^t >\Ryy5tP}СY%Ky)11QwVZZ;7|Ӫ]:tO~P}{r:Oeaaa/=.\k)6dyñU{#V oQyDKK.5tiӦMj۶>#""e˖I9ZSO=ŋKŋJKKSJJ|doԯK)ɓ'N|EgΜў={ I:t***Էo:ecbbm6]pA7_;POٲeΟ?sIi}ݺu1coь34eEDD0 ܹS/ӧus='-ZHZ}ݧ>@+VВ%KԾ}{KlϞ=[Z`$#7:qhh Pii:wbiFAAAu:NF1nJKۥ鴺5G͚5K$9eee)++KCEEEj׮n6-YDǏPn4g͟?N7uUN8ݻWfϞmYO>ڱcZnɓ'+99Y{Ν;gk̟?_֭[QFi7o/_í_!CyñU{#VWsrr\.m۶TvΜ93gέ6 V 쎘=kX;_lu}rխ yV&[@sEw[Y'HmZ,bpaFB;wNATPPz02;,FL5x@ڻWmhhyñU\{ݻ$i\IOLϽJq&t[T/auKyñU\{Ν5Wާ^wT=7KZ&FL5ނl=kX}/wu[a1bA$t_KSTc `GkϠ.]Ξ~I̫n!L"~*=D{n7yN7 B߃ѯM$\bZLUHh1n4ҵ0H<@ =Ӏ G+++?DuQ~~~Ȩlnn"өI&޲"##=z_TUU'wMA5B߃ѯM$#S*..W޽=KwUةSb ]xQ&L$9:8ÇJYYYZj͚5KK.ٳO:bpa~m :|Xp8,9)<<\}ю;ɓ'_#FPffz+$$D˗/WfftyiVEDDDGws)22R֭_ͦݻw׃>UV駟VS@{͕w把te]|Y.]p\llmۦ2>}Zս{BΙ3GPEEVZykX<\rhϟ7;a0z;vL{??ɹ$ 2D{ֆ  P}/ :-<\Z쎘5GZ#X773gT֭ukuysH4_&nqut Zb~c}Ҷ5NS6lBCCW_)33SÇ￯DKBCC|hhJŒ~ :X}e"AO3?h =裊Qjjp4X&%%E۷,))IIIIo4-Rpp}QTee9XfIII%%%uӬkX@3谷'W^~#yM'Կu.%I>//\oNUk{~HaoǏK/PvG.:􂺈cݜiÆ 0`ԵkW 4Hk֬˗rv5qD [[}VAArssk >HUGBj nq/=ku+;y^vkjM=zSv_+33SǏתUr?4rHM2E3g7|s*&&FA/%ݮ[Ԝ:uꍋ|{AEDDxQ>V zYY^|E}U\\EiѢEuק~*}UfffsZ|׿;MV{O/T^^0 :Tog6l6oެt=#4n8P֭=ҶB;wr>篼@IS]\؍2SNiŊ߿&L+W;4|p*++KJOOСC_CV,YD7o{nرcz7{EӼy\*޽{{m[$1*A֭JKK%IZreM6m۶8EDD(33S˖-3Xxz)-^XCŋJKKSJJh+W7KZ腶m3 UUUڴi&Md&xmذ\:%''0 mܸ3IwYvGhoSX]j*]ђ{bUMoСCP߾}묋W_} .H׺;ԡC߿ Ft M^vGSꠕSXûNIZ= 1*[bIRhhhu2 CܹզM)t:ͺútrZbלPe+c+x IgUOCڲ+w=,,LTRRRg]IINYR Sv7VJJڷo_kYRR jq zϞ=}YH}4h ܉'T\\n^Sl,SXTھ]JH|E*UktƠEi/)A۴]uZ|acj-w7NׯWYYȑ#ĉeGV``V^]իWphj6nUQc`w<"e1u]R`+ԫlw}˖-:Ν;'Iڿ֭['I3fjر;w˕N:g5r:JKK… #G>SFFf̘HKЯtluKy^輂%}iusЂ|)guSS[6%fÇ%ICYYYʒPQQէOرC1hQzKDɊU_}.>簇15VDZj@>%K=zXgG/KUVV*,,LTRRRlIIf^{5Œ z1k {CՃQ ^flH*>tO7z iF{ rK%Iѣk3BA_q}W=%YmnSkn9$Z2mذA P@@vAi͚5|Yn׮]:x&Nhak+hv\,NE4m4CwڵkZ:~VZe~#Gjʔ)9s͝;W111JNNp+hFwW޽UXX(}4eJ;Gׯ?ÇS޽?YwrÆ ͛uq=#zg4b}jݺ{"yMw}u])[!^t4#q@!!ٳҥKo ̛7OslBB<"եK1hQ%{WsCڲ5 :ltl!HdTA^wxWQWaJ(qP;l$谡ӱS>akc;hN5VNc ;' nCL6ֈ*,,tKƂ/4 :Paazmu31;leX]u[]rF^I{UPWm6U^X }BLNg5J[Ngn xHֹ\|֟)>% "Ah{)>!AGٛ{V?rp3L 1t`\[czO@0HlmreȡW+{x$xFf7yp'52@8lzWakGZ# I)x5ĥ5{H4>~]E[+VFӭnx1{8ְJhV7pbU$@#2($K7h,tZ'zG }M)t>@]ޚ:}1 }$ ;ﯫH]PVV4eeeD;wqtqkq+[ľ[|>ط} CB>X_7>|>ط}|oft| :>oupշ~ӧO+77ct۰>|< J[d}#_ž5O݇*..f-޽{ku3Z<}?@ϗ ou(> jKBr#A0H>@n2k׮ Ҁ{﹭m۶)))I=zP@@N~a}nV\)???=* @zRFF[O4j(9NiF=zܹsU^^+11Q;v ۙtjҤI***jr/_ֲe:( @w}y5 C=$???͙3e/W^QLL_\azW@mV<֯_>J7|iӦcǎ <>C-nիWϯ7|WkJ}Ըss3M\5sgĿ~pnnnb'No^xA8pvZԿb 8qB=o߮~[劏WNN[qcǎ'?pw}WÇ(''G .T6m\w^^ui^Z}OW_}UIIIԩSZb.^ &HR>|UV:tN:դ[-YDzҿ+''Gzw5tPUTT4Z|k6f.]҄ K/'֭[aM4_Z D#G֭[n:iڰaC[s+}Z1brrr_JԹsg=Z;wT]掸zjڵ+44ԃVFSϏfj. #y.-os]o0ve.2^D3]Ըp8޽{=jJ}hY}npW՟1+ڰaBBB4eʔZ˓ON:Y֦MGGmrZf?i289ʕ+*55mu^UVT[uPUUM6iҤIj۶<<<\._Q~~~r:uO\>3f(11Q>Ku6f/5l0 4n~:ujӦZn}ۄn%VlذAeZԩS{n?~ܝMlt pkuUS祆;ΏU1۾pW?gBH9sF{ѽ:O<-[LwV$ܹSaaa__[VΝ5sL;w?رf͚G\[n՛o~KҡCTQQ}YJ.\pvo.In;+WԞ={|rwo:|5|uY[Vtt~ml͛fԩS?JKK3ϸep~v$NW+3F ӤIOMi/8?VOj|\| ϝ׷SqqzUgyͳٳU^^ {GO?q1?^ 4H{ܹs?OM[n裏4vXg͚7xͯW͹﹝PRum}z1{lUUU'~IRa :())gG\tESz׮]/j Q^^-[4|^j4e>7"yA/;f…zwohnsݺuڴiKw˗/B?OͫfΜ>Hwo+>>^}ݻwkѢE:}֬Y]LIIpm~Z hr|#/_$]pA7o6:t:_|~ ? .{iܸqM۱c˟/o}6rH9߯c*22R ^h! GF?΍w[(,,oeJJJ%Khҥ5k[,++ӿ˿gQΝuiI2o>s| W_}QFZ>zhIޤ=55Umڴі-[~uQVPrs[sURR"Q3䷢T#GG[nMsݺuںu<5*++uCL1۷o+FRFFosrI-X@ŋuq͜9ZrKe.l3,,솟И}q;P||vm[)}~yn<9;_DFk!_|ܑ[o߾Zv._\yCJnŊZb6nܨGy䖷ѳgO;؇;W_}˗/...N|j ⇺=^fLL ?;b';[)MVלw_رC>`G}T_~e4 Ж-[Գg&ͽYs^f^Os4a8p@w6UUUi͚5/5}~yn<9;TsERW?Z/Oy 0ƍgΝ;W_}6y&~~~ưaÌ7;w4233#::ڸxbܼyeZp8c=fdeeYYYƷ~ka8p 1 flٲX~myƩST~k 83~_9jrӘy]ơC iX~}vVZ֭kr?ѪU+#551$pK,qi?pk\cO>o9r\VYYiDGGƻkl۶͘0a`ܹӊݩո^߾3nlݺӟd׿6no73oƭ/j.#i ʌGF.]6m7{=?|pp8u^~~~nMfrcܹFxxѺuk[nƂ .-[Fv֭[̙3T_njk}a޽{#88ظۍ'_u/**Wrr[$n#??;vѮ];#((x-WVVFddѦM#((Ȉ3z-?mڴzɓ'FXX/>CoF\ۏ~##**ʸ k׮~ЧK[?_87 qs՜ϝ]|3Fs;?al< AH$t| :>@ AH$t| :>@ AH$t| :>@ AH$t| :>@ AH$t| :>@ AH$~ ƎAAAʜ5(aIENDB`psignifit3-3.0~beta.20120611.1/doc-src/gof_single_sessions.png000066400000000000000000002054211176542545200236400ustar00rootroot00000000000000PNG  IHDRrk-sRGBbKGD pHYsaa?itIME  +y IDATx{|umf309sŜBA*Q97:I9ȡhr(2)ori3gclg]y>7>uu}>0 DDDDDDDX"""""""*EDDDDDDTX"""""""*EDDDDDDTX"""""""*EDDDDDDTXQa-"""""""*EDDDDDDTXQa-"""""""*EDDDDDDB """"bI0 GD2XܹSn]\\\ȟ??Ջ;v(@"ad""{|:X`=zPD$OBHVk\AL>Gll,vW^$$$0|pID5jP@6m/HWʕ+Yr%aaa#".]PBpeDDr ow϶mVD+5k䭷b*EDn#..{ЫW/EDr^z% ӓ8&LHWkժEn֭ktHd՚ /0l0˧HsNׯOɒ%k9~눈""QTT'Of)"xyypCD2/Ɵx"6lۛ3g2dGDp Qa-""+-Z`Ŋ,ZHA\cǎlذ˗/sU~'z $""Wc9 ED2رcTX r%DDrn#)S0xIDXb=V"**Ο?ڵkڵ+?$"ҥ nnn˗+K/c"itZD$7'tyf<==(+""ؖ-[bŊ8::R`A:t(wVQ-""" tZDDDDDD.y昲MEd%u 9H+"""""""*EDDDDDDTXQa-"""""""*EDDDDDDTXQa-"""""""*EDrkσ>Ŋ]vlٲ%CGEE; iӦ (* ka֬Y:u7|u1o<\/6lqqqjՊ 60m4[J*7oVpEDPPD20 Ca~(Yd*UPF ֮]3f`ҨQ#[.l۶MCC$b-"M| ?~W?smWXA5O"xg #22RCCQa-"?;vPV[gԩ SDEDu才eΝ*"+\r#Fr3gPxTIm111ʇ"||("Q!S~}éW""ҨQXhӧO'K#T> RWpp >̖-[lٲnݚ|?&**ŋ3p@*W9{l-ZD\\L6 gggY>wϏۧkq׏yq!ʗ/@߾}O֭AAA3c 8u\Q>T>ddC/^4|MM6F% b3&s=g(Qpqq14ib_> 7$gߍvw2k׮6jժeVJooz> gxyyqqq:03Y- jX,TjM^/ ZѣG̅nnnѴi[BCQ>T>;c1 n#GۛU2{lƌѣom\\=.\ ((%K2}t֬YúuxGSmsN lڴ ?ǹ~݃@7 bMv~\ji֬YfsիWaĢSkliذ-/Clz\5us_ƿ7/qߛrm@db[Y< Wx׺E]og=zЁ*"w-::)%>G6dʔ@ QYˋ?3U{HŵkֻX|@M+| g,Z11p܍szN^w_ԋz_,;8$ 䝲 bŇ8qb+xgV&,EKpY"P(_~Yܕ(6)=l/t'4tNEDCTXg.]0`’Vdz`7nLҥ`{`;-X:ŋCJP(.l.rc)P!~NN3~F-&i&̑ X<'38T4'/b`'TDڰa%7NjsD0g{ (w \x0G^l۷ٙ~1o<:D۷/~)ݺu#((wwwf̘XnU7ض `Nt)パ98T`7xsU\>sj"!a 0 s ]X3ʕ+ǚ5+i߾3q'1.ѹL:UܵW҈ (w 0`@KtR, B l6l6\NNN_@^}Ubcc!$$GyDx6fkڵuyOsP>t s ; Pl\#{a<,Fbvv:cX&ң3:Wgwѿѣ۶0OҥSdxdM|\DDCTXÇoΜ9s3gN%K2w\9޾,eP!)SG˼ <SX}qp>ڐ7>=^x0pMU0v$J(]DTҔcԫW'N{nfΜIӦMY|9=z,[kײo>ڵ+9siTtiBBB8z(*THu"|T]R%nnnϟ͛7ۭӺukCbR=&"Sz=q>ڝoصk-ZP^=:wj^{ ___ A9tNNN,Ze˖m69{,_eرlذ777bcc5XI[l׷ǎm-{0"#c~]?鱶m+3NJT .';pt &`tbV&M|XPx ƌu.]"00mje،u;w.V5%**JL)z)<==]6cƌjժTRMеkWN>ѣGٰa=z X,E￧ܮ=!ܶmӧO?~7x^z٭n:"##ygݻpCcRIcΟ?O6m8q"GUa^zWϻ|rprr"_|Ӈe˖Z/!!^z u/G}{+V ,>c `^mc,o`b?_ll.r+6ݻ];Wv'Țߡ@,Y[ҽ{Sʔ xO]~8Ǐжm\>k:ta(Vc*T_wyG:Of֬Y\~.]Q1w\mf/^\teg޽[ɓ's[%N*Γ;wooo|||R-~~~TPcǎȑ#xxx{ƍjՊRJ͛l}شipC#ꉓv1ZjE>}1bzbذaڵ!Co%ki4VZ;v.UX#GZ/**|QH䶤<l޼SN"""ؿ?5v >>֭K/60 è]laرppp0֬Ysǯ7|||W׮]36mjX"u~i#((0 صkQL#..0 1bha\rhԨxb0 c֬YF= f;wNޏc.\3ݿ+V8ǎG8Wj^ʕ+ǸqX`[ne4nܘݻw+@W}D%5j!!!#t;88xbxHHH`|@Æ 9۵kG.]N:&cڷo'|?L:u`ɒ%8990rHN:EZS-[L_~-[ZjQfMJ(=N";w~n/^ص;ŚG߿#ǎA}ԛ6$r/>}%K2f̘[iy+NFbŊt#<ܭ,m\Q>HX1]vͭgμa `$bH [߰AEHNSti|}}ٶm-כ:uCC uc/X,OoZY`!> &?r<8\A HNn""ʇ"ZBNX\]X}XXsZ)S0|p,@'` pGl)\"^^6͒9Йəc`soK|\Dr_}' 6 x 8T6뀕 &&f.U>Q7pа'{nǼfiSAgN ^\xG/G =4eJ + VJ#2%PAgNTX`\ u5_W_ehjKDD$sxzvZNxzv$ `gN)uc6mڄ (5K`1lذKZDD$sOyOgNr]c\V8k+ kIRLr88DP|YMDDDDDD$ݻ7uYs ݻ&""""" K.1h ʕ+3>>>,Y$CۮYGyB ?~j֬IPP6M6дiS֭@T:ke*WN۶m4VXwڕy1f~4h?~cǎtR֮]Kx.]D`` m۶رc3}TTS`A6m?dlWZyU̙3ɏW_ӓ:I&888osQZt:u*˵ok0lfN>ͬYK.̞=Œmhժ.\`ڴi,YӧǺuxG`Q>T>XXשS`l6}ֻwvn_ѯ_TO~Vun7s&> +Wh3 gRHU?R"<<<8{,` 3{ o_Ahh(5Eԭ[@mۦ .wQF> ?rӫW/C,M`c z2eJ bc%fBBB b,YĮ3xfm*Uj;vaX?3 7rs 0ڵk̙35j@Rru?6^j g6BBB~W gggnݺƁk6,1v ߺukf͚}]b'O0**jxz>nT|jDEE頕\cܹ e~f ' c9a1Ml;{?~O" ;|I^|Eؼys|gΜIQ!̲ NIX<8):p%W07NƉ+|yQ㙷]nw+?.r\ 2uTN:saΜ9{g5ʨwWWxM8z(0٢) r۷5k*繸p)ʖ-?puuڵk4hEk3{r?tJ.?Eqq3kʇy9fx[㙷]nw+?.p)۷1X. %V+ ٲ;CoH^ѦM7k|lܒgTH)#,Yrɉ qCuW>0 DŽ[㙷]nw+?.V$GP"ٶgl&@lD|`3fLJSN_ST)ٳg|^^^矩32BM<9Ib\z[ʇy9f =<=.7; 34kfr.]c phٲl֓4ۓۮ_nԪUhҤIχ}$ ,H|KNI9m/+=QQQmztܜ4&:V\<2 xݺ OOOv: osPV7S򬴮nN:Y:BBB|2/^˖-}8;;ӯ_?͛ǡC(_<}O?[nΌ38p֭ϔ)Kw9[v*W)KtK4vLܷy6wwwBC$1<9;nDJH9vsNׯOxxx&6ڵ3NϯôiЬٍ'NЩS'-[<"wV(ɳ֌-cXHHȺni*Uѣϕ- B Ӈy%$**@V^Mll,>>>?-[|GxMsɉa^.9 8wpph_sV^OYGʇ"||("y@5j:$Fooԏ_z^Dx\Pb~MYh-yZn99Q>Qa-7qq"E /O]Ν!!!u[?>㭷N6+3pD^yll6;NJѼBDDPPDTXKp(^ ÇEp)BZ2|H^~:tC=Q>T>ITr$/s:cӓ~///"xWS111,X}v7nƍ Q>T>Sڵkw\Ms)"ܹs^t#GtRΜ9C5>|8ݻw۷o:u%KMCCQasƍqb `'~FӡCG/'xcط5H^ѵkWvɓV .͆&;w.5j԰k+^+"ʇʇ":x>\FB¯[G,@C c 4z(NGw+ފȽPX1o0gŒ%S|[+2͛7ѣtme]6ӛ)"ʇʇ":gڹs'۷oTTa|Ll ,`0 .V &LP\E>(111L0N:Ѹqcmի1bD<+(Tݺukӧ={d4i0 #dWDDPPDTX8K.ѱo,\8zRXVЀe"R@@@vʔ)S߿r/ٳYz5߳g5kLu ۞Hoߞh-J-7njқ+"ʇʇ"tn:}4P!C_FeN۵Ct4 ]BwZ~܍??Tm۶eڵY111iʕcܸq,X[2yd7nݻd"]BX,1*]h rMU -$$wZ!zH:Xb]UpssvM6i&FѡCjԨѣYb-4hEkA"||("*%Ӵk׎Sg[:yt4ԮIsET)S~7n?<6lqX,BCC5kVu&i`z[ti|}}ٶmmם:uCCɅSdժU|ڵ8*UĠAxѺuk*Tͱcǁ·S0U?-[̒Sl6 .֮]{DDPP$;OsL)֙n) bȑˌ1k7%ĽbZy/y康Ys 1vR?~=T><G@:͚A7ڎ7g=;oYsovS8}t ()ߵ*Ur#4t -bF rcv<-[6y_3a̻\WEԩS,Y25)Y,5,_#F0zhΜ9C͚5Yx͆fSJ̙ѣGvJUV5*UCC;Ф 4mzm|bի:C͚wj.7yb܏>ҷФI H5DDD^^^|?ll.3_ܰqF5kF|ظq-mѢE:cnV>T>ܟkbn/Z~ [د /l:2\ "]IÌSx N> JPDp 3 *Uw߅An- f_,ݛzeʘK^Kl\xYfѧO7n̈#2d-~РAtn 0o{`rbXYf k~!tܙ(HD298tȾm~pu;tȞEsVMXʾ_`DIbwߙRjN͛Ws|a}7aXxصk-{ԩ|v= " 2+W$璷zΝ;kWaH<}I6p mV9XiժOX'g1 4ۃHȹssVZΥK ^ &&ի?G1`ŋs}I2PÇT$r-"Jf2d͚5c۶m̟?ܷ""Yg205$7(j׆ f5E3G$9^yvݰ )Z(TrÞ=f (Q/_N޽=z4ڵ~cv;5O#k׮[n=6mڰd&O̴ij*zɵkݰN @o>p #F(͘1x/^̴iӨX"?Hu9e8zþΞ5K`յRPWS6t(4nlǎ͝8F0Y~攻sey0!! $2cLbɡCQ)".7=}yR~h :v74GQ> N%J=Z|Fp$衸e{֬Yɓ0wnױZ g)h"ݻ9yF9`f7ڛ4I=@XҩqhzJbfƏ'&Ǿ-"R֙_T lߞzETXbjբy8:NVVK)R@$ٳ'Æ #:::-<ajsd-?ӭ[Á|+׭k?>BVTX]z YYt)ѸҮ];5jEg"DJ*߿ʕ+SreErF_SϜA||ygF.#@0 8rIILh#bϞu8uj<7>88}y$+'ֱey60(y<U]`kkKGh AϞ=g86[lMV-((@@@LMM{{{D?"J|}}all ]]]t:̙Oݺx睒3x1eۗz,vm1cٓIPz€ fG3QM#>{+y֭[o)kiq'bbIHNV]ix#xzcϞ=l,"56zh=zՅchhz p|ػw/J{!z聃oΝ;abb///>|Z\Zg\|ԨK9QrA%SSS38W0pb<{aiKݧ\4`.rdd$)]Dm"R^ b|0w表(ӗIރ\>GBOOFV>Ԃ={ ..ҥK>}:!둑$8;$(nnnСN}l z߀?,yUʷn6UiӲeꬨH; ,ٓxXI{ɓKuXr wr!bbFߐxgՃPXpDj׷댉 T>vX9)))ܹsZXX("@CCGk׮yX5slʗb__rӉu@~~'օ3kj$'ÉgOn L}HRpfS{CK}F#"3gҲY@FFFږ)ʴT;F8r.{e @JCS 'ú7/ٷ1hs_fBnnn+V8m^^ OK5+- ~]Kl/7:88HPz@g!88^ B\T|WшH-@___>>>lzne=!CIήS}` #));z<^j1~ _5d+3;Я_=^ٴUwZ Aǎ (<e))@.@zzɽϥz.Vmz AG^ \ʼnY[H\=Db(ĄgLADj'=={{guTlmmq2u~.kk AzzzL8v (,T.}ESz}Q3V"z!999;v:ڷwbOn3c@ƍ]I?9f(@07wٌDotRGLk!pرC4h'$ICH@|&d"((/"z}ѷo_quѰaCŁd||?۳gOahh(֮]+ń $Ib͊q|ÇZ͛7 ---q7@M!VUQUѣCnjN{r0+$ _iDotRGǺ 8W?#""pY5DSǦDۇ$(k/^TY۷oǬY0gQQQ>|b\\!LKK @`` q=#66]v}]*˻gK^cS.zrCTRS3Tt;g.` v튈2˗/;F ]w!,l(:wFNN${445Qr'?؉̟ޤ8M@D|˗/+?G/ӧq ;v ̘ YYvX\z)))U⹱ũSuuu EhhsuA2Ո0l۶ 7n@QQ$I$ɓ5^ߙ3g`iiY, ##;w~|틜 C١DxxHD5D& "zŋO>9ypTRgnnnb޼yشitRopqqQ<^&[|9r$6l؀> m۶ł pNݻWSNѯ_?XXX`Μ9pڀ+TADxxHDLH{ի{FZ-,,nݺ*eff022*,L^^bxu5k HNNt>5Qiܹ֬hٲ%RSSamm?>~~~ժJ^hmmÇ:!!cMDTnnnصkSNE޽1| l۶M<,, pvv<^T!?DDDDU3DDU\Oa``D_%uzyy'NݻwannH۷JgYƍp?-[С4h3g`ɒ%d?>;5QdJWn߾fœ9sKKKDEEaJrrkt=z_|ڵkN%"CC"!x:꼡N< DCCC镎[Oe<$"CC"z=5Qpu4mvvv'I`DxxHDLiϟG&M'"bn߾#G033 5ke˖/Daa!-[#G`ʔ)B@'M6q[SLR[m۶ ,P,?'''nlا~Z+Vx[ƭ[Xn]_~=222ggg:t@$''TNN" hj 066f:tcҥ9s&|||m&M$$$(Ȁ?ѪU+!PPP M Jɓ'!Ѿ}{!L/˳?UELL ,,,ѣG?ǵkмys lt2YYȑ#G]7a݈cmǚSN̄?'!!>>P"lذ!z G˖-Ѿ}{%I_xpACC2 ƍÁʭиqc 2DQ_NT@\\F >#E] 3f @OO R/ .Ă p=@`޽8p ZjHԟ^-!!2JW0`yQ(*x**{V2.ڎcm={ ..d]]]q%L>ސM.so;̰rJ]~7̜9$>|8쐐Hf'͚5{7.$$&&"''7nڞe?wRSS:;RM6ťJSgNNVR*d8'88H WM`n> u$vSmu]ve_EEE󃞞>Sx-ZfMYMɓTZT-66322m6@߾}$78I???^Æ Ò%K`ll5k?D\\\H>FVBܣ({r1,L yc˶EZr7ضmLMM+? @zR>>>wնI&ҥKJߺu+n Ip)\.Wz8@޽{Gll,vHͷel:_EEPtr))ʗddd?Ə_<?~<6n܈7bԨQ{I888 --MCd(((P񐈈^ QDžٳge OX[[W) +Mxok MDDDDDo|b=x`()SSJB`„  ?? pvvFСCOcǎcǎСpAŋѤI̘1...Xjo 8vvv̙3T [[[ѣJ×-['''m7ndgJ=^^^ĉq]#22CDD=bԩذa`mmd|aoo^I7oİa/(.s>|!C ** HNNF߾}qe%OvttҥKݺu… ѵkW_~ˆ#0w\[?Qcڴid|?õ˗/ݺuC6mqDDDDD$}v̚5 sA^^,--Ç+)v$Iذa6lؠ4֭[t!888(oԸqc?~5;-[DZZP~}$;)) SNỤP?AAA,^_GAKK 0vX\]]qa&DDDDD%ֺ AHHHㄆ"44T… U$1^]Pڧr9455V}),,Ĉ#[[[BOOEEEeB(-QM p));w8r(.ԩSy4i;vʕ+eٸzju?|h޼9o-3Nxx8/> WWWv1&ahhm۶?F`ooÇC[[۷oG@@Ga۶mW_={x۶m8vСC7o̝;}uϞ=pqq)w=3\]]rJjՊFDDDDD*ﱮm|O!!!(&""""""bbMDDDDDDĚ5P6mCŋԄW^ ;;;C˗+Çׯ,--ammݻ#++@DDDDDBM@pŋѺuk0e;w.>84i7n̬]СC"""""R9pd2wE-w) _~=Ə#G*Haa!-[ 6(j޽;+V[[[T{g/^c999;v:ڷwba1ְaC;v Νƍz!//úupe SLwm+޵ko4jmڴ}b}1tPvk*;;]@V"$rdfo$%Eؘ EDx6xƚ^؈#ƍ7ӧtuuaii͛c޽믿*>UoM-ZcѢE "Ԍ˞<9,=dqAVBOXSP~}544 \6mڠM6+޽ .,_;v@llҲ%55sC '""S&TG͛v.\ .?/7oV8]Æ 1m47Ni?~XQQQطo5jĎ:ٳ'!T dggImigV 'CC"S&$Blذ>>>J M6A2Ӗ7o =z666Xf 7o'Oʕ+6mܹwwwۣs$zݼyk׮Ǐ1xrP&''+} 45 ʟ 'CC"S5jk6b坰իW;ˌ[Sbԩ۽{w-ZP\NTnnbݺu/4kk>H89Y!33%>+NNVl$CC"S3DD!KM2ն@ @rI07@6!!)k""=}&0tPdddQH#))aeo=VV뻝!C"SK(SSS̛7...ӧd 11666l$Relb<$b>>eNHDxHDĚ^$I+߿ ݻի_? od߱0i$2cccرx!<<5OOOL:˗/ǖ-[;pJ{6oތV8NDD7oڵKQԩ.]6mM*~wb v2,ϋ񐈈5PN`ڴiӯ_?̟?󌉉A۶m+իXr%>\iBuDEE!66ZT\\+WbС`3^(]ID/''HMDQ45d@ޮxH75ѣҥ/cÆ 7n\'L`4hРq޽cƌV&MQ& (,,Tꐑm۶(y`ܸqNС4h3g`ɒ%d^lt2YYȑ#Gߘ'2MbbMuaccS}bUߥK?H p}[qf:??^^^4h>￱cv.R&MR In݊[B$\pfff\\~v!44.]£G`bb=z/@vظD3=9pwyTYY F>=MDDDDDDoNb=d/޽{DFFV:ÇѣGސ=`@RRnnnС'"""""vgcbbaÆ);W^EJJJZXX(jѣk׮ljn'gΜe666J-S^iDb CC2eNn)W*񁏏^Ȩ3yyyM[:^utؑ[U] nkkgB.+>}`mm]666HOO/S^iDb=x``۶mJaaa055UzwyӞ;w"lڴ ...h֬{j] OOOL8wޅ9"##o>DDD@$qϣe˖???^Æ Ò%K`ll5k?D\\{jLj3f ̙޽{㈊Rz\.\.BQ0`nܸXtڕMDm۶ лwo;vΆ/.] >>KDDTk]]]իx~W >\iPLiӦ ͛7q=;v ݻwgOkgڵ~:O8pww;ÇѣGEqq1:t耆 "99DDكH;#+W-- l "Rf͚ R|fΜYlll^kkkC"bz{.,YcccYwF\\vF&"CC"HMڵ $a޽ػw0IP\\[.C.+ljii ?ݻ{{{ 5K{X:snlc./!խؖu'2frX~bB2cbX1&""""""bbMDDDDDD&{_½{pm}y\B__2 7np^ԯ߲e  -Z@KK :t(222jeSE߳g{pssCfP^=4j]vkeݫSe}Oaaa嶿L&CvvZu駟ƍ~m\6v~6޽{7v ===hkkK,\.W_~.4h}}} 0*_@Ɛd 9F!?ձ~m۶҂zcǎʺ[2 zzz*ѣӧ vUk?$ F۶m1sLܿ'Ozzz000СCq…O.cɒ%pwwG&MVZaԩuJݺuL&Xblll===8;;#11Q;xyzz ?1a!Iؼys=x@X[[ 333yf' $ի':4nBBqqq"""BhB*ڵk'RRR> ٳ9r$IlܸqUթ_,/6l 9"l"lmmPWw}l"fΜ)o.?,/$I6mRWT'CCC}c[^!XxSL8rw}mYmㅖҥ-oll$IxyyXq!1m4!IOԲw!$I>>>bV,- pssS,kPPP1OaÆ 777fq!sN*ի'UW\7BOOO%uDDD 1rHk.qQ&/^\u mmm$v!=*.\(ke_>{"66Vl߾]X[[ SSSS狆 Nj[GիW ###Ѿ}{q}ũTH$UҖEEEo߾B___,^X:tH߿_,]Tũtxcݻw IDTTRyϞ=(..pիW IDrrR'o^8;;+(旘(JƦF_.+ĉJ[UuWggg):::b*__̺XiFtM^+{8YX{ !-[ڴqy„$IbÆ j#GzzzJ 7V6~w|^zUԯ__5V7oV+1<7n(G-Zk~ĠAhذJw]]]1yZ?\H$\T>uT!I}aÆM|E٥K1cFW\\,ʌk׮rOTTpS`Yĺ\RhhhZo111ðaÔǎW"%%i-,,(ѣk׮o8qcƌLܹ37n 2]<ˮ$Ie]UUW)kҤ z-\rE_+ZYr'ШQZ_YSɧewժU_~/MS6~롧ooo[^MMMhiiA[[[\OOS6޽{+7oرcGlխ(4mڴL6yrjʦMp^Zeup=̘1VNCCCM֨r_.**®]0tP4lPQnffwwwh}2 e;t/Te[0az쉁4.~puuSǁ76>s ,--,666Pږ)v3g@jhh@$_ ̞=/icUu?/^D_WE [.999Xx1Ξ=O?yW<`-R}&*}^Ç[n;MMMl׿cnR=#FAj'OÇ1}tų}v@2?zUfݻ,orB/;wĉ Ԅ7n K,[o8|0 ;;;ԫW&&&8q"k>???cҤIr ߿_~=>cGYYYxATD IDAT_G*~֭['N`*]tՃ5UކojEvʔ*W$//O1^eӖ[޸(..Viн{w3VVVx!bcc MMMPicUuzzzJ]mEW߇BuӧAhh( Tk+[GJN5'MMM1o<@OOOƒ%KD,7o>ҥKaii ((i&kgmذ0n8&k.ꫯ?͟?ӦMSe611aAݻwN$IU1&Oc֬Y*>cB1AAAprrBZZfΜ3gȑ#5Z_֭~LQ>i$ZV ![`bb69s&ѯ_iӰ|rCi]qFchܸ1~ѣG?~<kz1sQ Zɓq K7nm6=?,, عs _j*ܽ{7oĦMJ)S^jݩj<==̙—r_GxxbpqqAAA.] m{aƍy%Uѿ}tuu c…j2 'O|rL0wE@@ !KD^_|͛7cժUo۶ voV+Xx1Nǚ8q"ѽ{/##իaddT̝;oV"//}$I*y {{{&Oo;@G{Q$]vEVV͛xc0//O1iKǫlWCCCqOȨQ:*e !0aDDD 44 ^iժ߫:uk;vDϞ=O?EQQQ^nUӬY3#99Y-$IիRԩSj{7TzeVVVزe <<<йsg̚5 sŋ2ϙ3~)fϞ j ?رcL1G ,\-¤Ij|2e N ܾ}oV\|h[05~3f̀6bccѧO8;;k֬͛~o;3Ar n݂']u5/K*۷o>|;w=h 1hl !Ш ?e`APHPfN9s=sqG gg\7Q̊Mgu$~kgg^ET7k W^ݻFGG###>>>K.9o^uijjf}u… ~xB=nUd:uh44iRn[jjDFFH ٿDGGv-F̙Qr[n_fͤF?9C~}K.RZ57n\//11Q<==RJEX̼j7YmGHNdP֣G1227oΝ6l(WP`-RJtRٷoիW+e+OԪUKV^-w;DEE)ҩS'ٽ{ZJU7o^ˏN:Ɋ+d믿'|"ҬY~Y~g5kh42d2/2dh4ׯ9rD>:uطo+UR 0پ}o~zyDȒ%K} {*8٦M#vȒ%KvRB"=+MOO///\|~E__Ye̙hdϞ=%Md%|;v۷KddL|>}sEDڵk'&&&2{ly扩{Em۶4iD6o,QQQ2{l133gggIOO/+fffҤIٱclܸQҲЉ狖iР… sK.ϱ..]$&7n={H׮]L2~z&2|p^{OEOOO^~mӧT\YLLLOݛ'obbb"+W`{n/… (5j111777/$--핖h===dŵ֪efSNoA߿_/_^BZj%۷oG~A}O'.RlYח5kJ޽… %6'&&孷CCCjuعrJSSS144[[[;v$''u>x4h@ʕ+'*sΕbgkk}|򰴴͛Uۿ?6lcccԨQƍógϔדѻwoF;wneaѰ1ݱcǎ{||zzzJbkK,QKbʕ==|wر#LMMQV-[IOOǐ!C`nn L4)׮]Caff *K.sNb.=ͱw^?SL~GX[[lٲСprr€W\A w߱0&""z}XVVV8s F#((͛7Gtt4ЧO$''ƍ#661vXesNDFFСC8uj!!!8q6mڄ/o߾ԩB1c0ydڵÍ7Te&L … puuń f,_/_?X9?ѱcGt111:t(Əpm۶s q4mi&XZZbڴiuo'`ɸx" /rSNE>}.] 88 lD%~N>e˖a= oѢDDD.^(eʔ;wbŊy+WDU_N>}DDDF;w*e?~,&&&r)(;vT]ɓEHRR>( 圇 6LUgϞ}h$,,L?%%Ee˖-lD%(!vvv:c֭[E___/^(F:T3|;vԬYSΝ;:?Ijj2m!"Rd]DTRE*5jԐ{єp5Q>4 UAVR%SO<+W (+WNNNNBff&lllTy) ٗhаaC;wNUKHMMEƍUelc\.gΜa^i?FUaaaiʕSت+L6 000PuJ*ʴϝ;__9s'Oں]N)WRE-g> 6m¢EsN8C%k""+дo W^tML̙3_\B\Nie={T'T'>oQHyl۶ k׮Ř1c4el}6⠯8hт;wXDDDE RM;tʖ-:u@բL28|Ǐၴ4ܿ666Uj}/'33ǏW]AFFF~ze׬YS#GޗI)Sɯ|8[X׮]W_}kblDK.)1d͘?> l`` lmmѳgO?OF޽ѠA(d Ul_h9~ݺuCΝѣG0&""z=i4|t-v܉۷/fΜꫯ燖-[>>>9ӽ{w 2666xw KKKȌ3 ۷[lQ<5iӦa2e lmmףVZ{{{lذ?3`W۶muaڵpppקLhXYYZj:ѳgO̟?SNKulDYlӧ߿wwwC #tǮ]PlYx{{I&U/15j۶mĉx|3Aiccc1f,YDӋ/1yd6ܦ_8"""z#O++5k"""ҥ؉% NDDDDDDxŚ5k"""""""&DDDDDDDL5k"""""""&DDDDDDDL5k"""""""&DDDDDDDLXk"""""""&DDDDDDDLXk"""""""&DDDDDDDLXk"""""""&DDDDDDDLX1&"""""""&DDDDDDDLX1&"""""""&DDDDDDDLX1&"""""""&DDDDDDDLX1&""""""bbMDDDDDDDLX1&""""""bbMDDDDDDDLX1&""""""bbMDDDDDDĚX1&""""""bbMDDDDDDĚX1&""""""bbMDDDDDDĚX1&""""""bbMDDDDDDĚ51&""""""bbMDDDDDDĚ51&"""RGΝQJ֭[Y1DT4""o=z˗/Ǟ={_ 3f 4i=NDDDTJlٲ>s" Ft===ԩ:*AAAX~=O$TuZ-ٳgј1c7=]4DGGI&Ą ljTYjlŠ Rgɒ%HJJBzyf899LȽqWuq,--QLdddpQp 8;;>äI58v,XaÆBX~ Ǝ R'.. fffh֬< ""_6rΜ9q"*kDDDĉgQ#ٳn:e޽{}fEQxX^/{x.]ȑ#1ydBT211$''#..鈋C֭|E(߱^z5zLX={'7Zff&4i9rDZ~ǚJ Ν;R2Ν;Vʖ-dV7ҥKѫW/dff믿fRMDœ9sp1s8j 6y=7oŋѿi"*&M4@(?O$y2IDA^}ŋ3\p!!!FȼqCO'B`ɒ%0`2^C‰4޽;֬Yk)8={.,,,牨T&L49s|rǣ\r@hh(XADĚ5k""" O5)~HDDDT|XDDDDDDDLX1&""""""bbMDDDDDDDLX1&""""""bbMDDDDDDDLXSX[[puuEpB#99-[D*UPJkϟcmmʕ+;wZj Rݻ 4 1rHdffp/lzzpss\]]ѽ{wYnݺG\zK.-}Z,,,-;d6lXe} _v~o-˗//sh4j*+Wr>{LDDԯ_󉋋3gĉeȑ>S۷K˖-%<<\|O.={ {~cbbw޲xb:u$""cquuHvR/n޼)+Vcǎz>/姟~[rrAٶm[eoRvmϯ\R<==ED$33S%v<8W/Bf͚J۱cqwwOJZZɦMtҥ̜9SDDN>-5k֔TyR͛R\9EDdɒ%ҦM\ݺuԩSޟ|,]TDDܹ#+VXٿԭ[7WY~+W<̛7OM&""M6gϊHϞ=uS]\\ZAW9iii#F?zH{͢j  T|rD_8p@\\\$!!ADDUmUejj*.ZH7n\gϞ5- {xW_[npwwW~>ôiq!<<\>p@ ~ Nvvvpuu~Ν;@>7ok .̙3QL~Z-;ٗѺuk)4isTT^պH!88pqqɓ'#G |}}/jY7oD\\th۶-p\e燲ezFǏ߿:u4 LLLĜ\VnٲEĿ}h4oooTT P|y{'g_̊1HKKǏahh'O ,, 3gUk׮Xl+7"88000@HH֯_ܳgϰuV 8kkk8p`ff}!ʕ+r6mڄ>H)׵kWlذS 2DزeK@FFVZ>@TF 7n;whb``ddff"55عs'*W *ߩS'7q@yߣGOjIIIh޼9O8srU[nHMM-r޼y6m&͡\3f2ҰlٲJFFFPo#>>^ZZ={===|hٲ%j׮*kllwy7n|/1)cǎxuEz{aԩ;w zs zڮx%"Op\e{=lذiii͛7s077_g?xzTϏ>fS~}O={~m۶6mZi&5@5o|8r-Coy2OOO[:t@jj*6mڄ{,_6lF޽{><==j*xyyݻعs'֭ˎRJe\bbb OOO?K,6n܈]… X~=vލSNʁz-رW^EZTY[[#>>^:u`ȑWRrf͚ܹs0777sJHH@PPvڥERR ""B9PtyDEEEvFȑ#jP Zj1yd9Red\~5ks2eJap5iFv:O~ܹՇY)˗_~ŋڵkXbW^}/?| 4@JJ :tP)S{FϞ= XըQ#̜9ǏW5SɓѠA\v Z~mwވijgϰo>B>өS'|޽;G?~}˜fϞpc'233#FF^zaѢE>|8=z 6`y{{:Ǥ{YoT<SNͳ^Ts;ܹsxbXYY!,,LfB@@ʕ+e˖ah۶-rͣlٲѣG;ܹsu.q5hg~ F FFF>|8zJPpm۶c9f͚ɒ%K|uֲw^eEY~:yh ."xbiݺu={ 0 ݾ}[?vP,SL5ɓ'2h qtt!{o޼)Fx5^zh"մѣ8::J&MdҪU+vRvڢjAT0""BT+V(2h 1cjxia¡Cr kԨٳP>,r-eءfffʌ3e˖/\YQN8kN֯_|o޼Vn]N8!ݺuC2{lU _zlR6oެPFts Tz!˖-UٳRF e>}Zyo=zhXÇsM_v2/ݻW\\\䣏>wwwYnLXXt%=}Tr(Wer1bl۶M;&;v;ɓ'UC  S٥ɠAt^W\)QzqYԩSGܹ#FFFPFFFҿ̔DqqqQ׫WOڶm+i֬Yl__f>}9DÇc%zzz?lPP9sFo.۷ |,E;$DU 6L0+ܺfgbb 1o<*WjUgϞ+++;8q<<|eЛO`Æ pttDDDw>@b>?WjժaΝU]z->>^r^.22.UL Lec{SN9͛h޼9&Mի+8G۷u5j~' K.E@@ڵk 1̾3gYWƲèU\!9LZZy<GK?<*^~]lllСC:ߣGꫯ+-kז#G'DgΝ5j>;O?UuDD)oӦM׋ʳgϤcǎѰaB(FM6׬Y;wT߫W/7wTZU )<m۪sMj/4>##CusRF\7ښ9sriܹJ|lڴ5kիW_zo߾]<<<$557IT7I^I\\RҥK[o)7ꫯM6)III=zT}]?~tUQY7;qD6}4QXXXEDDHZ򭋻w*JMM]⒖&rquuWJ||j~B_5˯~s:6<{LF-ݻwa[𡪞n*VVVb]8X~}Ȑ 8pRwβf})S敮XU0a҆SRRT7ZttU233%##C:ţ9sK߿޾}[ˇJ&Ms,ߗƍ+7Y$''Kddo^u52$$AaIM4N5-==]:u@,?9/TsH]ߕcǎϳO2qDٸqR!!!5*sΉ$&&Jffyo=;erj}j7LKBՊ8;;Kuy^닥2|%nmmNҭ[V ˞Xg_XX3}.?##C,,,T)gruuOOOqvvnݺ;%ˆ E]?."뮍ٷ#==]7o.ZV_$""B,--|bff&uVߥ^z&yqՐi׮899Izdk?XZZrbm6777R93gHDDIppxxxjg}&u9r4hРP?O\]][Ο?ʖ-[dRT"bii)ǏWڊ4lP'OwwwqsszIvTɨX%"%WWWqssSe޼y2j(z+WNDz%nnn N!/^T}%Ν;+ZVu0˜:uhZj2a„<۷E"֮];qqq''\ð={&j;[Nڵks>}*C zꉻR'RZ5Uٯ_?qtt'''ݻwz)SZɓ믿V>$rrr777K3TlܸQի'Փ)SHXXXC~}=mۦG;;;ѣ2=_IMZș3g ###3 ^zIFF>}Z9g֭Rb]T2%%Ez-bgg'ƍS^̔O?TN>Cn/.F_hV>>>u_*HDDENTeʕT=&eʽrJh4Jpww!C\^ˢ8&>}:sƍߴiSquuGGG]v@ӸqcÜ iӦjzժUu> ?K.qpp>H@01hܸq,...jeΜ9/n4"Et4%KoeeH5Jus7Ž{н{wڵPKHHo f͂`رm>]t_7rH888 nnnضm,--@ GGG?>a<&;֮]|olabMDD/~5 ǎced3f)wO psڶmG-[`׮]-\O>A<&{~mYFÙX>c9rD!4:tXVXDDDDDDDLX1&""""""bb8}4Zh+++ҥKs=u5k333sθr~j066 N<ɓ'8u|x鋇76Rk+++XYY0 0+WKNh4w+WO"559Kbb"4hz̟?lڵeXT+U\9yf_.!cבJPL>3fA^Xu07a IDAT7ѣGUԜȿD޼ v֭ ={6W?vvv044廄9޺u ݃388\\\'D"*Iuرc 72!:** eʔ-Ѯ];lܸ?V\v ԩ2-00W/<<:t'\ǎcǎ)222rJ୷bQ4m4bĉ4iR߷uV(8yRxxj֢hDшWk}G*W,&&&'{ev>^_C,c%byD[XECŁɢ#HD!1k'DDDDDfc1&""""""bbMT:h4111&*ZK&"b,c%b!o^FT8|<1qomTxŚ5km`翉oomXSMժ> sMDXxK~Cl#xW#%%&LPyyyaÆpuuFAdd$fΜ{055|(^޽{j,,?|F%֓&Mիh"xxx(Ӈ*רQ#xxxm۶Xl^$1b*V֭[7t֍-^# ˸D76B%- 1c 4[n sss=zTVre<}066VOLLD ɛQX*?cǎ-rpY[n޽{pvv'hٲ%add;)))rNBf`ffssstW\9/ZưԩS&k֭lll`hhsssj UJi'bҤI~֭[*allpգáhСCqz5{͚*2pXXX` EllTX?3RRR0yd;8}4,}gj|X#"/͛7oV"""d߾}2e155yjӧO޽UU/$.67ʘd* ^`CQRya$tJ3M! 65gy4>gip3CY4F`0826G-7eoxҵ^u2W\i?g?ls;gJ2g¼j9ILl*lrbP5Wb 0 a'O4M4.\hgΜs!LKK;~g>[ve zv@X߂j^1c}-544r9m48a7cKG>O^luwʲi#Fϗa*((PAA40t_7x֬Y#G0 :T)))ZbE'XBE6lPvvBBBq+:%]|=Y#IX,-奦&kѢEׯ}Pi֭Zn$@JNNvX^rrV\m۶)22'p9-*<<\$a/7ߜ$j$gt={r%%,6ohb]XXxyVHgx8IُԿ?N_ҥKn:j׮]z裏bO?UCCyΝ;u9>r RPP(tbq)}ǚ6m$>#~)j.嶵^~)8w&fC￯Yf)44>~ҥZ~$F2MS'NUSS#__WH?X^Ze˖~"52i̘1ڰag=:y6mԭۓ8KLLTbb"[eff_5~n_?5>TZH͕)t4j$I~nf}{C=d?][[2 C֋O Tccb &=/bbbbۈeٴf]VK. $o@q)^~~CS}({R}Ill}#~II#IѣQTTN,sXF%˗;L>|8~ڈK5*PtC(___?bӻU}ٳe?? Zz'KHHrss5qD\9sP2.gfSFF23[>ۛx&+M b+5c͞=[3fЏchϞ=l=z^Igp&LYfi媯WVV$V4 @ӧO޽{eٴxbEDDP\ /~Z 9sv0; J95{w}z뭷\?T__%%%iժUn***RZZ,X oooM:U{/Yb,6lؠl(==T]pE2 C*((pf.\@,IjjjR~~ϟoO%)44Tqqqںu}\AAdm۶QޓXԩS5zhIg}3ż:xΝ;'I*--ܠA2jקX2!ˈbbl2kʕ/4M8q>[kZYhqce[~b믿kݾT 0a\bbi)h$=X6FzfӚ5kvZ-]>>00PT[[;2 CV>occb & /bbbhĥ6Y|ôÇ_o񽒒Ga_9ѣGUSS(jлg}V6Ml1[g֖-[TWWg_]]B͛7>.!!A~~~uXFnn М9sq\/~!ˈtb /駟VBBfΜݻw;|.lꫯ4k,h֭9sOZ/ eٴxbEDDP>GH<<b߀6=2 C*((pf.\ I WQQҴ`y{{kԩζ߃}Ɋ+dXaegg+$$De8im75B獉Ν;7%%E)))..U^^|Eaaa5Y$)))oTTT\Xj ًM"v*)IgΜHW`ItRt4U=C,#))6(g$uAA#4.?Yw#Ff9S\\iӦbjjjuy/"""aÆiժUjjj=;2ǪSO=x|j%iѢEj5jn7*..{Al 8c 74~j:x\Jhʔ)Q^^땕I&O>Qe(׬Y,+>>^{QFF 'sXFXǏƍ5n8͝;W9992 y[< ߿|TVVjȑ4TH|Zd}Q_>v/++KW~$I Svv֭['Iիd^Z4yd?^JMMUdd$ :T'NDz6ӧ&N򈇝뛫mI< W_}6ijjR~~ϟoO%)44Tqqqںu}\AA찌dm۶Q\iNMoo>aWt`{(&XhʼnR^^DvR``hܸq4p@=c}4f̘ߏu9IRii}  Q2׎e[8^ K<*o@!BUC}:{|,mڴIw%) d哾khZmկ~+Ю]裏*77Ww}Ξ=kϣ!=@G+:%KYS}jhhs=G;Czϯ۶'55U pD*X6%85k,xHmp }HSt:xf̘0>!!AMgϖ$ֶ~mm Ðj/Q -ZM0yCFOVU}C|xHmp)8qIjK7 CÇ%%% $þrޣGFQQQ:^8J<@b b۷;%I~ٳgk˖-S]]B͛7>.!!A~~~uX^nn М9s(tΟ'TZH͕)tiӦi֬YȐi8qۧ ͞=>kͦ &h֬YZ|땕`=YVedd(33S>}+ͦŋ+""B'v,#z۷ٳ"i͒3gرcZx.\0]vWTTyόFH'<:{l6Wґ#G4x`駟"iԩS@XBE6lPvvBBB+WR2׏e[tR:tHR0yyy˓aRu7j͚5:r СC+VxC h#$ր[V)'r@s={bbbsNɹ[2GrU@۶m2="o@1c 5$ր뫫>y2-@m$@UTHw<b߀62c"#Ri0x o@5aͯ(bo@5trX, Hͪ%IIIIN>\JK~3MЫbYeeΜ9sկ:{x p˝8$)jVRS16Bb ӧKbYeeFI8NAC!<\XcWŲoΊ8s&mI[Fp}u]]z)ol6[-Z$//QFܗ^zIӰaôj*555Qҙ>QL\GX?~\7nԸq4w\0VWaaaqWZfxٳG//SޓX:T'N$(''y飉'^ZK,ի%I'O畑TEFFRvIǎIXF7g/iNMoo566*99a|rrLԶmۨq\RiȐ!ˈRb}58p5dvNHttA)((Heee8ψRAAe[~&Oĉ5f"[Nݫ}Jj׷{Vjjjq\3(X֏ IDAT2߀6JSRRwk5krrrwzRSS5`qJLL7n}'ժ>>.00Pjhh0aB|C8˝73F~GUMMq\Çy2-@mXOɓ'uw%$$O0 ͙39}Zڱy2-@mrKo߮g̙32m޼Y4sL;vL/… &4k.=󊊊#>^7|dZxpG%%-4._?o0 iД)SԤ<+ФItqy׬YT-X@.]kjٲe2cc?~\7n5w\Ij F\ /:"(Hz!E}Qiڼyô,+??_$*,,LZn$FW֒%KzjIɓuyedd(55U6m:tN8ae999G<߀6J8c tDHH+ BB( tM6>І dô&kHI U\\njWPPF%'';,#99Yij۶m6̵cR8H<߀6Bb hח_~T[NַZLР1cƴܹsR 4HAAA*++-!k@-[QFGmuzMM$) Ŵp[kZwD<j'wߕMVfw؞T 0a\bb,bV~5#Hɓ'%~S@IRmmme0 Y/@566A~~~-0aB/*&&!pIC h#$ր;;V:uJۗ@9~;leggnZ5g_o1OII#I߯';zjjjE\;oюÇ7:O!IBBBTXX"P3f̐zjGg֖-[TWWg~uu 5o<)77a]2 Cs̡eˈh7~ڈk%z_}UG'Ol0af͚˗^YYY O!kt{R=rH zIG7XF7s|sz6z[R&՞[orr(2߀6k)w1r)8tTnNO=u7K6y5m4Y,YV͟?o^z%EDDOÆ ӪUDmU\\|Oee%pK=zڸqƍs*''p%2ebbbg¤I'(((>5ktkϞ=_|_~JJh_?]G%IIIINBaaa[FH5tP8qBTSS6ʒbUXXn:2V^%KhՒɓ'Pjj"##u\ 鮻}]=rII<x puǙ&kѢEZBCC[낂566*99aZrmFb)JÆQeίPm?߃x tU߾ګV/ᕫĺ-}4f̘ӢsN;wN>>>*--ܠA2j߿@,c7jVk555dN8Fo1j/ ͜{%ruwJMMՀ%&&*11rV .o```$ŴZ!jQ {iYmy?CR .-\<b߀6wH.߿ŴGa_9ѣGUSS(j!ˈCbٳgk˖-Vaa͛g ???:,#77WahΜ98OXcGe[~Xo߾]gϞ?`L7o$͜9Sl0af͚˗^YYY O߁4e555)//O***4i$?~ak֬Qjj,XwyGK.ڵkl2 @siѣG_Skť֯_`q1b֮]8IRVV~Ibccl[NTSSիWkɒ%Zz$i:222H  ĉۜlk*..:7p*..Vee%NqeR-I Ç%IMMM8mݺ>@JNNvXfrrLԶm(tOVR"rKm3MSi:#q O%){i#$@w$%%%)66jc*66V#G$F9u>c%}4f̘FGG:w$>r RPP(`O$=Hm{t 7覛nRBBó):7%̙C\ &I\.{TrII:s Ņ.l2kʕ/4M8qBTMM|}}b^j_Ѹ˞OL/0.pѢEm's}6k e TPP00 ]pA"iԩSm+VbhÆ VHHOGߟm[ כo^ ԤIꫯ*66a>g&)Dz5XxnbcT߾}uw*33Sw}pΝ:w[GѤ{nB獉Ν;7%%E)))0^'==]7Z=֗SN__ZǎӔ)S;Hr>nqƚvD[]R0R*WH8O?-rsp8FIyyVOL[ )i4Z tѣl#KSڈ0|[I[ST[X9WCpO*䰍@>N3VڈT[o0:nxoO!=k~O!tg_kXFĚUUUEs5UW'HR~l#q 8nFJPR6olgrII"\E"5Z\+HT6m8NGi~5K?Bb MApoͯbSamDTw/kHWw>Psr?.l@>Nۈ{FXG_G$UK)r.\Nn@/=NZk#RFHuPaJЎsqIju v`8N.o#R6H5r"%USq5$@A4XuQ׹sC8F6Bb (갆(JUZ* -=Hr:\9nG=NgJQʓ4 A+]Ƈ98"%8yn ֒+͓E$w;VD @br_4@U k/ƫXŊUuK-nkcY pi#r2:ysHVFU+TcsAX6sڈ2<+r<7zxE3ڈ[͕7xV5VZ5c9 !kc^)6"}_wrlz3zeb]WW 婶VZ||AzK=nu_jjjt,z,6xq <&K7z_?ڑgz޼yL#GkD}JLLG]tN__Y7^u,z,cA<-S~mDI$5xsz]bowoa{ѡCO n™_ޖyxeeU57=ϙ*9{@<@bݥn*Ţ :ONN=}G;y~+wbGԼ&gjgjǽ|  Rlctt$ ֙oƷwV={<[!!=aYhg_t%KoŽ|  R5551bD諯6:{2]hcֿJm׏t~RIΜ٩og!!ώ999Nw>|X>SV`I;1Ϲvc, s2t$._k;ܖڼΔEsBuVE۔nMSN%xXYYف>rױ㔎2oC*(I5U[uqٝaٛȑ#5b9SZZôbjҤI0`ôDxH<@<$hS;cꯎWо}oVxH<@<$pZ{1cT^^a|II$)**wnF4C$sU]]6o0>77WNC RM>]=N>Ç7;C^{MaP<G{x$={V+W{*22RzqxC$4/o~Ͼ{yuo}cHI.X?5uq :a5kz7Ep+>>۷okƍݲήr1-ZH7|K~󹹹mcǎ>z\Jtes#y57o>cg?ȑ#k)11Q_e{9I^֡ 1IDAT9=zt-ڸqƍs*''Ga2ebbbzeeeiҤIOԥ$w=6nܨӓO>ѣGԩSz;v˾w:uJFҿۿiȐ!:{x ?ԱcǴr.wgUuퟭillԩSuiWRpp֯_-544r9mڴ.gUߚɓ'Z;?۲a0 sqMMMѣoja۷-z+;xH<$xȥuVY,-\a|rr飏>0MS@Ԥ|͟?_ U\\nڥrzgGpppq Ç|YWkVk}[}ǵ϶hDDnv>}())I{ё#GzE8ݙYuԓӕ}xH<${c<$REFF˱袣%Ieeeݲ=ntMJHHh߮gAcƌi1-::ZԹs|;5p@y{{kȐ!JIIщ':}=Nl侻w&i_5}tov͚5K[%@xH<ӳH;(00_7jkkӻ[߾}u뗿meq_Yaz_lWdZ;~wͦ5khڵZti[2d "IV^ݲmɒ%ַ-u """ttVhtvvY4h{n[՝*~l\C!7C3fx }2Hzt:5|pk-(,,L>>>=Rf,_w_.66V_ui?Lj{AuFGGv:;^ue}=Нjoho_C!xH</령s窮N7ov;I6mwܡA8K^WO_ 7̍7xb0 _u?Cf3z->0?Ì6}||{Soyyy+ba>f^^g~WiLbs=-[QQQ-b?~K7faa<ٷo_3::ھ";;4 ü{ݻw~璮gUtRsŊGC=d~wgߕu΋i?mVWW566QQQfhh믛;w4Νkvr8͜9nر_歷jtMfYYK탻쟫Og1w?!xH߾}iӦ}5o&s޼y믭5~[o5}||L___3<<\|yZ)SyaޮgUּ뮻LjǴZf\\k+ݙweݣsâEZ3M/͇z 4ͻ8=fddy7fee탻쟫Og1w?!xH`_. The sourceforge page for the current Version is at: ``_. Contents: .. toctree:: :maxdepth: 2 WELCOME QUICKSTART TUTORIAL_BOOTSTRAP TUTORIAL_BAYES INFLUENTIAL DESIGN PSYCHOMETRICFUNCTIONS BAYESINTRO CONTRIBUTING API swig-api TODO PARAMETERPLOTS REPARAMETERIZE INSTALL_LINUX INSTALL_MAC INSTALL_WINDOWS INSTALL_WITHOUT INSTALL_MATLAB INSTALL_REQUIRED_PACKAGES Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` psignifit3-3.0~beta.20120611.1/doc-src/mklogo.py000066400000000000000000000031071176542545200207270ustar00rootroot00000000000000from numpy import * import pypsignifit.psignidata as D import pypsignifit.psigniplot as P from pylab import show, savefig, axes, plot, setp, fill, figure, rc x = [0.,2.,4.,6.,8.,10.] k = [34,32,40,50,48,50] n = [50]*len(x) d = zip(x,k,n) x0 = -25 priors = ("Gauss(0,1e10)","Gamma(1,6)","Beta(2,50)") figure ( figsize=(2.3,.5) ) ax = axes([0,0,1,1], frame_on=False,xticks=(),yticks=()) mcmc = D.BayesInference ( d, priors=priors) print mcmc.burnin,mcmc.thin est = mcmc.getsamples() dev = mcmc.getmcdeviance() dev -= dev.min() dev /= dev.max() dev = clip(.4+dev,0,1) print est.shape,dev.shape,dev[mcmc.burnin::mcmc.thin].shape x = mgrid[x0:10:100j] for k in xrange ( 50 ): ind = random.randint ( dev.shape[0] ) psi = mcmc.evaluate ( x, est[ind] ) ax.plot(x,psi,color=[dev[ind]]*2+[1]) psi = mcmc.evaluate ( x ) ax.plot ( mcmc.data[:,0], mcmc.data[:,1]/mcmc.data[:,2], 'bo' ) ax.plot ( x, psi, 'b-', linewidth=2 ) # fill ( [x0-.2,1.7,1.7,x0-.2],[.53,.53,.64,.64], facecolor=[1,1,1], edgecolor=[1,1,1], alpha=.5, zorder=51 ) ax.text ( x0, .71, "psignifit", color="k", fontsize=28, horizontalalignment="left", verticalalignment="center", zorder=52 ) ax.text ( 6.4, .55, r"3.0", color="k", fontsize=17, horizontalalignment="center", verticalalignment="center" ) rc("text",usetex=True) ax.text ( 9.6,.5, r"$\beta$", color="k", fontsize=14, horizontalalignment="center",verticalalignment="center" ) setp ( ax, xlim=(x0-.5,10+.5), ylim=(.4,1.1) ) # savefig ( "psignifit_logo.svg" ) savefig ( "psignifit_logo.png" ) savefig ( "psignifit_logo.eps" ) savefig ( "psignifit_logo.pdf" ) show() psignifit3-3.0~beta.20120611.1/doc-src/paramplot_single_sessions.png000066400000000000000000001047221176542545200250660ustar00rootroot00000000000000PNG  IHDR8-sBIT|d pHYsaa?i IDATxy\T?h*@(e*()\(f?0K\IԊ[x[\KľQjK$W.(.Ĺ3^c#|9s>y{>3|B!@DDDDDDTsW,;DDDDDDv H'@N؁$""""""IDDDDDD:at$H"""""" ;DDDDDDv H'@N؁$""""""IDDDDDD:at$H"""""" ;DDDDDDv H'@N؁$""""""IDDuVQG!Y?hժrrro*i`"j>>6m\O?1cHׯ_`tnp݄1tP"00˗/ӱsN?<222V/ _]*ݻ6l4/ԫ3ܹst?9s&<=='탯/z{믯l]۫kǔý{0|,Yfff"22 O?{w裏8v옴L\\ÇԹ^_|F___W_EAA`ٲeǁԖ޽{C>O~~~`…:QuWV̛7;wnu-[W[5OcJ֧ ߠ`ذa8zh^xO=۸_ZZ|I 0xgqi@jj*Ə/ݳgbccՖ駟 ///DEE!++KףGi竨Rnu*:йs:P|u}=zvBvZ1|p駟=v1bBbСPѣG?P!ĶmرcOOOQXXສn_kcƌNNNZ?~xf͚F1emyS.}زeKBkjj+c-X!˗EeeB#G-[zj*(.\ ݻ⣏>BٳgkJQ[~׮]KܼySTTT^kB!E``m?QUmuW۷O;V4j-kS^"$$A,[L,:v('Jb֭B!#}Q|͛78zBO?T 4H(W^6m߾][s֑'(ŷ~nl礤$QQQ!3<#͛W|8F /-[ԩ|rr2 ի~GTUUAd\pA*{Q<#3f ~ 6 Rv̙Xr%Zju߷mۆo߾oLٺWue]~&L_~ rmEA˗/f=h!e 9rÇPTo˗qU՗}WTTW3AAAXj.\@AAADZ]xu$$$E شiSۯm1;sW&''111qyQUUUky[[[UUUӘ١Fbb".^۷zWee6)--EVVt~iӦgϞhٲ% $`9rmڴ/{8p CJoNz\+ NNNGnn߼y3V^]|8x $''Kj֬+q׺ʺaǎ8x 0tPRG"//CEl]6ORta)O?|ַ~+-שS'B ;;j믯ٳg[bРAj* 4oƍCΝq:_~̬S/lmm~z\t 'O3<888M6޽;^x{U<]Vxt=رc:v?G?u^Cݖuc"U;w<{{{\|9[x1lmmѮ];?q5tIcݺU!}AZZN^YYSɓ'?;w͛ݻ7ࡇ#v트8|u:cmuswws޾}G}^^^8~8f͚>L/__qk,s.%5kHNNB1i$!>,ݻWKUAApssBO>DoF]|I~r-;YjbϞ=uСCŋEUU4~Ç7"rrrBTTTHZZZ* " ޡ:pBII4h/i| BT_qʖww+WGGGq]M&bbbԦ[Cե7ORo{ !3f8wN .҄J 8Pcu;{rҿ_.ڶm+.]$7}YO)S iɓ'!Po߾ɓjWUUr!b̘1Sj5j(;Hӎ?. k5O5B!/ckՖuͻRӶco !ŪUԩShsssEEVVVХlm@ֵ\JJ;wnDץibB{ ,X *s׋aÆ !BҀ5ڷo/ 8֜ն}]m]ͫTQQ2dꫯ~q5d;/_\<#]׼\ia~'j*(qm6 S >\J抈zeee@1l0ѳgOK/Iˬ[N gggѷo_(@(BCCE~/,}ℿ ݻw&MR>P˳׺7Faa([Cԥk;d}/M&+ 6999jBּkj_U͛bРAgϞu"00Pֵ܇~(yOD^DPP6lg1d!}Xo6l RgСCw",,LAIS Q=hn=~5j۾ǶruSu :WCBAAAK5պ cj*@ZBے<.Rc{i|R[߾}[deeH< ߍ7oak|7jJ# ݮD7j8_S]_ii;Kme^c)Y"ouUUUUkLfee P[%]&塚\"Duyƺ~aV7nhWAA?՟(++ׯ_u^PP AZW橮Fmu֖k1%S^^YuN\Yuc"j[N+((PVVV&}6***D5GQQQɩjum_c[[9] Q݁Wڎ\VVҍ7'DÏ(r(ܻwwޭsdGSDdYYYxW[o]vZNNNJ\Ed]Sشiܤ 2[V7qD02kC̙37֯_WWW;v  }v:tjpmhvvvpuuEYYJKKV6??_^*"bnڴ 4=޽;p)e {{{ԑϣj_j4GQDd6gΜAee%"`Æ P*בDdTV݁,++1h Wm"##k.Iӯ^7յ*@N$lڵ+N:2 K.x#U3ydRRRcǎEjj* x舭[c֭P(3f`Q2/uݸuk,\%%%E۶m1|ֺ/PN6y!22aaa7o\\\p1š_~xXvb*ƃٳwEaa!_w =z4t.]Ժ;*T*tR,[ ...9r$?8L6 {61jY^ffPWhhpvvEEEZ˜8qB-Zx@7N\|ĉ'Qe'߉eϞ="88XjJ4kLxxx3f7okhYy:1?tU( P(ڿ\u9B!̙S{OK888]8QYYu]Uuʪܷo_elOxx8-EDƐ٨媪Λ3g̙*{ p؁$u HH~'y`)1H1jY^$Ef&$l2%b<1F- ˼H2mE sפa =gg`J *ʴuӗ Y&b<1F- ˼؁$Z2w-.6߼ܲeׁ6!x#U;ƨea{;D*zM_ *rDDDDDM;DZ O 2O}̍Q?~b5e$(*~mBxOk{绹~ x c޽[Pl:oj_&ɱv (.\ym"/'OױcǤiii 3J%ƏL3־~7Rx sҵk_ȹ^JFѧp4ЭkB5&3gMB 22NNNdC IDATdd ((~~~HHH@II bcc1d|4}j,0Kq2O }(--~}<Fy!p-kdT1k׮үyyyXٛ7oWBTJ.] 22_}yiV‹/UV ,]ӧ e^V ƍQ\\exYݻܹSN6M6M5M_lua*ƃ| !jnccyv4m޽(++Ô)SN2B޽ۀ56ƨea{yٳę3gq7߄s%''f gZ*|:u 'N@tt45k&Mwuuk,BQ ^uT1?2ӧTCj߾=pUe^V dVV޽z SN۷cԨQt,6mxԦwNNN8u2]Dd2YYYXp!!M˃4Q*yY Xf Ν  f̘QDGGuj&N'n"j:ʰ}v 4}UgggHڵ otիW監DcԨQP(/ nSY@ŋ S 47nmD&{nܺuKqqqҷ .DII bccѶm[Yw o`nݺ#G";;G׮]滺 _# ᜊ1jY^eu0M5+ ^fO;WhZ6T1,SM?/zp8::b֭jӷn B1cƘaZyY%!!!ҥK!q ,] -0KѪpUdfl2%b<Ϟ={p]Μ9;wF  ɓ'n:ȑ#m۶ET*tR,[ ...9r$?8L6 {65cԲ:qqqx wwwDGG^\(aĈeaDDDD9s&\$$$@P 33UUU_P(K/i,?ydl޼Y{pvv:`ѢEXdL*;Xf ֬YSgˆ-!V [gv6Щʕ@TTK/332UUU Z9s0gΜV,Ip$l2%ƛX #9_wv{]5VUս `2.$wQ2/v (~'y`)14hck]a]f̨.WzllԷkN;ƨea{U^J׷/p挹kA&dJ7:t[`tT+0He^t$H"""""" ;diiBQN6!Sb*cԲ̋H2 `Æw T1He^ xsx=[6!ya*cԲK6@_ƓO>7n݋ӧOfDSpomC8 :QFѣʤ!$$P*?~<233"<7tSw~ uӆBmz ݻwN:|zz:<==aooȽ1>b<ϐ9(776l@EEƎ :ܯ!J:3gի1k֬ 1F- ̄ ( 1͛BP4h])))BPrO<%Сzxe?)aGcTHH"""tRn:,X 8\Mc3888O?owww|z=]vH*wU`ܸqzoZ~'y`y4xKH~.Wvki>M-9!Jptt֭[ֱuV( 334ƨea{,~o`GAѥKlݺ>}ӧͩfH}W]hG]#a42tJMMMcǎMKKCHHT*1~x7bx#U\ɸe^uG޽ѻwo( ( ]vD+OyzzbZ IIIh׍D||<֮]ۨeɅ,:fÇ֭[d, vm+O !QYY$L j|N-ՏJD$@>Zp"S)Bݻ NҘOOOYHP5;|N-ՏJD$@._U +/nڶx~+l"O!11R022v›o)zU`FSc1̯ktd㹒q1F- ˼l/b6n8\ϣ"-- !!!pvvR㑙iZZӧΝI&2ydX}:> <[oIP\\ݻ=z4ڶm+$T1,/0(J888[nXp!JJJYùcԲlHRܿpT*j}!+cǎxddd ((HHH͛q 2D5N޽$l3fիvڅ & ((*z쉟ÇW+f͚!** SLAϞ=qI9b*C\6FAAn݊^;C6K1F- ˼v ;#];m;ӧOGpp0Zn;w͋|@Z] R6i8cEaѢE:CrrAol7RxhS+_˱k.}6x9bZy9yZmH۷oqY,^Xm^ee%0yd)h1IyHs [[[и666Q%{ mmmq 鹹RkDGGcڵرK.󼼼pE7jDd}te4uTi3gĵkPRR}?s)&JH!D+++՞sfB߾}1}Z@ @[n5jTPܗ_p\2=~T1gԵkW߿Zh{ &L|Υe^f}{'% 6]&!ѣwܹIII VEGGuj&NvcySvo `4c*C+9scǎ^CAAonmᜊ1jY^eo-]akkΝ;㣏>j:0{l̝;ڵCAAHPܾ}vvvχBRԺuϯAukJΜ1w-Hۤqb<4rPLL g4k 0h iO?4&M?!s*ƨea{Y;' ((:%ƍG|||R1c !!NNN8uFtxzzJ&yHWAϟGc iy.EƝTXQQǏ#''СRRR*RRRGGGbժUEdd$vڅ"iW"%%ƍ3Ⱦu0d""j(S砮]ԩS(++S/ts)&Jș3gb۶moG0h t{mк0l0 :Tz 6 ڵ-}P\\ݻ=z4ڶm|?r2O5sмypu믿gF~cQS$]ؽ{7cҥنB!ѫW/Yf”)SгgO8p@G'- P(I&1E&7RxПsШQ?,RRR`gW} e IDATK1F- ˼zdx];ï?6Ȩm&Θy*++ :v;w@PPbȐ!8y$dzT1s%bZyJ,\pvvFff&`ŊO\;jl`rX ^wo`JlM1#GB6/66NNNHJJBxx8Ǝo7oD||^5&bƍ1aJ}}}qi3֌ȰNji6S999ڵkѱcG.]Bii)5yyyŋ(//oԶȲ\B@[nݻBaVͽUU@Vr˖WS2F5kӧ:?//1Bܺu xɅ,:}1qD_}|}}T+"YsXרUU:OܹIII UE hݺڴ'jϕH.dс\|9&Oׯ޽{HJJO>|󍹫G<geژ_TTݿ,vT/6я!TQQfϞs]v(((r۷o|uCP@Tjκuנ T1s%bZyHرP(Xp!~7|7҃rɲ/PN6я!Tnn.nܸxH_{.J%{9NNN8u: {{{CA1HAj;b<1F- ˼؁$|mBx#U;ƨea{,:)))[ɓ'Ν;-ZC= 6hMKKCHHT*1~xd2 }mC橦F3W:tFۣGS+c SQ2/Yt ѽ{w\Z۷ѷo_#55w7xץr Bee%yf\pC AnnZU5E?\N61C)kf-Vˣ ^wo`JW%9QAgϞŀЬY3k3f@_ k:bZyɦY^^cOSu̙:t^Bsn BZZHMMEmm-N>8z땔 !!*G)"911_IIrG:v@56KrC=d+W ==&غu+J%允b͚5Ԭsil޼6٦'vT%:#;a{sckkiζllst2dPg]tRtۨka}).aڵkj A׮]rY_~%^{5嫹ܹ3 iӦ͛Add$&Ol>yG݁{^X'ֱeloc,g] =9:edd`x!ߏ{_5σtۨka}K5=rHM$ ())oVOGڵkFǎW_'Ԭ׺ukcԩ:t(#//O3$%%Z N,c<k#GFRRƎ1c謻o>kؽ{7C!//{u;gGlocІgQ i)+bժU|2DGGcĉ9sfwO֗d@6nXAAA:+J<3x*sԨQ5jI릤Ȭ4yN,c<W^E۶m"66UUUXr%Ǝ .`ƌR!%%o{ ""7`9{ Saܹ;wnCڨ>JpGyB}93Y˖-lSLA@@ᐓrr _2UVx3+O={Y#Xxf 00J߶Ig{ɝ6|G5G}z$9*$wkT9c}9Ζu)^x,^~9sॗ^>!._MZ}{a{#mla_qF] K^ /e'! m9"O͘1=^ua騪&NeYYYʲ솰6˰8l%/Ӑ$ ۷cHLL/ B!sD앧bcc5eCP`;vf UTT@$-{…HJD,"HNAD,b ~~~Yv cսl y9r׮]سgڷo/w(d#micXyѣGѣG\t8Ƚ2OKtY꫸{ I{Sy'7 (k%IBEEe-ZHgzkի1grrrP=;!!yyy:&"e""29Gzz:BBBzjا",N1|lVV#u8ܹ1ByHOOǷ~dg}T`^ %Eh`X˖y6ə+l۶ ?Y=wS֗b9bUٳǏ֭[С޺(**Buu5|||;kXD:S퍴=XOtyL8o6ݥO6ZX_r{  q\pa:tǏ7obƌr@XX޺aaaBVoדEDV;RcXϞyݰ6ې#?m۶?o}wS֗bYXXGw}J#G4>KeggcŊxЩS'[ 8q" Zr'"b BTB$+DDGG=%v}8mZ';G){=Vg6˰8l%/Ś~we˖!00#GD׮]e^! ݃{l:9"O3kHۃeWrQSbMB@[HKKɓe G2癵l[|5F"93aQ`[zbyu\xQo&/ڵk2EED;[ `̙ӧ]v鼯E!77;wƀ0m4ܼy999dȃD@}[Qmm3.ggsr3), 9~8nݺ:轗cǎZ܃jze#!@k@BлoLꕔ^-wtfL<͚g^={]vܧ?ŜZX_dyy9 ,,Lー0!4UL[CW^mrGCGgEE%Ycy&f̘)"O@:ĉ,++ YYY2ErrT:d[f/+S ,+s~u}7]CΎmԵKX.ڶ; :!{2 ^~W] L]]v?F[}9DDd1s Wϔi߉=sj$5yk3#S ʔs 'Ws< AN\)NZgZ54AmjsfY=x]_rr$7@ΎmԵhW}r@dee%&NhSNoi, )+x^:։r;׮Y_ubb{#mSi2{?WSژ\%eΥ̵~=\~=6mڄ+W'N”)SO@piy#;diy0&SCh?S yѣ>=o{Lgȑ#Ob֭Lٞ>s#/S;oٟ)"kgޘ$U__^ϣBRR޷bÇUӾQ}68:z2C莝={c"w!ǗW }qz19K0@#>>^oyXX}wb{=AJ Q˖7\y91?#pܟr\gɣ֘8q"BBBteeečD0W@VB~]mڴ޽{ѦM4j1gc""ggI\GOաC9r:KJJ۷LFDGD]( 1g,$IѢH:6g>hݺ6l  cl}]۴վ1avZm61w\P(vd}pWH${=իCyH$Zgy^Dtt{/$]viݹsGkNtҥmB$gݻXzQqS$''-ˑL0A'N!iii"((H\~aܼyS( 1zh_tI( 1aısN!Iu> IDQQm*{W;w,ڷo/޽)~$>HC B!}Q{9/ڴicqWffqj։ K6ls/č7>$~)ےM]Mt]oS˶&ݻw IDXX735nCCmhuN%Kw.h:j=hԨxm:9W^Yfە%Ə1jowzվVUU,!tU;gr_nW͑#GJ[k]l]wa8OqiѣG`drJ!Iرcfdd$s$~m߿_"۷E۶mɓɓ'u=8{fYϞ=E L#bbԨQF˒;vLH#ɭ[4iz7oJR9&yyyB$qI~!IxnU>"88X>}ZH$͛Wv֭E^4={$I<:eÆ l+!!^z qSqG}A6ʶU˖-*nCe[<׿MnԸ9֍;//9U9"9sF'ho711Q'<SWXavU;:@:ƶ׺ڶmk3{c7x羪u˖-:7羪wa8OH:tIIIz$''>\g;t蠷޹s8|0&M8dff:<7|n¬Y <.ԞqY~1xuqD,{ō7^xaaaEΝ~zQg?3ѣuʳ1ń l2ƍ8{,ƍ3!Ǥ㣳KJJnU߿IIIzV]vrr2:Sfdd$=S3v1" =zo0$<<117nsʶ6nҮ];]_}i0w\sq7Tqsze9кΝ'X;nW몷ۡC\ruofLK9L9x[s`r_*// g_:H칯zU?ޮU? Bx}Qq}4'dGrYyp1Z ׯGDD7:ݽ{˖-CRRuYXϟQFa Dll,qF$&&:$uB߾}zoʞ Ӕ^] ߒ/BT"33_}裏>Ӌ.___ܸ)ڸ ,ʶ4nSNBʕ+:.k6lK>s=zܸ9֍>O?+sDK[7TUUܮ-ޮqݻw7Zǖ뮧͖Z콯eee(++Yrx{{c:۵ǾjV/c_wNI&سgvލ/ѣ:,;w`ȑ6l222]CrrrϢ[nHKKüypBlݺ֭sXo###?0֮]X̞=ah۰aʲq?Ƽyc_:uBFF:$}">>'OqM^kpNrN$iYfP(cӦMڵ+NwqBbҥ6-[}Z~=$If.S67n{)[ApLi04h:v7ד'Oٳy>ϝ;wghvmf͚C; )Lnۉ }V)U*HIIAΝO/^Ĝ9s… qIʕ+r ]@5+WzLzꩧw֬oX{???z>>>HOOǾ}d9&~)|||0|p˞={4W_}]vE>}w!**J{BDGGGA0}t"::6\=khh(5ek]QQx]UUjĦm(~ x k.U]۷s6lk>u xb*Ҹ͛Ms&nS679i9m9T]!q?~zΑfuۭ nW]oW{_s}ծ㐐D-.>)v_O:t(J$&&,{SoA:۵Ǿj[lDzNuseLs6lK>uPSSI?fqRq׍[n:.k6ls>ty{>ifJC nUo:˕˴tLDD-.ܒz5w_9K$ 2ǎsȾooo/Wm:tDGG9{֫ZqQNCB! $IoY޻woSiYvޭYVSS#ڵk'uO:%/XJKKŖ-[t^_$I7NlٲE|֭s1Bx@4mTg7oXv;IĆ sD,G.:"%%E; jp1Wd]v.]Drr{;vI'|ÇB){رQF")) ]SS#t"4ib0nm͛7 K6lK>uhٲhѢx֥%qZ[]'O9wxWq{:_ \eeYqrUm:HQ_;hoN.yo|~ر" @\|W]c]~E:x=ƶWmxZv:qd}ޮzg{k]}U*:yΞ6 MԫW/&,Y"~G5jO,}=غuf_bbҥXE-ZMiX 1 {DZuV)KeqF1i$kG;v___&֯_/ EFF;wtxݴiFhh;Zѭ[7ѨQ#1geߋ޽{ B!/_c'+m6QPP y%V\i:{WuSLJRlRH!CbĈ:e3FAgkΪL"N*V^-Zj%"""D֭$I"55`o9szj/ dUܦmnܡ"""Bx{{t!B: DIDATI;w;wÆ 8ns67ƍ:W_}U 0@H$F9w=mNٖv_`޿S6q]VOo=z B|_\\,Eff(**˗/~~~BT?XgaׯP(B$1w\, 7nls:߿P*Ա9B$q}@m_n ?mϟZ~~~b\եK,ϟo}5]6O.VZe}5<*jθPDb„ "**J;}#1bP(ĩSt?^ >\ ѽ{wCoaÆVZ ___+ĸqę3g!N~?ӧ{w;wO"--M<:2۷ Ioa}GrU1i$q ooo(?o7Z"44TOAȞUloooѨQ#-ň#ŋʮo񆈉 B(Jmuٟ~ܹ  Boook쐐+I*nS67!C蔫eAرqSq3Fё$Ixyy霻i'mI;oGtuK裏j;66~)ñ~/ю=!C &&h޼9ܹs2GFDRSS_|@vv!/ЩS'qDYYb( lܸ:uBFC(((@RR7nPκpFUVX|^|ڵk___DDD`ȑ~}HXB555Xr%ۇ{޽+stDD<_ ((ҥK>;4"ra  ,cǰqF\t YYYz[Xt)~g;w?8/^oزe v؁<ΝÎ;n:|駸pvd?OK; dAΞ=+$Iv,矅$Ibڵ2FFDҳgOѱcGe999"!!AUI&|o߾}B$q%!7o$۷kY`$I={V쥗^o(gIā4B$}͚5"00Ќ%{/"""иqc/DZ}vL0A4$IB׮]uuǎCMMLQѧO4k ѣ[xڶmﰰ0{Yv7> ___w}^DFF|={Ddd$SOƍ~j@˱sNm/"~m""""ׯW^w}}aݺuoQ(?lT{1 4ݻwGaa!ߏO>Bb$8 +y~_~:"rBڵKgٮ]ooo""Wv!\v sAӦMI v׿ĉ:@ܹs5֬Yc6 $;~8f̘'O… 1n8""e˖P*xwqI9sͶS_JNNF=0f8p%%%=z45۷ԩSXj's2@9)I0|p\|;vij>_|'N;4"r1$xb,_III5kϟy-$Ig)9kժUhڴ)uAaȑ:@vof͚mbٲe;wxH0e""""""XL$H""""""2 DDDDDDd $@I8$""""""pIDDDDDD&L$H""""""2 DDDDDDdY9/'-IENDB`psignifit3-3.0~beta.20120611.1/doc-src/paramplot_single_sessions_mw.png000066400000000000000000001026471176542545200255750ustar00rootroot00000000000000PNG  IHDR8-sBIT|d pHYsaa?i IDATxyXT)!&.J I-fLK1 5Em'36)E5-(%暕h*In01110w 3r{Ϝ=w9G! """""" """"""$H""""""2 ;DDDDDDdv (@Q؁$""""""IDDDDDDFa$H""""""2 ;DDDDDDdv (@Q؁$""""""IDDDDDDFa$H""""""2 ;DDDDDDdv (@Qn:,_\lYBȝ """""s9}4Ѹqc\rz;KDVH""""""2 oa2݂,)"""9}41cu1b>(k~@pp0zAΝ; 6 ,, شiSqF 4ݻ7^z%\~xbZJ6&&vᅬ=zٳVĽ ݫgK5gey0\MdiG}Ν;gϞ~ui_U~Z)Y7کCڗhok"44m۶ERRRa+VgϞ߿?x 3B#GDVV1o<Xr.'|___顇ҭn:Wk+K[]_t Ǐ?>$&&hU?@+薙L6h4̞=** ٳ' C*3g裏SN?~|Q^JJ ƌ={O<N8ؽ{7FKX/ AnL:___v? 0dOC7{WΘm$&&M6UֽT|e<ٳ'z聙3gꎙZW25 AR޽BNj۱cB!oRBb׮]bذacٲe"00P:uJ!ĭ[ć~(!bٲeB!Ο?/u^tY\zUj1i$1|!tF絲<[ƤDDDpvv9991c 1mڴZm6i_u)S"!-Z())&L .nǎb"88X|7FoW&**J7N\zU!DvvX`[nKm61vX!K,#F"??_<BT !Xbxg*-ۋbhh5U E.]t Dzzz_^U+5l0!fϞ[f2%ے&BCCk '|RÇ-[7n8?#6m$}]^}~ѲeKc!FObݺuB!W^QzNLLBR\̜9uBԮĹzӢe˖U*puuׯ_7*]^^ IIIU'**dnn뮻pDGGW^yE!Dll3Y_111w-Zj%ꫯER`lPW\xƺHxzzo6iڟu)S"!P*bذaSSSEv*M^cQ6j8 Zha\`dĈ"11QlܸQnŊbB!y1yJ;feXkIkܿK1zjU:0?!ļyŋ:*S={YYYFǎ)ZU*:5GY>XfMv 8 ﯷ5prriiiBm2;;SRR:1cwUƣ>*onͮM^jVTVzҢV+_wwŷ~o|޽{|m9s>>>Ѻuk;wNoUKIIAFF !C/KIIA˖-eT;w[ֱcGٳ* c\t gϢ>|8Jg ;vX>Ɩ1i_~eL<[ [xyy߿ۯMڪgh]2ڵk/O?x 郿[1th4Q6JJJCiKJJ{nжQ;wԭqiB?<8gyƨr,|ږQJJ L8<fΜ7nHΝ;k"..º)ocǎW_}طo_̓Ν󾾾rY5I+_M?# ΝÅ (..ƩStiz!cٲec.ѣN:ׯW[o,ݙ3g݆R ª,Sճ|ZWL-IEHOOGǎwᣏ>¾}|rl޼x{a̙?ooowIII{{ XWNRa۶mذa OO ?a ptt4*-}[oO<~~~hܸ1xgv~ mڴ'xNNN9r$K8Κ5˨r,c˵{Ajj*/_+?C'駟6Ob +[T:tXlûヒM"11ϕmi4,]h`ggyϪQ>k}ZmT`ooƍbcc1qDo..._@#<&M 99=ۇ:G}TiZ&Z:(**ƍ;bx+'OUVѱBԤL~kѢ{=̘1<@픝4 5I+JJJ>:sL^^^xw0h u]Au'w݋]˘5kf̘>|Zj3gT[o*]e4 \e˖aϞ=uyAV<4lw}*v  c=@s>}oΠpB1ЪU+ddd !p%jJ3Ukݺ5N OOOxzzGArrrB0uy&\]]Mo V oo \\\ ӧ}Yl߾]ׁtttDqq1ȯ~˖c<[Umٲ%-['O[nfaÆ Aj.^WO)R6mUl]2#""K,q @ff&Zj!J \y9hcѣu4V6J矵~׮]||ѤIlٲEk׮ɨÇcȐ!HNNuv}YU QƖkmM6 E>}3g[uEcϏ=Zv~²R=8q޳EGOBhi)guUZ>%%%"**J,]T!ĝ;wtijonّ#GD.]tǘr,c˵EEE֭[֭[@4lP\pAh4?Ͳe+U^_uʖ)/Æ o.\cƌBhuzQ/f͚k׮ !N4M6 c?uTw Rբ{[uVѧOiܹ#u~7o=z?Bs7n???sNݲk~gar,1i {jjܹ-'[_Z5W|Ettn5)S6l /_.>K[:AuI&/=#233 Øsbg]˗/egg]v !0իW!􏥄w [v=XKAC7lJW:ZfoFwY\ŋ~)uRi% DXX~]:XM^^KNN:tsȑ#u+K/,'t"{1pÆ "00PxxxobڵTXX(yѾ}{&z-BBBŋL>]^ZnbȐ!K.bƌW^",,L'|R!+]2`lVh4Ѯ];ʗTylխMmxņ ڵkŘ1cĞ={t5kֈۋ@q!Ν>.M``hҤС mTNB,Ν;0ѣGWBڷ;+W=m۶0")S2e_.[եWX!:u$+'e˵:I=Zxx饗tL6ڵKolѳgOr  :tЋEwUv۷СhҤ }Q<;`1`ѽ{w]DPPB{Ш#F. ۷O0/9_툢HV-۪U/Wy޽BP`!"""tժ Q25v ۷ Y!ch4#ieffi,B\~]-+((z/Z-W^UիS~~̑#Gtgʕ+R˗ {*<SU-ҥKzi4g ylխMqPBVYF ...unܸQ)׆Qݺ˗/5JM$`|vZ1c \rB>О3NVvډjT^ Q}V֘rWTz'0\AM4]22EmPT:yyyFu KV7;;[ܺu˨%%%b4>OVzҹg ^,..>>>Ghήp|Wʕ+[pƨjƖtƬb]YֵDffs]Uej. !Hׯ_G&M$C= #G 66VoUsA Rm]եLV\\"4jHms8}n`"s_*Rk]եL䖛 wwwI 77ϯvT**ږ9IV%%%u>)((.`kRD&?? 6D j<4jԨF#UK[T2%kKV͛psseej@Ql=v (6ہܷo www899qqqziRRR WWWaHOO)DT &&C AӦMaggW!/_]aÆhԨ͛7ːk"ƶ?@͎VZ???4lڵÒ%KVMUH6فܰa?XpiiiZRħ~SN!((2枈lY5j@PTH7|̞=Ǝ;i&xxx ** [l1wXW^Att4?bԩxW1m4|'"2#1 R|ؔ_dtȔB BB!D\\ 4΢W^?tlUǘG+\RtQ4h@x{{8V+۪ʕ ~~BjUORܓSQ TAJJ zÇoőڱ"cd VUoǁ4?SǦMis1cօ%/v IRm r aݐ91̯t8HIzoZ^F'25Ƙua}ɋRT:i*{ul$wN(((@LL Mqqqc֭ꊾ}f5wIB3BYK(;;k֬AϞ=1j($$$@PTHWRRQFa3gJʐs"""؁$IǏݺɝzF,k~6XZ77999H^UVa8p[j|㍤x"ScY֗x +I)_?%*}FPXzgBJ׽0`^0)k IDAT,WVVշ[-'25Ƙua}ɋHTNw,sE?]v/͛]vg}&wx}1aT*L|8dl۶ CŢEиqc$$$ꫯ~o$%c̺esݻwczs &&x{.Y i#e:u*Ο?@{+RRB@zz:Ю];ݻsń P\\ |6l߀LIԞ2fT"""sd^{ !!!z˺7-- RDaa!bccGY&+ѢQq9G.JOO7*].]?87diT>غu+ 08;˫0q7Uqc ,L\!2'ID./y\Gѣ>}`ȑ̙֭!CHh4iDoٸq0n8IODDDDDdilֲ\\\tq[!mnn. ܪ+y$"""[qA 4@v0w\KIIAhh(\]]ѣG=4Yzс,KP8vXǏG!j%#xE\X7dN7?\~֭î]0yd;z'KESP*Oq)!;;[oP31W@`˖-͛7@… HNN?,cnۍwkk۱eu[{ݐuaO* 7oȑ#ѿ˘2e {П-<<F֭[q5-./y3&L@vp}q8w㑕O?T...{FDDvX4k f͒XΝTsQspk4kWXkݐubOgoop-+`ggm„ Nf-jcJ%߼J'` /ٱcGl޼cǎEpp0^z%t޽ĉѡCٳG$K~~@V@ӦeMj.ɺ`ҤIhڴ)N bǎ裏0erZ4 ii@flFok=M@Λ73*m@@vi5oW/BlWAA,YGȑ#EhѢJ?#o>L6 V2cI*]q(o']v!""^^^SN{M퀝ТU*miSIy4vVћn؇&lIDd fFBBB EYz5Ν;զ%UzX@rHMMEHHwիW-Zׯ/l_My,; LmNf}'3 I$I;|W, Ʋx{{#//,~BBB1j(sdNo슃!5`O7g4hIIIpttM6c=zJwe.ӢکdX[KBcnhOgl;$)//`;Y֍BTg!C0rH3o+Ł*x2]vuKK~63--XqҺqW(--ԗ5AtH^w,땐?W;+FcOcǎHom۶L./yYLx1f\z}v8qBmUff&fϞzQslfΜ˗/#,, }݋~?}ބ «*cΨ\xqK, Vmڴ ;v}puuEEEχ@<9`O+#<>>xG0vXtXd٣8~\y:~nȨui;mW75 3WZpQ9V2㍤xbcj1Et /^Ϩ[na՚'0yYZe/5M>׍TVFRb<15Ƙua}"naLZZ\GdZ\EEUukUH915U1HJʱc̺%kM:@PBƍxꩧ*" "4v yId4nXmڴ0D$;UD$?Ddid@N0Q~BC2'MnjmU1HJ9G}1kE koݺ7nzchɲnmo$%ScY֗,b7o^7|۷oC[P(PRR"c&zsBnmo$%ScY֗, >C ~zhժ֯_/wƍdYX7uǶx7폩1Ƭ K^сj*5 ׯ^z%ذaC;;;\ 44pssѣDdmUAAbbb0d4mvvvKh#$$prrB۶m1}tIՈ™XXсy&:thذ!_۷/~:m;33gF˖-s'CVCTO?ũS:허lmUvv6֬Yb5 *So+___|HNNƜ9saΝ;uVDd LyDDTс:u¦M}:m{ʔ) X8;;#115jn݊k׮!>>N~;YMIVy{{#//x 뮻pYQQQ߿?N㯿7|S/dB7ɴJ6/yYDr„ ?sE||<_|/w^^BQV#11GFFt˽-[zYÆ@.w,3U[BUNo"R=zdddix#)1LcڰeK:'Oo۷Vۼr 믣e˖֟={wA+֭v J''ZjHH;dLVO?ҥYk,IdY-bY֗,Y/|}}봍iӦsΘ2e999ww !@^^7o^|풢L̝;{FDDOD!"={{nnB@P`5֦MѤIeƍøqLO"mUmbذaP(ꫯLvȶҁ+.]CQ<>}:7oLROnnnmBP|Ԋ+P@n@GKnNʶ60x`deea׮]2㍤xu1Et }]|x꼭l\zGRussC=R ggg;vBǏ}|Nؿ,<ѵkW&o$%ƓO}./yYDB%V-w6N_ oOOO#227oƛo… HNNƬY$O}өpЮ9X7u'e[U;wԍjo$%Ɠ|O}./yYDrXz5|:oA0`@k׮=|Aݲ8 sEaa!bccѬY3v kY;2YMIVJJJ­[pM@jjn~ÇpQX* ͚5C; FRb<0Ƭ K^сAxx8BBuG6ر#vލ9s ** 4h/ "LVM:U79BRRB@zz:4 ( ̘1'LO?ߍ,9aiӦa 0bT]k׮< ;wdDdLVWFjDd;qDQ*XߛK*eI":_~%; ߭[7ܹ* NVPi1E C M;Y ㍤x2Lܺu >(&M{"66_| W;3kk1f]X_ N> OOOUNP 77׌9o׾K8qLQ7۪akȸ8ܾ}ؾ};lقÇYf5k2Ƙua}KiΈC޽s碰V7I7 RXDW_E׮]q%3s͛7F:z(bbbpI\rԩ<^ڔСCppp{WFDCʶ qyBRRB@zz:lf@bcT*+SyR?2ME<V1w\xxxUwPd|5րb ;駟"((Ho[pvvFbb"1j(lݺ׮]C||߯>/7Kĺ;)*[W􊄝ЪU/??`RykMc<Ǵ1-yYDrؼy3}4h@k׮HHHdeWHLLѣѨQ#r///`˖->qCNuSwhlE}-_'OQQrzx*Ǵjcˋm,g!!!cǎn?N8Qm !Vqu|'HJJٳgϞŝ;wн{ ֭Μ9JU/CD6m1g _vUX^RRBQm>s[:e IDAT^K +|B9o&2LVY ٹsgݻo?yau1bƍ%>YSUDD`CD"@.^&L˗QRRD>}1~ZmM6hӦ $$vvvXlO7}nnnBP=3iȊ+PٲǁC$[7sCenmbOlL1f]X_+ذalBsȑ#tU^hpǎh߾=$o} L}ee[~u;X7ugV0HJ'?./yYH CXXɶg͛oFbp1k,ֵhV +J23+Op#naV0HJ'-?./yYLR*ӦMC&Mwww`}5..{FDDΝBƢYf@,]#U^VsYz"""""9Y-Rիvލz  p|xu:vݻwQQQ8q":t={:DR UٜQ-ZȝCDDXXРAkNw⋈Ȝl I0i$`Ν&Q T3:?~!!!ѣ֭[OOO/CZZ[h㍤x"ScY֗lIJOƌҰn?T*l޼ZW\U[\Vx#)1cօ%/599Y,DzdYX7u'G[eoop-_E40HJ'+c̺eGҥKqECu`o4n}'º;9ڪI&iӦ:u*222PXX;v࣏>”)S*t,-㍤xⱒ1Ƭ K^сtf̘͛7{EXX+T*FD#G[]va򂋋 c3~ȲX,Et =<<0}t9r;:v-[ /#GȝE""YڪT8x }]lذOݟUljV >\nZT*7n B>c T}7sUU1G;݇/?>Su,XXV26;XDUP*͛? +RT*1tPm;vիq?ţ>*w6 ]hɲnaF׮]訷W^f.V~tfxⱒ0>^UҀ ͛?֗,b^x6lс8p *,~:BBBdVAp, jñk.CRx->㍤xX/޽{z GZD=5-BHHlbҼI1f]X_dƨԍ7dP]:}'º;UcO?W\Att4^uW={wA+֭Μ9csU2Ƭ K^4j(ݿ'Nk 4 ?>}ȕ=N'v Ǻ=U5x#)x6m:w)S\pwwBy&ˣsY#֗d@}ݺooog#kTKanjmU1HJ9l6mڄD&~h4iDoٸq0n8cֈ%/Y;֭^!"2mE?̜ӧmv&P>>0` ̟?_?L0q91wRjA鿑4h 7Ktɵml\e7'oOjV>},・K,++ ݺuC1e\rt1wRjHS1xZhX^(mlF$I&ֶmۢ'OСC{k$]1wRK?O-[`̘1XhT/UDW?|.]d<11(//Dž [nqZ\D<.16ll?_~:MrtDD:UD"r.1_ѽ{w~]b֭Xr%>cGZZZj']CvBJJ !Cȑ#v&oUY ?KmSwUڼy3xrhuFnc.@V~aa!ɓ'*kɒ%8y$&M7⣏>•+WzDRRnܸ5k`ٲe޽{ٳ0/T\ 4kĚ5@|<cQRؘmC왫rJ$%%!441 V:I-ꦤcg٧>\>xwѿ#33pi/AddѲTbHNNdff"00)v6m ;;sεÖyX /OWLAeY6dʞJ'Ngs=;! :ǛF>6N} `кRK ͛Cb1bv oѣGʪ>xtSQmǏܸqx'Gh޼9_ri S~YFDEY^/89ny;kۆL3W)tRTTT`)Q(Ο?yQFv+7++ fٳN/6?wkΝ;IZcً-Bbbb.G UǶ;G媚ø}޽R|8N> Cqqʑ5""tS*GD UǶ*eȞ؟t}̽uoǁW_gF=pMrtDD:UD"r.1:u*͛uAs=غuCD%4{Ű0\xQVNoKmSwUʱ=?18{a{%())1Yw^Ĩ٪xU_r-lcR K].1|G0yd9sFlΝHOO?bddΝKtɵmꎹJ97''Gcs/l/u_GTTpeoݺuC1}t#"\EDa!OPR%G|-f k*) 0T@?$)Z7pp4d/[$$ brՉ'0qD4m.]rx}b#{jǓyksCkU1&_'el/u6ܽ{QROСؿ?4 vVd`h_r-l۸Zz琜|QuO5 RQ@[O}]ԥP7xX|9ׯ(//ǨQУG"$[DEU&ö+O>6m¯W^yɬ 0'W?[b{%Faa>!@1k,$%%a„ *FGuf i|v޿܉ԩSHOOܹsѴiSCdoJ}xSmxDD%nQVVft_#ٙ3g\]f&p[gs*z7DL\5vXo=C!Ck~DEkS##-- Z?BCCqc˖-&ڵ )))Fhh( #G8$."RK z!}_5FYyݯ/龡&Ǫ6d=rg}\,YĪץcFUV9(JcodOO%Kɓ4i6n܈>W\Arr2 |}ޚ}Ǖ5AAAX|9-ZCAv!$$DJ \ UǶ;5rٳgqidgg#;;P*++P__'s r$̚MOGբO>&?஻R!*"Vcǎŕ+W0m4@ii) ,,dݰ0!py4nةqBO NGތH"7d:|N$I2U222rJK.v+7==Tܴ4٭% 'iV`,"o[yy9^~eQFh42.C=uLoCmY>0k,̞=cƌ/;w5Ν$I Eo1z8{x %%*xژȳgbɒ%~:z!0M'L;jtɵmșȞ؟ԕL2֭[#00{5yݾ}ЦM-_6o-[n SZZK]/33ֵkWin1kiIelr&7''̜9YYY>}:222Lŀ_`?0aCI@h(PQv$s<HCBi bqi""""opB̘1}E~m6,++ ߿?__~t$yg_ i!77$!//yyyFI7oڶmBL<C/dgg믑$53m^M^;i]Iy9oK.mCF&&&"??߁8Vy9pQx7%36ݘku*SN عHLT;2Ķ!gb#{bXFwǚ& gPe(~<{VkuvzѢEHd5Z UǶ!gb#{bT|*%H]n L;ju*aې3KSDI!ܥ?k{%˂uRr>@zʴj^g13GeJ(q r;\n._lߏ7o~,t ǔ)Spdffri+(=⁗(Ō)eJx} njÇ㩧$IXf ~gΜ״~~~:t(F8vZ!Ãhqc @7:Zh׎^4sn_~m#Ij\G~~>ЪU+#44?l٢vha@e~&wO~Oi)K- #GN ߀^rr6mԎ;YLn={Sj>idɒ%8s &M:ŋXp!~z$''7Kt}R Im׫#M|nF<5 22hYjj*bcc1{l@2=?X 7iZ-ڶmH"/FMzu]x;v@JJڡItHk!++Վcxcʕ+6mڡF6|DG뮵֝IՉ9ܼR $*.vvՎ m^ןjw2;R. "k7R<g#5HHtMZ{{<%g<ȔZiyϢ $ժʚ3`0 :x2@]ڥ4cN 1QhۆIo/OzbK`mg< kh<08$jXD\ ۆIog($.8p}8@٩ K]@]EDGö!g[H(< 9{a{H""r< ^Y 9;!ڮx34j@g=Y7;aI mܗ;)7'k̙/KmC %R1Obr/JKIn U Mc^ c̛7qqqXbPUU4s {sg%EŶq_ȞOJ@T׺s\v-6n܈UVǎäICiHESDS<)rEJHRzk] :^n/aÆ-5jOl߾]nO54\')"TW`"w5tǏҭ)˫ujWY\\xoGϞ=57ʶD72k&!Ri]<9\5OykOu%YsBmg*(=η& &=x&ϫMSWb" Q^R9;O=}}Q3W=c=Z5<8߫ueiiinq8y)"rUDūf;wڵk;w]vWc$"} $$~zemږJⶵ-m)[i[*߀|iټqFAAAhԨg5B˖-xإވtQQQFuzj?AXJdN{mkYY222ЫW/ɓaj֭[{V#O:];m+)rPxbQXX(~i!IXrezرh޼Xrظqx(**2Z_oذaزeXdh֬hҤ(--uj,&L $Ib…NO>"66Vl߾q!KYYDLL6myyybƌb޽Nڵk&bbʔ)B$xb4+^{5i&_^z ???O?9- h"i&`(Xc{Bш޽{x@H$DBBvMqϘ1C4lPtQH$f̘!̙#ի'RRRl> BCCMrem۶AAA[֭]v$ & FT#Ić~hmY[mmKkʶ-o!KO_XX(|}}C=$6n(VX!ZQ" @dgg"1uThٳ\oBB$IDGG|}o$I7䳻Ԫ:z)Ѷm[1bqm Fcqs[+imݷoƍ_شi3gh4ajX@;d[0j$I7tX*w9rd[9T$I_2Z*͛7-$Ib۶me7n:tݻw^H$-[J,۷oZV|gFΊO>"!!bYΌeܸq"88X9rD8IJJi\rEh41zhן={Vh41n8? I;c7xCH$-I[j%:v//55U4jH?.m۶/_,***L$͛7[}}v@ A5e{o?=&}i{*wav@S|}bm[w]ҚmK%[e83[nFXz?ի?Ж=3^zܹs6+k I&M)2ocǎc{oa̶0 0s[+9j(evp[{o%B54V =zhРI[j$IlݺkSRRD||9sIğYcݻw6jHgr5Ѿ}{1aqQ8N8_֧OѱcG!q3X._,ēO>i,Ç$IF9c\zUw#&N}-$IG5ZСCB$sYÓ8z_=Z b޼y&7o\Z]>\cܛ6m2{T[܏<>sZ~Ζ>]VVf챿+**crمXM~geM+郖ڲmM[*-ۖl|i?.$I2rqqqFxmT%ʕ+mp[۶mWV";;q>V׾}{b:b[㠠 #Unע"m_ґ*>H;@BB`5SN&kz7PYYchݺ5X^{5\z3g΄vPG믿-?|0BCCXL>gIJsNTTT 66?< jѭ[7]qe˖FmTVŸq|r[8qƌ,HKK[ 4zM٢.mY[AKmimִҲmiKKO/Suz;udԏ2mp[˯9s@"(({Ʒ~kնZbns[+-- 8f[I#UnWA^Gm|?C 66Vmiap[9Taaa&eɜsYړ'OHHHٳgwߡaÆN_~ {!005ΊFNN֮]| 2G߾}Zgr ypa^k׮EDD  68n޼˗#>>={/wV,ǓO>~h֬a9%9oٲh=5IKKKjb`b̟?Fǎ*洦MӖŋC$hZ}nl=֭[7!o>{uiʭijjKkʶ-mK[Z|i忆qe6kze˖aOAaٲe6W_ϐ=:K9z[KJJPRRb?3[V={QZ۸}F Fkvj5j;v͛8x Ν޽{ch֬SbqF#F %%)uZi$h/ 4)qTUUнI[o޽_)qTL0Anj>Ýwމ .wAJJ ֯_~b„ Bbb"oߎ_~>>>&ߒHd2/_-Z`ҥ6Q=-#GbxבjsvaֿǺufmض4/Ֆ|?4hNL<١9#ѣ8q?u ر-[4[=(//wqG&MoGV vܹskz 11ݺuc=B9sgvZ,-ѣG .… t-=.\}Rݣ> ؾ}~}G"ݻѯ%HNNƮ]T'>1rHˎ;b޼y8q"z聾}⫯BTTӝ֭[hAAA8p NPDGG[Ó8z_y6\W͛7-Q[...bu(--5iS9MRᶞ;w4 ~a"$$ND=:sgncǐ řGmcBa-[D\\񿣶q%@*ЩS'8pCISqw^J^ H:#ŋhӦ4Ν;222Iu'կi4ӧO#774IΈСCnh=FΝ;N'[֭[q ۷OƐ!CpYu]$ם:u‰' 0ZW^̙3먭Ǐ}1EK,xbmv@qqQNի,)-[f<}&[>pc -Җ[*mKeҖJ˶-R/=3p]޽{ѠA0郆eZ۷Om1}lmNҮncǐI0d>|)*???4ijSNm%#UV}aQSBu Iħ~j111gBB$}vׯ:={ZcDŽxEQQ_$I3F/R}o I7|}"wqhܸW\͚5)))N' ,$<͛$d"..N$&&y饗Dppp3y GkXx.]vFq;vLlR:-oo] V^^nSٟ~QnwEE>7|K=&]YYҬui˚ʯiK[*-ۖl|iwnԏz;Cs5z>+mW_$뵴ׯ_ݻwwޱ6Ր|jEȑ#հ˗[ՇѮBՇ}||Vs;,RT&,Y"{7}'?ˮ]ftC|C ?۳g߿Xt(,,"''GhB4nبLGb{8:~A 75VZ V+u&$I'NԿcRBYFYF̛7OH$^xemږJⶵ-)ڶTKO_XX(E~~Xb>>>w5&CټyHJJAAA"((HΌc˖-B$ꫯ}Y\xQ?^r-Oԯ__y?wjhժ0Q7p $ IDOl͸p[}||tBNCDDDDDDpIDDDDDDpIDDDDDDpIDDDDDDpIDDDDDDpIDDDDDDpI^')) /"ƍCyy9F  &&_}ڡEhh(;m/h4x(**BQQ}$"i4,\Ɔ pYTϚ5 K.O?'ObXx1>sa֭֯/~`/Xt)z-u'Ob֭oF֯_K,_Y?3;nU|Ly(//Ǜo,gŋ1n8#$"wcz ]vEii)͙3]v='NѴiS`aa!233iݺ5̙hѢƏ(..?ݻw[ohݺQ|?Q|3g?˗wGM $y!Y$"װaCzXbwuvN~'M4A лwoɓ'3',, rIУG2zÇؿ?Z~r "##^n:hР}QTTTprC$yED"99UUUdHH:tH붉*++Cjj*W_a׮]o7o4Z=uGɺѫW/[w{!I|J^GБ#GLUUU9#"",X -oADdb\t gFƍ/!m6e۶mCll,СC\v { yk 'O/.}H"""""'ײeK7ѣG~z̘1n6m= -˜1c ݻ7~i/طoF@[nk׮ƱcǰzjIxH}@y8򝨨(,^+V@||0, a*log(x)+b, 0.), lambda x,a,b: 2./log(2)*a*b*(log(x)-log(a))+log(log(2)), lambda x,a,b: (x/a)**b ] names = ["ab", "mw0.1 (for logistic)", "linear", "log", "weibull", "poly"] x = mgrid[-3:3:100j] for k,g in enumerate ( cores ): subplot(231+k) l = [] l.append(plot ( x, g( x, 0, 1 ), label="g(x,0,1)" )) l.append(plot ( x, g( x, 2, 1 ), label="g(x,2,1)" )) l.append(plot ( x, g( x, 2, 2 ), label="g(x,2,2)" )) l.append(plot ( x, g( x, 0, 2 ), label="g(x,0,2)" )) title(names[k]) figlegend(l,("g(x,0,1)","g(x,2,1)","g(x,2,2)","g(x,0,2)"),loc="lower right") savefig("cores.png") psignifit3-3.0~beta.20120611.1/doc-src/plotsigmoids.py000066400000000000000000000010061176542545200221500ustar00rootroot00000000000000#!/usr/bin/env python from pylab import * from scipy import stats x = mgrid[-5:5:100j] sigmoids = [ lambda x: 1./(1+exp(-x)), lambda x: stats.norm.cdf(x), lambda x: arctan ( x )/pi + 0.5, lambda x: 1-exp(-exp(x)), lambda x: exp(-exp(-x)), lambda x: where ( x>0, 1-exp(-x), 0 ) ] names = ["logistic","gauss","cauchy","gumbel_l", "gumbel_r", "exponential"] for k,f in enumerate ( sigmoids ): subplot(231+k) plot(x,f(x)) title(names[k]) savefig ( "sigmoids.png" ) psignifit3-3.0~beta.20120611.1/doc-src/psignifit_logo.eps000066400000000000000000002420221176542545200226130ustar00rootroot00000000000000%!PS-Adobe-3.0 %%Pages: (atend) %%BoundingBox: 0 0 166 36 %%HiResBoundingBox: 0.360000 0.000000 165.599995 35.999999 %........................................... %%Creator: GPL Ghostscript 871 (pswrite) %%CreationDate: 2011/03/22 15:21:33 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2010 Artifex Software, Inc. All rights reserved. %%BeginResource: procset GS_pswrite_2_0_1001 1.001 0 /GS_pswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{< Q Q q 0 0 13800 0 0 3000 ^ Y K 11588.9 606.04 67.76 0 P 136.93 0 207.57 -61.93 207.57 -181.51 c 0 -125.22 -77.74 -199.78 -207.59 -199.78 c -135.49 0 -201.83 67.7 -210.3 213 c -124.2 0 p 5.64 -80.37 19.75 -132.51 43.73 -177.61 c 50.78 -95.84 149.53 -145.16 286.36 -145.16 c 205.96 0 338.72 122.75 338.72 311.84 c 0 126.99 -49.37 197.54 -169.19 238.46 c 93.42 36.69 140.17 107.23 140.17 207.42 c 0 172.14 -114.5 275.32 -305.27 275.32 c -202.07 0 -309.47 -110.24 -313.71 -323.56 c 123.74 0 p 1.42 60.75 7.09 94.65 22.68 125.73 c 28.34 55.1 90.7 89.05 168.65 89.05 c 110.54 0 177.18 -64.98 177.18 -170.81 c 0 -70.55 -25.49 -112.88 -80.7 -135.46 c -33.97 -14.11 -77.85 -19.76 -165.61 -21.16 c h f 12180 147 146.688 146.688 re f 12835.3 1148.02 m -93.13 0 -177.79 -40.82 -230 -109.77 c -64.91 -87.53 -97.36 -221.64 -97.36 -406.59 c 0 -337.4 112.88 -516.68 327.36 -516.68 c 211.66 0 327.41 179.28 327.41 508.21 c 0 194.82 -31.09 324.69 -97.41 415.05 c -52.21 70.36 -135.46 109.77 -230 109.77 c h 12835.3 1038.25 m 134.21 0 200.69 -135.64 200.69 -403.93 c 0 -283.82 -65.07 -416.55 -203.51 -416.55 c -131.39 0 -197.79 138.38 -197.79 412.32 c 0 273.94 66.39 408.17 200.61 408.17 c h f 13711.5 602.42 m 79.43 47.63 125.49 128.96 125.49 200.98 c 0 83.65 -60.39 146.57 -150.87 146.57 c -148.49 0 -277.25 -156.98 -315.53 -311.42 c -176.33 -704.83 p -2.32 -9.29 -3.48 -13.93 -3.48 -17.42 c 0 -2.32 0 -9.29 11.61 -9.29 c 9.29 0 10.46 1.16 16.27 22.05 c 82.48 329.63 p 6.97 -24.43 24.39 -66.29 58.09 -95.36 c 51.12 -45.35 108.04 -45.35 124.31 -45.35 c 156.83 0 304.47 166.13 304.47 322.96 c 0 70.87 -30.15 127.79 -76.51 161.48 c h 13676.7 620.17 m -31.41 12.86 -55.84 12.86 -77.95 12.86 c -25.6 0 -84.93 0 -84.93 -34.99 c 0 -26.83 41.82 -27.99 74.35 -27.99 c 15.1 0 47.63 0 84.8 14.09 c 36.04 -33.75 36.04 -77.96 36.04 -102.38 c 0 -50.02 -22.1 -172.15 -74.39 -247.75 c -32.54 -47.69 -88.32 -93.05 -151.07 -93.05 c -98.77 0 -161.52 73.24 -161.52 170.9 c 0 29.06 4.65 48.82 19.77 109.28 c 16.28 60.46 31.39 122.07 46.52 183.69 c 10.46 41.86 38.37 154.63 117.45 233.68 c 23.26 22.09 89.54 88.5 177.92 88.5 c 56.98 0 87.29 -38.41 87.29 -94.18 c 0 -16.27 -11.68 -154.55 -94.28 -212.65 c h 13539.4 599.11 m 2.32 1.21 8.14 6.08 10.46 6.08 c 13.95 4.87 43.01 4.87 46.49 4.87 c 18.6 0 30.22 0 46.49 -7.3 c -22.08 -9.73 -39.52 -9.73 -54.63 -9.73 c -29.05 0 -33.71 1.22 -48.82 6.09 c h f 347.96 244.23 194.78 0 0 635.53 P 102.29 -125.86 216.19 -181.79 374.27 -181.79 c 313.82 0 520.77 253.26 520.77 641.28 c 0 408.94 -200.04 664.73 -523 664.73 c -164.96 0 -297.41 -74.39 -388.02 -218.52 c 0 183.5 -178.8 0 h 882.38 1822.18 m 214.02 0 353.63 -188.02 353.63 -478.17 c 0 -276.23 -141.93 -464.25 -353.62 -464.25 c -204.72 0 -339.64 185.7 -339.64 471.2 c 0 285.51 134.92 471.22 339.64 471.22 c h f 2530.18 1629.71 m -2.32 239.44 -160.4 374.27 -441.68 374.27 c -283.61 0 -467.25 -146.46 -467.25 -371.89 c 0 -190.57 97.63 -281.21 385.89 -350.93 c 181.32 -44.16 p 134.83 -32.54 188.48 -81.34 188.48 -169.66 c 0 -113.88 -114.09 -190.57 -283.79 -190.57 c -104.61 0 -192.95 30.18 -241.76 81.26 c -30.22 34.82 -44.17 69.65 -55.79 155.61 c -204.57 0 p 9.29 -281.02 167.29 -415.67 485.6 -415.67 c 306.71 0 502.07 151.05 502.07 385.79 c 0 181.27 -102.46 281.21 -344.23 339.31 c -185.97 44.16 p -158.07 37.18 -225.49 88.31 -225.49 174.3 c 0 111.55 100 183.64 258.15 183.64 c 155.83 0 239.55 -67.5 244.21 -195.47 c h f 3020.84 1968.96 -192.78 0 0 -1217.96 ^ H 3020.84 2445.94 -192.78 0 0 -244.37 ^ H f 4147.46 1968.96 0 -176.53 P -97.3 144.13 -215.45 211.54 -370.67 211.54 c -308.11 0 -516.61 -269.73 -516.61 -664.73 c 0 -199.82 53.41 -362.46 153.27 -478.63 c 90.57 -102.24 220.62 -162.64 348.36 -162.64 c 153.27 0 260.11 64.95 369.34 218.08 c 0 -62.78 p 0 -165.01 -20.92 -264.95 -69.74 -332.35 c -51.14 -72.05 -151.1 -113.87 -269.66 -113.87 c -88.34 0 -167.37 23.23 -220.84 65.05 c -44.17 34.85 -62.77 67.38 -74.39 139.42 c -197.59 0 p 20.86 -230.14 199.33 -367.29 484.42 -367.29 c 180.79 0 336.08 58.1 414.89 155.71 c 92.71 111.55 127.68 264.94 127.68 550.81 c 0 1018.21 h 3798.84 1825.18 m 209.12 0 332.3 -176.82 332.3 -481.28 c 0 -290.51 -125.51 -467.13 -329.98 -467.13 c -211.43 0 -339.22 178.95 -339.22 474.11 c 0 292.83 130.12 474.3 336.9 474.3 c h f 4645.02 1968.96 0 -1217.96 194.78 0 0 671.64 P 0 248.68 130.21 411.52 330.17 411.52 c 153.47 0 251.19 -93.12 251.19 -239.54 c 0 -843.63 192.78 0 0 920.55 p 0 202.24 -151.16 332.42 -385.84 332.42 c -181.23 0 -297.41 -69.74 -404.29 -239.44 c 0 204.42 h f 6120.84 1968.96 -192.78 0 0 -1217.96 ^ H 6120.84 2445.94 -192.78 0 0 -244.37 ^ H f 6877.8 1968.96 -202.1 0 0 190.89 P 0 81.48 46.46 123.41 134.73 123.41 c 16.25 0 23.23 0 67.37 0 c 0 158.32 p -44.2 9.18 -69.75 11.48 -109.23 11.48 c -178.82 0 -285.64 -102.49 -285.64 -277.01 c 0 -207.09 -163.04 0 0 -157.82 ^ 0 -1060.14 192.78 0 ^ 202.1 0 h 7305.83 1968.96 -192.78 0 0 -1217.96 ^ H 7305.83 2445.94 -192.78 0 0 -244.37 ^ H f 8042.45 1968.96 -199.62 0 0 334.89 -192.78 0 ^ -165.5 0 0 -157.82 ^ 0 -920.32 P 0 -123.14 83.58 -192.84 234.5 -192.84 c 46.44 0 92.87 4.63 157.91 16.23 c 0 162.34 p -25.54 -6.57 -55.72 -8.75 -92.86 -8.75 c -83.56 0 -106.77 23.23 -106.77 109.2 c 0 834.16 199.63 0 h f cleartomark end end pagesave restore showpage %%PageTrailer %%Trailer %%Pages: 1 %%EOF psignifit3-3.0~beta.20120611.1/doc-src/psignifit_logo.pdf000066400000000000000000003430501176542545200226000ustar00rootroot00000000000000%PDF-1.4 % 1 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 2 0 obj << /CreationDate (D:20110322152133+02'00') /Producer (matplotlib pdf backend) /Creator (matplotlib 0.99.1.1, http://matplotlib.sf.net) >> endobj 8 0 obj << /Pattern 6 0 R /XObject 7 0 R /Font 4 0 R /ExtGState 5 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> endobj 10 0 obj << /Contents 9 0 R /Type /Page /Resources 8 0 R /Parent 3 0 R /MediaBox [ 0 0 165.6 36 ] >> endobj 9 0 obj << /Filter /FlateDecode /Length 11 0 R >> stream xM-˲ׯQ,OWQjhᑀ4c+ݢ6(H9x橪\_x_W__W_~_5?_e_5fM՞7ʫwo.ÿ ^|k=nVrzby>kzN ?9^jz~*g?ݿJ}WJc kz W-|ܯ݆Vr?Y+e_cZQX!zy oLͿ?t}Wxa*+x9H|+~W&Tafo.|]W_%o*ZFyF{=+Ȑ^seWHf/ۯ"ڽ+XEDr7sk4]wr onW߱XG߭aF{cZX-{TRڽew0g9l5|_ a?qy5n?^cQ*\U#UDZWϿ 9s5;vīR]a9LώL>_߾ӯ&Vo ۼyw66 qall|gs;Nl>]|ue4C֕˸yE4y9Ϻy/s]|\d$sA$ʍjc|:nd>Ry^9w!QV-2 ^|k2=/d3_|c&6 #iڂ#|c0`+__q OO9d[՞O:V n)WV嵶ҧMg<1 K.k+.+yH.)w\G\2f;sXR\KtF 7D / .#a^2P . g(.UpM|ca'1Bh15P\^&uLY*(.@\Wb=}mkϩivV#3uD ia{T-Ah {?m2#s%~N 9~o3g"J@Nj RX,{y9ݮfQ4ǣL9)aPT?P,mp}_ p7-\m} b 8ǍI#Plma~eoK 11/110w"; 1缌!s|<Ӈsj'yC!:I* MmuKD_/>71zJ+HI$WHmS+]2:>2z_ 2zm耾qe hF^ft||et&}!Lo*F;9ȭ_CB#M(EXS1A2y`룂t`@' <ں@:جyt`%c΂=}2Dm9TW8Ө 7OX0sh遥0d酀m֞K$ρ/a"= K!_wkҁxOw;{H7;!H99Ι`mg'K FoH00ЈW{l1'HPp< a>9= vnP0E&E mL?o-0:^-\:g0xQΟ.>|TFe 'SWt^R[Itt W.aj-FZOȳv`3%cO-ΣWQ^]l:爨cyK muIF~cniFGfoHFǛSmѱ׬'?ɽpJLF `͒u%O@ǃ-烁!eE>`!d"G<^] ɐYt>n@GtkFtޕ-{*D4֕ <#adD,`*I>g-^>>vr|Tf[y/yvvǮQ 0ie(bbzLsoEx&x#&cx/P}2 2'>Աl',n]8~p:uԉڣX޸zv(X'ޖ1K7cR<@4p[RAxa1OR ur6+&a @ ѲoD64u, npd6;y쀓v&Lc3ɵ A$&̰m{ u WٱޜέA!f- !acoQFG߅]^5M?? *obtfobYq-Fчzc?4b9-F憐їæcHY&Yv)F J\_b-+_< сhөBW\L.Ϗ.!H+뫣1Wuˎ`Q͔_!'3]b)JokJ)E/<O):o,6nGJSH^bL&ߙ|2$\}ړ kDF\ȴ4AkDDap!S:E7B_6-x1xI;qЄR]};]/X>"t~.}TBݐTBQa˄"t`ihBǂ=rѲtʛsS$t6$C+^nS%$H[ҙ\苄^n#c5q9zI&t̗@UЩk8>cŷ"`ŕ{MI^xб,oMVrcr{"ziu1 dId➊D ^sHB-cA`XfWDǪd%cpL4T B(Z ":K%M< #3o/:+43~* +GD_@MN$Q7J_'sf-"S32:>UPxh? SnT`vNxV |1Nx7,iqэ׫Q~ U]ԥNHM:>@bu~6xy&&1)>;\,*.D]{r z_'isޅ{} գ2ܿe]tQz3R7w陰1:0YsPd缐I5%^K9fJ#оxo{,¬څ`Q|k(xz]C<:X{ UK]ȺQљ" Q^֍fʺсߕ53ze79\A Gq7[3: GZl]8\' GҌn, ^"ju艧>gc(S.OňJta:rX8p`XR~w[Oc9tv:C"$`ʚ K"Vc-Ko"Mt"b[t)lAzrDu_AE,r{HOFPoŎt#܇fu[O6wae|;KtlrgaJ6#º&? lh/pzgEvK0EpzoY͒өnƴ5v >8Ύ5p:S>Y0E-K (}S^JE酂_=)ʓ\ ҽҫUB<~OJ7,K%} I%'4 sk(²_A $A,B}/|)K'R8=j9, q6LcZEpzAfգ|PGXȦ6}1F)Ψ[[FoBF\2 dF[kFPRBڼ:OUы}6:xGRGӜeGZ֭zRVu|1z ww3#5F/nգ_ʩGԹ{н`bԜJ{i\/9=BD-x&tݐ5y/O5]K+^ "n: )!{I)ihLigZN%1N8 Bud;{&R1`ԽJQ9wvn=3 :zyJ#0ѱlVX5))uZbٳRHS/d6,jIU\.ϔz~"ԉ\45in,*/45wyYUVMHCs HL<셋 aƈ B4JA! 'FNǰzD]Wӭ6dUQdYK?Fҏф&7D +cYnuyU/~|3Lw݋azFD@:n׵a .NLZ ˢ!˙tb%s]@:5*KK} TRκ5i^/F r;%|A:3//X+!_-t/tjQܥ"/}BҺpꥲUZ^+ˈ pF^-Z^vs+ VBQB~t۟TFa}2UYn[!:;z%QBvèz͟FnQBnvPe:ò D`x zgώϊDe~]]uэ7pL8$Bt6AIDHِr( :=6N'1V؜%B:# iCѡ$fOF'Y2:2Ml`tlHBh1,-rG{1ONӪu>T t+Raa &Щp,:;=I9S1^6:^} DY)n,EtGtj/xq_ {'#wZ_jB6-*R&tzϓrJ[4B`ĨǿC?XY;?=z/ 6NI?}fх 7&K‹ah 'O.qDFB1.T 6T08!V-:Z,)gmվɗw L. ؂ζ>f/N(-fanOjO̰L;gn~ґ¹2Tp gg#7d@s7P^c if 3cR܅,2x,?"[f/.s^]P9.|C!xXdqhj 536H1+nĶEEÊwVdqŪHM@qCW@=Q$p6&(0 x1ڄIapitaZ'`D' fE=bį"mW˴8O'{#nzܥ"B ?F \%vМ$٬b.cC>MW>EpXL/IhDw;[li?< xt!6c7= 8jXm1M<Ӌ>?h\ty7QKNu۬λna]鷰Z"[톙'}s~AXba VC*|c5S‚ݳ#Ίi5RܺO473% α`O*X{xO:Y|sh+;HtdYc7@T!5g#Yzo nrἰ:{F-9'J(依%x^@Lv_Gx^mFnU,61=NJ6ֱmϳG!4NKӨ(- ~4 kyTW;oDbP+*:Ǭdt}s>M(Qj]>Ί<8:禤e+>oՙ"9^pU@4)Biuٰ$,迿 C5LR.{|{!(~ӯ^ G7{EgƌW!ѓosG%U{ѦHXUHtwP\=!$,X&IUHf/ւ3+kֻFe&5,y7 %a*V== 㼸Q$tf#{S:˜c-Y%INcQBm]uO(`\PV컱0s &^xNJށ!j3vRrSh,+nhk|G@=iuf}M13xvMsT[ԯĶiI9qҧcš'`.Q9ٖEsLi7O紛\z[ۄzތZ~o=D5'g!jK;3gsm^.t~4UPN]JΙ/{nDË̟62^]έ*/[k^yye޽CeKk?K9,D9H!Yp[)C`BthT 2u (~CF(sHej:90aot^sS]~Ȟs~)Щz7'45OvHPPKw">{e1~Ϲ/[lu-BEց!hwrKVn&hb]1s)oQ3zfm!s7M[崥,P͉h"6}%3n=J[ǹ=4OF@vP*3M=oYA:^;n7lsO8t ˟n#\[׻mcLw"Cb> ѠpEFœh[P9vNm(tEq(XB茌n'}RNyᎠz7!Pߣ"}/^{f1Vn=DAC1NcPt!ʿ3n걾^㔿H3œNm鿙)zb<0I3EvN'7bgy҅,OYm=Y!'Fy)X$}#{@gtM Kb]kz( 6-JFƓKJ\p +{( +E <%dlAJqT>-("(]ROYpRdsҔ*eA JmWᤈGtR$n dd HgUA#jv5Wn'Β6H(KN,[EjI/˺H vA"-e s, y <٧9cKaB}NVgu y VJVXz\#:޹w="OBoCZ%#EdR>,0O9c]UpT#c)/ma\Z9 g}rs5n!^BG9 9b2ض^J![u2 ?d[ٴ̗ ތ d,΢[\eAtݖ4,>-yRH@cHR:w5Di]W8hKdڗh?z] ϋjYNVWsn T˓,)t ٧)tv sL3rs+:wk]$KƲe{|Ad,mkφ2&y>0&Y[?w-@O,ruT̠W>cS̠s{ tn&O$?g&u\yHsCI0: }QПsڐs6U,NS!OϋOӡYw_чϿ<' ^?WQx5őHg%A϶m^F&"s?x*VVs9YOX@Ggaf @Ćt͟!Œ:7efa² ԎOFȟ31ѢŢe#lTF>37շ?$K\89mTě teJ+DiRuqQ/֙}qQdd7%ѣN@1@W"KڼG:ϽЯoF֏ DO2FrGFvQ}?/~.jFMӅѽZX3o.~6Mѳ43|t/dҌMrat:}+0:sfWF$O$!b;z-VD(_D!O6=OӖ3 B7$M}et{DtsDV#QXmGgk z6gI3yo\l}"Vΰ]耎† GaJkP{S}fl*oEf7 !: >uJEa3&!sa.|CE|JJTP,bXX>RN;l|o蕝Xt >a (D晍̅%ov{BNyyqż[*T/'h95U+$~SKұWWkE+Ր HoI /',U.ŬӸ;HǍaצ{Hs- t,ȤMMe=ւڱG4-U'`DJe'˖yy2QHx餾do/G&O=yt+^\(}Vond|t0}'N]O>~[mԅpsfaqtڽp<N /j~r1+ e{z֐ފA$S|tp]!}t,*u%TA6:XFG7AS}AtoY>OR[!<]/#nhj$ Bߔ=mǹE:ۄٻF. :qJ:%FGTz+nĶ[бaŜ$t`k΢#N2ԡ734ĴtZE#tgJ@nm9Kt(l*>84/VtAS+$:Ս: :s|YhHX]VNC-2Jfz:iHHhϙ7NHϋJ>EӠ' !:]lUT|u4r|yfWV|(i[?Z>13Q(Jn:exiXJ SNTO;>σz؉:Ҩu.u?e.4acd.ey=Oqȡ^Xj(B7Jz : ;uñO:I>*1Gf : ٜxy':3ZÕzc!>pzֳdQCjL;iS4q!G'_%<-s^"oD3T5 )[ohxvAmoh2t4 (hn#4\epmR=kON[O#Z-%toro,#tY5+~T&3h1whJEhV,Мj-".K/j lE4\zEc̬E6KKLX%(@ ٜVEy#>\_Ʈ8`[eK&9L0(juηk_Rޙ~*:١(:^yx9pRY=M/'ϴ]qs"m)rN>J^v{kx lz+s߂ + 3B÷E<Tጡ{sNVoLcLtм o2i'3xɜH <.e mH(2.DY:TL&vYJtX&ZhT q!Zayҗjogt[F&2Bզ>Nrbuȥٱo>B}v =p[d۲LX g7'4o(> C*Nv\$:{=zX%:ق8J4*:Ӡ\Y%ٚ"Z bX[i)r3ӡ):=.TD:V̟(!.F.$x?q?/͊ v<*?G߷hNE^:O^>M.Jr/}_HnR/^碖 i-A)F_bE)F?J}Qѿ/*5EF!FEF}QѿBV *1 !F]>.FF1 Nl'z֢9Q-ӭ*;ř#]+nX䩦 ZtO u u~"X3ws䍟JtJ E۾>7PwEJt0itP+6{Q.ꃹTtSviti.ډ|DItv)]#J q 1$:;׶ ZQC柗ngZQFG(X-0b8mEp -A'nB#]0u*Mte[vMV9 qaWNи$̴ݤƅC J'M'ED- p6r9+.f TpY a}k.[!MލB轕;sȅOE(F+`-35iB&:_ ~s[dM=n.5I{[S4YʾIBGɷ~E}up7H*) n)fE裦kKj suӡsԛ n~_4HO9ƯUJUeh\h=> O|Q-+ڠ0^й٫BvnG KpT4>dt,ͥn lfKR8`H*ϺMWs[` V;1AHӃ)@¾)ʲ,A].x'SRBjɋ w}v>\+Pۻ!'OY0YfMb(+GnB^..CQfxd:\~ETE [8W%%u >g|^K-v4r<<\fb[o> } }y"XoW]*=4x:ť鴈 R ^AȔn@z-TBc?gmF$+&vansZpbnt܋F>y/%d/Ў|ޭ|#iKٔ^D>v?҅MJv|>rXltˢ/~/[Cs.x2T^gQg祁ЩW-ՒЭ-x"@|aq A H`NWIsg dEuϢMkKU\UOD/(}t= 0{:A|9c.|ϱUOBl眝y[9M*ث[߾Np{K~LIlV2[rnkWE';fO@'vrPt`ٲB'xg$T-E #To޽iL!:wNۭIZOf.-/խbLvvpzS #3$?.#X\ˈb*ǻui _'>AM<}xg(h*GKa8WDu,4۷nT@JKG6EjRhCٽHԣWo&. X=]QS3ퟨ„#K+]Zae:gOT왚*z)wŒ O)qO[B0<)w61^6B͉ ^s8}t!՞H[HWOt [&(ҹ]R=$sXXݕLlHP_+%"KP;7IFhZQ7`[(EV¬2ܙ(vR*ӎ%%SYWY`qOH_ߤ.lzotD^u"}g>Yza6pRtēn<6_$3B\逪W(1XK]N΢YWݬۛGEz9*oXoA[X`b;eYm"á8q/B B'ұbx )t2IȤEO3Et#c%2;tn?d߄"=cZȤflDEz/om2n-oB&E@-.;QT'k"0#bQ">[o$qb }1~AڄETѲ[ڕ1FYtf'߁鎁8JsqH[RBuQJ d~ٺ ZN-wS t|ƵbHQ:k:Y{a#tVhqN'4!ܝU;p+@tfVt~Įh* B*JXP.R ZpusHljY:AipkY<Ӎ#:QY5Q8mv:+G%5yDХw6`3Ŕf֏=(yH *XEONW̨󉱹8="StGLPHE(^]f=OL+VWvyT!P7VK#*[RɷɿA})$?:Tt[.t(R?&uL5`Tw[e[7MEn{&/TE ]:(gq-I&yӎ<֒b[-Iћ',$}Ң%L$}[JA:usE)R]#c-00)Hgr_V7!jQnu}~+LutRa:^,-m㹦mFܵR:t_Z<_Tt61bqBq`Ķ˶cURN5*{dh V|1Fu'c #Zr\jC)[u(X>>%X[PpґK>~D(U/\Y0b #3 [zwb$Q7ZVn׭4锭2qE Fbl  ,:NHKA?Ճй` ]*eYrc!yv"| :G6e8_4(TQ:y1Ws5tt^f!΃if7fS΋8j~kڟl Eezk>7 ޑFO手U$="SAhoD0z¾A3zvatJ dD/M>J7DyR('ہ o."˞LH<." }ﲬBLW٬ kB4oбV2&j@^q7{j3|AW.`]+zMg΋"zႳڬр^-ƒFЫIh^*>KZ;~jB\':bL7Xݳ t"cc^]Q$t+Mp$t3wHR&tL~ܓ^Znl$tC3h蝢)T U1:kKr'a fF^(}#P֣>WYrw)҅/xB:{+\]XIpMife(3*tN?"e4)HU#)t's% }-r''Snt玡st`JRl ImAԼKh"JLjfk$vR/3E$P7i*uLOsr)lFsT:5HuH9Ts FFxM!^1Q:)IląM^]@ Ϳ ;Nk[Q& ?^N10E <_' .z`:QC?)}.vMc O.캳R- =I\[x@dQrѷQ&F̍Sx!.j}F&(^Mҭ[L/D:Ƙ47LZL$05H)ɋu`:[JD:V3{H tG7'[#϶ #^Y*Hazf*/措7U&P+!6_m/̋ #3i:bp҉twD+KX@I^$/@|B2ٳP Q9xaV}F$lS!$/kϞOfƏB]"yYRcLo.t/JF*ՒAd*[䅕=H^zp'$/Lt.MY߃8bY=!y]g"THg.&qlP0cJcR!=ٍc}JBkj̇t|+Iit(HBNE}Z V=b߳/ܩqbTĪST~s]HnD/( ]u1"K``x%p\ ӱTQVvDESQ:ńAh'([L)x+*FZWN/ˎhUގC+{3]GqϿ`kE<tP-c SYUtsigaRUMN\ҹoLlJoHdnǧ%>!}$kix!k`RÏ@)Fex[鼓mh-J śsnj1.U#:ys:zsȿ؎uxw7J/~b()Q֥c^^)_yKGԥ^nFNQ:wf˘\ /0tetpU2f&v[#]dHYzYߒtV\ >(=U.èf;1:o_dӚJFg}ە;F+Eƅ `Zhf#D!Up.@1ƺػe7#լیҡnB:w7)DzOQZV.vqS:vJ@_d~k&Gоv&cptn..3XN:6lQd=@w tRnl9Kz"f; N'KOCW*v{B,3_os<]3MK9V1X]))IWYZOS'76cu̓VZ"G't9O>gםi%*pxټ> BLJud3xN鵳g|tJYgu t,˲Raԝ򍻑zad.mÈ-nFa}~l3zft>?0kw[B龇(] vQ?x0z)踕R\nit^x2Nj˟F]v`ftJ[hz0I:KF7K})B.7V";t3J bᕈ("H l4 7t$zB r;/L.S&guy2+- t, Ѱ>>"[`*ӊ"b: Y-Pvtb]x sòO3Nч9-4:>j uyNMbi-`cý?)J1 Μ _RI 5FJ{MJSqBKnUt "ͺ(P++9JQzOQɘG7!5, a[`X0>|K `Q(2z92:Gj\ۮ;e6$J~I#l;GOQP\쿥i2Đ>~t7Ր>gC3:ӝWFb o.ѫ;dkFwGa 4jFFJ@8nfy7DɏoLl^`OU9v <ǻdѩ=:E4Ǜ BͭJFi.&ƺ(8 @ߍXݪw >]*Z:7K;l%-|O\lj t.|K\`ы/SL{3] #6sT̈́sZT.;|1Y8 v|í;裰nF ɴ5+J-z:5CҺ*=Ik{jڅjYNfrNsrmszU|NZRҋ9%%t da.3`Vس<XTvn-RX9'wLP'w,4r>LѲt,2ݚ'g'5v4d5owЍÛ+=M]c7{f"2>̰sWaGS&"ϭU;VֿR62ec2J!o *D>3g݌@dhpux]Esf۠<_ikJ1bŲA ˛Bs2%7IK1~@DsYljkl<ʝL}cds&1 "ՙJ{gl>EgZϘ,TQh.1劅v%n{)ݢv.xo3_v63b"eM$Hj 5e|(Š~.tg3֥*dt."<w^S^\Ƙ-պXw2ԓ=X 맋eF#OӀ%󰀞]UҿkzͫU3Û@tݴ̿\R'7;7-8;`6C~TZ5}F2-EwAZV&YobޜZ % Ty׼4k4&{:8G/軱9>Wr1L/\М:uCs -,_ٜ9+m. t6|/p>} KTj:Q-5*yP{=E|Uҗsi3-P2-Ȟbs/Pssz=9!L9g]&Z)^ <&uI9{ciE&{{L >7O<([;.s309-Uo|">E_=&1!} #v?bSLn& :3cz>ǰ^'m7H s,7">gHn8bхQ1GSFgBWLԓ xھ>=3V3:['A֖Ά沧\ѱii _D-^MA::N7X_̦Ӹ2`:%6┘X@_(+=ًHӭU>,b:ftρL W40n5x*IKfЇq\ӭQ)LR\8Gt`9^i82GK(].5mV!D։ҳc]ʟ \]DXJӏ(&BwK\L~W}Bo'/*n[tҶJQS2KӹB/L1.YtuOv,G} 7 c].u źLo:¬u.>JՋ"wVJތE0=Q>;}ܖ@>$cD}ԡ&RX铟 ztNC߬СZ%- G:j=U5yv"*t {lԡr D[(ga/zs5]>w,@mw[y?}?-ZAۡtQҨW0G_)f\m]β́յQ3dOs͞L,~S^Yk~Cv-K8`΢7:"Mh6Oȧ7:0s9%x]\0gWﵵ}oN%i{ O_2zb&L2:"~jfUgY.N4"n747h`XT0,60£g>B:{ȳBiH/ct㋔vuJg!*xxJ:?(}Wivk'oZ!TeJOX{[Pz8߅Hb"FvlBu<*C2}T}kt<0:=]rtN jtd)uh?dL50kJg<PҼ/޿ 鍽eI,/Ԯ\u嘮T:X|=B*S|(j"# C!N@;XGђ'f-eu-o@/bK`C}ӏB502+ s"͒\d[e-s\4XtЭZRy`VotG}T#-(kt${ӔNTo}$\S0h`]owٚ`tWt]D h7 =ۇBl]Jʕhxм4c XTG-ݽitKOFHg F% [͒qKtيBtleҹchȒQ:֩' 9d*bE0^lײ/b~` 4騭@EJ^VuP 0GdtX!b0OzVXCh)*.hWխNBdUx]/rZ&JLWfX!{dm6gt^t(/. ΋#|%x6ѰEr2mda#*鼈Ɛtw OgwF}6鼘L\EgԣyӍ%8D#9" {CE!v4%S'VjtԹq %yKg^zy>s錑4K> )ˢĬr!ei3͊w7LkMΘs7:;ubZe"/حaBo~S`@ ؗd/< MXp])1H;S6,gUx)LuIKcS:']٬ϋ!Aa̧UP|9v7exЊԼC]Edž|u3VA.Pjo|ztS. yx{=J 'g>R1*\)E)h"6( AF&=1+.,m ®.0{mk( 1tΤn,jE-0:q,6ދq@e28}g[7.k⹧/xn ϵ_r@NqxGUgMn+{LeO[#DQ]4"KS {)&oզ| ٽHn}CюdG0k q/ʋL0nngq"@9\k%aͩqG$sgEd(<%ϡԩ.g]\X=L?inskG\ă:Eg 5(mE$|[."NLNU5zZYXW`N`Uiw>:'&<'w+s)4ǦҨ"*Y@5%R]NO8@fc 8(d42 [tVQ1韉<{ n(M ZNg¢m 9T:رmѴQO=-I1~y&-\uQu\GD%>狻4Ly#s )3&7>ǣf2U]d#sӥCh>ysNi>':6Iu_l1:u#v,Q Jpox;}..NXCH7%3sI?IzTcn&}z)4,n8^)*g\ܲ*X)%ʺQAUH<^A؁p-\]u-bmxbx):Eh8cF]`3X?0's`{Da[UD"p-$]t >6ǀgtle!alNɠK:O8eY㈚>@ʀ0,0vsՍF>_?E.O[2vK|}4z:U/TmQ0 %^9W.< mVZ;@:Vka;?ˎ5IR%x4~)"! @Hܑx}3 _5`Y;"ܗ-_ha 6ko}&J>q|F'';>NẒgIZaEʴ䄬u1Lug.4[Q|Eo;P,6f[P[R}(t].| [B*ۅ|F@J⧿t`v S:wz#=]4=i/jtiȷ}+E{|E7h.4z>]di}'\j Loo]M|`zѨ$z~$ϕDρ$4n-K57I12:3%Lw4EGI}Eim|šw™t݆^< $:Qcw"T!2n2mEtshyt)EHty9̢{!M,8vt̢,@XG-eD[16@C]蝍p&FϜqtʠk+<[C v74zvy60l >鵂FƽHEA{t/!&vH@?ܢv3x1u @Йo~mQ y&bgv4yC3gۥlW'^ ݊yOe [bgVU[]4ΑG Ovnբ-}qIt~:o.LӛƅyѸԢnn-ڋ*ڋ8F|.>E+&o,:<E3Eنy1DǣGo6z<чGBL ! 'hy9$@of;y'@.]|q>I:w08> :-U]F,Ŗy^S7F/{I/@OSvQdri è##sJ{K~Qa~t59;,JnkCHJ)0c 67]D :8$rړ`ַ[3dʄvv-j9ztB2 w_>y[ʦ~Q*Qm/jODbfbop⚕;S)74O:Nn_R^&xxu{D +2/"=XHUUt01eo9;Fmqu [cL!8:ɚYŤwoh>P7PnHe::yEיNlϐL$v`7PO﷈uɘܱqΞg*b]*1T;E6p0l06>&,LIt2,ν7N<'Eת5I_ ?FWF|bMAϳ<y~9ESEdq>V5\Zu-v.j5`^0ѪtBv፲[obԝ.hk{Nܢ+ &8i3JWwic/+jsbW ;zldZfQJD-J`[ ;:#!oayk}K8BTPݗ]Fld|z`zIt:: ҇|K͖Ir'cyxϘ*ĕ6 &f{J56<苪֤}F$NtmWQ}ҝVo$> [B|dhwIl˾wҁK *~2(ۓkQV^T..I]PU"Fz۵ogϗ{x"{_`t#$_0.!Wn㚐@ &"we52{tE[\ : żJ!Ͳoޜ=*{%7"{}= noiD ]'(\ҥop[Fvmc<9!zE'DYpB溿/e$BCt t`OK>lҫ/^kǎ2g/B>A"t[b 3*zWё3U;% F'FC]uK/z d6щn;~_DAWy2>pte4NUbTc(7 1OsJs΃Lzk^WR@ޡV7~G/Bh]4sD/Lk*ыN"oΔdzw4HG7<7nsJ8.}PpGvosYNڭ-&%,Nf\- J%FPnGbMDl[b}2U7 Zn4(ȗPi5Qޣ}/O\w3 R?o#翶C [fp|V݃Ld4E(aБ: OT4zCgm\q#Ti#zd: ؟e?ghf;gE%:jS$l:SbJ5"%$m^]P']K]rm NĴ(uŀsxG'!!!WQOnJjBQ3g Ծ_a:7k=CҗKPb0徺da:.xHw?]pz&|ru{@¾Hg xg=9!X~i^X$# q:#^1؅TF:0ܚ@=SNGM;U/ݧB@k zy0R3v*Pp} qDkiHmMȹ`:=Yt@ g ͦ6G(^36u=_{lX_86/-tTj D-/a~mV٢HY]l߅JPtsqN !wՀۂ໯œEtWo[US $TB^L/hdFWALh_nKOx,R2`_2!C\zqYak\`zX01ȩBc-"ߺtͮP:kej=de0A0ݐ=I&7nh,f ANn[S‡0jDtDųлhg%wOiNi0Ż=ĚAҥ{ iU`tɲL-).n 5UGQov'M'쓰W̽ (ZP࿯y'OB7pc 5uBv5cif_9F2f[f҉&I&x&v:tvG3h8P@tz?&ۤG Lh/uKT:6FQ4~|;\zc¥U(W죋"h3G8Z^. [ozr6W=z]\.%7}ӣoZ[ḅ`sж\GظBѷ%NsdK9z:12jfK5zqE(X{4wj5 rJm_FR6߭/sJsBѻṤ.LaZNV0y v7Ң/ٵf־QQ 'b8 WlϾdE B :ۅ'̖= DV-Ч"!FoxDkSN\]W:ust>J.}dTxkс}ausHA="y)T6(R^mCςE۱m%Fd:ߵ3SBJe0{#:1# 5%epz mLGcOfJdF;@ed-w~ѹ2 ?Wwyaԑ0. z 0F7\ Fx(WN-~rbU ]{N\ :iAvKhZb1HCK]8'( ːA rtv? }WQo%F@#2FF'ɒAwQx4D %Fc^좋􈡒]צn@C%B7(oIiR adQxfOhE N.`]-{Cll7BG!L 61Ѐ(L'D0GtaK٠Dytm q t.C,oyFmmE0گC*14Wn5gQYS/cT@OŷgQJs\c0z̼,2@QN %kh̸䴌V|7gɟ,7B'>my[Fmu!:1,u ]cD OthK%?px }~hQNuYG}9jF`D 9;Q#ZFdu'szpZH)[pREvC]FQck×/MZ&:qb4Jpz[:T~Q"ޮ~QJnP:w蝸kH=_qq8:Cs5>Dőwttu%AUXaKbwßCBnhbt,I1bt KG``@;M {hoEXImB `\dpҢ<7h*Cr4%JTQ-&j#輖5[`gR2Rt@ls KT}"ltI>9.ãm>1YUFkGPUuoA@ҺtHΰbd?|={}l aC54_|!MQKoנɸpoTws^^KOK&X/\z^|sh.=PH.=w(5Ωs{Q d[tfj6=N4>cߖdtSpek虐dNMW3*ciUF=Yu1A*.cn\3\Su6CP72~0twL'dK&fyȺQ{N@ُf}n(T& 4.:h @+42ڄ.0.gǯ 6}`tt逧ޢ\ͦ7"LYg|h,8E'ۉQfd>Q9ʔByFc HW!t̸K)eꓤ|H\b4T::{#GM#ƥAt]+51=1dPe;8!:fny]H(+(0'_!~rxe!,t<]JR,-GAy8d*Y%/!+y\"h􇇧5J@h5y\eiO_G bhM;ht{ O?9m/N1Bޱ$J$/;bC %Ho=i]BxZy@@,6Ɣx/vrYQ':SQW._?싿/?yJ=~?|MO?Ӷy˿A K?y\_U@42MOZ4ҜgHio=wFF4mY &;4b]c+})O6q5RʞerbYU|?Smi* 9F:Ij#r5t[iao }"2P5tMvȜn{Ž/MHg`B1P8 8=J>mkx/Fl%Of,Ts4RQ&k"YL#F9ᑣzAS4RFH=GG|W(Wq+e1"ξ8(xMsjÈ)=b=^tF86&`xR9Jir4byVM#SZ&t#tӷFpʰ#}IN9p'|#nH q>@dqu# J6Cn1P.mw[>ÒRߏں84^&R`Cwj" 9pwu`I'p]XȏhN6f>k<նD$h"^Āl_/']<G`KLwV)ΟݻOML&ac^pҏGI{?}HPpߟHw8UqP(dC){ -"Ƈ4 q\`Xΰ E2@;> RDHӳ" $2Do}~_=9}p[.!ۺhh Z?ݏ?O?~SGS Ȭ*{A[b &'ض~wѿ2} endstream endobj 11 0 obj 37526 endobj 13 0 obj [ 606 815 748 679 728 811 765 571 652 598 757 622 552 507 433 395 427 483 456 346 563 571 589 483 427 555 505 556 425 527 579 613 636 609 458 577 808 505 354 641 979 979 979 979 271 271 489 489 489 489 489 489 489 489 489 489 489 489 271 271 761 489 761 489 516 734 743 700 812 724 633 772 811 431 541 833 666 947 784 748 631 775 745 602 573 665 570 924 812 568 670 380 380 380 979 979 410 513 416 421 508 453 482 468 563 334 405 509 291 856 584 470 491 434 441 461 353 557 473 699 556 477 454 312 377 623 489 271 ] endobj 15 0 obj << /FontFile 16 0 R /Descent -250 /FontBBox [ -30 -250 1026 750 ] /StemV 50 /Flags 68 /XHeight 500 /Type /FontDescriptor /FontName /CMMI12 /CapHeight 1000 /FontFamily (Computer Modern) /ItalicAngle -14.04 /Ascent 750 >> endobj 16 0 obj << /Length3 0 /Length2 27245 /Length1 3667 /Length 28908 /Filter /FlateDecode >> stream xeX˺C`3@pwww  =Np{pf Y.0Fu׼tB'ddcvcgI11@32"/bw4wrNf#'772{#RU!+5@NhPbchtt,-ʿoq(@#zdd&&#hbfK?r;!8l-F@cdyA4N.di)o{_Vfnh1[Ru̜9*oif(dmb 13o n 4R4s44[:I8qͬUl?G3Ѡ؛>2322.t+bֆ6Ff&f6v2#h*f66 PmA@%#P&v&o3Ahb0X VF=6+`P|9 *f&'A?&>W7r0 H hj&k c5r^. ?PL\_q6@tNj-mm_[ voJЭ_k뫒pm_k Dw~꿚 D۾._*G3J?3τ+_l3YߩG)%bWX'+M ?(q#Ǐ 3ӿrWYJ3_!bf+CGy fο0wxX@6m V) oW? 򿲸`тQK h- 24q{ize﨩vC2{3=#Fwml,,<:X峁s;@e0qf>h@gG@+OhfB~2@k6yVk tpc``-=_;[ RBQ \? D*hQQ;“@`RJQ ? "GX(Ÿ3wg@,JEQ ? ĢGX>Q ? ĢGX4 ? bl'{=;gooFK'{\}?, l_ O@j8 ^W |%?GNJ0M_IV3%AL$QYjz Ww|ھ *WDeJ+z%AT^=~7 4ty k ׋V%1V&DF/T6sJN_N5tZ;[ ]Ⱦn%\ fȒLiɎ]ug$WӁHk+k*-7- @@pU遇Iz7ӵ->o8H~'fֈZo[yC)}(r1U^ E ie'B y-E"Lk+VόNx A3[V<*{LuDTV4nBjwg`BSsڱ|=`cI"ዷa ` JB9Bዹc~x:`Ž~P3fr_`ɑ$E<=g AFj':EJYjZG1 J'xCc]Y-s۸"#tJ˂,2gfN6ئ7z*)eœؾgFkrC7 ntV#tzAU@].͇9' :I,iI}QS![_kY Zr١:6(>Nlt7g_2XB8e"\ir) l;٩a+43f~qU[㦯K su%YsBΦlu PZdz b^~HyE .`2‚FS ˞!PĢg2t6V|O={c}SJ]MgrvQA?yLɒK,e%Jȣikj0Q ǔ_~N@A D:U#͒ Xa3J5|n~D,:UNzF旚f,_@fV-cZ)z^ޅtu(1n^3{z\2՘\ƄH4$;A!e$Zb)~͌!ĨYtLqL 䥾maLI !hy_pT ]\) +|cgĄN5m7::gVD0hEXL覔LTw7~3{:<(arY>W3JxmNN`񶾻J2DC:$=E6q"%ˍB˯QkG7:fiҘk FLfa7-vMZy"kf9Mm<@Yk9uΧA+:g.G3WD"PI ٺSx:!k:C_k& oamW0Bz8*?Q|7coě}$x\-̇̓ZdOK.FyС$nB}uDcO]s/ⴥ]Z5'QAt|ĠUCUf<,3q-ePKN_d>aF&ۊ~0~MI/,m`;8M>c\ϾR46G=zNv~;ofʶ Zɂ)xV . O:IzrHNj-dM[(9SK+=Z.q=E֬ΧvOzW 4;MaVl8i|fFi X\wT9G̳n"k1'Ju*.\ 5KCRojk]BsTR#_`UR(x|b_smUZYkؿ;:k EBjSBUo[)ry]|q~ ^GR1TQyXׯB%E"4ơ6X8ƅ6/gRM2=~9焧)ӇS\ +b=h41.&\#r1a8owQw#V ;JIIߩӔig#%OwʇxΡX5[ߏ-W'$@r7abT-:qmZR1,ة4rЃm.\HbdDyCEEv COMtfȂÇuIXg^A(Nn@0͒MĤ@cYEōhc "L´Z>!NO7L]|7D?G=tq>P :{|Uոِ1b2PrTp;1 *&b{H]DaݟT1{baJ`UTXmݺ(1UCO#IjVu]@ܗXٳ|Y=$s~.+HOa$ޯKJ<, tH3yda+d6w8?'#|c;-tmh"Yo b*qzfwM j6%7-[dN-%$GD\e_rg 56AW2!bG );8grɐ񁪹n%!zxu3&)D(f!d}3ٖ[.2G?{֋e~)?oc7Xɲ G (Riv5:𓮌;jMO r4h"#0+@ڢR$ZA@t3^4QQ|tJSTIOƒDC ^^&li@3P02GQ"!֊0M&g>hQT PFE^mǛf2dH8TYm+l/N赫zsЇM!:sP> [-!Le[\ѝqxqdz%'!F㰜7z8"U-0a)pՍ[cݛ6`Zϱ]Oj]2ꗾ+ !pqGҬ aK#Pe $gd}@kk,Ln֭:)-FxjkK ~ة,$MDA@x"kF!!R1 \J0xg9ª. Ԩ;Ej'=?HQ(<7}ڹn+hh{a?k_|P۠:V;Ia[O_rcȳ)Ad.Wv4am(O^ K^Zci%.:9+Cn>oƊlsֺ/ itGݴ̳*}AVqL3mS5idhFF )sgDIIȝX I"SnO\VM %OIoaevNrw;o k!dv (&1hEtryV9j,%wH͑qay~H俙l=XH̏D;lm*+$1wt'<4͈gnf:ۯ[(: |n$JߙA 0Lm _å[ZC3LЧƶkahxOI KhReOicW=!.HOz a .(HݔUn}饾 asnF7G|D2f5VtdQ\i1)@:%Ę[W "i` 'ߦYlMlKՌ \tV>MGHsp=v7N JA]Ni_,엑&:Ƒ-̼56Iy4g+3-'zȳ׉өwKm cݾ6ثz8ľAʐ1@ H/>. sv?(^ԃ|z; /0=.;AaJWȵ`@9K#Lc7HUze᯽d(s7 HZţ&^;ْ=o Az{ 9,䐃p+^֯UL2.?JP߳asWpzR4*r%> A{?&Nq]p.xtm[K(^H]YH= ]Z} bf/h|Śu1MecGJ ђ*h?M(Ɋ0V,f_!?K%=Ȓ߬XŒ&Un_[$w'ncDD[9I]c QPCNj XrQ"o\f)ד4hyHR9ne"I䇍Ǘ>hEo^rJ@Դ`,{#,YiH FKG2o_=if֮+\3GC{v4ϱĬn*ZZbLkO~Vň]X|#F%aY"'%QXBCrN '𦉤 +jGfb\ sȎ@'a'i06Z {f2]"ǏGMԁ_єl&O_x{o&X\SRX'ԙgnv02RkS<ŌD@Ww.7)0"hca[5kؠ`wIyU51+ZuҾ* j=3c\t/X;|j$s#Fc@^_<>ytJD)Vgdka8 U7 7K yll&zʼnT*:iֈ5SctOȡ#s,#6q\(ޏ@>t'Ч|dWh:ҭeʅnAg S^`PH*Md_FZ=N:pQEdEMk):O-FoN$+W( 7PU9aro#fZ섘tħ#ΛEDiO5eJ|Pm 9iשtK$s9 ҫ MY\1Q[l>Ox+qlÓ|#n=1G^d(\|(#G]Т+ + pϭˍ$"nDT"흔^#Ow\iyϫ`|/N,ʃ`rE㫬|ٕlRǤԋ"e K#+:N?9EdIW ;M{D{}.܅}*nPoKw{2AIֳ f+ߏ[;`2KNT) }^4dz Za{\1w&G|OiK]*T3).;L1Te[Ozxy ޓ=:y,?ϻL1Y%w{F;c-IǪFo;Ӟ4; .m'bMP Su“e c.!/4O1*4ByTc -K߰gT"Û*_${.Sޙ8y)RױR. p|$woQʕeM͉G$E kTSְ{atSZnu:ǭH9AWnvi}Mz4vt@=WwښCr)G851cAIȶQx_>!W_kw'}?Zј@KeKroٗRY x߫B}zX 5#93ۗ,RFC Ɓ?KTEYlJ";աҹ '0koKN$^&TbwV֮ch *.AW@KQ־ A.Zi%$Uy8,^ҼLGP[EU^*uq6?|<͉tX[1iߺ3^fI`"EI=!!ѵd/\vGw;eOo3<߿Z5Owr\E+8`; 7d8ԹV<7:(YExPF7w7zTW033`1 ӱ,,t1Qllvp8^'h.//5Dc>5kĶӗiP"BW @1f~o\JT!>V4O)R{#Z\Ȟ.!?zK-ʞvD0ƌw:GFk:t%^oLjLU#Ћ(ZnA]JyoQ&P:16i KP[#s O.p(5Sv5W3)*|DgJ_Ɩ"K(5Wi'H4֏p˪ OXP6 +V#  N G$QoҘ9)I*gj >qt0ڨ7?L/s`|Yh"zH^xM2M Ks}! 7([PE!X2"bu2+I?Q`Y_NTHN72lZZ]eR~g >gIu)]cC©'BQEmU@X TKŃmPl̉u7qҬqkZU.iRvk{m糰iBؒ8wp0粟pæH͓ uW\Z1Du S$HQ{hNsG l=4ͫN!v\oOUaF;`ʗ^:;Ie)!j_xjBN`5Uoh]ǂV*k!霩jֵ"F=mw=y=C8 17ЬIA31ǞMgᢕ_#s!2Ruxm1Irk$u . bHP&<D a'rM*8Ƈ/U~db>aR&Q )_ݢus:PqL%Nk"pD]qg {ژcƢP1/}?dF7RwY@h0g(KLurE~ 4 >k=`|^zE ȹc&[oK2J.<O; t5*~Ŭ>R$#.:Pm_y Niwӳ23˻Ku׌hvU.)1D\)E /+XA.`qֱ,fW>:$'qVYyPe!H R| )_ (Ǽ=HI.g_3dr)-9 N1:N21ؓF+B_ ?>ݛxdn5@s{+v̐S3#1O&L3o`$VH{oR ~q|(ߪ!ː!0jet),ÝXcc# q:!nqQ%d %-[_:LsvݹhQu_b7zVhTUztA(De+-K!AO9~:=]!m o_h^yu |5@u ;ah$Q۷>dBQ hf3 @C 1 -w8.ϢdRm(*n4"Xs)֗I6PIӗaҷ?3A4fR "m87sDC@j1)̡*r;(^PO*I *uA fqsH)kqr[#Ol2ϓT7yP oIk1W#˝ET=t>]&Į^*DQ&Ja[.p +["TiZH.CKTSNF 4L#qS ӆa)[=v/j'U:; =G[Ti;帺'O=x{PHZwMGsZཞ:+Ja(uF@mr8s}} zH?$,E+2+ :ODiNVCsg+"^[)|g!,l[!MB'x+(?*mvkE T%W U!l}NjOaڳ@0jlDpnCE,OGz".dBdATr1s`%X<,-p^H^GEgjMiC[ՂF&FhxW#ҬL[LK8_ aQ) a%YG5 }ٜ$lvq6{6E^Htgע*INÓ-%箹n'd:kJ8L̟!?}S)GU` mAD[J%Au\4`+LZ{C1yz}POwx*RmΉMCn:9:aW:qdfak(!U ?B!⨉?TtW/;ap/IRՌh#/_ڱ%gDZ"ωD0ljUbϰ ISW9Pw9霋иG;0RRHwP/L*vr" [Ky P|/` 8oV@*hK{loDzNF+qѐ~[}'w<:m^šs~uBjXi6zV9v*fan4`E7ytuk'ׂf:, "qVk$}0bZߛS)7V8|pɉq"e`e6G c +c,[H')yrM*zT}&-sSI`Azrja3pjYKs6gUDD#Ǥ ϟgV|џ4!5'16ɶ;}/$(([a<22H [?,7Vk/)6 *vj}=BO/c OCO?(VIRJVV ``?݉bzeK?[[W ogz!x0.sz&;_MAGπ-HKڵعNВS;B3X$׻8H,> oKӶZȺ s۲NwtLu0甇35᫃.uS-v떜]WhT[})m2:y7K~DFaly7Fjls#M SUI[~/ˆ@C1}FHQ#43Iɬv^li>AY]O|H# ЭҗT:3cӼ0#<"=\4s?*f04pfVwLWAL O'`Z6ӮTE/M[8=;HHQGZ"oA@aR]1;UiB ~:->U "upi e팹R$RWI(@VykuT&Qj{Igi5N`VClƃX8)Ffa3-W#̣= ߪQO/t>ȬV0CAӝZO.y ͆G$i7f+4]+Eդ`p$y%_ܲWBbX}` S#t+ *Xɍ,8hX:Fx~>pRAZe|[63n`b?GƢ⌓j\ҥZ8/B=6 l:2[[^)XD.eEn#߰{PYZڐX5YB[Y_OO8P Lĕ_;yFr Ng"DDefpVi;)Jjwi_m %K&s綍OZ _mvi&GG:]$ci 75ϊd'EeǸ|r}=+(KTН oG ^,+rŹ<ڜ/4%)iŋ!3kcٛ!R*s<Elٸ&&4:1t%M DȴUjTrTZ[YM5ќS2"_@oŰ"&g$~]X^H dai^ ^gzm_eO|($Ӕ'Q^Bc Pg]JqqBpZb-O_FƹVOe{ nx5[T[ϋ˧ʨ9w€n9詎~Ϲe]Ԃ)4Mc?]1 ,?h L)M@MB5.rƘ5{0|Aٶ~ ΅{-)gM ~/{ 8g5RaJ <O^afMYɔsvE^&i:wX32MBx{':_ N̡ u{\K[͗MrۘO|'E{T10K5IVWL x 7EoD5Q8 b&}8ȥ9ig9)تPFDA+,6k`+Kug~7x sтQ]bL,cԬ9fȳGX#ù}X:MJ-S]vcj*MtU"ۏt3dwF#P/S>M3EQYtQBpQIti6U< /m tfp3%BP{m_p/*ZЊa+$ M[SkP̋wЈ }'̇t(j@ 3܆8"ޏ=̰oɄeY&1kgK^FURɥ5s'WKaXbS|fU3.?/Ww*.43yp+;ٓh"E27$!\zݐS<ä\sYYiֻ,|+#sa~٘Eϻ}WJ ZM f $s MmL55ù(b~(6>;l<&Y怟Qiw"@U[oVp'/feW9Kjf!:WG+7^6.T,hZ -)o(>c5_FquIp|IJ3K AԹ0q1 & .J 1H_o"R'pʟez2.+CRir` s=2@ϸPuEf!~ɯN)Sj-q|BFylAuLGP6_PKsÀތMx_bN֨sw }{"}eC`2B@TX =2:t&uɆi8[ݹxdQ=.`†qg?uk;Q-0(DYY6ְ|־P}S/¢av:y;X%PӼjqF{tJ(g# W\30VQ[:yKpZ@Eƣ*6􂥓%;(]}Hx9wg"9'?4@Fq:s0, [."nHRw LsO6%(m͝rr`{KF?pKе<b˘7I19WM%״L0D(60w9EWЁXM$i@߅D EPUNB2ny9 R`Z]!4:o$0`V~c2T EP&Fj޹:05y?oVNhXI^,s\qG uxGjR\Ih\x7yUs1qO'M ȿ4ָpʲH0Hlm̀E@Zdz m9@.(@ HPNgzٰ U@V ʐ@YQ:)C^bsh!FJh3Rrx'w-JyF44w3(~|HQ W뚐?=mk')o)8},JLJ4aP *[&0u[C ZuTR>Od2+Uo{GelbӁtfb?^ |!4XJ! gl1krҩ,UsN+{Y2_M_PM֣-6Ns+T|F* |;p#} y(%- g=4Os8F'JetpZyr9D'(5r-+!*oJB"D)Iom~t61Q/tpvSw{҈ɘl :B%39HB`Ie3oʞo/!HoyBIUrPaٽkW׎]w_" w>_>K_;5-j6=X5;fV漗*BW۱6̓=}ԏs?  _"sݡѮm0JX݀&]l> xEʿ^%k;L,VvK/|v&MzX3YC=SvVjvAeGÆ<7>fڶ:;U"~ʤQ0NB |5҇F^vU;4wJv )Ly^xǣ}8L2 :U&,\[[ݨى1,i]OX]uꍏܘMW¥3_~5C#ɚ%!IZr --B Ln2 9cUؿ&a'<.< ; dctTmׂOl@"ܘp}zЬ0(m/V!!ġktd#a*_KHg$8R@`@{+1,-;|Qe0ES@p\ŒXOZQQ0vig˅wC\.]( O\Kl 'w:x8 LBg!y^5ڟnW5j{.``Ety-B1L>Jt+(ϽzFѦNn4_F@!(ٖ +V+9AKÿ0ڱnx7 RVuFHgxH8PŽ"3$ϕvL/> g"A=!҂|@BVm2\=uP/}Y!sNI!V} K"ak|BucvDJRc#‡@bwRLڝu5\~_E,i|}/1>s6vɧ])p~3DB*%%|Na9Ow/B~fi{lx"-b(d;0DdwjҺauz~1~Gf1͹bYAq䎛׋w`.ebpyf`Pɵ3E pAY*9ˊcDL-^K#S.6]2K jL5EBb=U[2*|3QRE݌w j2QzI6ZOh2u:6lmW;D*w2st](|ac: 7ݮRD"J#{{{fˀ'iJ[o;Bn)as}U G}EUHf4 JM-5'c;/^q ˫Z4![0~Z"elL^&Iu@m YJڸ=Ԃ0ߓ_ OL+ ZYoER0i>;GyG>x0)VHkr-J6p=ϠPsO^r0ȾX C%kR$yo;QK̝|ۼӸS*DW]ʗe~x?m@x* i+ Dv̖(}$ i@ ՑOOG;·Br%3 ߸B$ a=$vZ>m.TSeէ"SZb`>\!X)j4_.E,,%Q>5G&q[Cyf$ EYxfZ.56sVر$ 7 JZ)X4JQގaQ_,1}`5q̛S Ҧ">Ei$i(5}O2A]>HSmX8F!u4`B9cGV8ѐʨ4`P(8-UbQJzFeM$7a BրmRZ\ zz.D|TsH%"JwuY |bYyeJh7{]x3(FBn tURʐYEN"yNoϓ ,J 5SnfwFk29m`h(G=GbvXzr?0*q=J/#$~CRĒﻒC4kg@rdüpDd#z˂^d2u+|ҁ}`0!pjSF;HMCDl)0w`݋E< qZE43f&͙TN* jƁu"iP/чsUy6ye>z o^HlC՚y:o1XFEz&p9 \U̟X(o#T `NV__ C"hx&Zv,s$EMޟyƿ >.0[^Ѷke':ƭbd(2[ZYhO%~3Ƌn+j:x o+viU\Kk_+QXe —'.:@n\N -rtt)vC'' i}WjU, _M[AQ߃8,t/{AI2>.\)]^׾ɕ:ep}UTwc;30Su"GV2{yqD^9*昌ٓ_+Fgq~cXZ;Gp6x£@޾; mk73הf򥚰tKF|S&\1Npm,1e?s_T_ 6ڀ-|cx ,tnkPyh+4iyWҶ#RJ8^C|*3ɱ@ E/q$M vǙsH8Ng]hF)p#J6f8WHxژZPhK~?8;l-ywԯ4<"0pN>f@o ns1*'(;v~@L<̛b+~>>E.cDOlw@l0lT GF&b6/bPePqNC=G{#yH ?NXفFJMbni(e\C7Y4{BA]fяhu`KZ*ca}9B}5~Py¥_sp1wP]6#hY T҈s>'`c_ӡ5>%aPPhG%PDŽ njST+R2"ڡFu C5;,n{nGRw,-RAwX3d.3{%21h@Ձ.p b͍adH@]B4MhK?}`U´,7>aY+U$O<[ŔtE ڿ >-7_(@[SR"K %?U:8ܶ5.X9_=jO^O^]B80q2؁`DnDC u =vy rc:?^=RY^;^F3nU[Ci&|h$[cdmiM<;ݑYOI b,*\qLoAl~4/.qĉ`;I̅jtS TBB~&M0!1X+/l>=z͞kp:EU<E^&)ش^\O5A岌S"s|IB얤HTueF^0ɂ?Au5 vgBu4",fЋ{C426} }_ՈmM0T5pqU=94BoG U׈F2'Xh%cT 4 1\)7r}x,(@;1_ZkǧвR3/=dZ-!wETnuIy*$dE8)QHFL5kw>aS "0ˬ҇ {0Ngm)o1mfui9-5o|]‰j) 4&p5 $[g{g k~oWfMr҄W4nDY_lhP鋇0ɷ* EC̺}စ񭠣? QbEcU+0J:$CŰ vţ1a0\&xGJ[Wyw4vW9شނSmN1b鸽HV%M2C`4N[2P:<@un32֬|KA ʦΰ黖)K "1*N3)A컡Z-P`6#tx㝛~Uz P+Qx+yfct"!DWzG7LCZɼ{ɓJ5R>KH6kXϻ=G$}|V cCɡiW)2rr]'w'HJwrw&:W$"3#~/o~vПxVؙTW,&z~ZȔRiv!җA•2B Mc W-oV# q3h341FM۞{A"G WZ}./JTړbQ '\VbS|z}׌:YnmWkH->RS^6Y6 7C*(vm i|kT+z4 ZǧRX*MݬtIGZėD$ĩ);LF۪恿&VO')NbW"%"ق> U4l/lf:R'ݾƝ2HDY\.a8Thb`(f"Ҥꅛ`8z-aFq(ͧk&;+kT#abd$O1R~ㆋ?215*WC]e aLg XWSf!ǧhe}ɒJĈ w-h" {J{$ErK]T 9ґq.Z5ɐhm+/I(\MzHf?0qEqsN=c[W::zs c$)>ZM=T4w)&%51FX<Nblatk?g /H 6'sj_X'm Dwc Up0OUپBUc5r8ez4vxODW+$[4W&7V%Ԭ1U։J;s'x%23eV%j<֙|h: '#D3gщUk/ !xP] +^ .gFtI 빝ЗQ (N<Ÿ{m5E`9(FMcS} ,ō 8aY8VHT)k[<%8'>4Z5&/ŮٝFP=/&lԜ ӅgNcl,L^3T^li,M0}t13c17%܅BK2dt%0Ӕݚ9S['-zJ*271) fh,ق7sk>9VOv;Eqbuĩ&DP3G&3jVvC\ڳJLY93Gyb.XOn M݃EtpGN39ΨKqWv4p_~MAoV#t x 涢f;xq\# #}?v|C}%5I61uIv8Թ4ax_F~w$^GʕVW -|Atխ;ߨv@Фv78HAFI!r%X@Gq#("p  uL}\ӹ`} Mȉ!j~h b=z&jWY\* 7AukﺒEsǡ•bG<"R4<#ҙb}Ν䱑rHv n%T^Cs-$,bUL=iI]j,.QWIx&lF2i/ܤ hAkl"7 ڣ-݊ Zud:8odTObkJzHqPmc(3Fu&,v׷N,>AO2#Rh U>ms!f-˧7Nmz8CPdW}ӑF=g#&,up)SiS9ag6P 8lw{~բrІb8b9>d_m™Qr,m;k;v{C ަPt0)u^sP,7L4UĘ< c(.ہxPuj[ hMUso0Byja2}JD( sQ{SMW=t)Ez9kvDP"4 B k!> endobj 17 0 obj [ 0 332 500 500 166 332 555 221 332 332 0 332 583 0 610 500 332 277 0 0 0 0 0 0 0 0 0 0 0 0 332 190 277 277 354 555 555 888 666 221 332 332 388 583 277 332 277 277 555 555 555 555 555 555 555 555 555 555 277 277 583 583 583 555 1014 666 666 721 721 666 610 777 721 277 500 666 555 832 721 777 666 777 721 666 610 721 666 943 666 666 610 277 277 277 468 555 221 555 555 500 555 555 277 555 555 221 221 500 221 832 555 555 555 555 332 500 277 555 500 721 500 500 500 333 259 333 583 0 0 0 221 555 332 1000 555 555 332 1000 666 332 1000 0 0 0 0 0 0 332 332 350 555 1000 332 1000 500 332 943 0 0 666 0 332 555 555 555 555 259 555 332 737 369 555 583 332 737 332 399 583 332 332 332 555 536 277 332 332 364 555 833 833 833 610 666 666 666 666 666 666 1000 721 666 666 666 666 277 277 277 277 721 721 777 777 777 777 777 583 777 721 721 721 721 666 666 610 555 555 555 555 555 555 888 500 555 555 555 555 277 277 277 277 555 555 555 555 555 555 555 583 610 555 555 555 555 500 555 500 ] endobj 19 0 obj << /FontFile 20 0 R /Descent -285 /FontBBox [ -174 -285 1001 953 ] /StemV 50 /Flags 4 /XHeight 500 /Type /FontDescriptor /FontName /NimbusSanL-Regu /CapHeight 1000 /FontFamily (Nimbus Sans L) /ItalicAngle 0 /Ascent 953 >> endobj 20 0 obj << /Length3 0 /Length2 42916 /Length1 1168 /Length 43705 /Filter /FlateDecode >> stream xtc&A5\Vzʶm۶mfm۶e]V|VȈOr$%TP472secY:+*Y aHIU,]lL ;XۉU,\N&#+19;q,m .N6v!{cW[S;eWKS%Sg{W'cSg.=+@@NIMM/ #'''73u[?| EM,].Łٌԅov& D,L6Iyw7?[2quWtt5O&M] L LSG?Rx:d`fhlkiflf pqr5s04v]Ek65@G_rka!!hYL%7'+$*Zg )igf>L@OSG%ڻX(V{c??SSD柌P#8d m-m<'S?IX[:Yz(X[\P3F4UwV22oP33iEM,.uid߆ƮNNYJ}fk4505\aEvF4TFCGav%s1n,JEX)Q4p?Ng񨲍! Y!ZJgVw= J=K/>TMRﭹ]oޏ5qb`RB>'NM[Zˈ77 6B,.xO/3pFC &DV0*KP/gɅoMnt(Z<;C_'Wbѷb2f47$M^.=h4ś?QJ4\$G p|EHyw Zܒԫw6yxPXuoA/C|Df3ы9~:?0MdJq]Us1*oQ"JH=JL4 Te _&<4P m?m9 4chfQj_'OaM-}Z@߷(lQAϣdn~<qrdsIf\ŋ,py_h?:ZvQ[H)y@( t+[f}Hq Y b »]sp]Wt{wH ޓa[D:%鱔TDI:Re, m3)4yCCuM6X D8-e_lg >z{hlDs 70W79ԑbIt藞{Ns jlwN~gѥʹHƳS7 !"T>g"ӲNT@xfUco}\ +=(%mHFuk&v^gRPohKrKʂA[2Vr1@"MwS.Ѩ)@;/5g7n ilG(@S0KLOU>2b (hbP4T Ew9`xq}?u_s#oHkKRzlp|^嗧gJn4چ%D 1qVۧj }Jg*LJ: |ޓ:gReDS70gP:5=d'TPz %& љüE}Xg-y҅6 7R,~Npl)Ɣ0ZJ{:B"M 3![ 7U ahPReD UW՘dJ?}+. E$-{Ϯ jlgTwomueTÕcx%$^M{wLs/4QIgJxG@ѹ*,vPpI =[gϟ]Gso"٨BM];~5xK܈bK|]b/q08P7Pbml:z̬$D4nvU0o)SQZ gzA,)=Q-sYqF)bBqI*"x'WQ\~ bEخ% 8TՉ.;yc)(~Vs%>'=sqg[\<0^´)Ћý"^=xHkCN "s4Ψm.F]|GhkW&)pxH><VRWxwPLD3Cd\/6*A01$@ȈA۸§M1qGM@>i:% dMbwj6v\c>qı+ܫ!3&@cao1؝Ш0d3VOZ_:5QjfNBt?cg"rx^aA?Ñ@HrrTtkmgb9v<r x$_LIK/%T@&y>x6w T7#;sȊ~Щ܊'AÌ1*[H4ޠ˷IʊqC'*'0`Wn斱|-ޜ#0A)\^WiIyw lBBiӢ.Ks50%*Um<*ڬMZle]ʽF@"+V1_2Df0rf}N \:S}07B QSC/ɼ!Eom~6z&\63̪)Q95UDXea ;5@8}s3/4{PoӦC 9C ːûQkje]f!hzWkVZ4%+Mc LBɉ9+';\fv>aVMgϲֲ4;H;atBzc컝zkυqf h8d:,KY,|s{[D>'V#(jÙ*Fi{%x^a]_Ezo󕬑Rc][ 9H,4Y6ҵn84Ey!%D/f9bkHI>JTчA/Ðq{Aɉp>`W)/W߬tOr Ic^G33Bu3D!:ju3Vi{1p++wȡ⧵8\l@# C\t9<g?܉uwv, N^[''Ip?.R ؋B,Z"kUsRDlSU5}x֎[zUdi)U㲱?ɑ =4PȫPU(%W3rd`dʯCORX;cv xHxv6 U$!Cc/B-OPy?٢5~l;޲N?>EDNϢcX:ghXV f2T&/W E].aޙJګ$dTC%l^݊݌A$,=ZX"޼[,e~Qas sLA^ghͶC8̰E` ?S*SF[XՌ}ǻnJA3\ޜuz&iu%u{FNjHMIΞc WwT&Owlj[&/.XX Ct-:6N.#l³fc<&pQ $eUV'}$UAݾ/:f:LE=vP許lle̩a 3N蜞>)qyAjddRckYl)M];܇c qN?_ƒ\X秿 njs@Bt/e4rȯrRVxēbe%'=\lf|//;M1?-،Ȭ@mhIl2*K9 #˃ D$Qɋn>Rɝ*6=B{3R0g/M=+_ RKSdr҄h(5Nˊ8O:恺(bXh$X4 vBNX lpѢDCXLf1f +Giѿa*Ǥ&MRl^Ht3 De!"u`ȉq2߶4O\KB?N{T"޶zCmÄTX+SDb418%;I"Rr)ĥH,|_azlt@FiN*vma{RLDdXTDfeGi<¨ydQSx9[ϖeIA)|LwHEI ,˹ZBSdbŐVx7TY|2_2c$gW@ocfl?X1әC wo=6(md?f)p.Aajԕ{q+C{lժġ-a<@@۪ F׵~Ҁ8_/ ·Ƭޑ ǡH7P<#uXNԴN_|_5\)XM U R@yܧ.MΊNV׮ c>0;Ǖoz4h|?>":xFw+ej#WTgK|t@JOC5'HUY1AXLj@ȥ+x nԾ;`/h8Kl鱸a)\f[n=,Uw%pwd $L+me$ HEKRX mTTDX6-nYQ_ݱ_w$GbD ~ _\}ڽQ2ii~l1LȾFRgG;P &~p$YF0|ć ##ydc;!Ҁ7)4q:K+؎!k2!b)y lFX3+p:gJ eB$5jAaRA965Fu>;C:Pѹ#Rݚ_s|L,4I"hW`8"Ju]l=7aQoD,wB;Qme -lIa"].A؋费፟8>˞;CyWJw9j#8! ^unShXhD3Iθ{ŵd02|C=bumYw:j9jSEڠtwOqzu܍ƶfhM,oL^{9;C:n&`3Ӫ9nxH[{J=eeU3^J^bv,哸d>sXYZTֲ]`ኲhz"Lԗu+Έ۽%߄bHrNw9GF%]z \"5 FVǪ+Q^| H54!㛌G#P@&1 .&&}.&?%-ftx2*m.&ee8rc|Pw(9J@ֻqQaIcϽp3<ׇ?g|BQ T6}ڂ8Qepe8; T@'DBiqni}jY@=eo2S 1R#.#AT_$pQu<ȑ*00b HcK)UzSOB?E r  jo<*0g|a3[G H0ys?3br.J|7Ul&7WĞEOTwT1~4 ~:fEgI HNi0j! Os:xB~˲V6'NCN Vog]) BLv@_TxM֑^9BctUž G?)]KP}~Ui|TەS>z1uZ`u:[1kYt̞yG.99GYd9C Xlr;[S:nX>{"2]X햤$b6F;s8`| uL|3C׫[R˖ T!Zvb+,U&,Q8aw 'c@0.#00TOtR$iaoo!_Y_8[C([6$Ј3w O{gyKrٛPyG*_]Z(ϙT| <χXu 3"Z75qzIZئ̯fz_L9aD+`PVaVL*OĨZ{fuJQr+Xs|REWNm b.Y\/dlIK͂uE 3y ?1}<Ȝkh> T6o:Ek0ᝥB42^O2ŧ ϔCBh]11 H絎G$R>a|=N}6zM4,\Oj9dl(ۈ% b? | 4ԄտGZO gζA5l7Kik6|֬S ka s ҏKYeotcKP7h !,"ue^-^kcZG uRX;\=e 2?]kZrF5PSL!%i#x#2 ` ˘Z^00)PơŽJcrV{ߪ={`zf4O"Ŕ>*))Pa@e([gi_LK7KEi Y^  LB[wE?4\`_aB K ATHJ y>֏1Z|&6qhhط՜LSR⊦U;ʮh?4hRʒԊ ` %Mۗ^ Hh$0uU{.*CtDMڙ^* Xʹ1)ƅ,Ïxۉ CDVZj̖^x8hZ@JvA9/~Sz!li{25ǹ.[GBnΈu\nYTdofɜ@dx3{Zpքet)ѨWsW_0I2sVQyxޝH:M-!Qtl0#]mjV X6Mb\^5on(Bـro`$ܱF`cLW>M[vh'a4ʼộb޴#,imBfyYb럳tg075-*^?!b𘊥y=嫚zD;w{RQ`N"S?"1X'2%_T]ѓfgJdaI.b$YҗˑztPD,='^5VVJG&;O/'v޾NLL:]~>{=- mP,03D>jCFMj܀Re#oNh+l6c?cķ\z kPn4u!y"Q`쁀GfH= 6>#"%vГ;RG-;tu!4zp$?m z~<+LlX)vmmcB,E~i5핺udC¦|1یxDF+Kפn *uC3@<~HU#iN9J'|'@[xA{NVS\SZXQ;?v))cWHmf*^ahd%#9gݴɎs7Ч~+ ݵaQ0cHKz%hD[\!:-"ComѪ ~pwppű@Zr5+rBP87Q Ay^wq0O,a zYz4He8=kBMc!8|Qm"o?'5- 41QAA_)H -t ސ >ll}`ALrTy?~?%#GD֔"5["BWv-~P͒"~qSRΏ0Tfs1&hݼ0(]9͹QZZyQ&< EXhG%rӁx#Z9J8ӒUwts9Q-^ p*C43X`$Q~-naJ 0L|S)m7G8v,*ӎ띖pRQ瓙Ԉ |H')IUЋv4ajb^sM &05tdb6?Ր'caaܯκwŝ[Sby%g~<_Ėe @*ݴ?r̶0;dآ*ӿONEUNᲔ^:Ejއv88#kds-p\6NH7UPUx} }? oH7OSڛ:kIB ?Z8n5}Dh^qY3Z]H pՌ[%(լxoP)͵ ӏOSWCQ5 '}28 ZW$V$ĨjQA_0BFASRԩ1;KG;9uiD U<_OYػ-P{,n$VY* Wƻ%vZd;o.R>S?<"DaBPcJ\tƠI8T&΢*Г5IYGcMY|jFHBbX$eQ#ǺCl@9U]3~ z.F룛3 *(SVj+.Duzu̴"FJCo!i~10#3Y֯t?Rfls)؝u7Hm};"bg3q趋C $:Rv+%R$u a^xfp+NI`3ȆAPO.f4&dIDSԯ,*$ abR3l->Z }S]u5έ`)~A]h47>% )D-?s}*2r=Qdүx<լ- Mz]fLPdG,Bӎ=OhX{%UOLzd-X b[@؍د9oSq v}<6>hɃwxYX 2M]ǝe2Flױ(x8cv!@yy<3Awkh~6Eػ<7s"Z _#㷻 dMD_(WskMf'v.!fGM 5<6ԙɴ3Gm A8@rC*IDE#{7vĥޝ\ L^;VP˸ 脅nͬQdܽJ:lo'PH{vYe O>Tn&*$ǿWm m4/ϓ t=حm֔xf?*6K,JzJW" פ8[nͤvo>8b_|#(2=΅)w6+ӕYlw-BVgrw d-`Ź4?,x`.YŧYAEF9S1ڤ }W#bhc?/ =~e|a6ԊB޲r" ]19u Nȋ @I2l\X"?5+`'fl}=HWή!yO{C:< IV67ml>iYEv$6fEQH}Ĕ(_ܗڟwb~VZ|3 ,/¢Z]y aVr鼔!khnpLDhb#QwbXZi䡉Y2T.',vg_ î2/`To5@!iOѷ7M;$REsy<(ᬥz?C,7aʬ1_#&kÖ7ۚX@?NϺ$,nD $.W|׼G]ŏlKÈmgqq+}|;a-6+Jz&Fe+s8":0#r$i&6>.Q r<,%/Vјe/ӱ1M~Ў-*L 6ZD*1P΁{8O-9$#Zք OA :Vǵ9%!Y-&?őqiRd{8/Zwm NNM2CiB̾)i;iNo"{R"X5\q6!хE&vc oBLpbέKucrFO~ gu8/&@(Q,7_zY#Btt@z/Ygf3aDۛAq !+dL3vP* -xɹfMJk3 O(^A\"x@PEYO-پ̈́:&:0-K^|5Ac4-A8l4Ǚ=TSʽFb Ր=z&ue4{ i F 8ƙ` ۻ8_ޘ&c)`lej$w~ܮJoY[5&7t]9 }hܠYwBC]D>IE"֡y؀E} 64ۊfp!?8JB/#HtP9X?^nMe4IŞںи\ራF3e/Rzш-tW вO-y>GT'; {P;_@+ه~+u;#͈v{BJNZ'XiWuz/ W$RT|7IYYk(K>ޒ[3w 'A,EP|hZBpH,H3 #(,QuF;Ė[lT<0 `:j@Y˺迻V<'t _tN;q kȳPSೳLYHbDѮ"hً)Zl3 I+ůsi1@{ fQ)x N6﮻Ozh>͹A+jʫ ]*OuѲu7jd?qvœf'uv`JMak5wyְys'= LE%0pqWJbЬWu)YQ0 +2x T4ͧ^,$rd).qCM| '{iiK$Mlk.XN!hh;aPBdzzwf-k>C7pOC3,^&ğQAr e|;kB5LUgnH箔BЖa¶&<\>h5Qmi VsQk>w'9E F(q8Cyy/JipHP3){voF-'w{/C(4 Nu j1~ ʿL]*Le{ᦏo Έ˝;in%T 8#x'0Pۡ_wR(aRd 57h8&ش|VfFVrmB}g(;|l/(&[&P.9\UJyh-VnSϩ4VUٖ-Խfъɶ*Lg9zs3ݐה9!^V:-E< ɉVw)U1~7]./=#5N zZ(7#f1EG% ΨL"sç#*P Gn L..2RS9n^]¼(yf h]qGyr[k|K{;T>6/BQ+.rF[sD+XyaQ=l"-yoٮ#YFr+|=i[^A/b3%ho-TF\ ޕMbq'ָfcqP2kϫǎz {Pl}GɚzeOeT![ȱb{Mx:c:6N1꡶S>6VL+ٳdq$Cw)s' ߔ2vܡtjMκ:Ǣ<QpS|d5 *y3\uDnn;]nx?ښ9ɞ0h7@ }8@0@&K@͌ab*0xGػ([\aG`:rooR(vTG<{ pbf'8ꝯnR، IlNeprfVE#6ڐ?WZ#6&<VR{+7i1xsڞ=E~ |=&ǶBBŨp9 lXz3f`qr)<.J&յ(d%ִj ol5lZQ1dqȕZ=wiX/,8k(B7[z ay8Qn-dO`JJ&C+ SMM PNaJ|Csc^`YPw9BĆ1;7N9@qԴ["T]b{AG-*Y0J @A Ȥ>|M¥o_&=\;]"e/4rvuG\,hR镸sD>zz'-P.@Nifqs~9X k=W/ʷu@ kq[{<=)`AUYu{&lJ$]oGkp׬!_Fa5~щ k >ZZ]Ǐ~w@qĴuhv-*wq&d>щr;2I džۄ%k[=FQҷJ v%[B/ N% jucsVj%!kTT^5E' 8`&0}G[ʻe+;G0/s%NşDrUf:>FǼH6Z,b:sNillA6eEw v'  F.G+0`9F|[+9-sIt{0tK,YU+FF_|IERɜ2ᙏ4Tc:("7^vn2w`=.F%'p*{v}ʙb^5U8xv#=}м]#SdgQ` 0d.[UW/}juu@qJعm%()Z`fV\K{cE ͦ'UJ%\;m3sL[x0#NʡK;b-ٞ[YG2QOG7nIfSnUDFm2k)%/]"֣3~Gx!!S\I "=&˨A;9;D|dYXhc`q BIB7 bsSȠb_-LƾԨK6ixW?1B$h]7夈JAmFojgc[&;6-hܔJ)HakO)@. `НJ _R,Z U q|V+9k4}CU޷H*+ǡ*BgXXzYĻgO^Cth\\~%p"+il}F;Є6g]SG$*jS:/of+LxqU/%[(Q*ǥfPξ^-ܢ"'t4ݘ+p,WΖ0#&Uo8-{iftƱbAWTKVnN@̈\=/K[B٦k%*}*K4ĀFֲjN R1ąw%B5Jf;AS rc\r&#]DHcEEe A@e^4 꾘$搭R#"%dNg)6Wȯ{7O͊ \֥V'lK;ݖq;_җE9nv&Fngz$#_ 8P@]bO0ӈ.( O)gLgN#0 5D otVZYu3.[T0ی*M]BN'啸$ a7?KR̬T4⭢՚A-k̋u#61.ƒsJS Za"Y-6yҖS:A\C;ESAB4Tؖߥe;IJbȧBmx4Og%"Pئ]=H9>B]bNTS `z`wB=LcvNQ yZzS1B_8[z+%*V%EcX\|r6cb\CXr3`\p[\9h/a8gۭ^̿)0BP1ee|rHB~mNmR;V)4ώL+^Y׵T=$ 2%~NfNkC#(cunwJ~V2C]j`g:R,%44_@hNR'* l> Ɏ.04`%ɑ;vU#%[ɚ3fb:WupZkGyf6MZ,o7E?9jG.bxqH7|B3C&~r [.*Ik*\t<Kr6>$Ú_LWIܩ\qK/%eD_V,q%#jxagܬ?Ѩ;ATLqEoh ZSjvL/ujKgO"*/*^I)CQf2M.*@+`U}G`Ĩ,h#q$+P\IEr3q7qk ֩@ѐYhx;RuH~#0,=gX$4 C^{}+XŭC1BA(R_y:Wl ]hɹna#bt%w>2m.솅E/mL!WCjKX^8I)Gi&^W{$?pnFn5}@|X's޸цϤļ⫭kY!fFHՠ=5Bˮ8$L]; 7:\>_upS,:P.ٿ-cIT h^LWZu`]1l +uhp=$ʎ}y8%k fW]K"YrR+f4=d2'%\8I!kݵ]VBb4sI\v`ջ(ס n)hj8Ns8+FH2)_Rmk0?q9.ơEyLuƍ+E8N/]]Jފ!A`P-AF[]b:Y 5~bt'g?baLXU*_dNlmV\H|"ح2B eUB~V}x:pkEVWTцɪL`p6hY<AA6xGɔ7 !CV+"6%>6:A 7K3{0l Ux5{(ݠ=¿~l+tYtJ2n<eU?n<~)}xG+ id6̓_-&$tB.f@=D`~X5>Bޛr@ }7\l8M%@ 'یs:5d\HD;~utTN)3x!kÀ mrݬArhfʶ3,ĘKҖgVWؠlyEkYN!+' 3O0s?+kL3=jR][SL"k']Bm>}&FuL8DTDqF֩sU#Я~3n?čD7x͖v ^^cItyxTZxy=*UmEЬ26QdyVS9QAUn״q3[٫oI],Ag}*EDpf4ϊ@3Q5*)ִ>"~D`K˩ǔBߛfXxQ.\jJZzZ ik*/x!n{'ێ&0PXR;fkC(ԉn11 48tU.U- Š0dMs9qV=NKMR4=:+ٻ%~MfɊj[|}⑂聍?ӳCm͢Ѿ\.|ubxQ eYq[N&[Sϱa4fXA0bW 7 {m(^.XYk Dڅ/>kddeb^Z[H}:J6M)K.(b6,%bӨw2DX"O* z[iѡ3bi3XATyS-t+q(yAx{ sk`BݡO4!qlw(_mDri0G4;9)"-5fW-wӧ#ˊqׁ+ƹIg˃*cTB;4z!y ItݑBE?bBU LˤB['-}cB]~[PKMXh<\YXX"(:]=@sOUМT`r?S4A!i$G27g8#Jͣꙅ43KB?[Q[\ ~,YIJ3(#va92 .2L [&A$d`[y"~"0f)f N7Ş~KF y24L@̽-pqA,~-4TSwjŽApk-*LN?uSi忨@G)SnXˡu|G)9ZٱwIkVA _g@瑢!Tb,3Ћ B6#!0m+v% m̽93I09j/l`"8uf5ܐAsEoE6K .ƽG&u?A .hߟx.w7DFW߼6Ed=:J) m+'d/!3\ շhT;Vw`{e+e0Drkj[lk+1JWdnܫOD-ȚHjݩi(U]kUc4-\<$gbVwʣfv#9u&1&]FEN+@p,|׀ F}4t42> &UUʆq曩#BĬ܄ۂ]A9NjqRM4g9i uVT[Fbj9̴ytK5>ɦi:/Ls2>ʈbj0}eF\0\qwͪ^L{Oϋn'.ve1rR:T%pdjiB+>'CȪ^f)5g:L-~$|%4\ 9G hK@c/fN5.2{f +sIUAМS$3uURDƚiL "jxb1%fX-enAa2G(1C[!_IϕXz;ޞBCGyȤ"nېx ;sɔ}vQVcE̔~],~6(c],)oZNBǰwS0Bk[nIlqɕ}LYAm.Aw]N-SLtB Rɚ\ݍ[%i}lՄapsѹp|] {%$|ۤI;R{3v؁}tkf,%$*+3ҀP7K?] +Ȳڟ0ikVXHnv:vnH |MHs$5?jClbH+ f"5XS^tY'^0M}VٞOEwQ(>("6ǰm{v~B4rRg]{aw vA#PyefV_MުTFσ^hB8_/T/ɿ`d5G=[:[j3^O>UV/a)G[ Qy`jROnΜOcUُ+Ai3?yn}^aoI㊆OSLgIϞ8;Uvs4dE)_ `$XIk!ĖmSdbxqgBmjL0h7Nj]s<igžR0nʅ:<ǖn<b;9y=} _z#$"U8O}Hǫ7GH[ޤ  ~#n Y,? .ۧIM,1갑sxĚ!W|Q4F@faǏװx1xc'ʼn@e VZQ"̕lW\Yp&CƱ[&FqexK69sH\HBXb¾$7VM LKO'灕 l곰y3겁|JuA0a^onUDkr،0(缷4QF~ 4]D_GcƴZ\aiq11VSS;~LE[Ij V|?^)"q-*CUuQJGHA$(7F27ٽi.$`c¶n#࿧dǽ#%'=V_U!>J71'cH.DF8 nݜ T2"j3s}ԲKu< cQ._{K9~2%c,Љn2xϦN4LepD4amMc#;@aGoS~](='j|q1gR`23YXZN+Uv>LX[8t8܊Q#؎TB^KCb"4%( ޯB坍h^s.VJ60RitCE']˽/ &zD%EVkNgH=7\Z--}(AW KGyl `l{.(VK XjDB4nƒ ci-%:mSɒNI 7Ey|Z!Gs'4 6ߨ?%2ӎ[ՇzСgČ堳 oژ:?d~{Y.P[Sb>5vU/}k 1 fTOh[LnyN4&S.0S-&ȖnBFV=w`iQ;:_>>5KcM6Ti_Dv|g~Xt[. XY6;A|]͏#v;B01|UsCdd7=s]>Yjg֪+FI1zV] *? ye'j$nGcࠖ&պ>HFh+ȱf_,uӱ~z%Bp&%#o\A⹳>3ky8X}PXsMWCX!ٶϧ%.7ߥݭ4z? ur, zLݑhZ?0Q%3D xGRqZt^g}FI\$pb0SUX5(6ϣl2Z fR9 ,쮊n1"Y4H%Z-̰ `( xʗX(|S2,0[ƩV@CRigQ Q,/Dzl4WلYZ_@B;@`]T|yajpEO!'!,blA.b;7B*VK/" @#GfxMEwIDXS=i"E=plۯh4ڲr5kVM%32mء&KZ>㈆Z4CA2VT$$*YƁ]"/F TOBSLfD&xj%Forܣ0d8XʋFËuਓ%rH$qkVjHG g77,1gI?L$̢m{|NQWp~\&#B? #J)H4V?acwѐ[aNN΀ĶV>& Sוk'rt94#zjczZ]/^]18``DSe[Lv>~"Y&|omMʞa:iȏ*JK=.oB}QY)2RjDJf fuHj ӁzQb.XO":9RbÖuFCٳлao3qE RHATsTK܄)P4- 0IUX|VPbJM7` 3-w8"”.*hϾcѯn1 Xa\`qԏBF8I@=-6gXe>LtkrnJmaѸ_5#$\X;#K;H7ӗT*v.d(ijDJ>n턚5!.λ'P 8Wm"}V§#( gsEo'%#oegp dǫچx,C$k7H \pXR]8V >*mtz!,>,S5/\I$?Q6np,-fe6I4<-{`Y"}~^-Աc@zJmSqzGl~[*.ОoV `fme[Sfʡ%+v4+C68vx0&ڋ|`cKÖ'=$BC|!Z}Rx`TFTVB5. X:A_{bL zsLiЩKX*ĭ?8yBn_Rr8=v$11Z̥h:UrfwјSkIQ|ZC ޔK|3rT4O/SK ^ qL#b,Og=0iZ{ p,ENxsq4rh;ZI@5,fU\{qeIiYD[+C=qR ,CaUi=pSڐ%Rg d>}VjJZm"J 1[eՎr7만\NKo|lP卤zh RN{O1Lo.˶I4p{<).m:rS{M15W<bL18¨DftCL/sְ`k#^d8ךՅ+r>tʦy zʪ^(@JCMc@}CeZd%2Qx`|P3@W΂+Y OD m=%@V@yK@p~c(q[!cy"|u~ X)=I3b!@q!=,\SfKfW)dr_ bgN 8|Ƽ8*-.6 ?0dQm e &Ѩɴ済yx}8:Z~t2հ"R' OcOߒyQwOU2Q[=>;G JxBs>QUi]rةl{PxD u]9dG 8I7ФW؜bK|k/Up!NAhPEnb1`W@̛W2gt:lbp/m푊oJ-60xs ]<́}뙒}Y{h5"c C6?.|e+]yVv-緦D*|=m`R[𿞕vMGnP ۃc(fu{Mh_Ui_;|  6)MT$ Rtd Y b~%>|~Im /[j F?[&ibD\*`+Us q'Q,%捼9PVE  JWhѺ MTtSҙ_u.mx.[YAV-9&:_b~Qx $RlTt_:hz%'2NpLd+B 8pu .&~γ!ɰbt^Bsz]dmķX)ӢM iK\$:ϊ08بG]J{>>vuO,6&pᎨ12"{]4ώ><[B[7AͦߤpY ?I¹a3s}Q-1 !)ڔszP5|"(ÞY&}wɕx}8D^,p5a#ۘLA3?2'ٗHA$֮߹لn!Com<N/<#QA;㗌g2K)~ݐp3l$7BWfh CM~}(4>="$n樦Uk@@ Aqݝ7* DN&_fi?EMWgFJk%À%h<Ƃ)3K+W|D8߲]o.S ϦUj7/|=kǛYBCx55J-Ztr&Ip%͎^u@Tu KF7٭3lxDGC{B$ :u8Z-wSZ?ΓU-hp@tSW\;m:2X#ry ,+)Yʻ[:#֣k>q0ęLx8rymN'<rQ_(mob$No3+1[x(IO?`ij3{g+VNvL|Oݜ(x" dO]nԌM@$ D#;.p|bv3< $nE3ЦAec)DXoW"$\d!kes]n .Wiue3>[ $]QJ4 ZOx^$]D1bA{Iᮽ%f۳zBΫI,0u-U)6Jf\>Z NX:ߦJM-AZZ% $&R`\xZ${QA-" Jr~ 9FټQd*b9UY, j]iacF I L5Acv 'NYHmi7 <& $A2@GkHU"P9/lr*8-CQ"zWt"o M, lWLPmf$qzHWޢ@Y!P3 g"s5|D縃L9d o#;7pVyon/`a 41Y_ L F$<<{xi?ӀcH~"Va[t)8c/e(.<·K,r.ČLJ\%BKݡ*Dʷx#\7UH;CYa":qQZ0$~\ g_bc"oKEN7Yjn -Q sk[ \(L%?]\C'udVO'r I#Ǧ^3!wu `׼$ /9Skf]w^qSMmF@OYzBGIX/>}TG#CH_>"#Lq}a5To;1qVk)TNqޖ0;OKI@YW1xA]Zٌ~ jKwmP2ͣ!fRij3.`Cc< &XDQ s$УA /% 14?Z~%*%,0Eo% qLIA')IIe*!pHN=0N=47MǮ{q_v\t4S@t eoK SBZ55ar9(]{!2-G t S3ɵԤ"K2FC{|5.qg(.S RͷfB@p/l^>z;qY[b$W_j7r@Wج%iB 6_*;ME, (&6Z^}g8#:hBr疭$YTtvB0~F0 }B9Iȸu sj ެ{L+KS nͦYeǻBlƌ dZtY}>EiZ50ޚ<11͉h~^@i:{3?Is d.Ku /25*ճMwG PF: y}G \|>[&nj;3 ydrK=}ѶXDgXw gz_h.%}L>s&ӑ7ɟlXy3lI14c8GkK}ߊOSh ^,epa+Vm9 pe6( j^m yn::ρ j|׃:!ѵی~+ܢ9@8 [aYOðjL}o`SbJ (!qI]lD(k#=~G]\VgĚ̴& _j a!h +nUv ՞}ٳR!g\Aq_Qf*21~|,95)vh (6O5S]4`+V\FDk q@u6嗖-y+mNy\Ʃl$&egCkQi5+ xiݑ٧v9T. ~|ʝjaC:M@>6 zQ8'`pL |y-'VVz|fojsqgDj/\e?;/6ȍ [\Vi{ .x<~?h9 [be#vS "yz: ޒ$f@Z6ҝމJ95YI'M!‰DVt";cjGtw LF6}-8 ?^6LT%NmL::5ϘwuY5^xS/PGO5)u O+En 0 >FFrMm 7(۾w?)R(x x2c70MP9 \*Y?Z[-][ä̓1.ČH9-RSz !!`.N}ļDEdH\U)[/9N Cb`zz#1W@kUq4(vOD%Xi4sjODH#?eG1>S0uM].XyO8ŃiP"//v i`[ 2XX&߭V*h58/YdAn11IRϘ nlP;v,eE,-]- z6.fe+Ȋu: goc=2FsBk`cSA5561fo޶;ϾdMn{v+#:Z-^&&eȹTp3Z3u[X9q`pXـ˭ge(B#ϻR|;)@nֽ r1QbW[xܠ=>MedP&IċnWKz$Еٺ =muEcFq~y 5}Q@a%~SSk!&xn E t2sL:j" i4'اX/s ;aƌt(-Eh^*=m||?#9 h*1yF~wg8mٍug}H_d bf1B}4M@9B-så ,l? !W~?ԝ81L@3 q8xpvB\Q&MKUyq&vSu`Tշ B&fCkq0@tЯc$f=rIMp;,s'LRE)?g{Hrӂ Qz7|{ p~~aBgИ1Oep\,RS7C*Z0A_Aufǥp>B4tZ Z1=N*sV3UxP|jhQIP)Qp+D@8V}C7Q$w 86*6g+%k*3lT r=g@X"^?cf)u Kܕ7epN%%lYd`;Ƥc{d 3fj#4=˰Nb%a Cx3ADIr#v?=<ۉ&f,kݓ; _YaS'TA#JGB * >(Noy6hXJ4{ 3 lݤFk1v q_KF߭ \".}G$.IX=07*odيOzNH&+17 a{R7jF/^WDDJD]Ey Ujc^V\5uLKuM*`w/mdiǙK(tGzل+\]s&gXܫ {BC"9 ]?X;SؔqR 9U)}!I+?˭72eV|EYV|u7 ޕ)"Z &ٗ&K:?=l널ϖy2LzjUOH\2UꄑnB 2u]æ (D?"Ɉrh E wbg>UMXQL4̦UESS֖Bpq`̽< u@4N\|m+lӌurz~/ljnx?y{DUO ʤA%Qp⤿nU<[x2ߡ=6ooc:Rja 8PY#KU+~ݙe9qOe`Ψ>쀞?Jj<^ leLiC"'$[r/8+=oڭ.m_˺ūy ΚmR+`>,^hk\-vEC1xc`#^puG\RԨV.t {SBH˙ќY;O1 1g5sDZ X;{'NcttY%CT_<37xRmܗz:躓DQluŪ'" ntiYGVz#QѸv81<}&/s j?c}g ǃi1EƗ8"I!S/^?؆ g:=AFR|R;$}螮s>_Z"x T̛f<1%xGNrq\ ^(H9#A9#yC|(hv0"+t n^,) B|wz8|^|~8^6tnQS̊[1p:T[xpj>u 6ɠs/Loͷo k` $ɡYH+7d:jnq7rԌ^q=)2^Sיs3㟅u`KQ[#;gFQG'Qֆ5U>/>J@F0h.1yC=ܦ'5AZ6>gw:@XP_8Tfƒ 8LsډX^ CE 魻K a?&`i@9n":~V*B(EÏ1.Ҵ40 k>[:n[ip6X}n>PffGLc޽n @="d{b>UB e5@H >8L;X.m޿xlZ7I}9ʒH~ּVLݻD>4!m]6"0tNh)s {*vGvկVqyوEG׆Ʋ"āQAXXsLT&_vm2ޤ2>]LBd"PvUq7s\:nieެ|\2h J[H$_\Jg T8+)Zh/[!҅{ưb0-Eu5jC\#܎t9 Wx6p4ߦSq>cpEiyJIȋN Vnҵ"M%0mhb eN<2Rp~d+ SvAgT=&Sܵ=FBo~XTͮ8KB[N>4|eK^Qo{_}W> PdaV}AVvOcrn18;C˅PI@#m d#BTr ҈ܙZ&U B}Xs0xD މumܬ^hB<ۿM#M 4u(R!zpv$Z9bѽ3C$ЅuqI9AVl\{>A:#%M .hn"\^T`g{1n;ZMFv|:B@Vse,]&fvLO 6`S99+)  HrbN\L_j&T,1aG^v3oq-|LEY@ê:Z_gͩtM⩎lOvٽׁ-%u5N6OAH(P&U/Ґ|<jaTL9fj^?Lw;heXR06Bu_寤FwtSe^BIT H.J[rl6BnNZqHd)*h R)wXrt*7o4 !~-cؾH@Qs6fߣ\DfvJyf̿aY.4/zӔ'e5#H1"W(bBDl$'p1^THʼn! 9&lXRIT4apo/WӏFY!a%X㏝8Qd ^&m49Ae*k WX`Ya|S}uYi,p7qqo7*9Ru(ǰ5H֩se:_R՚\Ѽ+b6oֵaW;;6\[-_m`Z܄c{wd I@چl, M#.(ŦlhaY.?T_0<-EYUȺtS\[IW:Qjn3R'!?QGt"Zi[G$9f:Go hAcarC@ ){?bexs$`-ǵ٥"pEEۺ~j:y'iXA.ݜ$P4[TE/!7~w&N6`8߯٘@CVn'zJlC?1>9bM&|Wv }G>BprTڹ ^VTM?]uo U_D `PAѶo["sWX"q1HhPp `.=ue&Ǒ!8DRINChB,Кo|;ɒ`JE4̗BiхpzMγ%˜~qaf'J8+pҖm<Ű(a\V>K؂f< q>5":2\B͸ ;etXD*$/O;\tgT ?ThhM5d7K'Gֆ\_oS`S 5~V̅_v;R%)j΍nLRIB!b7K$|f ln)PJh?Nj =:.1?Q#2OQ Trbɔ^slo8ʻ t.>*Ӡ+*/ĎvWކ37҅n[GXVLQ2=DGkfo(ÙI0شh@y 1Q6Q fb|F!f -Au)Hd#ĩ/S)Wo0)1OٿbxVʗgd[Ab|2S\#M!?E 6  H}'xHH/ խF_;gnx)ғx0 Ngdc$SB|5o sV *C b9Σs}=auS F_r۷`dt0($ʋt3iN/|#,OX-؂JJ&Cyh3sѵ_X gحfh>n @?1:]4軷*p>0 c~*\k kC𫐢[;ƒu^-ZEMr'qqB KE&R{Kcrbߋ.2.$b 2q;K6R>9iz6Gt{eNw| ЀW΂[H]#M>&M(8Mszi$~Z]79|`T遻y{ 9O4e8 CZ{(x5^?IuOTGXS dzllٔFZgzL;ݭ`heE)C>p@dx)ʨdKٵm*s m*;Df"]E~1tT^Sͫr- WWu`ߠVac* +6- endstream endobj 18 0 obj << /Encoding << /Differences [ 0 /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash /ogonek /ring /.notdef /breve /minus /.notdef /Zcaron /zcaron /caron /dotlessi /dotlessj /ff /ffi /ffl /notequal /infinity /lessequal /greaterequal /partialdiff /summation /product /pi /grave /quotesingle /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef /Euro /integral /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /Omega /radical /approxequal /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /Delta /lozenge /Ydieresis /.notdef /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] /Type /Encoding >> /BaseFont /NimbusSanL-Regu /Type /Font /Subtype /Type1 /FontDescriptor 19 0 R /Widths 17 0 R /LastChar 255 /FirstChar 0 >> endobj 4 0 obj << /F2 14 0 R /F1 18 0 R >> endobj 5 0 obj << >> endobj 6 0 obj << >> endobj 7 0 obj << /M0 12 0 R >> endobj 12 0 obj << /Filter /FlateDecode /Subtype /Form /Length 139 /Type /XObject /BBox [ -3.25 -3.25 3.25 3.25 ] >> stream x}P 1 5oUܤmNMpi  ?eyC)aV$-}bQ'jSjO7I# S AؘE̲Q:Eސ@]fJ^ /[ endstream endobj 3 0 obj << /Count 1 /Kids [ 10 0 R ] /Type /Pages >> endobj xref 0 21 0000000000 65535 f 0000000016 00000 n 0000000065 00000 n 0000115704 00000 n 0000115313 00000 n 0000115356 00000 n 0000115377 00000 n 0000115398 00000 n 0000000218 00000 n 0000000454 00000 n 0000000346 00000 n 0000038055 00000 n 0000115430 00000 n 0000038077 00000 n 0000067868 00000 n 0000038609 00000 n 0000038845 00000 n 0000068001 00000 n 0000113056 00000 n 0000068998 00000 n 0000069236 00000 n trailer << /Info 2 0 R /Root 1 0 R /Size 21 >> startxref 115764 %%EOF psignifit3-3.0~beta.20120611.1/doc-src/psignifit_logo.png000066400000000000000000000135431176542545200226140ustar00rootroot00000000000000PNG  IHDR2sBIT|d pHYsaa?iIDATx]kp~Vq]c!LlI-M$wڒ2-z9Ŗϟ3[>̙h~Rh3bK@m)hl9\B|ʎx]Y8qgfGg{{?1ƐA\7\dAJdHAu2zyB#سgxEEEW.3 %FGGq]? &ӯqSA1p8Z/k 4Gs3UɨdSԈ==ŽfeE`66C/B$D"<ǎo'C 2B+BYx9`n5= ;7^zSS ~8~L8wdHM!`t"c$fg\T}cf6x*,V݊? cܾety0~3;P[gEB8n@$N h^8= 9<e ##ys7(WvIaY"qݻЃg6144V׫xpt:LLL,Qgv;,˲Yá vl~^E_Z>bjh4bppG7r\(//OJl60pal)UQQpn%$N,y=`j8,N1GOA=|/>1`gS\lSS lVtrTTTHe [r-Qc!W#W3rY%c6 IRY#u57ز~Ђeؾ8x|`شر ~WX+ ٜr%et*;y 5J9tr$w-(PS>nظz,E۬YSOEo;rsX()̠9TIY$d-AaHՕCCCC\J* o<)y)OѣuxrsPRB1"XXHap۶.?.P6?!wIΟ hy5pPU_c 4&LLL:.:p@'tgpc Q*3gNj/()!09> b4@QPS٬,Z! *eihll\\ R}}UI911r%rQ\|ZO>$Bֆ$yUUU)AtƐ<(^{q)R<81~w-7w 68RZ!Ynϖ199 ɴĭ bT(++K~JdVR9+5cQZZzK$u: Ry^tvvS@ Y*,?OD \: 4aqRYp Zhy,ZdGGhiiqyHBNnL6 CCC0͘8`4 LےA^7e}-DҦ%Cn*}Otɟ1 Sz|?ŲNL<_!j!?Նd+--NKZ& x'Vr~NԳz}JVEh:CQ0RyKICAjr<pZ(HOԂUOI ︃7G"E〷&)4j(//c,N[,%RTTT1*V?pE^p8p8r؜|.nXR>|8aNl|WQ#tLMش)cƇq^+HЊ Y0DDƈ@8qUϛ( J^|pphllKfV!vt:-cI Ul"8Noq +a1?OyU_{ xMREu:ȹ" n=͛MbW`ypbΟԏ3z,k^kED"M`f900H$R~D#ڴM +GN ף=l6. IyZj/v;0fsyBPBwuh4.Y':)`qܜpv:|lЀZˎ9p~?l6jEPSS#n׎z^ i׷:#3tLNFNd,,uӧl$B!sQFD}ؾ.WFGr,.~0Suw:͆@ !fsZDuX :KDN$S^^P(Vx< k4%R]]Mz^uIT:100ۍ~NݻwnKJOu< ݮA Ф)ja6_|AnjD֑;C$A20F##C3oSe;wwI<>K/z ssܶmʱǎEc`wH~9sFʶ111ޫ[I[b:Z})WI%~="Vhdel%$hD?RgW8kZh48y$YJR{b?Rпp?MlxҸ9CO+:ddD,qSx]/n!gI"+~F"ч\<梻gg,ss;'e6{fgIaqbDN^ \$WYPQM|I\R4&PD?z{{Q]]h^7:`0Hb\{u@FboEƜK\>|6ۉUr\0Lj^Ӝڵ =SSd^=A}øgjCZ9ý6|vzwc˷j=]7Q ^2e~VADfyɪ!]t:;;;%;N#HQ~Ztuu-WYYZZZ*zhFa+jA<3`0H3 J[4dpsJy{Faqzkkk:cs9zYkk+ {w. 2~ZŒZ`5a#CӡV&Bn288={(܏Rf A$e2\2ChRf 󥜕B:7vIENDB`psignifit3-3.0~beta.20120611.1/doc-src/psignifit_logo.svg000066400000000000000000003473321176542545200226350ustar00rootroot00000000000000 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������psignifit3-3.0~beta.20120611.1/doc-src/sens_averaged_sessions.png�����������������������������������0000775�0000000�0000000�00000217334�11765425452�0024343�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�� ��X���vp���sBIT|d��� pHYs��a��a?i�� �IDATxyս>TE\PKQQAjT FEJPb\pq \AQ 0{U\1(:?NSUU==3yy*! """""�w"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""lݺÆ C֭SNx'a\|hٲ%5k]⥗^[G,+3(ULU]@CԧO,_wq8L>8߿z;v@Ϟ=eL8Z¤Iлwo,X�'to6m`iOQ%)hHΝg9s&N?Q]]>^X{pWbɒ%8��mcǎs=o6mʕ+k*]R={67o}4}.]n۶m�L^x!-[>̷Ά̈DDDD`�Iih׮]^}�u;t7]{_¾MǍ7ވ۷zDDDDDuc@Rڸq#?-ZpGٴi\uO9 8?яc̛7wy'-Z_~Bl۶ k֬A۶m{>6""""�RO=G8pWgΚ5kpǢ[ny;@@RoB6mrǭK.�\p+t�M0sL춈ǀԡC8V�uQo>VI%""""0tb֭5koԩSѺuk]f -[Nf6m:w8 }Q�@.]J8"""".X)z!Cei3g1}twp%\G}>9�1ydƍC˖-q=`ڵX`:&Ls9v;}ҤIٳ'::9v""""R1駟ƨQ0zhlڴ ڵ?;]q8㻇GӦMpB >CŶmЩS'̛7ݺus;m61_|pG`̘1k*zDDDDD;By{x9%!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!""""a�!"""" CJYp!D*V@($#rDDD81QA DDDT. DTv ,DDDc@VD!""jX!buqc�!""""a�!cb�!:!d!""j@N15. DTV~`!""j<@l8H6Q�BDDŽ5!ebH)yB""]U6 V$\@(!Ra!""R0Q0Q0Q0Q0QjNDDDb�!""""a�! DDDT "* C�BDDDDD�BD%Ru{@h DDD჈�BD1|Q@("""*%ADDDb�!D>@ """*"r"""j8@NH)D!"S !DDD U U U U U 㨟4x%,""ƣwvyz\] X)!wIuMDD+ DTkz_~5>QX|D@!d%a J8,$pBDxBD†"%dyVJ>~OIDHIVPe�&"j@j;$05l DZmWAl*Q%g"*Jm }AWabJj' DDKa!"@Rںu+ ֭[cwGNO$ZwÆ ѲeK4k ]vK/η~#8eᮻ*!P?DDc@Rӧ/_;GqOq?r;vgϞزe &NVZaҤIݻ7,XN:)tضm�NRyŜJ;"H~z3˨忣DDu$sb9s&�޽;>C\wuׯ5򗿠K, '��ѣ:vÇ7[gٲe4iO}ށQ1NJs,!q#TK!a*}DD]R={67o > K.]m۶n�L& /˖-}ܹ •W^="jJ x= 6'"k )^ڵ˫ro�P]]nG;fl߾z+0מ]Rڪ~vHDT߱ V 7n7E(6mr++0~x̙3{MT'B~湪c$j;xߺ>DD"z&bРA8qꩧaÆa}M߿ yJdqQ1~V96mΏ[W/ n:̚5 7o�lٲ$͛^{Ev8c7un術!8$:'}ȜUV�:u۷o+WM[]]?ТE hG}4�uI-Z`e91אi5cmHH {.n݊YfO:[]*l5k`ٲel6iӦs8��#F+9s&�`Ȑ!xWЦMZ8:B "RzTΟJOm+]""j+޽{W^2dlق6m`̙?>Oz%GᅬC9�0x`L<}ŸqвeKs=Xv-,XC?u��mڴa!QC{N}S/H翡w /G"$~Fѣi&k?8;|8m۶SN7ouVBDEo rTNBBD;#c=o6SR?CuolkҜR};BD + D U>v"lsIzr"d8v)jַqm$jZ}n#"ֈP|c�!:WoKi�ַcХe\zC""_8r D#V:T-+<-f~1ǿu1#"*"W%ZzK :d��+Wڰ,v oLl3%QEDRC IMrRr#Տ"I4CD+ DD)rbTn׵,UЏ +_?obyߍ/u~VO3#,$^CeY@u8-""q9U!|/H1]]L0j烈BԷ}P}ۿڸF)]JsQe >#5v*u9nݣF1^.9^1i3DD DJ~Ӛ**M@ Bُ+]n]T}Qo~C(fB(V1*RcƄ$ "qhRq*eY!ƀc@vA5|TJ]pI2^$OǎUر*>+r+z}"]LChV]%�bE[qdA"1qϓfC"ڕ1BbIާdjxąM%9/tcJ2߲wݙ{ >!qH>OzsrȯB,6BhW�BndRzLB*>iQ}ϓKwbKZ [ƜVS&K}""*']@cs^_jz fW[*4P?m%$Bڐ !D15p!|ԧeʇ~\H9GA$1qJ*WnRiƄ3R$FCRƈJ�BTAiMiUG9K]t*%$y-UO9Gg^\=*m;"j@*okc n']_Q H1WJ:iOϓG)գr*ݳ1`�!J~c]]_vD)g%$v*] )xJ-oPrwJM+j -|4֯ͿVF>b�!zhhWnUZv��,[MhڷB 4ݔy?8f�=rWB5ԧ剈jQ#TJvQmT>BKئ^\籘ςJܾאw-͕LiDŽ7GD>FqSuP(( ,`ҭ�TpWh66QF÷Ց"ɸ4 m+#BD Q#lEߣIC6i[7i1+i+.t�`ɒ-%wJ7ZG)o\qa$l~P1  "rEߣ(U&l$ԏ d}Rm8a*4XQcHBc�!I\}PfQ!D`rE،kXm^ 4kk IÖg!Ja�!%iXDu{4}})f̈\cDʩQ*jXfwS8a +/fC:IH2QU*Xb�!eyz\]]?BHrWwrR^W.]ŋ7BiΧ�'OCiaˇ=OzT(|N0S\Q�BDN9Gc<ۋ{%8`-)>|UjR1%Ŏ!IR|"k Dx,UЏB]YiH bS\,Uy�ÖO@ ki7ﻋ�ݻ�x/ru`JH́QJ#׍qEJ^a( D](UCU I;#8dNZQϫ;gz{�W_·mq �'�`YɻcR\QP8칞fOԴt:vTmY_x3EuIH,O DVՆB%JTW!$8?i$?@�ڵ�K��'+|Mq[h> XeBHP9ƈčŅ=?jTDT0HY>qXm5`]}-o۪a*טO2>(>ة/!8V� 7%l$^y ct ))whI:F$,`ŊH| !DTQOU0iֶԠQMm<_z re[㏫pYI^šf1doɓ]j=Wu! ~nUPm[=dDx>c7^"҄ }lLQTJ<'9W1F( :Rc. )c-4ึ_qN�ygGATk׽s@bѢ|uI %iRo#^5 w[7mKrwjJ&.xLMn8B qΝ�,[Ml M3F$阑BUT P| ADQk,Րb>U>BgQ!$^yel[]t7 ֻӜ`#4.`8pjɂCuIU4+D@⟮/{q&兓T@tkWխkɒ}}w'#. IvU>–J7+MQ@֕*` ^ǖ*@KnV{f^vW sLGTD*|_Hö%zj !_,$`esMu k �xOu}ҕ5=}(‘[ en;?IW>,Y}uz] bHE2 !DQ=X *g%"Qר^qo�Xtkh1R~#q>m @?SV`̇kz#_"ܖB.K>ܟ1""sC9߬}ҁȶ%:wn@ucEGڮ># C�BTOK]6~m I66DU;~}B!$>B ܧ~0�`^@t{ )s?J3N!*x3Uʌ7M/f~Ծ']v D\Յ~!I~cQ McY`$<.|lV㏛�'kZPLpu?=�0oGyA%Q[nX!a@Ϟ��.&q;'IG+ ƈ2BD`�!5݅x҆�sZB]J !0\GqPq/z߂|a]JuR+VHҿsc8 OErK溶Q HTE!ʉHSU(?rWA,8@sʕv^�(o1 R<-~]{셃B˛9uƉ>A]^xz845?5ƪ�aݦ }OX(*,ɗ/35\ϣBDi05qFgm.-iI;8 υ^q^7>t0 zjzo݃:UС__0/׫ zy"SDE=&, %nY=.FO>ޯ$v~CѮmۀ5km=뽩*] ,U0P[ƹ{zRяm[3O?mu�Ra�:G\,آ|"j@Y8Xc!/Q)iG)@.]ԕ/ &沥V@-޾tqB}هυPA%M ;/R }v�ۋp_61ޕJJ?C�xW+A#Qۮ;5w^ ),c_F?O> 1a! "SjU#?iG_ϻ{y`#6|. J/c1!qub38hpߛ$%|m38 >uӿVA^}N 8q@`m>˗>4~p[Q65�� �IDATƅB3#RJ6|$σ_'xaυd @AB�go7| zϟ~2/T5U0�2–ض@k䅘`Ј !f❫41!zmVjHZXu $!$n}"j8@(VjFaRIr4L>X?~GT#j^JH}Fd R]J7&a[=v1I>cϿ6usUU!P1%m{�eE/5|$鶖F<=/5L DTV~$|tn !x]utE#^<_RJ/F OŮ8/~�0k?aY_7?1k{�]))\e3F 9s>O&#bZ!a G Hm/a5խ?Q(x&�(7Ɔ *G iQu)^}BsǶ{y>Ğul\\*)Z,F0 h^ÿ9?(5;' ]Rx H‚DbΏzFsx3[>*)X�/xb!j\@(o,KU>tדWiH88MyӢ $DU$~�xj_I']'VO)@|\#:챺 ]q mszW/b"Qe=yX&l[I^+SԾF-|P剨0Q*ҽi I‡ey}G:I+ qCy>r_;쐂{] 3zZ6a秐`Ђut8�_jJzH1 q!"2 N?5�?]aK/kVH7)|۲KȯH$lUAM5˔Ѯ[| VJ>kߒ-揺7P;Ƕ%!�' !5%xba`̕:t�!%0}?Pqt�155a'VUL dBB[Y+n}v˯c<�W_2՝ $%Du*zCQ�BDP㦘�GXQ;�7B#~U(yCQ�BD $R_Pe#IG G%ÇO=Y[*E&#s ۰*+K'.;O Aqɺz?\iͽ?(J6_Y a!Fw] .cmu.1^v2`Ƞb*ԘNҭ*$.N_q={BT DH)@KIZ ,UЏ>už$-͏!pA;r[p "w��B/W:0뿃ڎGyxvL\j ?yqݱ !c+pGcn 0w$�5 ]Rଳ�3g[ #+RGX%m !A/("*CKknWIH#*xhzO?@'Wqt*525p1�G}.޾yAcʔrLo;IE-2 ?Ww2{W�bz L}L*Hڶc<+e y 9ƱF¶$|BԘ1QYiץJC1`ö%N:i�/qضW(BࣺZ[W ۖONhț2e�ɫ!$PR{��1oKB/l޴0,LVpV!1LBv1Q嬀t? -q9?�$n/xDn๮~BW o]®\u53!YX߉<8?y\׬d�rjE@J}xwq7OQG#aCO/+lLjضD׮{�/ނOl�XdK^U%,$ UH洸̏w|8̙m۶cǎp)0g|ضmz꩸[}(\$RÇnT0^8[WgY6tqخČto[wҕopu�eE?YRbWs`j^4ZO=57f8~{~d٥Kۈjuӊ[֬jQW OHh6C zfpe#MܜfbH @Rӧ/_;GqOq?r;vgϞزe &NVZaҤIݻ7,XN:]v۶m+HcRW\hj{w߶-Ч�ٳIo e!T4!P0yq#f2\ss_!=] uL9NZ1gN:QIY~Qr )̝; ,̙3݊GC~`E Xd N8�@=бcG >ow[k׮hӦ zg} #$E5v>m?-qɭ��篇/B!6+.걺_Z.?TE�Ct�Lr}X崸[I'�`„ymhX�1]t()tPE#Y0{ݯ5ЏynV>Lf�ΣB/k]�Xtk剓VAV@VJD00{l4o}M4h KK.m �dpbȑX~=^!$ufn7M^>nN|trڄ /ߔ{>lie !z;g0Ed^ 릥;0ceuw,!&Mz5]8h #aƶ�~ЁQ_p ,Er#k'S޷$*my1o )^ڵO}��zjt=on0dY8kꫯF6mЧOr QI6*VC\!$.-qi`8P]ot;&,|+]̙+p_xa'�!aa%xL:fcD]}eE>ۖTק?_1L 1v.m\s.Xj ; BP!0t7y+y]Hts<Y 8Q?:|cB,J\ ;5e ׹`j?X[d2ŏ I:B6n܈?2*ULRBHرF+CQma�Zl˗ömYƍCnݰh"r!6 쳏oZcU_G W aC^N?48eU3gs|c==#ºOǽ~A¬`gwmp�_3�qχ4r`Ĉ��c>gܱ[mCgT,\1~\!p?�?/mW͸s|X.:�0}+bm'm)Ymnf}z$xm�T$lk6zz)R痺֭+bω*PxE9}mO}dl^5܆mKzA�$^xᓼ@T$luyZN:d{%1a‹n2 uѯ?B�Hi{-rˉjھ+wml6�U jY ضĐ!'w <~u|^n]˲BXFٶ�kѤIxEu 3%~]x5\kQg~vsۖw~)!@R8sb֬Y8SNE֭}W [/DzepPM6 ;w}֭[9ZPQ`BCmWn\ζ%zh �x煌I*$R t쨚7+WډBHp;Q0H {F^0dlٲmڴ̙31|L>K.>1x`L<}ŸqвeKs=Xv-,Xʕ+1j(s9իWchѢ8Q 9|@ŋ7ralVHԍ?_jZϲTc>U G!q0x x7V9�+>Ǫjx ^A=z xA8�5q*I9݆WH"WуY:4D˒^)#;_j}Յ,?$ !,K`j@t^qWHDP*H HTc++0c�I駟ƨQ0zhlڴ ڵ?o6m b:t(mۆN:a޼y֭=cǎŧ~ �8qgbȑhݺu(Y +!K=5s~uݎ:mHl.qob wgsr='Mz}-n 1vF#=|yw"DM pm#GNϻSu~¿wE&{8_��5ju]曟>!c!*^!<z,PSЏ-¯~e;seu fE;[qW =X5# !u^]B1ԬY3L0&L\fʔ)2eJVZaԩoժfΜYn5iDؼ #v^}K7hha]BycRaЍg!$84sx ǑoO]wkQyCH0Tem[[ԗ2783 Y=?l9r(�`,4Q]2}^tUC> �F! R -<6a$DA=D b0uw}Cu83x텅jI`D_MG�Y햬\(|tRV C$VBD0QIBTtuA7'\U+{w; [FAëh\סDX A!? 3O&& R t*eKli0!$|"�BDy[TB%GU(4_vs~>{0CHptsZ~X@255Æ !&Mk|s_�8 ztdソС@JV:cTb&nݽ|5 55YH ~ �o&MƼpCcᮻb0[~:72 !z;瞯`"BB|j}ou8-p} [CL}KfYTUY:^+ey1^ H.pdVnp[o=Bt,B�YR \{w/o/Tvʔ]u ѯ[3|Y҈ I}e;7�,[ ,+z[af!@^ 9nG-_ꐄ�'!dCF^!qD6cLaPB⡇9tc^rU#T87CW�_qɬrW\qO*{o AB6k9<\��ߕ{y1|ewɗ'C{�0t}ի^sð, ¦M{c 7p %pMO‰;_@lE_7Q R76N]0pј6] " jM3W2AR~͗1۶%9f7�5%vBRy}w'tu ->CXp>ļy?=�0w@eq>GW5sjDƛ~셉c XxTc89wQS*XAUN@U]9fϯw_˝[nf#F< shɻ_zqw+MWo ϗeYEcAtvr7 w�b.eLކs+н?km?odhY%[ǘb^pI:Fj\#luJZ0'ݯW_"p /6 !}e]!}$!' ̐v@:_z@ S´i# 0`n1c� ƆtnCV )%lS]t�GÏ/7j^g]Fd0l�,8/ 1b 8ΝVn\Hpq{euݔ>I;#mz? 5>{d<٬5|M^%Y@mh0tu:6e\@Ѭ$V!2,et,kLX=Tj^78 Xğ&aYUt"lմqxw�] |T"lݰeQsi-1x}-Ư}"�`ҤWq=�K �pm>VD7!y\ @�d^~u[_ԝ/N q¬r!!emV#¶]rªVHoS#*^O '¸w~lqAY p;l[@q}@A6+s{l`*6`8gu4v~/Y8B-)C3#3x?��8Uٹ3L<s7ߴĞ{~3rн|3>rm[^nE�׿ Я-djx01u5}_aNuL&lVUp?b2`Y^ ]y%ru5˻|.V2‡f2SVOt� vJB�^x_C jA1҄b9=!cYrWBLS s�5׼SX1qoK;cȐE"&Mz٬azAJ?q0Ǝ}vA:j7DW>c\vc<r~md!_⦼RJuHض7V ~'[_M֭8E9n{7-WUs&=-]ZA `G m۫)^7dm}v,8;0{�[y5?4d27\Fw'F?�P1?~4TUF$*ne?�9w,a>  )2cۖox7QzF>`ӛ!DWjBխӼV9�BD% V.ӀB6t#j1f%Bƶ%>pZ~}Sn]6,8�/; &lڶĸqqwW\qt <l1pxfλz|HUToif6wk�88徬^m XxG ^E��`}.?o�߇g@s| Źl6oupࡇz˂mjcۮ½b>8Bnk_?TZ`L=*[ 03U@j+BF|u|8wpL`?bn+I8@.Knu).|i_ E!87LiR!l{! 8蠝x5n51h�ZXkyW:Hzo'R$wߕRb?)%.8j�7oenᅏձྞ*_pwZU4E3{5-࿾~Xh4kG j� .T(q =| 7dt)[M>kY"LA>7DWC0LƆ_PDa0sѳд>c+Fk!&N\' Ъն\xq|ưxϊb'Dݱtj?þ /Sxz\@Ѡ:H) D"*bBm�wvU IH4a$l٨aYI78V@4ۖW5+0.ܮM#SQScCwr֩^x"|~c|mg�8PW7O8aVعN@Cpg㶯>8M/�5o}sk�Ν/^nJy~矨χmcY~;�CPv:ö,m@ !/e[QշӺ>‡=\r~뮸EmLa6, Z7!ܐq%C ԩWc;8Y㒼k9P]0d݀+ �opU /0t<;_%a8s]Scc8aێ{IݝR`3B48%�EbH)l�*eny۲s�`;^|^|s̖R555+eerB z.4o%.\E!/\.k;9ͲYlu‚Dc2x{ϾU=^@ଳF_;Lb{]2JRbP1,5+&sVLW1'FPQD颢"(" aAHQ]fg5}}CuuUya„[ظJmo! G`X]Ɇ +*Ћ!榛^Zr"Ibs]8xb (>W!V; */=oy(Co^U %LNDV$$A[U!!e]k+7Q!h%WHV =_~yVIS"ڏk}+A`c�3ͨQsWs≷QGw4{ FF,|H:EvۡK}kj nm<̙/bښLƐh]E()QR??]Osqi |on E) ?v3bڴ ̱W^H}l>&O}|&@U~$ސ ~$$A !}W#U[UO@ᇫkJ,i1쾲ãrƕKMF><1b4&DaHVv u!>ƫqW {+o�xZ{L8W[+X%):vDk )�R. nɆiٶt|�gK-:}�z܏w+`{5h{otR~M@HljH4Dâʹe!(lRR_J^' Y۱#m]h1nCL!g �jt@FR8n}|p]|s^yeb5y0˼q8/HU~␐ -Ԫ%%?ż&k�is$ @۶G0fQA-;w,�]f͞=!SxKu;9ޣOhͳqPdd7o&-r\fmH <!<>ƤuG| ~o윮^]05@\vA<T3 KP07<yY,qztw;o'7) ${#! $&$v*KB*ӏ[ף2г?~ADa;'0N< �=u)oHOLHfLl-n_uտSs'ԩACx%l2b>22?зy|#lٲժ e MۍrK#C6 �kw?i6m ;%b3s&(,|֭@J"2h2FZ Eކz"=@J%_Nb5\N\ULGu_GƎ>EõOe0.6EsʹAhv\|#G~ Ӝ|ygnjĥsL@0~|~xk@0qb&N\ y+}{([H(ًeUK$ސ  Am"L/Ok_eHḦ́T 칧I'㵿Vgđ|yOp]M ۲VJW>xFKs}bzx1&˖-^-(XA^{R8˰yG<}CC%tЃ79qcDMf$,c&\4g7hѢ? Nqs$i(|8�vXGk�̙#t~z0EcK(6/Ak7fsu;v≷KC8H)I4Df=\aT]wB9|Hn5nug5bDL~&MkeKVZ}# .Տ2T!Zdڴ-o' I!! $$$zÝ Z)qkUeݷ,ʋ/ΌeC^ +"Q ne Zk_2"RKעc-E>4\r�ZýCm*=tZ9<ܸ!gU[xhW͛#l [SDuzNi%cFxcWj!KM†{me?@%(_bcYY]n㏥M XpV̙;# RN"uCKu]f7Bv=_M烒d{f M6sG,Vn+o@/|md@mγLXK;Nf6@Չd 9!x=qOG6aXN=Uw5A i ݳg5�xl%H#! $]{+H[/Z,WH% moT :kw�S7D h;DDͰa/ G/8cnD)9c�u)b.Ŗ-;0eۙ1QpB@0h-dZpi޼__c0rj g #)= ?MR$649ِDNGaXFܹc()iB~X-)`7x&m 7R?ڛǦ> Ys5G=T<Ӏ7"DTJJH@,2Ͽ}{eߩkM.3od-/[V;80c!|-FՈEY>QgI $$A~/MHyiӶ`k>#jAJO)cO4hxc~,~˄DŽEQDEX lsϻ a_Bv`RjpWgӦԨ={裇cmX ]�&Wk}/¦6cc Rb$�45V}R-�r1 @a<)nlNgx<(֊~ 0fhѢ JyŐ4#^GNNd:dqj&=2w̘A Qr<، r8W'f[p] 9Ap0;VTkXa>"C4mҌȼeCڣY}O\1P1#샵kMZZqdCjDd@J{BVL-4j?Z;u B'BR4mjnҠ)t֥.۵'<f[%-wٓW}Sw#BOokf'.F)A&@K%V Vpn?. =aJInj�]ǹ+iTd2⹇Y)(ekFvq7ZӞy `^˯{K^5d~}"۟h_`U{~u j5A͆ ڵD &!z!AEG\:?rWnj}wf4m=u]ŋ/Gi11rym?!ЄcT_cB>ZC&J.M@Ga6oT*"C_)k�r2,X $HBB:<R^|mD Voe7{Ǝ*l] HV<4sMf0bd<ek Q1_TFJ=R?|-[QJzd UbB.�Zj훁RjuxneWȗ/VSk'Ӻ W߃Mph )B@ZBo{`2ZYud5"\8CZC^RLCt~*ҷ�?jՑ+?z⋖-qHv,Czl*fF]Bh;a}x`08{!Yh&Mq5p¦í4^h\$$vSMmWDs#E٤#!! T I [ )ϫ5>dϮbW+,ez183�/ @®TD-z,hkB PBsͯQRb{9V e=NqIkj?d형1cLݣ;|ؼQ/4W79[YtbLqBhhÐBS^_ߘanGZc "֨0=h*濸 QRYmRM> y1ז"qLV-]DmG 3BLFף�,SEރs5Kq |cRy?z6nܞ5wO=<ţ^u#1/8S1BpH=;<+JB_&9aHt.b.�jIeYgH[HHH#! $*֒0e`L7+րP/1s\A< #|!X[ NdaR~][oWaQ5G'f3H-23Wv퇔n`J]{wM>Gkؼy*ʇ3x> QO(d֘Y4؏5kZ8KЪan? \ձ@fzL4� |oq1�g \;cV{ )0!`JI֯6:)KٹsWڄy5!Id4bŊ7.҄EpQxc!h ߽aZ~?$H"! $CPrWJ>3zzYMk :LUU<'�0dȳhm,T ϐ$SnExrq~Ep]MQҺgjoڵKrJ]®^JY&%p^^=uB"eʕ|dݺOZGt+aX=~m7G_jH钗gt~)66mؒJq?1;ݺ?L8\<.LJZ"@xM> ƞ~y ga-<4   u#_١WJ!4`Ҥ8N~呏HL $H/CE$k-(OeݟbWE*kv^Fk]{Mc{gq<͇SaWCG4nLh ;t\y0$OO5ԭ۞ Q-j5 B6n4"jz IcB#{hÏ$' ^' ?/VZd'yBL[C>7xX,~JE= Ôd%]1$ fF%ٮ ($?7R-�ʷv~ؗDl;�4kvxj)@1{z?76eLqYŤ];!{鹎+G�\t#9%1%f?_߳"_JDBJ;SibaY H௏$HO\?;<#^UEe=1&Uit*y+2S Hnz%뺸{X8syyժ-Qhs,ωtE;wDJCz{ٲ 4o~Rz4jd2`^Jͧv}Ojܝ5znjmN�4Rc)BtO7lP&,x*BOh!q&1LzBzڰxlZD:mt"&\K7h_{tâ ܕcq{Pl)-^}1=?T9UJ4Cz2҄%TWXQ!S^TU Ǎ̴8~ �k[V7 Am$HOAEސ>T~E};6moDo1?g?s_X6.�ߘ4qDŽ 3U oV6Km+_[p]7CӾ8kխs}O Vx9f{`a!ׯd+bӦϩVmw6ojzƺ%!)l>ZߢT?)kؕ�wHSP!PYω.P0Y@j|ҩ{hqS\܄8lvR4͛%E̦Քܲɞ+W2aL7s1ݾ#G!4g JI~df<ן36H:<H|| >蠦￿JDxUJA^M۲MN AՑ <[ yjrp9q1xp�{RZU=ؾø77~[C;OK*O?=M رס-Fiӯ^'8X�թ˯t~R)E۶q]+ZOBVJM>fZP\lD=p%eDϖﳩ_ϓ].hh!PFoM>N=R~_pt X1-zYTl^SP>}/`,D2GudW/'7YYK2bػx QS,lq"K(ѣ:{p+H }[z  I gT[ ^5}Yg%{>K M ˒Vi5{ K.y<֟'\Wz|9㊊@٣QZYw(,fxJεZRP;C>Za  <[Α>/:j4`"Tg2m;M) PJE1%˄!h�V6c;,^<!m#M,mu2�cڴ).n})7Oʡ3 ^G!(̡䥗F8}#8x≋xssUxqh-7\9ހ`iʂUߣ3ͤIa,r +e)aڴA{ $c %-I=V٢6ߥԾacذ+)ad<+)gu/7+R* L[d  m+䣍qɽ0oT=߸@S^K֮Pl4񼼞d2кTjWI|wր�_mbo�A^ޮAEumVu7{�BxP-4 5}g:;S. g2E~hw0G[ׯgFa!ڴc(|RDWĆYSC箻& sd;Uo+ z:r- ^E&2 $ eH~�0n|gtiC^5jZ`a.H*e3 \WrՇe^)!\qųTZ0rx 4jԕ� x �z�MDG^dbrR?6א!RX@:X!XBR)Ez{c=%CfWX:&C^wJZkJJL6݂JI~Sl>5+EA&R Iq\:v*=C@~djQ7NA((E&��P*dfNJcّ~`d!<ȴ]0C"GAA#@yg7sR2 $HiR{l(^G&'ヌ6:{6ز eYѝts?aYBfңN1NYϙ},ᆱ8|d-NW N8#Bk-7鷐|$HCB@$HC6xUHHm< aHJaXoUi8upM 1xo+yn'? >O.7|DNF vk@՘"^hƺh?߅HYH͚{iqZB64Z+ޡY~RapXp qc8sף:.J)lߐg%t�� �IDAT5 9}Nԡf!!q<@py#R㺊�W]5/hR2F>*ʎehWFvJ\HGM$$AJTD BBr]W E^G{+Ue=o 7\$[MHV%+Vh [#~wn{:$cGӸO˟!JF,-A v}✉TTeB\ѻ'#_AQQcf7]4}7\Ӽ!McK}U{s]Xh9(5C< ͔wfXδb`5-~[ժa˖ظS~T`lHҘ&;LS{w>91ϗ=�[ׁ\ AR~EzQ" /l#\>X!|f\{ B7xEmfS2 bWJ͘1plYyB)8@C^?pUs+ݖuЯ  Q7$*XP y-ra ~1DĆژ3�cƒkR9 O<9k:WÆW @z|#Xr=g�pŏż1aCy$/x �s#]6[BNM%Hjsog0$@7K2V�Rp,]Ma(LJ][[)E껳iS(,)Dc& (a31zizA̽4`}0y`Æg^Q ,y!/oY1v=ɯRn^QpocW1<_RX{{9 Vm+JD7zD 9xOsz@v*%7oAII CMr 3Rj:j䃟ײ2*L$#sjFM,ΝPR3g~ @6Gh82f,]MCk-p ڰTfjryT1Yvq!jjw$X"K%(.A`Žv{J͜EPnв6mSJA)Ͽ 2T*RN)-Dx}ow*{+t:ґ $HOl1iBw ǁ/[ϵfj~(H8(vT1nܼhGC^R)ɿ8㌞plhJi_ϡ˃#M+! sGs]P6mo ͡^R.%Ӧ<:g,.} }s_ ^F:i.{`INXa5jnd̳#Tboc g2gR0ꎮZ#f5JJbZݗ LGkؼxcjڝu$C>X'EѲ!~!sC7M{КwA{ UüO')y2wChm?#Fڵu_786%>N{!!qD,MHY?쳏I'b$$~$H@B@$H֐KcϜeddž!y|o@?+V7}ˊ} =zZՈ Е.I5cɇ @bapIhr}zPLnъkrh"\zu݄)ڶ=ׅ`Ŋw0B@'zc ͛"Ɏe8"cEfowwA15j8^P! q'1^9;|BL)Ɍ(*jL:o Agf4υh-C8+Ry0#%'<3 Q:!YRк9!сCJ/FdÆO)p4!Y7I&($/{@15cU ug�ģEE_qgԬ?A}"fl/EvG"߿v=[`'x3VcoW#={sGP>VsE<ݲ5ӧ? .D*<6=OPX:J5VIoѢ BdPJO�_4ʬ/f> i.B>ASЮe#ilh(% ZÆ FT^^󀄘6UYUãztv R=ӁKq"tiƍ!6lFgW_}s@~|Lrp]ŭ[o}=')+�>ɤ\T9ڪx$HAB@$HG. n(( R/K.qlJH>8`�}wY a蒭aBq>uxo"^?4爆DEYxb:"ʀg!e n45kNZIlҨWt[)~h w1>Q ֮ǭ^Ͱa#x^ppm:k9{لq;k}HX\k߮;Wմ񴠤syF cawhpR{3ԨRjEES{�isz gTW1Pl.* @{YdoCJAfxQRٳ_KH ݺB5kta6,2oy B  *Rz֯ȑpONiwu2BnalӜ{n&HtIu'=!! $$A+l bUFEYaY.3}<0YR874ȜlI=  ~ZM7[VgĈ3s#<]e2H!ˉ'WJ7M~l]ldl҂֙YΏ̉÷߾RPRHWHG&7BӤahs_7ۮ/}̦MSUk6LK„O dSH:-l2-hϦM?!|zޜ5kZ ďYQH+„0kIYܽ(MT:_ E îDJƍ "mcwpbmsWpMo G_\"楗VD/}D$!! $$AAdW~YC.cm(VxcY %0iPbґ mVqb+Ӗ\ysh #RF]gN:߈t޺_O]Ke[b3#۶ZiwGa7 ŋMT˖?֚z;V~J6o  ϓ([](5=/!@)h% 6-<(hEx'JH&ZPX8v DRJ~l076C{ΖS1BԨ*xJ\[r!%ԭ_~u�I)u(pS ӄz9q;Vu^%G.b „ +kG=I $HH (T*$$uBGyJ#1(:#7{_.RQX@S k"ZNKpϐxh)S8է/`H{ufýoR2Kn`,Uٵj{S<͌б�Bm4YR|D�7> BLӬ[7Z@-u3aZRRw"C\r)JBR^a-?AvhQ8%VOi-75NS W)WZM <[KFs6Gq^}f x wOh]s)FG,ɀyExbey;# ~(}nT&0dD)uWL%H` Q7$d[bE-RpAM}wi)AxtD[rм$֚!CDkw]XX22bę9s}s ^5裯2\WqWȐGh5s{bm*EߨIwx(q{`,]O8_Ѹi<(o`H:}]O06;VI4gc pEA ~ /{@/Ze'}ٴ 2!&nH6`qd2Fwci�ZkN(*\vSP]v2 bESkg] bΜ:v< JP-ËT ip?];K~@i޼_=#/o9%%M5x=9ߟ\Bsq^pJѰ$2~6`z9c}a,PRE{{hͬuOkK>'neΤh_Pot Lh@Οn3z)55kƍukSzAӗM/VBitzxg-Pj ?>ZȚWE"…o `gܱ$zr�\p* !4_UUCEN-Pg~g9Ox< O1l{+b}րH Sn J| $HH =I='¾,GF6a+Kk[(]<pvkS)ym{СWN@*>ClU4^k7^)Əns/j[�P+DJGЧ |Iw?ׅo13sceC\Ҙ$+WNA}q1{fÆOZS֞3Z:("r~lٲڵޡШ %)Ф~HeIS9vbNtf6+gл﹘z%ab*xK_i-9<� y:G;ﶾ |R)yKR)N r= y*u!b@Y!A I E^YHBmB~?\&T堃Š鱢s9´,xE N3!D&CJX_q\Y QNÍ7؍{J. \Ek fԨ+;v8(?d_j&N?C#5[1l8\Z՘:)OoGQR҄eFE-V+aev:Vl8ڵ65SxTJIt4@yֈUa֣=z_ia7n}G@aBdp B&ӄ_CcBP\ܔEޤm޶ׅU&E ?mooX_I0fZiP1C^Aݺ})K,h`G!Yd"Bڴ9/x`<B3Y6|lܐWqaWJY"%ѣBWGwR۾{Ĉ+(5`Ft (""bXWPFbIL.JZLGuuWtO8꾮sWwρzyz]W98O|e5CO7a<8 %<̿#R.'9�}:cƌ ͛tRwN۶m5C aѢE̙3Va-Z`}G�n|ԪU+طYflV\q~|o *Òt>޵H폓愀>쿃NJW'RJڷ+gFg^ڵtA Ӓ%|\6 %RmV#fH7nς#Y޻-{}RJ,@F"D /hР%*Ub97uUG!VY֬y:urBE;ҥ;J~ٜjB愃F>@lr)SoP{qq^:3 sS{#l+t4n{.$aa)qU ]Uqwر UUdp/&L_WޯT bb)ߴ�߿? ?�5.k׮vqƱV[ѦM;r9[oq衇{t۷no~l�|Ut5Sm!W$ ׅ9sD¬9ybN邨#tx �CdKSrKk=ykք= 9#*D't e\ RJyGzj,Ar;06bKeQoE0!/ G#EhxV5j=3Bt= )e$ <?eܸ9^p�O~8wL̵`88zJqIr9ܹM;{cRҤI;cޯ{ߋ *^e %ھvXe؈G\ !"p]2/[ShTm&M!K͝Gpk$<3'$qqٷ:뚉aw曟q"#b>7T, KTՑR%7+@rM6[~ >3N>dvygwڕڵkGk׮`GNͦ}|鏆s3h.>F2k$2a IJZՓlw$\ :#%\rIG0lXW}L&?B~b _p,^nFW2{c[l7k";@JQ+tH؇>t>d mM\\nG�?eq?ƨƭ=o'E?^հ RU-$'+W-Am;̚0B^~/BN8_� ~`cy*沸vG2 q#FQ̴V9wyɫ~Wd I;bQfȹ#<]wE9Sm[nSr`}}vtR:(jԨ3E}e/bɧDABJx & " 721 2IZV{n >o祇Ʉ"*98ޱQ6l;WGE6+r9NtSK?H9q׊}wU_Uk륀 [Qa&cNyx_õ ڬG0V'˹,[6 1xfmӝ?ƍ&v;|Ʉ LJ^{_QeqAWTǁ-XЦͭa)C\Ν$ǁo.v6�wϠ_Qv͚MBzE/EuaYb ݺu#9p@LСCI&3&  jܸ1 ,[ҥKiѢfe4hP`w  o 9 *t fZe,^8~y9!)= ѕPHCJe5ࡇf} <+|};N: QIÇ_ 9qTm\NC3ۅ>�ˁ/gdmרA}MS:dP7vn4n|{h0G1T!]w +Ix|T@q㟁,'S`wlj ~؍S 겘B eƆo󀤆 ü=J?41?z!zfV_tt�GBOxI܎P>v!ćK nɒ%�l6,\p3x`}Y:`O>IÆ ##\%{e1w\׿PQQȑ#9Cam?sZh_~wܱڮb#R"uauɝx;2-0&9!^ 6t >f}eN(]ю஻ڲrԩ52r#+I?* ?7" GʎLۮ'X؂Ksu?c5kz|ΫU Τ"eoWMzk @Zyr GPQ^Jv=lQV#:BYX;f{-5:)]>d<|:{}V .|ʸAs2J?'fw \$ig\tу tݿEqמ,sh~՘80z{8nԾRXīKUXboJ+&вeK;8:wڵk}3f /F ԩÇO> Å^iӦ w}7o= ⣏> FU-bٲe 2e˖lٲ`;HÆ  X~ Q#_TbI{l͙V-;%;0!`6 cڮ?iBGg#J8 :KcPԨ5M*Q& ?QC6jt R·o#e|D:z򣏞b"H2Bдhq83!H�AsX1kXa�8y;8[] =m\8߁ QÆ{}%8픲L׭QHFUbR)+&>Ć!Kiȯo^zrJk/zꩈ#yvѣW\q?M6eqv/O?EA-ЫWHTM8V) R7R ?s %Ndh"2bT?!~ׅ3 Ŋ$!a�óy A ЫH 74)sa{Ԩ!]{֮Hګ&Ʌ>οp,3i{聸c.~6_r%-/O?%ydcc;ש_8̙3!D-d} fTk*LKPWH)ذagh!M+zUV9L~g{3ٛt46G!M{�!Z]N?XNkذ8\rI<H+: 6I£HyS$͛^fZUYVLX,Ճ Bcc;#gU6EC Zo끀8R x\u+WnV8 _/\؜֓l;2xFh˷ێ'5%K86v9M]Χa3k~b j.%Lq${u7EަIC^g8mR̅?.Y ^@5mڞC=w3�sՋ�*20+k&M)u#u#kת6۬L ZT\H$B"iۤNm]+O; &*U('$ob bP Typ5n]*әUԤ i.:'~~3Z}Er}j9jٶۮFfU ņ Q@,,X0_7Q)񡎙! rp�ϴEr!<-8&N~ψs]mԽuq: j!f$"M|TާpD/=?s7=w^{{W8*#KyXbX,ePNHX鸤HQǐasR .fF:*#yk,\3YSpXz[v5]< kJi1ȑ=�5|/e*wģ>8Cs^ªrz5.P履p!m|Ȟl `3O6#vpvi,}8SkO<Tfͯw"r{hgelUxY*F.0~ժ q] <B֋1cr|#F\-|iXСKfIر'`/X*M=ʐJi]eӰbXbrA ᄏ!دW؈ò2UL0p]t:<:g#yGuoGaVC!$͒IFvn' PNor4k$[Vldk6UF^pˍwq?~!C5zLZ;#��)M^a_߀5iN8NוI  p#t^'O?[$>l2 $c> v ?ޕΝ*WϪkN� 3fAdS!O<ӫG ;`G!j,t:8O~.w3 v5ka뭿'\r51vvLx7{q[lzGqT3H$^{{q2k(ؙf!+t@|pwWPAFJ&?74d_q^mXy v`l㑕�)i8@#xjw\c룏Er8C&p79pfuvݙO  !F\s/hwU�~8iX, W}p�&,-DLX$TJ>  QC۩ꂂɅazDG.:* q@�l6 $; G/#ԮD C^@wqw1zu� kv$<)w/>c>Z7YsY|Bm dRŇ)l�cbܰq#7`=T3ڷ3+8rVz.*tq{'?#`N)mqɤ8LEުYm={MIb0VX,K9!zT( O)%&| V%ꑢ /<<ĺqA~էp0, _x\zi <+ v5RJ;n;﮼*W4{Qzz\S/ֲsLMrBP8TA^/]zlOu$Ƕ;N~^AR/ix&:Q NNcvϻp󮻱k:8\tѕ葰T;%|2hJup 62u׍@޽\A<طZ w@'inJ},刏_KX[ b)BiF! 'VUx̙۫A:!a&cDARS}r ?bV xlJŅ͚"c(3l y�ԈY;us\x3}ohl$:_D֭{רy6UΈzn.-[^ U$L8T>i=�z Fw8|+Ϫ/'Z}#!;A;(f>H)xBpfC'D.',]rXy7""!J@wYVjcs@,_+@,T]v2qॗJbk3>o^r`%:Wѧ$xJ�vhaIn �74o%"RaXյ+'usdk&>SV͛s";<�nݓ֭{jzN9zƎ@۶xSnd;rKW6-[ر*DoJ CtCy�\`\h[Fn-<&np~3px[B#\yp�xeuHX劏 òXXbX,$3&:KnL') ۪߂üxhVq"Y6x} 䩧^0Zw=<;k! C<{ghh7xn>ڍիqr ZL8ɠ`>^oOJ5ל~f8qԈQn'BaX�X,*gSD^9Soߣե+17stCHz-ݱYS0aLxE[OA D8\*o[dœnL&K. D[r"8* HPhv\D;#$>ԴY\mj�ty8)ID'{hL#u#< ǁӿE@~N9_w~q<:hs@08KU`bT!P2)Py~%9r]x"$),+)'$>M|@رg~Cw,ahTRz]p-}yKPJl\v ~2|j.HHW.'|Gλ;pFCo-@L|fJ$wTyXa@u問jUmx]7 bux8ŝB^yЦ*8~G7P%:WURow8Ć#K+@,)W@H}w:ʥ$ۑ|K8d/C1no#3GĜWϓGt]ɃNPRʼbѿ**<-u뮥GQ{�\sP\W ](ÀRraqUDWp}Pׅ aY:%.g(:y\NaJ<A^y1'DS>oO-3}orN*.rƬ b R͔#Bi])cdv c+愘q1'$ -*eUÝw:ƭ> 5H& !f7w6oX D�*Ge KAr3p#I]7w2EG 1yGGy-"0#0!VP[b/JXeo1ʊx]bTV`XabcbT_NF5c2Pxަ(1u}a(EMr3~3(\~~?fpz!zKBvQp;_![!EEGr�gGDH!!d_k(aZF9 p"q, lQgNx4� ʚ5RHzGUBK΁w#au<;wD=cKX6RBݺkaB0B'\ïJ(0BqR<31;³BǧqAҜ IT׹,_3VX,/Ȧ\\NrA#%EEH-ZtDu-fȐpi!%a3bUu\p��C ˜�d^.J.>W^I<>.>B~\W"wq>R׏um7lx Y6n+x \~ A.vUt<0">�L%0.`@;#/H㐜#RHTTxd2*LK7sߊ }۳j6xےdb .]1{&LGu;23[T^]ۿg\ n p�= ?#Wgb!V#Y$=x!? ן;+F!qP7AT -lX,M bP"D:V*|H0:cĺ.̚8Gvag2a5u83j&fO=Gkk{}.uywdu=,8Ntt Q:޻xcƬڼvkTgf0]~.$W^BH6nT71 .]щt'qYJ9%5j8 {od ·�A~3dF\$gWuwσ-GU)H)XX, bQ"DJ~}wC3EHiRL^~ݐx_B(t=|)%WC`[Ǒ >oK9~ M$b&bBu=np z;Dxq5�|d2*DmK�|")p]!sv D =taZе(* 0Yo!DڷIBXJAfJ͞&ZT 7O�bJ�X,!U-BTRb%Dzt9cvPo=>RK/}7R1A&M\ަfUؕN]MH7=+n )݇"0x ZX!hvo@2v<19݈ЉqaN'!f'_Pr!Cmu(W>�УjԐuW_Xe!ꪡ#oߓ:�9MٟV0* UR?q.ښ/(uAJ]oX bPLePX$ZEH\Af*)Wdǝ ̙B Gɩ Zep=݈rs浗+BLGݺYC$Mz*{FЎӧB@Â\y!zDU!G.#m}�.[wi{ yW8+PNPtM5)֖\æ~ +!ДEo'`;qBk4NRo'L,BHƍПvSB#iB$hkBDB 9!a!A T]wFqu=9|iߦ:${∤ }|am%_RA9.H9+#?:VX,˯$\$7#m}!$ ׅ7\k/,>Zk2ɓ?;Q$iݸxN>EN@^xЫh1CtoyBs�xhnih1aVoWu=n9@ЫWk@p#DJA'/,< ZE׽lj EH)}W ITgb#ab($BݎbHUnc'uᥗ;:Ix|ڶ )ga&Li$~?ܐ0/)*>twO r[o}` v/�x"xhHK,Fd]LTy(U@$iӥNJ 4�X,_!U%BPʺ!ڒ(fވ5�0efr@ԱaaHE6qD)VAB%낅5ju7)GNt|`rJkqJ0u ېxSH)�:tnH7k }~c QVrXXbX,R"i}1ttzJ,f n⺪`:wM"+5C} O$,.<�6l#lkSEH<£kq9µמ�wODJ-ցͪ> **K� 8lVV7MJ^Gypi�0Ă5_g1QL>IۿK rF*xzV*�62wI̘q9%RAv{ 23>GrjBdg ݻAp 8fL)X/M0$8"Z (uE.fKUtK㖳u>,+@,WO\d[4bUqK!"uDT \uwy=O?5}ƧSsgUG0e?)=C&ѷKTTx\sMKV؂?{1"Ͷ. <PIxνF3r<y"$MCX%8f]Mr&<=v�fvDH9BǷb�X,�G)nH\.̝c B"m}ɩsizm![jZ"!s战EκNTׅ u2^d|pݺg8%.yjL%R <ԂB}Cr7<8묽{ѱM?Z9拉M#9b b*Д‘)62VұKBG:aXD.'iz@3)I|u"]t0xeu)%+y1:'ڼ+~i^w,s90r仩Xy ^s"P1-zzNH8-4�X,08:(1&L+Ys@m$dҤ'~ON'@fF Ap Q (穏+wBOLןHYpo6c֡㍺Khf`Y)#>ߐ_ռEGub(�X,8刐4*,tr-$ -BԶjZ>!$&| DM;G<4kĈw}\ZmrX,XbX,J@uC: Ic˵Hw=IrB±JT|ۘrQ$26=K3to );S\ >|>]ؽ,怘6iZT /^zOB9 B.]{a%>R%I09r?tt0 6H FW^z\z8 IG9z__f"$:K+@,wFeD.XV}Q$t49/JC�툄VQ GG!$Y%BqD ׋ NwŜM"7IoK0arP󅄅)J**rE[3*$BI U~zbX,&&FjJ!y~xm�xcUЙRpjYEH_@WQO[/Py&_]�spMq-M\T(f뼘o6rXbX,M$ Rj2!d孏Qcۘ"׿7%9+Il'�aÍ|U3؃^(pA -[J8z�ʊmbmbbX61ק x2b|Rp]3gmz:D%|֥ٛ&6Lq$/ *8b-iԜsS}(խnwÊbX,UB99"ubÜ.')~S|_NJbn|΀dϘ8S~w_K錧u=;!Bi_G\QrmrAU +F,M bT:'P_3XztẪjJRJ�I['([R kKb$ ,<^OѸJs?H;bx �z뇲o-5A:itD2uU8<RT!q6+: [Wb  bT Yx忔1+DE <礘舓ɨ)$>kZ/$ cw�Tʍz]bŇŢbX,Z_I۾:|.̛sy!C7)O 憘^or5Y_ژE[\znoSV|X,XbX,uF °Ғ Q$5(]$moStJuj}F*L fţͷCxpwC6+>,(eFZ�~vJÆ UM6eر%|r.~{b ;0fΜ݋/Oƍf8[,obR&м.*?+;G 0is/o[X#.8]8]!R)Z̉'B(x !dP$.M.NcJкuk͛={Qh׮Ѯ]֯_1ڵk߿?clْӧsGێ?sҴiS6l3y_,Be6&$Wb*WxZZ^BXy-ZңG|`pu҅WY,ZҶ/ExU1#^jNH\lyp % .uaҤπH$='ǁI�Edzk3dP)PVux#KS&ƍcM6;v믿歷*{�ui߾=so , aS)e:îe~W,|B4iTZx^N;L9S|2q5Dµ|7&ztZ(VK.: epBk$\mi Y!H&MZUj8Rz'ZhW$҂sHįۼWr>b!<8�x%UhOÊEaHԭ[7ѩXreоzr-}Wɱ,DNI!G#N£k'DWDOq]> d*iPU;.06 NCQʒ_o;bZv6H sL&v.r.RbaH4i҄1cy^$`}Iݷq,XwARǟ=2 *HEDTPqP6LV +º٭D̦6JXrQB (^YXqt>sNOL|?U]}f4Z�@fҜLdgXҠ&Uׯ$m醕e>בݛo9q"ѣ;sE[o >_ԙsX+KSLzK.UIII W~VWWkc555Z|Fݻ7Y-iȏLq~ y}m <,~x?s^6{^۽!ReA8A�= Y8q&LG}T}rm޼Y+VH GѲeW^9sWYY~iuM/ֱcǴe˖9q8 Iz$Ik֬1F_b$T9#~ Ea{=%]�Ȭ]^dI?>]Ow_IA}>Ivؿω![AmYY@_C-\PgϞUrJM6-qN<W<OeQQnݪzu :T;vlwl߾]sI,+ȬY /4q-t[sFQ⇯3DɹUPr>K8׭|1)$}~彟e;&˒v:QTW#y,܏v'x� }5|pUUU1 =å*f e?|&l{}k]ecǧ,jUv/t}%ڞ̆& Sf80ҸqO~յƴ{ҹygk޽ŀ֎�@iOH67qi.;1Ώeubj.%WJ_ kgL&.ǵƴcK=K3 ��(sFf:{wͤ.AsBv>!WW{-UT.xx\4zIƍ'҆H)Slil � ��d(FCj&w4j鷿=R7gGtXޞ2+wOd @v ��dõr@tE"^9 ~K�#��\ <l,x? !}7q}"H&OAG6]7o>Yo$ Ah��9iH`Qwk̜nل=aWѨW_@I 荒=$˾OrXWP0 :�(|4ǯBHP谏{CRfpA}dSX[f2 fzA@��hE~\gOHQP`6Rz4\o,NvqjjT=αe׎˲'aX�2C��t= 0~zMrbF Iڷp❀iȴ'!sBCA[F��z@2 !~$ҼA!Ş7OD!"9!ؓ(]Ȧ-aedklB%К@��h:G$]/SP UVIvVJB&O#�.|d2'$n Iwch ��!~C !P3hTڸDb2EnA=g$Ī]~$ݐ-vw4�1sD !^i/잨.?;2FZ^oyܽ 1&O+)TmKv$|JeIo,R$ŠW@6 �� #mI'9 Ar/(,9ޏdШF}8Ieq&7n!��Њ7:!$HD55qIYVӃba{IgW$b{'kNdL{AϖeuD<��mX.CHq{Jdv5,Cb1XLַ*IzSIVɍ MB.[Rsߛ0ԏ��@+W0lB:{{N #հη(�O@7Dڀ|H+d'$^$- ��͏~IqKDo^hҶmԾO)lY Kk׾ℐd`qv\׾$z4A^}C/_&@kG�� i3ǴkP"9KF\P,|{?KPAAjG,f4aBIퟦ^~R@��@B}!D:ǃ8ѭ![ez>$)N,}m$ W'hH_H��@9!q %NW#wTRrIRrtgS͛Oֆ9"  ��@y!$d ~m?u~HJ0/IZjsMkּ4ox~_ܟeF@[C���~cCH!Y~ 1 J"Tso}Tv;2FuzY;tE�C��� ! ﰬ~I&W] N&QSc$C}=!���xdB-1;Kq7z2ӍjWJ~n+x$^JZ R'K'$UT|X'8 " aE,���| !AqO"N2Fڳl`HAM 'M^4eǦN'IZZONJtC$I{.1/+ɰwp{&x5��+( ;0)'o,{Vf]Cs,iݺceɝ9܁p/9!~�6ڜR~�Wߒs2'$*+^eT^7xX6m01| q[w,qXLzA_/tvNgHReO :q'9!F�AӾ4lXK�-[PoH8a^u]$u&phԪzeyBѠ\c)(HA$dwt!���o&^N#,LNb1iH~W~sB2ݴ},%"�� J{~ އ¾$A1ceۅ=]4'���(!n_/gh濾g]o/C$"ZuoĠzk "h �� l'74_<;yNqM8.㪝R7.e`.��W>7x~ceɓź[tI^7pY}C��`A!^6xI^{soseYF-[w",1O$Iz7+c9pC4e|hK ��I4vN0,[\wQ<.mrR<%n2JFҶmEKjE#hxnE��(a %ahԞltö{㭗wà B� �� {\op,M 3;$I=dZM͘q,.כfr9t ┟����r&9!pw/ktTιNH]KZ:!įL@[G���N.H WPoHa{e%{Aհ]Ihud*��hr1'ĻwN~އ{U,>QU۵qԩByYX�F5|]v:tVZѵ~f͚nݺC3fm{-[4zhuAݺuٳ?1U�n mιzs9Lh4(*HDSѨQ”=�@6uT-[LO=6mڤ#Fh*//O{ŋuwkzga]s58qvڕrΝ;u}Gڰa~_h˖-uҥ��N!y ! H/8ǜaX={w'!,ÌmܸQ&MRyyz{WGч~ŋ5w\ݻW#G$b1|رۗ8[o_|7|3q{nŋ77qA >\UUU6lX �@7#w\g>wX>o/X^7ƽ^+IڼF{b,RQQ&o79$ k׮UNTVVr|:u*++^[ZZF5c ߿_O$|X1h Iґ#G^;x:ǽ>|Xu>�-J7+BAúǜѨBPb,9sF}sK.σ={6q^ks}��!T~+f ru^K{},I*,l~09qh+ -L&]WΝSM>]ӧOob�lz9�4?,tշٳ]뜗Z9t$t���4Ku:;[^;h :tqsй���h Y2eΟ?իW_tJJJRV򻶺ZO5j(u]TRR[oU˗/O :;CSV���@x Y8q&LG}TK,ڼyyGyDvΜ90`T^^-[hڴi:v-Z=-Ruuʴe⋚6m ٳgZg���  Yz5sL-\Pw8+WLvod(**֭[uwɓ'BcǎM;C7nӧ5yd=uVV���@N;�����@h ����BC�������@�������� 4����!���� ���@h ����BS��ږNK]֧H|�G��%�e�hb.H.EaLK:# 6kĉk׮s׭[k2d,j*���1&߅h)6nܨI&\=Pޫ#G?LSxb͝;W{ȑ#%IXL7|:v}%5$Bܹsxb;x* 61U���= YXv:uꤲg֩STYYY!IhT3fuqz<���@pa߿N/ǠA$IG9���@KG�™3gԥK:ǝcgΜI{ٳgu=����cu]η碹?:wrl>}zJ���l�)--Ւ%K2:k$uշٳڵk܆\_RUUUT۷oԽ���fH5gΜEEEںu~ׅ 4tPUTThر)o߾=eeYGf͚^x k ���4 vB������� |EkگqhơC[D�$X_~C58_~h ����BC�������аt;wNwQZ,گqhơkگqh+--U] d}@:��h4lذ|Y @.\Puuu��5z@Z���0 ���@h ����BC�iΟ?竤DڵСCjժO5k,uM:tИ1cm۶s>s-X@cƌQΝU\\oQ ,З_~U US$?+RѣfΜǏ6 ܾ OHD?rQ ƍH$R= ]XpBOW\q:w}k:vX.nǏ9)0K-X@}UqqJ?^;wuux&L0W]u/iva˲̋// 8\{_4[l17Maaٹsg⼷z\}f޼yff'?i߾?~|SW5ucO})((0?яݻ͘1cLaaٿSVh2^3e+W{LIIb>Ʋ,o߾ı3`�3rı?… ueYfϞ=9I~~Amf,2/B+ga_ee)..6Wn$;̠Ar[f 7oԩrZ|ƍg:ud>W h/D"~75H̛7/GnڵԩRϞ=[NReeekKKK5rıh43fh:}$}j׮]ofIG}E䪫j\ᛁ0ҥK={Ν[n%ɓlSNoj<4h0… Zdtu5I=%_{sNcǎHgY ԩS;t ˲TXX!pVO9h Iґ#G^;x:3Vl"I0`@VenNn]tIGѓO>>}hԩB^~?я___Z͏l)}]]uU***R߾}-~WWUU .o߾zGեKkĈڸqc^xA~727'ak޼yZt***try^{!=3:um0?Wh֭+T ~z|{Z﮻̙3uM7ŋ3<={h,Uɋ0ɓEiĈz饗dYM7TQQ{uɇ|G,ҥKտ=!n6jgyFx\&MJǗm޼YkT|! kǏפIԻwo-Y$i1u7xCXLz5vXٳGzw񚭚͞=[?ƏH .Ly?n8[sՆ d_<dyyWtWHƎ~__[l�ɇM6=-[Eo׹sxb?^o4bĈ|CZ]Wg&>Ows^מ8qBwyuVuܹEolh4aÆiĈ9svء?ܘ*U\Ǐ… u9;wN}${Is%~$4ao[ҎSoh?yر!IEEE;uW __***wY x -ZۿըQ4qD[N=zsQ tn:zh`o$5h :tkO8qɲ,m߾=e8QKfyuM={l{~Gџ'xҥt!CH,X.]9O~8}yGƘ:[>S꫚k,26lhx,5\_|azբB ?,lڴ)7ȳ0oϞ=Ʋ,_"˗/~aÆ6@ =ctb~_m۶n4gSPP`>ı/lL2]v%O 7` b wޔG}j}s74&M2K,1;v0;v0=ݻkR5uZ> 4}ڵL:,[ܹl޼<䓦Exvߦ،7lܸTTTǛbw練ݻnx}c=Û1M~~ZS�i;v옙8qWb Mv7l~򓟘K.5yZX{1ƍ3:t0:t0ǏoØ_7ezaߟ'O믿;oݬYI4%˘V>���fΞ���@�������� 4����!���� ���@h �۸qF;C0a],�@3@��˗`=zT{UN4i$| �glD�hr]>|x�#z@��9;[z쩿е^+I\2�@@��9eĉue$b<�o.��u9}?r9Rt< �\@��9uW+?Z.�4 �TQQVX{ꦛnܹsOX�fU��������!���� ���@h ����BC�������@�������� 4����!���� ���@h ����BC����N)Sa����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������psignifit3-3.0~beta.20120611.1/doc-src/sens_single_sessions.png�������������������������������������0000775�0000000�0000000�00000241235�11765425452�0024043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR��N�����ǟ���sRGB����bKGD������ pHYs��a��a?i���tIME \۸�� �IDATxwչ3٧�T@D0 b/5A͍I͕/ hbI$FM7jbԘz5&{A2k>gv[zy. .PPPPPPPPPIAAAAAAAA'EqRPPPPPPPPIAAAAAAAA'EqRPPPPPPPPIAAAAAAAA'Eq)D{R_88뺽6omN\E4x ve]w݅iUDz,.2 {˗/O?ihf͚Œ%Kyᇫxu[8c*HeY'T ]^1cpEfVZŴiUPPPPPP'3g2qDƏvm̙3+F>`Rk֬);裙1c i̙Ckk+SNo߾̜9Yffmʖ )((((((|?~| XtiUUVH$Di̝;^zѣG|,]#GoQ(ʿiFPP(0'[>ۧ>{H|ZVqN;4|oatz98ꨣpfJ:p%:ޚD=CzoqC$?ekc qs=3gNy>|xU!C`YVftR&NwG}TV8Cy1bK,)cӇT*U_׸kԑ펣Qn?as]KRg_ۈG6cV ՝wy̝; ~z?|8 l/ i0m4f̘AGG=i;pib ,Xill`رx׏zV?|N:$2Lz86DyA3rg(eΟ K4-LSڿ־=ouL^vq'-A8dnoto':ua+$Q+'u95IԖ^~Oq)(n4'ST9sSO1c u䷲ul?w-=O\EFt-a.fh@(ɮѰ;?wX8kݏEB rl'gTws:m/|.S68jCaQ'VQ4\ƶuuԶg4ɶGF8dӖ [~,[RR*(lCE-7޸GֺZ*Q>PغپZԖ8u5sC$2{BTE>vU뱉{|>fi_l 8)(D+ 4Gz;(}:ZB_aDD,(oHYWPM-7vm.ܜsXt<qR؊OUA1 }^kPp}tĢ}\hdLNJ!h!G!:Qa\B.{ױ"N K5G4gɿ=POi4 [lrJː>ԓg(Hqr&E$2n>4enF\VFk!㣠yv¶"PJ}U1OK_~җ=o0Jae>jXX'!p5:nLkkjs>ja矂JqRZM {jEPzJ8Pc4!@;cwpضFبRByX;#zLCQML]v a*G\OZ×Q߶(w6$O[R]?ŲX#KYoBۜ|0oYtǿ}jUXd)܇J3uo#+/N'n8.́;I5!MKiIC[2 [A@†˒{BDQ~咍ezz&Y7ѨAUQmRF$l,NG5iKXl$ssw2PK͹(#M:I{ZtqH+W5@- Q%󤠈V–J\Z7oٓ;ft͖ !qՒ AݽV#~röE.xE)^] x㡡Asr] M(枚~*(|ڡ 0>*SE%@Le:GYl=㴑mLM$aT}[8m$Lb$jCD 2VN#t-k-vqt v 'm>dXPSGAzFcHA9ea,2:\Z,yQN2:{0tozt_Tm~8)(TK6ΫK:$_R%ö;aQ*L5Ũ)rDG&E̛''$^9YSt~i@Md;eXM튑a58z1xL'm>:Oӓm\ȧ8A'A aʐL%_ʕT%=m:|رi\7G.n.H]w ra:ǐj> JqRPؚ'"n{$"aYR֡0E"&tDFjt?h7|s1m_ue]\ ٬Wb'LQ )45>A ?Xׁ,^&8)(|A&o*N (eN^`~KԍJR?ltcW(UqoK LSGl\'۞Bv 8)(l#%(sʭF.zw]< wJVL6ة89MusT[kPZMpZD0)e:av }d"QVD$0vlM빹gaerTM&HR5"bUL#3塇tvi)PM9f\Ws ^D[k{qRP;v9+իWrJ�swvZ}]{1x=X ̝;t:Ty @QL=:Jp≩rn殳[I1 .^kq챎4moX|"VF%rT+>%'qY3879Y|~<[#uZ)G=)|ڰUfΜɬYhjjb„ 5^zI&,Zp'.?{ケHӌ;>}0n86nX6˱f4Mc*~y}uP`V>Cd2. u6sVimme hС�_MӰmaÆ1j( gy&�uuunѣGl2vu׊ d͚5Kss3W^y"SQl}SI(O2kiY ;u-*CuJ͆ tĉ6V"%'ᝰu [WD%oD* DǰHm SI_ [SPPICb*a˖-[VE}`|r�~7x`5\u]aVuN4˗W'O>kFy-Б Ge`ETT+2BF6xiO ]tvWmIrE֭kK.M,w}!!qr GfϚeU'Y^+(|UCu ikkc޼y,ZI&d~a\evcÆ ̚5Vn.b4Mcռ{b >N>d�^}U>#:::xƄ %>/dFp Y?qD*Ep䚬É kj 77;쵗eƕ~l3eJuZhkf.-7Ŕ}em jYWpx$6iBfGIRYKmvC$Dq5qr]:QF1x`O0{l=\9p2h vi'~_�aLBo8c8�xw}innse477#9'Mx99>}\fδjS'2Hu?Y\Vʶ mmտK6.Mgٴuu]a2rbn<&HE0O2ߚ5DO$~ϓtָjw[ sjdsᩧbƌQ[sTT\iW6Mo®߰{: eS<؉ҊKFe9GaS"MM.lwR mC|p]B!Kɢ\PU!{gJAS8Žz ]@Q2D$wQJ :?9tzۈBOɤfZ0WzCnD8.NEHY^ s1E0`A2asFfFjɦ TNsI>dT7Lؒ$<,T`DVjQQĘ�ᄏ չG_];0jۺYɦЮhF+1l~Ҵn˅Hiyqo3{ AUNa[#vB"Sc7 } vL"I'urEY)Ȍ+GiR:/0\^z)ɘ1udmlMWj6q_UӔmF9k_s&5jr++2xŻﮡryno^_.| !4D᷿݁DK瞫gÆ$S>Y4@>f}D&aK Lzi Zrde9O"~cLJIZ!fhTt)ʯnw 㤠P#i6ؾ*|Da0,X`puUeU* KW8KkΊ1lUewVtŖd=:m=BW黦O(\ǮmXUu^~9c5W38ME.UDjHXxp~h:ur6t~R%}%SaʦWEqRPC ԥ'0uy^xlVƏ#J{ӬZ3vpl# R63f 䣏ضS-ܻLZv8!M/3tr;1Kr_Klf +VBwt9UsLhm']E.;v2#͠$82u%IOO6J4(L26*TKj,OF1" l'eŊ^(˂MVZ\LvJ@golс,U Cö U肤rTzm8֢ S͛oIn2iR[qnロ&rCKېɸ Eyg +$WE3H35Lݙ?_o_TO?/H,dEe qy 8)(l%uIV.(0ʱY6[:bQylV/G ۶{gV3YѡcT^E(šJ9|/J9LYOX[رmn7Z ͋/68xmS(I:m H}2i$xc%s#GٶOuG%%LIa#dD_?7HjV]56L`bc0aE>=E7 DLЮ@T%HDa ~Ό9sSO1cƌ.^ E߾syN-,.|\6)49e=߁c9,\.ZHw 䨣vgҤr1c'IEI;tS_B D4E"iՉ2H+m_\*/̙38q"Ǐ/;2eJE_~F>`Rk֬aРA~vz(w}7.2uǍǭJ&QGYaH@ܑtS]0W޵Dvf̘?ڢ2T_o{-稣6�0~|;Dgٯ`.0`@܉v+kצ~.F^ɝz껜~B \עM O`YS2VwuyǦۯ8 [ift<Y58YwsswDK4bƔ/Cazϯ,SkkuoR]Ohh9aisr 'o;3gtRFYoO[[B8yC+lj! + Df /{ 眳#,e'0K[?`\0HҝwcsضVeQo㬳ޡP�k;ݶb],1/3fXt&6H S0,/G߾eU %(>8i&Pe[h]}70d2 7˔)笳Z*BX/T崶&*Ȅȵ_{1Hl\֛_䖓Ô( yoQaER8}"ov۹wc=;i> k֬u]+REdH,s3=Gu�aRa` bJ/GwG~/]~uu>GrA0BA4,ʉ6 X4Ml0l, 2L8N*?HD]wy~ N]ax.W:_Yg)LbM|KʪYmw85wci'xXij;El`+ȣ\Eכ<,}vrM4)k7|8K,)cӇT*U5O>n3gru)ҤPA S=z7t$sŎrri@!M޲}Lю;Ti1z􆊑xmz]bf.#`6*/3%,41,.4bUY;/J&7Kf4ڃ&͗ *%MvV6p opKXvv™gLXHLj?&8eqeS0qlwy̝; ~z?|8 l/ i0m4f̘AGG=i2p@,>,6mbӦMw} 0�]9Cׯ=tI&QNZ|HU l/˱ĵIp]HX |v{dM‘Uu{nf {6.?ቜ~Y.?9|.pдiaYyճp,#F ȓD"2rLfذV߾3y1|(L7Ǝ]ǩWmۀaW~YH,~z�--`Ht?v ێO$,++迎f{Yheꆖq)~F(E6inn橧bɌ9K/)S`Ygu\/˲n>}:O>$�D3fN;1tPf͚K/Ty~_2h vqGut"%K"U<uWjZ_ޣfPr(ha0C{^A'<[[ n}o [[S_ĝw6q`yl;ey'3|tHfμDZ8X>wLRJ �x :)3S"I^[qwoP(7o{?\xضC ?(7ݴk$y啾Lt8uu]q]V/-LSyO#Nah9 Tr9hoYbz=8C<}[9\֡ eD%ߊ:49\!*zZ ,HAQSٍZ2C~qQ!"ޝmn8OoR~ 77qb@ F-tPvR!*ٙ(ӀK*'M+K>.@-C=ehardl:4 VoawqD/*H8<9PWg&]wCIm.\4SNʹq-rhh\YϓO{[m'fShZeR|0+,>&lzMӨ rzC_?ޤT8'8tQ 4%r!>jq-#o4 KmHA/88^5 :`3p`"iho4L$Kk K?؞+ /2e9GMN8Uu22\ $Kj-n>IAS+:]ݣ am( H&w˗HtvpÎ\w LӨ8GKu:.\0쇝?w�zrE|Y9JPA][Ǵi?@0M|ޢ4M WG}fmY"E[V.[\tщu>Xž.4mfܟK/=(F虬]*/ן_5{p>4lը~eUl/ΰjU*At6oYeyÛo֣idu\aݳp@vI˗%ZJW'2ODXkCTOv)X isrjQlGJ`۸,ZaY0z#n~0$,"#T_o4_E}8׶M4l+BNs* f2y?$7}UED%Yb6lի1#V@2iѧO{ywy&S>JCCJ$L3}i>O%e0h�� �IDAT3-ضQ-2yQ3n>],+yr2d|TC~qm^П%,I⋫U8mjQ⤠Aq]Q`h\ Wpye`*$F(aݝNGJmGgNGθq$NS2].[t.|'y晿k(+Na?A**J:t/4o>U(%k˷gƺˆ inyQT{ 8NS(-r9 ,`.fiaוm y~w%�&:wCngѡ }l $xK*bk+ u&./kI>z;,' lenn=XaC%+(Tj&EWivL\Id<5` ǁ|cݵkR0~|L#뺺 q:: 40,r9oyGo(֯#vϫjeǹsG3n׷|  X_׿{رoqE3UY44)ie׷`fE45.w:ők4PQkaԔ~i&IAR[ ytIб ۅ}]B:O=u-- ̀ـv̊{,0gMvݵ<xoȽMcS5bM4R)wѧOm'ij0PEh(=X_DEvǤIC?_tJΕ`H^⤠Wz:Pxak28)޻reߑiadse+Gbёua֬9CH\c7A sN;ilڑ硇'b֬XxI^OA.45AGGϔ'7ZijGĖ-W<ܳmӍʑGX^4L07ruI$rXVxWW^{mO4^x#0ga| ܼu4\tѥrd;?L.x:Sq󻴏t[@>o8:iN6�*-;RwO5*ijrio)ǫ E8JU?OA'OdiD7̞_6RN:.I7644aɒv<"U sm)d+VÃ7ySTq5#7bY^$=�MEHooqA t:H8 ,?MMg5`) aѢ̙s?9ruSNðqsYaXA%/xy^~yov}M?N*erIS$R6kl Y6˖}~8p t ^Wc?@eu#&Ar${yCO6.[%KpG|uFxq8,eGSI6tysITX%vQRyp;;kM7ZcK|^c3}*LtL]@WQ7!Ų5 3f]?.Ǘy8믏fժ뢩]i&=w,ÇKkH&馛_~mFWe844lbɴHt_}Wܼ.&/%F(u] ztq+yyR9Lq::{aC3#F,< LS'3t kq*ss4487ee ;/z}ڊ ^Eß=K1ztv29v٥ Tƈ;񓟴]}ƌJp 0a#)l4G?i8)(|j^Ǡ。pyOGt SDEY+;:E敓5 ,`.Aɍ%ӷ`I a,Z4�ԋv3t;zj/Ds:^!y˥H[[ӧO4S8˰a,>O˼B�L,+y睋$(5q]/aӦ45JYXyJXU`yLqEhw34F"Ə|%kOV܉?y*^{5Y_ضmYlD*d \Fӌ*'0瞃 ?,v4}zƙfe'5DJ 攨UOTSsmu"ɤGxG"N`Wa%u[ +z+,(ѳ4Ɏ<\"O#_8lڴbZ� lۨeWzyHS-ur!D[=DʃÒΣHQOv/Q8)(|*TM282]0Ll/EUDB?n;&$Xl_@e2'8+#" l9pf|=\Ķr^_p]{l+ $r˾ȝsIIWW3ndD�N:黀A6 摠vZ#mIO?ǵmF:.iN8z,BA/NM&Asj<?ܕ_<|Lq(Nɧe)?.7Ll/tBIJ; uG~sᅿD@29miA)aK̔ԩoL/~ɋmK 8dJ&m C40;hW&y d!= KuZ&E>s:Fǔn=!OOZ17V25/BvCwN΢NBDJ=z1gΎrȲrRyɺb3O7_N[['tt$qYз:]-*&]bY)yZs`睟c]m'pq2:G6)ڕ+Is'#, '9f޿fSH7MxjYg۪C%Ydo$@JhJ@*e0,|!P 27YrI<8dY%ǁ^zi{${sy>Ԅ`RIs;3QpD4-*.׮sGuһN]D4*d1̝;.Hˆ #>| ij)lT~)z2TUEaѢYOYY8%f.{\u׍' ,o7/L>;<<l[qFtH[]-KIeJHeeʦBwe:wyڿ 0s-׾˔i�l@bo?ј:Z)5e$�M _嘦CcI[%h\@FټyP„QJ+Q-gK32[SS [o=I 歷!QyYH hYjn&JW\54v8l8cl&y??kQ׸~u-F'±\8S&}Q7³ R)D'jX2»e1L[sj|?G8 i e3aD"1F*ݘ3>=)ü!~TF'%Kz`[zظ2afisU+q':,v"\}LaL{b3efwe7̶(31Nkkc: I2W%GW_Md%o9LN[ǬYo :h C%YFGCxS٧GR[ەY&1zY<5TVn䷿HD'uA}qCiz/,8},+F+"/A^!"~mGmlb\ wL!mGh ݸ}g _4JW85.l%L?6� ‡g־󁣀1u\p2#GX(aJe]L0Ab&~k }iJ^iz4BVF~~H$@I婧0\ضF4'C8L}.课ڟ3؀2)u]@t2۔k�!4<PU;oig+J'}_'V.=1MM>IDո׶i,7(ttJnA8 >[ uB6#FNـ^2so%jԥ{-}M!ەcSߺnsC9f449 lSD3 8 Žu+ Ou?3g>ŸqsoлX۵MEEٰtПmSYxkشbv߇o4U3rx[)5t[6ﳕy} h@ן{,rZeu8rB4*mQټc(ojbNնq=B+ @>N$RڔSRR0?~./t*6dРjf#ѧO=D6uꚤŒ>:ɓ0{vWr$睷)aPw6Qt2})U^{MaO< Co|k?4Nk`2MTD{}tBM;~+:^*zZkd mTTEilaB3f`|LIH,u܏^^`  {_vr䑧 ^Ce'8]v;)M>?@TUvcLޣRiǟaǎJa;z& Q_H4jNj[D"[{m[mh45E;4ɶmB!  h`w((0yV>d6�̏1K/ͧl+4cz,ٺ-LPHR]$t`QrIkx/ON#-sΖ [k)>i)TtJlDYKr*>[4MJ>IObmɒ%.F uA^I`Zz|1~|m1+[=!lNfYVH4*۷ҳg5i[ކ!SRhTMg$j dپg1v3م 8םF]3bU(Jn3gF]HAZT5ʜ9s94;nOpAQP.شi16|M a wvcEsXRb@}֭b�<Uvf5Q\)pŲ<8a*'mf<7YgYCj3kFQWŵ.@Fc]S>f>\\/0=5|(-[L=JU2d3YIƋ#n~I{0uJ$"Rl ΄rm߷8 xٽ"O*k;MӒQ6xy\1H4AU8?;@ND"1,jrBuk:u:zi}뒳vp-8{rIyXѹsp~ոޙ :[ًY!r[\ya,Z5+ >&/9ߓؿi�J4ZE.߿^ITȶm?I#Am UXyT34:_cEuLSY֮ډZu? ߠy?L0ێ$ǚYIR,+b(q_HС0rD"iҳSƍ-7p8[50m<,Q`YMM̸cy!)cUa%5E &Bs;wvGƣ9x~{epq@2Xp�W C�+np^x5A-ŀHU5zzɒ#Y'칐~Lps<䭷aS=Y<)Ez3(fO#1[?1FY+)הog"FoJK_[?m.ilȎ2dȉJu}4 m7۷_Ϙ1#GTh*.^ \Y5P9xt]p躆5WGqŏ?p]wbǴQHt]& x4MOPUMKJ9 }JKmnygb- }ik,Ĝٲ Ne p:y4N{v熽L0Nh9o%`_3O?VM Uk;LRzule|5ݻ} j"vl;ُ'rvc Y(4-DUVe,'v n0Ѩロ/~q(W7\+p*(XUǺu5`EӠhDZk\aR[kVXE}B473)t6=Ae1Jf%B46m{2itv3={^ūz,"͎ba 5EEaۮeaFcckRb̕em~[*ztʀs6l  '>'D*e66]ws+֛ s_X+5|ea,_^. /5.s Jb$GaaBc{rQ5DpYLPɬLSHEJ&ʎ4r.s ZnСCQѣq\s5?|L0MyW+R&ޡCDrpG0Tzl}:zb_ezjx^j=QoژOJ^[!qɠ)u'@(T#eL`sgƎ}_r*ټh~3,E߾/%#'qOOa1$nP4$ڕci}ޭ*2nO0"B#bEemQΐ =s0( < k׮eǎ Aύ7Ȏ;ؾ};W]u�i&^7or k֬Il0 ~?-r\`2D-�W ,698kp8$ׅsYgEuGil}p:%^ˌLRlS+w; /RYY%|v2bgLrXzi3j cÆp ̡rR4 ۆ=[9!0 LsHşkvm]oBQj4h€¢p.E:֯_L0؍kbݺE_c1 B4ulz'C%XxO Q'~;)>2akמsfH<*fzQ _Oda)aRӴffJ}:ۖz�M bmU4 ӧbʔ%)5Z&.70Rcʲd4OvLSzؘL%�}%տN�x|52o޼eݺuBj~ 0#V�Py:NmI0R#ed�VFR;e%Kҥ?Jwp yP 9ħfٵkƧ;S|5 4 x)^%5~s'�"m{8+w_폳elvpx(QG"=ؼ;Ŷ, TM[i`Yj$=z4m9*56mZM))RXgpRxtMt頩i&n6^^)'ѻG<חS__Iqquڸc7@j}gϭbYmcmiY/x/"S:#6Nر?夓Evesy:e5MpQLV�dKgBv?燎#xˁ_޳g-[p),,dŊ?1|p۔Iw衇R]]̀R?en?kħ'=}>3TaфPレI02qO/J(%i~%dTq} xK;;u^}r.t]$-m7&e993p:a tnή̲x塟u |FYB"4R[O ?q ((+;U ]֓Hv;]O}[�44<ӹQgq_^Lv츛%=;f҃3]0`B0cZc-{3N8+~۽o=8+),lqf/_'?Ļ^̹ޕx`ȥ4Eu'3r =S4M;+vz=�PPU%PU-QN>Eǧe)̜لÑ٨3}%ޗt}Ƙ7ȵts’%KXnz(UUUH)4h477s=pW&˅^Ȅ quV� ,7dԨQ. I̵\>LNT={j˴LIE6v*.]l4 >]TU|M6pKRUU-J } p)5~]4]toy?` I�No??)S~iz{'R[w3KX�Wՠ#n%RXVMUU-hTETT }rSSӄv7LoHMM$mRQEUk"L(4V|FBQ6 iRSn1=zD"CQx FVH 0XshN ѣdz|rm32grֳlt nLv"yyu̜ )ٽ-[S^p]=q ) -Ν@4=1b?|'#.\9>]|h\e_+ã{f2=BPZjS\,5;bZgc6;?eCAO.loNRJMW~!�s .�an6***ѣYشi7t^m7|Ø1c(.. .`Μ9\NG۝ב"[pO+ێ_&г}[oF^^l3gVpiCqDF DiW=QR?/Κ.p4MraPPλ\,7MX'(J^F8b'ݨJUG ?1sy҅9�"@7gcVRHKIIWi 0M-O C2)x<3p^Z"hn '?=P1M/\Q!_:6\QKޏrazt[]k؊* tpꩿF7`IqSx;o q" DySxxQ# BΔً0~=߿nZmw,;\se%2%T ;[)I})nk쥂HtB)+뎔^CU+)(x((+iECŔDq Ng ۷_N׮ /9*f4>*yvp\&" ÇބwM0{R"TUz=3faN]]97fҤF>^4=F~9M3#4t=矿t%Ju[>ˀ#(.~4PV!TJJBK�>aYۖXVW Q :_!UD8|k X|XV!Bx<  YqKK09-1MICYF1€QWw #1`mܵ?3SV~#6aIn;Ϧ_FI}%\p--~79LS mR_K~G(p9pq:~hjrpU;j¨ȷecZfe:Z))D'ޚmg~inșdZ lzl.ӂ$ӊ<Xʽzܬ1nXn.۲W+V 㩧ဟl>;?(3"oŌQUi:cQ-\ +PU]z~ _r8'WZP=ejmTV0|d&x@Y2qE7--;l 8wv)=[߿nF�BuWض.]FSPp5팏#-Žظq3/3[oB0x9 gCc)xh�nYuu(Qa2McUSyy;xд0Ѩ hZ78nxS?Ŷu5N_2M3S@R&w=GQ6kZL2&c'7SxHN߇ulerY)U^Νy,[5eefgsXhh2|x׀L{ !TWw43ݻgi*۷g4' ɝD"eFeB|v>sh$߻aC0z$[ ;Uiv4{b#Ѵ9CObl!3DhtZZvb-Hق׫ D~쇦}&.h,TB8#` İ^K pB(f-FE@S,F PE!LLGsrHD7g#%/�[_$D"y<!Log\υ/p؁emDSu]ɡ.~pX4a̘hO^iMbRΪaL5)%6[Hr DžXHɖ-J;f{p0r$j�w/a�� �IDATC)~֪!JgSd$#YvʧW2骒/JI|+@UE\,LLƅ-p# pd_3ctロ@@K #.mQ]]DHZf?>zNL(, fc| 1ontzk<֭Ũj=y ?0S�.ضN(H(Aި\œ` hH&&TyPM(J#B"yHT). F$??bXzPb膔e孌EZZw7:QU=_r8t4-PY>}B瓢kr8bnө:;:ө"-ᔿ`AGo+ ׫뗏LL,((uSvm6]Ծl7Cs3p@pݿ1Nkaz~kvIflb)S֍Hǎ&pr a*"%zG+˖GQ,,Kk=�ݻkb>K�; h /$f'.쭀{qqp8vňiƲ֮ٸQCGI=/.ҷUZ*֭̌ KΑlzL^Q.JJ:ؓM NkOAS2HD״ RY-_#b(i,u6"-9rғ=t>oLŒC1cxL*?)1aNAzxO$ou"|sX5 ^}u:=� OʝN2{x�wbBYhHYFq/),u?Rҁ=D&]zYht5؍ll(nP],ѿkC`-4l;>_AO>H4zx\#eE!iil^55ecѢ(RD  61;wrҥNsovLS u;)� MhZl؅{9L-l'ggGYa(Ywɯ)_ $[$BpY;z}1sq82[d+Ӳ~H3dːNk(Xɶ$TxMݻ3It^@UG9XFp2˴:$T6lS$ɷl[e外:.nIO?-<3/6 X'|ӛn݂Zu*(I/Υ>Ŕ)(5TTlR%o eFQlsɠMEQbyysR0~D"pOZ0P| (GQph@ BD1XUHa?7)G5>� I8<`:%&NSE(رHd.ח]LUU8upV(-\8ضҷ=H|s"$G}\8n;8a&g'!T0<)B:j))ٖ fatq8"@xəBzPe3bD}\4^R#{dbVx])'(*O{,mBdjH$SD>O9kinR*$S> S:4;X^٣]KJMM }NV73`EQ@R+H43gԩJ gweE:ow穧r678"phYlGAQQc 9uvR�:h2iGSӯټ�5(,< 珀�]탑Ҥ5`YS0H v%)uT AUĶcqXtd4Fд?!ęHi(QiU띎n7)U,=!m;(+s-B(X7)_G/C\m dzO2=Xͣcv-YLNg_ 'Eׯ/J 8!\'|$Er5av² rd >}'qv,-!Ap8uq+lP˸q=: p-Dwd2r-ئ/o6aT`#d;F(䚟/y5'`2?W]iN$?_$:.w f@{STG덕v4H$EQxL.<,菪.]BxjH2yᅗ|UFcB(U ]=),|Eq N(t )UptmQ+bx!FcYcY@ ۶k["fi`(~t8(`NӍ-~J]IKÇ}{#LI PMM,X8DUCdCA7=\se؉誤d5="ᰏ 4ێn-Xp ftF0 뮻)S!֛%[G4;ctБ--qCJ~)(wr؝ʐh,(Mh/bVEMyy-ocذqRE&P__Ɲw>&u̙�EQUlR6@ئjѯ~\Uv{4vZl~ntQNk�*{f/ 3fDRXɏmϞ3i Xc%SkhZp]~ '.v CWPQPBDy<M$n^URM ?Lm}ٶm#F܎))aÆEl QQq"(Fxy`YAL#r 埁݀ �  ;3bD e۬Aێe,"Z ZDQ]>_mۭ*`׮_#tAW {1g7lOeȈyӁ"`W_�R*FWĉ`Y@ &LXaFJam";�\6wՋ]v x6еw"QG0cFY0N{[.JfS`h.ޓN(UHp6F�,ҖLb`Y'hଳ*8ʄm@&?fQl A'~;ݣq;(,RBxknVڏ"Oضoc(:wP(6N]f2K`,\V!VN$aB>)ĈLrv:?B|Oдj|?DD0|1x`bVm1Ja1~4xdʕqO@/2z?hi)a!uRvT0`}!%ضa9ۖD2U,]c<%}w劉'M be�N䤓)u2OgZ[8=?#:k9k#Qql5Q1O@Z:'۸ڶp b>E!x _JomuDb>LA1#/O~;x啟?I�+K2|r>d<ݧP p 7x3\1غam{.XٹsRzѴ�B0k>G#~Bب(11IAc⏏��3 kT �ú˺p8w1O-HHK_zկ)fkFJAet**ƶPm7EEk8 ?| TmK9F ^{t r8x}x+qE8A\2"/3B!ZE RNk{w`JeX9imM2:SeNݾB5|Nk?"pJ[E/d83MԙXLǙlVڬ0P&EeR�aFQX(R@g1j,]^UcU6l!Y\rG|ygI:g+~{UUGaa30xPU9\ 3̞<D~fVxMKE㥡vBc.c=H�EiB#88K�&%S0韬L 8�p^d3 R%U'󎓫*s5mBBH#$` t�CQ@D" *H" MC %$AzI6mm?QA|3s9y?d"RQ0Mr]\uqyCY3NI: n;e!TN{%y'H$$^z_?РAq.M{g0lX@g,q!;V 2Dn+is[>s۟vJQRS t5-(i(pcE4~SgM1fXN4Q??aâ=.(dLS[W:kbLӇe*K&LϥAmVLӟ{<<=b}-e]wscٽ3uW<L_ l@Qzӫ׉8NEa8N)sq)o9S 70{ 84 q3(}1"(kx46Uo% E 8D uu{:ߌiaZzө烏R4-ey8Hvuu+R' $̝;_ht=5. |igٶB8Jur `(܀QWo:fvw5xPr. 8u~aZ R#VY~%9}?uEvZAnՍ5}k S^r ̝v\guvnϺ[: /\ĉ[V޺wG1o7"­]yD4I-:N?Yys粼2O?MYLƏ?XL0,+N2i} LHKǶ @t23vZ( TѸ?q�q2OqCF"' mb`𸴙)eFmɚ릞T՛-x̜6&AJ MxGC.7|`n~opµq9i"MP-g{/ڹm_iHJ3#QU-$)S^o2$IyT ;�!e<;4E"N!pʬ=z[f2U;S9JS)J�Qn̏l8ϻʢQOt(ThoEk趶jj=w GvͰsy8Ƹq=z.ǿäI3fLC~4G4nB/J]+lp>ɢEYl9Nw©&B$Ų0K9�ks�x2 �x;fL))%-� >Xx97ƞ@g~߱m1inXPdLQGw3{YXihxxMf=#^CL~s2u;'!#lNA~u&Xtf6)݉ʝyLW wOSOj"KZRRwe1l+C"òy!ʰTn5(+VК|Q9&B$"�u?s H$R: 0 DBjU_14vhI]MSgX(cYB{’0x-F?ƍK2i`YHioEqP**Bi͢1X,ܝ9k) �+f9p'GR5P{�+ +*4Nh|7ׁS<+I$.Gʍb<7R80im=gݘ?6CDI`CX,2-m=a:^^oR × ]z6g~'}D"Y[&$WWlٲ)=0p r>s) bnu6rg$K%ƩcrGz`81Fi*:uRn:M]YlۦsA Ԡgάc36#cZQ;]O �O^%0R5n7m'Gy8,~:*TғNx<&@U-o!tٱcB$PUBHt} ͉EI %9KV~'(ʷDQFʽDZ1SQ+x!f'6U(0{ܝN3o5`q46m+׿izYx`gگw{;vڻt()?ѽD"!>ZZʘ9slvyEQPUgڵU}hkg`Y AλMsj]R1"+nV}@֯ój0ۘrXiԺ OgiHE;Bs@A� !z(@m6?8xT:{Aq jI@dvö/$1S !DaY1 6Vejtl[,GRY&-4h?bc&O>C_`W "Dʽ%(`;vTTVpXp˚55bB8xhkӿԓI{%H=]L^ /u)\XʮrkGJ?5(7ߗÿ:؞tLC6໻'t;2�� �IDAT{<6'؋ڎcge~۶C $XUכM8|R/?\Hcw߉iZ,[V-iJ1~"OA<*($QTU51zXVLsg%ѨJ(x\qW=}7$n8TUa&;G`ӌb"/*Z2҈EӮ0.�xx3:Ke)$54yM S~LD>ƶ'i+hm>}kU &MMwQ]vBm@=X\&Lig漫iݴ[B!.;dj||6{TUck5=[Q ^/$EBEQ4t]ab^Vemu2`Xqxt@Y"qF"̺pGayWlpaέ@mpӕnᠬ+0VTR|mQWV+ݨ[C %,\kWJ޶MebBm-R9>|֭^(ʬ4WMMwoO3#)jذ<FЋβp$- }=.}ɤ젪sb' c۶m۟8m2ؠ-mYpePSmmyγ}t*gb8AߡKĀ#G:5W]W߮ \)JZ܆_OK5hkS*B2stj^,c[`@k8tkruL)ᅩK.y{#:ض L^y*,8�2-(AƏ?]w jkaLk{=O,vy1 ]ht30�bL~0ldr+~) mka05ړhYj9b)V,络@JLe{q2d$0&miL+[o݊J �ՑH½)P+P;w_͑PP\P 4C=K,(gsa s ^~cWLv)b';ݥ5}l:0SӕT82j&0s-5yj57`0Q͸q`Q90 _Jxd?X,*(Lm*TRUŝ&�ק>"[ǤfZ:Ƴr19`C0WG>}8ݑҏߏq0 I3,:Bim^?HaXvCQh̻c1?b$d'Ebs. =x|Z[DvEt >ŷ3nܙ44܎8TT~&؂mia2٘1i䣏&a:>_o_>^Na˖JN?xb�R̚UɫVe`*7qÇgݓcN:ܘB!R+ 2cǎeƍ?ϧw~?Fǥ^ZJ_nP]^Hn˸CwRWJ7̜9 Fլ@42Kn:\~ȑhDTU ᳩ_Z--ABx M(I奼 |QըjR AH`8c3!Q>L~h#wӐRA5HAehE U(*V4!VQ^.Ů4{LF[;Ycc۶S:r l[W?IJ*+0hk`VAY{2g p箻~͆ `xB~d.=N^mm ýގҤ=Ӧ#Ü9̜Yο$8p)A4/eZ z>^,b10ͮ٥\pJNk.0|p.2hlldʔ)LTNX "!TTM[0[n.ƾ2; -WجMRAJdt<4m~L710R H4dt|TՋ!̂I(E4:)|uRnbxb vNqh{8{u(YwAaPK/5tgw?R8@K?q$n0+b+\m-ςh&^aÆ9]ʬ@mWS1&رU}=ڶk��>w_{ojjjxꩧ:=]w`<]ijj"pgR[[KEESLa8ûKkk+w)//cb?\ÔXI( дJ6ly3$} nU*#!(+;v[zIaV_6rPʤRRײxlS�DZ,3~@,: HNj9c:Af~c‡a 4XU6o~in]DbrpHG�B** :cYC m]U݉N|e}8]CQz)aoZ S,11Db lJCs8{o>>E1:S&"uf2"n۶%  a:m`ϭ^= O,@u"!Y2(@q CL&(2*tN'B%:2År a)S47pVpO{ウnj;-؈ fРA̛7rSLGQ֯_СCՋ6dR|eYf;T!Ffӷױ VrN:i ^ouS ?q1%9qiM̪YR*>}/o-ey9gm:M_ojړ_?'%  "B9/[AEQ(J{I;8blߧG陀&cǎ'PD:g 4#e)XQP"^eG$ HCR>"N23$BI$VR)w0)V TTK^'`z}oPJ n]a<P*}`Y d;Q/s/~Ayy9_}Qcb>L:\s5$UP$rFnn3~ܶ嶽0a۽AWnh YT3!3qܹoIdNWE)pBn]mZa[2p6d"[g%e+J91jk=VCJUM|'Di W)/_NC>$cEQ<9ǖb c_T4!дߑ2exXDfe;Awұu e"jM]2iBV鎉)4-6)}dw ]Jѣyw,XA:-׿L^|ׯgܸq>l֬YÛo Ě5kl߾P(w3:J|) v5:.R.*SOËF1mg$ i$***xhmmeԩwq|>W$^R|]XX܆+-bK. 2fL%OgeŋuyǛ6sU*V8W_$ s{άYEVz %1 m_0pUUxsxs4K'p=QUp?kNH=Iɦj<hc~ ^;4MKRU5 'ψ D -$RϷ�U2Uc=pAi](-G[CJhnUU:f㿤m)RFB͊{ !0sFz'xSzO% T glܸy >Bl[Kѭ\97xPhu$k(MK9G0 5{Mn֋k5-5Ĵk>_C[EwLЌcu Е8xvvܸ)gRIi۟΃@$ۿr%ӈ/XN8fnv=\`]vQVVeY\z<^oM6Q__w1 "ɓ'pB~pwv:J)JѝۭY881ZtY/ׂ%a 8\3,__Ƽy/D2vwc18a,ZhTdŒ[WcYdIk3%1fLcֆŶMLdb&a(Jێs?fԨwih$Ҧ#dꬷoc#CwJ[tX$,;`Y G!úua>U\'ٴ < O c`z$ 58;v,& Us~-@Ŷuceë&CEEoȩ F[UX@ U4^4͏:kL!aTF .?$m> Nieu٨c?;ƶ}9¤- ȦNlT2V& Β1u3uqY| !^t|#!2Lӡ..rSnV1#ue[c 2N?=Sʹ瞛-6 ,}D"y󨯯q:y_}Y?X,ƝwYBͥZ庻N(VWѝ{z^#PxR6(>_~K7;N~2H>,[);wI0~|3ǛbtqQ?]oժu9f^GGQxpI?R;}Yf'ݸ8mJ صr%44yaݺi*,X0#xl U:yHCQihZMSѴ(7'< !SQU+}l m[Ek3ir(OD^4F UPY0T1uEO08x26m9sa0"AM|'wg\L])AQд$6rAc,6LrE2su#&tyϸ>smDzg]r)Ms/xg6I gϻf?멮LO.E))&4@7Me@ k� ی!EQ^Ç$+`0J&Eگ-K&"5,KIVX?8`m_O}}4 œO>N"Km{[.࣏&HBg߂ʂtaTqY#'s?׮%nBLx&Æ݅jDc ҧx<1}ѣ'ɴ\Zi@/ikl@RV0xhB@YhfW*a'zgcAU>|L)>L^F0x$RhzqPgRV"]Έr{?CMjkf Ķ%ɤS`X4),Y'e/}'A2)y7MeB󗳹袶wC8o{1d=UwYw4i,:`0r0T~TT8E/;4ja?s ')dzs�TUETlً'e85}y 1x] ^\:R bA9HY>6lht"KO{!~wUl k�zѿ*hZu~<~CL@Q*Җ/'ظ>}΢Z <Ө:c(Z4mC|JΎo4k?>ll'ڏɍ� �&yoIJ;]kEV؀a=s1M|7< ,Y< 7ՠ5?0lJy_T\)Jb8Cj?hT۠1t9pVZ'Fzurɘ1VkؼYfǻG56ꮩx\eٲy,Z4hTۆmK8bgîP)Dv (Mj, )5>d7teeMMf0 lTvm9_ڼ 5Q `[%>ٛ;GJ?Oٳ_#އ>}ޢu clPUUR"6{HَA_G$RV^4-)�� �IDATѻ i*+1th5 M`Rz l߾ U`u_D^QX\Gٺ5 B~,\ e ?>a�ik) mm46cа}ooƶ;x\xq W3yd=}իy`׶m(l")0(drxj\BaFA" [E؟h77W*/W}}U1NN>`'€n#6m[M$DkknPVf:$ Dž2URVEᅵ32:Cm8_*iZn+[-D 4۷D'OS W0Ey*6Do/D!`O4DI zL4McXH[d$Vht0F} 8Ilz d_jkp%n"Zo-Ro駫xb:)U QN29]߁߿ٛcQB盍1g[G eS'ebuKZe'; ?;<\}b~c榮'O;tb:kTgmUk&{ن)`>~<PUӠ$<++E1cXBV7D #ƑGAPWb.t JQ"kX\`/W42wy7MiV1V\`E:]ұ|4*xBV'ˎND*M+q3CYQ﷉D:rWUH&}x9fm+` <5L:|cERdp`S-B>!XCxsMTW,dq8!$˗?Ar433X_liPQ>UQK_`=UmDƒI$b׮KޤmmE [4!N\N0~AhN:jE1jQJ֮B<>@pqp#_eԨD; CL Yiݺj~CyɧH&NzgO>'OtcqS)K/-@(B)pD7{EB;b2H@Sq*E)+�TK.f&@I{"oH5KlTmM ^z)K裛xM@.+q>|_f-{y뭁̜,ӦM']QYiPYimm,YҀ4s󥦕/_>&-g;'3|fEJCq4pIAנI&o33goqXNt,CjPɑGN_fw*RjhUUuM|rRVMش6.]ҥѴV:xKnǵл{/hպL)JZGRpbA%\f)`)}$x ^8a7cڴI|*ɯ#KsWXHqW1kw8?862@+%2M~q7ů_7po=<``2ezSj}PIY~+ [n73jxKضJl1݆U@o)c×ӫP O";,?ضm*--ذf͚Ŗ-cF~:ߴIȺMrWu,hT#3aZH/k ?lAxX ȝwq-}w-ZNngT5a tLqYRuo|YbsSnݩ wz+LwR& Sn) ۱jI7?9Oo#PDm#%x<6M e8{Mcfs0UM'4!|8q%MK$T1�W]{׫�%dR0:fY ybF:[ߪgM_7(;PV?wkk1MB/ $R7$Y MTWet2^|uuO1ZZNB6Nj[8p8IZ!=3XaH-dJ  'w`Y .J"QHh#0!fY& .g ݗ<u>7M@TM"Ʃ$uh!LfBK zrD)TD@T^Wrg"jREBpn rPW2BYEQ1 oV2W7I$ 4M(:c4B$/~K*; D>CiO䩧eҤG9sH&qiү:;q;3xv.8h> Qq[zΚX[75Mu…c͚sime2!=Esb0 7AM G`G(>jjۜs%Ym`e=ʠA"Zo̠uPxB�Gc9眕G!Ug?9E Cs7uO)hǠ0LS!FT'`*͕i>J&?Nt6bb_믿Da֬Yá_.]=y&,^ Kq u=֘vL/[Umn eҤD%<wO2dmٌ;چ?Wpw,K#>,tݠrC~3~%KFv0\2}L? )}KoOgęo dG0zؽ>;gXC6̺sH۞yѴ6ZZ8z~^>m_锗/@QTV^^%C(T5xV,@ypx<+VL߾RY9/BYt*[r*0PESEԴӯNM̨QkM~)\w |vQ#ZzJ> dRP][]صZl{9E*6Ur5~ /@uuu}&H <\uRkftrG)/r(Fnm6[/7}L*l,mTW;sLe29)eV)XrH ƻcאFj&PS,_.M7O~M|3ZPmm5QC< WZ!%\aaxhn"ڂe98^p8쨨rן߿V#S:}&7aQ )1⨣Ʋ4L#@"C{x4MK4:u֬ѣGQUYa@$"VQose1f8",X:q`8*66[nyPNOp `ŊoXjU̕b6mTZXH)&]Tpu/^r챕[hi�{}}>/zЁU-#IZI,XȊϢi;e˥vECQl{@.fn IUMcG_}h<)@+4=Ź⋹i444ih!lt $JۆSwWbY2{-YzC^ ݌p,ᶽb:nͮK%'!x �?TTR Fb82+5 SP6^r+-d2$JkDha{nǛ_8H6KM%55ɼm 4KYB}}GHDpEr`Y}kFu4ӅP䪫.  J煊LiRo;YD=M[2uj�4p hhݲLݲ(O&- i)#9 f2$ԙlB yДl<6`]y&A1U>X7&H T^֋v^)l{2b}l%UobY:jU-#G!Htq{p%P]k?�$r+mgvASJ6*FYKu' *? ছnB4q^usOMƑGY:k(ſ H[8]'7J'+;&+E;b�Xm[+iDRy(\FUj0!Œ!N=u'g0德m]O#F;;g=۳&$JABK-Q{񵕟T5k-U[hKڛQD!!,"lgsT,>EB�i3 x1 PE\疀4²p?Z]v䰣~e;77[zkc{][A޶1r9;;iHN-Vv51ۺu ZsI[95=6=8Y0wX¡ӽǷq]A*NCCETխn Y4MWGyӧrX=5tۙ0\NhoׄeaꡈUC$'0" ʸĦW67inWl@TQ6p]~Jj?ݓImiBgNx2@&p̖z;v^]]ʓ^{-)J{3x ۶q-q%בN,[֗8眫fu>x{WK>?O:}4z6fݵpPP(pԡ*61qTFkT(غNg*EG"'cpɉsq,sao64gvO3.Opӭ;(*WqikPUXL!(-t{߮/FmC,SWL4M ӹ<.w̚+V's7P况ѣ Sk0M3 Dc~ 22pR `Μbcm;Jyy\c$c.ICJ ưaP Cɫ8I>gIc7;DYqKS`pucv P3f-BVp7 6<`_ ÎlWSc;NWLZ$6Q+UM`-'NFq MD-  ]'@yQmջϏ"O"%Ww^u 0d�̉֫nfܸv4Mgms|gd2F 0Yڵ~a,_ލ?zd@L.y?8N 7vOHhxj0޽c_'㢋g̘Y@ c&7bĈlb CgΜc.>fpWマԴ.%YriLx衧X|2nVϣujnkРH{1u>xG0ݚE2fW|ɶ,}M8#r1Ee)Br֦{sil"_^�LfȐٛJF$I' ̀@D$}P!v+hմ6W2Gjĉ)Tu' Ng2u35M`cdoXa`]I$k[/n{w_@^y9}'p8*HrU?*]aOxoիP3K/BUN͜s$P ,#|};}/h%Q^P#`[ZwfFnŽ{^BJs rgPX�� �IDATu0RSda2?)w}*BKV,\-Gt{l;ņ <ӸA߾o vT4'*k.gOfxUM #G-Qu} ֪1E&ݢ쯽~YjӖTkV' D5oըNQ5b1H$JS/̨RDЂGܰWt.g.,i'b$Kbc޼7ߣF%Op-H&L`ժ^~Ԁi'^"w ۮ-})1Mp<&USuvzzx\O'a=\~7y D I3Mr4-aw2+d2 _%Eݯ'x\!EQ^FD9JA;A@BSIf:"(x~; vݤ*EmE C_ ؟-~Hg8 'vmS Ty Ӵ JŲb ˪0~V<~vT^O6ۈa @ض…Ù3g;/U=qkuضıB]7QՌ#fY`$Ç+I8%̙s~M.gNU@B¿Kn|mG"jt 躗 N[]wGɓ/'CgW^S #_u7'5^z/ȣeOzO\WV:D!8y_~9T#F0|=z4D.x3wttp9Я_2ӽsI1BՓV(NayJArwMBɑhQ0IB}}+V衉ރ:Rѣ7VU:EA010q:vک{SO]s d͚:L72gN?L;Op≧P[KɶShmJzrI^zig.ffui䪫fMExgN W$0 ^>㗿]_OկJ.;KχӘ8Fl;&PU{eVEʃ4ũ꥗3kV*٬_UuI {y4T$( Xr%=|pYvW\ʕ+Y|9^xax;nܸqdYZ[[={6XL^aoTMxO&jqۇYT2U=dT3MnezC>rmmRbƏ/g\zcq,MYtݠ"g9Uf6:#$\=R)۷?AU`hrE!zٵ S):)j|aO>}|>#Bbhɘ1K1M~i]T>e򁴷wkCU]w z_HmmlM3ͨQd6F/_^p1h fϞ]Ҧvءx305kDn;3|p{1N8;0lQT$MDjU5˃Dשf\>7R {ћ|hPUMK?g̈́ d2.ɓ;D*N&fP Dd>O>T^”NU$Jm(XǃdJ4a:Ѵ2, UDƕqgb`kt?>:$D )A-\ه|oئ;wyV1O.JW9sn|b1D:*rl[g~haFr yGd '͈9ذ,w?Ӵ8%4w߭G\x8L% [Fw TUIJ 1`K.gܹ?e˖УGޘ?1c#䮻b\wuRآ/ K|m EY_ZATڴb*^؝$*fx"yP"Pzh7]eerOq CO4D WJ|uW]wEMeɤ[\w.nlFI2~^ᄈ0/89WD"_*db|(sݗE WUǁېJYywٰAgʔ&t~,-b#(L`_9_6% 4a;-)LT"4_Ds*FīEʷyW_]M7((зﶼN2(&N.'O޲$f $wӷoY'3ŋ{b0˿w\ͽM.~zo.$k.C(N`puKi]_1ǃ  Єq # *~6Vѡ }G칧.]1dqN>dӧ^`\|G?"LrA1w\;<~ҥK7餓Nd̙\]wܑӧ(=$$"H?1/ 27??v:flܮ!&(sd M|2L}mۅP`;yЙ[h}N|C=c6vO 8c::z޾JC^(Qbqossp8&^T)pcd9~{lz~O@{3TdtSg?8眹\hu}PF37)\UzTT/)s;$oJ=F'?ʙe*ߘMYrZ'Jmٮh,"!qմT%HDnA˃ yy wjS 8ضtJH(6+8_wO󨪍d;L >8N?ӣwyFDO$Ҝv\t_0`m<)bYy KHa\|)"N:xB d橪J,O<11c>4OIZjaXH *a6*]_2e~q *²MzV+9Wۦ2OBQԪJ*& &Fԃ``4TDKDL:i`Y&fqB'F>#pq_?\ئk ttS~4MSb765,+Qp3/=cs'{)ʕ |IRgڵIG_{)*\a&R%Lu4]jSdM' NQ^O+=*Jl?DzUS@+{rH. o ,D(rIӄ9sbd2F1'8yOvӟ?UZxݙ zaXBp'm;d2:6lHdI#nnwqhpbGqt,f^z/|>s0 Eza:{wЧO'S{ (]3#5Krm;9?Dr*V,X,n;HSU}(Y59U߀>[=-s$$6=|E #_aLaˢ~<(HHt0,ˡ`RiY,8b{v߽.nxMUW͋ӴЬ^_KH !WIrtv GaѢwQ'RIEfj^=Æ/YmG݂Ж%1EJRXuh]yAU MLUVF=%JעڔZ#(bp\Xr '@Ufxa7ZUkee0~Ci&X]̠SdiR\H8uԩ(k f!]imdI {ٶN*=*?R k.~SߵD AR㑩LIJ _]IJs|;^c|Qr˭F,%vǹ4qdO/C}I$(qMnje$Wםb1_o,Is?J PMm- Ѫ"FahiDRΝ7 2IBBk?&*FR?ێ?Ǫkjӽ;B3`H]^]I_^,Xlt:;<;F7iiN1#s챫imu燅<(MS?M*ei:`y:0)|p{^zi<n] v/C(a9\v46vr%w F$+<<~bm9EQu,`۠iG^ފZIPH$I_eӖ $M$O""!j'zb{4t5(J%yz6%ҫ)l{8lbcYG8tvf|^!wKsI?+^aRU@٬ݹ]S-Mrnh/áa.Qi71c_ =\NLy@.w){W8IIBBBB8&&"0aD~UO=QQa=낊XpY߾pI-ض+%(V&^tw2ebʔ Ҋ8Rii8 U y~9zb_b9ɸqqM /qٌwfXUZ%; \N:D-e('d^IJo\*NRq&PJ  Pp~)ۘ6) 2fa 'RzEU(Y6bsu%RU⺟*K L$ 4MEQP5IV?ѿL2۹)NACؠe!JHHl T3,Y&[bYͪI~Y$MQh~٩S멫CH< ?a-GeҤ,_vLR*˵H$!!!WyTn%A$RTy)N4]iޠn/MSy޼޻|ʠA) eTTŵ(%{j]MsB{^$ssp9ӭ[G}|^%ʯI:;5 ,!0ү_^lFzٶn#U)Uu1Cg%H$~f.j"J,>^5tzn6H/DDLF!^~3 %\yduJ֤eyTW:tvbƭ?\umǧƹwJgM IDATI ~{֯7ڏOT5y $$$6_TP7H*|Ck,V&S(L?Q0ƍkc0Q<*\QdaԨ4Z9\r^>Fw1~84Ǝ=x<46ZnyD!s0 8ee,CC]M~۲`YіibYVFb$' SXXDF~DU"w~&J ~Z' Bh<ڋ"AU`Z;\dWD j#hhȱ??K,S wa5BR<=4kSKmmZ~1(%EDu}kܹH$( .;~]Λ{F(FI$!!!٫QTYX)$2/Abl'gǝK7\[niܒPp#Nxo?Q.O)yضJQȝ*9xj@W8`--3fB:/Tiw.\u7O$dɿ19Q̻v>1 !\"PB' MFԢLۇȚh%yvo[U!QH$SĂET.[Sw҈mLӦEq'slֱ>XVVS9Pxz{n+ny٬&8G_^NQ$[ #<>/I' @=DdecrdihLB>_;v8SY}61UدmvB_3б78)9yꩧ裏y|hի8蠃 w.Rވ#8Yj+V3ΐWWBBk!Y9a+(îQfA"Uɦ`pxbs"&ᢋ Wk]'&z޴i\{ ::PҠ($ðR g0 qIlɓ'3zhva=G]{e̙԰{c&Vw$ɒuf̘Ass3{lqo=~; צ<ʗT^G{udh(0;]0۶풜\Na&G+RtDs֐+E>y5k k%߯!*l !D}$[$MFbɒ%eVX`̞=;rK,aС=zBs~pXL^u ͂TU$TA+ƠyzT!jrE!օyL퉎S'ޣo򟳥KM9dɤUF*5M2i (G]tV<*辑jҷ@qQM( >(Vq4i$S_"NdTF|RD9@a\6mT&D򔒠Jߎ*qM4Vݯ!*rx$f$JTCZncG;9K-8N̘18o3xv#o%K뮻Fn{|G5kPWWieml8a~S-!!!MP*DE*Y! z݅0rdF(_i*f2wnMI2ux2iӴw[y:=%:U>&XV }wjq|$0ŦMơСCK9|ɤi.<[m'N^(n[o3g2j(vyg[-B޽۷/w}[ 6l َA'hny\Nu$7ӟzCv UկbYܤutwivfUT8d2pyztX$ʍIgJ=|ey3f`ڴi\{[]&LiӾ_/D]mD(|gCU*%T}DD0,ƌ_.[? 'б=R)Nd _ڍv+>*&WEh KEa0l2T<+r*kyɸĖ>EpSDol0p` _M #1>IaL//Ŷ,K-7d1b, Y PIގ($ 'vUuʎoO*^y+'O,H:*!!! #OAǙZFr4E*($pVIܠu5%_uQe`G*K/50uj <͜Y>D2/CѣGPS/9,)h"UPƅRq؄D`*@yT7Àwb_DȂD{yEJN$j86kh(CCCxV|A-k% 45͡ŵ,`~51DjPɨT$$$$$RU!^!?W<Ǻ]]͝w."΅:\zHSqĽDcVXB' Lq <Yl5A0ycHOXruX`Ry≥L/ l :ÆJ*eån!N6 cW7 ['χwtpH%&RD(KQyXhnc ]p?#ONkӥ~>óϾGg8_1O?=UuG[H&pC?NIz'x<_N$,Ů:'*xnT:t8PɓʓIBBBBbSOaF5.^qA'WɉbUJn;4}sE%JQynB^> uzo^R4*#czmm;tޟ;N^uX MW`H$&%P")[}$2Ƭ. FŸq;( +jEZ yXƎĶš_:0\efCd I$$$$$Id[8hQJMknֹ}{5 p85 U ;Ax)qv-ϱf {М'{_<$N kȋЅ,o0l簐\1/)pA,(*W_Cs)\zan*m'wk%,WElc9S8IHHHH|*,Qo Õ<+&ذ(R0vy8oȐ .]4lVbYj),A; U_L*SDd'DHSP3CRur 0%$$$D*)X.HmdįrT"Q&~I4y:;adlr9}a1cF0dHPy([DZ̙, yWd<m*˖)jD5TB*N_i>AR&*OʿOy$y .dTlk~yLE$3M%f"#M55uu6RV m'"g4I$!!!!oS'yA& ;.y.I T::\`>(r E}: ۷/\w%$$6?#$ ωzIQ+\%Ey--J!g~caYVS%W[E*L_>tUG IDATy $$$$$6)$ MUp ʂK0zt'XF>0v2i7 ʎ(tt[ϳs]"T ANdGP=APdA*Ny o~QXQ0UId[ {v?+sKw,m燧eե_5 :d2ؑ_eB{]X:q=$ir ' ͊@ԥJE$LH=LO+B"A&X=-vۭtZEUm᱋\σaK ~g1J ' ͎KU(B;W\rI7N<{9ȕdYaLx\@4,B4;yձվ8HIBBBBAD;? +R)ɯHilͲe+ikI$b1]]ðayTi۳$o^2+Se] m?oAN%!Fc?I:fS5uGSGUKݽu>p!^g4 z *^ciyM.gaVd#Q=u,K1nC$$$$$q$ʯɓXڊ*̪ 9%\Ney=:~3&HL&BbQ RH hEJqh9K+HZ"H"j@J$I ldwZc|Ɂf;;;oK :kˎݮ`rU6s\];{^Y}w(_(yo[k*׀jղZuqhӳx j8t@lzOsp H}&7T]<5gr=}W aGW^z;n0<%yj;_WsY)08ש;I^Z n"" >;`MM!PPrx&@QBFa'}% "` Rҗ'vkqr^Q_eaŊ2\8L@pL8ƏF׮V*팉3Щ1"5T1418Q LN$3Pp Ta'7خw GϞ7,6m&NA2=]ȕwc_T;v ,+OD$\gp #|_;Ëgˏr_c1y|SҢCD:;7NP-^Xp 55 '""[| @=(^_?VNkW4:uy/5kz=nTTThfq1c`Z]__ozgLDD qqqزe ><#Gd$%%!99:_]"""Y].dKv1`:""").[@ ZR{"""" s1818181818QGvy!#% "f]>& hldp"'"D--vkjb 108QZnK_B~HIa-(huֲ :GUϷΑS ND{A|kn>/bp""zuhMQ4]2&bp"""""'""""'""""'""""'""""'""""'""""'""""bp""""bp""""bp""""bp""""bp@"/r"""+.8E.]`ժUP+(Ʉ@cܹP3(())AZZꫯj>tENNCVVV+_a"""3 aӦM(++… QTT䵮lFFF}YTUU̙3x'& #Fmw>g}=ƨQֆ& ""0]Y VX ;;XbkIN'N@\\ƍ.]'ğg@II .dff"..gƳ>jٳgQ__0mσӅ1:x ۹(//ZA[OQt][~q@N 6`ĉ;v,6a+]Пc#`x駡鼂PUUǹ݌ \0g =z쩭;wb̙` SDDDtL>>W@ `ǎ --k;]tC߭ЖbÆ }ΝCnn)onnmx ."Z:\wuؾ};1h ,^(++Cii)&LƐ!C0sL`0Lٳ'vڅXs=7o IIIc0b:u ]veP"""e &&(((@FF͛B1}t@ΝqIHJJBjj*/^ Eqq1򐞞n޽DLL O۷#&&0l.[2nW.'"""m8_FQwߥ,fɓ3Z>,/555𣡡,& ,F,gϞEcc6 6>}𣥥,fgϞe!hllhd!db!ECC ǹsRysHsZ_w6<'PKl6jkk؏f'z'ш'@}xaK b^Gxx8>]t裏"4.CBB`Y-`}.1b>LUUѣO;]"ƒ:Q˟zʷC@C\^{}Z3}q~ ~{4XQ+.qioNQl۶ )))ѣvwLɓ'`0஻j==CG||<,YT;(ؼy3qW/[{/Z[[Fll,1g8K&|HJJBzz:vs  $?<;AQQq5`޽~sw`0`ԩl0`0رcAu Znu놌 ߿o} a0nCD=3ARR1hHHHu]RQUǏ`p8( ˡ(cAU~ġCgܸq0 9s&TUb`0`ڴi^Ǧ+kժUC^paq83f fϞn݊Tt Wnw3f-[`ܸq8}ێ( &MDTTT`2e Gii)>CASr̞=;vcǢҫ>wy'w ==8rN8ш ܹ́s7nĘ1cP]]ƍk#<} @MM T'Ng={PTT|L&QFW^@JJ f̘6F[CCjjjPYY6xw^[#GDccW} TTT 66fҮ*,,NѣGgdddM}k())5k0rHX,8r-0`N> ^ٳgz聺:jb~4ٷo.]R;1bn㦛n϶{ 'Nć~ӧO#,, =\wڅ+Wx71bKk}n 6 ObO> EQc֬Yؾ};ك^z wnb{eѢE,^X-[^jj*fi;_:hҥK`Yrz)))Zjkk%<<\vz[n Lf͒7VӧO& ASKqq|yټy:&s)>fYrrruo.'N OAAرCԩSe۶mn;wέ>'O/… u}])((iϞ=ꫵGiizaaaڷN:!&&|z>(ƌT޽[}8^Ν t;v,Fgy)BJJv;77%%%^DEE!** G,Z<t}݋$vNN綎 Ǐn&̛7'OF>}j}[nǹ(ڵ+:wSNO?ESS~Aunngggc޽nl6$''kEDD,/*hSZZwO>ꫯikkӎኢ >>aaa8uz=>tMdz>W_}5h_B׮]YYY^immEzzV 111nL&qͽpE97s)SgϞ;>se˖-C}}=~ìY>vw҂~ϹCKyGDam%Kh",Yüjh4?<8p Μ9QU_#"lXnV\t__}Z[[tR,[ YYY3g֯_3ft{йjŴiӐC"<<Gddd-Ns{deey֦uuuիvwTqѣݻzVUjECC233eEqq1/_Tqm9vur/"hiiAcc#'xB޽ AQ[[ߊ틚Ǒ~9DfMMMرcZ2tnhO8Um6Ass3, п$&&jմ,YYYnӄ8q}uE hmmEZZ3Z s^Ԥ>y$rrrRDP__͆k| 0a\x1wܠOff[Ѳ2DDDhsp8н{wlo~Ў믿oQꤱQj9~fٹsvntȑzjZyf[m̘1C~_ᐖimm ߿_ $ =zSNIss[} &k׮dС9oVf466[o%AS{ʭ* R__/ݻw~A*KKK[N.""FQN<)eeerqQE îDvaÆIccIjj;wN80`IKK^ZDDAN:%fYd„ %h;wJ^^455dT1L _|񅨪*6Mrrrdƍ"o=ZFrr:tHZZZH۷?O=z477KmmHcckikk,裏bk&cǎu 7ey嗃k۶mrl()))bXNOkkS>X,tR?~J~Vf]V4㏥PfTWWKJJd/RTU*iiiuVX,/˝wjhoQ?1>89T$&&Jbb""r}ɯ~+CʹsDDD^^4Y+VHn$))I֮]Np8DUU1LrmIdd >\FJ~$::Zu&SNϲe$!!A*c}80tP<ڞf?Eh?I%99Y@Z2dDEEI~~Չȉ'kHINN^v{PtuŋK||hwءu[nE=tΖHϗy* .8IMM>HTUO?ԭ>Ν_%Ǐ&رcA)Y!/JO>UUe˖-nAITTJssW^yEJ7IDAT%**J.UUUAUKllCHi&TVV%**JnX,1yȐ!)}_9f;}  ߪOGڧ.V?u Z 0d}.>\!"""@:肱|PU&L'xk,!""'"k֬ABBFŢ e &NɄ|l6֢ ,īꈨéC~~>6n܈,SuDᨪ UUMEDSuDԡbccbI@:""" įXDDDD NDDDD NDDDD NDDDD NDDDD NDDDD NDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDnD4IENDB`psignifit3-3.0~beta.20120611.1/doc-src/sigmoids.png000066400000000000000000001171071176542545200214170ustar00rootroot00000000000000PNG  IHDR XvpsBIT|d pHYsaa?i IDATxyX{EqrI55\KJ"5V-vL[NVi`* n {A\s' 3..:;s}γiDDDDDDF`:Y DDDDDd4,@hXѰ!"""""aBDDDDDF """""2 DDDDDd4,@hXѰ!"""""aBDDDDDF """""2 DDDDDd4,@hXѰ!"""""aBDDDDDF """""2 DDDDDd4,@hXѰ!"""""aBDDDDDF """""2 dt/^ Əo7nlllpe<}Q<6QeA޽U +h4F}&LV gggtڵ=AFvv6ԩWWW{Lѭ[7?ӧF˗/cÆ  Æ 0x߽{< Ѯ];37oR[t)N www3uAzz:bccn:L6 jG}UVҥK={v%>ǏG`` \]]1l0ԯ_7vލ;vC#*Sᅦ[l7oI&)))8t6oތ^z p1vvv񁇇޽'ObڵX`lmF?vvvhc˖-FtMddd9#2(hyf{gyFh4BqFFF/99Y-Z:^\_qVZCܻwoܸQoh4"""233N #))IڊzSN)W޽{ήŽ裏F+8"jԨ!K"Fh4P!g_~h4bE{J*ܹs%z`rW^Ů]мysL>mO?4Ǝ7n`ӦMW^ [[[,X1cƌR?{-sY^F[h4XZu֭sիs)-"j^z 4ȑ#q\zBݻ!VfBoիW>dtK.E^^>ShѢ+o77"aԩŞ={*eěonݺ%_50wBǚ4iݻӸuV &jժX|y:u ;zMV5`Bȟ}BѬY3qx5jnݺ֭[cƌؼy3RRRu-$%%I&h֬Y<&QECѠ{En{'QZ"8#FQFZj _U(ӨQpn}q"󃍍 |}}1qDYg"<F>/_ԩSѢE TV/NNNpʒe˖\kР ==XZ0rH$$$<,[ \:q,)AvR~ 3zZj}bҥX`Kh4G۶mKX]Nr?QeoGŵFSoӦM6l&M|xľ}]L}6m+WO> c=w+Whgƈ#*Jwر#ѣGΨR .\իWW=@ByyycX|9:ww"00ׇO95bBIKK+6r73w\W^y 222plڴ +V@^pbK#^jjj'2σ=BܼyߨVN8QdхEp)n8 x-y;~:ߏuaÆ ٳg >(={DNN=p|xjOd(_^S_}Ұ~z 6m[l)y?}Y7o^P;vDv bHOOᅬ*U92q)˰wboۮ];ԣ>gڵkE_ܲQF 0˗/Ǹq㐙ȂǵZj¹s+Qek׮ŶBcٳhݺu@/$oFRRRԩw޸r ;V~vvvҥ ̙o GdL]t;v(~gϞF!CV\;d[JII) %ܻtRQSL;wf,[ 666vΝqm:/ 22H;v,jԨ "::?ezmf͚}qƕd=8L~ӧOǎ;о}{\r6lFʕ+ M1c~W]III͛7ataaanv hZ 5B^^~wĠ}ӧO}Po߾F_y߿k֬AӦM1x`ԫW׮]Þ={0f|G#*=z`X|9Zl ___a֭jhРA3m4h۶- GGG߿ǎÀwŸqеkW9ؽ{7nݺ6m}6wM[nhذ!ܹ~ 4hPB_|"##ѻwo4o8y$n݊Zj[X2:OOO,Y*|I <M6ŭ[pA899aϞ=2e パ#GaÆ /7y7x+WĉoǏGTTyl۶]\\?cذaѣ///dgg#..W^Źs*1v؂ 9Ed_ Ѹqcaoo/\]]8zh.x ѰaÂ5ϟ/FӧO/tq B|wbРAQFN8:: ///1k,U<{L F#z]p5ۃDϞ=b"66LvDAӉ -Z&N*҄h׮]/^XhѢ]x1{laccSh/|+W-[AW_W^۷_իWO=X`)oxx3fxDžW^.\0ؿĈCu [[[QNѧORp]v~Z8:: V+w.BCC޽{Fs)ѢgϞIԨQC<"!!Ķ$^~e&D͚5Enw}W~ݯ8qBh4.OE$B#NDf*00ƍòe0i$q˗???CD&*gf֬Y={8d8V}駰/X[ +n@jHDd&h"s瀐;vVŕ+Wyfdff/(Dn_3ϠnݺHKKÎ;pE 4#*'!!ӦM+ذX&L8;;CxAT>} >>7oFjj*VM:H̙35jĉ1o<ՑȌq 葕3fo߾puu ̙S]qժUC׮]MDlkD¶FDׯ_? Gl<쳈7|-[^z߿w&TlkDFDs@7K}O?$ĠSN^zM61c(yA{zz.`1h">k.\.^\K ;[ؼy)=Llkܦ {в%м9@@M)xlkug mmِmZ1VZĉE'$$=jժOOOkpQfM?G@b"p hhxYxɟG)s_ߕm<[ ̚/^z RŰϭۚSٸ ֬ )SpatkעsΨ_dM.^vv""[hh1xB$QI^z sdlkDTX`ǎu233U>BCC=1qDhԨ`„ 0|p̝;Xd Ν;]v){=d=NBB_~NT:wL/:uCLLU}dʕ/WlH`[#"SSLKb7l؀ 6@… xG nooݻwcƌxqmm;v@Up@POѣ4H=ooIb[ʴq#T?.{Hb[#"S.\x}V\+W9^n]Z R^…u 8 CM5mͲۘ -觬`[SwSynk|T1QP`о}{*PEOxU߈ a׵)f۹xyr 23Uc>X@1dժNFÇ!?h}9aBdFlNRRf0D*ܹ ԫ'`٩NDDD%aBdAAwHC!DD;t9R!r9AdHGa[NCDDQD&lr{wA1,>&mӧNCDD ;[u ӦoиTDejY/] ز?bcSݺ5k%I &21wʞ\)ST'"2=nة4Dd*ΞCNrrx-Z?:bBdB||dƍ /NDd/?Jyy't^ * 8p~] to/ ''qXl``~ , xՉLӝ;W_=: ŋ@x|42R.R*Хܐeh͚>,@L@nܽ9* ؾ[u""ӵbs It:9j`VIJsg9_geOTZ,@Be ,>J |Ѥ4Dd(:[ ߀@>T^,@[X ' /BCU'!"COݚ5/CTQ* "0&LP-]*Zo: U\`fپwZYt#̵"./ |4D?`*I2ܼ)7[9y|j`0VeX)p0bPv-!*~mfI"RSJvUFɟ|Ru22 D ̜)-dyyXU!̔H|\xMaCX޽NTZ@rND%/O.@Frd "#ʒL: XhLn.FDW8`h?5RTs"#z= %X>Jm`FѨNCDq6[K_$ = DFsdc{⋪QiU/^͓ QCbAȀ>_ωq9T'!<#WuU'"s!XD _X8:NCd~oWwW <\&Yu"27!2ٳ́_VTu8KM6Abᅎ?8tsmmmaooBǵZ- L@H.5zrgUrQyTW, = DZ$%%=wԩ;#deeaݺuظq#}]&ZNʛ0Au52 IDATFڽ[n<ػ$C`d 7W+F$Gjj*6mZxڵ nקcǎضm  TO>oar7o=?''i=hn}{SΨ<֯~ 4P, ĠA0p@L<ժUÞ={0gdff>S l`Iۚط+ș3딚 0|80t4diXR7Biii' uUT|cǢyz@͚5 +qR+/Xo\Xzzz簭.]|:i+k[S5s@NU5z8 znt&$${YL8^E]vN l\lؠ:Z}+öF?uSĴlgۚ9z9(=レ,:j*SNzmܸ19RxLLLdYx)I/* hՊ?*iNC= zGFF4i`ܹAAAh4'"00ϟG[oaʔ)ŤI={`ܹ.Xu,ùs@Dj$m Jk :عD2^Z%ظq#fΜYf!-- XnFQpNN!DW_}Z/ÑGyӧOǿo/ ䷵]TFlk- zi6 3z\ׇ!2 )?066ceĽ{;KEӘ&SM1 а4kSDc9  زE;i$D/:hܘ yyq`dxET?tl: 퉈oY (Hu!*W$bV$2bc]U'!>B.jd !*5kU.DT1qqrN{@o `BIZ Ԩ: 6mT'!> [{NBւ= Dp+d$D!&Fnig: u9{ V ֬"q0PfDd ԩNBքQ˽?l؂*￁+WU'!.wWӐ5'2RSQT'! G,@kF -{Y!* KN#;rWhHu"@^@檓aBTYYrUÇe'ŋ޽ 5bBT۶w/: eBt: ug Q 2 >$D?78Ș9իNCֈQ)ed;v#GNBd9'?D$.8}=ZuV,@Jif ;>\u"xx..YxYIZ!*PKCTbcvT B3__VuV,@J!3S1l$DCҾ$D#>pg R ïUr'p& "c C{T R d7VrEdï^xS }ؾD-6VΩruU:9; : Y; Ds|Wu" DƵmP*W"X=ĦMO͛NBd9aY֭@>rt"X 7WQȲ\ m۪NBdҀWQ7XUxqDDyy,@4!*I&BTKNBdÁ֭4!C```@QȲ-"B.ү$D "=KdBD1'U  ?}NB$!c@zRȲܸ\DƲs't: H͛{{I,7{@cNgO)`BTdQ` I,ϱc!2w劎ު? Dؾ= DT[[I,_L ɴ)AVVGGGm!!!>ٳ'QjUxzzbٲeLLe6kWL(ۚu9~hFu vf"#{YV?~T___=zC???t:xܹs3g΄N< !Syݽ 0k$փmzIIX3)+g2%&4Xn]}nnn"//OGUT/s "66\r! Db$a5ۚuILk^I,OI׵vLdxn ag'ŪX^zXM6Abᅎ?8ts/^U_7tL2m'T'lk%֭6lgػ$D#11yϲQ&%%=7** ذaqڢQFxcT1Baasqfca[.Ǐ<Ԫ:ua;N{u9 ziӦE׮]v}/\~ӧOǼyݻwcΜ9r ֮]kT1O TzYN@W:EE=z 52=,@ @!33x;wFVV͛9sI&z@͚5 {$A.`:nc[3?'N&Na*5Wļ}Zťo n/k׮_~ñcJch"k׮ɩ"oyptT<"..۷{ۚHI= mMe;T8rw]uV5z8ѣu8ut:] ///߻x`ya_I+cc[(vf}5& z ++ Z nnnԩs !vQacc:$3Ur Ŷf=b"YTQ(ң?222ФIcΝ *gĉ ѨQ#qcHMM?={`…2eJȴ<8裪X5qв%`wc;.yy@t4o%ظq#fΜYf!-- XnFQpNNWk>s{1̛7ӧOWR!ȰaX'5p_vf=L[7I$e'5r%&F@߾XSM1Zπ7T2um%@@p&U1^9 Drt"| ܹ"c8ph׎. DUNBdN"EG]NA zrT'!\ @ݺ '9x6 d"#NBd8o dX 4D8ƍ U'!ҏYwAd8nI,@ /&dXU;wNeBd8'Obaegqq@ΪYpKu"˕h4ONBd{.]T'!* jrU'!\ cժNBdɷi: QXպ{ػï Љ#&x)ٳOdXڿ_ܯ$D-11p d"" ȐRRВ+WXy`BV+<\~h4YKm"Kw dXUzHJ"CKHfT'!lqB2,@*EDȞ>}T'!l'`k: e;xï|!tNBdٸGr du]t? +!A2,@9ܸ.]nbvv@۶ :@͚rN X,@ A'.DY9b +!pvT'!l11AY4a.Kd йᤤd^XUٵKN" XD !l NBdٲgYZL P>и$Dr:{?  7o@ȡdNXHLT'!|+`q"͕9 ဓЭ$D/!hH.yMD(t27,@j{st"ct"ËKw: Qٰ!wEG  {99Nd 7oW!2]U *; dv45SO@oZm"K \<$DeYYYѶm[q>CؠTBYp+vfyN\uۚeBVuS닣Gb޼yh޼9N??R=Ʊcǰ`ԫW.ҭK,@Lۙ9qU'Y NBTv,@ؾ};vڅ`9гgO\t F ;rss1~x8vRSSc: =2%$pa[w@@j֬Y蘟_W)!I`v`PIGpp0 oQ5C8~\IŶfݓC>DuPֶF$X'OZV:,4)HhJy7=766VzщBBܩ:u+V*Y3!xCu Ķf{ۡCX/^=|||? 44#F(8j*SNŞ׶m[ݻ1!+Wc", V Cu̲҇ܺЦ$ 5 h@v =ooo###M4App0v܉ &N@?53zFm-!vfYG mrDFGfo 6n܈3gb֬YHKK'֭[W#NN55 w5ׁ`rIa,@*@˖Pq_vU'!x_28ohǾ Y3HN4Pƺum,ԩ޽C 13XRuq7HaaSO 29Ȑ"#5!sA"c `Dd8{={ʡDYt``Iŋ@f& "C*DY-[.m۪NBd= c>߷$D,<;1S|

P$D)"6UXEIJ.\+"cg! /2!ywoI˱cONAd.]Μ+,@Ȣ+0p w?'2௿Bd(rgQr!q p(0d$D%:{@ cV{w%`BcfΎ[|^fQ勎:Tu^z:oMBl,h: 6:wVr!u+NBd}򻶶Yx KKކ !wwIOl,իaU> dnܐ;Ď: Μ"C~Zuگ᪓Y8@ D-'G /T: QcBf-$D~: 9|prxBu"o@J 0f$D]~EòЉ*ך5@˖@6 2[ߜGƑ#@ǎSY71cFu"`Bf+([Wu"sp"С$DeZ9qXI d.\;NBdBTy- +`Y*YgZ5T'!NuY ) ]1Cu"cGjj*j׮]xR?Vnn.&LV7^R\ mt)K.gMVuK0qDDGG#44n\c.<ͽ?̝)^צɔ]ԭ Z% d׵)f2-[!CYٳU8LNvϏ)ؽxYIѣW D$!rB&2 ۷[NZ>|5cs rx%U!"رx9IDž 8:NDdZXIk %3Gu"M.=v9 IDATȥvVvJ#aB;{Lu"䷷j;NBdwU6T4!1g:s$Do6o_hNDE * 2 %-z/qqr Q"*7ݺ{}aXrBo: ۴ ppt"}Qi֭@S>vr}mv4~ժNBdz+6|9Ru""R ѰaȔ7 : i>E.⃨XRoܹ#%" T : ػxI`!$tH\l=ZKRzc ݻԭ:ojT,ENܫc699F `9ɼONuJ" *7x%xzNDDII{̘89NCT>B"cn ~}…ppPȺ!jW6=zNDD|\nU'!*=N:p@.ro,v Pm[y}i`Bq6@x8/\Ȕ~ _\nL_Gʍ2?h5 jU'&"}XPKM^x6oSwU'!'>vMVЩ{@.rj%cBI96#CީDDT?= 2d>yhFеo/FuB"*/ Ti֮^}x19Cu""*ixMi ۺUn ,dQݼ 20f 0t\j[ r+25,>,{@B~x5 3XZ!'2}oÇNCDDք= T.gȝ}|'d/"ӗ+ȶ/V *KI-S[IDdzK‰DDd|E/w crUU'#79[7i!22PG<!~f%wU'"""k!X%B@@舶m"$$T^v ƍ+U]bϞ=N\~7d/ǰaޝEU}A6Eps%}% lQKMͬ^%2mE˟ZjniK. * <'ȑ֙y|?5ufyq s,BO&f:і/>۶5Yl[{΋3-ݹv2%3f-9\s<x9Cۦc>}`ҥ:u*6mڄVZ!$$$ߓݻ֭oߎ *V`DFF("#iѱ#P>5jvڙݷsι?oʕ-oR!V#@Z] rz;H{5-0WDuMV LBw%-`1#%%kε7ysRSSs^W}322G)tի+ʕSW7UX={[ZZbcc ݮ%j6;w|rm&9^0EOChhlkP A,Tj޽"sHOԟ^X3FZ7oϙ;j;\g@rx9~$%%  -ZHiWf|϶:Hiasmb~Ω?7Zg;1Ǚkyl[KfoXgNjjjyۣG,[ d rHJJB=L>\#rMF5rL]1q`03{!@Æ ۨQ#O-Xk\v ?///1rHi1<ӢW^bРA6pҥ\222DժUOOoaȎf}5*  6}v(J~8 P("̙ctN(RGի8zhqEia&MsmSڒ+?< oaʳmFky&s͖&#τ`1rcY'WBc…zm~~~8y$za|pp0@ףk׮m7==o&~mTXiii{Po(Q^^^0mWV-׶iӦ?̙3o8yCJJJ9ۂW^,y%’gEiR `2d\sz- L{ׅ(Fۓ(>xwoaSNӧ[Æ ޹f (e5W^d~2ߢrZ#sv5e0 ڲeɓzܹBQ,!v!vܙc,<==Ν;EBB}Ӆ(b=ƍ(ѣZ0 maz_yy8BVs͚#sv5e0  {gOEdd/xgm}BQOheS\ݻwb"""f 6Y}>ORllq>2T,, f?0x{{> 0{l9ZرcQF ̝;Ç7y\6m|I={|}}MA)))´iƦ( Y1k9f;Ҧ(-[s\ϟ?ǏGǏO?^~e 4lֹܹ36n܈8t ǎCFF:w \֭&M^9SI|F?k׮bŊ:uɸq\M]dʕ+#99sO>6l@bb"n߾ms,i ҥKPՕ/_9!_n=ˌyͦciynI_z=9FTt)))Yf}(uѶ޽{cPovm~4;4f}3uP ѣ>}}Lڰ4j hӦ  ___(Q׮]×_~w6΂EѼys!LNs˾zi*Ǿ} ǎ˗sm߱cYf9ڵkT>|V`]2e( nܸ`'++˨'0f-[`Сy~1.hX⼰ӧOԩSEn.\d|Lj7|ӧcʔ)',W_Fd޻wcƌm,YbtyvL=($|'puuŀr=0tP8߿oDc1Ǩڵkg7ݻ߿?ܹUVa„ 8x`9jJvQmn{v]^=xzzbϞ=&FFDD@NW Y@ <~8um߾2!ԩ ÇA5jƌFƍ\rN@ڥKlٲ:t{g_ 407n(hǏѼysb̙F ufBtt4jժW^y&MرcѫW/TPSLY\c1*7|=z4Ξ=y={1cǣ[n6m:t?60|m;6mڄ:u]qssÀ &ԩSOW^yo.\0㳮]cǎ bQreZَ93f+Bߢ~?>ϟrʡW^1cիJ*_~qn:Ƣnݺ裏UV:(fN+sشiƎŋ͛xG1f⋹^?n8t_}"""pxxx /m"Ka1ǨhիFѳgOԮ]YYYHJJBdd$|}}qa[sEst:iӦ:t(Zl5jQFGƍqI]^;k,ڵ _~%ѥK\zV­[7:~aM<yqFtʕӧOǸq |̇to%Kg}ovθbΜ99r$oߎZj!99k׮EϞ=x`$LKNf"c̡CĠAD5b˖-̙3W,L_5g !lO<(](]ѣؿXE:u([޽زeK.T@K IDAT@p~Gѭ[7+J(!Dɓٳgs^gn}l]t:.M6vډRJU^ԩSN˵Hll޽(U-[7àAKOpʕ\ܿ!!!Xv-֬Y>}H1Ljgǎڵ+N.D.Xd1}~gt*T@jj*6n܈d<3bDTL1""r,@bx zHIIի7|Ftqqq_}(xmXޘcDD]ldɒ%\Q3Qޘc$` """""bFzz:ƍݻ|tZ4hʗ////o>לD\#i 3^ ݻ77]t ۷oW_}~ +VDpppWa%r5"`Vpv %% .,-BBBЦM@.]ФI7V1׈lFDZ; Pa2֭Cs~I  {… !0׈lFD2x4n8FlCbs,7m)))!1׈lFD1 rUp,Ν;HNNF=P\9`cbنsް???ڞ~' `؈dYl^~eFs6k΂4j̵СC ܯf͚:00z9sشMm[݄`disg'6mҥv~d{ 0 $}lj;38{8yHJR?9?̚U6kx9~TsԩrY9M} +|5g z7x{E֭XlڶmJ*͛,^y۶FKC͚;>&m9$}lm(`> #C}|y^=D͚@@PP*P2PܞJ53w|ڡC{s*c#VVk΂H6n܈[n%sBB֬Yٳ'<==1d,]V`;w.Yf|7oN8[J{?d] C̛ʎ~0ݺl llެ^yݺ[hxEI.5wn9kO۶j 4m 4l-+;Z2Hx >}Zիzj($T^hNu777l۶ ƍ[o۷oYfظq#:v(EF̛pqasQFz3<\2ԩ l 0Frm5{6mLLF$III~?k{ xb+DEZsпzY|sѣꅆTol L +>ٗS\[HMZPswovm5>!@HHӵmvAo+V% Qk̙XkM(=mv?~YF45s>){$Ull,Zhip"#ՙ-6ibL]z=0~NTDBF3 $;"+Wԫ͛xY<rZAd{O^;zT˨,]?;w:DCয়V{\uv$/"ٳj2nPP>ЩhR] zxeevT]:ŇT"رi61:ׯW/ ;""ǔ}:Մ ȖXy#!"KXJj5dGD䘎WIKS'vUvD$`}¹3jl],>%6AҸgg,QH8PvY3Y޽5kyDvD$`…sU"{7q"G u8Nа!i-;"w@ AW(;"*>R>5%'GZ-,>`BT(V~~Jdϖ,Qx}wdGCҀLV Q N\^  Zu X +Ti FPl,+;"*3gIJY̙Ɏ] W]Ȏ ]uaA//`JUvDDknj,Q_"e+"{LW c+)XSx#* }]v$DTP#Ga ct >1hPv4d8(۶4i";"*X"k6Mp>mH^2Q>m_bիÁfdGCծ ʎRM`^[7ّQA͘D@oʎ `!2bBd/N:URDDs8|dIѐ=*URC#"K xuّ="3,@/9'y5n.T #!2c.uJeGBD3LJ}щla2 7dGBv=?`"୷.!Dd=B^=, ;Wjth֬V\Y}ׯ_; ĬY`05Yj,v wߩ\ o3#eGBc@ЧO߿gFݺu|r`0 $$~6m3<=z`(Y$~w{x"̙cwAEqpСHs=uݏW^dGm3E5]eGBvMIׯ+Vm޽YYYf}饗0ϊ2eʘ/&&F111 ps⡏ F. ġC#/ZFٟׅ(YReG"c,3֭[oooh{hh(Ο?={ݷDpssvoooZ%^hysࡏF ʎDۘgd VA#!{ČxBF;rHܽ{cǎŕ+W+V`ڵ?~U&ˈڶs`QQǫ=3xVMv$d8ČԮ];v__ߜiݺ5 ...1cƌcb.]vdGkTT *<#;cQq= DFKȎ +ؾ};y>>FBBB$Hw@ /<<FҬsyedWcdGc{̵\s+W|%;۲5!{VmVn:x(X`}4h ZjkG}$Eǎ35iû QHC~5sbru#юky_Ld_5dG :t(J,̚5 AAA9?ܸĖkTX?(Ky`Qq]%Kʎ <]'NĔ)S@Xy``"g믿ooo|7۷/߿իwɓe*|-[ʍ0ר0.}xhL3yFEq:9ҥ#!GːThѢbbbмys86oyŘ`Ex9hk-D3o0jp2Phuq c+"-[(S}щl߀ΝY|e!׽{@\ "XJ]]v4Dm`੧dGBѿほwYijeGBvP.>HѰ!WL MʎLYZҭHÆ @@PHѰ!WL ij:u+77ّ9>!ջ\,ѿbb?> -;"p$Wd,@@?xVe$;"]Ȏ "k ܻH~+1Ҷm@րH!iŋ@t:.Yl zX^^#!mؠZD\ t*;rT,@͛ˎLYh(WNv$D!"B]];ّbBN/3SH{6oz ڷ<}/_=zmٳ/9syE\XcZ#@Tо(GasMf5:v R`iEF37n#G`0m?taڤI5=a+h)MtvݸCg+a)~h@n|Xѻwoc͚5F/^ i/ظq 6@ӡUVV>F#YXLWʔ 9v2#88AAA1bnܸZj!<<7os 2K.Ebb"U4h; 6 )))W"""_7yٞ^ϻZ\(WOv$yFdπEdk,@vZL8SLAjj*b /5t%e{9>#={6yoʎ\sn@6䭊yFKHZ&pN&{PSLL YKj׫ի^yŘ@oSʎƾibL}(U X }y]|DNЉI %hVv$D @#!g^{ّQ={<@=>rFlg$Ҏ{ueeGB\*T$ rz=Dڲw/к(ѣ~E!p:piɽ{ DdbBN!.N}dBE "2cX<,@)eK%{@&#!r.gwp:B\zH3Uّ9xQdaBN!&Љf^U+Q977F ّbB-jO#!l7oyNTrq 9+ ^yH;z5/[ 9ySGvXËUo57h ;"ʶ? ʎ< Ԯ-; rf,@6߯N͉!l+3HJbBr!DZ?_p,p> 9۷Ç9HKҀ'XpdbB-.L;DZ>!'ծիˎ rhN%11PHωE2!ҲH([L:kg"-`B]'6㲈daBZVJ,@u g#=!)xyDv$X^iЉ#.N}"ۻxj֔ 9; SWZ__v$D-&yI$KrdcBk^g ҎXub%%%R bBk^ukQуbbH$ 9; ._Vo5!Ҏ[c8Hd m`Bi>v8N ѬHSR6!w/Pi^ Ȏ9!`B){Ȏ nn#!r>YY30GNEz=r; ,@< mʎݻs,HxzzYfXre3i$t:4j QâG3琐ܿD&s^iC>}~̞=u#..}*Vl": ʖ 9꘬ƍeG⼘kiBSv$D,@ڰan݊pйsg>}cǎE})33x[^0Ϝ^ԫ*%;\3geGAb,3֭[oooh{hh(Ο?={{Yf!-- | pp ЮH gC6bٳ,@H;X\W&$$!&IDATÇo$cS }`9A]?aљ3@j R1#%%gosVVVrG 9:܄/N!;{zEv$dm3׫ek52V1ԜM9s L?%J@ZZu^VV_wwwxxxm;,, >>>FBBB 1wX`֬Y~l_x1ѦM5k ;v0&@XXnܸ~ if> sadGܘkTIv$D* f#((#F7PV-cX|yLC ҥKjժL2ԩS)S&#ؽhDNy.\.]t٘kYjU"ڵk1qDL2 Ċ+  |DWZ'h?3>r|5)xIkoXh111h޼pŋ@FhbLjLYx}պx^k1&gԱ#H8r#{iK\z<BZBd$PzC"sX!s'~i͛ɓA$jHKXKIYí#sٽR;w܀eGBΝSTуX۹^QCv$D h@-BHsBّٽeGADt"ΟW'hqq X]rEgޭHA ,@d;w?H{X]۱C}"m9rD-BXu!ԭ T*;"z^.>ظH!m_i^Ԯ x{ˎȹ?٭g'HH;wk٭͛w@`P N$W BZ@VHAII@#!rn\٥,`{wّbcGv"w@HX]Q!;"zXl+/uP' aBv?ҥ֭eGBDH .\PWA' d6nTʎ$zݯxi ;WOˎv

HaN/*Ɏ(7 dwhтT(6U !bBv%3SWDvRّ9wT M,@Ȯ);"2%&FCIDr]>!-bBve:u}~!ҞAO".\PY!!/@^g.Ĩ,@xQ}dBZįqd7zwoّ)11@ٲ@@HEb]#!ʍٍu/7:ɎLD]TȎ(7 d~Yii%-cBv!>8r_v$Ddŋs,@i  +W>>@PHȔ}VAD* e,@HVRɎLٷ(WQCv$D!mcth֬V\~VB^PjU|x瑐`O\p_92۷hݚеPaBZ$}ҥK1uTlڴ ZBHH?`3yɓh׮>lǏ?3yt*;}B-@JkM #XQv$Df2iBQb ݻw"++쾗/_εʕ+SkfDLLLw0 QFɎ*fّ87e;qBɈّ8&; f[۷P?{1oy+WUT?cXٖ-KʎfUyDۘkeBqČxB3'jԨkbb"ѠA .}hLv$d-5oP:hsy!cbFJJ |}}smޖRceffbѣ-KI֮ VG\{mȎ\sW:`&҄ptC 5k?}c-$$!!! S~Q:pHs fMKKI59fΔsaQ^._ّ?XgjPjjjB`СX|9,Yg}@mϙ3͛7/\F`x ٞBy,\ok';\\̿R\ 7Ƒ#G`0:tаa<B^ŋh"VEECʎfߢB9NKk΃i 3ztYhŋ6ytxξBxb@!*ojxBv$dm54oˎ\s,@Hˌ`aĈqjժpl޼˗/!C`ҥHLLDjo6{ < 6Dtttqь t TDP i ,@H'O>ƍjԐ Զm@׮cNE)),@HXBo^E}]QAz=_i=4$Ex8i@ɒ!ڲE#!  ~~#!]xYQa_4n T*;"zXz:p!>\ﯿ NVq#гHȔi`M-Xyʉ˾}j Dt.XuB6s y9Qa_- i#;"2%: dii@>@ݺˎ_'J9&  du/w]YѣC /ȎII<=wױȪzK]lFGdGDDEz5Pzk`BV5}:w…\7ȞZ `|)0u*0s&0dh~dGBDy"d/XU̜  0ah8~z %%w@>!2w&NT~|숈8,^}pw ]^p YLz:0p noʎ_+W89R-Z ZGXeڒ  A2 FKC&$ƇQ q$!a@@Bt:iQ'v>{{}=;~[{hQ= z ʼn9Or>cF=#J?y=3,K-f&N?[&i>/-+UF/mOYD֯~PXX]s]Ri7&RX[/L[eΔg}C:.;'Tgϖ$M2EO3<ٳg+ -}]UWWJwy$iԩj߾}ѣҡCϦ&'?Ҥ"@?^<]D۲]$-^,T\,=B) BZZ=lݺUu .\:߿uǎA-Iu}q(͝+M䟽:T-wbYQt{RI##}p\pAxmٍK}e>6߃l_PY 4 lN}}}Ųn~~JJJ4j(rDccjkkd βD$)5DFҁ[oUjnnnu#G$IǏp &vшСC5o޼t#k@t r&5^]Cd3gTCClj n { 8peM4I_} 4d Hh999iӦl3ޯXOoY :gf|$knSrK_uY n ![~lܹ޽{mÆ +8iٳv5Xvv'YfԩS޲ ۶mM2ŒlȐ!n:+//o_"$zz< C?]H܍goWd-Y (@BٳfO=T`}xB'GΝ;fYcc1nm{y^#CyyymW\; FXrl=ɚ FXJ⃬zH_^~{@/))ў={vZ66RRR4f={[޺u5k֬V.\:߿[L"+Z30$z>5w0YCwQTee233u1(99YYYYZx.^жϝ;e˖iժU>|xBۊou-tk;GոqZ~Ro/)I=">A_b<aZ<#Ys7AXWxd 1 :6fKMMoaUUUf4hs= mGɓ' }ijͳءCo٦Mfy]]ygVcFE K9ɚ z"辒#kw6z>|_o~<ϋ#]i>;qDv쮴}_|<ϳkv{A$^xX [Țˬ33F"kZoƓ;v֯_9Rz@g{k z駵deee… ˗/KO_iiiK7pCe/VX+W'j;,oy߅xWg9UP9JL"k.D$ YK^- {'<;vX嵵yqomw9sf۽ZQQyg˗/6qKOOosWR<ϪVG_ r<]T?ÐDGn<{JY{PԮ]ڝk׮5F+//WyyXjjUTTXuuu˗yK/u}y[6bknnk{WK~u& bvEP :kdx5d ӧ[jj^*++^41c~ի<6m۷ϪZ+//222ʜ=)+WIbl\Gs1ad{ZPإK矷#GZrr5^x|~:yrԩS-))SIII~CC-]Ԇ f)))Q"$zbj<2# S?]H|.3L70uY wzSy<3  g(@8C Pp3  g(@8C Pp3  g(@8C Pp3  g(@8C Pp3  g(@8C Pp3 ~a=IENDB`psignifit3-3.0~beta.20120611.1/doc-src/swig-api.rst000066400000000000000000000013161176542545200213370ustar00rootroot00000000000000============== Swignifit Docs ============== Swignifit provides three layers: * interface methods - defined in swignifit/interface_methods.py * utility methods - defined in swignifit/utility.py * swig autogenerated wrapper - defined in swignifit/swignifit_raw.cxx and swignifit/swignifit_raw.py, and autogenerated from swignifit/swignifit_raw.i. The documentation for these is autogenerated with the `Epydoc `_ and can be found at: * :api:`swignifit.swignifit` * :api:`swignifit.interface_methods` * :api:`swignifit.utility` * :api:`swignifit.swignifit_raw` Other Links: * `Python API Index `_ * `Psi++ API Index `_ psignifit3-3.0~beta.20120611.1/doc-src/threshplot_single_sessions.png000066400000000000000000001030631176542545200252600ustar00rootroot00000000000000PNG  IHDR8-sBIT|d pHYsaa?i IDATxy\T? j)FNPRi.Yfj*{Fee1~I kj$.X( 1_&Y``f|<1r;gsn !QlYN \8$"""""rʅH""""""*N \8$"""""rN8Hip%W{>e{ZV[MՏĨڵNVVnܸ///>1expuuE۶mUo޼gϢYfhٲA~:o888cǎpppP׽{>o(~VVt颶\_DacLJƳ> ƌ?~\^y}ۇBU9!|}}\f=+ۮUy͛8ujkƳ>wȑ#j{PZ5\v x' ֭[8}4j׮ ooo٩?{,222вeKn/_˗Qn]tժU\pjt***BBBѵkWU~׎pi<|O=jGp)@ڻt]bAysE\x]v?em8<=zvڡaÆ oWN `رxhժƍ5:ŭ['OxG֭[U bC\\~i={?Zj֭[1`@Æ U_|XfAWnرhҤ Wɓ'c={듓/իWG^^6nXf;m۶E͑+W+/ާNˆ#Я_?dgg###pppێ/"p9̛7#FL0_|Z*%YVۖ\@@Μ9Ll۶M}֥ ֭Ξ=+WSNXr%֬YL0 .,w&N .W^>8}Edd$Ξ=ui725l0<|^^^8q"6l؀={m㈈\^^^Xjvp5՗w=~8 Aa۶mGY9|B׮]+W}VʶkU"eT߿ 4@tt4.\ѣG7P|gU9r$;wR1?3g_͛7ÇaÆw-Zȑ#8~xnѣGk.xyy믿F 0o<M4O< &`hݺv Ctt4֭͛>,[ ZRM +ޥjUŠ6l.\7ob۷A Dv`kk'bx7 oWAּysqr .\(VZ%",,L֍1BkΝ;jw]l߾]ɓ'kCQQhѢuVmH[ٳQF;w,gPݲEF4^wѱcGq%^_}jرcG},1//Oxzz !8|9rBpjhgq}*ϊXSeu*2O !ģGB>XWvΝ+>rXrb:?B{bѢEۄ ĸqԖG!իĉUJH;..No^U']m+G !<7o}ш yyy[nbŪ<[5= -_-UbmתD/޸q2dB;>ǢYfB!Ν;' Q"]Q%7ĠQ߻uо~Ѯ];߆+ρ4d$&&"11:˝8q.]Reؖ-[0|p8Z7x`߿_5ݳQ+q9deeS(8p """(I믿믿PPPz]yUV?~k֬Q+vyO>8Fuپ};ڵk{Nmyv*Vܹv(mӦMoݎ5jԀ oOOOܼy[l{ァ~m[[[mM@2= )/cO|8l@ r8)qWv֭0anܸGΥ+m۶a„ t^KII>@myzФI)O*tc˖-elݺUu;#?\=K򶹩rTƐ=}+6.\k׮UnH!Fߣ^zǣgϞZv󗔑L՗L4h@A[͛7#++ C8::"33K,1x`CvcҤIغu+RSSnwŊx' WYv؁$%%?V{mjj*lll =zt]t Z[X ŋll޼YuvT(ķ~ WWW̜9ƍCXX6 oԶ݊Ơ~z3Fe 4ҥKq9ԩSQQQk3w ;V53Fѣ֯_O>׮]C^OÇԩSQZ5aÆ.]wwrOm9jذa9zhXB#7x666x饗0fʋqttDnniQވ֭[!|CAo;֯__՞׮]CTTbbbz!997nDV(_;G.[~g3dK,9s}UR]R&j֬v1///$%%aРAW+QI1112e bbbТE eW///+f͚˳*o9777( deeC򂃃5k@91lԨn޼ www\v ..._ˋ~)TK +[ի봵#G}X|2d͛'ׯ\[=mSׯ_AlY1/VV?&ӪL*K.XvmS?=۷G֭Ue[nWrss#_u׮]x饗܎(/,P2y%۸yaܹAll,.\ÇoQ]L* me۵k!v;vPy&n݊˗c`Clݺj+o=LyjҺ'X.].ѣ{ '/_V6m˰A۶mWVT,jҥK<|ڕPuѕv튮]~G/^DNNv؁͛7cӦMXtZ{ksceK[[[bPO+듕hnWu$eIYz*!{q%,fΜ)yyW… ťK7|#|IՅZl)߯~SN}">>^ 4Ho^":"55U_^xxxrBL2EB!v)*o#N>]6/]Oc@!nܸ!oř3gǏT.eG17E?SBqyo>qUqqѫW/gW^gY+89vԩ8yHHH;w7oB+Dppx뭷ę3gݻw>kiہĕ+WٳgEhhj~":ƿBʕ+]t[n-;vLUǏ wwwP1s 37 W8[:țBm6SOmp"ZHwbjˎ9"?.į*<<<Ν;U:$wnP='G)ƌ#'6m_-Ņ o&\]]ERRBy1/]wD˖-EddHMMN󎈋B_DG[*((?HMM(W; ogdd-ZsΉ_]|noC!1(o:u̙3\|gϊ' zCڕH#;vHMMvݻU۷O9R5Jmm6B?#1h 1p@գO7n#GCӧOϟW{}j\1|p1|p|r՗ĢE / Mj|Ѹqc MIvƍbb޽bԩܹsjJwJJ;vqㆪ\Y혞/_.^xdR6//\ P~8p 4Hm}jǎזAy뢯cn~\HPH3yd1tP1rHwߩmW_شix w!o&D``T>6F(!cƌ?κ_ 6L9R|嗪sNgj ,b̘1jW+P^ 1!ڀ1uT+7Uµϫ-͛BtRWUbmתD<-5~9x7n2d;v/^,-[fp=+'߿/,Y" &F%~goܸQ1B=Z>|XW^ĉ:u)1}t /ѣG+Ojt[?zHL:U :TɓuecQQ6mڕ###ŋ/(ΝCEۻB~#a1(Oo5ݿ\T3bҮ@H||1bYʕ+,eL.\k׮5ʶBT]ϲ3eؒIyq)ge̚5KpeYR{)W3biؒ/>~XtI3ڶ=+rQƌ1ڮmEe߿|Zj_(2g{oss׳,ƌAeYj?diiiEΝ~ưj*op%r1c` ؏-9S0aյ",G}dm{W唣c0]BqH""""""*N \8$"""""rpQc]BBGGG899! /_DTFĉSD$)"/s5kkFnn.rssU뒓 ooo̙3 Avv6"a͉Ț]t nR[&?p( )" icH١^zؾ};޽Z/x"j׮ HMM'y\RjQta  p$-um*Y~=\\\0|Joy1W*9c!}ny=L:ӧOGFpP>;;;ԯ_,( 899|իWû 4Ow66dly>}'OČ3PZ5r橊c*OU;WpVw[08;;?߿'''kN>$xzz^O`rsX3Y׼֯_8q-[2OU0yʴ8Fö7M ]]]x#.. @5KĽ{TOMME\\F!᧐?//Y3Y|>|͛7駟Wc aya<,qHmo8;zݻ7zR- SO=CaÆ9s9MDUΝ;~1)"du{ uQ(P(jZnxTV 7nZj'"2 6v9rSD$5)"*@qFlܸQc7+A20O*+!P(d}_tx1"8 qw֭S>a|ұ ALjt2q:Υ'+cƃH? =DDDDDDT.IDDdA""W{@@=%K@֍@Rܼ |KΚpHpߙkd`IƚAd #aHt`"3YƗ,5ww@&rRxLjt!T!;Rע""| IDATUP|.yXXU<KTUpL iS^H9* ( $UI!!CtT{5$""""҆H<-/(PN4PLOu(Tx$Ui@Z%'DDDDDU'T!IIl K}X^"8Fö7'T!..ĉg>/Y:aya<p<*UycN/Y:aya<pV211QV-t֭S+ D5'"""""////L0nnn>mۆ7|7o^`*ɞUN {޽{-{qE]Vmikk ___sWeg89I]26Ɨ,0DqHmo8/Y:aya<3ڶU^aTߣm[`v㽯a~2UO (,,ĝ;w~zٳZ|4jvvvpssôiӐ-Q-GN@Nk {{{xxx 44TLBBGGG899! \؇\Sa1$'׮$' }- b'Oڵk(U]|9MZ___t Xr%ۇ?jՒgk ԩ#u-T_ۺu+ƌW^y=ի$''O>FDD={"11.NxX&)1{WlcҨ6@Qe"'Yr޼yx7~ s[r2 =z@.]0tPֹ3f^zj˂dADڵkx70i$YFGjBBBhԮ]/OOOaʕf7USHKӾiS^H"CX nnn???`ҥx7иqca|M_>Ν;Ν;ZjhԨ&OwŋtQ:t@JJ ]u>,/a2/ W&-<<}:[nɓ~0dU\maya<,PsU1 gH__5rssQNt7oƨQuA͚5l2CPy6m>888H)Zկ_)))0`N:@VV볲P(۶$MDe<0WY@?Ǐ[ ;w4Sӹsg?~\| Zl >}ZIII􄽽YKDUR΁$ww3Y״{Q[/~iW"È#Wa >,/a2/ $U<|&V~0tP̟?1:իW߇>kСC( 2 6̙3%>,/a2/ $UH۶3g>x矣o߾0c l߾]UuֈGjqơUVnxX&)pVy$UEz:д%@`dJU-RQVX+V-퍽{Vփ}X^#aH"=EEk.X`=H""" ${WwtՇN XD91,+A/CDDDd,!!@rrNd,<*%ॗ,08HKpuWUK֋}X^" #?ZM~i1tc~2@R<~ *0d؇ үcUcveCAy@P8 bc K}X^"#e]!3[ CX%K>A H""""*H׵bbcbZT9@R(L1m%,k/Y:aya<p@R9)z$'+/Y:a?jIcALjtEtB<<5xxH]M澹5+R%*܇˺(`aTxLjt=߿?`ooZjk׮XnFلprrB@@._,A-O:g)EEʲƸ5+R%*܇u]I.QAT#a@ &L߿m۶7DFF͛HNNF>}퍈#$$={Dbb"\\\$$TQ%ooV|O#""k{bӦJM {޽{-{qE]V5 Qvm<==+Wd\ƺ.)Y!899]XXh&???DEEIQE.'h֊%K>,/~#aN6Ȥ$x嗑 ^IBܹsׯǞ={{.^cǎСRRRPkꕛ *0;O a>ScD:l{bgعs'ݻ8SCM<pvvƤItRL6 pm뜝!@vvv?M=|&j2E"a<,LjtrܹgT^]o߾8zh9o<طoNsbѢEF10c jm۶mD$/SDD&)>,/y0OY. '=wEV5j;wO?48 eHWW%]] 㫉yʲ aScD:l{bжm[l߾k.ԬYSʪ`""c""s288`Μ9 f̘w}W1O1O9Yf=h ?'N@˖-OKX3%;7_?ʵ>&)b }8" վXx[K5`\#aN<<z*M6iM68w\>Lak ԩ#u-T_MSdZԇ]]4eMUƒ% &eÒ1OY. ' g}F2֭[L̚5 ڵCNN>c!66~~~S{QADyH .jJ5j[nqxxb82Lzըk|&j2G">\XK`\#aN)Sȑ#ׯիX'}O27oj|}}ѱcG( cʕطotj d*&s)2K.vժWJbScD:l{beڵ ?I`lݺk֬A.]T˧MVGҥ p:9c  Vdy$}|!KHK潫+S7oơCp9|j `՗2pwwLaya&S䩛7obƌXr%7nŋx:v쨱CHIIAAAAڱ aScD:l{b)кPFDDR1E2e 0i$o߾ pvvX !+Dd}$Jv֭ST#"2Yھ};_͘1S[ '%)ʚ+M)['2>I'|ƶ~pss7|#UH #h6dlLݻSbhԨܹürrr`gg+'feeAPիmPݬ0ey ڹ,kt[@~HKo{)H:r O>*3|9'OU<[%?SnBFF /""""ӧOkIJJ'Vx1drrX|ӕK]dm/I'~FIS)Q>a|53O"..NPfrJ8p111pqq-UVp8̜9ҟZ aSH`=M3)%Ko{)b[o{xPXXgy'ODJ]E*N`kAj2f^:z|ƍE^TBCCSOaС3g 63=؇0)1"dqHtsN#993g%yBPZnxTV 7nZj=""}P޷ZjVJK}WLևzV6!!>?;;;}퍈zD3/M^証nKST5e+7Qe1O9B̙3ׇ#._ Xx1֮]kж֬Y8L<z?bccѨQ#,_\U.$$1|pz\(XTGrF$?ST5y4hF10O9b9o܍el҇`{M`\#aNH///:tAAAjw؁.]Tj ,֭[f͚Jo3f^zj˂4>rq&Nd*&S)2>a-YjlQQg<̃yr#e]ZWq65'bh"ƍx1?`ڵؽ{we˖ax뭷TׯxMVV n{p݈Ȳ*OE`=M3Ic彂384dq?n݊(( ̙3NݻU75Thh1gu-[N>񺤤$xzz޾BKDyȘCy̫8d e[K,Ahh(ϟZ`ggDFFbժU+"..3g4J=͛-S)V|g2-'b1}Xp!!CرcjbСC( 2 6ӁEx b|ұ ALjtHcB@LL bbb) <~кukc 티09[@nԵ Sa|ұ ALjt d\\\z{{c޽& CX4d14d!Hd18p Zl%KիRW!)IyO$kBjb,xp@^~o6"##Ob@ꪑ..ĉg>&cDnnnGZеkW[NlBBGGG899! /_Gjxp@֯_ӧOǩSu֘:u*7niӦԩSRWJquU^UꚐ)0rrr兰0cΝر#|M,[LU.99}Aaa!"""aٳ'nݺei5؇0)1"}JKK!!!^ԪUKڊݻD&N<)'OJ]*I!)<ܾ5g#2UիpwwWK/ w殺^̞=[6cZ\ey䜧`Ec9FG{ 4h5kX|嗸y&\9RjQfSDdj@N6 4iZnD;v 'NDZдiSZ .\3YWs֯_={\x<@ǎ5^סC\q؇0)1"줮={k֬QF e\\\~3׌t|xeId%_MS'OڵkX|9M}6YuB ;;52=aya<̃yr#d^Or…xgPZ5充8z(z;;;G NV-kBj2U7ox য়~ܹsq},Zu1cի,((AAA޶ܱ aqHmo8YL {9aÆjܹ???<~X.@:RׂLd<777llltR曨_> ++KuYYYP(j"zjx{{W^}X^<T\UcD:l{H!幹7sm4+Ohٲ%pirIIId$")"2I@>\qƩB@QQ+U̞<[[[xxxĪUTW8LMME\\fΜi%"a|c<믿Fnn.ԩΝ;c5j\֭ٳg#00vvv۷/T_H0ާ\Xz*իAa֬Y޳NFnCS}yXSkΉ!iزELkyʵpV2\SX ?ZIp5'FGT(Qؾ\ aua{(yu8z@,)"R;)"R*FrvDDf;Om߾+WDzz:Ν;7@׮]=|0^}UJ*ի-Z{)"R*Ǐ㥗^O<˗/lقU^>ag<|rxWc|g(,,DϞ=sNzNB=p}`ʕ8s u놫WPkbqֽT1ܼy3:v숓'OoE~~>ɓxםs&uאҥKsN7= ["88sխ lܸ}ABB{\r-s7܇Յ )><{b9}t̟?7on?;122eK #CLDFky}y{{Eנƍ1d֫_>zuUT܇Յ )><{by) <`y`` nܸᄈ}.).^48uJ{CoRyƍ8x ܹ֭[gϢ.&"aw͜9S6mkM4;fǏYfisȓ<ј\sI&hҤ\z˗/G۶m+V@$ %%HNNFnpQԪUXUZرΎk̞=3go$#"UR 7| f8pv܉)S%w}XYe'3Jm1O,a[iɓ';XUvÆ ulbŊF+}"9o͚5âEo[]"r/S/ƌ3ЧO?;wC߿?MN:<0#՘=[;3ɽrrKNSD4 9S- @FF4 ڷoovF-5jqIT92Omܸ$a˖-زek$ТE aԩ:t(T~-]{Dl&_ jIYg@h=}qV`efU$r5Yú Z>FKzgM˦T1g9z*A` 3W_E||a;wuEGGٳ(**rBdg>i6dsQDeNi'!ub<{VCϞ=EEE9) 84nHؾꐛ  4x-00B!88XTϚ}89Y;H)OD:cl$:99ځ%'Q/)ú5k;:; 㣝=L4 z褈c>,N4k:T1ܭl%ʜdyXFg#"r k ^v$IB͚5Mɒ%qX|&$D;+(Y<0WJ} lܸqD5ЧO۷!I&c ^;~85k///'DFD Dzepe۶msvxvgr?l_uR  opv܉;1:u>.lM6hӦ;bԩSo|bM326oތ۷o/@2ׯ|||0sLtǴiPXXdԩSSLqf}X]yJ#17ɷX I$IΝ;:tHrBd)4T@vicu浤οZ:Bs 6$ IFwVVnC8+jԨ!,Ν;g\)RK*+qTSrӮc\]Yܺ`Sz{DDDDdz9j(4n<WsaѢEʕ+/k):}ڲ&drv'=^}N]ʶcqֽ*EXf .\B[nOѾ}{gj'Nkk6pKj}! &ƲS%m"wdYY#ú^@N>ӧOwv.iS``h߼{)۾DFއ6])˱ʶ;Z_X8zzIW:л`KѮLaesj"wbɵ/Guo= PZ.َ_T Yr]u8 y(.vv$dСGl;R钔$/dKc{><{qIr&uIr?i IDATrhTXKYRH`{}yXLd:WӲ%Zv*x,)EއID汏8z@ILGMSadK/BLF/)3gZ>.lyc"{`qֽ*/1|4oWFbb"JJJs۶n޴oLl_uy܇Յ\9OF)˛͵2Z6mŽ;_bذaݻ#++ Ƶ~d0oYx.?c2\dx` x}#clmJ=\n-=z4|I#66Idphž͛kO""urRSSZ ԩ"#"b""c"\*)}#5յZbQKzbQKzbQKZ-%@=%@=pIDDDDDD,$YRRI~:>Y6v PZ5OZSRK,jPO,jPO,S`RwzbQKzbWm<raoaC!&&a5)"0O9m쑧8THAAN:0\VDDw0)"0O9m쑧8$""""""p""""""DDDDDDd "@A~~>&MP]vXfD˖-I다$6n܈~F˗1j(Ԯ]ҥ ~Gy{{ި]6F+WjժA@$Hd6Wwz ___TV h֬pΝ -Fxxx $$O=Ο?_:1/|h޼94 /^ls޺z$ >[.BBBPjUࡇ^njs5 [ewARR6m oooԨQqqqصk:qW#K{hݺ5jԨOOO}G8J+,,4ϔGz~Tܾ}h޼>8Ο?o.w%ĒDEEEHNNFF퍆 ^3RK?P"KZRX*Gvv6&Mݻ# Lc䱱;7ѱܺu IIIҥ Lw #<"j֬)>c&}Y!I/};wh4bرbŢAHJJ[g-ZÇ<$IjJԯ__|bǎbРASڵK/_~Yxxx  IĄ DXXw5Wye{yy`ѫW/QV-^^r3f5jZ$3fyjժ -ݫW/1a裏 Iij>+EݺuEnnMe5k Iŋ+Tn޼  $ٳgtqiD-l"f̘!;fSӧO˖-Ӌ{ڴiB$WlYbbR5kسgD.]矍֋h>_|Em۶}˗%(mʔ)"44h?S"ݻMtG~Dn< K.{1Îݻn+Q'%>>3 w~D,b/T4;wڵkxO I릥*UczjJR_]ѱ?~\ԪUKL8Q|wbϞ=F9/$I_}x*;ܸq3gn{II&L$I⧟~{oTTԩ^l:tZź+$I˖-3͖]q͕ߢE ]ܷoutR!IػwUq^;v$+WZ]'NOO$@Қw. "u]' iK޽nݲlYaa Ү^*48qݍ-6HOO"55`T,1JQ;3czߕŒD$?P$Il߾6܉ZS/LXlJ߯wlT,e%I2XGXJwVH;VT^ݠѾK!Iؿ׫WOh4>\ׯ7>yiڼy$I'իW.\$֢E oPF\\ٲ/g7W>oNc\'^je߽{WlROHdviMݻwZB_Tץ˾ucƌѫ{mgm/^Bh'O[Pxxx_~dƖ|dI7ȑ#dr?2e8ґB_Z8n߾ׇq>rY!I^lJԉ%A:Yh$I?^oӧO Is=grD-ѱX5}ck/brwl\Zcc%b)wH8q*GGG222̾ʕ+Yuعsn`#G 22޺cƉ'~.segdd2sCCC;QQQV+I߿yФI <˖=k,ܹs3g4V6}YԬYO=3gh,-ȑ#(((@ӦM1n8HLLĦMwoA;v -ޘ8q"VZ͛7/^g}hȖ|dI/(**BFF&O;J!ٳg9*y M6oJq!>oootAׇGd+WߕKuRTT[O&N5}A-ѱXl=|k*fu%b3c){rssh\^k݃pm涝@] ұ~k׮L}v^^UV5ډ'` <Z\Nd7Ю];!puQ1.ѣXp!^z+e K.ŦMtNoٲ}1zmi/^̟?gϞ I`۶m6]\uAlll-XcƌApl߾۶mC͍lG7OߩZ*qU]Q*hyJR_n߾C  tR8᯿6mBZt}X}DV\\UV!22R+KyA8䃮}']ޱPK?P*b/zlme#D,rV,ǎ38-4ˢu=j[ W$Y8kZZ 4+l.v8x .]~Anݺa޽A߿ѣGcላCNNqwNN$I€~z_P%%%___lذyyy#G?Ɯ9so?w.?}ϟ|ׯ_LJ~8lݺnۡ}No;J(Ϝt6h?<֯_H eE\nмys̙3G8ڲe rrr0el}iӦ2e BBBt0y&Yϒ~`ˬ̾'- Ŋb;ѿn KxPR~}@PP_D~~?Pn]clY͚5A^^:1((lAAA&?{2̽f|cc8qBxyy~@@@u"@LLgiӦ_ܹslٲ d?~ޭ quT^]ڸ˾cHOO7@ZZ^ݺuCժUuשS={DJJA[:܁% L0A^||<1i$o:ݕ-}~ЧO4hsU$ n޼ @)Y'e1?<lyyyptt' #G4(ѱX7oSO=DsŬYjrD-@X2ۧp--QظvJORJǒ={=W^ԭ[cƌ!Wb֭qI7^2zXׯϞ=s;fLvqIlRoұ?~hfnժ.3+?;;[ܬ,1|rW\'+66aaaFii'N7ЬY3K.SKhpݩqGFFVe%ZF!Hܗ/_FZZs[x@o=FmԩS&nlGַ)k%gh۶-~:)M8b.aظq#{1%b$?(U'M4qE?~/_Ɛ!CpUWy\zfee U [NJS.wv=:v(1~xk.o׸{=!IY{)k׮"88X.((FY.\(ZjԖ2v4ݻ'7o.bbbLnؒ,oSt}G8N:v%+!I^?sf~TPׇ  IĖ-[ ^S"K3^zI;˱PK?P2~T, [ʛmL͈|lT,UX v/ŏ?hcƌUT.\-{F3k.m61yd]T*!0=z6m7o(6A&ѱXE{7nO?R޽+b jJՉ%}q!DJJHII$^4),o.V^;6.**R4GH$RSSuJr%ѸqcQjUzj1Bpibĉ"$$Dx{{m|; FFdee-?wW$%%W~]$!Ih4 ҥ)U&<==EPP5jrɸ.]$F)-#($Ib*_[XƝ/}YQjU]YUTM4ǏSB[[9rՇhӦ7o(**K^^^Ox{{ ___'8`\ [A!q㆘}z OOO/{=z___>t$7|JbI~P"7|S4nXxzz5kG}TwSD-@X jJbI_%NJFem߾] cccOM;zhbٹs3gԖ%ĉ$:DDDDDDd "@E8$""""""pIDDDDDD,$YH""""""Hg@dƯ͛k׮Hs*$"dgg\gĉXvQw5ׯ_wv(DWQDݻa\%WM2)))N2/*3gĆ  Io.ѣXz5͛gڵk駟͛xk`'O?ǡChӦnbt $>ޢr}]$&&ZjzWZc֬Y ŋo>ڵˠ6l7 66G۶mB>|3f@tmݺ^YcǎEBBQjU>9s_ň#ݢE >|8&NttɢAD\3g ׭[/BKsΡZj6mnY`` Fڵk1l0b';D*2rHP~G⫯2X^XX(DZZ.͛[#͛ ʹ{:_|Q{$Ibƍfc-..uk׮-sz9Gjժ%VXauk2dxlD.Jԩ׿lĈbС&3e1`'5:BS\\<塤Dﵟ~ ر4hnYݺuѱcG2Xc4E!>>Gݻ ^h4ر#va#"Pk*O>A||<￯pSD.rddd3{tu;w$VR{gϞccc˽V0##ӧO#22Rﵐޟ hذ … Ź~,X@L'@Ϟ=z§~꜍IDATzJ-Z?\vH]Ԟ:Fؿ? y_̙͛3(..HD\%OФICoy֭  33s m6۷ohԨQ!TQF7n$ɢ[nmpڵk0X.UkܿN>!C 99Y FJO?:u`ԩ5j //#"Q{Ou1b4i$u-wEEEz.@$4hOB^Νqmz}}}1l0̚5 ׮]Gaa7vxWp) xwn8y 8p$<Dll?)"{(@s9{-33&MB׮]Q^=yK.DB왫;v0:yNAA֯_;=6??&L@qq1@HRIXܹ36ol{g@ԫWAAAx_]믿oŌ3p%[G.;֭[# hӦ ڶm+Vm7;;'OԛO9ѣhֹsgT^uEӦMQN|V [nEBB]?/9s^N:0`AyEEE5jte޽6lНe''%BIIO_~1ŋqM4o`7hܸ;ww4hիge?)I9e˖Zdffݻ 5;rg&oYDD ٳh4zPeeee Dxx^YM4ӧ28JQQQvwiӦHIIAΝ rlССNPH%ԒL,[i1Tf@RqE!8 p9jʩq%GɎ9(뷉rSCP~}^$@E8YH""""""DDDDDDd "@E8$""""""?ru(9IENDB`psignifit3-3.0~beta.20120611.1/documents/000077500000000000000000000000001176542545200175335ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/documents/bayesian_influential.tex000066400000000000000000000054631176542545200244520ustar00rootroot00000000000000\documentclass[a4paper,11pt]{scrartcl} \usepackage{amsmath,amssymb} \usepackage[utf8]{inputenc} \title{Determining influential observations using markov chain monte carlo samples} \author{Ingo Fründ} \date{\today} \def\E{\mathbb{E}} \begin{document} \maketitle % Your text here Assume we have obtained response counts $\mathbf{y} = (y_k)_{k=1}^K$ in $K$ blocks. We model these response counts using a parameter vector $\theta$. We write the posterior density of $\theta$ given the data as % $$ p(\theta|\mathbf{y}) =: f(\theta). $$ % We are now interested in determining wether a particular block $k_0$ is an influential observation. To this end, we want to determine the Kullbach-Leibler divergence between the posterior density of $\theta$ given all blocks $p(\theta|\mathbf{y})$ and the posterior density of $\theta$ given all blocks except for block $k_0$. We will write the posterior density of $\theta$ given all blocks except for block $k_0$ as % $$ p(\theta|\mathbf{y}_{-k_0}) =: g(\theta). $$ % We don't have direct access to $f$ and $g$. We can write % $$ f(\theta) = \frac{1}{Z_f} \tilde{f} = \frac{1}{Z_f} \exp(-F(\theta)),\quad g(\theta) = \frac{1}{Z_g} \tilde{g} = \frac{1}{Z_g} \exp(-G(\theta)). $$ % The psignifit C++ engine allows fast evaluation of $-F(\theta)$ and $-G(\theta)$ via the \verb!neglpost()! method of the \verb!PsiPsychometric! class. In chapter 11 of the book by Bishop we learn that for samples $\theta^{(\ell)}, \ell=1,\dots,N$ from the density $f$, we can obtain the ratio of the partition functions using importance sampling % $$ \frac{Z_g}{Z_f} \approx -\frac{1}{N} \sum_{\ell=1}^N \exp(-F(\theta^{(\ell)} + G(\theta^{(\ell)}) ), $$ % where in our case, we can use the MCMC samples from the full data set fit. Importance sampling is efficient if $F$ and $G$ are reasonably similar. We assume that this is the case. The less similar $F$ and $G$, the higher will be the Kullbach-Leibler divergence and the more likely will it be that block $k_0$ is an influential observation anyhow. The Kullbach-Leibler divergence of $f$ and $g$ is % \begin{align*} D_{KL}(f||g) := -\E_f (\log \frac{g}{f} ) &= -\E_f ( \log \frac{\tilde{g}}{Z_g}\cdot \frac{Z_f}{\tilde{f}} ) \\ &= -\E_f ( \log \frac{\tilde{g}}{\tilde{f}} ) - \E_f (\log \frac{Z_f}{Z_g})\\ &= -\E_f ( \log \frac{\exp(-G)}{\exp(-F)} ) - \E_f (-\log\frac{Z_g}{Z_f})\\ &= -\E_f ( -G+F ) + \log \frac{Z_g}{Z_f} \\ &= -\E_f ( -G+F ) + \log \E_f\big(\exp ( -G+F )\big)\\ &\approx -\frac{1}{N} \sum_{\ell=1}^N \big( -G(\theta^{(\ell)})+F(\theta^{(\ell)}) \big) + \log \Big( \frac{1}{N}\sum_{\ell=1}^N \exp\big( -G(\theta^{(\ell)})+F(\theta^{(\ell)}) \Big). \end{align*} % This can be evaluated without sampling from $G$ at all. We just need to store $F(\theta^{(\ell)}) - G(\theta^{(\ell)})$ with each sample $\theta^{(\ell)}$. \end{document} psignifit3-3.0~beta.20120611.1/documents/betaderivatives.tex000066400000000000000000000105731176542545200234440ustar00rootroot00000000000000\documentclass[a4paper,11pt]{scrartcl} \usepackage{amsmath,amssymb} \usepackage[utf8]{inputenc} \title{Derivatives of the likelihood for a beta-psychometric function} \author{Ingo Fründ} \date{\today} \def\rd{\mathrm{d}} \def\p{\partial} \def\ddlnu{\frac{\p^2\ell_i}{\p\nu^2}} \def\ddlf{\frac{\p^2\ell_i}{\p f_i^2}} \def\ddlfnu{\frac{\p^2\ell_i}{\p f_i\p\nu}} \def\dfdt{\frac{\p f_i}{\p\theta}} \begin{document} \maketitle % Your text here \section{Log likelihood} The log likelihood for a beta-psychometric function can be written as % $$ \ell = \sum_{i=1}^m \ell_i, $$ % where $m$ is the number of blocks in the experiment and % $$ \ell_i = \log\Gamma(\nu n_i) - \log\Gamma( f_i\nu n_i ) - \log\Gamma( (1-f_i) \nu n_i ) + ( f_i \nu n_i - 1 ) \log p_i + ( (1-f_i) \nu n_i - 1 ) \log (1-p_i). $$ % Here, $f_i = \gamma + (1-\gamma-\lambda) F(g(x_i,\alpha,\beta))$, i.e. the predicted value of the psychometric function, and $p_i = k_i/n_i$, i.e. the observed probability of a correct response. \section{Derivatives of the log likelihood function} Derivatives of the log likelihood function involve the $\psi$ function, % $$ \psi = \frac{\rd}{\rd x} \log\Gamma. $$ % They read: % $$ \frac{\p \ell_i}{\p\nu} = n_i\psi(\nu n_i) - f_i n_i \psi ( f_i\nu n_i) - (1-f_i) n_i \psi ( (1-f_i) \nu n_i) + f_i n_i \log(p_i) + (1-f_i) n_i \log(1-p_i), $$ % and % $$ \frac{\p \ell_i}{\p f_i} = \nu n_i \Big( \log\frac{p_i}{1-p_i} + \psi ( (1-f_i) \nu n_i) - \psi ( f_i \nu n_i) \Big). $$ % In order to obtain derivatives of the log likelihood with respect to parameters $\alpha,\beta,\gamma,\delta$, we use the definition of $f_i$ to arrive at % $$ \frac{\p \ell_i}{\p \theta} = \frac{\p\ell_i}{\p f_i} \frac{\p f_i}{\p \theta}, \quad \theta\in\{\alpha,\beta,\gamma,\delta\}. $$ % These are given by: % \begin{align*} \frac{\p f_i}{\p\alpha} &= (1-\gamma-\lambda) F' ( g(x_i,\alpha,\beta) ) \frac{\p g}{\p \alpha} ( x_i, \alpha, \beta ),\\ \frac{\p f_i}{\p\beta} &= (1-\gamma-\lambda) F' ( g(x_i,\alpha,\beta) ) \frac{\p g}{\p \beta} ( x_i, \alpha, \beta ),\\ \frac{\p f_i}{\p\lambda} &= -F(g(x_i,\alpha,\beta)),\\ \frac{\p f_i}{\p \gamma} &= 1-F(g(x_i,\alpha,\beta)). \end{align*} % \section{Second derivatives of the log likelihood function} The second derivatives of the log likelihood function involve derivatives of the $\psi$ function. These are called the trigamma function and are notated by $\psi'$. % $$ \ddlnu = \psi' (\nu n_i) n_i^2 - f_i^2 n_i^2\psi' (f_i\nu n_i) - (1-f_i)^2n_i^2 \psi' ( (1-f_i)\nu n), $$ % and % $$ \ddlf = - (\nu n)^2 \Big(\psi' ( f_i \nu n) + \psi'( (1-f_i)\nu n) \Big). $$ Finally, we have % $$ \ddlfnu = - n_i \psi ( f_i \nu n_i ) - f_i n_i^2\nu \psi' ( f_i\nu n_i ) + n_i\psi( (1-f_i)\nu n_i) + (1-f)n_i^2\nu\psi'( (1-f_i)\nu n_i) + n_i \log\frac{p_i}{1-p_i}. $$ % We can use these identities to derive expressions for derivatives of the log likelihood function with respect to parameters of the psychometric function: % $$ \frac{\p^2 \ell_i}{\p \lambda^2} = \frac{\p^2\ell_i}{\p \gamma^2} = 0, $$ % $$ \frac{\p^2\ell_i}{\p\alpha^2} = (1-\gamma-\lambda) \ddlf \cdot \Big( F''(g(x_i,\alpha,\beta))\frac{\p g}{\p\alpha}(x_i,\alpha,\beta) + F'(g(x_i,\alpha,\beta))\frac{\p^2g}{\p\alpha^2}(x_i,\alpha,\beta)\Big), $$ % $$ \frac{\p^2\ell_i}{\p\beta^2} = (1-\gamma-\lambda) \ddlf \cdot \Big( F''(g(x_i,\alpha,\beta))\frac{\p g}{\p\beta}(x_i,\alpha,\beta) + F'(g(x_i,\alpha,\beta))\frac{\p^2g}{\p\beta^2}(x_i,\alpha,\beta)\Big). $$ % The crossterms are % \begin{align*} \frac{\p^2\ell_i}{\p\alpha\p\beta} &= (1-\gamma-\lambda)\ddlf\cdot \Big( F''(g(x_i,\alpha,\beta))\frac{\p g}{\p\alpha}\frac{\p g}{\p\beta} + F'(g(x_i,\alpha,\beta))\frac{\p^2}{\p\alpha\p\beta}\Big), \\ \frac{\p^2\ell_i}{\p\alpha\p\gamma} &= - \ddlf F'(g(x_i,\alpha,\beta)) \frac{\p g}{\p\alpha}, \end{align*} % and an analogous expression for $\frac{\p^2\ell_i}{\p\beta\p\gamma}$. Further % $$ \frac{\p^2\ell_i}{\p\alpha\p\gamma} = \ddlf (1-F'(g(x_i,\alpha,\beta)) \frac{\p g}{\p\alpha}), $$ % with an analogous expression for $\frac{\p^2\ell_i}{\p\beta\p\lambda}$. We now come the the final crossterm % \begin{align*} \frac{\p^2\ell_i}{\p\theta\p\nu} &= - n_i\dfdt \Big ( \psi (f_i \nu n_i) + f_i\nu n_i \psi'(f_i\nu n_i)\Big)\\ &\quad+ n_i\dfdt \Big ( \psi ( (1-f_i)\nu n_i) + (1-f_i)\nu n_i\psi'( (1-f_i)\nu n_i) \Big)\\ &\quad+ n_i\dfdt \log\frac{p_i}{1-p_i}, \end{align*} % where $\theta \in\{\alpha,\beta,\lambda,\gamma\}$. \end{document} psignifit3-3.0~beta.20120611.1/documents/correction_of_ci.tex000066400000000000000000000136261176542545200235730ustar00rootroot00000000000000\documentclass[a4paper,11pt]{scrartcl} \usepackage{amsmath,amssymb} \usepackage[utf8]{inputenc} \title{Correction of confidence limits for bad observers} \author{Ingo Fründ} \date{\today} \def\Binomial{\operatorname{Binom}} \def\Beta{\operatorname{Beta}} \def\p{\partial} \begin{document} \maketitle % Your text here Assume we have sampled detection data from an observer at $m$ different intensity levels $(x_i)_{i=1}^m$. At each intensity level a number of $n_i$ trials was presented and the observer made $k_i$ correct responses (or reported $k_i$ detections or \dots), $i=1,\dots,m$. Typically, we would model $k_i$ using a binomial distribution as % \begin{equation} \label{eq:1} k_i \sim \Binomial ( n_i, \Psi( x_i | \theta ) ). \end{equation} % This is a useful model to obtain point estimates of the parameter vector $\theta$. In using equation \eqref{eq:1} we implicitely assume that the $n_i$ trials at stimulus level $x_i$ are statistically independent. Unfortunately, this is not necessarily the case in real psychophysical data. If trials depend on each others, the effective number of trials will be lower: With sufficiently strong dependencies, it will eventually be possible to predict the outcome on some trials from the outcome on other trials. In that case, the predicted trials will add no further information to the estimated parameter vector $\theta$. In particular estimates of the variance of $\theta$ are based on the number of trials that added information to the estimation process. If there have been less trials than we actually thought, the variance will be underestimated. I am going to present a method to estimate the reduction of independent trials and suggest two ways to correct credibility intervals for $\theta$. We believe that instead of $n_i$ trials, we actually only recorded $\nu n_i$ trials at stimulus level $x_i$, $\nu\in(0,1)$. We assume that inter-trial dependencies do not depend on the stimulus level $x_i$. Thus, we assume a scalar factor $\nu$. To determine $\nu$, we consider residuals of the model \eqref{eq:1}: % $$ r_i = \frac{k_i}{n_i} - \Psi ( x_i | \theta ) $$ % A sensible model for the residuals is the beta distribution, % $$ \Beta ( \alpha_i, \beta_i ),\quad\alpha_i,\beta_i>0. $$ % The beta distribution $\Beta (\alpha,\beta)$, can be interpreted as the posterior distribution for the success probability of a binomial model after observing $\alpha-1$ successes and $\beta-1$ failures. We can thus write from equation \eqref{eq:1} (with the number of trials as $\nu n_i$) % \begin{equation} p_i := \frac{k_i}{n_i} \sim \Beta ( \alpha_i, \beta_i ) = \Beta \big( \Psi(x_i|\theta)\nu n_i, (1-\Psi(x_i|\theta))\nu n_i\big). \label{eq:2} \end{equation} % If we know a value for $\theta$, this distribution still depends on one free parameter $\nu$. To derive a correction factor $\nu$, we can fix $\theta=\hat{\theta}$ at the (constrained) maximum likelihood estimate of $\theta$ based on the assumption of binomial variance, i.e. equation \eqref{eq:1}. The log likelihood function for $\nu$ is then % \begin{equation} \begin{split} \ell (\nu) &= \sum_{i=1}^m \log ( f ( p_i; \hat{\Psi}_i, \nu n_i) ) \\ &= \sum_{i=1}^m \log ( \Gamma ( \nu n_i+2)) - \log ( \Gamma ( \hat{\Psi}_i \nu n_i +1 ) ) - \log ( \Gamma ( (1-\hat{\Psi}_i) \nu n_i + 1 )) \\ &\qquad + \hat{\Psi}_i \nu n_i \log (p_i) + (1-\hat{\Psi}_i) \nu n_i \log ( 1-p_i). \end{split} \label{eq:3} \end{equation} % Here, we set $f: (0,1) \to \mathbb{R}^+$ as the densitiy of the beta distribution parameterized in terms of observed success rate and total number of trials, and $\hat{\Psi}_i := \Psi ( x_i | \hat{\theta} )$. Analytical maximization of $\ell ( \nu)$ is difficult due to the $\Gamma$ function. In particular, the derivative of equation \eqref{eq:3} involves the digamma function of 0-th order $\psi_0 = \frac{d}{dx} \log\Gamma(x)$: % \begin{equation} \begin{split} \frac{\p\ell}{\p \nu} (\nu) &= \sum_{i=1}^m n\psi_0 ( \nu n_i + 2 ) - \hat{\Psi}_i n_i \psi_0 ( \nu \hat{\Psi}_i n_i + 1) - (1-\hat{\Psi}_i) n_i \psi_0 ( \nu (1-\hat{\Psi}_i) n_i + 1) \\ &\qquad + \hat{\Psi}_i n_i \log (p_i) + (1-\hat{\Psi}_i) n_i log (1-p_i). \end{split} \label{eq:4} \end{equation} % To find a maximum of $\ell$, we can use newton iterations of the form % $$ \nu_0=1,\quad\nu_{k+1} = \nu_{k} - \frac{\ell\prime(\nu_k)}{\ell\prime\prime(\nu_k)}, $$ % where $\ell\prime := \p\ell/\p\nu$ and % \begin{equation} \begin{split} \ell\prime\prime ( \nu ) &:= \frac{\p^2\ell}{\p\ell^2} ( \nu) \\ &= \sum_{i=1}^m n_i^2 \psi_1 ( \nu n_i + 2 ) - \hat{\Psi}_i^2 n_i^2 \psi_1 ( \nu \hat{\Psi}_i n_i + 1 ) - (1-\hat{\Psi}_i)^2 n_i^2 \psi_1 ( \nu (1-\hat{\Psi}_i) n_i + 1 ) \end{split} \label{eq:5} \end{equation} % After a couple of steps, $\nu_k$ should be a reasonably good estimate of $\nu^*$, the desired maximum. We can use the estimated value $\nu^*$ in two ways to correct the confidence intervals: % \begin{enumerate} \item We modify our data and set $$ k_i\mapsto \lfloor\nu^* k_i\rfloor,\quad n_i\mapsto \lfloor\nu^* n_i\rfloor,\quad i=1,\dots,m. $$ Here $\lfloor x\rfloor, x\in\mathbb{R}$ is the largest integer $n\leq x$. With these modified trial numbers, we perform inference as usual, i.e. we determine confidence intervals based on bootstrap or determine a posterior distribution. \item We modify our confidence limits % $$ c \mapsto \frac{c-\hat{\theta}}{\sqrt{\nu}} + \hat{\theta}, $$ % where $c$ is the desired confidence limit. For Bayesian inference, we will typically have to scale every sample $\theta^{(j)}$ according to % $$ \theta^{(j)} \mapsto \frac{\theta^{(j)} - \hat{\theta}}{\sqrt{\nu}} + \hat{\theta}. $$ % \end{enumerate} % It is not obvious, which strategy provides better coverage. This should be tested in simulations. \end{document} psignifit3-3.0~beta.20120611.1/documents/simultaneous.tex000066400000000000000000000246311176542545200230130ustar00rootroot00000000000000\documentclass[a4paper,11pt]{scrartcl} \usepackage{amsmath,amssymb} \usepackage[utf8]{inputenc} \title{Informed priors and quasi-simultaneous inference for psychometric functions} \author{Ingo Fründ} \date{\today} \def\prob{\mathbb{P}} \begin{document} \maketitle % Your text here When fitting psychometric functions, we are often interested in summarizing the performance of observers in as few numbers as possible. Of particular interest is a summary of the performance that consists of a single parameter, the threshold. Unfortunately, comparisons of psychophysical thresholds are only meaningful if other parameters of the psychometric functions --- such as slope and lapse rate --- are constant across conditions. Here, I demonstrate how priors can be derived that incorporate the information from other conditions. If these priors are used in bayesian inference of psychometric functions, this allows for quasi-simultaneous fits that constrain parameters to be constant across conditions. \section{A simple example} We start with a simple example to illustrate the basic idea behind the approach. Assume, we colleted data $X_i$ under two different conditions $i\in\{1,2\}$. We want to model these data depending on a parameter $\theta$. In principle, $\theta$ might differ between the two conditions, but we will assume here, that $\theta_1=\theta_2$. In this particular case, we can write down the posterior distribution of $\theta$: % $$ \prob(\theta|X_1,X_2) \propto \prob(X_1,X_2|\theta) \prob(\theta) = \prob(X_1|\theta)\prob(X_2|\theta)\prob(\theta), $$ % Where the second equality holds under the assumption that the two conditions are independent. In practical applications, we will typically not be able to write down $\prob(\theta|X_1,X_2)$ directly. Thus, we will have to resort to sampling strategies to explore $\prob(\theta|X_1,X_2)$. The strategy in this case is therefore to perform two sampling stages. In the first sampling run, we derive proper priors for the parameter $\theta$ and in the second sampling run, we use these priors to perform the true analysis. For the first sampling run, we employ an improper uniform prior, that is $\prob(\theta)=\kappa$ for all $\theta$ and a fixed $\kappa$. We then use MCMC to generate a sample $(\theta_{1i})_{i=1}^m$ of size $m$ from $\prob(\theta|X_1)\propto\prob(X_1|\theta)\cdot\kappa$ and another sample $(\theta_{2i})_{i=1}^m$ from $\prob(\theta|X_2)\propto\prob(X_2|\theta)\cdot\kappa$. We now fit a parametric model to each sample and use these model as priors for the second sampling run. Denote the parametric model fitted to $(\theta_{1i})$ by $f_1$ and the parametric model fitted to $(\theta_{2i})$ by $f_2$. Then approximate samples from the simultaneous model can be obtained by sampling either % $$ \prob(\theta|X_1,X_2) \propto\prob(X_1|\theta)f_2(\theta), $$ % or % $$ \prob(\theta|X_1,X_2) \propto\prob(X_2|\theta)f_1(\theta). $$ % \section{Constant parameters} I will now expand the above strategy to the case in which the model has more than a single parameter. Let us think about a model with three parameters, $\theta$, $\vartheta_1$, $\vartheta_2$. As the notation already suggests, $\theta$ shall be assumed fixed across conditions, while $\vartheta_1$ and $\vartheta_2$ depend on the experimental condition. Again, we write down the posterior distribution % \begin{align*} \prob(\theta,\vartheta_1,\vartheta_2|X_1,X_2) &=\prob(\theta|X_1,X_2)\prob(\vartheta_1,\vartheta_2|X_1,X_2)\\ &= \prob(\theta|X_1,X_2)\prob(\vartheta_1|X_1)\prob(\vartheta_2|X_2), \end{align*} % Where the first equality requires $\theta$ to be independent of $\vartheta_1$ and $\vartheta_2$. That means, the parameter we want constraint to be equal across conditions necessarily has to be independent of the other parameters! The second equality is valid if $\vartheta_1$ depends only on the data $X_1$ and $\vartheta_2$ depends only on the data $X_2$. This is a rather plausible condition. We can now use the same trick as above to derive priors for $\theta$ by drawing samples $(\theta_{1i})_{i=1}^m$ from $\prob(\theta,\vartheta_1|X_1)\cdot\kappa$ and $(\theta_{2i})_{i=1}^m$ from $\prob(\theta,\vartheta_2|X_2)\cdot\kappa$. Then, we fit the marginal distributions of $(\theta_{1i})$ and $(\theta_{2i})$ to obtain expressions for $f_1$ and $f_2$. In a second sampling run, we can then perform quasi simultaneous sampling using % $$ \prob(\theta,\vartheta_1|X_1,X_2) \propto\prob(X_1|\theta,\vartheta_1)f_2(\theta)\prob(\vartheta_1), $$ % and % $$ \prob(\theta,\vartheta_2|X_1,X_2) \propto\prob(X_2|\theta,\vartheta_2)f_1(\theta)\prob(\vartheta_2). $$ % \section{More than two conditions} The extension of these ideas to cases with more than two conditions is straight forward: In the first sampling run, we determine the prior densities $f_j, j=1,\dots,n$ from each dataset $X_j$ in isolation. We then combine the $f_j$ in order to sample % \begin{equation} \label{eq:allcombined} \prob(\theta,\vartheta_j|X_j, j=1,\dots,n) \propto\prob(X_j|\vartheta_j,\theta) \prob(\vartheta_j) \prod_{\underset{\ell\neq j}{\ell=1}}^n f_\ell ( \theta ), \end{equation} % in isolation for each $j=1,\dots,n$. Thus, the product $\prod_{\underset{\ell\neq j}{\ell=1}}^n f_\ell ( \theta )$ can be taken as a prior that incorporates prior knowledge about the other psychometric functions in the design. \section{Specific choices of fitted posteriors} Here, we will highlight reasonable choices to fit the posterior distributions and we will demonstrate, how these choices imply a closed functional form for the product prior in equation \eqref{eq:allcombined}. \subsection{Fitting posterior distributions for scale parameters} In order to compare, thresholds obtained from different conditions, it is typically required that the slopes across all these conditions are equal. Although threshold comparisons are possible with unequal slopes, too, it is far more complicated to arrive at valid conclusions from these comparisons. In psignifit, many parameterizations of the psychometric functions do not explicitely specify the slope of the psychometric function but instead have a parameter that is somehow related to the inverse slope. Posterior distributions for this parameter often resemble a Gamma distribution, i.e. the seem to have a density of the form % \begin{equation} \label{eq:GammaDensity} f ( x | k, \theta ) = x^{k-1} \frac{\exp(-x/\theta)}{\Gamma(k)\theta^k}. \end{equation} % We now assume that we have fitted this density (using for instance maximum likelihood) to a set of $n$ sampled posteriors from different conditions and we want to derive the product prior for the $n+1$-th condition. The product prior has the density % \begin{align*} \bar{f}(x) &= \prod_{j=1}^n f_j(x) = \prod_{j=1}^n x^{k_j-1} \frac{\exp(-x/\theta_j)}{\Gamma(k_j)\theta_j^{k_j}} \\ &\propto \prod_{j=1}^n x^{k_j-1} \exp(-x/\theta_j) \\ &= x^{\sum_{j=1}^n k_j-1} \exp(-x\sum_{j=1}^n \frac{1}{\theta_j}) \\ &= x^{\bar{k}-1} \exp(-x/\bar{\theta}), \end{align*} % where we set % $$ \bar{k} := 1 + \sum_{j=1}^n k_j-1, $$ % and % $$ \bar{\theta} := \Big( \sum_{j=1}^n \frac{1}{\theta_j} \Big)^{-1}. $$ % Thus, the product prior is again a Gamma distribution with parameters $\bar{k}$ and $\bar{\theta}$! \subsection{Fitting posterior distributions for rates} The psychometric function model includes two rate parameters, the guessing rate $\gamma$ that describes the lower asymptote and the lapse rate $\lambda$ that describes the upper asymptote. A very reasonable model for rates is the Beta distribution (cite Ferrari?). The Beta distribution lives on the unit interval $(0,1)$ and takes the density % \begin{equation} f ( x | \alpha, \beta ) = \frac{\Gamma(\alpha+\beta)}{\Gamma(\alpha)\Gamma(\beta)} x^{\alpha-1} (1-x)^{\beta-1}. \label{eq:BetaDensity} \end{equation} % Here, we can use the same trick as with the Gamma distribution to derive a sensible product prior: We assume that we fitted $n$ sets of parameters $(\alpha_j,\beta_j)_{j=1}^n$ and want to combine these to obtain a prior for the $n+1$-th condition. The product prior in this case is % \begin{align*} \bar{f}(x) &= \prod_{j=1}^n f_j(x) = \prod_{j=1}^n \frac{\Gamma(\alpha_j+\beta_j)}{\Gamma(\alpha_j)\Gamma(\beta_j)} x^{\alpha_j-1} (1-x)^{\beta_j-1}\\ &\propto \prod_{j=1}^n x^{\alpha_j-1} (1-x)^{\beta_j-1} \\ &= x^{\sum_{j=1}^n \alpha_j-1} (1-x)^{\sum_{j=1}^n\beta_j-1} \\ &= x^{\bar{\alpha}-1} (1-x)^{\bar{\beta}-1}, \end{align*} % where $\bar{\alpha}:= 1+ \sum_{j=1}^n\alpha_j-1$ and $\bar{\beta}:=1+\sum_{j=1}^n\beta_j-1$. Thus, the product prior in this case, is again a Beta distribution, with parameters $\bar{\alpha}$ and $\bar{\beta}$. \subsection{Fitting posterior distributions for thresholds} In some, very rare situations, we might also be interested in having equal posterior distributions for thresholds. A reasonable approximation for posterior threshold distributions is often the Normal distribution. Interestingly, the procedure used to derive the product prior in the preceeding paragraphs does not work well for the Normal distribution. Assume, we fitted the posteriors in conditions $j=1,\dots,n$ with Normal densities $(f_j)_{j=1}^n$ with parameters $(\mu_j,\sigma_j)_{j=1}^n$. The product is then % \begin{align*} \bar{f}(x) &= \prod_{j=1}^n f_j(x) = \prod_{j=1}^n \frac{1}{\sqrt{2\pi}\sigma_j} \exp ( - \frac{(x-\mu_j)^2}{2\sigma_j^2})\\ &\propto \prod_{j=1}^n \exp ( - \frac{(x-\mu_j)^2}{2\sigma_j^2})\\ &= \exp ( - \sum_{j=1}^n \frac{(x-\mu_j)^2}{2\sigma_j^2} ) \\ &= \exp ( - \frac{1}{2} \big( \sum_{j=1}^n \frac{x^2}{\sigma_j^2} - \sum_{j=1}^n 2\frac{x\mu_j}{\sigma_j^2} + \sum_{j=1}^n \frac{\mu_j^2}{\sigma_j^2} \big) )\\ &\propto\exp ( - \frac{1}{2} \big( \sum_{j=1}^n \frac{x^2}{\sigma_j^2} - \sum_{j=1}^n 2\frac{x\mu_j}{\sigma_j^2}\big) ) \\ &= \exp ( - \frac{1}{2} \big( x^2\sum_{j=1}^n \frac{1}{\sigma_j^2} - 2x\sum_{j=1}^n 2\frac{\mu_j}{\sigma_j^2} \big) ) \\ &= \exp ( - \frac{1}{2} \underbrace{\sum_{j=1}^n \frac{1}{\sigma_j^2}}_{=:\bar{\sigma}^{-2}} \big( x^2 - 2x\underbrace{\frac{\sum_{j=1}^n \frac{\mu_j}{\sigma_j^2}}{\sum_{j=1}^n \frac{1}{\sigma_j^2}}}_{=:\bar{\mu}}\big) ) \\ &\propto \frac{1}{\sqrt{2\pi}\bar{\sigma}} \exp( - \frac{(x-\bar{\mu})^2}{2\bar{\sigma}^2}). \end{align*} % Thus, comparing coefficients with the Normal density, we end up with a new Normal distribution with parameters % $$ \bar{\sigma}^2 := \big(\sum_{j=1}^n \frac{1}{\sigma_j^2}\big)^{-1}, $$ % $$ \bar{\mu} := \frac{\sum_{j=1}^n\frac{\mu_j}{\sigma_j^2}}{\sum_{j=1}^n\frac{1}{\sigma_j^2}}. $$ % \end{document} psignifit3-3.0~beta.20120611.1/examples/000077500000000000000000000000001176542545200173505ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/examples/bayes_2afc.m000066400000000000000000000020231176542545200215210ustar00rootroot00000000000000% bayes_2afc.m % % This file illustrates the analysis of 2afc data using constrained % maximum likelihood and bootstrap analyzes in MATLAB. % % The analysis is explained in more detail in the "Quick start to psignifit" % that can be found at http://psignifit.sourceforge.net/TUTORIAL.html % Set the priors priors.m_or_a = 'Gauss(0, 5)'; priors.w_or_b = 'Gauss(1, 3)'; priors.lambda = 'Beta(2, 30)'; % Type of data nafc = 2; % Define the data stimulus_intensities = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0]; number_of_correct = [34, 32, 40, 48, 50, 48]; number_of_trials = [50, 50, 50, 50, 50, 50]; data = [stimulus_intensities; number_of_correct; number_of_trials]'; % Run the bootstrap inference results = BayesInference(data, priors); % Print thresholds and slops for all cuts for i = 1:length(results.cuts) th = sprintf('Threshold(%.2f) = \t %f', results.cuts(i), getThres(results, i)); disp(th) sl = sprintf('Slope(%.2f) \t = \t %f', results.cuts(i), getSlope(results, i)); disp(sl) end % Plot the results plotPMF(results) psignifit3-3.0~beta.20120611.1/examples/bayes_2afc.py000066400000000000000000000025661176542545200217310ustar00rootroot00000000000000#!/usr/bin/env python # This file illustrates the analysis of 2afc data using bayesian # inference and markov chain monte carlo sampling. # # The analysis is explained in more detail in the "Quick start to psignifit" # that can be found at http://psignifit.sourceforge.net/TUTORIAL.html from pypsignifit import * from pylab import figure # The data are form a 2afc task nafc = 2 # Now we get the data stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] number_of_correct = [34,32,40,48,50,48] number_of_trials = [50]*len(stimulus_intensities) data = zip(stimulus_intensities,number_of_correct,number_of_trials) # Select priors # These priors are clearly informative priors. This means they impose considerable # prior information on the inference. This is useful in this case to illustrate # bayesian analysis in general. However, in many cases, other, less informative priors # might be of interest. priors = ( 'Gauss(0,5)', 'Gamma(1,3)', 'Beta(2,30)' ) # Perform the actual inference mcmc = BayesInference ( data, priors=priors, nafc=nafc ) # Add some more chains for convergence diagnostic mcmc.sample ( start = (0,1,0.01) ) mcmc.sample ( start = (6,11,0.3) ) # Generate convergence plots for all three paramters for i in xrange ( 3 ): ConvergenceMCMC ( mcmc, i ) # Assess goodness of fit GoodnessOfFit ( mcmc ) # See parameter plot ParameterPlot ( mcmc ) # Show everything show() psignifit3-3.0~beta.20120611.1/examples/bootstrap_2afc.m000066400000000000000000000020201176542545200224300ustar00rootroot00000000000000% bootstrap_2afc.m % % This file illustrates the analysis of 2afc data using constrained % maximum likelihood and bootstrap analyzes in MATLAB. % % The analysis is explained in more detail in the "Quick start to psignifit" % that can be found at http://psignifit.sourceforge.net/TUTORIAL.html % Set the priors priors.m_or_a = 'None'; priors.w_or_b = 'None'; priors.lambda = 'Uniform(0,0.1)'; % Type of data nafc = 2; % Define the data stimulus_intensities = [0.0, 2.0, 4.0, 6.0, 8.0, 10.0]; number_of_correct = [34, 32, 40, 48, 50, 48]; number_of_trials = [50, 50, 50, 50, 50, 50]; data = [stimulus_intensities; number_of_correct; number_of_trials]'; % Run the bootstrap inference results = BootstrapInference(data, priors); % Print thresholds and slops for all cuts for i = 1:length(results.cuts) th = sprintf('Threshold(%.2f) = \t %f', results.cuts(i), getThres(results, i)); disp(th) sl = sprintf('Slope(%.2f) \t = \t %f', results.cuts(i), getSlope(results, i)); disp(sl) end % Plot the results plotPMF(results) psignifit3-3.0~beta.20120611.1/examples/bootstrap_2afc.py000066400000000000000000000035551176542545200226420ustar00rootroot00000000000000#!/usr/bin/env python # This file illustrates the analysis of 2afc data using constrained # maximum likelihood and bootstrap analyzes. # # The analysis is explained in more detail in the "Quick start to psignifit" # that can be found at http://psignifit.sourceforge.net/TUTORIAL.html from pypsignifit import * from pylab import figure # The data are form a 2afc task nafc = 2 # Now we get the data stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] number_of_correct = [34,32,40,48,50,48] number_of_trials = [50]*len(stimulus_intensities) data = zip(stimulus_intensities,number_of_correct,number_of_trials) # Constraints for the parameters constraints = ( 'unconstrained', 'unconstrained', 'Uniform(0,0.1)' ) # Determine point estimate # this uses the default values, i.e. a logistic sigmoid and the ab-core # resulting in a parameterization of the psychometric function of the # form # # psi ( x ) = gamma + (1-gamma-lambda) / ( 1 + exp ( - (x-alpha)/beta ) ) # # With a parameter vector (alpha,beta,lambda) and gamma=1/2. B = BootstrapInference ( data, priors=constraints, nafc=nafc ) # Now we perform bootstrap sampling to obtain confidence regions and goodness # of fit statistics. # # Again the default values are used which is: 2000 bootstrap samples are generated # by parametric bootstrap B.sample () # We generate a summary of the goodness of fit statistics GoodnessOfFit ( B ) # We plot information about the parameters and their distributions ParameterPlot ( B ) # information about thresholds and their distributions ThresholdPlot ( B ) # Now we print the confidence intervals of the 0.5-threshold before and after # sensitivity analysis (where we perform the sensitivity analsis implicitely # by calling plotSensitivity) print "CI_0 =",B.getCI(1) fig = figure() ax = fig.add_axes ( [.1,.1,.8,.8] ) plotSensitivity ( B, ax ) print "CI_1 =",B.getCI(1) # Show all figures show() psignifit3-3.0~beta.20120611.1/examples/influential.py000066400000000000000000000025611176542545200222400ustar00rootroot00000000000000#!/usr/bin/env python # This file illustrates the analysis of influential observations # using constrained ML and bootstrap as well as bayesian inference # # The analysis is explained in more detail in the "Quick start to psignifit" # that can be found at http://psignifit.sourceforge.net/TUTORIAL.html from pypsignifit import * from pylab import figure # The data are form a 2afc task nafc = 2 # Now we get the data stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] number_of_correct = [34,32,40,48,50,48] number_of_trials = [50]*len(stimulus_intensities) data = zip(stimulus_intensities,number_of_correct,number_of_trials) # Constraints for Bootstrap constraints = ( 'unconstrained', 'unconstrained', 'Uniform(0,0.1)' ) # Select priors # These priors are clearly informative priors. This means they impose considerable # prior information on the inference. This is useful in this case to illustrate # bayesian analysis in general. However, in many cases, other, less informative priors # might be of interest. priors = ( 'Gauss(0,5)', 'Gamma(1,3)', 'Beta(2,30)' ) # Perform the actual inference B = BootstrapInference ( data, priors=constraints, nafc=nafc, sample=True ) mcmc = BayesInference ( data, priors=priors, nafc=nafc ) # plot BayesInfluence plotInfluential ( B ) plotInfluential ( mcmc ) # for i in xrange (3 ): # ConvergenceMCMC ( mcmc, i ) # show results show() psignifit3-3.0~beta.20120611.1/investigate-zlci/000077500000000000000000000000001176542545200210135ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/investigate-zlci/checkdata.py000066400000000000000000000035521176542545200233010ustar00rootroot00000000000000#!/usr/bin/env python import reader import sys import pypsignifit as pf import pypsignifit.psignipriors as pfp import pylab as pl import numpy as np import swignifit.swignifit_raw as sfr import integrate as ig # import pypsignifit.psigniplot as pp d,s = reader.read_data ( sys.argv[1] ) d = np.array(d) # stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] # number_of_correct = [34,32,40,48,50,48] # number_of_trials = [50]*len(stimulus_intensities) # data = zip(stimulus_intensities,number_of_correct,number_of_trials) # d = np.array ( data ) model = {'nafc':1, 'sigmoid':"logistic", 'core':'mw0.1'} m = 4.0 w = 4.0 l = 0.05 g = 0.02 priors = ["Gauss(%f,%f)" % (m, m), "Gauss(%f,%f)" % (w, w*2), "Beta(2,50)", "Beta(1,50)"] # priors = (pfp.default_mid(d[:,0])[0],"Gamma(2,4)",pfp.default_lapse(),pfp.default_lapse()) # priors = ("Gauss(4,.1)","Gauss(4,.1)","Beta(2,50)","Beta(1,50)") print priors x,fx,priors = ig.integration_grid ( d ) post_approx = ig.fit_posterior(fx,x) print priors print post_approx # for i,prm in enumerate ( ["m","w","lm","gm"] ): # pl.subplot(221+i) # xx = np.mgrid[x[i].min():x[i].max():100j] # f = ig.sfu.get_prior ( post_approx[i] ) # lf = np.array ([ f.pdf ( y ) for y in xx ]) # pl.plot ( xx, lf, '-' ) # pl.plot ( x[i], lf.max()*fx[i], 'o' ) # pl.title ( prm ) # pl.show() mcmc = pf.BayesInference(d, sigmoid=model['sigmoid'], core=model['core'], nafc=model['nafc'], priors=priors, verbose=True, sampler="independence", stepwidths=post_approx, automatic=False, sample=False ) mcmc.sample ( 8000 ) # print mcmc.approx print post_approx pf.ConvergenceMCMC(mcmc,0) pf.ConvergenceMCMC(mcmc,1) pf.ConvergenceMCMC(mcmc,2) pf.ConvergenceMCMC(mcmc,3) # pl.subplot(414) # pl.plot ( mcmc.debug_samples[0][:,3] ) pl.show() # pf.ConvergenceMCMC(mcmc,0) # pf.ConvergenceMCMC(mcmc,1) # pf.ConvergenceMCMC(mcmc,2) # pf.show() psignifit3-3.0~beta.20120611.1/investigate-zlci/compare_asir_mcmc.py000066400000000000000000000077451176542545200250450ustar00rootroot00000000000000#!/usr/bin/env python import pypsignifit as psi import pylab as pl import numpy as np import scipy.stats import pypsignifit.psigobservers as Obs from pypsignifit.psigniplot import plotJoint sigmoid = "logistic" core = "mw0.1" priors = ("Gauss(0,100)","invGamma(.5,.5)","Beta(2,30)") Beta = scipy.stats.beta nafc = 2 blocks = [4,6,8,12] blocksizes = [20,40,60] wgen = [1,2,4] nafc = [1,2] def compare_on_dataset ( d, nafc=2, nruns=3 ): """Perform a comparison on a single dataset :Parameters: d dataset nafc number of alternatives nruns number of repetitions of the analysis TODO: This needs to be revised internally! """ if nafc==2: priors = ("Gauss(0,100)","invGamma(.5,.5)","Beta(2,30)") else: priors = ("Gauss(0,100)","invGamma(.5,.5)","Beta(2,30)","Beta(2,30)") results = [] for k in xrange ( nruns ): A = psi.ASIRInference ( d, nafc=nafc, priors=priors, sigmoid=sigmoid, core=core ) Am025,Am975 = pl.prctile ( A.mcestimates[:,0], (2.5,97.5) ) Aw025,Aw975 = pl.prctile ( A.mcestimates[:,1], (2.5,97.5) ) Amm,Awm = A.mcestimates[:,:2].mean(0) Ams,Aws = A.mcestimates[:,:2].std(0) M = psi.BayesInference ( d, nafc=nafc, priors=priors, sigmoid=sigmoid, core=core, maxnsamples=1000000 ) M.sample( start=M.farstart ) M.sample( start=M.farstart ) Mm025,Mm975 = pl.prctile ( M.mcestimates[:,0], (2.5,97.5) ) Mw025,Mw975 = pl.prctile ( M.mcestimates[:,1], (2.5,97.5) ) Mmm,Mwm = M.mcestimates[:,:2].mean(0) Mms,Mws = M.mcestimates[:,:2].std(0) MR = M.Rhat () print MR result = "%g %g %g %g " % (Am025,Am975,Amm,Ams) result += "%g %g %g %g " % (Aw025,Aw975,Awm,Aws) result += "%g %g %g %g " % (Mm025,Mm975,Mmm,Mms) result += "%g %g %g %g " % (Mw025,Mw975,Mwm,Mws) result += "%g %g %g " % (M.Rhat(0),M.Rhat(1),M.Rhat(2)) result += "%g %g " % (A._ASIRInference__inference["resampling-entropy"], A._ASIRInference__inference["duplicates"]) results.append ( result ) return results def sampling_scheme ( observer, nblocks ): if observer.model["nafc"] == 2: B = Beta ( 3.5, 1.5 ) # B = Beta ( 1.5,.6 ) elif observer.model["nafc"] == 1: B = Beta ( .5,.5 ) Fx = B.ppf ( np.mgrid[.025:.975:nblocks*1j] ) return observer.getlevels ( Fx ) def assemble_conditions ( blocks, blocksizes, wgen, nafc ): prm = [] for b in blocks: for bs in blocksizes: for w in wgen: for n in nafc: prm.append ( (b,bs,w,n) ) return prm def run_single_simulation ( prm, outf ): nblocks,blocksize,wgen,nafc = prm if nafc==2: O = Obs.Observer ( 4, wgen, .03, sigmoid=sigmoid, core=core, nafc=nafc ) else: O = Obs.Observer ( 4, wgen, .03, .03, sigmoid=sigmoid, core=core, nafc=nafc ) x = sampling_scheme ( O, nblocks ) for di in xrange ( 3 ): d = O.DoAnExperiment ( x, blocksize ) print d results = compare_on_dataset ( d, nafc ) outf.write ( "%(nblocks)s %(ntrials)s %(nafc)s %(wgen)s " % {"nblocks": nblocks, "ntrials": blocksize, "nafc": nafc, "wgen": wgen} ) outf.write ( " ".join ( results ) + "\n" ) outf.flush() if __name__ == "__main__": conditions = assemble_conditions ( blocks, blocksizes, wgen, nafc ) outf = open ( "test", "w" ) outf.write ( "nblocks ntrials nafc wgen Am025_1 Am975_1 Amm_1 Ams_1 Aw025_1 Aw975_1 Awm_1 Aws_1 Mm025_1 Mm975_1 Mmm_1 Mms_1 Mw025_1 Mw975_1 Mwm_1 Mws_1 Rm_1 Rw_1 Rl_1 H_1 dup_1 Am025_2 Am975_2 Amm_2 Ams_2 Aw025_2 Aw975_2 Awm_2 Aws_2 Mm025_2 Mm975_2 Mmm_2 Mms_2 Mw025_2 Mw975_2 Mwm_2 Mws_2 Rm_2 Rw_2 Rl_2 H_2 dup_2 Am025_3 Am975_3 Amm_3 Ams_3 Aw025_3 Aw975_3 Awm_3 Aws_3 Mm025_3 Mm975_3 Mmm_3 Mms_3 Mw025_3 Mw975_3 Mwm_3 Mws_3 Rm_3 Rw_3 Rl_3 H_3 dup_3\n" ) for cond in conditions: run_single_simulation ( cond, outf ) outf.close() psignifit3-3.0~beta.20120611.1/investigate-zlci/data1000066400000000000000000000045531176542545200217370ustar00rootroot000000000000003.0 2 10 3.03438393847 1 10 3.06683976785 5 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 1 10 3.18151774456 2 10 3.20716743383 2 10 3.23184086298 4 10 3.25562705378 5 10 3.27860386336 4 10 3.30083979103 2 10 3.32239543436 5 10 3.34332467315 2 10 3.36367564024 2 10 3.38349152356 5 10 3.40281123349 3 10 3.42166996184 2 10 3.44009965292 4 10 3.45812940282 5 10 3.47578579968 3 10 3.49309321508 4 10 3.51007405486 4 10 3.52674897593 6 10 3.54313707448 2 10 3.55925605012 2 10 3.57512234939 3 10 3.59075129199 4 10 3.60615718186 5 10 3.62135340555 2 10 3.6363525195 5 10 3.6511663277 2 10 3.66580595104 5 10 3.68028188951 4 10 3.69460407794 4 10 3.70878193635 5 10 3.72282441539 8 10 3.73674003753 5 10 3.75053693448 5 10 3.76422288134 4 10 3.77780532778 4 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 2 10 3.84440643489 8 10 3.85750943587 4 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 7 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 7 10 3.94790906028 5 10 3.96069913233 3 10 3.97347371267 4 10 3.98623785449 3 10 3.99899658627 4 10 4.01175492376 5 10 4.02451788173 3 10 4.03729048591 5 10 4.05007778479 7 10 4.06288486173 5 10 4.07571684715 6 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 6 10 4.12739884254 3 10 4.14043487408 4 10 4.15352831675 3 10 4.16668500741 6 10 4.17991094525 5 10 4.19321230985 4 10 4.20659548044 3 10 4.22006705657 7 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 7 10 4.27497841466 8 10 4.28900038424 7 10 4.30315636519 3 10 4.31745523817 6 10 4.33190634649 6 10 4.3465195408 5 10 4.36130522862 9 10 4.37627442923 3 10 4.39143883477 5 10 4.40681087839 9 10 4.42240381053 8 10 4.43823178464 6 10 4.45430995358 4 10 4.4706545787 8 10 4.48728315346 5 10 4.50421454406 7 10 4.52146915008 4 10 4.53906908867 4 10 4.55703840652 5 10 4.57540332489 6 10 4.59419252417 9 10 4.61343747583 7 10 4.63317283161 5 10 4.65343688238 6 10 4.67427210198 5 10 4.69572579606 5 10 4.71785088083 4 10 4.74070682473 7 10 4.76436079535 8 10 4.7888890681 8 10 4.81437877164 4 10 4.8409300716 8 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 10 10 4.96038937084 5 10 4.99445259144 8 10 5.0306800504 7 10 5.06941176794 9 10 5.1110733522 8 10 5.15620742767 7 10 5.20552095898 7 10 5.25995921372 5 10 5.3208266688 8 10 5.38999588299 8 10 5.47029442647 8 10 5.56629019787 9 10 5.68609831971 9 10 5.84638599875 9 10 6.09132916932 8 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data12000066400000000000000000000045521176542545200220200ustar00rootroot000000000000003.0 3 10 3.03438393847 1 10 3.06683976785 2 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 2 10 3.18151774456 3 10 3.20716743383 1 10 3.23184086298 3 10 3.25562705378 7 10 3.27860386336 3 10 3.30083979103 5 10 3.32239543436 7 10 3.34332467315 4 10 3.36367564024 1 10 3.38349152356 3 10 3.40281123349 1 10 3.42166996184 4 10 3.44009965292 2 10 3.45812940282 5 10 3.47578579968 2 10 3.49309321508 4 10 3.51007405486 3 10 3.52674897593 4 10 3.54313707448 1 10 3.55925605012 3 10 3.57512234939 6 10 3.59075129199 5 10 3.60615718186 4 10 3.62135340555 3 10 3.6363525195 7 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 4 10 3.69460407794 4 10 3.70878193635 4 10 3.72282441539 5 10 3.73674003753 3 10 3.75053693448 5 10 3.76422288134 7 10 3.77780532778 5 10 3.79129142667 2 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 5 10 3.84440643489 5 10 3.85750943587 4 10 3.87055411763 2 10 3.88354619344 4 10 3.89649124479 3 10 3.90939473669 5 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 2 10 3.96069913233 5 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 7 10 4.01175492376 4 10 4.02451788173 7 10 4.03729048591 4 10 4.05007778479 4 10 4.06288486173 6 10 4.07571684715 5 10 4.08857893112 7 10 4.10147637615 4 10 4.11441453062 5 10 4.12739884254 4 10 4.14043487408 6 10 4.15352831675 2 10 4.16668500741 5 10 4.17991094525 8 10 4.19321230985 7 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 4 10 4.27497841466 9 10 4.28900038424 6 10 4.30315636519 7 10 4.31745523817 7 10 4.33190634649 5 10 4.3465195408 4 10 4.36130522862 6 10 4.37627442923 5 10 4.39143883477 7 10 4.40681087839 4 10 4.42240381053 5 10 4.43823178464 5 10 4.45430995358 4 10 4.4706545787 5 10 4.48728315346 6 10 4.50421454406 6 10 4.52146915008 4 10 4.53906908867 7 10 4.55703840652 4 10 4.57540332489 3 10 4.59419252417 5 10 4.61343747583 6 10 4.63317283161 4 10 4.65343688238 5 10 4.67427210198 7 10 4.69572579606 8 10 4.71785088083 6 10 4.74070682473 7 10 4.76436079535 9 10 4.7888890681 6 10 4.81437877164 7 10 4.8409300716 7 10 4.86865893179 4 10 4.8977006465 7 10 4.92821441759 7 10 4.96038937084 6 10 4.99445259144 6 10 5.0306800504 9 10 5.06941176794 7 10 5.1110733522 5 10 5.15620742767 9 10 5.20552095898 7 10 5.25995921372 4 10 5.3208266688 8 10 5.38999588299 9 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 8 10 6.09132916932 8 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data16000066400000000000000000000045541176542545200220260ustar00rootroot000000000000003.0 3 10 3.03438393847 2 10 3.06683976785 2 10 3.09760144961 4 10 3.1268634863 2 10 3.15478934453 4 10 3.18151774456 4 10 3.20716743383 4 10 3.23184086298 6 10 3.25562705378 4 10 3.27860386336 3 10 3.30083979103 3 10 3.32239543436 3 10 3.34332467315 2 10 3.36367564024 4 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 6 10 3.44009965292 4 10 3.45812940282 3 10 3.47578579968 2 10 3.49309321508 3 10 3.51007405486 5 10 3.52674897593 2 10 3.54313707448 4 10 3.55925605012 5 10 3.57512234939 0 10 3.59075129199 6 10 3.60615718186 5 10 3.62135340555 6 10 3.6363525195 5 10 3.6511663277 2 10 3.66580595104 4 10 3.68028188951 5 10 3.69460407794 6 10 3.70878193635 6 10 3.72282441539 4 10 3.73674003753 5 10 3.75053693448 5 10 3.76422288134 1 10 3.77780532778 5 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 4 10 3.83123925344 5 10 3.84440643489 4 10 3.85750943587 5 10 3.87055411763 4 10 3.88354619344 6 10 3.89649124479 4 10 3.90939473669 7 10 3.92226203224 4 10 3.93509840657 4 10 3.94790906028 6 10 3.96069913233 3 10 3.97347371267 7 10 3.98623785449 4 10 3.99899658627 5 10 4.01175492376 4 10 4.02451788173 5 10 4.03729048591 6 10 4.05007778479 7 10 4.06288486173 6 10 4.07571684715 5 10 4.08857893112 5 10 4.10147637615 4 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 6 10 4.15352831675 4 10 4.16668500741 7 10 4.17991094525 6 10 4.19321230985 4 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 5 10 4.24730306039 8 10 4.26108199786 6 10 4.27497841466 5 10 4.28900038424 4 10 4.30315636519 7 10 4.31745523817 8 10 4.33190634649 4 10 4.3465195408 8 10 4.36130522862 6 10 4.37627442923 5 10 4.39143883477 5 10 4.40681087839 7 10 4.42240381053 5 10 4.43823178464 5 10 4.45430995358 7 10 4.4706545787 5 10 4.48728315346 8 10 4.50421454406 7 10 4.52146915008 7 10 4.53906908867 7 10 4.55703840652 9 10 4.57540332489 5 10 4.59419252417 8 10 4.61343747583 7 10 4.63317283161 3 10 4.65343688238 5 10 4.67427210198 4 10 4.69572579606 5 10 4.71785088083 8 10 4.74070682473 6 10 4.76436079535 10 10 4.7888890681 6 10 4.81437877164 6 10 4.8409300716 6 10 4.86865893179 5 10 4.8977006465 9 10 4.92821441759 8 10 4.96038937084 5 10 4.99445259144 7 10 5.0306800504 8 10 5.06941176794 9 10 5.1110733522 7 10 5.15620742767 9 10 5.20552095898 6 10 5.25995921372 7 10 5.3208266688 7 10 5.38999588299 8 10 5.47029442647 10 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 9 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data18000066400000000000000000000045541176542545200220300ustar00rootroot000000000000003.0 3 10 3.03438393847 2 10 3.06683976785 4 10 3.09760144961 3 10 3.1268634863 3 10 3.15478934453 2 10 3.18151774456 4 10 3.20716743383 1 10 3.23184086298 5 10 3.25562705378 5 10 3.27860386336 2 10 3.30083979103 4 10 3.32239543436 5 10 3.34332467315 3 10 3.36367564024 2 10 3.38349152356 4 10 3.40281123349 4 10 3.42166996184 3 10 3.44009965292 3 10 3.45812940282 4 10 3.47578579968 5 10 3.49309321508 5 10 3.51007405486 3 10 3.52674897593 6 10 3.54313707448 5 10 3.55925605012 3 10 3.57512234939 4 10 3.59075129199 4 10 3.60615718186 2 10 3.62135340555 2 10 3.6363525195 4 10 3.6511663277 7 10 3.66580595104 5 10 3.68028188951 5 10 3.69460407794 4 10 3.70878193635 2 10 3.72282441539 3 10 3.73674003753 5 10 3.75053693448 2 10 3.76422288134 6 10 3.77780532778 5 10 3.79129142667 5 10 3.8046880604 5 10 3.81800186517 4 10 3.83123925344 3 10 3.84440643489 3 10 3.85750943587 5 10 3.87055411763 5 10 3.88354619344 7 10 3.89649124479 5 10 3.90939473669 6 10 3.92226203224 4 10 3.93509840657 5 10 3.94790906028 3 10 3.96069913233 7 10 3.97347371267 4 10 3.98623785449 5 10 3.99899658627 7 10 4.01175492376 5 10 4.02451788173 8 10 4.03729048591 3 10 4.05007778479 5 10 4.06288486173 7 10 4.07571684715 3 10 4.08857893112 3 10 4.10147637615 3 10 4.11441453062 7 10 4.12739884254 5 10 4.14043487408 5 10 4.15352831675 4 10 4.16668500741 4 10 4.17991094525 6 10 4.19321230985 7 10 4.20659548044 3 10 4.22006705657 4 10 4.23363388034 6 10 4.24730306039 7 10 4.26108199786 9 10 4.27497841466 5 10 4.28900038424 7 10 4.30315636519 5 10 4.31745523817 7 10 4.33190634649 6 10 4.3465195408 6 10 4.36130522862 7 10 4.37627442923 3 10 4.39143883477 7 10 4.40681087839 6 10 4.42240381053 5 10 4.43823178464 7 10 4.45430995358 6 10 4.4706545787 5 10 4.48728315346 8 10 4.50421454406 6 10 4.52146915008 5 10 4.53906908867 7 10 4.55703840652 5 10 4.57540332489 7 10 4.59419252417 8 10 4.61343747583 5 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 7 10 4.69572579606 6 10 4.71785088083 8 10 4.74070682473 8 10 4.76436079535 5 10 4.7888890681 7 10 4.81437877164 6 10 4.8409300716 7 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 5 10 4.96038937084 8 10 4.99445259144 6 10 5.0306800504 8 10 5.06941176794 5 10 5.1110733522 9 10 5.15620742767 5 10 5.20552095898 9 10 5.25995921372 8 10 5.3208266688 8 10 5.38999588299 8 10 5.47029442647 7 10 5.56629019787 6 10 5.68609831971 7 10 5.84638599875 10 10 6.09132916932 10 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data19000066400000000000000000000045531176542545200220300ustar00rootroot000000000000003.0 3 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 2 10 3.1268634863 2 10 3.15478934453 4 10 3.18151774456 1 10 3.20716743383 2 10 3.23184086298 8 10 3.25562705378 6 10 3.27860386336 4 10 3.30083979103 3 10 3.32239543436 4 10 3.34332467315 4 10 3.36367564024 2 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 5 10 3.44009965292 2 10 3.45812940282 4 10 3.47578579968 4 10 3.49309321508 8 10 3.51007405486 3 10 3.52674897593 4 10 3.54313707448 1 10 3.55925605012 2 10 3.57512234939 6 10 3.59075129199 3 10 3.60615718186 4 10 3.62135340555 4 10 3.6363525195 7 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 3 10 3.69460407794 5 10 3.70878193635 1 10 3.72282441539 3 10 3.73674003753 5 10 3.75053693448 1 10 3.76422288134 5 10 3.77780532778 2 10 3.79129142667 6 10 3.8046880604 3 10 3.81800186517 5 10 3.83123925344 3 10 3.84440643489 4 10 3.85750943587 6 10 3.87055411763 5 10 3.88354619344 6 10 3.89649124479 8 10 3.90939473669 4 10 3.92226203224 5 10 3.93509840657 3 10 3.94790906028 7 10 3.96069913233 3 10 3.97347371267 4 10 3.98623785449 5 10 3.99899658627 3 10 4.01175492376 5 10 4.02451788173 6 10 4.03729048591 5 10 4.05007778479 8 10 4.06288486173 4 10 4.07571684715 2 10 4.08857893112 8 10 4.10147637615 8 10 4.11441453062 6 10 4.12739884254 2 10 4.14043487408 6 10 4.15352831675 5 10 4.16668500741 8 10 4.17991094525 5 10 4.19321230985 8 10 4.20659548044 7 10 4.22006705657 5 10 4.23363388034 9 10 4.24730306039 8 10 4.26108199786 7 10 4.27497841466 6 10 4.28900038424 6 10 4.30315636519 3 10 4.31745523817 8 10 4.33190634649 5 10 4.3465195408 8 10 4.36130522862 5 10 4.37627442923 8 10 4.39143883477 6 10 4.40681087839 4 10 4.42240381053 6 10 4.43823178464 5 10 4.45430995358 6 10 4.4706545787 5 10 4.48728315346 5 10 4.50421454406 7 10 4.52146915008 6 10 4.53906908867 8 10 4.55703840652 7 10 4.57540332489 8 10 4.59419252417 9 10 4.61343747583 6 10 4.63317283161 5 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 4 10 4.71785088083 5 10 4.74070682473 4 10 4.76436079535 7 10 4.7888890681 6 10 4.81437877164 6 10 4.8409300716 5 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 7 10 4.96038937084 8 10 4.99445259144 8 10 5.0306800504 6 10 5.06941176794 6 10 5.1110733522 8 10 5.15620742767 7 10 5.20552095898 6 10 5.25995921372 8 10 5.3208266688 8 10 5.38999588299 10 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 7 10 5.84638599875 9 10 6.09132916932 9 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data2000066400000000000000000000045531176542545200217400ustar00rootroot000000000000003.0 2 10 3.03438393847 2 10 3.06683976785 1 10 3.09760144961 3 10 3.1268634863 1 10 3.15478934453 4 10 3.18151774456 2 10 3.20716743383 5 10 3.23184086298 1 10 3.25562705378 3 10 3.27860386336 4 10 3.30083979103 2 10 3.32239543436 2 10 3.34332467315 5 10 3.36367564024 2 10 3.38349152356 4 10 3.40281123349 1 10 3.42166996184 2 10 3.44009965292 5 10 3.45812940282 2 10 3.47578579968 1 10 3.49309321508 6 10 3.51007405486 2 10 3.52674897593 3 10 3.54313707448 4 10 3.55925605012 4 10 3.57512234939 6 10 3.59075129199 5 10 3.60615718186 3 10 3.62135340555 6 10 3.6363525195 5 10 3.6511663277 1 10 3.66580595104 5 10 3.68028188951 8 10 3.69460407794 3 10 3.70878193635 2 10 3.72282441539 2 10 3.73674003753 2 10 3.75053693448 5 10 3.76422288134 6 10 3.77780532778 1 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 2 10 3.84440643489 4 10 3.85750943587 2 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 4 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 1 10 3.96069913233 3 10 3.97347371267 1 10 3.98623785449 5 10 3.99899658627 5 10 4.01175492376 4 10 4.02451788173 8 10 4.03729048591 4 10 4.05007778479 2 10 4.06288486173 6 10 4.07571684715 4 10 4.08857893112 3 10 4.10147637615 3 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 8 10 4.15352831675 3 10 4.16668500741 4 10 4.17991094525 4 10 4.19321230985 3 10 4.20659548044 6 10 4.22006705657 5 10 4.23363388034 8 10 4.24730306039 4 10 4.26108199786 8 10 4.27497841466 7 10 4.28900038424 6 10 4.30315636519 4 10 4.31745523817 5 10 4.33190634649 6 10 4.3465195408 5 10 4.36130522862 4 10 4.37627442923 8 10 4.39143883477 3 10 4.40681087839 5 10 4.42240381053 4 10 4.43823178464 7 10 4.45430995358 4 10 4.4706545787 6 10 4.48728315346 6 10 4.50421454406 8 10 4.52146915008 8 10 4.53906908867 7 10 4.55703840652 5 10 4.57540332489 6 10 4.59419252417 6 10 4.61343747583 6 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 5 10 4.69572579606 9 10 4.71785088083 6 10 4.74070682473 5 10 4.76436079535 7 10 4.7888890681 4 10 4.81437877164 6 10 4.8409300716 4 10 4.86865893179 8 10 4.8977006465 6 10 4.92821441759 6 10 4.96038937084 5 10 4.99445259144 7 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 8 10 5.15620742767 10 10 5.20552095898 8 10 5.25995921372 8 10 5.3208266688 7 10 5.38999588299 9 10 5.47029442647 7 10 5.56629019787 8 10 5.68609831971 9 10 5.84638599875 8 10 6.09132916932 9 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data22000066400000000000000000000045551176542545200220240ustar00rootroot000000000000003.0 2 10 3.03438393847 2 10 3.06683976785 1 10 3.09760144961 2 10 3.1268634863 1 10 3.15478934453 3 10 3.18151774456 5 10 3.20716743383 3 10 3.23184086298 3 10 3.25562705378 4 10 3.27860386336 4 10 3.30083979103 4 10 3.32239543436 2 10 3.34332467315 4 10 3.36367564024 3 10 3.38349152356 2 10 3.40281123349 1 10 3.42166996184 3 10 3.44009965292 4 10 3.45812940282 2 10 3.47578579968 5 10 3.49309321508 6 10 3.51007405486 7 10 3.52674897593 2 10 3.54313707448 5 10 3.55925605012 3 10 3.57512234939 4 10 3.59075129199 1 10 3.60615718186 3 10 3.62135340555 5 10 3.6363525195 3 10 3.6511663277 5 10 3.66580595104 2 10 3.68028188951 3 10 3.69460407794 4 10 3.70878193635 5 10 3.72282441539 5 10 3.73674003753 6 10 3.75053693448 7 10 3.76422288134 5 10 3.77780532778 2 10 3.79129142667 3 10 3.8046880604 5 10 3.81800186517 5 10 3.83123925344 7 10 3.84440643489 4 10 3.85750943587 3 10 3.87055411763 2 10 3.88354619344 7 10 3.89649124479 7 10 3.90939473669 2 10 3.92226203224 5 10 3.93509840657 2 10 3.94790906028 5 10 3.96069913233 7 10 3.97347371267 6 10 3.98623785449 3 10 3.99899658627 5 10 4.01175492376 2 10 4.02451788173 4 10 4.03729048591 4 10 4.05007778479 4 10 4.06288486173 4 10 4.07571684715 6 10 4.08857893112 3 10 4.10147637615 6 10 4.11441453062 8 10 4.12739884254 4 10 4.14043487408 4 10 4.15352831675 6 10 4.16668500741 5 10 4.17991094525 6 10 4.19321230985 4 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 6 10 4.24730306039 5 10 4.26108199786 7 10 4.27497841466 5 10 4.28900038424 5 10 4.30315636519 7 10 4.31745523817 7 10 4.33190634649 5 10 4.3465195408 5 10 4.36130522862 5 10 4.37627442923 5 10 4.39143883477 4 10 4.40681087839 8 10 4.42240381053 9 10 4.43823178464 6 10 4.45430995358 8 10 4.4706545787 6 10 4.48728315346 7 10 4.50421454406 8 10 4.52146915008 8 10 4.53906908867 6 10 4.55703840652 6 10 4.57540332489 8 10 4.59419252417 4 10 4.61343747583 9 10 4.63317283161 4 10 4.65343688238 7 10 4.67427210198 9 10 4.69572579606 7 10 4.71785088083 6 10 4.74070682473 5 10 4.76436079535 9 10 4.7888890681 7 10 4.81437877164 7 10 4.8409300716 6 10 4.86865893179 5 10 4.8977006465 5 10 4.92821441759 9 10 4.96038937084 10 10 4.99445259144 7 10 5.0306800504 7 10 5.06941176794 6 10 5.1110733522 7 10 5.15620742767 8 10 5.20552095898 9 10 5.25995921372 8 10 5.3208266688 10 10 5.38999588299 6 10 5.47029442647 9 10 5.56629019787 8 10 5.68609831971 9 10 5.84638599875 10 10 6.09132916932 8 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data5000066400000000000000000000045531176542545200217430ustar00rootroot000000000000003.0 4 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 3 10 3.1268634863 1 10 3.15478934453 4 10 3.18151774456 5 10 3.20716743383 3 10 3.23184086298 5 10 3.25562705378 2 10 3.27860386336 3 10 3.30083979103 4 10 3.32239543436 2 10 3.34332467315 4 10 3.36367564024 2 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 4 10 3.44009965292 4 10 3.45812940282 3 10 3.47578579968 5 10 3.49309321508 3 10 3.51007405486 4 10 3.52674897593 5 10 3.54313707448 4 10 3.55925605012 1 10 3.57512234939 7 10 3.59075129199 4 10 3.60615718186 4 10 3.62135340555 5 10 3.6363525195 3 10 3.6511663277 4 10 3.66580595104 4 10 3.68028188951 4 10 3.69460407794 5 10 3.70878193635 4 10 3.72282441539 3 10 3.73674003753 6 10 3.75053693448 5 10 3.76422288134 3 10 3.77780532778 4 10 3.79129142667 4 10 3.8046880604 5 10 3.81800186517 4 10 3.83123925344 3 10 3.84440643489 8 10 3.85750943587 7 10 3.87055411763 5 10 3.88354619344 4 10 3.89649124479 4 10 3.90939473669 5 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 8 10 3.96069913233 6 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 3 10 4.01175492376 8 10 4.02451788173 4 10 4.03729048591 6 10 4.05007778479 2 10 4.06288486173 8 10 4.07571684715 5 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 6 10 4.15352831675 6 10 4.16668500741 4 10 4.17991094525 5 10 4.19321230985 6 10 4.20659548044 4 10 4.22006705657 7 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 4 10 4.27497841466 5 10 4.28900038424 7 10 4.30315636519 7 10 4.31745523817 3 10 4.33190634649 7 10 4.3465195408 7 10 4.36130522862 5 10 4.37627442923 7 10 4.39143883477 6 10 4.40681087839 6 10 4.42240381053 6 10 4.43823178464 6 10 4.45430995358 5 10 4.4706545787 8 10 4.48728315346 7 10 4.50421454406 5 10 4.52146915008 4 10 4.53906908867 8 10 4.55703840652 7 10 4.57540332489 7 10 4.59419252417 8 10 4.61343747583 9 10 4.63317283161 7 10 4.65343688238 7 10 4.67427210198 7 10 4.69572579606 6 10 4.71785088083 6 10 4.74070682473 8 10 4.76436079535 8 10 4.7888890681 5 10 4.81437877164 6 10 4.8409300716 7 10 4.86865893179 6 10 4.8977006465 8 10 4.92821441759 7 10 4.96038937084 8 10 4.99445259144 6 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 5 10 5.15620742767 4 10 5.20552095898 8 10 5.25995921372 8 10 5.3208266688 6 10 5.38999588299 8 10 5.47029442647 9 10 5.56629019787 8 10 5.68609831971 7 10 5.84638599875 8 10 6.09132916932 10 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data8000066400000000000000000000045541176542545200217470ustar00rootroot000000000000003.0 4 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 0 10 3.18151774456 2 10 3.20716743383 3 10 3.23184086298 4 10 3.25562705378 3 10 3.27860386336 5 10 3.30083979103 1 10 3.32239543436 2 10 3.34332467315 5 10 3.36367564024 5 10 3.38349152356 3 10 3.40281123349 4 10 3.42166996184 3 10 3.44009965292 4 10 3.45812940282 6 10 3.47578579968 2 10 3.49309321508 4 10 3.51007405486 2 10 3.52674897593 2 10 3.54313707448 1 10 3.55925605012 6 10 3.57512234939 1 10 3.59075129199 6 10 3.60615718186 3 10 3.62135340555 2 10 3.6363525195 2 10 3.6511663277 6 10 3.66580595104 3 10 3.68028188951 4 10 3.69460407794 6 10 3.70878193635 6 10 3.72282441539 7 10 3.73674003753 2 10 3.75053693448 3 10 3.76422288134 5 10 3.77780532778 5 10 3.79129142667 6 10 3.8046880604 7 10 3.81800186517 4 10 3.83123925344 2 10 3.84440643489 3 10 3.85750943587 6 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 8 10 3.90939473669 4 10 3.92226203224 6 10 3.93509840657 3 10 3.94790906028 5 10 3.96069913233 8 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 4 10 4.01175492376 3 10 4.02451788173 6 10 4.03729048591 4 10 4.05007778479 6 10 4.06288486173 5 10 4.07571684715 5 10 4.08857893112 3 10 4.10147637615 5 10 4.11441453062 5 10 4.12739884254 3 10 4.14043487408 5 10 4.15352831675 7 10 4.16668500741 4 10 4.17991094525 7 10 4.19321230985 6 10 4.20659548044 6 10 4.22006705657 7 10 4.23363388034 3 10 4.24730306039 7 10 4.26108199786 8 10 4.27497841466 8 10 4.28900038424 5 10 4.30315636519 6 10 4.31745523817 5 10 4.33190634649 6 10 4.3465195408 7 10 4.36130522862 6 10 4.37627442923 7 10 4.39143883477 7 10 4.40681087839 5 10 4.42240381053 5 10 4.43823178464 7 10 4.45430995358 6 10 4.4706545787 4 10 4.48728315346 6 10 4.50421454406 5 10 4.52146915008 6 10 4.53906908867 6 10 4.55703840652 7 10 4.57540332489 7 10 4.59419252417 10 10 4.61343747583 6 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 5 10 4.71785088083 7 10 4.74070682473 7 10 4.76436079535 8 10 4.7888890681 5 10 4.81437877164 6 10 4.8409300716 8 10 4.86865893179 8 10 4.8977006465 7 10 4.92821441759 5 10 4.96038937084 9 10 4.99445259144 8 10 5.0306800504 6 10 5.06941176794 6 10 5.1110733522 8 10 5.15620742767 5 10 5.20552095898 7 10 5.25995921372 9 10 5.3208266688 10 10 5.38999588299 9 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 8 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/data9000066400000000000000000000045521176542545200217460ustar00rootroot000000000000003.0 1 10 3.03438393847 3 10 3.06683976785 3 10 3.09760144961 4 10 3.1268634863 0 10 3.15478934453 5 10 3.18151774456 3 10 3.20716743383 3 10 3.23184086298 2 10 3.25562705378 4 10 3.27860386336 3 10 3.30083979103 3 10 3.32239543436 5 10 3.34332467315 3 10 3.36367564024 6 10 3.38349152356 2 10 3.40281123349 3 10 3.42166996184 6 10 3.44009965292 2 10 3.45812940282 4 10 3.47578579968 7 10 3.49309321508 3 10 3.51007405486 4 10 3.52674897593 1 10 3.54313707448 5 10 3.55925605012 4 10 3.57512234939 4 10 3.59075129199 3 10 3.60615718186 4 10 3.62135340555 4 10 3.6363525195 2 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 3 10 3.69460407794 3 10 3.70878193635 3 10 3.72282441539 5 10 3.73674003753 4 10 3.75053693448 7 10 3.76422288134 6 10 3.77780532778 4 10 3.79129142667 6 10 3.8046880604 6 10 3.81800186517 6 10 3.83123925344 5 10 3.84440643489 4 10 3.85750943587 4 10 3.87055411763 5 10 3.88354619344 6 10 3.89649124479 6 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 7 10 3.94790906028 6 10 3.96069913233 6 10 3.97347371267 4 10 3.98623785449 6 10 3.99899658627 4 10 4.01175492376 6 10 4.02451788173 4 10 4.03729048591 4 10 4.05007778479 7 10 4.06288486173 4 10 4.07571684715 6 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 3 10 4.12739884254 5 10 4.14043487408 7 10 4.15352831675 6 10 4.16668500741 7 10 4.17991094525 4 10 4.19321230985 2 10 4.20659548044 7 10 4.22006705657 6 10 4.23363388034 7 10 4.24730306039 5 10 4.26108199786 6 10 4.27497841466 4 10 4.28900038424 6 10 4.30315636519 4 10 4.31745523817 5 10 4.33190634649 7 10 4.3465195408 4 10 4.36130522862 7 10 4.37627442923 4 10 4.39143883477 3 10 4.40681087839 3 10 4.42240381053 4 10 4.43823178464 6 10 4.45430995358 8 10 4.4706545787 8 10 4.48728315346 6 10 4.50421454406 5 10 4.52146915008 6 10 4.53906908867 9 10 4.55703840652 5 10 4.57540332489 4 10 4.59419252417 6 10 4.61343747583 9 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 5 10 4.71785088083 5 10 4.74070682473 7 10 4.76436079535 6 10 4.7888890681 6 10 4.81437877164 7 10 4.8409300716 7 10 4.86865893179 6 10 4.8977006465 8 10 4.92821441759 8 10 4.96038937084 8 10 4.99445259144 9 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 8 10 5.15620742767 5 10 5.20552095898 8 10 5.25995921372 9 10 5.3208266688 6 10 5.38999588299 8 10 5.47029442647 8 10 5.56629019787 8 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 9 10 psignifit3-3.0~beta.20120611.1/investigate-zlci/datasets000066400000000000000000000760451176542545200225620ustar00rootroot00000000000000[~/thesis/master-scripts]|1> run run_mcmc_single.py iteration: 0 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.59695606 2.19089637 0.16870245 0.31496919] Steps(final): [ 5.33351697e-15 2.84454238e-14 5.55574684e-17 5.85957675e-18] warning, confidence interval has zero length! ====================================================================== 3.0 2 10 3.03438393847 1 10 3.06683976785 5 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 1 10 3.18151774456 2 10 3.20716743383 2 10 3.23184086298 4 10 3.25562705378 5 10 3.27860386336 4 10 3.30083979103 2 10 3.32239543436 5 10 3.34332467315 2 10 3.36367564024 2 10 3.38349152356 5 10 3.40281123349 3 10 3.42166996184 2 10 3.44009965292 4 10 3.45812940282 5 10 3.47578579968 3 10 3.49309321508 4 10 3.51007405486 4 10 3.52674897593 6 10 3.54313707448 2 10 3.55925605012 2 10 3.57512234939 3 10 3.59075129199 4 10 3.60615718186 5 10 3.62135340555 2 10 3.6363525195 5 10 3.6511663277 2 10 3.66580595104 5 10 3.68028188951 4 10 3.69460407794 4 10 3.70878193635 5 10 3.72282441539 8 10 3.73674003753 5 10 3.75053693448 5 10 3.76422288134 4 10 3.77780532778 4 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 2 10 3.84440643489 8 10 3.85750943587 4 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 7 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 7 10 3.94790906028 5 10 3.96069913233 3 10 3.97347371267 4 10 3.98623785449 3 10 3.99899658627 4 10 4.01175492376 5 10 4.02451788173 3 10 4.03729048591 5 10 4.05007778479 7 10 4.06288486173 5 10 4.07571684715 6 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 6 10 4.12739884254 3 10 4.14043487408 4 10 4.15352831675 3 10 4.16668500741 6 10 4.17991094525 5 10 4.19321230985 4 10 4.20659548044 3 10 4.22006705657 7 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 7 10 4.27497841466 8 10 4.28900038424 7 10 4.30315636519 3 10 4.31745523817 6 10 4.33190634649 6 10 4.3465195408 5 10 4.36130522862 9 10 4.37627442923 3 10 4.39143883477 5 10 4.40681087839 9 10 4.42240381053 8 10 4.43823178464 6 10 4.45430995358 4 10 4.4706545787 8 10 4.48728315346 5 10 4.50421454406 7 10 4.52146915008 4 10 4.53906908867 4 10 4.55703840652 5 10 4.57540332489 6 10 4.59419252417 9 10 4.61343747583 7 10 4.63317283161 5 10 4.65343688238 6 10 4.67427210198 5 10 4.69572579606 5 10 4.71785088083 4 10 4.74070682473 7 10 4.76436079535 8 10 4.7888890681 8 10 4.81437877164 4 10 4.8409300716 8 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 10 10 4.96038937084 5 10 4.99445259144 8 10 5.0306800504 7 10 5.06941176794 9 10 5.1110733522 8 10 5.15620742767 7 10 5.20552095898 7 10 5.25995921372 5 10 5.3208266688 8 10 5.38999588299 8 10 5.47029442647 8 10 5.56629019787 9 10 5.68609831971 9 10 5.84638599875 9 10 6.09132916932 8 10 iteration: 1 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.00708131 0.14892512 0.00069851 0.00056102] Steps(final): [ 0.00708131 0.14892512 0.00069851 0.00056102] iteration: 2 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.44898068 1.40740674 0.12419714 0.23190069] Steps(final): [ 5.86686867e-14 2.17785276e-14 2.43063924e-17 1.13936215e-17] warning, confidence interval has zero length! ====================================================================== 3.0 2 10 3.03438393847 2 10 3.06683976785 1 10 3.09760144961 3 10 3.1268634863 1 10 3.15478934453 4 10 3.18151774456 2 10 3.20716743383 5 10 3.23184086298 1 10 3.25562705378 3 10 3.27860386336 4 10 3.30083979103 2 10 3.32239543436 2 10 3.34332467315 5 10 3.36367564024 2 10 3.38349152356 4 10 3.40281123349 1 10 3.42166996184 2 10 3.44009965292 5 10 3.45812940282 2 10 3.47578579968 1 10 3.49309321508 6 10 3.51007405486 2 10 3.52674897593 3 10 3.54313707448 4 10 3.55925605012 4 10 3.57512234939 6 10 3.59075129199 5 10 3.60615718186 3 10 3.62135340555 6 10 3.6363525195 5 10 3.6511663277 1 10 3.66580595104 5 10 3.68028188951 8 10 3.69460407794 3 10 3.70878193635 2 10 3.72282441539 2 10 3.73674003753 2 10 3.75053693448 5 10 3.76422288134 6 10 3.77780532778 1 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 2 10 3.84440643489 4 10 3.85750943587 2 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 4 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 1 10 3.96069913233 3 10 3.97347371267 1 10 3.98623785449 5 10 3.99899658627 5 10 4.01175492376 4 10 4.02451788173 8 10 4.03729048591 4 10 4.05007778479 2 10 4.06288486173 6 10 4.07571684715 4 10 4.08857893112 3 10 4.10147637615 3 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 8 10 4.15352831675 3 10 4.16668500741 4 10 4.17991094525 4 10 4.19321230985 3 10 4.20659548044 6 10 4.22006705657 5 10 4.23363388034 8 10 4.24730306039 4 10 4.26108199786 8 10 4.27497841466 7 10 4.28900038424 6 10 4.30315636519 4 10 4.31745523817 5 10 4.33190634649 6 10 4.3465195408 5 10 4.36130522862 4 10 4.37627442923 8 10 4.39143883477 3 10 4.40681087839 5 10 4.42240381053 4 10 4.43823178464 7 10 4.45430995358 4 10 4.4706545787 6 10 4.48728315346 6 10 4.50421454406 8 10 4.52146915008 8 10 4.53906908867 7 10 4.55703840652 5 10 4.57540332489 6 10 4.59419252417 6 10 4.61343747583 6 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 5 10 4.69572579606 9 10 4.71785088083 6 10 4.74070682473 5 10 4.76436079535 7 10 4.7888890681 4 10 4.81437877164 6 10 4.8409300716 4 10 4.86865893179 8 10 4.8977006465 6 10 4.92821441759 6 10 4.96038937084 5 10 4.99445259144 7 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 8 10 5.15620742767 10 10 5.20552095898 8 10 5.25995921372 8 10 5.3208266688 7 10 5.38999588299 9 10 5.47029442647 7 10 5.56629019787 8 10 5.68609831971 9 10 5.84638599875 8 10 6.09132916932 9 10 iteration: 3 Burnin: 23 Thinning: 2 Nsamples: 4830 Steps: [ 6.41586787e-02 4.25081869e-01 1.57199170e-02 1.27443735e-04] Burnin: 41 Thinning: 2 Nsamples: 8440 Steps: [ 6.21582258e-02 3.66448191e-01 1.94998725e-02 3.04247364e-04] Burnin: 41 Thinning: 2 Nsamples: 8440 Steps: [ 0.0693734 0.43216159 0.02042671 0.00053707] Steps(final): [ 0.0693734 0.43216159 0.02042671 0.00053707] iteration: 4 Burnin: 29 Thinning: 4 Nsamples: 7085 Steps: [ 9.27533598e-02 5.58089006e-01 2.31327608e-02 2.18883841e-04] Burnin: 29 Thinning: 4 Nsamples: 7085 Steps: [ 0.10315842 0.57919365 0.02951118 0.00205922] Steps(final): [ 0.10315842 0.57919365 0.02951118 0.00205922] iteration: 5 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.63127419 1.37589259 0.1575976 0.21671996] Steps(final): [ 2.75565043e-14 1.68894704e-14 1.18059620e-16 1.73617089e-18] warning, confidence interval has zero length! ====================================================================== 3.0 4 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 3 10 3.1268634863 1 10 3.15478934453 4 10 3.18151774456 5 10 3.20716743383 3 10 3.23184086298 5 10 3.25562705378 2 10 3.27860386336 3 10 3.30083979103 4 10 3.32239543436 2 10 3.34332467315 4 10 3.36367564024 2 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 4 10 3.44009965292 4 10 3.45812940282 3 10 3.47578579968 5 10 3.49309321508 3 10 3.51007405486 4 10 3.52674897593 5 10 3.54313707448 4 10 3.55925605012 1 10 3.57512234939 7 10 3.59075129199 4 10 3.60615718186 4 10 3.62135340555 5 10 3.6363525195 3 10 3.6511663277 4 10 3.66580595104 4 10 3.68028188951 4 10 3.69460407794 5 10 3.70878193635 4 10 3.72282441539 3 10 3.73674003753 6 10 3.75053693448 5 10 3.76422288134 3 10 3.77780532778 4 10 3.79129142667 4 10 3.8046880604 5 10 3.81800186517 4 10 3.83123925344 3 10 3.84440643489 8 10 3.85750943587 7 10 3.87055411763 5 10 3.88354619344 4 10 3.89649124479 4 10 3.90939473669 5 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 8 10 3.96069913233 6 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 3 10 4.01175492376 8 10 4.02451788173 4 10 4.03729048591 6 10 4.05007778479 2 10 4.06288486173 8 10 4.07571684715 5 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 6 10 4.15352831675 6 10 4.16668500741 4 10 4.17991094525 5 10 4.19321230985 6 10 4.20659548044 4 10 4.22006705657 7 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 4 10 4.27497841466 5 10 4.28900038424 7 10 4.30315636519 7 10 4.31745523817 3 10 4.33190634649 7 10 4.3465195408 7 10 4.36130522862 5 10 4.37627442923 7 10 4.39143883477 6 10 4.40681087839 6 10 4.42240381053 6 10 4.43823178464 6 10 4.45430995358 5 10 4.4706545787 8 10 4.48728315346 7 10 4.50421454406 5 10 4.52146915008 4 10 4.53906908867 8 10 4.55703840652 7 10 4.57540332489 7 10 4.59419252417 8 10 4.61343747583 9 10 4.63317283161 7 10 4.65343688238 7 10 4.67427210198 7 10 4.69572579606 6 10 4.71785088083 6 10 4.74070682473 8 10 4.76436079535 8 10 4.7888890681 5 10 4.81437877164 6 10 4.8409300716 7 10 4.86865893179 6 10 4.8977006465 8 10 4.92821441759 7 10 4.96038937084 8 10 4.99445259144 6 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 5 10 5.15620742767 4 10 5.20552095898 8 10 5.25995921372 8 10 5.3208266688 6 10 5.38999588299 8 10 5.47029442647 9 10 5.56629019787 8 10 5.68609831971 7 10 5.84638599875 8 10 6.09132916932 10 10 iteration: 6 Burnin: 35 Thinning: 5 Nsamples: 10853 Steps: [ 8.81457014e-02 4.46343182e-01 2.94896491e-02 8.59045069e-05] Burnin: 35 Thinning: 5 Nsamples: 10853 Steps: [ 0.06352168 0.49733526 0.0249111 0.00053889] Steps(final): [ 0.06352168 0.49733526 0.0249111 0.00053889] iteration: 7 Burnin: 15 Thinning: 1 Nsamples: 2679 Steps: [ 7.10339012e-02 4.95122700e-01 2.08653007e-02 4.90353300e-04] Burnin: 20 Thinning: 2 Nsamples: 2824 Steps: [ 0.06875409 0.42551473 0.02130595 0.00093412] Burnin: 20 Thinning: 2 Nsamples: 2824 Steps: [ 0.05529431 0.39519786 0.01804812 0.00140293] Steps(final): [ 0.05529431 0.39519786 0.01804812 0.00140293] iteration: 8 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.50110417 2.16460948 0.15966895 0.33259145] Steps(final): [ 2.62231251e-14 7.11135596e-15 1.04170253e-17 2.46861798e-18] warning, confidence interval has zero length! ====================================================================== 3.0 4 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 0 10 3.18151774456 2 10 3.20716743383 3 10 3.23184086298 4 10 3.25562705378 3 10 3.27860386336 5 10 3.30083979103 1 10 3.32239543436 2 10 3.34332467315 5 10 3.36367564024 5 10 3.38349152356 3 10 3.40281123349 4 10 3.42166996184 3 10 3.44009965292 4 10 3.45812940282 6 10 3.47578579968 2 10 3.49309321508 4 10 3.51007405486 2 10 3.52674897593 2 10 3.54313707448 1 10 3.55925605012 6 10 3.57512234939 1 10 3.59075129199 6 10 3.60615718186 3 10 3.62135340555 2 10 3.6363525195 2 10 3.6511663277 6 10 3.66580595104 3 10 3.68028188951 4 10 3.69460407794 6 10 3.70878193635 6 10 3.72282441539 7 10 3.73674003753 2 10 3.75053693448 3 10 3.76422288134 5 10 3.77780532778 5 10 3.79129142667 6 10 3.8046880604 7 10 3.81800186517 4 10 3.83123925344 2 10 3.84440643489 3 10 3.85750943587 6 10 3.87055411763 3 10 3.88354619344 4 10 3.89649124479 8 10 3.90939473669 4 10 3.92226203224 6 10 3.93509840657 3 10 3.94790906028 5 10 3.96069913233 8 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 4 10 4.01175492376 3 10 4.02451788173 6 10 4.03729048591 4 10 4.05007778479 6 10 4.06288486173 5 10 4.07571684715 5 10 4.08857893112 3 10 4.10147637615 5 10 4.11441453062 5 10 4.12739884254 3 10 4.14043487408 5 10 4.15352831675 7 10 4.16668500741 4 10 4.17991094525 7 10 4.19321230985 6 10 4.20659548044 6 10 4.22006705657 7 10 4.23363388034 3 10 4.24730306039 7 10 4.26108199786 8 10 4.27497841466 8 10 4.28900038424 5 10 4.30315636519 6 10 4.31745523817 5 10 4.33190634649 6 10 4.3465195408 7 10 4.36130522862 6 10 4.37627442923 7 10 4.39143883477 7 10 4.40681087839 5 10 4.42240381053 5 10 4.43823178464 7 10 4.45430995358 6 10 4.4706545787 4 10 4.48728315346 6 10 4.50421454406 5 10 4.52146915008 6 10 4.53906908867 6 10 4.55703840652 7 10 4.57540332489 7 10 4.59419252417 10 10 4.61343747583 6 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 5 10 4.71785088083 7 10 4.74070682473 7 10 4.76436079535 8 10 4.7888890681 5 10 4.81437877164 6 10 4.8409300716 8 10 4.86865893179 8 10 4.8977006465 7 10 4.92821441759 5 10 4.96038937084 9 10 4.99445259144 8 10 5.0306800504 6 10 5.06941176794 6 10 5.1110733522 8 10 5.15620742767 5 10 5.20552095898 7 10 5.25995921372 9 10 5.3208266688 10 10 5.38999588299 9 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 8 10 iteration: 9 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.74367671 2.07970551 0.14660992 0.37346046] Steps(final): [ 1.33337924e-15 8.88919495e-15 1.59727722e-16 3.03829905e-18] warning, confidence interval has zero length! ====================================================================== 3.0 1 10 3.03438393847 3 10 3.06683976785 3 10 3.09760144961 4 10 3.1268634863 0 10 3.15478934453 5 10 3.18151774456 3 10 3.20716743383 3 10 3.23184086298 2 10 3.25562705378 4 10 3.27860386336 3 10 3.30083979103 3 10 3.32239543436 5 10 3.34332467315 3 10 3.36367564024 6 10 3.38349152356 2 10 3.40281123349 3 10 3.42166996184 6 10 3.44009965292 2 10 3.45812940282 4 10 3.47578579968 7 10 3.49309321508 3 10 3.51007405486 4 10 3.52674897593 1 10 3.54313707448 5 10 3.55925605012 4 10 3.57512234939 4 10 3.59075129199 3 10 3.60615718186 4 10 3.62135340555 4 10 3.6363525195 2 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 3 10 3.69460407794 3 10 3.70878193635 3 10 3.72282441539 5 10 3.73674003753 4 10 3.75053693448 7 10 3.76422288134 6 10 3.77780532778 4 10 3.79129142667 6 10 3.8046880604 6 10 3.81800186517 6 10 3.83123925344 5 10 3.84440643489 4 10 3.85750943587 4 10 3.87055411763 5 10 3.88354619344 6 10 3.89649124479 6 10 3.90939473669 6 10 3.92226203224 5 10 3.93509840657 7 10 3.94790906028 6 10 3.96069913233 6 10 3.97347371267 4 10 3.98623785449 6 10 3.99899658627 4 10 4.01175492376 6 10 4.02451788173 4 10 4.03729048591 4 10 4.05007778479 7 10 4.06288486173 4 10 4.07571684715 6 10 4.08857893112 5 10 4.10147637615 6 10 4.11441453062 3 10 4.12739884254 5 10 4.14043487408 7 10 4.15352831675 6 10 4.16668500741 7 10 4.17991094525 4 10 4.19321230985 2 10 4.20659548044 7 10 4.22006705657 6 10 4.23363388034 7 10 4.24730306039 5 10 4.26108199786 6 10 4.27497841466 4 10 4.28900038424 6 10 4.30315636519 4 10 4.31745523817 5 10 4.33190634649 7 10 4.3465195408 4 10 4.36130522862 7 10 4.37627442923 4 10 4.39143883477 3 10 4.40681087839 3 10 4.42240381053 4 10 4.43823178464 6 10 4.45430995358 8 10 4.4706545787 8 10 4.48728315346 6 10 4.50421454406 5 10 4.52146915008 6 10 4.53906908867 9 10 4.55703840652 5 10 4.57540332489 4 10 4.59419252417 6 10 4.61343747583 9 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 5 10 4.71785088083 5 10 4.74070682473 7 10 4.76436079535 6 10 4.7888890681 6 10 4.81437877164 7 10 4.8409300716 7 10 4.86865893179 6 10 4.8977006465 8 10 4.92821441759 8 10 4.96038937084 8 10 4.99445259144 9 10 5.0306800504 8 10 5.06941176794 8 10 5.1110733522 8 10 5.15620742767 5 10 5.20552095898 8 10 5.25995921372 9 10 5.3208266688 6 10 5.38999588299 8 10 5.47029442647 8 10 5.56629019787 8 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 9 10 iteration: 10 Burnin: 29 Thinning: 2 Nsamples: 5366 Steps: [ 7.89396538e-02 5.12396078e-01 1.78877165e-02 4.75105197e-05] Burnin: 29 Thinning: 3 Nsamples: 5366 Steps: [ 0.10968978 0.50771564 0.0364699 0.00072351] Steps(final): [ 0.10968978 0.50771564 0.0364699 0.00072351] iteration: 11 Burnin: 28 Thinning: 1 Nsamples: 4555 Steps: [ 0.08466766 0.55517063 0.01726077 0.01018273] Burnin: 29 Thinning: 3 Nsamples: 6211 Steps: [ 0.09450443 0.40587568 0.02612235 0.01427085] Burnin: 29 Thinning: 3 Nsamples: 6211 Steps: [ 0.06733558 0.41998231 0.02113769 0.01511353] Steps(final): [ 0.06733558 0.41998231 0.02113769 0.01511353] iteration: 12 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.78749565 2.10221959 0.18331816 0.31802957] Steps(final): [ 4.35570552e-14 1.51116314e-14 1.28476646e-16 3.39095877e-20] warning, confidence interval has zero length! ====================================================================== 3.0 3 10 3.03438393847 1 10 3.06683976785 2 10 3.09760144961 4 10 3.1268634863 3 10 3.15478934453 2 10 3.18151774456 3 10 3.20716743383 1 10 3.23184086298 3 10 3.25562705378 7 10 3.27860386336 3 10 3.30083979103 5 10 3.32239543436 7 10 3.34332467315 4 10 3.36367564024 1 10 3.38349152356 3 10 3.40281123349 1 10 3.42166996184 4 10 3.44009965292 2 10 3.45812940282 5 10 3.47578579968 2 10 3.49309321508 4 10 3.51007405486 3 10 3.52674897593 4 10 3.54313707448 1 10 3.55925605012 3 10 3.57512234939 6 10 3.59075129199 5 10 3.60615718186 4 10 3.62135340555 3 10 3.6363525195 7 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 4 10 3.69460407794 4 10 3.70878193635 4 10 3.72282441539 5 10 3.73674003753 3 10 3.75053693448 5 10 3.76422288134 7 10 3.77780532778 5 10 3.79129142667 2 10 3.8046880604 4 10 3.81800186517 5 10 3.83123925344 5 10 3.84440643489 5 10 3.85750943587 4 10 3.87055411763 2 10 3.88354619344 4 10 3.89649124479 3 10 3.90939473669 5 10 3.92226203224 5 10 3.93509840657 5 10 3.94790906028 2 10 3.96069913233 5 10 3.97347371267 5 10 3.98623785449 7 10 3.99899658627 7 10 4.01175492376 4 10 4.02451788173 7 10 4.03729048591 4 10 4.05007778479 4 10 4.06288486173 6 10 4.07571684715 5 10 4.08857893112 7 10 4.10147637615 4 10 4.11441453062 5 10 4.12739884254 4 10 4.14043487408 6 10 4.15352831675 2 10 4.16668500741 5 10 4.17991094525 8 10 4.19321230985 7 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 7 10 4.24730306039 4 10 4.26108199786 4 10 4.27497841466 9 10 4.28900038424 6 10 4.30315636519 7 10 4.31745523817 7 10 4.33190634649 5 10 4.3465195408 4 10 4.36130522862 6 10 4.37627442923 5 10 4.39143883477 7 10 4.40681087839 4 10 4.42240381053 5 10 4.43823178464 5 10 4.45430995358 4 10 4.4706545787 5 10 4.48728315346 6 10 4.50421454406 6 10 4.52146915008 4 10 4.53906908867 7 10 4.55703840652 4 10 4.57540332489 3 10 4.59419252417 5 10 4.61343747583 6 10 4.63317283161 4 10 4.65343688238 5 10 4.67427210198 7 10 4.69572579606 8 10 4.71785088083 6 10 4.74070682473 7 10 4.76436079535 9 10 4.7888890681 6 10 4.81437877164 7 10 4.8409300716 7 10 4.86865893179 4 10 4.8977006465 7 10 4.92821441759 7 10 4.96038937084 6 10 4.99445259144 6 10 5.0306800504 9 10 5.06941176794 7 10 5.1110733522 5 10 5.15620742767 9 10 5.20552095898 7 10 5.25995921372 4 10 5.3208266688 8 10 5.38999588299 9 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 8 10 6.09132916932 8 10 iteration: 13 Burnin: 48 Thinning: 5 Nsamples: 11443 Steps: [ 7.71393254e-02 6.48882106e-01 1.60878492e-02 2.40713072e-04] Burnin: 48 Thinning: 5 Nsamples: 11443 Steps: [ 0.06086536 0.47942958 0.01897249 0.00094783] Steps(final): [ 0.06086536 0.47942958 0.01897249 0.00094783] iteration: 14 Burnin: 40 Thinning: 2 Nsamples: 6919 Steps: [ 7.02732756e-02 4.05946501e-01 1.62964191e-02 2.75376487e-05] Burnin: 40 Thinning: 2 Nsamples: 6919 Steps: [ 7.52376963e-02 3.63801560e-01 2.52636128e-02 2.09070298e-04] Steps(final): [ 7.52376963e-02 3.63801560e-01 2.52636128e-02 2.09070298e-04] iteration: 15 Burnin: 29 Thinning: 4 Nsamples: 7085 Steps: [ 0.06430406 0.45041186 0.01407389 0.00074973] Burnin: 29 Thinning: 4 Nsamples: 7085 Steps: [ 0.05404109 0.39257084 0.01641534 0.00278206] Steps(final): [ 0.05404109 0.39257084 0.01641534 0.00278206] iteration: 16 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.57388404 0.72552008 0.11145243 0.19145432] Steps(final): [ 2.00006886e-14 3.11121823e-14 3.64595887e-17 0.00000000e+00] warning, confidence interval has zero length! ====================================================================== 3.0 3 10 3.03438393847 2 10 3.06683976785 2 10 3.09760144961 4 10 3.1268634863 2 10 3.15478934453 4 10 3.18151774456 4 10 3.20716743383 4 10 3.23184086298 6 10 3.25562705378 4 10 3.27860386336 3 10 3.30083979103 3 10 3.32239543436 3 10 3.34332467315 2 10 3.36367564024 4 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 6 10 3.44009965292 4 10 3.45812940282 3 10 3.47578579968 2 10 3.49309321508 3 10 3.51007405486 5 10 3.52674897593 2 10 3.54313707448 4 10 3.55925605012 5 10 3.57512234939 0 10 3.59075129199 6 10 3.60615718186 5 10 3.62135340555 6 10 3.6363525195 5 10 3.6511663277 2 10 3.66580595104 4 10 3.68028188951 5 10 3.69460407794 6 10 3.70878193635 6 10 3.72282441539 4 10 3.73674003753 5 10 3.75053693448 5 10 3.76422288134 1 10 3.77780532778 5 10 3.79129142667 4 10 3.8046880604 4 10 3.81800186517 4 10 3.83123925344 5 10 3.84440643489 4 10 3.85750943587 5 10 3.87055411763 4 10 3.88354619344 6 10 3.89649124479 4 10 3.90939473669 7 10 3.92226203224 4 10 3.93509840657 4 10 3.94790906028 6 10 3.96069913233 3 10 3.97347371267 7 10 3.98623785449 4 10 3.99899658627 5 10 4.01175492376 4 10 4.02451788173 5 10 4.03729048591 6 10 4.05007778479 7 10 4.06288486173 6 10 4.07571684715 5 10 4.08857893112 5 10 4.10147637615 4 10 4.11441453062 5 10 4.12739884254 6 10 4.14043487408 6 10 4.15352831675 4 10 4.16668500741 7 10 4.17991094525 6 10 4.19321230985 4 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 5 10 4.24730306039 8 10 4.26108199786 6 10 4.27497841466 5 10 4.28900038424 4 10 4.30315636519 7 10 4.31745523817 8 10 4.33190634649 4 10 4.3465195408 8 10 4.36130522862 6 10 4.37627442923 5 10 4.39143883477 5 10 4.40681087839 7 10 4.42240381053 5 10 4.43823178464 5 10 4.45430995358 7 10 4.4706545787 5 10 4.48728315346 8 10 4.50421454406 7 10 4.52146915008 7 10 4.53906908867 7 10 4.55703840652 9 10 4.57540332489 5 10 4.59419252417 8 10 4.61343747583 7 10 4.63317283161 3 10 4.65343688238 5 10 4.67427210198 4 10 4.69572579606 5 10 4.71785088083 8 10 4.74070682473 6 10 4.76436079535 10 10 4.7888890681 6 10 4.81437877164 6 10 4.8409300716 6 10 4.86865893179 5 10 4.8977006465 9 10 4.92821441759 8 10 4.96038937084 5 10 4.99445259144 7 10 5.0306800504 8 10 5.06941176794 9 10 5.1110733522 7 10 5.15620742767 9 10 5.20552095898 6 10 5.25995921372 7 10 5.3208266688 7 10 5.38999588299 8 10 5.47029442647 10 10 5.56629019787 9 10 5.68609831971 8 10 5.84638599875 9 10 6.09132916932 9 10 iteration: 17 Burnin: 20 Thinning: 2 Nsamples: 2824 Steps: [ 0.08049852 0.42962016 0.02080994 0.01050456] Burnin: 20 Thinning: 2 Nsamples: 2824 Steps: [ 0.06854383 0.47760316 0.01701096 0.01458423] Steps(final): [ 0.06854383 0.47760316 0.01701096 0.01458423] iteration: 18 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.76208974 2.14825139 0.17981125 0.33404957] Steps(final): [ 3.06677226e-14 2.40008264e-14 1.35421329e-16 9.22340784e-19] warning, confidence interval has zero length! ====================================================================== 3.0 3 10 3.03438393847 2 10 3.06683976785 4 10 3.09760144961 3 10 3.1268634863 3 10 3.15478934453 2 10 3.18151774456 4 10 3.20716743383 1 10 3.23184086298 5 10 3.25562705378 5 10 3.27860386336 2 10 3.30083979103 4 10 3.32239543436 5 10 3.34332467315 3 10 3.36367564024 2 10 3.38349152356 4 10 3.40281123349 4 10 3.42166996184 3 10 3.44009965292 3 10 3.45812940282 4 10 3.47578579968 5 10 3.49309321508 5 10 3.51007405486 3 10 3.52674897593 6 10 3.54313707448 5 10 3.55925605012 3 10 3.57512234939 4 10 3.59075129199 4 10 3.60615718186 2 10 3.62135340555 2 10 3.6363525195 4 10 3.6511663277 7 10 3.66580595104 5 10 3.68028188951 5 10 3.69460407794 4 10 3.70878193635 2 10 3.72282441539 3 10 3.73674003753 5 10 3.75053693448 2 10 3.76422288134 6 10 3.77780532778 5 10 3.79129142667 5 10 3.8046880604 5 10 3.81800186517 4 10 3.83123925344 3 10 3.84440643489 3 10 3.85750943587 5 10 3.87055411763 5 10 3.88354619344 7 10 3.89649124479 5 10 3.90939473669 6 10 3.92226203224 4 10 3.93509840657 5 10 3.94790906028 3 10 3.96069913233 7 10 3.97347371267 4 10 3.98623785449 5 10 3.99899658627 7 10 4.01175492376 5 10 4.02451788173 8 10 4.03729048591 3 10 4.05007778479 5 10 4.06288486173 7 10 4.07571684715 3 10 4.08857893112 3 10 4.10147637615 3 10 4.11441453062 7 10 4.12739884254 5 10 4.14043487408 5 10 4.15352831675 4 10 4.16668500741 4 10 4.17991094525 6 10 4.19321230985 7 10 4.20659548044 3 10 4.22006705657 4 10 4.23363388034 6 10 4.24730306039 7 10 4.26108199786 9 10 4.27497841466 5 10 4.28900038424 7 10 4.30315636519 5 10 4.31745523817 7 10 4.33190634649 6 10 4.3465195408 6 10 4.36130522862 7 10 4.37627442923 3 10 4.39143883477 7 10 4.40681087839 6 10 4.42240381053 5 10 4.43823178464 7 10 4.45430995358 6 10 4.4706545787 5 10 4.48728315346 8 10 4.50421454406 6 10 4.52146915008 5 10 4.53906908867 7 10 4.55703840652 5 10 4.57540332489 7 10 4.59419252417 8 10 4.61343747583 5 10 4.63317283161 6 10 4.65343688238 7 10 4.67427210198 7 10 4.69572579606 6 10 4.71785088083 8 10 4.74070682473 8 10 4.76436079535 5 10 4.7888890681 7 10 4.81437877164 6 10 4.8409300716 7 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 5 10 4.96038937084 8 10 4.99445259144 6 10 5.0306800504 8 10 5.06941176794 5 10 5.1110733522 9 10 5.15620742767 5 10 5.20552095898 9 10 5.25995921372 8 10 5.3208266688 8 10 5.38999588299 8 10 5.47029442647 7 10 5.56629019787 6 10 5.68609831971 7 10 5.84638599875 10 10 6.09132916932 10 10 iteration: 19 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.61230756 2.19094447 0.17270668 0.32499317] Steps(final): [ 2.00006886e-14 5.51130087e-14 8.68085444e-17 0.00000000e+00] warning, confidence interval has zero length! ====================================================================== 3.0 3 10 3.03438393847 2 10 3.06683976785 3 10 3.09760144961 2 10 3.1268634863 2 10 3.15478934453 4 10 3.18151774456 1 10 3.20716743383 2 10 3.23184086298 8 10 3.25562705378 6 10 3.27860386336 4 10 3.30083979103 3 10 3.32239543436 4 10 3.34332467315 4 10 3.36367564024 2 10 3.38349152356 2 10 3.40281123349 5 10 3.42166996184 5 10 3.44009965292 2 10 3.45812940282 4 10 3.47578579968 4 10 3.49309321508 8 10 3.51007405486 3 10 3.52674897593 4 10 3.54313707448 1 10 3.55925605012 2 10 3.57512234939 6 10 3.59075129199 3 10 3.60615718186 4 10 3.62135340555 4 10 3.6363525195 7 10 3.6511663277 4 10 3.66580595104 3 10 3.68028188951 3 10 3.69460407794 5 10 3.70878193635 1 10 3.72282441539 3 10 3.73674003753 5 10 3.75053693448 1 10 3.76422288134 5 10 3.77780532778 2 10 3.79129142667 6 10 3.8046880604 3 10 3.81800186517 5 10 3.83123925344 3 10 3.84440643489 4 10 3.85750943587 6 10 3.87055411763 5 10 3.88354619344 6 10 3.89649124479 8 10 3.90939473669 4 10 3.92226203224 5 10 3.93509840657 3 10 3.94790906028 7 10 3.96069913233 3 10 3.97347371267 4 10 3.98623785449 5 10 3.99899658627 3 10 4.01175492376 5 10 4.02451788173 6 10 4.03729048591 5 10 4.05007778479 8 10 4.06288486173 4 10 4.07571684715 2 10 4.08857893112 8 10 4.10147637615 8 10 4.11441453062 6 10 4.12739884254 2 10 4.14043487408 6 10 4.15352831675 5 10 4.16668500741 8 10 4.17991094525 5 10 4.19321230985 8 10 4.20659548044 7 10 4.22006705657 5 10 4.23363388034 9 10 4.24730306039 8 10 4.26108199786 7 10 4.27497841466 6 10 4.28900038424 6 10 4.30315636519 3 10 4.31745523817 8 10 4.33190634649 5 10 4.3465195408 8 10 4.36130522862 5 10 4.37627442923 8 10 4.39143883477 6 10 4.40681087839 4 10 4.42240381053 6 10 4.43823178464 5 10 4.45430995358 6 10 4.4706545787 5 10 4.48728315346 5 10 4.50421454406 7 10 4.52146915008 6 10 4.53906908867 8 10 4.55703840652 7 10 4.57540332489 8 10 4.59419252417 9 10 4.61343747583 6 10 4.63317283161 5 10 4.65343688238 7 10 4.67427210198 8 10 4.69572579606 4 10 4.71785088083 5 10 4.74070682473 4 10 4.76436079535 7 10 4.7888890681 6 10 4.81437877164 6 10 4.8409300716 5 10 4.86865893179 7 10 4.8977006465 7 10 4.92821441759 7 10 4.96038937084 8 10 4.99445259144 8 10 5.0306800504 6 10 5.06941176794 6 10 5.1110733522 8 10 5.15620742767 7 10 5.20552095898 6 10 5.25995921372 8 10 5.3208266688 8 10 5.38999588299 10 10 5.47029442647 9 10 5.56629019787 9 10 5.68609831971 7 10 5.84638599875 9 10 6.09132916932 9 10 iteration: 20 Burnin: 29 Thinning: 3 Nsamples: 6211 Steps: [ 0.1149897 0.78031821 0.02045056 0.0254281 ] Burnin: 29 Thinning: 3 Nsamples: 6211 Steps: [ 0.09156247 0.529539 0.01433951 0.01393776] Steps(final): [ 0.09156247 0.529539 0.01433951 0.01393776] iteration: 21 Burnin: 14 Thinning: 1 Nsamples: 2858 Steps: [ 0.07659413 0.39757691 0.01136256 0.00992879] Burnin: 20 Thinning: 3 Nsamples: 4635 Steps: [ 0.07550266 0.37761406 0.01614025 0.01592215] Burnin: 39 Thinning: 4 Nsamples: 7432 Steps: [ 0.06803238 0.61574388 0.0211748 0.02206725] Burnin: 55 Thinning: 4 Nsamples: 20222 Steps: [ 0.12512834 0.51935307 0.01945334 0.04342927] Burnin: 55 Thinning: 4 Nsamples: 20222 Steps: [ 0.06901213 0.41267075 0.01557493 0.02103685] Steps(final): [ 0.06901213 0.41267075 0.01557493 0.02103685] iteration: 22 Burnin: 0 Thinning: 1 Nsamples: 600 Steps: [ 0.46840001 2.05618494 0.15048365 0.33327255] Steps(final): [ 3.37789408e-14 6.66689621e-15 2.37855412e-16 3.96063984e-18] warning, confidence interval has zero length! ====================================================================== 3.0 2 10 3.03438393847 2 10 3.06683976785 1 10 3.09760144961 2 10 3.1268634863 1 10 3.15478934453 3 10 3.18151774456 5 10 3.20716743383 3 10 3.23184086298 3 10 3.25562705378 4 10 3.27860386336 4 10 3.30083979103 4 10 3.32239543436 2 10 3.34332467315 4 10 3.36367564024 3 10 3.38349152356 2 10 3.40281123349 1 10 3.42166996184 3 10 3.44009965292 4 10 3.45812940282 2 10 3.47578579968 5 10 3.49309321508 6 10 3.51007405486 7 10 3.52674897593 2 10 3.54313707448 5 10 3.55925605012 3 10 3.57512234939 4 10 3.59075129199 1 10 3.60615718186 3 10 3.62135340555 5 10 3.6363525195 3 10 3.6511663277 5 10 3.66580595104 2 10 3.68028188951 3 10 3.69460407794 4 10 3.70878193635 5 10 3.72282441539 5 10 3.73674003753 6 10 3.75053693448 7 10 3.76422288134 5 10 3.77780532778 2 10 3.79129142667 3 10 3.8046880604 5 10 3.81800186517 5 10 3.83123925344 7 10 3.84440643489 4 10 3.85750943587 3 10 3.87055411763 2 10 3.88354619344 7 10 3.89649124479 7 10 3.90939473669 2 10 3.92226203224 5 10 3.93509840657 2 10 3.94790906028 5 10 3.96069913233 7 10 3.97347371267 6 10 3.98623785449 3 10 3.99899658627 5 10 4.01175492376 2 10 4.02451788173 4 10 4.03729048591 4 10 4.05007778479 4 10 4.06288486173 4 10 4.07571684715 6 10 4.08857893112 3 10 4.10147637615 6 10 4.11441453062 8 10 4.12739884254 4 10 4.14043487408 4 10 4.15352831675 6 10 4.16668500741 5 10 4.17991094525 6 10 4.19321230985 4 10 4.20659548044 4 10 4.22006705657 6 10 4.23363388034 6 10 4.24730306039 5 10 4.26108199786 7 10 4.27497841466 5 10 4.28900038424 5 10 4.30315636519 7 10 4.31745523817 7 10 4.33190634649 5 10 4.3465195408 5 10 4.36130522862 5 10 4.37627442923 5 10 4.39143883477 4 10 4.40681087839 8 10 4.42240381053 9 10 4.43823178464 6 10 4.45430995358 8 10 4.4706545787 6 10 4.48728315346 7 10 4.50421454406 8 10 4.52146915008 8 10 4.53906908867 6 10 4.55703840652 6 10 4.57540332489 8 10 4.59419252417 4 10 4.61343747583 9 10 4.63317283161 4 10 4.65343688238 7 10 4.67427210198 9 10 4.69572579606 7 10 4.71785088083 6 10 4.74070682473 5 10 4.76436079535 9 10 4.7888890681 7 10 4.81437877164 7 10 4.8409300716 6 10 4.86865893179 5 10 4.8977006465 5 10 4.92821441759 9 10 4.96038937084 10 10 4.99445259144 7 10 5.0306800504 7 10 5.06941176794 6 10 5.1110733522 7 10 5.15620742767 8 10 5.20552095898 9 10 5.25995921372 8 10 5.3208266688 10 10 5.38999588299 6 10 5.47029442647 9 10 5.56629019787 8 10 5.68609831971 9 10 5.84638599875 10 10 6.09132916932 8 10 iteration: 23 Burnin: 18 Thinning: 1 Nsamples: 3343 Steps: [ 0.06431319 0.46238951 0.01527927 0.00068706] Burnin: 18 Thinning: 2 Nsamples: 3343 Steps: [ 0.06003173 0.361429 0.01816019 0.0018029 ] Steps(final): [ 0.06003173 0.361429 0.01816019 0.0018029 ] iteration: 24 Burnin: 52 Thinning: 4 Nsamples: 12223 Steps: [ 0.10884952 0.60208237 0.01776387 0.01985549] psignifit3-3.0~beta.20120611.1/investigate-zlci/integrate.py000066400000000000000000000266601176542545200233610ustar00rootroot00000000000000#!/usr/bin/env python import numpy as np from scipy.optimize import fmin,leastsq, brentq import pypsignifit as pf import pypsignifit.psignipriors as pfp import swignifit.swignifit_raw as sfr import swignifit.utility as sfu import pypsignifit.psigobservers as pfo from scipy import stats # Error functions based on KL-Divergence? def bounds ( mapest, pdata, ppmf, parameter="m" ): prm = mapest.copy() if mapest[2] < 0: prm[2] = 1e-5 if len(mapest)>3: if mapest[3] < 0: prm[3] = 1e-5 maxpost = -ppmf.neglpost ( prm, pdata ) x = np.array ( [ pdata.getIntensity ( i ) for i in xrange ( pdata.getNblocks() ) ] ) if parameter=="m": index = 0 pmin = x.min () pmax = x.max () elif parameter=="w": index = 1 x.sort () pmin = 0.3*np.min ( np.diff(x) ) pmax = 3*(x.max()-x.min()) elif parameter=="lm": index = 2 pmin = 0 pmax = .5 elif parameter=="gm": index = 3 pmin = 0 pmax = .5 def error ( x, target=0.1*maxpost ): prm[index] = x lpost = -ppmf.neglpost ( prm, pdata ) return lpost - target lmax = pmax lmin = pmin print "Maxpost =",maxpost for r in [.1,.3,.5,.8,.9]: trg = maxpost+np.log(r) if error ( mapest[index], trg )*error ( pmax, trg ) < 0: lmax = brentq ( error, mapest[index], pmax, args=(trg,) ) print parameter,r,"max" break for r in [.1,.3,.5,.8,.9]: trg = maxpost+np.log(r) if error ( mapest[index], trg ) * error ( pmin, trg ) < 0: lmin = brentq ( error, pmin, mapest[index], args=(trg,) ) print parameter,r,"min" break if lmin==pmin: print "WARNING: did not optimize lower bound for parameter",parameter if lmax==pmax: print "WARNING: did not optimize upper bound for parameter",parameter if lmin>lmax: lmin,lmax = lmax,lmin if parameter in ["lm","gm"]: if lmax<0.1: lmax = 0.1 if lmin>0.02: lmin = 0.02 return lmin,lmax def dist2class ( dist ): name,prm = dist.split("(") prm = prm.strip(") ") p1,p2 = [float(p) for p in prm.split(",")] if name=="Gauss": f = stats.norm ( p1, p2 ) elif name=="Gamma": f = stats.gamma ( p1, scale=p2 ) elif name=="Beta": f = stats.beta ( p1, p2 ) else: raise ValueError, "Unknown distribution: %s" % (name,) return f def integration_grid ( data, run=1, dists=None ): data = np.array(data) mprior,mmin,mmax = pfp.default_mid ( data[:,0] ) wprior,wmin,wmax = pfp.default_width ( data[:,0] ) lprior,lmin,lmax = pfp.default_lapse ( ) gprior,gmin,gmax = pfp.default_lapse ( ) priors = (mprior,wprior,lprior,gprior) pdata,ppmf,pn = sfu.make_dataset_and_pmf ( data, 1, "logistic", "mw0.1", priors ) mapest = pf.BootstrapInference ( data, priors, nafc=1 ).estimate if run==1: gridsize = 9 mmin,mmax = bounds ( mapest, pdata, ppmf, "m" ) wmin,wmax = bounds ( mapest, pdata, ppmf, "w" ) lmin,lmax = bounds ( mapest, pdata, ppmf, "lm" ) gmin,gmax = bounds ( mapest, pdata, ppmf, "gm" ) grid = np.reshape ( np.mgrid[ mmin:mmax:1j*gridsize, wmin:wmax:1j*gridsize, lmin:lmax:1j*gridsize, gmin:gmax:1j*gridsize ], (4,-1) ) elif run==2: f_m = dist2class ( dists[0] ) f_w = dist2class ( dists[1] ) f_l = dist2class ( dists[2] ) f_g = dist2class ( dists[3] ) grid = np.mgrid[.025:.975:7j,.025:.975:7j,.025:.975:7j,.025:.975:7j] grid[0] = f_m.ppf ( grid[0] ) grid[1] = f_w.ppf ( grid[1] ) grid[2] = f_l.ppf ( grid[2] ) grid[3] = f_g.ppf ( grid[3] ) grid = np.reshape ( grid, (4,-1) ) gridsize = 7 post = np.reshape ( np.array ( map ( lambda prm: ppmf.neglpost ( prm, pdata ), grid.T ) ), [gridsize]*pn ) # negative log posterior post = np.exp ( -post ) # posterior grid = np.reshape ( grid, [pn]+[gridsize]*pn ) d = [ np.diff ( grid[i], axis=i )[0].max() for i in xrange ( pn ) ] fx = [ marginalize ( post, d, i ) for i in xrange ( pn ) ] x = [] for i in xrange ( pn ): s = [ i ] + [0]*pn s[i+1] = slice(0,grid.shape[i+1]) x.append ( grid[s] ) return x,fx,priors def marginalize ( post, d, i ): p = reduce ( lambda x,y: x*y, d ) fx = np.zeros ( post.shape[i] ) for j in xrange ( post.shape[i] ): s = [slice(0,post.shape[0]),slice(0,post.shape[1]),slice(0,post.shape[2]),slice(0,post.shape[3])] s[i] = j fx[j] = post[s].sum() # return fx * p / d[i] return fx def error_gauss ( prm, fx, x ): Z,mu,sg = prm sg = sg*sg # return np.sum ( ( Z**2*np.exp ( -0.5*((x-mu)/sg)**2 ) - fx )**2 ) # return Z*Z*np.exp ( -0.5*((x-mu)/sg**2 ) ) - fx return np.sum ( np.log ( Z**2*np.exp ( -0.5*((x-mu)/sg)**2 ) / fx )**2 ) def error_gamma ( prm, fx, x ): Z,k,th = prm k = k*k th = th*th return np.sum ( ( Z**2*x**(k-1)*np.exp(-x/th) - fx )**2 ) # return np.sum ( np.log ( Z**2*x**(k-1)*np.exp(-x/th) / fx )**2 ) def error_beta ( prm, fx, x ): Z,al,bt = prm al = al**2 bt = bt**2 # return np.sum ( ( Z**2*x**(al-1)*(1-x)**(bt-1) - fx )**2 ) return np.sum ( np.log( Z**2*x**(al-1)*(1-x)**(bt-1) / fx )**2 ) def fit_posterior ( fx, x ): post = [] I = 10000 N = 10000 mu = x[0][np.argmax(fx[0])] fx[0] /= fx[0].max() mprm = fmin ( error_gauss, [1.,mu,1.5], args=(fx[0],x[0]), maxfun=N, maxiter=I ) print mprm post.append ( "Gauss(%g,%g)" % ( mprm[1],mprm[2]**2 ) ) fx[1] /= fx[1].max() wprm = fmin ( error_gamma, [1.,2,4], args=(fx[1],x[1]), maxfun=N, maxiter=I ) post.append ( "Gamma(%g,%g)" % ( wprm[1]**2,wprm[2]**2 ) ) fx[2] /= fx[2].max() lprm = fmin ( error_beta, [1.,2,20], args=(fx[2],x[2]), maxfun=N, maxiter=I ) post.append ( "Beta(%g,%g)" % ( lprm[1]**2,lprm[2]**2 ) ) if len(fx)>3: fx[3] /= fx[3].max() gprm = fmin ( error_beta, [1.,2,20], args=(fx[3],x[3]), maxfun=N, maxiter=I ) post.append ( "Beta(%g,%g)" % ( gprm[1]**2,gprm[2]**2 ) ) return post def sample_importance_resample ( post, pdata, ppmf, nresample=600, nsamples=6000 ): f = [ dist2class ( dist ) for dist in post ] print "Sample" presamples = [] for dist in f: presamples.append ( dist.rvs ( nsamples ) ) presamples = np.array(presamples) print "Calculate importance weights" w = [] for prm in presamples.T: q = 1. for th,dist in zip ( prm, f ): q *= dist.pdf(th) p = np.exp ( -ppmf.neglpost ( prm, pdata ) ) w.append ( p/q ) w = np.array ( w ) w /= w.sum() P = np.cumsum(w) u = np.sort ( np.random.rand ( nresample ) ) print "Resample" samples = [] ind = 0 k = 0 while k=nresample: break samples += [presamples[:,ind]]*n ind += 1 return np.array(samples) if __name__ == "__main__": import pylab as pl O = pfo.Observer ( 5,3,.05,.05, core="mw0.1", sigmoid="logistic", nafc=1 ) data = O.DoAnExperiment ( [1,2,3,4,5,6,7,8,12], 30 ) # data = [[1, 2, 30], [2, 2, 30], [3, 2, 30], [4, 5, 30], [5, 16, 30], [6, 22, 30], [7, 26, 30], [8, 27, 30], [12, 29, 30]] # data = [[1, 1, 30], [2, 4, 30], [3, 3, 30], [4, 7, 30], [5, 11, 30], [6, 26, 30], [7, 27, 30], [8, 29, 30], [12, 30, 30]] # data = [[1, 1, 30], [2, 2, 30], [3, 4, 30], [4, 9, 30], [5, 19, 30], [6, 27, 30], [7, 25, 30], [8, 27, 30], [12, 30, 30]] # First optimization does not converge # data = [[1, 1, 30], [2, 2, 30], [3, 5, 30], [4, 9, 30], [5, 20, 30], [6, 25, 30], [7, 29, 30], [8, 24, 30], [12, 28, 30]] # data = [[1, 3, 30], [2, 0, 30], [3, 0, 30], [4, 5, 30], [5, 17, 30], [6, 22, 30], [7, 24, 30], [8, 27, 30], [12, 29, 30]] # Bad initial fit ~> log fitting? # data = [[1, 1, 30], [2, 2, 30], [3, 1, 30], [4, 5, 30], [5, 13, 30], [6, 28, 30], [7, 26, 30], [8, 29, 30], [12, 27, 30]] # Takes many refinements to converge # data = [[1, 0, 30], [2, 2, 30], [3, 1, 30], [4, 9, 30], [5, 17, 30], [6, 24, 30], [7, 27, 30], [8, 28, 30], [12, 29, 30]] # Bad initial fit for w # data = [[1, 1, 30], [2, 2, 30], [3, 1, 30], [4, 3, 30], [5, 14, 30], [6, 26, 30], [7, 28, 30], [8, 28, 30], [12, 28, 30]] # Bad initial fit for w # data = [[1, 0, 30], [2, 2, 30], [3, 2, 30], [4, 9, 30], [5, 17, 30], [6, 26, 30], [7, 25, 30], [8, 28, 30], [12, 29, 30]] # Bad initial fit for w # data = [[1, 2, 30], [2, 4, 30], [3, 2, 30], [4, 9, 30], [5, 16, 30], [6, 17, 30], [7, 27, 30], [8, 27, 30], [12, 30, 30]] # Bad initial fit for w nrefine = 2 print data x,fx,priors = integration_grid ( data ) print "x1 =",x print "f1 =",fx post = fit_posterior(fx,x) for i in xrange ( nrefine ): x,fx,priors = integration_grid ( data, 2, post ) print post print "x%d =" % (i+1,),x print "f%d =" % (i+1),fx post = fit_posterior (fx, x) f = [ sfu.get_prior ( p ) for p in post ] mapest = pf.BootstrapInference ( data, priors, core="mw0.1", nafc=1 ).estimate pdata,ppmf,pn = sfu.make_dataset_and_pmf ( data, 1, "logistic", "mw0.1", priors ) samples = sample_importance_resample ( post, pdata, ppmf, nresample=600, nsamples=6000 ) rng = [(3,7),(0,6),(0,.5),(0,.5)] hist_ax = [pl.axes ( [.15+.2*i,.75-.2*i,.15,.15] ) for i in xrange ( 4 )] labels = ["m","w","lm","gm"] for i,prm in enumerate ( labels ): ax = hist_ax[i] h,b = np.histogram ( samples[:,i], normed=True ) ax.step ( np.convolve ( [.5,.5], b, 'valid' ), h, where='mid' ) xx = np.mgrid[rng[i][0]:rng[i][1]:1000j] g = np.array ( [f[i].pdf(x_) for x_ in xx] ) ax.plot ( xx, g, '-', linewidth=2 ) mxind = np.argmax(fx[i]) r = fx[i][mxind]/f[i].pdf(x[i][mxind]) ax.plot ( x[i], fx[i]/r, 'o' ) ax.plot ( [O.params[i]]*2,[0,f[i].pdf(O.params[i])], 'k' ) ax.plot ( [mapest[i]]*2,[0,f[i].pdf(mapest[i])], 'r' ) ax.set_title ( prm ) print fx[i]/r ax.set_ylim ( 0, 1.5 * np.max(fx[i]/r) ) ax.set_xlim ( rng[i] ) for i in xrange ( 4 ): for j in xrange ( i+1, 4 ): ax = pl.axes ( [.15+.2*j,.75-.2*i,.15,.15 ] ) ax.plot ( samples[:,j], samples[:,i], '.' ) m,b,r,pr,se = stats.linregress ( samples[:,j], samples[:,i] ) x = np.sort ( samples[:,j] ) ax.plot ( x, m*x+b ) ax.set_title ( r"$r=%.2f\pm%.2f$" % (r,se) ) ax.set_xlim ( rng[j] ) ax.set_ylim ( rng[i] ) pl.setp ( ax, xticklabels=() ) if j-i > 1: pl.setp ( ax, yticklabels=() ) ax = pl.axes ( [.1,.1,.3,.3] ) data = np.array(data, dtype="d") x = np.mgrid[data[:,0].min():data[:,0].max():100j] for k in xrange ( 20 ): ax.plot ( x, [ppmf.evaluate ( xx, samples[k,:] ) for xx in x], color=[.7,.7,1.] ) ax.plot ( x, [ppmf.evaluate ( xx, samples.mean(0) ) for xx in x], color='b', linewidth=2 ) ax.plot ( data[:,0], data[:,1]/data[:,2], 'ko' ) ax.set_xlabel ( "stimulus intensity" ) ax.set_ylabel ( r"$\Psi(x|\theta)$" ) print "Number of duplicates:",1-float(len(np.unique(samples[:,0])))/samples.shape[0] print mapest pl.show() print "data =",data psignifit3-3.0~beta.20120611.1/investigate-zlci/reader.py000066400000000000000000000006151176542545200226310ustar00rootroot00000000000000#!/usr/bin/env python import re def read_data ( fname ): seed = int(re.search ( r"data(\d+)", fname ).group(1)) data = [ [float(x.split()[0]),int(x.split()[1]),int(x.split()[2])] for x in open(fname).readlines() ] return data,seed if __name__ == "__main__": import sys d,s = read_data ( sys.argv[1] ) print "seed:", s print "number of stimulus intensities:", len(d) psignifit3-3.0~beta.20120611.1/investigate-zlci/run_mcmc_single.py000066400000000000000000000055241176542545200245370ustar00rootroot00000000000000import pypsignifit.psigobservers as po import pypsignifit as pp import swignifit.interface_methods as sfi # script to run a single mcmc m = 4.0 w = 4.0 l = 0.05 g = 0.02 params = (m, w, l, g) model = {'nafc':1, 'sigmoid':"logistic", 'core':'mw0.1'} nblocks = 10 # 128 levels levels=[3.0,3.03438393847,3.06683976785,3.09760144961,3.1268634863,3.15478934453,3.18151774456,3.20716743383,3.23184086298,3.25562705378,3.27860386336,3.30083979103,3.32239543436,3.34332467315,3.36367564024,3.38349152356,3.40281123349,3.42166996184,3.44009965292,3.45812940282,3.47578579968,3.49309321508,3.51007405486,3.52674897593,3.54313707448,3.55925605012,3.57512234939,3.59075129199,3.60615718186,3.62135340555,3.6363525195,3.6511663277,3.66580595104,3.68028188951,3.69460407794,3.70878193635,3.72282441539,3.73674003753,3.75053693448,3.76422288134,3.77780532778,3.79129142667,3.8046880604,3.81800186517,3.83123925344,3.84440643489,3.85750943587,3.87055411763,3.88354619344,3.89649124479,3.90939473669,3.92226203224,3.93509840657,3.94790906028,3.96069913233,3.97347371267,3.98623785449,3.99899658627,4.01175492376,4.02451788173,4.03729048591,4.05007778479,4.06288486173,4.07571684715,4.08857893112,4.10147637615,4.11441453062,4.12739884254,4.14043487408,4.15352831675,4.16668500741,4.17991094525,4.19321230985,4.20659548044,4.22006705657,4.23363388034,4.24730306039,4.26108199786,4.27497841466,4.28900038424,4.30315636519,4.31745523817,4.33190634649,4.3465195408,4.36130522862,4.37627442923,4.39143883477,4.40681087839,4.42240381053,4.43823178464,4.45430995358,4.4706545787,4.48728315346,4.50421454406,4.52146915008,4.53906908867,4.55703840652,4.57540332489,4.59419252417,4.61343747583,4.63317283161,4.65343688238,4.67427210198,4.69572579606,4.71785088083,4.74070682473,4.76436079535,4.7888890681,4.81437877164,4.8409300716,4.86865893179,4.8977006465,4.92821441759,4.96038937084,4.99445259144,5.0306800504,5.06941176794,5.1110733522,5.15620742767,5.20552095898,5.25995921372,5.3208266688,5.38999588299,5.47029442647,5.56629019787,5.68609831971,5.84638599875,6.09132916932] priors = ["Gauss(%f,%f)" % (m, m), "Gauss(%f,%f)" % (w, w*2), "Beta(2,50)", "Beta(1,50)"] #print 'foo' #print sfi.mapestimate(data, nafc=model['nafc'], sigmoid=model['sigmoid'], core=model['core'], priors=priors) # def print_data(data): print "======================================================================" for dat in data: print dat[0], dat[1], dat[2] def run(): ob = po.Observer(*params, **model) data = ob.DoAnExperiment(levels, nblocks) Bi = pp.BayesInference(data, sigmoid=model['sigmoid'], core=model['core'], nafc=model['nafc'], priors=priors, verbose=True) ci = Bi.getCI(cut=0.5) if ci[0] - ci[2] == 0: print "warning, confidence interval has zero length!" print_data(data) for i in range(1000): pp.set_seed(i) print "iteration: ", i, run() psignifit3-3.0~beta.20120611.1/modpath.iss000066400000000000000000000132711176542545200177120ustar00rootroot00000000000000// ---------------------------------------------------------------------------- // // Inno Setup Ver: 5.3.10 // Script Version: 1.4.0 // Author: Jared Breland // Homepage: http://www.legroom.net/software // // Script Function: // Allow modification of environmental path directly from Inno Setup installers // // Instructions: // Copy modpath.iss to the same directory as your setup script // // Add this statement to your [Setup] section // ChangesEnvironment=true // // Add this statement to your [Tasks] section // You can change the Description or Flags // You can change the Name, but it must match the ModPathName setting below // Name: modifypath; Description: &Add application directory to your environmental path; Flags: unchecked // // Add the following to the end of your [Code] section // ModPathName defines the name of the task defined above // ModPathType defines whether the 'user' or 'system' path will be modified // this will default to user if anything other than user or system is set // setArrayLength must specify the total number of dirs to be added // Result[0] contains first directory, Result[1] contains second, etc. // const // ModPathName = 'modifypath'; // ModPathType = 'user'; // // function ModPathDir(): TArrayOfString; // begin // setArrayLength(Result, 1) // Result[0] := ExpandConstant('{app}'); // end; // #include "modpath.iss" // ---------------------------------------------------------------------------- procedure ModPath(); var oldpath: String; newpath: String; updatepath: Boolean; pathArr: TArrayOfString; aExecFile: String; aExecArr: TArrayOfString; i, d: Integer; pathdir: TArrayOfString; regroot: Integer; regpath: String; begin // Get constants from main script and adjust behavior accordingly // ModPathType MUST be 'system' or 'user'; force 'user' if invalid if ModPathType = 'system' then begin regroot := HKEY_LOCAL_MACHINE; regpath := 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment'; end else begin regroot := HKEY_CURRENT_USER; regpath := 'Environment'; end; // Get array of new directories and act on each individually pathdir := ModPathDir(); for d := 0 to GetArrayLength(pathdir)-1 do begin updatepath := true; // Modify WinNT path if UsingWinNT() = true then begin // Get current path, split into an array RegQueryStringValue(regroot, regpath, 'Path', oldpath); oldpath := oldpath + ';'; i := 0; while (Pos(';', oldpath) > 0) do begin SetArrayLength(pathArr, i+1); pathArr[i] := Copy(oldpath, 0, Pos(';', oldpath)-1); oldpath := Copy(oldpath, Pos(';', oldpath)+1, Length(oldpath)); i := i + 1; // Check if current directory matches app dir if pathdir[d] = pathArr[i-1] then begin // if uninstalling, remove dir from path if IsUninstaller() = true then begin continue; // if installing, flag that dir already exists in path end else begin updatepath := false; end; end; // Add current directory to new path if i = 1 then begin newpath := pathArr[i-1]; end else begin newpath := newpath + ';' + pathArr[i-1]; end; end; // Append app dir to path if not already included if (IsUninstaller() = false) AND (updatepath = true) then newpath := newpath + ';' + pathdir[d]; // Write new path RegWriteStringValue(regroot, regpath, 'Path', newpath); // Modify Win9x path end else begin // Convert to shortened dirname pathdir[d] := GetShortName(pathdir[d]); // If autoexec.bat exists, check if app dir already exists in path aExecFile := 'C:\AUTOEXEC.BAT'; if FileExists(aExecFile) then begin LoadStringsFromFile(aExecFile, aExecArr); for i := 0 to GetArrayLength(aExecArr)-1 do begin if IsUninstaller() = false then begin // If app dir already exists while installing, skip add if (Pos(pathdir[d], aExecArr[i]) > 0) then updatepath := false; break; end else begin // If app dir exists and = what we originally set, then delete at uninstall if aExecArr[i] = 'SET PATH=%PATH%;' + pathdir[d] then aExecArr[i] := ''; end; end; end; // If app dir not found, or autoexec.bat didn't exist, then (create and) append to current path if (IsUninstaller() = false) AND (updatepath = true) then begin SaveStringToFile(aExecFile, #13#10 + 'SET PATH=%PATH%;' + pathdir[d], True); // If uninstalling, write the full autoexec out end else begin SaveStringsToFile(aExecFile, aExecArr, False); end; end; end; // Write file to flag modifypath was selected // Workaround since IsTaskSelected() cannot be called at uninstall and AppName and AppId cannot be "read" in Code section if IsUninstaller() = false then SaveStringToFile(ExpandConstant('{app}') + '\uninsTasks.txt', WizardSelectedTasks(False), False); end; procedure CurStepChanged(CurStep: TSetupStep); var taskname: String; begin taskname := ModPathName; if CurStep = ssPostInstall then if IsTaskSelected(taskname) then ModPath(); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var appdir: String; aSelectedTasks: TArrayOfString; i: Integer; taskname: String; begin taskname := ModPathName; appdir := ExpandConstant('{app}') if CurUninstallStep = usUninstall then begin if LoadStringsFromFile(appdir + '\uninsTasks.txt', aSelectedTasks) then for i := 0 to GetArrayLength(aSelectedTasks)-1 do if aSelectedTasks[i] = taskname then ModPath(); DeleteFile(appdir + '\uninsTasks.txt'); end; end; function NeedRestart(): Boolean; var taskname: String; begin taskname := ModPathName; if IsTaskSelected(taskname) and not UsingWinNT() then begin Result := True; end else begin Result := False; end; end; psignifit3-3.0~beta.20120611.1/mpsignifit/000077500000000000000000000000001176542545200177035ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/mpsignifit/BayesInference.m000066400000000000000000000201631176542545200227450ustar00rootroot00000000000000function results = BayesInference ( data, priors, varargin ) % results = BayesInference ( data, priors, ... ) % % Bayesian inference for psychometric functions using Makov Chain Monte Carlo. % % Data should be an array with three columns and one row for each block of trials. % The first column should contain the stimulus intensity in the respective block, % the second column should contain the number of correctly identified trials in % the respective block, and the third column should contain the total number of % trials presented in the respective block. % % A valid data variable would be: % % >> data = [0, 1, 2, 3; 3, 5, 9; 10, 10, 10]'' % % % Priors should be a struct with the fields m_or_a, w_or_b, lambda, and gamma. 'None' % can be used to specify "No prior" i.e. an improper, flat prior. A valid prior would % be: % % >> priors.m_or_a = 'None'; % >> priors.w_or_b = 'None'; % >> priors.lambda = 'Uniform(0,.1)'; % >> priors.gamma = 'Uniform(0,.1)'; % % For more information on the specification of priors for psychometric functions, see % % http://psignifit.sourceforge.net/BAYESINTRO.html#specification-of-prior-distributions % % In the default configuration, the function draws samples from the posterior distribution % of model parameters given the data using the Metropolis-Hastings algorithm. The following % parameters can be used to modify the behavior of the function. To specify one of these % parameters, call the function as % % >> BayesInference ( data, priors, 'PARAM', VALUE ) % % Some parameters don't require a value (for instance the 'gammaislambda' setting). In this % case call the function as % % >> BayesInference ( data, priors, 'PARAM' ) % % In the folloing list, all valid parameters are given. If a parameter requires a value argument, % the type of this value argument is given after the name of the parameter and separated by a comma. % % Parameters % ---------- % % 'nafc', integer Default: 2 % number of alternatives in the analyzed task. If nafc is 1 this means that a yes-no task was used. % In this case, the lower asymptote is considered a free parameter and is fitted as a fourth parameter. % See gammaislambda below too. % % 'sigmoid', char Default: 'logistic' % Name of the sigmoid object to be used for fitting. psignifit includes a large number of sigmoids. % These include (but are not restricted to) 'logistic', 'gauss', or 'gumbel'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'core', char Default: 'mw0.1' % Name of the core object to be used for fitting. psignifit includes a large number of cores. These % include (but are not restricted to) 'ab', 'mw0.1'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'gammaislambda' Default: false % In yes-no tasks, it is sometimes of interest to constrain the model to have the same upper and lower % asymptote. This can be achieved in psignifit by constraining gamma to be lambda, effectively reducing the % number of free parameters by one. % % 'verbose' Default: false % print out more about what is going on. % % 'cuts', double (vector) Default: [0.25, 0.5, 0.75] % Cuts are the performances at which thresholds should be determined. Thus, setting cuts to 0.5 will define % the threshold to be the signal level that corresponds to a performance half way between the upper and the % lower asymptote. % % 'samples', int Default: 2000 % Number of MCMC samples to be generated % % 'pilot', double array Default: false % An array of pilot samples to tune the markov chain monte carlo procedure. A good idea is often to use % a small number of bootstrap samples to tune the sampler, such as % % >> pilot = BootstrapInference ( data, priors, 'samples', 200 ); % >> mcmc = BayesInference ( data, priors, 'pilot', pilot.mcestimates ); % % By default, NO automatic tuning is performed! % % 'stepwidths', double vector Default: [0.1, 0.1, 0.01] % standard deviations of the different components of the proposal distribution. Also see 'pilot' % % 'generic' Default: false % Use the generic Metropolis Hastings algorithm proposed by Raftery and Lewis. This is often a good choice if you % use a pilot sample. % % % This file is part of psignifit3 for matlab. (c) 2010 by Ingo Fründ % Check data format if size ( data, 2 ) ~= 3 error ( 'data should have three columns' ); end % default values nafc = 2; sigmoid = 'logistic'; core = 'mw0.1'; gil = ''; gammaislambda = false; verbosity = ''; cuts = [0.25,0.5,0.75]; samples = 2000; verbose = false; stepwidths = [0.1,0.1,0.01]; pilot = false; generic = ''; % If priors for lambda and gamma are set as 'None', display warning if exist ( 'priors.lambda' ) if priors.lambda == 'None' disp('No prior set on lambda; this may lead to non-plausible value for the lapse rate') end end if exist ( 'priors.gamma') if priors.gamma == 'None' disp('No prior set on gamma; this may lead to non-plausible value for the guess rate') end end % Set a default prior if none is present if exist ( 'priors' ) ~= 1; priors.m_or_a = 'None'; priors.w_or_b = 'None'; priors.lambda = 'Uniform(0,.1)'; priors.gamma = 'Uniform(0,.1)'; end % Check input while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'nafc' [nafc,varargin] = popoption(varargin); case 'sigmoid' [sigmoid,varargin] = popoption(varargin); case 'core' [core,varargin] = popoption(varargin); case 'gammaislambda' gil = '-e'; gammaislambda = true; case 'verbose' % verbosity = '-v'; % Matlab system call merges stdout and stderr --- so this does not well verbose = true; case 'cuts' [cuts,varargin] = popoption(varargin); case 'samples' [samples,varargin] = popoption(varargin); case 'stepwidths' [stepwidths,varargin] = popoption(varargin); case 'pilot' pilot = true; pilotf = tempname; [pilotsample,varargin] = popoption(varargin); f = fopen ( pilotf, 'w' ); fprintf ( f, '\n# mcestimates\n' ); for k = 1:size(pilotsample,1) fprintf ( f, '%s\n', num2str(pilotsample(k,:)) ); end fclose(f); case 'generic' generic = '-generic'; otherwise warning ( sprintf ( 'unknown option: %s !\n' , opt ) ); end end if pilot stepwidths_or_pilot = pilotf; else stepwidths_or_pilot = sprintf('"%s',num2str(stepwidths(:)','%f,')); stepwidths_or_pilot(end) = '"'; end % Store the data dataf = tempname; save ( '-ascii', dataf, 'data' ); % Fiddle around with the fourth prior. Do we need it? if nafc > 1 prior4 = ''; elseif gammaislambda prior4 = ''; else prior4 = sprintf ( '-prior4 "%s"', getfield ( priors, 'gamma' ) ); end % Determine cuts scuts = sprintf ( '"%s', num2str ( cuts, '%f,') ); scuts(length(scuts)) = '"'; % Write the command cmd = sprintf ( 'psignifit-mcmc %s %s --matlab -prior1 "%s" -prior2 "%s" -prior3 "%s" %s -nsamples %d -nafc %d -s %s -c %s %s -cuts %s -proposal %s %s', ... verbosity, dataf, ... getfield(priors,'m_or_a'), getfield(priors,'w_or_b'), getfield(priors,'lambda'), prior4, ... samples, nafc, sigmoid, core, gil, scuts, stepwidths_or_pilot, generic ); if verbose cmd end % Do the real work [status,output] = system ( cmd ); eval ( output ); % Store paradigm results.call = 'bayes'; results.nafc = nafc; results.sigmoid = sigmoid; results.core = core; results.gammaislambda = gammaislambda; results.cuts = cuts; results.data = data; results.priors = priors; results.params_estimate = mean ( results.mcestimates(samples/2:end,:) ); results.burnin = samples/2; results.nsamples = samples; % Clean up delete ( dataf ); if exist ( stepwidths_or_pilot, 'file' ) delete ( stepwidths_or_pilot ); end psignifit3-3.0~beta.20120611.1/mpsignifit/BootstrapInference.m000066400000000000000000000154251176542545200236640ustar00rootroot00000000000000function results = BootstrapInference ( data, priors, varargin ) % results = BootstrapInference ( data, constraints, ... ) % % Determine bias corrected and accelerated bootstrap confidence intervals for a psychometric function % % Data should be an array with three columns and one row for each block of trials. % The first column should contain the stimulus intensity in the respective block, % the second column should contain the number of correctly identified trials in % the respective block, and the third column should contain the total number of % trials presented in the respective block. % % A valid data variable would be: % % >> data = [0, 1, 2, 3; 3, 5, 9; 10, 10, 10]'' % % Constraints should be a struct with the fields m_or_a, w_or_b, lambda, and gamma. 'None' % can be used to specify "No constraint". Valid constraints would % be: % % >> priors.m_or_a = 'None'; % >> priors.w_or_b = 'None'; % >> priors.lambda = 'Uniform(0,.1)'; % >> priors.gamma = 'Uniform(0,.1)'; % % Internally, the constraints are used like bayesian priors. This means that constraints % could in principle be any probability distribution. Psignifit implements a number of % probability distributions to be used as constraints / priors. For more information on % the specification of constraints / priors for psychometric functions, see % % http://psignifit.sourceforge.net/BAYESINTRO.html#specification-of-prior-distributions % % Parameters % ---------- % % 'nafc', integer Default: 2 % number of alternatives in the analyzed task. If nafc is 1 this means that a yes-no task was used. % In this case, the lower asymptote is considered a free parameter and is fitted as a fourth parameter. % See gammaislambda below too. % % 'sigmoid', char Default: 'logistic' % Name of the sigmoid object to be used for fitting. psignifit includes a large number of sigmoids. % These include (but are not restricted to) 'logistic', 'gauss', or 'gumbel'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'core', char Default: 'mw0.1' % Name of the core object to be used for fitting. psignifit includes a large number of cores. These % include (but are not restricted to) 'ab', 'mw0.1'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'gammaislambda' Default: false % In yes-no tasks, it is sometimes of interest to constrain the model to have the same upper and lower % asymptote. This can be achieved in psignifit by constraining gamma to be lambda, effectively reducing the % number of free parameters by one. % % 'verbose' Default: false % print out more about what is going on. % % 'cuts', double (vector) Default: [0.25, 0.5, 0.75] % Cuts are the performances at which thresholds should be determined. Thus, setting cuts to 0.5 will define % the threshold to be the signal level that corresponds to a performance half way between the upper and the % lower asymptote. % % 'nonparametric' Default: false % perform nonparametric bootstrap instead of the default parametric bootstrap % % Examples of usage: % ------------------ % % results = BootstrapInference ( data, priors, 'nafc', 1, 'gammaislambda' ) % fits a yes-no task, constraining gamma to equal lambda % % results = BootstrapInference ( data, priors, 'nonparametric' ) % performs nonparametric bootstrap % % This function is part of psignifit3 for matlab (c) 2010 by Ingo Fründ % Check data format if size ( data, 2 ) ~= 3 error ( 'data should have three columns' ); end % default values nafc = 2; sigmoid = 'logistic'; core = 'mw0.1'; gil = ''; gammaislambda = false; npr = ''; verbosity = ''; cuts = [0.25,0.5,0.75]; samples = 2000; verbose = false; % If priors for lambda and gamma are set as 'None', display warning if exist ( 'priors.lambda' ) if priors.lambda == 'None' disp('No prior set on lambda; this may lead to non-plausible value for the lapse rate') end end if exist ( 'priors.gamma') if priors.gamma == 'None' disp('No prior set on gamma; this may lead to non-plausible value for the guess rate') end end % Set a default prior if none is present if exist ( 'priors' ) ~= 1; priors.m_or_a = 'None'; priors.w_or_b = 'None'; priors.lambda = 'Uniform(0,.1)'; priors.gamma = 'Uniform(0,.1)'; end % Check input while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'nafc' [nafc,varargin] = popoption(varargin); case 'sigmoid' [sigmoid,varargin] = popoption(varargin); case 'core' [core,varargin] = popoption(varargin); case 'gammaislambda' gil = '-e'; gammaislambda = true; case 'nonparametric' npr = '-nonparametric'; case 'verbose' % verbosity = '-v'; % Matlab system call merges stdout and stderr --- so this does not well verbose = true; case 'cuts' [cuts,varargin] = popoption(varargin); case 'samples' [samples,varargin] = popoption(varargin); otherwise warning ( sprintf ( 'unknown option: %s !\n' , opt ) ); end end % Get the point estimate if gammaislambda mapest = MapEstimate ( data, priors, 'nafc', nafc, 'sigmoid', sigmoid, 'core', core, 'cuts', cuts, 'gammaislambda' ); else mapest = MapEstimate ( data, priors, 'nafc', nafc, 'sigmoid', sigmoid, 'core', core, 'cuts', cuts ); end % Store the data dataf = tempname; save ( '-ascii', dataf, 'data' ); % Fiddle around with the fourth prior. Do we need it? if nafc > 1 prior4 = ''; elseif gammaislambda prior4 = ''; else prior4 = sprintf ( '-prior4 "%s"', getfield ( priors, 'gamma' ) ); end % Determine cuts scuts = sprintf ( '"%s', num2str ( cuts, '%f,') ); scuts(length(scuts)) = '"'; % Write the command cmd = sprintf ( 'psignifit-bootstrap %s %s --matlab -prior1 "%s" -prior2 "%s" -prior3 "%s" %s -nsamples %d -nafc %d -s %s -c %s %s %s -cuts %s', ... verbosity, dataf, ... getfield(priors,'m_or_a'), getfield(priors,'w_or_b'), getfield(priors,'lambda'), prior4, ... samples, nafc, sigmoid, core, gil, npr, scuts ); if verbose cmd end % Do the real work [status,output] = system ( cmd ); eval ( output ); % Store paradigm results.call = 'bootstrap'; results.nafc = nafc; results.sigmoid = sigmoid; results.core = core; results.gammaislambda = gammaislambda; results.cuts = cuts; results.data = data; results.priors = priors; results.params_estimate = mapest.params_estimate; results.mapest = mapest; results.burnin = 1; results.nsamples = samples; % Clean up delete ( dataf ); psignifit3-3.0~beta.20120611.1/mpsignifit/Diagnostics.m000066400000000000000000000111151176542545200223270ustar00rootroot00000000000000function results = Diagnostics ( data, parameters, varargin ) % results = Diagnostics ( data, parameters, ... ) % % Determine some parameters of fitted psychometric function parameters. % This involves evaluation of the function for different x values or determining % some diagnostic values for goodness of fit. % % Data should be an array with three columns and one row for each block of trials. % The first column should contain the stimulus intensity in the respective block, % the second column should contain the number of correctly identified trials in % the respective block, and the third column should contain the total number of % trials presented in the respective block. % % A valid data variable would be: % % >> data = [0, 1, 2, 3; 3, 5, 9; 10, 10, 10]'' % % Parameters should a vector of parameters at which the diagnostic values should % be evaluated. % % The behavior of this function can be modified by specifiing certain addition % parameters. To specify one of these parameters, call the function as % % >> Diagnostics ( data, priors, 'PARAM', VALUE ) % % Some parameters do not require a value (for instance the 'gammaislambda' setting). In this % case call the function as % % >> Diagnostics ( data, priors, 'PARAM' ) % % In the following list, all valid parameters are given. If a parameter requires a value argument, % the type of this value argument is given after the name of the parameter and separated by a comma. % % Parameters % ---------- % % 'nafc', integer Default: 2 % number of alternatives in the analyzed task. If nafc is 1 this means that a yes-no task was used. % In this case, the lower asymptote is considered a free parameter and is fitted as a fourth parameter. % See gammaislambda below too. % % 'sigmoid', char Default: 'logistic' % Name of the sigmoid object to be used for fitting. psignifit includes a large number of sigmoids. % These include (but are not restricted to) 'logistic', 'gauss', or 'gumbel'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'core', char Default: 'mw0.1' % Name of the core object to be used for fitting. psignifit includes a large number of cores. These % include (but are not restricted to) 'ab', 'mw0.1'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'gammaislambda' Default: false % In yes-no tasks, it is sometimes of interest to constrain the model to have the same upper and lower % asymptote. This can be achieved in psignifit by constraining gamma to be lambda, effectively reducing the % number of free parameters by one. % % 'verbose' Default: false % print out more about what is going on. % % This function is part of psignifit3 for matlab (c) 2010 by Ingo Fründ % Check data format if size ( data, 2 ) ~= 3 error ( 'data should have three columns' ); end % default values nafc = 2; sigmoid = 'logistic'; core = 'mw0.1'; gil = ''; gammaislambda = false; verbosity = ''; cuts = [0.25,0.5,0.75]; verbose = false; % Check input while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'nafc' [nafc,varargin] = popoption(varargin); case 'sigmoid' [sigmoid,varargin] = popoption(varargin); case 'core' [core,varargin] = popoption(varargin); case 'gammaislambda' gil = '-e'; gammaislambda = true; case 'verbose' % verbosity = '-v'; % Matlab system call merges stdout and stderr --- so this does not well verbose = true; case 'cuts' [cuts,varargin] = popoption(varargin); otherwise warning ( sprintf ( 'unknown option: %s !\n' , opt ) ); end end % Store the data dataf = tempname; save ( '-ascii', dataf, 'data' ); sparams = sprintf ( '"%s', num2str ( parameters, '%f,') ); sparams(end) = '"'; % Determine cuts scuts = sprintf ( '"%s', num2str ( cuts, '%f,') ); scuts(end) = '"'; % Write the command cmd = sprintf ( 'psignifit-diagnostics %s --matlab -c %s -s %s -params %s -cuts %s -nafc %d %s %s', ... dataf, core, sigmoid,sparams,scuts,nafc,verbosity, gil ); if verbose cmd end [status,output] = system ( cmd ); eval ( output ); results.call = 'diagnostics'; results.nafc = nafc; results.sigmoid = sigmoid; results.core = core; results.gammaislambda = gammaislambda; results.cuts = cuts; results.data = data; % Clean up delete ( dataf ); psignifit3-3.0~beta.20120611.1/mpsignifit/GoodnessOfFit.m000066400000000000000000000063471176542545200226040ustar00rootroot00000000000000function GoodnessOfFit ( inference ) % GoodnessOfFit ( inference ) % % Display a simple goodness-of-fit plot. The plot is structured in six displays. % The first row of these displays illustrates the situation for the fitted psychometric function, % the second row of these displays shows how the fitted psychometric function is related to the % situation that would be expected if the fitted model was correct (i.e. captured all the structure % in the given data). % % More detailed explanations of this plot can be found in the psignifit for python tutorial at % % http://psignifit.sourceforge.net/TUTORIAL.html % % % This file is part of psignifit3 for matlab. (c) 2010 by Ingo Fründ ax = subplot(231); cla(ax); plotPMF ( inference, 'axes', ax ); ax = subplot(232); cla(ax); plotRd ( inference, 'p', 'axes', ax ); ax = subplot(233); cla(ax); plotRd ( inference, 'k', 'axes', ax ); if strcmp(inference.call, 'bayes' ) b = inference.burnin; ax = subplot(234); cla(ax); hold on; plot ( inference.ppdeviance(b:end), inference.mcdeviance(b:end), '.' ); yl = get ( ax, 'ylim' ); xl = get ( ax, 'xlim' ); ym = max(yl); xm = max(xl); plot ( [0,max(xm,ym)], [0,max(xm,ym)], 'k:' ); xlabel ( 'simulated deviance' ); ylabel ( 'observed deviance' ); hold off; ax = subplot(235); cla(ax); hold on; plot ( inference.ppRpd(b:end), inference.mcRpd(b:end), '.' ); plot ( [-1,1],[-1,1], 'k:' ); xlabel ( 'simulated Rpd' ); ylabel ( 'observed Rpd' ); hold off; ax = subplot(236); cla(ax); hold on; plot ( inference.ppRkd(b:end), inference.mcRkd(b:end), '.' ); plot ( [-1,1],[-1,1], 'k:' ); xlabel ( 'simulated Rkd' ); ylabel ( 'simulated Rpd' ); hold off; else if inference.gammaislambda diagnostics = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, ... 'nafc', inference.nafc, 'gammaislambda' ); else diagnostics = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, ... 'nafc', inference.nafc ); end ax = subplot(234); cla(ax); hold on; hist(inference.mcdeviance); yl = get ( ax, 'ylim' ); p = prctile ( inference.mcdeviance(:), 95 ); plot ( [p,p], yl, 'r:' ); plot ( [diagnostics.deviance,diagnostics.deviance], yl, 'r', 'linewidth', 2 ); xlabel ( 'deviance' ); ylabel ( 'number of occuances' ); hold off; ax = subplot(235); cla(ax); hold on; hist ( inference.mcRpd ); yl = get ( ax, 'ylim' ); p = prctile ( inference.mcRpd(:), [2.5,97.5] ); plot ( [p(1),p(1)], yl, 'r:', [p(2),p(2)], yl, 'r:' ); plot ( [diagnostics.rpd,diagnostics.rpd], yl, 'r', 'linewidth', 2 ); xlabel ( 'Rpd' ); ylabel ( 'number of occuances' ); hold off; ax = subplot(236); cla(ax); hold on; hist ( inference.mcRkd ); yl = get ( ax, 'ylim' ); p = prctile ( inference.mcRkd(:), [2.5,97.5] ); plot ( [p(1),p(1)], yl, 'r:', [p(2),p(2)], yl, 'r:' ); plot ( [diagnostics.rkd,diagnostics.rkd], yl, 'r', 'linewidth', 2 ); xlabel ( 'Rkd' ); ylabel ( 'number of occuances' ); hold off; end psignifit3-3.0~beta.20120611.1/mpsignifit/MapEstimate.m000066400000000000000000000135001176542545200222710ustar00rootroot00000000000000function results = MapEstimate ( data, priors, varargin ) % results = MapEstimate ( data, priors, ... ) % % Determine a point estimate of the psychometric function. % % The point estimate is taken to be the Maximum A Posteriori in a bayesian setting. % If all priors are 'None', this is the same as the maximum likelihood estimator. % For proper priors, the MAP estimator takes into account the constraints imposed % by the priors. % % data should be an array with three columns and one row for each block of trials. % The first column should contain the stimulus intensity in the respective block, % the second column should contain the number of correctly identified trials in % the respective block, and the third column should contain the total number of % trials presented in the respective block. % % priors should be a struct with the fields m_or_a, w_or_b, lambda, and gamma. 'None' % can be used to specify "No prior" i.e. an improper, flat prior. A valid prior would % be % % >> priors.m_or_a = 'None'; % >> priors.w_or_b = 'None'; % >> priors.lambda = 'Uniform(0,.1)'; % >> prior.gammas = 'Uniform(0,.1)'; % % For more information on the specification of priors for psychometric functions, see % % http://psignifit.sourceforge.net/BAYESINTRO.html#specification-of-prior-distributions % % The behavior of the function can be modified by setting a number of parameters for the fitting % procedure. To specify one of these parameters, call the function as % % >> MapEstimate ( data, priors, 'PARAM', VALUE ) % % Some parameters don't require a value (for instance the 'gammaislambda' setting). In this % case call the function as % % >> MapEstimate ( data, priors, 'PARAM' ) % % In the folloing list, all valid parameters are given. If a parameter requires a value argument, % the type of this value argument is given after the name of the parameter and separated by a comma. % % Parameters % ---------- % % 'nafc', integer Default: 2 % number of alternatives in the analyzed task. If nafc is 1 this means that a yes-no task was used. % In this case, the lower asymptote is considered a free parameter and is fitted as a fourth parameter. % See gammaislambda below too. % % 'sigmoid', char Default: 'logistic' % Name of the sigmoid object to be used for fitting. psignifit includes a large number of sigmoids. % These include (but are not restricted to) 'logistic', 'gauss', or 'gumbel'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'core', char Default: 'mw0.1' % Name of the core object to be used for fitting. psignifit includes a large number of cores. These % include (but are not restricted to) 'ab', 'mw0.1'. See % % http://psignifit.sourceforge.net/MODELSPECIFICATION.html#specifiing-the-shape-of-the-psychometric-function % % for further information. % % 'gammaislambda' Default: false % In yes-no tasks, it is sometimes of interest to constrain the model to have the same upper and lower % asymptote. This can be achieved in psignifit by constraining gamma to be lambda, effectively reducing the % number of free parameters by one. % % 'verbose' Default: false % print out more about what is going on. % % 'cuts', double (vector) Default: [0.25, 0.5, 0.75] % Cuts are the performances at which thresholds should be determined. Thus, setting cuts to 0.5 will define % the threshold to be the signal level that corresponds to a performance half way between the upper and the % lower asymptote. % % % This function is part of psignifit3 for matlab (c) 2010 by Ingo Fründ % Check data format if size ( data, 2 ) ~= 3 error ( 'data should have three columns' ); end % default values nafc = 2; sigmoid = 'logistic'; core = 'mw0.1'; gil = ''; gammaislambda = false; verbosity = ''; cuts = [0.25,0.5,0.75]; verbose = false; % Set a default prior if none is present if exist ( 'priors' ) ~= 1; priors.m_or_a = 'None'; priors.w_or_b = 'None'; priors.lambda = 'Uniform(0,.1)'; priors.gamma = 'Uniform(0,.1)'; end % Check input while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'nafc' [nafc,varargin] = popoption(varargin); case 'sigmoid' [sigmoid,varargin] = popoption(varargin); case 'core' [core,varargin] = popoption(varargin); case 'gammaislambda' gil = '-gammaislambda'; gammaislambda = true; case 'verbose' % verbosity = '-v'; % Matlab system call merges stdout and stderr --- so this does not well verbose = true; case 'cuts' [cuts,varargin] = popoption(varargin); otherwise warning ( sprintf ( 'unknown option: %s !\n' , opt ) ); end end % Store the data dataf = tempname; save ( '-ascii', dataf, 'data' ); if nafc > 1 prior4 = ''; elseif gammaislambda prior4 = ''; else prior4 = sprintf ( '-prior4 "%s"', getfield ( priors, 'gamma' ) ); end % Determine cuts scuts = sprintf ( '"%s', num2str ( cuts, '%f,') ); scuts(length(scuts)) = '"'; % Write the command cmd = sprintf ( 'psignifit-mapestimate %s --matlab -prior1 "%s" -prior2 "%s" -prior3 "%s" %s -nafc %d -s %s -c %s -cuts %s %s', ... dataf, getfield(priors,'m_or_a'), getfield(priors,'w_or_b'), getfield(priors,'lambda'), prior4, ... nafc, sigmoid, core, scuts, verbosity); if verbose cmd end % Do the real work [status,output] = system ( cmd ); eval ( output ); results.call = 'mapestimate'; results.nafc = nafc; results.sigmoid = sigmoid; results.core = core; results.gammaislambda = gammaislambda; results.cuts = cuts; results.data = data; results.priors = priors; results.burnin = 1; results.nsamples = 0; % clean up delete ( dataf ); psignifit3-3.0~beta.20120611.1/mpsignifit/evaluate.m000066400000000000000000000013021176542545200216630ustar00rootroot00000000000000function predicted = evaluate(x, inference) % Evaluate the psychometric function model at positions given by x % % x % Values at which PF should be evaluated % % inference % The inference object inputData = [x; zeros(1, length(x)); zeros(1, length(x))]' if inference.gammaislambda diag = Diagnostics ( inputData, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts, 'gammaislambda' ); else diag = Diagnostics ( inputData, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts ); end predicted = diag.prediction(:,2)'psignifit3-3.0~beta.20120611.1/mpsignifit/getCI.m000066400000000000000000000013301176542545200210510ustar00rootroot00000000000000function ci = getCI ( inference, cut, p ) % ci = getCI ( inference, cut ) % % Get the confidence interval from the inference object % % inference should be a struct as generated either by BayesInference or BootstrapInference % % cut should be the index of the desired cut % % p should be the desired coverage of the confidence interval (p<1) % % % This file is part of psignifit3 for matlab (c) by Ingo Fründ notin = 1-p; probs = [0.5*notin,1-0.5*notin]; if strcmp ( inference.call, 'bootstrap' ) bias = inference.bias_thres(cut); acc = inference.acc_thres(cut); probs = normcdf( bias + ( norminv(probs) + bias ) ./ (1-acc*(norminv(probs) + bias )) ); end; ci = prctile ( inference.mcthres(:,cut), 100*probs ); psignifit3-3.0~beta.20120611.1/mpsignifit/getSlope.m000066400000000000000000000007771176542545200216560ustar00rootroot00000000000000function slope = getSlope(inference, cut) % threshold = getSlope(inference, cut) % % Get the slope for a given cut. % % Inference should be a struct as generated either by BayesInference() or BootstrapInference(). % % Cut should be the index of the desired cut. if strcmp ( inference.call, 'bootstrap' ) slope = inference.slopes(cut); elseif strcmp ( inference.call, 'bayes' ) slope = inference.slopes(cut); else disp('Inference object is neither of type "bootstrap" nor "bayes". Will Stop') end; psignifit3-3.0~beta.20120611.1/mpsignifit/getThres.m000066400000000000000000000010371176542545200216470ustar00rootroot00000000000000function threshold = getThres(inference, cut) % threshold = getThreshold(inference, cut) % % Get the threshold for a given cut. % % Inference should be a struct as generated either by BayesInference() or BootstrapInference(). % % Cut should be the index of the desired cut. if strcmp ( inference.call, 'bootstrap' ) threshold = inference.thresholds(cut); elseif strcmp ( inference.call, 'bayes' ) threshold = inference.thresholds(cut); else disp('Inference object is neither of type "bootstrap" nor "bayes". Will Stop') end; psignifit3-3.0~beta.20120611.1/mpsignifit/plotPMF.m000066400000000000000000000114061176542545200214040ustar00rootroot00000000000000function axhandle = plotPMF ( inference, varargin ) % axes = PlotPMF ( inference, ... ) % % Plots an inference object as given by one of the commands BayesInference, BootstrapInference, or MapEstimate % % Additional Parameters can be set by calling % % axes = PlotPMF ( inference, 'PARAMETER', 'VALUE', ... ) % % Parameters % ---------- % % verbose show many status messages % axes axes handle where the plot should go % color use this color for the plot % xlabel label for the x axis % ylabel label for the y axis % % This file is part of psignifit3 for matlab (c) by Ingo Fründ % Check data format if size ( inference.data, 2 ) ~= 3 error ( 'data should have three columns' ); end if ~isstruct ( inference ) error ( 'inference should be a struct' ); end % Set default parameters verbose = false; axhandle = gca; color = [0,0,1]; xname = 'Stimulus intensity'; yname = 'Proportion correct'; % posterior samples only make sense in a bayesian framework if strcmp(inference.call, 'bayes') nposteriorsamples = 20; elseif strcmp(inference.call, 'bootstrap') nposteriorsamples = 0; elseif strcmp(inference.call, 'mapestimate') nposteriorsamples = 0; else error ( 'I have no idea what kind of inference was performed' ); end % Check input while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'verbose' verbose = true; case 'axes' [axhandle,varargin] = popoption ( varargin ); case 'color' [color,varargin] = popoption ( varargin ); case 'xlabel' [xname,varargin] = popoption ( varargin ); case 'ylabel' [yname,varargin] = popoption ( varargin ); otherwise warning ( sprintf ( 'unknown option: %s !\n' , opt ) ); end end % Range in which the deviance should be colored burnin = inference.burnin; drange = [min(inference.mcdeviance(burnin:end)),min(inference.mcdeviance(burnin:end))+2*std(inference.mcdeviance(burnin:end))]; % Diagnostics of the point estimate if inference.gammaislambda diag = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts, 'gammaislambda' ); else diag = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts ); end % Prepare the plot cla ( axhandle ); hold on; % If we are in a bayesian framework, we want a couple of examples from the posterior for k = 1:nposteriorsamples whichpmf = floor(inference.burnin + (inference.nsamples-inference.burnin)*rand()); % Evaluate the sample if inference.gammaislambda pmf = Diagnostics ( inference.data, inference.mcestimates ( whichpmf, : ), ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts, 'gammaislambda' ); else pmf = Diagnostics ( inference.data, inference.mcestimates ( whichpmf, : ), ... 'sigmoid', inference.sigmoid, 'core', inference.core, 'nafc', inference.nafc, 'cuts', inference.cuts ); end % Determine appropriate color if pmf.deviance>drange(2) deviance = drange(2); else deviance = pmf.deviance; end dpos = (deviance-drange(1))./(drange(2)-drange(1)); if isnan(dpos) dpos = 0; elseif dpos < 0 dpos = 0; elseif dpos > 1 dpos = 1; end % Plot the example plot ( axhandle, pmf.pmf(:,1), pmf.pmf(:,2), '-', 'color', dpos*[1,1,1]+(1-dpos)*color, 'linewidth', 1 ); end % In any case we need data and the pointestimate plot ( axhandle, inference.data(:,1), inference.data(:,2)./inference.data(:,3), 'o', 'color', color ); plot ( axhandle, diag.pmf(:,1), diag.pmf(:,2), '-', 'color', color, 'linewidth', 3 ); % And we need the confidence intervals for cut = 1:length(inference.cuts) ci = getCI ( inference, cut, 0.95 ); if inference.nafc>1 guess = 1./inference.nafc; else guess = inference.params_estimate(end); end h = guess + inference.cuts(cut)*(1-guess-inference.params_estimate(3)); plot ( axhandle, ci, [h,h], '-', 'color', color ); end % Set the ranges xmin = min ( inference.data(:,1) ); xmax = max ( inference.data(:,1) ); xrange = xmax-xmin; set(axhandle, 'xlim', [xmin-.05*xrange,xmax+.05*xrange], 'ylim', [0,1] ); % Label axes xlabel ( xname ); ylabel ( yname ); % Add info about psychometric function as multi-line text object textstr(1) = {['sigmoid: ', inference.sigmoid]}; textstr(2) = {['core: ', inference.core]}; textstr(3) = {['nAFC: ', num2str(inference.nafc)]}; textstr(4) = {['Deviance: ', num2str(diag.deviance)]}; text(xmin, 0.9, textstr, 'HorizontalAlignment', 'left'); % Releast the plot hold off; psignifit3-3.0~beta.20120611.1/mpsignifit/plotRd.m000066400000000000000000000057701176542545200213360ustar00rootroot00000000000000function axhandle = plotRd ( inference, regressor, varargin ) % axhandle = plotRd ( inference, regressor, varargin ) % % Illustrate the correlation between deviance residuals and a regressor. % Valid regressors are 'p' for model predictions or 'k' for block index. % % The the behavior of the plot can be modified using the following % parameter, value pairs: % % 'verbose' switch on verbosity % 'axes' give a handle where the plot should go % 'color' specify the color of the plotted symbols % 'xlabel' give the label for the x-axis % 'ylabel' give the label for the y-axis % % % This file is part of psignifit3 for matlab (c) by Ingo Fründ % Check data format if size ( inference.data, 2 ) ~= 3 error ( 'data should have three columns' ); end if ~isstruct ( inference ) error ( 'inference should be a struct' ); end axhandle = gca; color = 'b'; if strcmp(regressor, 'p') xname = 'model prediction'; elseif strcmp(regressor, 'k') xame = 'block index'; else error ( sprintf ( 'Unknown regressor %s', regressor ) ); end yname = 'deviance residual'; while size(varargin,2) > 0 [opt,varargin] = popoption ( varargin ); switch opt case 'verbose' verbose = true; case 'axes' [axhandle,varargin] = popoption ( varargin ); case 'color' [color,varargin] = popoption ( varargin ); case 'xlabel' [xname,varargin] = popoption ( varargin ); case 'ylabel' [yname,varargin] = popoption ( varargin ); otherwise printf ( 'unknown option: %s !\n' , char(opt) ); end end if inference.gammaislambda diagnostics = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, ... 'nafc', inference.nafc, 'gammaislambda' ); else diagnostics = Diagnostics ( inference.data, inference.params_estimate, ... 'sigmoid', inference.sigmoid, 'core', inference.core, ... 'nafc', inference.nafc ); end if strcmp(regressor, 'p') x = diagnostics.prediction(:,2); R = diagnostics.rpd; xname = 'model prediction'; elseif strcmp(regressor, 'k' ) x = 1:size(diagnostics.prediction,1); R = diagnostics.rkd; xname = 'block index'; else error ( sprintf ( 'Unknown regressor %s', regressor ) ); end b = cov ( x, diagnostics.devianceresiduals ) ./ var ( x ); if size(b) ~= [1,1] b = b(1,2); end a = mean(diagnostics.devianceresiduals) - b*mean(x); r = cov ( x, diagnostics.devianceresiduals ) ./ sqrt( var(x).*var(diagnostics.devianceresiduals) ); cla(axhandle); hold on; plot ( axhandle, x, diagnostics.devianceresiduals, 'o', 'color', color ); x = linspace ( min(x), max(x) ); plot ( axhandle, x, a + b*x, ':', 'color', color ); hold off; d = 0.05*(max(x)-min(x)); set ( axhandle, 'xlim', [ min(x)-d, max(x)+d ] ); xlabel ( xname ); ylabel ( yname ); text ( min(x)+18*d, min(diagnostics.devianceresiduals) + 0.9*(max(diagnostics.devianceresiduals)-min(diagnostics.devianceresiduals)), ... sprintf ( 'R%sd=%.2f', regressor, R) ); psignifit3-3.0~beta.20120611.1/mpsignifit/popoption.m000066400000000000000000000003611176542545200221100ustar00rootroot00000000000000function [value,args] = popoption ( args ) % pop the first value of args and return args % % % This file is part of psignifit3 for matlab (c) by Ingo Fründ value = args{1}; if length(args)>1 args = args(2:end); else args = {}; end psignifit3-3.0~beta.20120611.1/mpsignifit/setuptestenvironment.m000066400000000000000000000006641176542545200244140ustar00rootroot00000000000000% This file sets some variables that are useful for testing basic functionality of the matlab interface data2afc = [0 34 50; ... 2 32 50; ... 4 40 50; ... 6 48 50; ... 8 50 50; ... 10 48 50]; data1afc = [0 2 50; ... 2 21 50; ... 4 29 50; ... 6 42 50; ... 8 50 50; ... 10 48 50]; priors.m_or_a = 'None'; priors.w_or_b = 'None'; priors.lambda = 'Uniform(0,.1)'; priors.gamma = 'Uniform(0,.1)'; psignifit3-3.0~beta.20120611.1/mpsignifit/test_psignifit.m000066400000000000000000000063671176542545200231300ustar00rootroot00000000000000% This file performs some fake unit tests of the matlab interface. % Essentially this only tests whether all functions can be called setuptestenvironment % 2 afc disp ( 'testing 2afc setting' ); disp ( 'MapEstimate' ); mapest = MapEstimate ( data2afc, priors ); disp ( 'BootstrapInference' ); boots = BootstrapInference ( data2afc, priors, 'samples', 200 ); disp ( 'BayesInference: explicite stepwidths' ); mcmc = BayesInference ( data2afc, priors, 'samples', 200, 'stepwidths', std(boots.mcestimates,1) ); disp ( 'BayesInference: pilot sample' ); mcmcp = BayesInference ( data2afc, priors, 'samples', 200, 'pilot', boots.mcestimates ); disp ( 'BayesInference: generic' ); mcmcg = BayesInference ( data2afc, priors, 'samples', 200, 'pilot', boots.mcestimates, 'generic' ); % GoodnessOfFit calls Diagnostics internally disp ( 'Goodness of fit:' ); disp ( 'Bootstrap'); GoodnessOfFit ( boots ); disp ( 'mcmc' ); GoodnessOfFit ( mcmc ); disp ( 'mcmc(pilot)'); GoodnessOfFit ( mcmcp ); disp ( 'mcmc(generic)' ); GoodnessOfFit ( mcmcg ); disp ( 'clean up'); close all; % 1 afc disp ( '=================================================================================') disp ( 'testing yes no setting' ); disp ( 'MapEstimate' ); mapest = MapEstimate ( data1afc, priors, 'nafc', 1 ); disp ( 'BootstrapInference' ); boots = BootstrapInference ( data1afc, priors, 'nafc', 1, 'samples', 200 ); disp ( 'BayesInference: explicite stepwidths' ); mcmc = BayesInference ( data1afc, priors, 'nafc', 1, 'samples', 200, 'stepwidths', std(boots.mcestimates,1) ); disp ( 'BayesInference: pilot sample' ); mcmcp = BayesInference ( data1afc, priors, 'nafc', 1, 'samples', 200, 'pilot', boots.mcestimates ); disp ( 'BayesInference: generic' ); mcmcg = BayesInference ( data1afc, priors, 'nafc', 1, 'samples', 200, 'pilot', boots.mcestimates, 'generic' ); % GoodnessOfFit calls Diagnostics internally disp ( 'Goodness of fit:' ); disp ( 'Bootstrap'); GoodnessOfFit ( boots ); disp ( 'mcmc' ); GoodnessOfFit ( mcmc ); disp ( 'mcmc(pilot)'); GoodnessOfFit ( mcmcp ); disp ( 'mcmc(generic)' ); GoodnessOfFit ( mcmcg ); disp ( 'clean up'); close all; % 1 afc with gamma==lambda disp ( '=================================================================================') disp ( 'testing yes no with gamma==lambda' ); disp ( 'MapEstimate' ); mapest = MapEstimate ( data1afc, priors, 'nafc', 1, 'gammaislambda' ); disp ( 'BootstrapInference' ); boots = BootstrapInference ( data1afc, priors, 'nafc', 1, 'gammaislambda', 'samples', 200 ); disp ( 'BayesInference: explicite stepwidths' ); mcmc = BayesInference ( data1afc, priors, 'nafc', 1, 'gammaislambda', 'samples', 200, 'stepwidths', std(boots.mcestimates,1) ); disp ( 'BayesInference: pilot sample' ); mcmcp = BayesInference ( data1afc, priors, 'nafc', 1, 'gammaislambda', 'samples', 200, 'pilot', boots.mcestimates ); disp ( 'BayesInference: generic' ); mcmcg = BayesInference ( data1afc, priors, 'nafc', 1, 'gammaislambda', 'samples', 200, 'pilot', boots.mcestimates, 'generic' ); % GoodnessOfFit calls Diagnostics internally disp ( 'Goodness of fit:' ); disp ( 'Bootstrap'); GoodnessOfFit ( boots ); disp ( 'mcmc' ); GoodnessOfFit ( mcmc ); disp ( 'mcmc(pilot)'); GoodnessOfFit ( mcmcp ); disp ( 'mcmc(generic)' ); GoodnessOfFit ( mcmcg ); disp ( 'clean up'); close all; psignifit3-3.0~beta.20120611.1/mpsignifit/writedata.m000066400000000000000000000006371176542545200220530ustar00rootroot00000000000000function writedata ( data, fname='__dummydata.txt' ) % write data to be readible from the command line interface % % This file is part of psignifit3 for matlab. (c) 2010 by Ingo Fründ % Check data format if size ( data )(2) != 3 error ( 'data should have three columns' ) end f = fopen ( fname, 'w' ); for k=1:size ( data )(1) fprintf ( f, '%f %d %d\n', data(k,1), data(k,2), data(k,3) ); end fclose(f); psignifit3-3.0~beta.20120611.1/psignifit-cli.iss000066400000000000000000000037701176542545200210220ustar00rootroot00000000000000; This setup script requires the script modpath.iss written by Jared Breland ; currently, the script is not in the psignifit source distribution due to unresolved ; license issues. If you want to build your own windows installer, you have to ; download the script yourself from ; http://www.legroom.net/software [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{22600284-5AE4-44F6-BF95-7CD80B34E86E} AppName=psignifit AppVersion=3.0 beta ;AppVerName=psignifit-cli 3.0 beta AppPublisher=psignifit development team AppPublisherURL=http://psignifit.sourceforge.net AppSupportURL=http://psignifit.sourceforge.net AppUpdatesURL=http://psignifit.sourceforge.net DefaultDirName={pf}\psignifit3 DefaultGroupName=psignifit LicenseFile=COPYING InfoBeforeFile=doc-src\WELCOME.rst OutputBaseFilename=psignifit-cli_3_beta_installer OutputDir=WindowsInstaller Compression=lzma SolidCompression=yes ChangesEnvironment=true [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Files] Source: "cli\*.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: installcli; ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{group}\{cm:UninstallProgram,psignifit}"; Filename: "{uninstallexe}" [Types] Name: full; Description: "Full installation"; Name: cli; Description: "Only install the command line interface"; [Components] Name: installcli; Description: "Command line interface (required for the matlab interface)"; Types: full cli; [Tasks] Name: modifypath; Description: Add psignifit-cli to your environment path (Highly recommended); Flags: checkedonce [Code] const ModPathName = 'modifypath'; ModPathType = 'user'; function ModPathDir(): TArrayOfString; begin setArrayLength(Result, 1) Result[0] := ExpandConstant('{app}'); end; #include "modpath.iss" psignifit3-3.0~beta.20120611.1/pypsignifit/000077500000000000000000000000001176542545200200775ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/pypsignifit/__init__.py000066400000000000000000000056231176542545200222160ustar00rootroot00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ Psychometric analysis of psychophysics data in Python. Full documentation available at: http://psignifit.sourceforge.net/ Getting Help ------------ All main classes are documented using docstrings. In ipython you can acces them using the '?' operator: >>> import pypsignifit as psi >>> psi.BayesInference? [...] >>> psi.BootstrapInference? [...] Inference Classes ----------------- * ASIRInference * BayesInference * BootstrapInference Diagnostic Classes ------------------ * ConvergenceMCMC * GoodnessOfFit * ParameterPlot * ThresholdPlot Subpackages ----------- * psignidata * psignierrors * psigniplot * psignipriors """ __docformat__ = "restructuredtext" import sys import subprocess # This is the interface to psi++ import swignifit as interface # This is "real" psignifit from psignidata import * from psigniplot import * # Methods to set default priors import psignipriors # This is to enable display of graphics from pylab import show try: from __version__ import version except ImportError: __version__ = 'Fatal: no version found!' interface.set_seed( 0 ) def set_seed(value): interface.set_seed(value) def dump_info(): """ Print some basic system info. NOTE: This will be extended to a more sophisticated scheme. """ print("psignifit version: \t" + version) print("python version: \t" + sys.version) def __test__ ( ): "If we call the file directly, we perform a test run" import numpy as N import pylab as p import sys if len(sys.argv) == 1 or sys.argv[1] == "bootstrap": bootstrap = True elif sys.argv[1] == "bayes": bootstrap = False x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] d = N.array(zip(x,k,n)) priors = ("flat","flat","Uniform(0,0.1)") if bootstrap: b = BootstrapInference ( d, sample=2000, priors=priors ) GoodnessOfFit(b) ParameterPlot(b) else: priors = ("Gauss(0,4)","Gamma(1,3)","Beta(2,30)") mcmc = BayesInference ( d, sigmoid="cauchy", priors=priors ) mcmc.sample(start=(6,4,.3)) mcmc.sample(start=(1,1,.1)) print "Posterior Intervals",mcmc.getCI() print "Model Evidence", mcmc.evidence print "Rhat (m):",mcmc.Rhat () print "Nsamples:",mcmc.nsamples print "DIC:",mcmc.DIC print "pD:", mcmc.pD GoodnessOfFit(mcmc) for prm in xrange(3): ConvergenceMCMC ( mcmc, parameter=prm ) print mcmc p.show() if __name__ == "__main__": __test__() psignifit3-3.0~beta.20120611.1/pypsignifit/bayes_factor.py000066400000000000000000000132771176542545200231240ustar00rootroot00000000000000#!/usr/bin/env python import numpy as np from swignifit.swignifit_raw import vector_double from pypsignifit import psignidata __doc__ = """This module is intended to perform bayesian model comparison using model posterior probabilities The rationale is the following: Imaginge a number of candidate psychometric function models M1,M2,...Mn. We proceed by treating M as another model parameter and perform gibbs sampling in the parameter space of this metamodel. The function gibbs_model will then give the marginal posterior distribution in model space using gibbs sampling. Interestingly, for this particular gibbs sampler, we can write out an analytical expression for the marginal stationary distribution with respect to M. The function gibbs_analytical determines this marginal distribution. In some applications, we might be interested in fitting more than one psychometric function in each of the models to be compared. This is for example relevant if the feature that distinguishes between the different models is e prior distribution. In this case, we can have each model consist of a sequence of PsiInference objects. Note that the logic of this module only works for Bayesian inference and *not* for a Bootstrap setting. Also be aware that the data that were used for the different models should be the same across M1,M2,...,Mn. """ __all__ = ["gibbs_model","gibbs_analytical"] def sample_model ( theta, inference_objects ): """sample_model ( theta, inference_objects ) Sample a model from the full conditional f(M|theta) :Parameters: *theta* : list of arrays of parameters *inference_objects* : a sequence of inference objects to be sampled from. """ p = np.zeros ( len(inference_objects), 'd' ) th = [ vector_double ( th_ ) for th_ in theta ] for i,model in enumerate ( inference_objects ): if isinstance ( model, psignidata.PsiInference ): p[i] = -model._pmf.neglpost ( th[0], model._data ) elif getattr ( inference_objects, "__iter__", False ): for M,th_ in zip ( model, th ): p[i] -= M._pmf.neglpost ( th_, M._data ) p -= p.mean() # This should stabilize the exponential but should otherwise not change the result (constant factor) p = np.exp ( p ) p /= np.sum ( p ) return int ( np.where ( np.random.multinomial ( 1, p ) )[0] ) def sample_parameter ( inference_object ): """sample_parameter ( inference_object ) reSample a single parameter setting from the model posterior. This is done by randomly selecting one of the samples stored in the inference object. :Parameters: *inference_object* : an inference object from which a parameter sample should be taken """ if isinstance ( inference_object, psignidata.PsiInference ): i = np.random.randint ( len(inference_object.mcdeviance) ) return [inference_object.mcestimates[i,:]] elif getattr ( inference_object, "__iter__", False ): out = [] for model in inference_object: i = np.random.randint ( len(model.mcdeviance) ) out.append ( model.mcestimates[i,:] ) return out else: raise ValueError, "Incorrect input" def gibbs_model ( inference_objects, nsamples=1000, M0=0 ): """gibbs_model ( inference_objects, nsamples=1000 ) Perform Gibbs sampling in the full model P(M,theta). This function will return the marginal distribution across models. :Parameters: *inference_objects* : psychometric function models to be considered. Note that these inference objects have to be based on the same data set in order to obtain valid results. At the moment this is *not* checked! *nsamples* : how many samples are to be generated *M0* : Model to start with """ mpost = np.zeros ( len(inference_objects), 'd' ) chain = np.zeros ( nsamples ) M = M0 for i in xrange ( nsamples ): th = sample_parameter ( inference_objects[M] ) M = sample_model ( th, inference_objects ) mpost[M] += 1 chain[i] = M return mpost,chain def gibbs_analytical ( inference_objects ): """gibbs_analytical ( inference_objects ) Analytically determine the marginal stationary distribution of M in the full model P(M,theta). :Parameters: *inference_objects* : psychometric function models to be compared. Note that these inference objects have to be based on the same data set in order to obtain valid results. """ n = len ( inference_objects ) T = np.zeros ( (n,n), 'd' ) # Set up the transition matrix for k,M in enumerate ( inference_objects ): if isinstance ( M, psignidata.PsiInference ): M = [M] elif getattr ( M, "__iter__", False ): pass else: raise ValueError, "Elements of inference_objects should be either a PsiInference object or a sequence" for j in xrange ( M[0].mcestimates.shape[0] ): th = [ m.mcestimates[j] for m in M ] p = np.exp ( np.array ( [ eval_post ( th, M_l ) for M_l in inference_objects ] ) ) p /= p.sum() T[k] += p T[k] /= T[k].sum() # Now solve the stochastic matrix equation pi*T=pi A = (T-np.eye(n)).T A[0,:] = 1. p = np.zeros ( n, 'd' ) p[0] = 1. return np.linalg.solve ( A, p ),T def eval_post ( theta, M ): if isinstance ( M, psignidata.PsiInference ): M = [M] elif getattr ( M, "__iter__", False ): pass else: raise ValueError, "Elements of inference_objects should be either a PsiInference object or a sequence" return reduce ( lambda x,y: x+y, [ -m._pmf.neglpost ( th, m._data ) for th,m in zip(theta,M) ] ) psignifit3-3.0~beta.20120611.1/pypsignifit/psigcorrect.py000066400000000000000000000123601176542545200227770ustar00rootroot00000000000000#!/usr/bin/env python import numpy as N from scipy.special import polygamma,gamma __doc__ = """This module implements a correction for overdispersion based on a beta-variance model The procedure is described in more detail in documents/correction_of_ci.pdf In short, a beta distribution with the mode given by the fitted psychometric function, and the number of trials scaled by a input independent factor nu is fitted to the data. If a point estimate of the psychometric function has already been obtained, the only free parameter of this model is nu which can be estimated using newton iterations. The estimated nu can be used to correct the confidence intervals obtained from inference that was based on a binomial distribution. Furhtermore, nu can be considered a measure of binomiality of the residuals. """ __all__ = ["estimate_nu"] def l ( nu, psi, k, n ): """log likelihood for psi :Parameters: *nu* : scalar value nu, for which the likelihood should be evaluated *psi* : m array that gives the psychometric function evaluated at stimulus levels x_i, i=1,...,m *k* : m array that gives the numbers of correct responses (in Yes/No: Yes responses) at stimulus levels x_i, i=1,...,m *n* : m array that gives the numbers of presented trials at stimulus levels x_i, i=1,...,m :Example: >>> psi = [ 0.52370051, 0.58115041, 0.70565915, 0.83343107, 0.89467234, 0.91364765, 0.91867512] >>> k = [28, 29, 35, 41, 46, 46, 45] >>> n = [50]*7 >>> l ( 1, psi, k, n ) 13.752858759933943 """ psi = N.array(psi,'d') k = N.array(k,'d') n = N.array(n,'d') p = k/n return (N.log(gamma(nu*n+2))).sum()-(N.log(gamma(psi*nu*n+1))).sum()-(N.log(gamma((1-psi)*nu*n+1))).sum() \ + (psi*nu*n*N.log(p)).sum() + ((1-psi)*nu*n*N.log(1-p)).sum() def dl ( nu, psi, k, n ): """first derivative of the likelihood function with respect to nu :Parameters: *nu* : scalar value nu, for which the likelihood should be evaluated *psi* : m array that gives the psychometric function evaluated at stimulus levels x_i, i=1,...,m *k* : m array that gives the numbers of correct responses (in Yes/No: Yes responses) at stimulus levels x_i, i=1,...,m *n* : m array that gives the numbers of presented trials at stimulus levels x_i, i=1,...,m """ p = k/n return (n*polygamma( 0, nu*n+2 )).sum() \ - (psi*n*polygamma(0,nu*psi*n+1)).sum() \ - ((1-psi)*n*polygamma(0,nu*(1-psi)*n+1)).sum() \ + (psi*n*N.log(p)).sum() \ + ((1-psi)*n*N.log(1-p)).sum() def ddl ( nu, psi, k, n ): """second derivative of the likelihood function with respect to nu :Parameters: *nu* : scalar value nu, for which the likelihood should be evaluated *psi* : m array that gives the psychometric function evaluated at stimulus levels x_i, i=1,...,m *k* : m array that gives the numbers of correct responses (in Yes/No: Yes responses) at stimulus levels x_i, i=1,...,m *n* : m array that gives the numbers of presented trials at stimulus levels x_i, i=1,...,m """ return (n**2*polygamma( 1, nu*n+2)).sum() \ - (psi**2*n**2*polygamma(1,nu*psi*n+1)).sum() \ - ((1-psi)**2*n**2*polygamma(1,nu*(1-psi)*n+1)).sum() def estimate_nu ( InferenceObject ): """Perform a couple of newton iterations to estimate nu :Parameters: *InferenceObject* : An Inference object (either Bayes- or Bootstrap) for which the nu parameter should be estimated :Return: nu,nu_i,l_i *nu* : estimated nu parameter *nu_i* : sequence of nu values during optimization *l_i* : sequence of likelihoods associated with the nu values """ psi = InferenceObject.evaluate ( InferenceObject.data[:,0] ) k = InferenceObject.data[:,1].astype('d') n = InferenceObject.data[:,2].astype('d') k = N.where ( k==n, k-.01, k ) k = N.where ( k==0, .01, k ) nu = 1. nu_i = [nu] l_i = [l(nu,psi,k,n)] for i in xrange(10): nu -= dl(nu,psi,k,n)/ddl(nu,psi,k,n) if nu>1: nu=1 elif nu<0: nu=0 nu_i.append ( nu ) l_i.append ( l(nu,psi,k,n) ) return nu, nu_i, l_i def main ( ): # An Example of usage from pypsignifit import BootstrapInference from pypsignifit.psigobservers import BetaBinomialObserver import pylab as p O = BetaBinomialObserver ( 4, 1, .02, 10 ) d = N.array ( O.DoAnExperiment( [1,2,3,4,5,6,7] ) ) B = BootstrapInference ( d, priors=("","","Uniform(0,.1)")) psi = B.evaluate ( B.data[:,0] ) k = B.data[:,1].astype('d') n = B.data[:,2].astype('d') x = N.mgrid[0.001:0.999:100j] ll = [] for xx in x: ll.append ( l(xx,psi,k,n) ) print ll[-1] p.plot(x,ll,'b-') nu,nu_i,l_i = estimate_nu ( B ) p.plot ( nu_i, l_i, 'ro' ) p.show() if __name__ == "__main__": # main() import doctest doctest.testmod() psignifit3-3.0~beta.20120611.1/pypsignifit/psignidata.py000066400000000000000000003025641176542545200226060ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### __docformat__ = "restructuredtext" import sys,os,re import operator import numpy as N import pylab as p from scipy import stats,special,optimize import pypsignifit from pypsignifit import psignipriors interface = pypsignifit.interface import swignifit.swignifit_raw as sft import swignifit.utility as sfu import pygibbsit from psignierrors import NosamplesError __all__ = ["BootstrapInference","BayesInference","ASIRInference"] __doc__ = """ This module contains data objects to store psychophysical data and perform inference on them. Two general approaches have been suggested to fit psychometric functions 1. *Constrained maximum likelihood (Wichmann & Hill, 2001a,b)* This procedure starts by fitting a psychometric function to the data and then performs parametric bootstrap to obtain confidence intervals for parameters, associated thresholds,... This approach is implemented by the :BootstrapInference: class. 2. *Baysian Inference (Kuss et al., 2005)* This procedure starts with a number of prior distributions for each of the models parameters and then uses Bayes rule to derive the posterior distribution from the data. As the posterior distribution can only be determined up to a normalization constant, inference on the posterior distribution has to be based on samples. These samples are typically obtained using Markoc Chain Monte Carlo (MCMC). This approach is implemented in the :BayesInference: class. The module also defines a :PsiInference: base class. """ warnred = [.7,0,0] # Checking keyword arguments def check_kwargs ( kwargs, docstring ): """This function checks that a kwargs dictionary only contains keywords that are documented in the docstring It returns 0 if everything is ok otherwise, it returns the first nonmatching parameter""" parametersection = re.search ( r":Parameters:(.*)(:\w+:|$)", docstring, re.DOTALL ) if parametersection is None: raise ValueError, "Docstring does not contain a parameter section" parameters = re.findall ( r"\*(\w+)\* :", parametersection.group(1) ) for k in kwargs.keys(): if not k in parameters: return k return 0 # Helper function to create properties with one function def Property(function): keys = 'fget', 'fset', 'fdel' func_locals = {'doc':function.__doc__} def probeFunc(frame, event, arg): if event == 'return': locals = frame.f_locals func_locals.update(dict((k,locals.get(k)) for k in keys)) sys.settrace(None) return probeFunc sys.settrace(probeFunc) function() return property(**func_locals) ############################################################################################################################## class PsiInference ( object ): def __init__ ( self, plotting=None ): """This is just a dummy function""" self.data = None self.model = { "sigmoid": "logistic", "core": "ab", "priors": None, "nafc": 2, "gammaislambda": False } self.estimate = None self.deviance = None self.devianceresiduals = None self.Rpd = None self.Rkd = None self.__outl = None self.__infl = None if plotting is None: self.__plotting = {} else: self.__plotting = plotting defaults = {"label": "Psychometric function fit","color": "b", "linestyle": "-", "marker": "o", "linewidth": 1 } for k in defaults.keys(): self.__plotting.setdefault ( k, defaults[k] ) self._data,self._pmf,self.nparams = sfu.make_dataset_and_pmf ( [[1,2,3]], self.model["nafc"], self.model["sigmoid"], self.model["core"], self.model["priors"], gammaislambda=self.model["gammaislambda"] ) def evaluate ( self, x, prm=None ): """Evaluate the psychometric function model at positions given by x""" if prm==None: prm = self.estimate if not operator.isSequenceType ( x ): x = [x] return N.array ( [self._pmf.evaluate ( xx, prm ) for xx in x] ) def getThres ( self, cut=0.5 ): """Get thresholds at cut""" if self.data == None: raise NotImplementedError return float(self._pmf.getThres ( self.estimate, cut )) def getSlope ( self, cut=0.5 ): """Get slope at cut""" if self.data == None: raise NotImplementedError return float ( self._pmf.getSlope ( self.estimate, self.getThres(cut) )) def __repr__ ( self ): return "< PsiInference object >" desc = property ( fget=lambda self: "sigmoid: %(sigmoid)s\ncore: %(core)s\nnAFC: %(nafc)d" % self.model, doc="A short description of the employed model") outl = property ( fget=lambda self: self.__outl, doc="A boolean array indicating whether or not a block was an outlier" ) infl = property ( fget=lambda self: self.__infl, doc="A boolean array indicating whether or not a block was an influential observation" ) @Property def label (): "Condition label used in plots" def fget ( self ): return self.__plotting["label"] def fset ( self, v ): self.__plotting["label"] = v @Property def color (): "Color used in plots" def fget ( self ): return self.__plotting["color"] def fset ( self, v ): self.__plotting["color"] = v @Property def linestyle (): "Linestyle used in plots" def fget ( self ): return self.__plotting["linestyle"] def fset ( self, v ): self.__plotting["linestyle"] = v @Property def linewidth (): "Linewidth used in plots" def fget ( self ): return self.__plotting["linewidth"] def fset ( self ): self.__plotting["linewidth"] = v @Property def marker (): "Data marker used in plots" def fget ( self ): return self.__plotting["marker"] def fset ( self, v ): self.__plotting["marker"] = v def __getstate__ ( self ): state = self.__dict__.copy() del state['_pmf'] del state['_data'] return state def __setstate__ ( self, state ): self.__dict__.update(state) self._data,self._pmf,self.nparams = sfu.make_dataset_and_pmf ( self.data, self.model["nafc"], self.model["sigmoid"], self.model["core"], self.model["priors"], gammaislambda=self.model["gammaislambda"] ) ############################################################################################################################## class BootstrapInference ( PsiInference ): def __init__ ( self, data, sample=False, cuts=(.25,.5,.75), conf=(.025,.975), plotprm=None, **kwargs ): """Set up an object of bootstrapped data :Parameters: *data* : an array or a list of lists containing stimulus intensities in the first column, number of correct responses (nAFC) or number of YES- responses in the second column, and number of trials in the third column. Each row should correspond to one experimental block. In addition, the sequence of the rows is taken as the sequence of data aquisition. Alternatively, the relative frequencies of correct responses resp YES responses can be given. *sample* : if sample is True, bootstrap samples are drawn. If sample is an integer, it gives the number of samples that are drawn *sigmoid* : shape of the sigmoid function. Valid choices are - 'logistic' [Default] - 'gauss' - 'gumbel_l' - 'gumbel_r' - 'exp' *core* : term inside the sigmoid function. Valid choices are - 'ab' (x-a)/b [Default] - 'mw%g' midpoint and width - 'linear' a+b*x - 'log' a+b*log(x) - 'weibull' 2*s*m*(log(x)-log(m))/log(2) + log(log(2)) This will give you a weibull if combined with the gumbel_l sigmoid and a reverse weibull if combined with the gumbel_r sigmoid. - 'poly' (x/a)**b Will give you a weibull if combined with an exp sigmoid *priors* : a list of prior names. Valid choices are - 'Uniform(%g,%g)' Uniform distribution on an interval - 'Gauss(%g,%g)' Gaussian distribution with mean and standard deviation - 'Beta(%g,%g)' Beta distribution - 'Gamma(%g,%g)' Gamma distribution - 'nGamma(%g,%g)' Gamma distribution on the negative axis If no valid prior is selected, the parameter remains unconstrained. Alternatively, priors can be given as a dictionary that only specifies priors for those parameters you want to set in that case you can use 'a','b','m','w','guess','gamma','lapse','lambda' as keys. *nafc* : number of response alternatives. If nafc==1, this indicates a Yes/No task *cuts* : performance values that should be considered 'thresholds'. This means that a 'cut' of 0.5 corresponds to an expected performance of roughly 75%% correct in a 2AFC task. *conf* : limits of confidence intervals. The default gives 95%% confidence intervals. Any other sequence can be used alternatively. In addition, conf can be 'v1.0' to give the default values of the classical psignifit version (i.e. .023,.159,.841,.977, corresponding to -2,-1,1,2 standard deviations for a gaussian). *parametric* : a boolean indicating wether or not parametric bootstrap should be used *plotprm* : a dictionary to take parameters for plotting data. Currently supported are the arguments 'label', 'color', 'linestyle', 'linewidth' and 'marker'. These can all be set after creating an Inference instance, too. By using the respective properties. *gammaislambda* : constrain guessing and lapsing rate to have the same values :Example: Estimate a psychometric function from some example data and derive bootstrap confidence intervals for a threshold >>> x = [0,2,4,6,8,10] >>> k = [26,30,38,46,50,49] >>> n = [50]*len(k) >>> B = BootstrapInference ( zip(x,k,n), priors=("flat","flat","Uniform(0,0.1)"), sample=True ) >>> B.estimate array([ 3.80593409, 1.09308994, 0.00935698]) >>> B.deviance 2.5160989036891754 >>> B.getThres() 3.805934094097025 >>> B.getCI(1) array([ 2.79484448, 4.73796576]) """ if check_kwargs ( kwargs, BootstrapInference.__init__.__doc__ ): msg = "Unknown parameter '%s'. See docstring for valid arguments" % ( check_kwargs ( kwargs, BootstrapInference.__init__.__doc__ ), ) raise ValueError, msg # Call the base constructor PsiInference.__init__(self,plotprm) self.__nsamples = 0 start = kwargs.setdefault ( "start", None ) kwargs.pop("start") # Store basic data self.data = N.array(data,'d') if self.data[:,1].max() <= 1: # We have relative frequencies self.data[:,1] *= self.data[:,2] self.data[:,1] = N.floor ( self.data[:,1] ) self.model = { "sigmoid": kwargs.setdefault("sigmoid","logistic"), "core": kwargs.setdefault("core", "ab"), "priors": kwargs.setdefault("priors", None), "nafc": kwargs.setdefault("nafc", 2), "gammaislambda": kwargs.setdefault("gammaislambda", False) } self._data,self._pmf,self.nparams = sfu.make_dataset_and_pmf ( self.data, self.model["nafc"], self.model["sigmoid"], self.model["core"], self.model["priors"], gammaislambda=self.model["gammaislambda"] ) self.parametric = kwargs.setdefault ( "parametric", True ) if self.model["core"][:2] == "mw": self.parnames = ["m","w"] elif self.model["core"] == "weibull": self.parnames = ["m","s"] else: self.parnames = ["a","b"] self.parnames.append("lambda") if self.model["nafc"]<2: self.parnames.append("guess") if cuts is None: self.cuts = (.25,.5,.75) elif getattr ( cuts, "__iter__", False ): self.cuts = cuts elif isinstance ( cuts, float ): self.cuts = (cuts,) else: raise ValueError, "'cuts' should be a sequence or a float" if conf=="v1.0": self.conf = (0.023, 0.159, 0.841, 0.977) else: self.conf = conf # Store point estimates self.estimate,self.fisher,self.thres,self.slope,self.deviance = interface.mapestimate(self.data,cuts=self.cuts,start=start,**self.model) self.predicted,self.devianceresiduals,self.deviance,thres,slope,self.Rpd,self.Rkd = interface.diagnostics(self.data,self.estimate, \ nafc=self.model["nafc"],sigmoid=self.model["sigmoid"],core=self.model["core"],cuts=self.cuts,gammaislambda=self.model["gammaislambda"]) # The interface arrays are not numpy arrays self.estimate = N.array(self.estimate) self.predicted = N.array(self.predicted) self.devianceresiduals = N.array(self.devianceresiduals) # Bootstrap parameters are empty first self.__bdata = None self.__bestimate = None self.__bdeviance = None self.__bRpd = None self.__bRkd = None self.__outl = None self.__infl = None self.__bthres = None self.__th_bias = None self.__th_acc = None self.__bslope = None self.__sl_bias = None self.__sl_acc = None self.__expanded = False # If we want direct sampling this is done here if sample: if isinstance(sample,bool): self.sample () elif isinstance(sample,int): if sample>0: self.sample (sample) else: raise ValueError, "Negative number of bootstrap samples selected" else: self.__nsamples = 0 def sample ( self, Nsamples=2000 ): """Draw bootstrap samples :Parameters: *Nsamples* : number of bootstrapsamples to be drawn """ self.__nsamples = Nsamples # print self.estimate self.__bdata,self.__bestimate,self.__bdeviance,self.__bthres,self.__th_bias,self.__th_acc,self.__bslope,self.__sl_bias,self.__sl_acc, \ self.__bRpd,self.__bRkd,self.__outl,self.__infl = interface.bootstrap(self.data,self.estimate,Nsamples, cuts=self.cuts,**self.model) if not self.parametric: self.sample_nonparametric ( Nsamples ) # Cast sampled data to numpy arrays self.__bdata = N.array(self.__bdata) self.__bestimate = N.array(self.__bestimate) self.__bdeviance = N.array(self.__bdeviance) self.__bthres = N.array(self.__bthres) self.__th_bias = N.array(self.__th_bias) self.__th_acc = N.array(self.__th_acc) self.__bslope = N.array(self.__bslope) self.__sl_bias = N.array(self.__sl_bias) self.__sl_acc = N.array(self.__sl_acc) self.__bRkd = N.array(self.__bRkd) self.__bRpd = N.array(self.__bRpd) self.__outl = N.array(self.__outl,dtype=bool) self.__infl = N.array(self.__infl) def sample_nonparametric ( self, Nsamples=2000 ): """Draw nonparametric bootstrap samples :Parameters: *Nsamples* : number of bootstrapsamples to be drawn """ self.__bdata,self.__bestimate,dev,self.__bthres,self.__th_bias,self.__th_acc,self.__bslope,self.__sl_bias,self.__sl_acc,\ Rkd,Rpd,outl,infl = interface.bootstrap(self.data,self.estimate,Nsamples, cuts=self.cuts,parametric=False,**self.model) def getCI ( self, cut, conf=None, thres_or_slope="thres" ): """Determine the confidence interval of a cut :Parameters: *cut* : index(!) of the cut of interest *conf* : levels of confidence (default, levels taken from the object) *thres_or_slope* : determine confidence intervals for threshold or for slope """ if conf is None: conf = self.conf elif isinstance ( conf, float ): conf = [conf] elif isinstance ( conf, int ): conf = [self.conf[conf]] # if cut is a float, determine the index of the cut if isinstance ( cut, float ): try: cut = list(self.cuts).index(cut) except ValueError: raise ValueError, "cut is not in internal list of cuts which would be required for evaluation of BCa confidence intervals" if self.__expanded: ci = [] for c in conf: k = self.__expandedConf.index(round(c,6)) w = max(1-2*c,1-(1-c)*2) w = list(self.__expandedWidths).index(round(w,6)) if thres_or_slope[0]=="t": ci.append(self.__expandedCI_th[cut,w,k]) elif thres_or_slope[0]=="s": ci.append(self.__expandedCI_sl[cut,w,k]) return N.array(ci) if thres_or_slope[0] == "t": bias = self.__th_bias[cut] acc = self.__th_acc[cut] vals = [] for pp in conf: vals.append(stats.norm.cdf( bias + ( stats.norm.ppf(pp) + bias ) / (1-acc*(stats.norm.ppf(pp) + bias )) )) return p.prctile ( self.__bthres[:,cut], 100*N.array(vals) ) elif thres_or_slope[0] == "s": bias = self.__sl_bias[cut] acc = self.__sl_acc[cut] vals = [] for pp in conf: vals.append(stats.norm.cdf( bias + ( stats.norm.ppf(pp) + bias ) / (1-acc*(stats.norm.ppf(pp) + bias )) )) return p.prctile ( self.__bslope[:,cut], 100*N.array(vals) ) else: raise ValueError, "Unknown value for thres_or_slope: %s" % (str(thres_or_slope),) def __repr__ ( self ): return "< BootstrapInference object with %d blocks and %d samples >" % ( self.data.shape[0], self.nsamples ) def sensitivity_analysis ( self, conf=0.95, Nsamples=2000, Npoints=8, verbose=True ): """Perform sensitivity_analysis to obtain expanded bootstrap intervals Sensitivity analysis is a strategy to expand bootstrap confidence intervals. Typically, the expanded bootstrap confidence intervals are more realistic than the unexpanded confidence intervals. The function fits a gaussian kernel density estimator to the joint distribution of the first two parameters (those that determine the shape of the psychometric function) and determines a number of points on the 68% contour of this estimated density. For each of these points bootstrap confidence intervals are estimated. The final bootstrap confidence intervals are then defined as the widest of these confidence intervals. After calling sensitivity_analysis() the getCI() method will give the expanded BCa confidence intervals. :Parameters: *conf* : desired confidence. Note that this is the "width" of the confidence interval, not the edges. This is necessary because sensitivity_analysis is used to expand the widths of the confidence intervals. It is ambiguous how percentiles of the bootstrap distribution would be modified by sensitivity_analysis. *Nsamples* : number of bootstrap samples per data point *Npoints* : number of points on the contour at which to perform a new bootstrap run :Output: *expandedCI*: an array of expanded confidence intervals *expansionPoints*: an array of coordinates of the points at which additional bootstrap samples were drawn """ if self.__expanded: return N.array(self.__expandedCI_th),N.array(self.__expandedCI_sl),N.array(self._expansionPoints) if self.mcestimates is None: # We need an initial run self.sample ( Nsamples ) al,bt = self.estimate[:2] prm0 = N.array([al,bt]) if isinstance ( conf, float ): conf = [conf] # Now fit the confidence with a kde contour = self.mcdensity maxcont = contour.evaluate ( N.array( [al,bt] ) ) # Determine unexpanded CI self.__expandedCI_th = [] self.__expandedCI_sl = [] for l,cut in enumerate(self.cuts): self.__expandedConf = [] self.__expandedCI_th.append([]) self.__expandedCI_sl.append([]) for prob in conf: pprob = 1.-prob p1,p2 = 0.5*pprob,1-0.5*pprob self.__expandedCI_th[-1].append( self.getCI ( l, (p1,p2), thres_or_slope="thres" )-self.thres[l] ) self.__expandedCI_sl[-1].append( self.getCI ( l, (p1,p2), thres_or_slope="slope" )-self.slope[l] ) self.__expandedConf += [round(p1,6),round(p2,6)] self.__expandedCI_th = N.array(self.__expandedCI_th) self.__expandedCI_sl = N.array(self.__expandedCI_sl) self.__expandedWidths = N.array(conf) # Expand self._expansionPoints = [] for k in xrange(Npoints): # The next point in parameter space phi = float(2*N.pi*k) / Npoints searchaxis = N.array([N.cos(phi),N.sin(phi)]) x0,x1 = 0.,max(self.mcestimates[:,0].max()-al,self.mcestimates[:,1].max()-bt) def f ( prm ): coeffs = prm0+searchaxis*prm return contour.evaluate(coeffs)-0.68*maxcont while f(x0)*f(x1)>=0: x0 = x1 x1 *= 2 # We use bisections to find the point on the surface that gives 0.68 the density of the maximum try: a = optimize.bisect ( f, x0, x1 ) except RuntimeError: # This is definitely a Hack: a has to be between x0 and x1 a = 0.5*(x0+x1) self._expansionPoints.append(a*searchaxis+prm0) if verbose: sys.stderr.write("Bootstrapping point %d ... " % (k,)) sys.stderr.flush() # Perform bootstrap on this next point fullprm = self.estimate.copy() fullprm[:2] = self._expansionPoints[-1] fullprm = sfu.get_start ( fullprm, len(fullprm) ) fullthres = [self._pmf.getThres ( fullprm, cut ) for cut in self.cuts] fullslope = [self._pmf.getSlope ( fullprm, th ) for th in fullthres] # Perform bootstrap without full conversion of data cuts = sfu.get_cuts(self.cuts) bs_list = sft.bootstrap(self.nsamples, self._data, self._pmf, cuts, fullprm, True, self.parametric) thresholdCI = [] slopeCI = [] for l,cut in enumerate(self.cuts): for pp,prob in enumerate(conf): # Transform confidence to upper and lower limits pprob = 1.-prob p1,p2 = 0.5*pprob,1-0.5*pprob # Determine BCa-confidence intervals thresholdCI = N.array ( [bs_list.getThres ( p1, l ), bs_list.getThres ( p2, l )] ) - fullthres[l] slopeCI = N.array ( [bs_list.getSlope ( p1, l ), bs_list.getSlope ( p2, l )] ) - fullslope[l] # If this confidence interval is larger than the original one, we expand the CI if thresholdCI[0] %g\n" % \ (self.__expandedCI_th[l,pp,0]+self.thres[l], thresholdCI[0]+self.thres[l]) ) self.__expandedCI_th[l,pp,0] = thresholdCI[0] if thresholdCI[1]>self.__expandedCI_th[l,pp,1]: if verbose: sys.stderr.write("th_u+ (%g,%g):\n" % (cut,prob)) sys.stderr.write(" %g -> %g\n" % \ (self.__expandedCI_th[l,pp,1]+self.thres[l], thresholdCI[1]+self.thres[l]) ) self.__expandedCI_th[l,pp,1] = thresholdCI[1] if slopeCI[0] %g\n" % \ (self.__expandedCI_sl[l,pp,0]+self.slope[l], slopeCI[0]+self.slope[l]) ) self.__expandedCI_sl[l,pp,0] = slopeCI[0] if slopeCI[1]>self.__expandedCI_sl[l,pp,1]: if verbose: sys.stderr.write("sl_u+ (%g,%g):\n" % (cut,prob)) sys.stderr.write(" %g -> %g\n" % \ (self.__expandedCI_sl[l,pp,1]+self.slope[l], slopeCI[1]+self.slope[l]) ) self.__expandedCI_sl[l,pp,1] = slopeCI[1] if verbose: sys.stderr.write("\n") sys.stderr.flush() # Now we add the threshold back to the ci for l,cut in enumerate(self.cuts): for pp in xrange ( len(conf) ): self.__expandedCI_th[l,pp,:] += self.thres[l] self.__expandedCI_sl[l,pp,:] += self.slope[l] # Store that we have expanded the CIs self.__expanded = True return N.array(self.__expandedCI_th),N.array(self.__expandedCI_sl),N.array(self._expansionPoints) outl = property ( fget=lambda self: self.__outl, doc="A boolean vector indicating whether a block should be considered an outlier" ) infl = property ( fget=lambda self: self.__infl, doc="A boolean vector indicating whether a block should be considered an influential observation" ) mcestimates = property ( fget=lambda self: self.__bestimate, doc="An array of bootstrap estimates of the fitted paramters" ) mcdeviance = property ( fget=lambda self: self.__bdeviance, doc="A vector of bootstrapped deviances" ) mcRpd = property ( fget=lambda self: self.__bRpd, doc="A vector of correlations between model prections and deviance residuals in all bootstrap samples" ) mcRkd = property ( fget=lambda self: self.__bRkd, doc="A vector of correlations between block index and deviance residuals in all bootstrap samples" ) mcthres = property ( fget=lambda self: self.__bthres, doc="Thresholds of the bootstrap replications" ) mcslope = property ( fget=lambda self: self.__bslope, doc="Slopes of the bootstrap replications" ) mcdensity = property ( fget=lambda self: stats.kde.gaussian_kde ( self.mcestimates[N.logical_and(self.mcestimates[:,0]<10000,self.mcestimates[:,1]<10000),:2].T ), doc="A gaussian kernel density estimate of the joint density of the first two parameters of the model" ) inference = property ( fget=lambda self: "CML-MC", doc="Type of inference performed by the object" ) @Property def nsamples (): """number of bootstrap samples (setting this attribute results in resampling!!!)""" def fget ( self ): return self.__nsamples def fset ( self, n ): self.__nsamples = n self.sample ( self.__nsamples ) ############################################################################################################################## class BayesInference ( PsiInference ): def __init__ ( self, data, sample=True, cuts=(.25,.5,.75), conf=(.025,.975), automatic=True, resample=False, plotprm=None, sampler="metropolis", **kwargs ): """Bayesian Inference for psychometric functions using MCMC :Parameters: *data* : an array or a list of lists containing stimulus intensities in the first column, number of correct responses (nAFC) or number of YES- responses in the second column, and number of trials in the third column. Each row should correspond to one experimental block. In addition, the sequence of the rows is taken as the sequence of data aquisition. *sample* : if sample is True, bootstrap samples are drawn. If sample is an integer, it gives the number of samples that are drawn *sigmoid* : shape of the sigmoid function. Valid choices are - 'logistic' [Default] - 'gauss' - 'gumbel_l' - 'gumbel_r' - 'exp' *core* : term inside the sigmoid function. Valid choices are - 'ab' (x-a)/b [Default] - 'mw%g' midpoint and width - 'linear' a+b*x - 'log' a+b*log(x) - 'weibull' 2*s*m*(log(x)-log(m))/log(2) + log(log(2)) This will give you a weibull if combined with the gumbel_l sigmoid and a reverse weibull if combined with the gumbel_r sigmoid. - 'poly' (x/a)**b Will give you a weibull if combined with an exp sigmoid *priors* : a list of prior names. Valid choices are - 'Uniform(%g,%g)' Uniform distribution on an interval - 'Gauss(%g,%g)' Gaussian distribution with mean and standard deviation - 'Beta(%g,%g)' Beta distribution - 'Gamma(%g,%g)' Gamma distribution - 'nGamma(%g,%g)' Gamma distribution on the negative axis If no valid prior is selected, the parameter remains unconstrained. Alternatively, priors can be given as a dictionary that only specifies priors for those parameters you want to set in that case you can use 'a','b','m','w','guess','gamma','lapse','lambda' as keys. Alternatively, this may be the keyword 'Jeffreys' to indicate that Jeffrey's noninformative prior should be used. Note that evaluation of Jeffrey's prior is computationally more expensive than the other priors. *nafc* : number of response alternatives. If nafc==1, this indicates a Yes/No task *cuts* : performance values that should be considered 'thresholds'. This means that a 'cut' of 0.5 corresponds to an expected performance of roughly 75%% correct in a 2AFC task. *conf* : limits of confidence intervals. The default gives 95%% confidence intervals. Any other sequence can be used alternatively. In addition, conf can be 'v1.0' to give the default values of the classical psignifit version (i.e. .023,.159,.841,.977, corresponding to -2,-1,1,2 standard deviations for a gaussian). *automatic* : do everything automatically *resample* : if a chain is considered "bad" in terms of convergence should it automatically be resampled? *plotprm* : a dictionary to take parameters for plotting data. Currently supported are the arguments 'label', 'color', 'linestyle', 'linewidth' and 'marker'. These can all be set after creating an Inference instance, too. By using the respective properties. *gammaislambda* : constrain guessing and lapsing rate to have the same values *verbose* : print status messages *sampler* : sampler to be used. This could be either 'generic' for the generic MetropolisGibbs sampler proposed by Raftery & Lewis, or 'metropolis' for standard metropolis sampling, or 'independence' for independence sampling based on the prior (or suggested prior). *stepwidths* : stepwidths for the sampler, a pilot sample, or the proposal distributions for independence sampling *maxnsamples* : limit the number of samples to this value :Example: Use MCMC to estimate a psychometric function from some example data and derive posterior intervals for a threshold >>> x = [0,2,4,6,8,10] >>> k = [26,30,38,46,50,49] >>> n = [50]*len(k) >>> mcmc = BayesInference ( zip(x,k,n), priors=("Gauss(0,5)","Gamma(1,4)","Beta(2,50)") ) >>> mcmc.sample ( start=3*mcmc.estimate ) >>> mcmc.sample ( start=0.1*mcmc.estimate ) >>> mcmc.estimate array([ 3.64159245, 5.13138577, 0.02117899]) >>> mcmc.deviance 3.2953368439616186 >>> mcmc.getThres() 3.6522408270087667 >>> mcmc.getCI()[1] array([ 2.65917603, 3.68535429, 4.56688308]) """ if check_kwargs ( kwargs, BayesInference.__init__.__doc__ ): msg = "Unknown parameter '%s'. See docstring for valid arguments" % (check_kwargs(kwargs, BayesInference.__init__.__doc__ ),) raise ValueError, msg PsiInference.__init__(self,plotprm) # Store basic data self.data = N.array(data,'d') if self.data[:,1].max() <= 1: # We have relative frequencies self.data[:,1] *= self.data[:,2] self.data[:,1] = N.floor ( self.data[:,1] ) self.model = { "sigmoid": kwargs.setdefault("sigmoid","logistic"), "core": kwargs.setdefault("core", "mw0.1"), "priors": kwargs.setdefault("priors", None), "nafc": kwargs.setdefault("nafc", 2), "gammaislambda": kwargs.setdefault("gammaislambda", False) } self.retry = resample self._proposal = kwargs.setdefault ( "stepwidths", None ) self._data,self._pmf,self.nparams = sfu.make_dataset_and_pmf ( self.data, self.model["nafc"], self.model["sigmoid"], self.model["core"], self.model["priors"], gammaislambda=self.model["gammaislambda"] ) if self.model["core"][:2] == "mw": self.parnames = ["m","w"] elif self.model["core"] == "weibull": self.parnames = ["m","s"] else: self.parnames = ["a","b"] self.parnames.append("lambda") if self.model["nafc"]<2: self.parnames.append("guess") self.afac = kwargs.setdefault ( "afac", 0.4 ) self.mapestimate,self.fisher,thres,slope,self.mapdeviance = interface.mapestimate(self.data,start=None,**self.model) if cuts is None: self.cuts = (.25,.5,.75) elif getattr ( cuts, "__iter__", False ): self.cuts = cuts elif isinstance ( cuts, float ): self.cuts = (cuts,) else: raise ValueError, "'cuts' should be a sequence or a float" self.Ncuts = len(self.cuts) deviance_residuals = self._pmf.getDevianceResiduals ( self.mapestimate, self._data ) self.Rpd = self._pmf.getRpd ( deviance_residuals, self.mapestimate, self._data ) self.Rkd = self._pmf.getRkd ( deviance_residuals, self._data ) self.__meanestimate = None self.__meandeviance = None self.__mcmc_chains = [] self.__mcmc_deviances = [] self.__mcmc_posterior_predictives = [] self.__mcmc_posterior_predictive_deviances = [] self.__mcmc_posterior_predictive_Rpd = [] self.__mcmc_posterior_predictive_Rkd = [] self.__mcmc_logposterior_ratios = [] self.__pRpd = None self.__pRkd = None self.__pthres = None self.__pslope = None self.conf = conf self.burnin = 0 self.thin = 1 self.nsamples = None if sampler == "generic": self._sampler = "GenericMetropolis" elif sampler == "metropolis": self._sampler = "MetropolisHastings" elif sampler == "independence": self._sampler = "DefaultMCMC" else: raise ValueError, "Unknown sampler: %s" % (sampler,) # We assume that parameter variation is proportional to the # estimated parameters self._steps = 0.1*self.mapestimate * 500/N.sum(self.data[:,2]) # print self._steps self._maxnsamples = kwargs.setdefault ( 'maxnsamples', None ) assert self._maxnsamples > 0 or self._maxnsamples is None if automatic: self.__determineoptimalsampling (verbose=kwargs.setdefault("verbose",False)) sample = True if sample: self.sample() def sample ( self, Nsamples=None, start=None ): """Draw samples from the posterior distribution using MCMC :Parameters: *Nsamples* : number of samples that should be drawn from the posterior. If Nsamples is None, an optimal number of samples is tried to obtain. *start* : starting value of the chain. If this is None, the chain starts at the MAP estimate. However, if you sample multiple chains, you might want to start from different (overdispersed) starting values to diagnose convergence """ if isinstance (Nsamples,int): self.nsamples = Nsamples elif Nsamples is None: Nsamples = self.nsamples+self.burnin else: Nsamples = 10000 if start is None: start = self.mapestimate if self._sampler == "DefaultMCMC": steps_or_proposal = self._proposal else: steps_or_proposal = self._steps chain,deviance,ppdata,ppdeviances,ppRpd,ppRkd,logpostratios,accept_rate = interface.mcmc ( self.data, start, Nsamples, stepwidths=steps_or_proposal, sampler=self._sampler, **self.model ) print "Acceptance:",accept_rate self.__mcmc_chains.append(N.array(chain)) self.__mcmc_deviances.append(N.array(deviance)) self.__mcmc_posterior_predictives.append(N.array(ppdata)) self.__mcmc_posterior_predictive_deviances.append(N.array(ppdeviances)) self.__mcmc_posterior_predictive_Rpd.append (N.array(ppRpd)) self.__mcmc_posterior_predictive_Rkd.append (N.array(ppRkd)) self.__mcmc_logposterior_ratios.append (N.array(logpostratios) ) self.__recomputeCorrelationsAndThresholds() # Resample if bad (i.e. chains did not converge properly according to geweke criterion) # This is currently off by default if self.retry: nprm = self.mapestimate.shape[0] resampled = 0 while True: if resampled > 5: raise SamplingError, "Resampling did not yield a converging chain after 5 tries" for k in xrange ( nprm ): allok = True ok,z,bad = self.geweke ( k ) if not bad is None: # print "Resampling" for b in bad: self.resample ( b ) resampled += 1 break else: allok = allok and ok if allok==True: break def resample ( self, chain, Nsamples=None, start=None ): """Replace a chain :Parameters: *chain* : index of the chain to be replaced *Nsamples* : number of posterior samples to be drawn. Default is to take the same number of samples *start* : starting value for the chain. Default is to take the same starting value as for the previous chain. If an integer is given as the starting value, this will be interpreted as the position of the old chain at which the new starting value can be found. """ if isinstance (Nsamples,int): self.nsamples = Nsamples elif Nsamples is None: Nsamples = self.__mcmc_chains[chain].shape[0] else: Nsamples = self.nsamples if start is None: start = self.__mcmc_chains[chain][0,:] elif isinstance (Nsamples,int): start = self.__mcmc_chains[chain][start,:] if self._sampler == "DefaultMCMC": steps_or_proposal = self._proposal else: steps_or_proposal = self._steps mcchain,deviance,ppdata,ppdeviances,ppRpd,ppRkd,logpostratios,accept_rate = interface.mcmc ( self.data, start, Nsamples, stepwidths=steps_or_proposal, sampler=self._sampler, **self.model ) print "Acceptance:",accept_rate self.__mcmc_chains[chain] = N.array(mcchain) self.__mcmc_deviances[chain] = N.array(deviance) self.__mcmc_posterior_predictives[chain] = N.array(ppdata) self.__mcmc_posterior_predictive_deviances[chain] = N.array(ppdeviances) self.__mcmc_posterior_predictive_Rpd[chain] = N.array(ppRpd) self.__mcmc_posterior_predictive_Rkd[chain] = N.array(ppRkd) self.__mcmc_logposterior_ratios[chain] = N.array(logpostratios) self.__recomputeCorrelationsAndThresholds() def bayesian_p ( self, quantity="deviance" ): """Bayesian p value associated with a given quantity The Bayesian p value of a model compares posterior predictives with the observed data. If the observed data are very unequal to the posterior predictives, this indicates that the model does not describe the data well. To compare observed data and simulated data (posterior predictives), it is common to derive a quantity of interest from the posterior predictives. The Bayesian p value is between 0 and 1 and values close to 0 and close to 1 indicate bad model fit. This p value can be interpreted like a two sided test. :Parameters: *quantity* : This is the quantity do be derived. By default only deviance, Rpd and Rkd are available. If quantity is a function, this will be called on every data set and the respective p value will be calculated. The call on every data set takes two arguments: 1. a nblocksX3 array of data and 2. a parameter vector. This way any other transformation of the data can be realized. :Output: the bayesian p-value """ if isinstance ( quantity, str ): if quantity.lower() == "deviance": return N.mean ( (self.ppdeviance-self.mcdeviance)>=0 ) elif quantity.lower() == "rpd": return N.mean ( (self.ppRpd-self.mcRpd)>=0 ) elif quantity.lower() == "rkd": return N.mean ( (self.ppRkd-self.mcRkd)>=0 ) else: raise ValueError, "unsupported quantity for bayesian p value" elif operator.isCallable ( quantity ): d = self.data.copy() I = 0. for k in xrange ( self.Nsamples ): d[:,1] = self.posterior_predictive[k,:] I += double ( quantity ( d, self.mcestimates[k,:] ) - quantity ( self.data, self.mcestimates[k,:] >= 0 ) ) return I/self.Nsamples def __repr__ ( self ): return "< BayesInference object with %d blocks and %d mcmc chains of %d samples each >" % (self.data.shape[0],len(self.__mcmc_chains), self.nsamples) ############################################ # Setters and getters def getsamples ( self, chain=None, raw=False ): """Get sampes from the posterior :Parameters: *chain* : if chain is None, samples are aggregated over all chains sampled so far. If chain is an integer only data from the chain indexed by this number are returned *raw* : if True return all samples, including burnin :Output: an array of nsamplesXnparams samples from the posterior """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_chains: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance (chain,int): # Get a single chain if raw: return self.__mcmc_chains[chain] else: return self.__mcmc_chains[chain][self.burnin::self.thin] else: raise IndexError, "chain should be either None or an integer" def getmcdeviance ( self, chain=None, raw=False ): """Get samples from the posterior distribution of deviances :Parameters: *chain* : if chain is None, the samples are combined across all chains sampled so far. If chain is an integer, it is interpreted as the index of the chain to be returned *raw* : is true if deviances for all samples are to be returned (not respecting burnin and thinning). This only has an effect for single chains. :Output: an array of samples from the posterior distribution of deviances. This array respects the burnin and thin settings. """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_deviances: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance ( chain, int ): if raw: return self.__mcmc_deviances[chain] else: return self.__mcmc_deviances[chain][self.burnin::self.thin] else: raise ValueError, "chain should be either None or an integer" def getppdata ( self, chain=None, raw=False ): """Get posterior predictive data Posterior predictive data are data samples from the joint posterior over data and parameters. These represent data that could be generated by the model. Comparison of posterior predictive data and the observed data forms the basis of bayesian model checking: If posterior predictive data differ systematically from the observed data, the fitted model does not capture all the structure in the data. :Parameters: *chain* : chain for which posterior predictive data should be returned *raw* : is true if all data (not respecting burnin and thinning) are to be returned (this only has an effect for single chains!) :Output: a array of nsamplesXncorrect predicted data """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_posterior_predictives: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance ( chain, int ): # Get a single chain if raw: # Get raw data return self.__mcmc_posterior_predictives[chain] else: return self.__mcmc_posterior_predictives[chain][self.burnin::self.thin] else: raise IndexError, "chain should be either None or an integer" def getppdeviance ( self, chain=None, raw=False ): """Get deviances associated with posterior predictive data Posterior predictive data are data samples from the joint posterior over data and parameters. Deviance of these samples is one possible transformation on which a comparison of these data with the observed data could be based. :Parameters: *chain* : chain index to be returned. If this is None (the default) all chains are combined. *raw* : if only a single chain is returned, it might be interesting to see the whole chain and ignore burnin and thinning. If raw==True, the chain is requested in this "raw" format. :Output: an array of nsamples deviances """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_posterior_predictive_deviances: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance ( chain, int ): if raw: return self.__mcmc_posterior_predictive_deviances[chain] else: return self.__mcmc_posterior_predictive_deviances[chain][self.burnin::self.thin] else: raise ValueError, "chain should be either None or an integer" def getppRpd ( self, chain=None, raw=False ): """Get correlations between psychometric function and deviance residuals associated with posterior predictive data Posterior predictive data are data samples from the joint posterior over data and parameters. Correlation between the psychometric function and the deviance residuals of these samples is one possible transformation on which a comparison of these data with the observed data could be based. :Parameters: *chain* : chain index to be returned. If this is None (the default) all chains are combined. *raw* : if only a single chain is returned, it might be interesting to see the whole chain and ignore burnin and thinning. If raw==True, the chain is requested in this "raw" format. :Output: an array of nsamples deviances """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_posterior_predictive_Rpd: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance ( chain, int ): if raw: return self.__mcmc_posterior_predictive_Rpd[chain] else: return self.__mcmc_posterior_predictive_Rpd[chain][self.burnin::self.thin] else: raise ValueError, "chain should be either None or an integer" def getppRkd ( self, chain=None, raw=False ): """Get correlations between block index and deviance residuals associated with posterior predictive data Posterior predictive data are data samples from the joint posterior over data and parameters. Correlation between the block index and the deviance residuals of these samples is one possible transformation on which a comparison of these data with the observed data could be based. :Parameters: *chain* : chain index to be returned. If this is None (the default) all chains are combined. *raw* : if only a single chain is returned, it might be interesting to see the whole chain and ignore burnin and thinning. If raw==True, the chain is requested in this "raw" format. :Output: an array of nsamples deviances """ if chain==None: # Get all chains chains = [] for chain in self.__mcmc_posterior_predictive_Rkd: chains.append ( chain[self.burnin::self.thin] ) return N.concatenate ( chains, 0 ) elif isinstance ( chain, int ): if raw: return self.__mcmc_posterior_predictive_Rkd[chain] else: return self.__mcmc_posterior_predictive_Rkd[chain][self.burnin::self.thin] else: raise ValueError, "chain should be either None or an integer" def getCI ( self, cut=None, conf=(.025,0.5,.975), param="thres" ): """Get a posterior credibility interval for a particular parameter :Parameters: *conf* : percentiles that should be returned *param* : parameter of interest. Currently, only thres/threshold and Rkd,Rpd,deviance are defined. """ if param[:5]=="thres" or param[:5]=="slope": # We have to handle thresholds separately because there could be multiple cuts. if param[0] == "t": mcdata = self.mcthres else: mcdata = self.mcslope out = [] if cut==None: for k in xrange(self.Ncuts): out.append(p.prctile ( mcdata[:,k], 100*N.array(conf) )) return N.array(out) else: if isinstance ( cut, float ): if cut in self.cuts: cut = list(self.cuts).index(cut) else: return p.prctile ( [ self._pmf.getThres ( theta, cut ) for theta in self.mcestimates ], 100*N.array(conf) ) return p.prctile ( mcdata[:,cut], 100*N.array(conf) ) else: if param=="Rkd": vals = self.mcRkd elif param=="Rpd": vals = self.mcRpd elif param=="deviance": vals = self.mcdeviance else: raise NotImplementedError return p.prctile ( vals, 100*N.array(conf) ) ############################################ # Plotting routines def drawposteriorexamples ( self, ax=None, Nsamples=20 ): """plots the mean estimate of the psychometric function and a number of samples from the posterior :Parameters: *ax* : axes object in which to draw the plot. If this is None, a new axes object is created. *Nsamples* : number of psychometric functions that should be drawn from the posterior """ if ax is None: ax = p.axes() # Plot the psychometric function xmin = self.data[:,0].min() xmax = self.data[:,0].max() x = N.mgrid[xmin:xmax:100j] lines = [] # Now we sample Nsamples psychometric functions from all the chains we have samples = self.getsamples() deviances = self.getmcdeviance() indices = N.random.randint ( samples.shape[0], size=(Nsamples,) ) # Scale deviance to 0,1 deviances -= deviances[indices].min() deviances /= deviances[indices].max() deviances = N.clip(.4+4*deviances,0,1) for i in indices: psi = N.array ( [ self._pmf.evaluate ( xx, samples[i,:] ) for xx in x] ) lines.append ( ax.plot(x,psi,color=[deviances[i]]*2+[1]) ) return lines ############################################ # Convergence diagnostics def geweke ( self, parameter=0, nsegments=10 ): """Geweke test for stationarity of a chain. The Geweke test first transforms all samples to mean 0 and standard deviation 1. In a second step, it calculates the sample average in a number of segments and checks whether these subaverages differ significantly from 0. :Parameters: *parameter* : parameter of interest *nsegments* : number of subaverages to be calculated :Output: a boolean value indicating whether the chain is "good" or "bad" """ z = N.zeros ( (nsegments, self.nchains), 'd' ) for k in xrange ( self.nchains ): samples = self.getsamples ( k ) [:,parameter] w = len(samples)/nsegments m = samples.mean() s = samples.std() for l in xrange ( nsegments ): z[l,k] = (samples[l*w:(l+1)*w].mean()-m)/s # warn about bad points if abs(z).max() > 2: bad = [] for k in xrange(self.nchains): if abs(z[:,k]).max() > 2: bad.append(k) return False,z,bad else: return True,z,None def Rhat ( self, parameter=0 ): """Gelman Rhat statistic for convergence using multiple chains This is also called the 'estimated potential scale reduction'. A value Rhat > 1.1 is indicative of poor convergence. """ # See p.137 in Gilks, Richardson, Spiegelhalter (1996) m = self.nchains n = self.getsamples(0).shape[0] psi_i = N.zeros(m,'d') # within chain averages si2 = N.zeros(m,'d') # within chain variances for chain in xrange(m): psi_i[chain] = self.getsamples(chain)[:,parameter].mean() si2[chain] = sum ( (self.getsamples(chain)[:,parameter]-psi_i[chain])**2 )/(n-1) psi_mean = psi_i.mean() B = n * sum( (psi_i-psi_mean)**2 ) / (m-1) W = si2.mean() return (float(n-1)/n * W + B/n)/W; ############################################ # Properties inference = property ( fget=lambda self: "MCMC", doc="Type of inference performed by the object" ) mcthres = property ( fget=lambda self: self.__pthres, doc="posterior samples of the threshold" ) mcslope = property ( fget=lambda self: self.__pslope, doc="posterior samples of the slopes" ) nchains = property ( fget=lambda self: len(self.__mcmc_chains), doc="Number of chains that have been sampled" ) @Property def estimate (): """Estimate of the parameters. If sampling has already occurred, this will be the mean estimate, otherwise it will be the mapestimate. """ def fget (self): if self.__meanestimate is None: # We don't have a mean estimate if len(self.__mcmc_chains) > 0: # But we have samples! self.__meanestimate = self.getsamples().mean(0) self.devianceresiduals = self._pmf.getDevianceResiduals ( self.__meanestimate, self._data ) self.__meandeviance = self._pmf.deviance ( self.__meanestimate, self._data ) self.thres = [self._pmf.getThres ( self.__meanestimate, c ) for c in self.cuts] self.slope = [self._pmf.getSlope ( self.__meanestimate, th ) for th in self.thres] self.Rpd = self._pmf.getRpd ( self.devianceresiduals, self.__meanestimate, self._data ) self.Rkd = self._pmf.getRkd ( self.devianceresiduals, self._data ) else: # We have no samples ~> return mapestimate return self.mapestimate # In this case, we seem to have a meanestimate, so we return it return self.__meanestimate def fset (self,v): pass @property def posterior_median(self): """ Median for the posterior, for all sampled chains. """ if len(self.__mcmc_chains) == 0: raise Exception("MCMC must be run before posterior median can be "+ "computed") else: return N.median(self.getsamples(), 0) @Property def deviance (): """Deviance of the estimate. If sampling has already occurred, this will be the deviance of the mean estimate. Otherwise it will be the deviance of the mapestimate. """ def fget (self): if self.__meandeviance is None: return self.mapdeviance else: return self.__meandeviance def fset (self,v): pass @Property def burnin (): "Burnin: Number of samples to be discarded at the beginning of each chain" def fget (self): return self.__burnin def fset (self,b): """Set the burnin :Parameters: b new burnin value, i.e. number of samples that are discarded at the beginning of each chain """ self.__burnin = b # Set all values that depend on burnin to None. This way, they are # recomputed on access self.__meanestimate = None self.__meandeviance = None self.__pRpd = None self.__pRkd = None self.__pthres = None self.__pslope = None @Property def thin (): "Thinning: Subsample chains to reduce autocorrelation" def fget (self): return self.__thin def fset (self,t): self.__thin = t # Set all values that depend on thin to None. This way, they are recomputed # on access self.__meanestimate = None self.__meandeviance = None self.__pRpd = None self.__pRkd = None self.__pthres = None self.__pslope = None @Property def mcRpd (): "Monte Carlo samples of posterior correlation between model predictions and data" def fget (self): """Get samples from the posterior distribution of correlation between model prediction and deviance residuals""" if self.__pRpd is None: # pRpd is currently undefined if len(self.__mcmc_chains) > 0: # We have samples ~> recompute the correlations self.__recomputeCorrelationsAndThresholds() else: raise NosamplesError, "Samples from the posterior have not yet been drawn" return self.__pRpd def fset (self, v): pass @Property def mcRkd (): "Monte Carlo samples of posterior correlation between bock index and data" def fget (self): """Get samples from the posterior distribution of correlation between block index and deviance residuals""" if self.__pRkd is None: # pRkd is currently undefined if len(self.__mcmc_chains) > 0: # We have samples ~> recompute the correlations self.__recomputeCorrelationsAndThresholds() else: raise NosamplesError, "Samples from the posterior have not yet been drawn" return self.__pRkd def fset (self, v): pass mcestimates = property ( fget=getsamples, doc="Monte Carlo samples from the posterior distribution of parameters" ) mcdeviance = property ( fget=getmcdeviance , doc="Deviances of monte carlo samples from the posterior" ) posterior_predictive = property ( fget=getppdata, doc="Posterior predictive data associated with the MCMC samples" ) ppdeviance = property ( fget=getppdeviance, doc="Deviances associated with the posterior predictive data" ) ppRpd = property ( fget=getppRpd, doc="Correlations between psychometric function and deviance residuals associated with posterior predictive data" ) ppRkd = property ( fget=getppRkd, doc="Correlations between block index and deviance residuals associated with posterior predictive data" ) @Property def mcthres (): "Monte Carlo Samples from the posterior distribution of thresholds" def fget (self): """Get samples of the posterior distribution of thresholds""" if self.__pthres is None: # pthres is currently undefined if len(self.__mcmc_chains) > 0: # We have samples ~> recompute the thresholds self.__recomputeCorrelationsAndThresholds() else: raise NosamplesError, "Samples from the posterior have not yet been drawn" return self.__pthres def fset (self, t): pass @Property def mcslope (): "Monte Carlo Samples from the posterior distribution of slopes" def fget (self): """Get samples of the posterior distribution of slopes""" if self.__pslope is None: # pthres is currently undefined if len(self.__mcmc_chains) > 0: # We have samples ~> recompute the slope self.__recomputeCorrelationsAndThresholds() else: raise NosamplesError, "Samples from the posterior have not yet been drawn" return self.__pslope def fset (self, t): pass @Property def evidence (): """model evidence or marginal likelihood Model evidence is typically given as the integral of the likelihood over the parameter space. We replace the integral by a discrete sum over samples, such that we have E = 1/N sum P(D|theta) Model evidence is typically used in Bayesian model selection: If E1 is the evidence for model 1 and E2 is the evidence for model 2, then the ratio E1/E2 can be interpreted as "how much more evidence is there for model 2 than for model 1". """ def fget (self): dev = self.mcdeviance return N.exp(-0.5*dev).mean() @Property def nullevidence (): """model evidence for the corresponding null model This can be used for model selection: model evidence devided by null evidence gives the Bayes Factor for the comparison of the model agains the null model. This can be interpreted as "how much more probable is the given psychometric function than the null model for the present data. Also see the documentation for the evidence property. """ def fget (self): # The null deviance can be directly calculated n = self.data[:,2].sum() k = self.data[:,1].sum() alpha,beta = 1.,1. # flat prior for the null model fbeta = special.beta return fbeta(k+alpha,n-k+beta) / ( (n+1)*fbeta(k+1,n-k+1) * fbeta(alpha,beta) ) @Property def pD (): """effective number of parameters""" def fget ( self ): return self.mcdeviance.mean()-self.deviance @Property def DIC (): """Deviance information criterion This is an information criterion based on the posterior distribution of deviance. In contrast, to other information criteria, the deviance information criterion determines the effective number of free parameters from the posterior distribution. """ def fget ( self ): meandev = self.mcdeviance.mean() return 2*meandev-self.deviance @Property def farstart (): """A proper starting value for the Rhat statistic This is a starting value for the mcmc process, that is relatively far away from the posterior density. In order to have a reasonably interpretable Rhat statistic. There should be multiple chains and these chains should have overdispersed starting values. farstart will always correspond to an overdispersed starting value. """ def fget ( self ): k = N.random.randint(2) l = N.random.randint(2) x = self.mapestimate x[l] = p.prctile ( self.mcestimates[:,l], (2.5,97.5)[k] ) # print x return x ############################################ # Private methods def __recomputeCorrelationsAndThresholds ( self ): """This method is called whenever the sample basis from the posterior changes. This can have three reasons: - burnin: the burnin is changed resulting in samples being added or removed at the beginning of each chain - thin: the thinning is changed resulting in samples being discarded from within the chains - sample: an additional chain is acquired. In this case, a large number of samples is added. """ samples = self.getsamples() self.__pRpd = N.zeros(samples.shape[0],'d') self.__pRkd = N.zeros(samples.shape[0],'d') self.__pthres = N.zeros((samples.shape[0],self.Ncuts),'d') self.__pslope = N.zeros((samples.shape[0],self.Ncuts),'d') self._PsiInference__infl = N.zeros(self.data.shape[0], 'd' ) for k,theta in enumerate(samples): self.__pthres[k,:] = [self._pmf.getThres ( theta, c ) for c in self.cuts] self.__pslope[k,:] = [self._pmf.getSlope ( theta, th ) for th in self.__pthres[k,:]] dr = self._pmf.getDevianceResiduals ( theta, self._data ) self.__pRpd[k] = self._pmf.getRpd ( dr, theta, self._data ) self.__pRkd[k] = self._pmf.getRkd ( dr, self._data ) lpr = [] for l in self.__mcmc_logposterior_ratios: lpr.append(l[self.burnin::self.thin,:]) lpr = N.concatenate ( lpr, 0 ) self._PsiInference__infl = -N.mean(lpr,0) + N.log(N.mean(N.exp(lpr),0)) def __determineoptimalsampling ( self, noptimizations=10, verbose=False, newstyle=False ): """Determine optimal sampling parameters using the Raftery&Lewis (1995) procedure Automatically set burnin,thin,nsamples. In addition, an object, that contains more detailed information about the sampling is stored in self.mcmcpars :Parameters: *noptimizations* : maximum number of optimization iterations. If the same sampling parameters are obtained before, the method terminates earlier *verbose* : display status messages """ if newstyle: self.__tunesampler ( noptimizations, True ) return if noptimizations==0: return mcmcpars = {} # Determine size of initial test run if self.nsamples is None: NN = 0 for q in self.conf: Nmin = pygibbsit.gibbsit ( q=q )["Nmin"] NN = max(NN,Nmin) self.nsamples = NN if not self._maxnsamples is None and self.nsamples > self._maxnsamples: self.nsamples = self._maxnsamples a = self.__roughvariance () # a = 0.1*self.mapestimate # asympvar = N.diag(fisherinv) # a = self.afac*N.sqrt(asympvar) # print a # chain,deviance,ppdata,ppdeviances,ppRpd,ppRkd,logpostratios = interface.mcmc ( self.data, self.mapestimate, NN, stepwidths=a, **self.model ) # a = N.sqrt(N.diag(N.cov(chain.T))) # print a oldburnin = 0 oldthin = 1 oldnsamples = NN self.debug_samples = [] for n in xrange ( noptimizations ): if self._sampler == "DefaultMCMC": steps_or_proposal = self._proposal else: steps_or_proposal = a samples,deviances,ppdata,ppdeviances,ppRpd,ppRkd,logpostratios,accept_rate = interface.mcmc ( self.data, self.mapestimate, NN, stepwidths=steps_or_proposal, sampler=self._sampler, **self.model ) print "Acceptance:",accept_rate self.debug_samples.append ( samples ) # Check all desired thresholds for q in self.conf: for k in xrange ( len(self.mapestimate) ): try: mcmcpars = pygibbsit.gibbsit ( samples[:,k], q=q ) except IndexError: continue self.burnin = max ( self.burnin, mcmcpars.burnin ) self.thin = max ( self.thin, mcmcpars.thin ) self.nsamples = max ( self.nsamples, mcmcpars.Nsamples ) # Determine standard deviations of samples but don't store them in a b = N.sqrt(N.diag(N.cov ( samples[self.burnin::self.thin].T ))) # Check whether b is good, otherwise use roughvariance again if b.max() < 1e-10: a = self.__roughvariance () else: a = b if verbose: print "Burnin:",self.burnin,"Thinning:",self.thin,"Nsamples:",self.nsamples print "Steps:",a if self.nsamples <= oldnsamples: # if oldburnin==self.burnin and oldthin==self.thin and oldnsamples==self.nsamples: break else: oldburnin,oldthin,oldnsamples = self.burnin,self.thin,self.nsamples if not self._maxnsamples is None and self.nsamples > self._maxnsamples: self.nsamples = self._maxnsamples self.mcmcpars = mcmcpars self._steps = a if verbose: print "Steps(final):",N.sqrt(N.diag(N.cov( samples[self.burnin::self.thin].T ))) def __tunesampler ( self, noptimizations=10, verbose=False ): """Determine optimal sampling parameters using the Raftery&Lewis (1995) procedure Automatically set burnin,thin,nsamples. :Parameters: *noptimizations* : maximum number of optimization iterations. If the same sampling parameters are obtained before, the method terminates earlier *verbose* : display status messages """ if noptimizations==0: return mcmcpars = {} # Determine size of initial test run if self.nsamples is None: NN = 0 for q in self.conf: Nmin = pygibbsit.gibbsit ( q=q )["Nmin"] NN = max(NN,Nmin) self.nsamples = NN pilot = interface.bootstrap ( self.data, self.mapestimate, 200, cuts = self.cuts, **self.model )[1] oldburnin = 0 oldthin = 1 oldnsamples = NN for n in xrange ( noptimizations ): if self._sampler == "DefaultMCMC": steps_or_proposal = self._proposal else: steps_or_proposal = pilot results = interface.mcmc ( self.data, self.mapestimate, self.nsamples, stepwidths=steps_or_proposal, sampler=self._sampler, **self.model ) pilot,accept_rate = results[0:len(results)-1] print n,"Acceptance:",accept_rate # Make sure the chains have converged p1,p2 = pilot[0.3*self.nsamples:0.6*self.nsamples,:],pilot[0.6*self.nsamples:,:] m1,m2 = p1.mean(0),p2.mean(0) s1,s2 = p1.var(0),p2.var(0) nstat = (m1-m2)/N.sqrt(s1+s2) print "nstat:",nstat if N.any(abs ( nstat ) > 1.96): if verbose: print "Bad pilot sample",nstat continue # Check all desired thresholds for q in self.conf: for k in xrange ( len(self.mapestimate) ): try: mcmcpars = pygibbsit.gibbsit ( pilot[:,k], q=q ) except IndexError: continue self.burnin = max ( self.burnin, mcmcpars.burnin ) self.thin = max ( self.thin, mcmcpars.thin ) self.nsamples = max ( self.nsamples, mcmcpars.Nsamples ) if verbose: print "Burnin:",self.burnin,"Thinning:",self.thin,"Nsamples:",self.nsamples print "oldnsamples",oldnsamples if self.nsamples <= oldnsamples: if verbose: print "Sampler ok" break else: oldnsamples = self.nsamples self.mcmcpars = mcmcpars if self._sampler == "GenericMetropolis": self._steps = pilot else: self._steps = pilot.std(0) def __roughvariance ( self ): # Determine an initial variance estimate using the Fisher Information Matrix fisherI = -N.matrix(self.fisher) try: # Solve regularized problem # (A.T*A+lambda*I) * X = A.T fisherIinv = N.linalg.solve ( fisherI.T*fisherI+0.01*N.eye(fisherI.shape[0]), fisherI.T ) self.approx = "laplace" except N.linalg.LinAlgError: # It seems as if the regularized fisher matrix can not be inverted # We directly get an estimate form bootstrap start = sfu.get_start ( self.estimate, len(self.estimate) ) # Perform bootstrap without full conversion of data cuts = sfu.get_cuts(self.cuts) bs_list = sft.bootstrap(self.nsamples, self._data, self._pmf, cuts, start, True, True) self.approx = "bootstrap" return N.array ( [ bs_list.getStd(i) for i in xrange ( self.nparams )] ) cond = abs(fisherI.A).sum(1).max() * abs(fisherIinv.A).sum(1).max() # print "Condition of Fisher Information Matrix:",cond # print fisherI # If fisherI is ill conditioned if cond > 1e6: for k in xrange(20): localdata = self.data.copy() for l in xrange ( localdata.shape[0] ): localdata[l,1] = N.random.binomial ( self.data[l,2], self.data[l,1].astype('d')/self.data[l,2] ) fisherII = N.matrix(interface.mapestimate(localdata,start=None,**self.model)[1]) try: fisherIIinv = N.linalg.solve ( fisherII.T*fisherII+0.01*N.eye(fisherII.shape[0]), fisherII.T ) self.approx = "laplace" except N.linalg.LinAlgError: continue cond = abs(fisherII.A).sum(1).max() * abs(fisherIIinv.A).sum(1).max() # print "Condition of Fisher Information Matrix:",cond # print fisherI if cond < 1e6: fisherI = fisherII fisherIinv = fisherIIinv break try: a = N.sqrt(N.diag(fisherIinv)) except: # There doesn't seem to be a fisherIinv variable... a = zeros(3) # print "a =",a if abs(a).min() < 1e-10 \ or abs(a).max() > 1e10 \ or a[2] > 0.5 \ or N.any(N.isnan(a)): # It seems as if the Variance estimation via the Fisher Matrix failed # We directly get an estimate form bootstrap start = sfu.get_start ( self.estimate, self.nparams ) # Perform bootstrap without full conversion of data cuts = sfu.get_cuts(self.cuts) bs_list = sft.bootstrap(self.nsamples, self._data, self._pmf, cuts, start, True, True) self.approx = "bootstrap" a = N.array ( [ bs_list.getStd(i) for i in xrange ( self.nparams )] ) # print "a_boots =",a return a MCMCInference = BayesInference ############################################################################################################################## class ASIRInference ( PsiInference ): def __init__ ( self, data, cuts=(.25,.5,.75), conf=(.025,.975), **kwargs ): """Perform bayesian inference using posterior approximation and sampling importance resampling :Parameters: *data* : an array of data in three columns -- stimulus intensity, number of correct responses and number of trials. *cuts* : cuts at which thresholds and slopes should be plotted by default *conf* : confidence levels that should be marked in plots by default *sigmoid* : sigmoid to be used *core* : core object to be used *priors* : a tuple of priors to be applied to the parameters. Alternatively, this may be the keyword 'Jeffreys' to indicate that Jeffrey's noninformative prior should be used. Note that evaluation of Jeffrey's prior is computationally more expensive than the other priors. *nafc* : number of stimulus alternatives presented in a forced choice design. If only one stimulus has been presented, this will typically be 1. *gammaislambda* : setting this to True will constrain the upper and lower asymptotes to be equal in single stimulus designs (i.e. nafc==1) *plotprm* : a dictionary to take parameters for plotting data. Currently supported are the arguments 'label', 'color', 'linestyle', 'linewidth' and 'marker'. These can all be set after creating an Inference instance, too. By using the respective properties. *nsamples* : typically 2000 samples will be drawn. If you feel that this is takes too long, you might want to reduce this number *propose* : how much more samples should be proposed than will eventually be taken? """ if check_kwargs ( kwargs, ASIRInference.__init__.__doc__ ): msg = "Unknown parameter '%s'. See docstring for valid arguments" % (check_kwargs(kwargs, ASIRInference.__init__.__doc__ ),) raise ValueError, msg self.plotprm = kwargs.setdefault ( 'plotprm', {} ) self.plotprm.setdefault ( 'label', "Psychometric function" ) self.plotprm.setdefault ( 'color', "b" ) self.plotprm.setdefault ( 'linestyle', "-" ) self.plotprm.setdefault ( 'linewidth', 1 ) self.plotprm.setdefault ( 'marker', "o" ) PsiInference.__init__(self,self.plotprm) self.Nsamples = kwargs.setdefault( 'nsamples', 2000 ) if self.Nsamples <= 0: raise ValueError, "number of requested samples should be > 0" # Store basic data self.data = N.array(data,'d') if self.data[:,1].max() <= 1: # We have relative frequencies self.data[:,1] *= self.data[:,2] self.data[:,1] = N.floor ( self.data[:,1] ) self.model = { "sigmoid": kwargs.setdefault("sigmoid","logistic"), "core": kwargs.setdefault("core", "mw0.1"), "priors": list(kwargs.setdefault ( 'priors', psignipriors.default ( self.data[:,0] ) )), "nafc": kwargs.setdefault("nafc", 2), "gammaislambda": kwargs.setdefault("gammaislambda", False) } if self.model["core"][:2] == "mw": self.parnames = ["m","w"] elif self.model["core"] == "weibull": self.parnames = ["m","s"] else: self.parnames = ["a","b"] self.parnames.append("lambda") if self.model["nafc"]<2 and not self.model["gammaislambda"]: self.parnames.append("guess") if len(self.model["priors"])==3: self.model["priors"].append ( psignipriors.default_lapse() ) self.__inference = interface.asir ( self.data, nsamples=self.Nsamples, nafc=self.model['nafc'], sigmoid=self.model['sigmoid'], core=self.model['core'], priors=self.model['priors'], gammaislambda=self.model['gammaislambda'], propose=kwargs.setdefault ( "propose", 25 ) ) self._data,self._pmf,self.nparams = sfu.make_dataset_and_pmf ( self.data, self.model["nafc"], self.model["sigmoid"], self.model["core"], self.model["priors"], gammaislambda=self.model["gammaislambda"] ) self.mapestimate,self.fisher,thres,slope,self.mapdeviance = interface.mapestimate(self.data,start=None,**self.model) if cuts is None: self.cuts = (.25,.5,.75) elif getattr ( cuts, "__iter__", False ): self.cuts = cuts elif isinstance ( cuts, float ): self.cuts = (cuts,) else: raise ValueError, "'cuts' should be a sequence or a float" self.Ncuts = len(self.cuts) deviance_residuals = self._pmf.getDevianceResiduals ( self.mapestimate, self._data ) self.Rpd = self._pmf.getRpd ( deviance_residuals, self.mapestimate, self._data ) self.Rkd = self._pmf.getRkd ( deviance_residuals, self._data ) self.__meanestimate = self.__inference["mcestimates"].mean(0) self.__meandeviance = self._pmf.deviance ( self.__meanestimate, self._data ) self.devianceresiduals = self._pmf.getDevianceResiduals ( self.__meanestimate, self._data ) self.conf = conf def bayesian_p ( self, quantity="deviance" ): """Bayesian p value associated with a given quantity The Bayesian p value of a model compares posterior predictives with the observed data. If the observed data are very unequal to the posterior predictives, this indicates that the model does not describe the data well. To compare observed data and simulated data (posterior predictives), it is common to derive a quantity of interest from the posterior predictives. The Bayesian p value is between 0 and 1 and values close to 0 and close to 1 indicate bad model fit. This p value can be interpreted like a two sided test. :Parameters: *quantity* : This is the quantity do be derived. By default only deviance, Rpd and Rkd are available. If quantity is a function, this will be called on every data set and the respective p value will be calculated. The call on every data set takes two arguments: 1. a nblocksX3 array of data and 2. a parameter vector. This way any other transformation of the data can be realized. :Output: the bayesian p-value """ if isinstance ( quantity, str ): if quantity.lower() == "deviance": return N.mean ( (self.ppdeviance-self.mcdeviance)>=0 ) elif quantity.lower() == "rpd": return N.mean ( (self.ppRpd-self.mcRpd)>=0 ) elif quantity.lower() == "rkd": return N.mean ( (self.ppRkd-self.mcRkd)>=0 ) else: raise ValueError, "unsupported quantity for bayesian p value" elif operator.isCallable ( quantity ): d = self.data.copy() I = 0. for k in xrange ( self.Nsamples ): d[:,1] = self.posterior_predictive[k,:] I += double ( (quantity ( d, self.mcestimates[k,:] ) - quantity ( self.data, self.mcestimates[k,:] )) >= 0 ) return I/self.Nsamples def getCI ( self, param="thres", cut=None, conf=(.025,.5,.975), method="samples" ): """Get a posterior credibility interval for a particular parameter :Parameters: *param* : parameter of interest. Currently, only thres/threshold, slope, Rkd, deviance and the parameters in BayesInference.parnames are defined *cut* : cut at which to determine the confidence interval *conf* : levels of confidence (i.e. quantiles of the respective marginal) *method* : usually quantiles are derived from samples. For te actual parameters of the psychometric function(i.e. those in BayesInference.parnames), it is also possible to specify method="approx" to determine quantiles from an analytic approximation to the posterior. """ if isinstance ( cut, float ): if cut>=1. or cut<=0: raise ValueError, "If cut is a float, it should be between 0 and 1." elif isinstance ( cut, int ): if cut<0 or cut>=len(self.cuts): raise ValueError, "If cut is an int, it should index the cuts sequence provided to the constructor." for c in conf: if c>=1 or c<=0: raise ValueError, "Can't determine quantiles for a value outside the unit interval" # Determine the parameter if param=="thres": if cut is None: post_param = self.mcthres elif isinstance ( cut, float ): post_param = N.array ( [self._pmf.getThres( self.mcestimates[k,:], cut ) for k in xrange ( self.Nsamples ) ] ) elif isinstance ( cut, int ): post_param = self.mcthres[:,cut] else: raise ValueError, "Don't know what to do with this type of cut" elif param=="slope": if cut is None: post_param = self.mcslope elif isinstance ( cut, float ): post_param = N.array ( [self._pmf.getSlope ( self.mcestimates[k,:], self._pmf.getThres( self.mcestimates[k,:], cut ) ) for k in xrange ( self.Nsamples ) ] ) elif isinstance ( cut, int ): post_param = self.mcslope[:,cut] else: raise ValueError, "Don't know what to do with this type of cut" elif param=="Rkd": post_param = self.mcRkd elif param=="Rpd": post_param = self.mcRpd elif param in ["deviance", "D"]: post_param = self.mcdeviance elif param in self.parnames: ind = self.parnames.index ( param ) if method=="samples": post_param = self.mcestimates[:,ind] elif method=="approx": return [ self.__inference["posterior_approximations_py"].ppf ( c ) for c in conf ] if len(post_param.shape)==2: out = [] for i in xrange ( post_param.shape[1] ): out.append ( p.prctile ( post_param[:,i], 100*N.array(conf) ) ) return out elif len(post_param.shape)==1: return p.prctile ( post_param, 100*N.array(conf) ) else: raise IOError, "This should not happen" def posterior_pdf ( self, param, x ): """Evaluate the pdf of the posterior approximation for one parameter :Parameters: *param* : index of the parameter of interest *x* : x values at which to evaluate the posterior """ if isinstance ( x, (float, int) ): return self.__inference['posterior_approximations_py'].pdf ( x ) else: return N.array ( [ self.__inference['posterior_approximations_py'][param].pdf ( xx ) for xx in x ] ) def prior_pdf ( self, param, x ): """Evaluate the pdf of the prior for one parameter :Parameters: *param* : index of the parameter of interest *x* : x values at which to evaluate the prior """ if isinstance ( x, (float, int) ): return self._pmf.getPrior(param).pdf ( x ) else: return N.array ( [ self._pmf.getPrior(param).pdf ( xx ) for xx in x ] ) def __repr__ ( self ): return "< ASIRInference object with %d blocks and %d samples for %d parameters >" % (self.data.shape[0], self.Nsamples, self.nparams) def drawposteriorexamples ( self, ax=None, Nsamples=20 ): """plots the mean estimate of the psychometric function and a number of samples from the posterior :Parameters: *ax* : axes object in which to draw the plot. If this is None, a new axes object is created. *Nsamples* : number of psychometric functions that should be drawn from the posterior """ if ax is None: ax = p.axes() # Plot the psychometric function xmin = self.data[:,0].min() xmax = self.data[:,0].max() x = N.mgrid[xmin:xmax:100j] lines = [] # Now we sample Nsamples psychometric functions from all the chains we have samples = self.mcestimates deviances = self.mcdeviance indices = N.random.randint ( samples.shape[0], size=(Nsamples,) ) # Scale deviance to 0,1 deviances -= deviances[indices].min() deviances /= deviances[indices].max() deviances = N.clip(.4+4*deviances,0,1) for i in indices: psi = N.array ( [ self._pmf.evaluate ( xx, samples[i,:] ) for xx in x] ) lines.append ( ax.plot(x, psi,color=[deviances[i]]*2+[1]) ) return lines inference = property ( fget=lambda self: "ASIR", doc="Type of inference performed by the object" ) mcestimates = property ( fget=lambda self: self.__inference["mcestimates"], doc="posterior samples" ) mcdeviance = property ( fget=lambda self: self.__inference["mcdeviance"].copy(), doc="deviances associated with posterior samples" ) ppdeviance = property ( fget=lambda self: self.__inference["posterior_predictive_deviance"], doc="deviances associated with posterior predictive simulation" ) posterior_predictive = property ( fget=lambda self: self.__inference["posterior_predictive_data"], doc="posterior predictive simulation data" ) ppRpd = property ( fget=lambda self: self.__inference['posterior_predictive_Rpd'],\ doc="Correlations between model prediction and deviance residuals for posterior predictive samples" ) mcRpd = property ( fget=lambda self: self.__inference['mcRpd'],\ doc="Correlations between model prediction and deviance residuals for posterior samples" ) ppRkd = property ( fget=lambda self: self.__inference['posterior_predictive_Rkd'],\ doc="Correlations between block index and deviance residuals for posterior predictive samples" ) mcRkd = property ( fget=lambda self: self.__inference['mcRkd'],\ doc="Correlations between block index and deviance residuals for posterior samples" ) MEAN_mc = property ( fget=lambda self: self.__meanestimate, doc="MEAN estimate for the paramters (based on monte carlo simulation)" ) MEAN_app = property ( fget=lambda self: [ self.__inference["posterior_approximations_py"][i].mean() for i in xrange ( self.nparams ) ], doc="MEAN estimate for the parameters (based on analytic approximations to the marginals)" ) grids = property ( fget=lambda self: self.__inference["posterior_grids"], doc="grids on which the posterior was numerically integrated" ) margins = property ( fget=lambda self: self.__inference["posterior_margin"], doc="numerically integrated marginal posterior distributions" ) duplicates = property ( fget=lambda self: self.__inference["duplicates"], doc="duplicate samples that were generated during the sampling-importance-resampling process" ) posterior_approximations = property ( fget=lambda self: self.__inference["posterior_approximations_str"], doc="fitted posterior approximations" ) nullevidence = property ( fget=lambda self: 1., doc="This returns nonsense -- should be removed in the future" ) @Property def estimate(): "MEAN estimate for the parameters" def fget ( self ): return self.MEAN_mc def fset ( self,v ): pass @Property def posterior_median (): "Median of the posterior" def fget ( self ): self.__posterior_median = getattr ( self, "__posterior_median", None ) if self.__posterior_median == None: self.__posterior_median = N.median ( self.mcestimates, 0 ) return self.__posterior_median @Property def deviance (): """Deviance of the estimate. If sampling has already occurred, this will be the deviance of the mean estimate. Otherwise it will be the deviance of the mapestimate. """ def fget (self): if self.__meandeviance is None: return self.mapdeviance else: return self.__meandeviance def fset (self,v): pass @Property def infl (): "Influences of the respective blocks" def fget ( self ): self.__infl = getattr ( self, "__infl", None ) if self.__infl == None: self.__infl = -N.mean(self.__inference["logposterior_ratios"],0) + N.log(N.mean(N.exp(self.__inference["logposterior_ratios"]),0)) return self.__infl @Property def mcthres (): "thresholds of all posterior samples" def fget ( self ): self.__mcthres = getattr ( self, "__mcthres", None ) if self.__mcthres == None: self.__mcthres = N.array ( [ [self._pmf.getThres( self.mcestimates[k,:], c ) for c in self.cuts ] for k in xrange ( self.Nsamples ) ] ) return self.__mcthres @Property def mcslope (): "slopes of all posterior samples" def fget ( self ): self.__mcslope = getattr ( self, "__mcslope", None ) if self.__mcslope == None: self.__mcslope = N.array ( [ [self._pmf.getSlope ( self.mcestimates[k,:], th ) for th in self.mcthres[k,:] ] for k in xrange ( self.Nsamples ) ] ) return self.__mcslope if __name__ == "__main__": import doctest doctest.testmod() psignifit3-3.0~beta.20120611.1/pypsignifit/psignierrors.py000066400000000000000000000014521176542545200232010ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### __docformat__ = "restructuredtext" class NosamplesError ( Exception ): """An exception that is raised whenever we try to use samples but there are none""" def __init__ ( self, msg ): self.msg = msg def __str__(self): return repr(self.msg) class SamplingError ( Exception ): """An exception that is raised if some thing is wrong with the sampling""" def __init__ ( self, msg ): self.msg = msg def __str__ ( self ): return repr(self.msg) psignifit3-3.0~beta.20120611.1/pypsignifit/psigniplot.py000066400000000000000000001304341176542545200226460ustar00rootroot00000000000000#/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### __docformat__ = "restructuredtext" import pylab as p import numpy as N import re from scipy import stats import psignidata import swignifit.interface_methods as interface from matplotlib.ticker import MaxNLocator __all__ = ["GoodnessOfFit","ConvergenceMCMC","ParameterPlot","ThresholdPlot","plotSensitivity","plotInfluential","plotMultiplePMFs"] __warnred = [.7,0,0] import warnings spineswarning = """your axes object does not support spines. The most probable reason for this is that you are using an old version of matplotlib. spines allow for more beautiful plots and are a new feature in matplotlib 1.0.0. """ class parameterdict ( dict ): def __add__ ( self, other ): out = parameterdict ( self ) for k,i in other.iteritems (): out.setdefault ( k, i ) return out class DefaultParameters ( object ): def __init__ ( self ): self.alltext = parameterdict() self.text = parameterdict(fontsize=8) self.title = parameterdict(fontsize=12) self.label = parameterdict(fontsize=10) self.allplots= parameterdict(color='b') self.line = parameterdict() self.highlight = parameterdict(color='r') self.warning = parameterdict(fontsize=16, color=[.7,0,0]) rc = DefaultParameters() def drawaxes ( ax, xtics=None, xfmt=None, ytics=None, yfmt=None, xname=None, yname=None ): """Draw x and y axes that look nicer than standard matplotlib This function deletes the pylab default axes and draws visually more pleasing axes. In addition it takes care that all graphics remain within the area covered by the axes. :Parameters: *ax* : the axes object in which the graphics should stay *xtics* : an array of x-ticks *xfmt* : format string for the x-ticks *ytics* : an array of y-ticks *yfmt* : format string for the y-ticks *xname* : label for the x-axis *yname* : label for the y-axis """ if getattr ( ax, 'spines', False ): # New Implementation using spines for loc, spine in ax.spines.iteritems(): if loc in ['left','bottom']: spine.set_position( ('outward', 10) ) # Outward by 10 points elif loc in ['right','top']: spine.set_color('none') # no 'spine' else: raise ValueError ( 'unknown spine location: %s' % loc ) else: warnings.warn ( spineswarning, DeprecationWarning ) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') ax.set_xlabel ( xname, **(rc.label+rc.alltext) ) ax.set_ylabel ( yname, **(rc.label+rc.alltext) ) def prepare_axes ( ax, haveon=("bottom","left" ) ): """Prepare an axes object to look nicer than standard matplotlib :Parameters: *ax* : axes object that should be prepared *haveon* : axes that should be shown :Return: the prepared axes object """ if getattr ( ax, 'spines', False ): for loc,spine in ax.spines.iteritems(): if loc in haveon: spine.set_position ( ("outward",10) ) else: spine.set_color ( "none" ) else: warnings.warn ( spineswarning, DeprecationWarning ) if "bottom" in haveon: ax.xaxis.set_ticks_position ( "bottom" ) elif "top" in haveon: ax.xaxis.set_ticks_position ( "top" ) else: ax.xaxis.set_ticks_position ( "none" ) ax.xaxis.set_ticklabels ( "" ) if "left" in haveon: ax.yaxis.set_ticks_position ( "left" ) elif "right" in haveon: ax.yaxis.set_ticks_position ( "right" ) else: ax.yaxis.set_ticks_position ( "none" ) ax.yaxis.set_ticklabels ( "" ) return ax def axes_array_h ( fig, naxes, axsize, lowerleft=(0.1,0.1), dist=0.05, showally=True, nox=False ): """Draw a horizontal array of axes :Parameters: *fig*, matplotlib.figure instance : the figure in which to plot the axes *naxes*, integer : how many axes should be generated *axsize*, tuple: size of each axes system *lowerleft*, tuple: lower left corner of the first axes system *dist*, float: horizontal separation of adjacent axes *showally*, bool: indicates whether all y-axes should be shown or not *nox*, bool: if True, no x-axes are shown :Return: a sequence of the newly generated axes objects """ xsize,ysize = axsize xdist,ydist = lowerleft step = xsize+dist if nox: axs = [prepare_axes ( fig.add_axes ( [xdist,ydist,xsize,ysize] ), haveon="left" )] else: axs = [prepare_axes ( fig.add_axes ( [xdist,ydist,xsize,ysize] ) )] for n in xrange(1,naxes): xdist += step haveon = [] if not nox: haveon.append ( "bottom" ) if showally: haveon.append ( "left" ) axs.append ( prepare_axes ( fig.add_axes ( [xdist,ydist,xsize,ysize] ), haveon=haveon ) ) return axs def plotRd ( InferenceObject, ax=None, regressor="p" ): """plot deviance residuals against a regressor Deviance residuals are used plotted agains either predicted performance or block index to check for systematic deviations of the data from the fitted function. :Parameters: *InferenceObject* : a BootstrapInference or BayesInference object containing the actual inference data *ax* : an axes object where the plot should go *regressor* : plot deviance residuals against model prediction (p) or against block index (k) """ if ax==None: ax = prepare_axes ( p.axes() ) else: ax = prepare_axes ( ax ) # Plot the data points if regressor=="p": psi = InferenceObject.evaluate ( InferenceObject.data[:,0] ) elif regressor=="k": psi = N.arange(len(InferenceObject.data[:,0]))+1 else: raise ValueError,"regressor %s is unknown" % regressor psilims = N.array([psi.min(),psi.max()]) devianceresiduals = InferenceObject.devianceresiduals ax.plot ( psi, devianceresiduals, "o", color=rc.allplots['color'] ) # Linear regression A = N.ones((len(psi),2),'d') A[:,1] = psi a,b = N.linalg.lstsq(A,devianceresiduals)[0] ax.plot(psilims,a+b*psilims,':', color=rc.allplots['color'] ) if regressor=="p": if InferenceObject.model["nafc"]==1: ax.set_xlim (0,1) else: ax.set_xlim(1./InferenceObject.model["nafc"],1) # In this case predictions larger than 1 and less than 0 are impossible xtics = list(ax.get_xticks()) for k in xrange(len(xtics)): if xtics[k]>1. or xtics[k]<0.: xtics.pop(k) ax.set_xticks(xtics) # Generate the respective labels if regressor=="p": ax.text(psilims.mean(),ax.get_yticks()[-2],"Rpd=%.3f" % ( InferenceObject.Rpd, ), **rc.text ) xname = "model prediction" elif regressor=="k": ax.text(psilims.mean(),ax.get_yticks()[-2],"Rkd=%.3f" % ( InferenceObject.Rkd, ), **rc.text ) xname = "block index" ax.set_ylabel ( "deviance residuals", **(rc.label+rc.text) ) ax.set_xlabel ( xname, **(rc.label+rc.text) ) return ax def plotppScatter ( simdata, observed, quantity, shortname=None, ax=None ): """plot a scatter diagram to compare observed and predicted data :Parameters: *simdata* : data simulated from the model (typically data from posterior predictives) *obseved* : observed data (transformed in the same way as the posterior predictives) *quantity* : name of the quantity that is checked *shortname* : abbreviation of the plotted quantity *ax* : pylab axes object where the plot should go. """ if ax==None: ax = p.gca() ax.plot ( simdata, observed, '.', color=rc.allplots['color'] ) xl = list(ax.get_xlim()) yl = list(ax.get_ylim()) axmin = N.min ( list(xl)+list(yl) ) axmax = N.max ( list(xl)+list(yl) ) ax.plot ( [axmin,axmax],[axmin,axmax], 'k:' ) ax.set_xlim ( axmin, axmax ) ax.set_ylim ( axmin, axmax ) ax.set_ylabel ( "observed "+quantity, **(rc.label+rc.alltext) ) ax.set_xlabel ( "predicted "+quantity, **(rc.label+rc.alltext) ) # Write diagnostics pval = N.mean( (simdata-observed)>=0 ) ax.set_title ( "Bayesian p (%s)=%.3f" % (shortname,pval), **(rc.text+rc.alltext) ) if pval<0.975 and pval>0.025: return True else: return False def plotHistogram ( simdata, observed, xname, shortname=None, ax=None, hideobserved=False, reference="bootstrap" ): """plot a histogram and compare observed data to it :Parameters: *simdata* : an array of monte-carlo samples of the parameter of interest *observed* : observed value of the parameter of interest (for MCMC samples, it is often reasonable to use this as the value of 'no effect' or something) *xname* : name of the paramter of interest *shortname* : short name of the parameter of interest *ax* : axes object defining the area where the plot should go *hideobserved* : if this is True, the observed value is not plotted *reference* : reference of the data. Could be either a string 'bootstrap'/'bayes' or a number against which the histogram is tested :Output: returns a boolean value indicating whether or not the Null-Hypothesis that observed was drawn from the same distribution as simdata is true """ if ax is None: ax = p.axes() if reference.lower()[:5]== "boots": reference = observed elif reference.lower()[:5]=="bayes": reference = 0 # Remove nan simdata = N.nan_to_num ( simdata ) simdata = simdata[simdata!=0] # Make sure we have a useful shortname if shortname is None: shortname = xname # Correlations plots should be treated differently if shortname[0] == "R": ax.hist ( simdata, bins=N.arange(-1,1,.1) ) ax.set_xlim ( -1, 1 ) else: ax.hist ( simdata, bins=20 ) # Get the tics and ranges # xtics = p.getp(ax,"xticks") # ytics = p.getp(ax,"yticks") # xr = xtics.max()-xtics.min() # yy = [ytics.min(),ytics.max()+0.02*xr] yy = p.array(ax.get_ylim ()) yy[1] += 0.02*(yy[1]-yy[0]) # Plot percentile bars if not hideobserved: c = parameterdict ( {"color": rc.highlight['color']} ) ax.plot ( [observed]*2, yy, **(c+rc.line+rc.allplots) ) if shortname=="D": p95 = p.prctile ( simdata, 95 ) ax.plot ( [p95]*2, yy, ':', color=rc.highlight["color"] ) else: p25,p975 = p.prctile ( simdata, (2.5,97.5) ) ax.plot ( [p25]*2, yy, 'r:', [p975]*2, yy, ':', color=rc.highlight['color'] ) # Draw the full plot ax.set_ylim ( yy ) # Write diagnostics if shortname=="D": ax.set_title ( "%s=%.3f, %s_crit=%.3f" % (shortname, observed, shortname, p95 ), **(rc.text+rc.alltext) ) if reference < p95: return True else: return False else: ax.set_title ( "%s=%.3f, c(2.5%%)=%.3f, c(97.5%%)=%.3f" % (shortname,observed,p25,p975), **(rc.text+rc.alltext) ) if reference>p25 and reference>> d0 = [[0, 28, 50], [2, 33, 50], [4, 38, 50], [6, 45, 50], [8, 45, 50], [10, 49, 50]] >>> d1 = [[0, 22, 50], [2, 34, 50], [4, 31, 50], [6, 42, 50], [8, 42, 50], [10, 46, 50]] >>> d2 = [[0, 26, 50], [2, 31, 50], [4, 38, 50], [6, 47, 50], [8, 49, 50], [10, 49, 50]] >>> constraints = ("","","Uniform(0,.1)") >>> B0 = BootstrapInference ( d0, priors=constraints, plotting={'color': 'r'} ) >>> B1 = BootstrapInference ( d1, priors=constraints, plotting={'color': 'b'} ) >>> B2 = BootstrapInference ( d2, priors=constraints, plotting={'color': 'k'} ) >>> plotPMF ( B0, showaxes=False ) >>> plotPMF ( B1, showaxes=False ) >>> plotPMF ( B2, showaxes=True ) Note that the last call to plotPMF sets showaxes to True and thus draws the axes. """ if ax==None: ax = p.gca() # Plot the psychometric function xmin = InferenceObject.data[:,0].min() xmax = InferenceObject.data[:,0].max() x = N.mgrid[xmin:xmax:100j] psi = InferenceObject.evaluate ( x ) pmfline = ax.plot(x,psi, color = kwargs.setdefault ( 'color', InferenceObject.color ), linestyle = kwargs.setdefault ( 'linestyle', InferenceObject.linestyle ), linewidth = kwargs.setdefault ( 'linewidth', InferenceObject.linewidth ), label = kwargs.setdefault ( 'label', InferenceObject.label ) ) # Plot the data xd = InferenceObject.data[:,0] pd = InferenceObject.data[:,1].astype("d")/InferenceObject.data[:,2] nd = InferenceObject.data[:,2] pmfpoints = ax.scatter ( xd, pd, s=nd, c=kwargs.setdefault ( 'color', InferenceObject.color ), marker=kwargs.setdefault("markertype", InferenceObject.marker) ) # Check axes limits ymin,ymax = -.05,1.05 if ylabel_text is None: if InferenceObject.model["nafc"]>1: ylabel_text = "P(correct)" else: ylabel_text = "P(Yes)" # Determine tics ax.set_ylim ( ymin, ymax ) ytics = list(ax.get_yticks()) # Clean up ytics newytics = [] while len(ytics): yt = ytics.pop(0) if yt>=0 and yt<=1.01: newytics.append(yt) ax.set_yticks ( newytics ) # Write some model information if showdesc: txt = InferenceObject.desc if not InferenceObject.deviance is None: txt = txt+"\nD=%g" % (InferenceObject.deviance,) ax.text ( 0.3*(xmin+xmax),ymin+.1,txt, **(rc.text+rc.alltext) ) return pmfline,pmfpoints,ax def plotThres ( InferenceObject, ax=None, color="b" ): """Plot thresholds and confidence intervals :Parameters: *InferenceObject* : either a BootstrapInference object or a BayesInference object *ax* : a pylab.axes object to be used for the plot. *color* : a pylab color marker """ if ax == None: ax = p.gca() # Determine the range where the data live datarange = InferenceObject.data[:,0].min(),InferenceObject.data[:,0].max() dataw = datarange[1]-datarange[0] for k,cut in enumerate(InferenceObject.cuts): c25,c975 = InferenceObject.getCI ( cut=k, conf=(.025,.975) ) thres = InferenceObject.getThres ( cut ) ylev = InferenceObject.evaluate ( [thres] ) if c25 < datarange[0]-dataw*0.2: bar = [ datarange[0]-dataw*0.2 ] markers = ["<"] c25out = True ax.text ( datarange[0]-dataw*0.2,ylev,"%g"%(c25,), horizontalalignment="center", fontsize=7 ) else: bar = [ c25 ] c25out = False markers = ["|"] if thres > datarange[0] and thres < datarange[1]: bar.append(thres) markers.append("|") if c975 > datarange[1]+dataw*0.2: bar.append(datarange[1]+dataw*0.2) c975out = True ax.text ( datarange[1]+dataw*0.2,ylev,"%g"%(c975,), horizontalalignment="center", fontsize=7 ) markers.append(">") else: bar.append(c975) c975out = False markers.append("|") ax.plot ( bar,[ylev]*len(bar), '-', color=color ) for x,m in zip(bar,markers): ax.plot ( [x], [ylev], marker=m, color=color ) return ax def GoodnessOfFit ( InferenceObject, warn=True ): """Draw a diagnostic figure to help assessing goodness of fit This graphic is intended to help the user determine how well the fitted function describes the data. The plot has 6 fields: +-----+-----+-----+ | 1 | 3 | 5 | +-----+-----+-----+ | 2 | 4 | 6 | +-----+-----+-----+ The fields provide the following information: 1. The data and the fitted psychometric function. "fitted" here means the parameters are the mean of the posterior for BayesInference objects and the (constrained) maximum likelihood fit for BootstrapInference objects. To get an idea of the posterior resp. bootstrap distribution, credibility intervals are plotted at some positions (the location and width of the credibility intervals is given in the constructor). To make the posterior distribution for BayesInference objects really "plastic", a number of samples from the posterior distribution over psychometric functions are also drawn in light blue. The saturation of blue also codes the deviance of the respective function: the more saturated, the better the fit. For BootstrapInference objects, outliers and influential observations are marked as red triangles and red squares. 2. A histogram to approximate the posterior resp. bootstrap distribution of deviances. For BootstrapInference objects this histogram provides important information. It estimates the distribution of deviance that would be expected if the fitted model were perfectly valid. If the deviance of the fitted model is far in the tails of the deviance histogram, this typically indicates a bad fit. In that case, a warning is displayed if warn==True. 3. A plot of model predictions against deviance residuals. If there is no obvious interrelation between model prediction and deviance residuals, this indicates that the model describes the data reasonably well. To get an idea of the interrelation between model prediction and deviance residuals, the best fitting line is plotted as a dotted line. 4. A histogram of samples from the posterior resp. bootstrap distribution of correlations between model prediction and deviance residuals. The interpretation of this histogram differs for BootstrapInference and for BayesInference. For BayesInference the distibution should include 0. If the distribution is clearly shifted away from 0, this is strong evidence, that something is wrong with your model or your data. For BootstrapInference, The distribution shown corresponds to the distribution that would be expected if your fitted psychometric function would perfectly describe the data. Thus, if the maximum likelihood estimate (the vertical bold red line) is in the extremes of the distribution, this is strong evidence, that something is wrong with your model or your data. 5,6 Similar to 3 and 4 but form correlations between block index and deviance residuals. Correlations between block index and deviance residuals indicate nonstationary data as should be found during e.g. perceptual learning. :Parameters: *warn* : if warn is set to True, red warning messages are displayed whenever the fit does not seem to describe the data well. """ if InferenceObject.mcestimates is None: raise ValueError, "Goodness of fit diagnostics require monte carlo samples. Try to call the sample() method of your inference object." fig = p.figure ( figsize=(10,8) ) ax_plot,ax_rpd,ax_rkd = axes_array_h ( fig, 3, (.22,.3), (.1,.6), dist=0.1, showally=True ) ax_deviance,ax_rpdh,ax_rkdh = axes_array_h ( fig, 3, (.22,.3), (.1,.1), dist=0.1, showally=True ) infer = InferenceObject.__repr__().split()[1] if infer not in ["BayesInference","BootstrapInference", "ASIRInference"]: raise ValueError, "Unknown InferenceObject: %s" % (InferenceObject.__repr__().split()[1],) # First plot about deviance if infer in ["BayesInference","ASIRInference"]: InferenceObject.drawposteriorexamples ( ax=ax_plot ) plotThres ( InferenceObject, ax=ax_plot ) plotPMF ( InferenceObject, ax=ax_plot, showdesc=True ) if infer in ["BayesInference","ASIRInference"]: distname = "posterior" observed = -2*N.log ( InferenceObject.nullevidence ) good = plotppScatter ( InferenceObject.ppdeviance, InferenceObject.mcdeviance, "deviance", "D", ax_deviance ) elif infer == "BootstrapInference": distname = "bootstrap" observed = InferenceObject.deviance good = plotHistogram ( InferenceObject.mcdeviance, observed, "bootstrap deviance", "D", ax_deviance ) if warn and not good: ax_deviance.text ( N.array(ax_deviance.get_xlim()).mean(), N.array(ax_deviance.get_ylim()).mean(), "The fitted model is a bad\ndescription of the data!", horizontalalignment="center", verticalalignment="center", rotation=45, **(rc.warning+rc.alltext) ) # The other two plots are in a loop: Rpd, Rkd ax = [ax_rpd,ax_rkd] axh = [ax_rpdh,ax_rkdh] index = ["p","k"] warningtext = ["Simulated Rpd differs from observed!\nTry other sigmoid?", "Simulated Rkd differs from observed!\nData are nonstationary!"] for k in xrange ( 2 ): plotRd ( InferenceObject, ax[k], index[k] ) name = "R%sd" % (index[k],) if infer in ["BayesInference","ASIRInference"]: good = plotppScatter ( eval("InferenceObject.pp%s" % (name,)), eval("InferenceObject.mc%s"%(name,)), name,name, axh[k] ) else: good = plotHistogram ( eval("InferenceObject.mc%s" % (name,)), eval("InferenceObject.%s"%(name,)), "bootstrap "+name, name, axh[k] ) if warn and not good: axh[k].text ( p.array(axh[k].get_xlim()).mean(), p.array(axh[k].get_ylim()).mean() , warningtext[k], \ horizontalalignment="center", verticalalignment="center", rotation=45, **(rc.warning+rc.alltext) ) def plotGeweke ( BayesInferenceObject, parameter=0, ax=None, warn=True ): """Geweke plot of moving average of samples :Parameters: *BayesInferenceObject* : a BayesInference object that contains all the infromation about the sampling process *parameter* : index of the model parameter of interest *ax* : the pylab.axes object where the plot should go *warn* : should a warning message be displayed if non stationarity of the samples is observed? """ if BayesInferenceObject.mcestimates is None: raise ValueError, "Geweke MCMC convergence diagnostic requires monte carlo samples. Try to call the sample() method of your inference object." stationary,z,bad = BayesInferenceObject.geweke ( parameter ) if ax is None: ax = prepare_axes (p.axes()) x = N.arange (z[:,0].shape[0])+1 for k in xrange ( z.shape[-1] ): ax.plot ( x, z[:,k], 'o-' ) ax.plot ( ax.get_xlim(), [-2]*2, 'k:' ) ax.plot ( ax.get_xlim(), [ 2]*2, 'k:' ) if warn and not stationary: nsegments = z.shape[0] ax.text(0.5*nsegments,0,"chains did not converge", rotation=45, verticalalignment="center", horizontalalignment="center", **(rc.warning+rc.alltext) ) ax.set_yticks ( N.array( (-3,-2,-1,0,1,2,3) ) ) ax.set_xticks ( x ) ax.set_ylim ( -3,3 ) ax.set_xlim ( 0.5, z[:,k].shape[0]+.5 ) ax.set_xlabel ( "chain segment", **(rc.label+rc.alltext) ) ax.set_ylabel ( "z-score", **(rc.label+rc.alltext) ) return ax def plotChains ( BayesInferenceObject, parameter=0, ax=None, raw=False, warn=True ): """Simply plot all chains for a single parameter :Parameters: *parameter* : index of the model parameter to plot *raw* : plot raw samples instead of thinned samples after burnin *ax* : axes in which to print *warn* : if True, warnings are written into the plot """ if BayesInferenceObject.mcestimates is None: raise ValueError, "Plotting MCMC chains requires monte carlo samples. Try to call the sample() method of your inference object." # Do we have an appropriate axis? if ax==None: ax = prepare_axes ( p.axes() ) # Plot the chains for c in xrange(BayesInferenceObject.nchains): samples = BayesInferenceObject.getsamples ( c, raw=raw ) ax.plot ( samples[:,parameter] ) # Learn something about the axes xtics = N.array(ax.get_xticks()) x0 = xtics.min() xr = xtics.max()-xtics.min() ytics = ax.get_yticks() y0 = ytics.min() yr = N.array(ytics.max()-ytics.min()) if BayesInferenceObject.nchains>2: ax.text(x0+0.6*xr,y0+0.95*yr,r"$\hat{R} = %.4f$" % (BayesInferenceObject.Rhat ( parameter ) ) ) if warn and BayesInferenceObject.Rhat(parameter)>1.1: ax.text(x0+0.5*xr,y0+0.5*yr,"Chains do not seem to sample\nfrom the same distribution!", horizontalalignment="center",verticalalignment="center",rotation=45,**(rc.warning+rc.alltext)) ax.set_xlabel ( "sample #", **(rc.label+rc.alltext) ) parname = BayesInferenceObject.parnames[parameter] if parname in ["alpha","beta","gamma","lambda"]: parname = r"$\%s$" % (parname,) ax.set_ylabel ( parname, **(rc.label+rc.alltext) ) return ax def plotParameterDist ( InferenceObject, parameter=0, ax=None ): """Plot the distribution of parameters :Parameters: *InferenceObject* : either a BootstrapInference object or a BayesInference object containing the samples of the parameter distribtution *parameter* : index of the model parameter of interest *ax* : pylab.axes object where the plot should go """ if InferenceObject.mcestimates is None: raise ValueError, "Plotting distribution of parameters requires monte carlo samples. Try to call the sample() method of your inference object." if ax is None: ax = prepare_axes ( p.axes() ) samples = InferenceObject.mcestimates[:,parameter] h,b,ptch = ax.hist ( samples, bins=20, normed=True, histtype="step", lw=2 ) if InferenceObject.__repr__().split()[1] in ["BayesInference","ASIRInference"]: priorstr = InferenceObject.model["priors"] if not priorstr is None: priorstr = priorstr[parameter] m = re.search ( r"(\w+)\((-?\d*\.?\d*[eE]?-?\d*),(-?\d*\.?\d*[eE]?-?\d*)\)", priorstr ) if not m is None: dist,prm1,prm2 = m.groups() prm1,prm2 = float(prm1),float(prm2) x = N.mgrid[b.min():b.max():100j] if dist.lower () == "gauss": ax.plot(x,stats.norm.pdf(x,prm1,prm2)) elif dist.lower () == "beta": ax.plot(x,stats.beta.pdf(x,prm1,prm2)) elif dist.lower () == "gamma": ax.plot(x,stats.gamma.pdf(x,prm1,scale=prm2)) elif dist.lower () == "ngamma": ax.plot(x,stats.gamma.pdf(-x,prm1,scale=prm2)) elif dist.lower () == "uniform": ax.plot(x,stats.uniform.pdf(x,prm1,prm2)) elif dist.lower () == "invgamma": ax.plot(x,stats.invgamma.pdf(x,prm1,scale=prm2)) # Highlight estimate and credibility intervals prm = InferenceObject.estimate[parameter] c25,c975 = p.prctile ( samples, (2.5,97.5) ) ym = ax.get_ylim() ax.plot ( [c25]*2,ym,'b:', [c975]*2,ym,'b:' ) ax.plot ( [prm]*2,ym,'b' ) prname = InferenceObject.parnames[parameter] if prname in ["alpha","beta","gamma","lambda"]: prname = r"\%s" % (prname,) message = r"$\hat{%s}"%(prname,) message += r"$=%.3f, CI(95)=(%.3f,%.3f)" % ( prm,c25,c975 ) ax.set_title ( message, **(rc.text+rc.alltext) ) ax.set_xlabel ( InferenceObject.parnames[parameter], **(rc.label+rc.alltext) ) ax.set_ylabel ( "density estimate", **(rc.label+rc.alltext) ) def plotThresholdDist ( InferenceObject, cut=0, ax=None ): """Plot the distribution of thresholds :Parameters: *InferenceObjecxt* : a BootstrapInference or BayesInference object containing the desired data *cut* : index (!) of the desired cut *ax* : axes object to place the plot in. """ if InferenceObject.mcestimates is None: raise ValueError, "Plotting distributions of thresholds requires monte carlo samples. Try to call the sample() method of your inference object." if ax is None: ax = prepare_axes ( p.axes() ) # Plot histogram mcthres = InferenceObject.mcthres[:,cut] h,b,ptch = ax.hist ( mcthres, bins=20, normed=True, histtype="step", lw=2 ) # Highlight estimate and credibility intervals thres = InferenceObject.getThres ( InferenceObject.cuts[cut] ) c25,c975 = InferenceObject.getCI ( cut=cut, conf=(0.025,0.975) ) yl = ax.get_ylim () ax.plot( [c25]*2,yl,'b:', [c975]*2,yl,'b:' ) ax.plot ( [thres]*2, yl, 'b' ) ax.set_title ( r"F$^{-1}$(%.2f)=%.3f, CI(95%%)=(%.3f,%.3f)" % (InferenceObject.cuts[cut], thres, c25, c975 ), horizontalalignment="center", verticalalignment="bottom", **(rc.text+rc.alltext) ) ax.set_xlabel ( r"F$^{-1}$(%.2f)" % ( InferenceObject.cuts[cut], ), **(rc.label+rc.alltext) ) ax.set_ylabel ( "density estimate", **(rc.label+rc.alltext) ) ax.set_ylim ( yl ) return ax def ThresholdPlot ( InferenceObject ): """Show distributions and estimates for all thresholds :Parameters: *InferenceObject* a BootstrapInference or BayesInference object containing the desired data """ if InferenceObject.mcestimates is None: raise ValueError, "Plotting distributions of thresholds requires monte carlo samples. Try to call the sample() method of your inference object." nthres = len(InferenceObject.cuts) axw = 1./nthres fig = p.figure ( figsize=(3*nthres,3) ) allax = axes_array_h ( fig, nthres, (.8/nthres-.08/(nthres-1),.7), (.1,.2), dist=.1 ) for k,ax in enumerate ( allax ): # ax = p.subplot ( 1,nthres,k+1 ) ax = plotThresholdDist ( InferenceObject, k, prepare_axes ( ax ) ) return allax def ParameterPlot ( InferenceObject ): """Show distributions and estimates for all parameters in the model :Parameters: *InferenceObject* : a BootstrapInference or BayesInference object containing the desired data """ if InferenceObject.mcestimates is None: raise ValueError, "Plotting distributions of parameters requires monte carlo samples. Try to call the sample() method of your inference object." nparams = len(InferenceObject.parnames) axw = 1./nparams fig = p.figure (figsize=(3*nparams,3)) allax = axes_array_h ( fig, nparams, (.8/nparams-.08/(nparams-1),.65), (.1,.2), dist=.1 ) for k,ax in enumerate ( allax ): # ax = p.subplot ( 1, nparams, k+1 ) plotParameterDist ( InferenceObject, k, ax ) return allax def ConvergenceMCMC ( BayesInferenceObject, parameter=0, warn=True ): """Diagram to check convergence of MCMC chains for a single parameter :Parameters: *BayesInferenceObject* : a BayesInference object containing all information about the model and the posterior distribution *parameter* : model parameter of interest. So far, no model derived parameters such as thresholds are supported *warn* : should warnings be displayed if the samples look suspicious? """ if BayesInferenceObject.mcestimates is None: raise ValueError, "MCMC convergence diagnostics require monte carlo samples. Try to call the sample() method of your inference object." fig = p.figure ( figsize=[9,3] ) ax_chains,ax_geweke,ax_prm = axes_array_h ( fig, 3, (.2,.65),(.1,.2), dist=.1 ) plotChains ( BayesInferenceObject, parameter, ax_chains, warn=warn ) plotGeweke ( BayesInferenceObject, parameter, ax_geweke, warn=warn ) plotParameterDist ( BayesInferenceObject, parameter, ax_prm ) def plotSensitivity ( BootstrapInferenceObject, ax=None ): """Visualize a sensitivity analysis to determine expanded bootstrap confidence intervals Sensitivity analysis is used for BootstrapInference objects to expand the confidence intervals in order to obtain more realistic coverage. This function calls the sensitivity_analysis() method of the BootstrapInferenceObject with default parameters. If other parameters are requested, the sensitivity_analysis() method should be called manually :Parameters: *BootstrapInferenceObject* : Inference object to be analyzed *ax* : pylab axes that should be used for plotting """ if BootstrapInferenceObject.mcestimates is None: raise ValueError, "Sensitivity analysis requires monte carlo samples. Try to call the sample() method of your inference object." if ax==None: ax = p.axes() # Determine axes ranges prm1 = BootstrapInferenceObject.mcestimates[:,0] prm2 = BootstrapInferenceObject.mcestimates[:,1] ax.plot(prm1,prm2,'w.',markersize=1) xmin,xmax = ax.get_xlim() ymin,ymax = ax.get_ylim() ax.cla() # Plot the density estimate in the background x,y = N.mgrid[xmin:xmax:100j,ymin:ymax:100j] C = BootstrapInferenceObject.mcdensity(N.c_[N.ravel(x),N.ravel(y)].T) C.shape = 100,100 ax.imshow( C.T,origin="lower",extent=(xmin,xmax,ymin,ymax), cmap=p.cm.gray_r ) # Get the points and make sure, a sensitivity_analysis has indeed been run thres,slope,points = BootstrapInferenceObject.sensitivity_analysis(verbose=False) # plot the points ax.fill(points[:,0],points[:,1],fill=False,edgecolor="r",linewidth=2) ax.plot(prm1,prm2,"b.",markersize=2) ax.plot(points[:,0],points[:,1],'rd',markersize=5) ax.plot([BootstrapInferenceObject.estimate[0]],[BootstrapInferenceObject.estimate[1]],'ro',markersize=5) # plot marginal percentiles prm1lims = p.prctile ( BootstrapInferenceObject.mcestimates[:,0], (2.5,25,75,97.5) ) prm2lims = p.prctile ( BootstrapInferenceObject.mcestimates[:,1], (2.5,25,75,97.5) ) ax.plot( prm1lims, [ymin-0.05*(ymax-ymin)]*4, 'b-', [xmin-0.05*(xmax-xmin)]*4, prm2lims, 'b-' ) ax.plot( prm1lims[1:3], [ymin-0.05*(ymax-ymin)]*2, 'b-', [xmin-0.05*(xmax-xmin)]*2, prm2lims[1:3], 'b-', linewidth=5 ) # Draw axes drawaxes ( ax, ax.get_xticks(), "%g", ax.get_yticks(), "%g", BootstrapInferenceObject.parnames[0], BootstrapInferenceObject.parnames[1] ) def plotInfluential ( InferenceObject ): """Diagnostic plot for detecting influential observations Determining influential observations follows a different logic for bootstrap and for bayes inference. A block is labelled an influential observation if the fit for a dataset without that point is significantly different from the fit including that point. For BootstrapInference objects, this is quantified using a normed distance of the maximum likelihood fit including the block and withouth that block. This distance is normed in the following way: If the maximum likelihood fit for the reduced dataset remains inside the 95% confidence limits of the maximum likelihood fit for the full dataset, the influence value is below 1. Thus, influence values large than 1 indicate a problem with the data set. For BayesInference objects, the influence of a block is simply quantified as the Kullbach-Leibler divergence of the posterior for the full data set from the posterior for the reduced data set. :Parameters: *InferenceObject* : Data set for which the influential observations are to be plotted """ maxinfl = N.argmax(InferenceObject.infl) ind = range ( InferenceObject.data.shape[0] ) ind.pop(maxinfl) # influencedDataset = psignidata.BootstrapInference( InferenceObject.data[ind,:], # sample=False, **(InferenceObject.model)) # influencedDataset = psignidata.BayesInference ( InferenceObject.data[ind,:], **(InferenceObject.model) ) est = interface.mapestimate ( InferenceObject.data[ind,:], start=InferenceObject.estimate, **(InferenceObject.model) )[0] x = N.mgrid[InferenceObject.data[:,0].min():InferenceObject.data[:,0].max():100j] influencedPMF = interface.diagnostics ( x, est, nafc = InferenceObject.model["nafc"], sigmoid = InferenceObject.model["sigmoid"], core = InferenceObject.model["core"] ) p.figure ( figsize=(6,8) ) # ax = p.axes ( (0.0,.5,.9,.5) ) ax = prepare_axes ( p.subplot ( 2,1,1 ) ) ax.set_ylabel ( r"$\Psi(x)$" ) if InferenceObject.__repr__().split()[1] in ["BayesInference","ASIRInference"]: InferenceObject.drawposteriorexamples ( ax=ax ) plotPMF ( InferenceObject, ax=ax, showaxes=True, showdesc=False, color="b", linewidth=2 ) ax.plot ( [InferenceObject.data[maxinfl,0]], [InferenceObject.data[maxinfl,1].astype("d")/InferenceObject.data[maxinfl,2]], 'rx', markersize=20, markeredgewidth=5 ) # ax = plotPMF ( influencedDataset, ax=ax, showdesc=False, showaxes=True, color="r", markertype=([(0,0)],0), linewidth=2 )[-1] ax.plot ( x, influencedPMF, color="r", linewidth=2 ) xl = list(ax.get_xlim ()) # ax = p.axes ( (0.0, 0., .9, .5) ) ax = p.subplot ( 2,1,2, sharex=ax ) if InferenceObject.__repr__().split()[1] == "BootstrapInference": ax.plot ( [InferenceObject.data[:,0].min(),InferenceObject.data[:,0].max()], [1,1], 'k:' ) yname = "Influence" else: yname = "D_KL( full || reduced )" ax.plot ( InferenceObject.data[:,0], InferenceObject.infl, 'bo' ) ax.set_xlim(xl) drawaxes ( ax, ax.get_xticks(), "%g", ax.get_yticks(), "%g", r"stimulus intensity $x$", yname ) def plotMultiplePMFs ( *InferenceObjects, **kwargs ): """ Plot multiple psychometric functions :Parameters: *InferenceObjects* : The Inference Objects that should be plotted. If the inference objects contain information about themselves, this information is used. *ax* : the axis object where the plot should go *xlabel* : text to be written on the y axis *ylabel* : text to be written on the x axis *ci* : boolean indicating whether credibility intervals should be drawn by default, this is False :Example: This example shows how to plot multiple psychometric functions >>> d0 = [[0, 28, 50], [2, 33, 50], [4, 38, 50], [6, 45, 50], [8, 45, 50], [10, 49, 50]] >>> d1 = [[0, 22, 50], [2, 34, 50], [4, 31, 50], [6, 42, 50], [8, 42, 50], [10, 46, 50]] >>> d2 = [[0, 26, 50], [2, 31, 50], [4, 38, 50], [6, 47, 50], [8, 49, 50], [10, 49, 50]] >>> constraints = ("","","Uniform(0,.1)") >>> B0 = BootstrapInference ( d0, priors=constraints,plotprm={"color": "r", "label": "Condition 0"} ) >>> B1 = BootstrapInference ( d1, priors=constraints, plotprm={"color": "b","label": "Condition 1"} ) >>> B2 = BootstrapInference ( d2, priors=constraints, plotprm={"color": "b","label": "Condition 2"} ) >>> plotMultiplePMFs ( B0, B1, B2 ) """ ax = kwargs.setdefault ( "ax", None ) if ax is None: ax = p.axes() pmflines = [] pmflabels= [] pmfdata = [] for pmf in InferenceObjects: l,d = plotPMF ( pmf, showaxes=False, showdesc=False, ax=ax )[:2] pmflines.append(l) pmfdata.append(d) pmflabels.append(pmf.label) if kwargs.setdefault ( "ci", False ): plotThres ( pmf, ax, color=pmf.color ) ylabel_text = kwargs.setdefault("ylabel", None) if ylabel_text is None: if pmf.model["nafc"] < 2: ylabel_text = "P(Yes)" else: ylabel_text = "P(correct)" # Determine tics # p.setp(ax,frame_on=False,ylim=(-.05,1.05)) xtics = p.getp(ax,'xticks') ytics = list(p.getp(ax,'yticks')) # Clean up ytics for k,yt in enumerate(ytics): if yt<0 or yt>1: ytics.pop(k) ytics = N.array(ytics) drawaxes ( ax, xtics, "%g", ytics, "%g", kwargs.setdefault("xlabel", "stimulus intensity"), ylabel_text ) # Draw legend ax.legend (pmflines,pmflabels,'lower right') return pmflines,pmfdata def plotJoint ( InferenceObject ): """Plot joint distribution of parameters For ASIRInference objects, also the fitted marginals are shown """ nprm = InferenceObject.nparams parnames = InferenceObject.parnames fig = p.figure () txt = [] h,w = .9/nprm,.9/nprm for i in xrange ( nprm ): ax = prepare_axes ( fig.add_axes ( [.07+i*w,.97-(i+1)*h,.8*w,.8*h] ) ) ax.xaxis.set_major_locator(MaxNLocator(5)) if parnames[i] == "lambda": pr = r"\lambda" elif parnames[i] == "guess": pr = r"\gamma" else: pr = parnames[i] if InferenceObject.inference == "ASIR": gr = InferenceObject.grids[i] mrg = InferenceObject.margins[i] ax.plot ( gr, mrg, 'b-.' ) gn,gx = InferenceObject.getCI ( parnames[i], conf=(.01,.99) ) x = p.mgrid[gn:gx:100j] ax.plot ( x, InferenceObject.posterior_pdf ( i, x ), 'b-', linewidth=2 ) ax.plot ( x, InferenceObject.prior_pdf ( i, x ), 'k:' ) txt.append ( r"$%s\sim%s$" % (pr, InferenceObject.posterior_approximations[i].strip("$")) ) ax.set_xlabel ( r"$"+pr+r"$" ) th = InferenceObject.mcestimates[:,i] if not (th==0).all(): hist,b = N.histogram ( th, normed=True ) ax.bar ( b[:-1], hist, N.diff(b), color=[.8,.8,1], edgecolor=[.8,.8,1] ) for i in xrange ( nprm ): ti = InferenceObject.mcestimates[:,i] for j in xrange ( i+1, nprm ): ax = prepare_axes ( fig.add_axes ( [.07+j*w, .97-(i+1)*h, .8*w,.8*h] ) ) tj = InferenceObject.mcestimates[:,j] ax.plot ( tj, ti, '.' ) ax.xaxis.set_major_locator(MaxNLocator(5)) a,b,r,pr,se = stats.linregress ( tj, ti ) x = N.sort(tj) ax.plot ( x, a*x+b, 'y' ) ax.text ( ax.get_xlim()[0], ax.get_ylim()[0],r"$r=%.2f, p=%g$" % ( r,pr ), fontsize=10, horizontalalignment="left", verticalalignment="bottom" ) if InferenceObject.inference == "ASIR": txt.append ( r"duplicates: %g" % (InferenceObject.duplicates,) ) fig.text ( .1,.1,"\n".join(txt) ) gof = GoodnessOfFit if __name__ == "__main__": import doctest doctest.testmod() psignifit3-3.0~beta.20120611.1/pypsignifit/psignipriors.py000066400000000000000000000077011176542545200232060ustar00rootroot00000000000000#!/usr/bin/env python __doc__ = """This module gives default priors for bayesian estimation of psychometric functions""" import numpy as np from scipy import stats, optimize def default(x): """ All default priors, with default settings. :Parameters: *x* : array of stimulus intensities used in the experiment :Returns: tuple of 3 priors: m, w, lapse """ return default_mid(x)[0], default_width(x)[0], default_lapse()[0] def default_lapse ( observer="normal" ): """Default prior for the lapse rate :Parameters: *observer* : Typically, animals have much higher lapse rates than humans. The same is true for some clinical patient groups. Based on simulation results, we suggest different priors for animals or patients and for healthy adult humans. Thus, select either observer='normal' for healthy adult humans or observer='lapse' for an observer type with unusually high lapse rates. """ if observer=="normal": return "Beta(2,20)",0.,0.5 elif observer=="lapse": return "Beta(2.5,12)",0.,0.5 else: raise Exception, "Unknown observer %s" % (observer,) def default_width ( x, method="moments" ): """Default prior for the width of a psychometric function :Parameters: *x* : array of stimulus intensities used in the experiment *method* : method to determine the range spanned by the prior. This could either be 'moments' which implies that the maximum width is mean+standard deviation of the gamma distribution and the minimum width is set to mean-standard deviation. Alternatively method could a sequence of quantiles which implies that the quantiles are matched with the maximum and minimum width. """ xx = np.sort(x) wmin = np.min(np.diff(xx)) wmax = 2*(xx[-1]-xx[0]) if method=='moments': wr = wmin/wmax k = ((1+wr)/(1-wr))**2 th = wmax/(k+np.sqrt(k)) elif isinstance ( method, (tuple,list) ): def error ( prm ): e = stats.gamma.cdf ( [wmin,wmax], prm[0], scale=prm[1] ) - np.array(method) e = np.sum(e**2) if np.isnan ( e ): return 10000. else: return e k,th = optimize.fmin ( error, [1.,4.] ) return "Gamma(%g,%g)" % (k,th),wmin,wmax def default_mid ( x, method="moments" ): """Default prior for the midpoint (threshold) of a psychometric function :Parameters: *x* : array of stimulus intensities used in the experiment *method* : method to determine the range spanned by the prior. This could either be 'moments' which implies that the maximum stimulus intensity is mean+standard deviation of the normal distribution and the minimum stimulus intensity is set to mean-standard deviation. Alternatively method could a sequence of quantiles which implies that the quantiles are matched with the maximum and minimum stimulus intensities. """ mmin = np.min(x) mmax = np.max(x) if method == "moments": mu = 0.5*(mmin+mmax) sg = 0.5*(mmax-mmin) elif isinstance ( method, (tuple,list) ): zmin,zmax = stats.norm.ppf ( method ) sg = (mmax-mmin)/(zmax-zmin) mu = mmin - sg*zmin return "Gauss(%g,%g)" % (mu,sg), mmin, mmax if __name__ == "__main__": import pylab as pl x = np.mgrid[0:10:100j] xx = np.array([1,2,3,5,6.,4.5,4]) # g,k,th = default_width ( xx, [.1,.9] ) # print g # # pl.plot ( xx, [0]*len(xx), 'o', x, (x/th)**(k-1)*np.exp(-x/th) ) # pl.plot ( xx, [0]*len(xx), 'o', x, stats.gamma.pdf ( x, k, scale=th ), x, stats.gamma.cdf ( x, k, scale=th ) ) # g,mu,sg = default_mid ( xx ) # print g # pl.plot ( xx, [0]*len(xx), 'o', x, stats.norm.pdf ( x, mu, scale=sg ) ) # pl.show() psignifit3-3.0~beta.20120611.1/pypsignifit/psigobservers.py000066400000000000000000000536621176542545200233620ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### __docformat__ = "restructuredtext" import numpy as N from scipy import stats import pypsignifit interface = pypsignifit.interface from psignidata import Property __doc__ = """ If we want to know how well a psychometric function can describe an observers behavior, we may want to simulate an observer. This module implements a number of simulated observers. The basic observer does not violate any assumptions. However more elaborated observers violate some of the assumptions that are typical when fitting psychometric functions. """ __all__ = ["Observer","LinearSystemLearner","CriterionSettingObserver","BetaBinomialObserver"] class Observer ( object ): def __init__ ( self, *params, **model ): """A stationary binomial observer This is the observer, we all want: No interdependencies between trials, no learning, no fluctuations in attention or motivation. Perfectly binomial responses in accordance with the psychometric function shape you supply. :Parameters: *params* : a list of parameters in the model. For nAFC tasks the parameters are a,b,lapse for a Yes/No task the parameters are a,b,lapse,guess *model* : a list of keyword arguments specifying the model. These are the same as in the psignidata module :Example: >>> O = Observer ( 4, 1, .02 ) >>> O.seed ( 0 ) >>> O.DoATrial ( 3 ) 1 >>> O.DoABlock ( 4, 40 ) 28 >>> O.DoABlock ( 6, 40 ) 37 >>> O.DoAnExperiment ( [2,4,6], 50 ) [[2, 27, 50], [4, 38, 50], [6, 46, 50]] >>> O.data [[3, 1, 1], [4, 28, 40], [6, 37, 40], [2, 27, 50], [4, 38, 50], [6, 46, 50]] :Example: >>> model ={"sigmoid" : "gumbel_r", "core" : "mw01", "nafc" : 2} >>> correct = [0.1, 0.3, 0.5, 0.7, 0.9, 0.99] >>> ob = Observer(4, 4, 0.05, **model) >>> levels = ob.getlevels(correct) >>> data = ob.DoAnExperiment(levels, ntrials=50) """ if model.setdefault( "nafc", 2 ) == 1: self.a,self.b,self.lapse,self.guess = params else: self.a,self.b,self.lapse = params self.guess = 1./model["nafc"] # Make sure, a,b,lapse and guess are floats self.a = float(self.a) self.b = float(self.b) self.lapse = float(self.lapse) self.guess = float(self.guess) self.model = { "sigmoid": model.setdefault ( "sigmoid", "logistic" ), "core": model.setdefault ( "core", "ab" ), "nafc": model.setdefault ( "nafc", 2 ) } self.data = [] def DoATrial ( self, stimulus_intensity=1 ): """Simulate a single trial :Parameters: *stimulus_intensity* : stimulus intensity to be presented :Output: The response in the trail (1/0 coding for Yes/No in Yes/No-Tasks or for Correct/Incorrect in nAFC tasks) """ prob = float( interface.diagnostics ( [stimulus_intensity], self.params, sigmoid=self.model["sigmoid"], core=self.model["core"], nafc=self.model["nafc"] ) ) resp = int ( N.random.rand()" % (self.a,self.b,self.lapse,self.guess,self.model["core"],self.model["sigmoid"]) else: return "< Observer a=%g,b=%g,lapse=%g,core=%s,sigmoid=%s >" % (self.a,self.b,self.lapse,self.model["core"],self.model["sigmoid"]) def getlevels ( self, cuts ): """Determine stimulus levels that correspond to predefinde levels of performance""" return interface.diagnostics ( [[1,2,3]], self.params, self.model["nafc"], self.model["sigmoid"], self.model["core"], cuts )[3] def evaluate ( self, stimulus_intensities ): """Evaluate the psychometric function :Parameters: *stimulus_intensities* : stimulus intensities at which the psychometric function should be evaluated. """ return interface.diagnostics ( stimulus_intensities, self.params, sigmoid=self.model["sigmoid"], core = self.model["core"], nafc=self.model["nafc"] ) @Property def params (): "parameters of the model" def fget ( self ): if self.model["nafc"] < 2: return [self.a,self.b,self.lapse,self.guess] else: return [self.a,self.b,self.lapse] @Property def thres (): "determine 50%% of the model" def fget ( self ): return float(interface.diagnostics ( [], self.params, cuts=0.5, nafc=self.model["nafc"], sigmoid=self.model["sigmoid"], core=self.model["core"] )[3]) class LinearSystemLearner ( Observer ): def __init__( self, *params, **model ): """A nonstationary observer that learns like a linear system in one or more parameters For this observer, the parameters of the psychometric function change: The parameters given to the constructor are initial values. In addition, a dictionary is given containing the learning parameters. The constructor requires a dictionary that describes the changes of the parameters. The dictionary has keys 'a', 'b', and/or 'lapse'. For each key, there are two parameters: the rate of decay and the asymptote where the parameter converges. Thus {'a' : ( 40, 3)} means that after every trial, the a parameter is modified according to a -= (a-3)/4 :Parameters: *params* : parameters of the model a, b, lapse and in Yes/No tasks also guess. In addition, a dictionary is required to describe the changes of the parameters (see above) *model* : a list of keyword arguments to describe the model. These are the same as in the psignidata module. :Example: >>> O = LinearSystemLearner ( 7, 2, .02, {'a': (40,3)} ) >>> O.seed ( 0 ) >>> O.a 7.0 >>> O.DoATrial ( 3 ) 1 >>> O.DoABlock ( 4, 50 ) 34 >>> O.DoAnExperiment ( [4,2,8,10,6], 50 ) [[4, 43, 50], [2, 32, 50], [8, 48, 50], [10, 49, 50], [6, 38, 50]] >>> O.data [[3, 1, 1], [4, 34, 50], [4, 43, 50], [2, 32, 50], [8, 48, 50], [10, 49, 50], [6, 38, 50]] >>> O.a 3.0019608723226945 """ # TODO: An other example for sharper discriminations (b) and for fatigue (lapse) Observer.__init__ ( self, *(params[:-1]), **model ) self.__parstring = "a=%g,b=%g,lapse=%g" % (self.a,self.b,self.lapse) if self.model["nafc"] < 2: self.__parstring += ",guess=%g" % (self.guess,) self.__parstring += ",core=%s,sigmoid=%s" % (self.model["core"],self.model["sigmoid"]) self.learn = params[-1] def DoATrial ( self, stimulus_intensity=1 ): """Simulate a single trial with learning :Parameters: *stimulus_intensity* : intensity of the presented stimulus :Output: either 1 or 0 indicating Yes/No in Yes/No-Tasks or Correct/Incorrect in nAFC """ # Get the response: resp = Observer.DoATrial ( self, stimulus_intensity ) # Modify parameters: for prm,vals in self.learn.iteritems(): if prm in ["a","m"]: self.a -= (self.a-vals[1])/vals[0] elif prm in ["b","w"]: self.b -= (self.b-vals[1])/vals[0] elif prm=="lapse": self.lapse -= (self.lapse-vals[1])/vals[0] else: # This should issue a warning raise ValueError, "Trying to modify parameter "+prm+" which does not make sense" return resp def DoABlock ( self, stimulus_intensity=1, ntrials=50 ): """Simulate a block of trials with learning :Parameters: *stimulus_intenstiy* : intensity of the presented stimulus *ntrials* : number of repetitions of the stimulus :Output: the number of Yes-responses in a Yes/No-task or the number of correct responses in nAFC """ self.data.append ( [stimulus_intensity, 0, 0] ) resp = 0 for k in xrange(ntrials): resp += self.DoATrial ( stimulus_intensity ) return resp def __str__ ( self ): return "< LinearSystemLearner %s,learning: %s >" % (self.__parstring,self.learn) class CriterionSettingObserver ( Observer ): def __init__ ( self, *params, **model ): """A nonstationary observer that recalibrates its decision process according to CST Criterion setting theory (CST) is an extension to signal detection theory that was originally proposed by Treisman & Williams (1984): each isolated psychophysical decision is described in terms of signal detection theory. In addition, the criterion used by the observer is updated from trial to trial. There are two processes describing the updating of the criterion: 1. *stabilization* : The criterion is moved into the direction of new incoming stimuli. This results in the criterion being placed roughly in the middle of the stimulus stream. Thus, stabilization can be said to maximize information transmission. 2. *tracking* : The criterion is placed in a direction that increases repetitions of the same response. This strategy can be considered as a prior for an unchanging outside world. Both, stabilization and tracking are described in the form of linearly decreasing traces. If Ec(j) ist the effective criterion on trial j and E(j) is the sensory input on trial j, then this will result in a stabilization trace of the form Ds*( E(j) - Ec(j) ). After one trial, this trace will have decreased on the next trial j+1 to Ds*( E(j) - Ec(j) ) - ds. Thus, Ec(j+1) = Ec(j) + Ds*( E(j) - Ec(j))-ds. Similarly for tracking, there are two parameters Dr and dr describing the size of an indicator trace directly after a response has been made and describing the decrease of an indicator trace from one trial to another. :Parameters: *params* : a,b,lapse parameters of the psychometric function describing the interrelation between stimulus intensity and sensitivity (where sensitivity is given in fraction of correct responses in 2AFC). E0 the reference criterion, i.e. Ec(0) := E0 Ds,ds parameters of the stabilization mechanism Dr,dr parameters of the tracking mechanism :Example: >>> O = CriterionSettingObserver ( 4., 1., 0.02, 0.5, 0.1, 0.005, 0.1, 0.01 ) >>> O.seed ( 0 ) >>> O.DoATrial ( 1 ) 0 >>> O.DoABlock ( 3, 30 ) 24 >>> O.DoABlock ( 3, 30, 0 ) (5, 11, 8, 19) """ # Make sure, the parameters of the psychometric function are interpreted as 2AFC model["nafc"] = 2 # Initialize the Observer Observer.__init__ ( self, *(params[:3]), **model ) # Store CST parameters self.E0, self.Ds, self.ds, self.Dr, self.dr = params[3:] self.Straces = [] self.Ttraces = [] def DoATrial ( self, stimulus_intensity=1, nAFC=2 ): """Simulate a single trial with criterion setting :Parameters: *stimulus_intensity* : intensity of the stimulus the is presented *nAFC* : number of alternatives presented / task to be performed. - nAFC=-1 Yes/No task, stimulus presence is random. - nAFC=0 Yes/No task, noise only trial - nAFC=1 Yes/No task, signal+noise trial - nAFC>1 nAFC task, number of alternatives :Output: A number 1 or 0, depending on the task, this means correct/incorrect (nAFC) or signal present, signal absent (Yes/No) """ prob = float( interface.diagnostics ( [stimulus_intensity], self.params, sigmoid=self.model["sigmoid"], core=self.model["core"], nafc=2 ) ) d = stats.norm.ppf(prob) - stats.norm.ppf(1-prob) if nAFC==-1: if N.random.rand() < 0.5: stim = [0] else: stim = [d] elif nAFC==0: stim = [0] elif nAFC==1: stim = [d] else: stim = N.random.multinomial ( 1, [self.guess]*nAFC ) * d maxx,maxi = -100,-1 dat = [] # The response traces are updated only once per trial Ec = self.E0 + self.__updateTrace ( self.Ttraces, self.dr ) for i,s in enumerate(stim): Ej = s + N.random.randn() # The remaining traces are updated after every stimulus Ecs = Ec + self.__updateTrace ( self.Straces, self.ds ) x = Ej - Ecs # Store self.Straces.append( self.Ds*x ) dat.append ( (Ej, Ecs) ) if x>maxx: maxx = x maxi = i # self.data.append ( dat ) self.data.append ( Ecs ) # Decision rule depends on task if nAFC < 2: if x > 0: self.Ttraces.append ( self.Dr ) return 1 else: self.Ttraces.append( -self.Dr ) return 0 else: if stim[maxi] == 0: return 0 else: return 1 def DoABlock ( self, stimulus_intensity=1, ntrials=50, nAFC=2 ): """Simulate a whole block of trials with criterion setting :Parameters: *stimulus_intensity* : intensity of the stimulus presented *ntrials* : number of trials in the block *nAFC* : number of alternatives presented / task to be performed. - nAFC in {0,1,-1} Yes/No task, stimulus presence is random. - nAFC>1 nAFC task, number of alternatives :Output: Number of Correct responses (nAFC) or a tuple with (number of hits, number of signal trials, number of false alarms, number of noise trials) """ if nAFC<2: return self.__DoABlock_YesNo ( stimulus_intensity, ntrials ) else: return self.__DoABlock_nAFC ( stimulus_intensity, ntrials, nAFC ) def __DoABlock_YesNo ( self, stimulus_intensity=1, ntrials=50 ): """Yes/No block""" nhits,nsignals,nfalsealarms,nnoise = 0,0,0,0 for j in xrange ( ntrials ): s_or_n = N.random.rand () < 0.5 if s_or_n == 0: nnoise += 1 nfalsealarms += self.DoATrial ( stimulus_intensity, s_or_n ) else: nsignals += 1 nhits += self.DoATrial ( stimulus_intensity, s_or_n ) return nhits,nsignals,nfalsealarms,nnoise def __DoABlock_nAFC ( self, stimulus_intensity=1, ntrials=50, nAFC=2 ): """nAFC block""" assert nAFC >= 2 ncorrect = 0 for k in xrange ( ntrials ): ncorrect += self.DoATrial ( stimulus_intensity, nAFC ) return ncorrect def __updateTrace ( self, traces, d ): """sum up the traces and update""" Ec = 0 for k,t in enumerate(traces): newtrace = t-N.sign(t)*d if newtrace*t < 0: # Sign change of traces ~> the trace died here traces.pop(k) else: traces[k] = newtrace Ec += newtrace return Ec def __str__ ( self ): return "< CriterionSettingObserver E0=%g,Ds=%g,ds=%g,Dr=%g,dr=%g >" % (self.E0,self.Ds,self.ds,self.Dr,self.dr) class BetaBinomialObserver ( Observer ): def __init__ ( self, *params, **model ): """An overdispersed observer that otherwise follows binomial assumptions For every block, this observer draws a p value from a Beta distribution with mean given by the psychometric function. This p-value is then used to generate the responses of that block. :Parameters: *params* : a,b,lapse(,guess) are parameters for the classical psychometric function, m gives the dispersion of the Beta distribution. For a Beta distribution with parameters alpha and beta, m=alpha+beta *model* : a list of keywords to further specify the model :Example: >>> O = BetaBinomialObserver ( 4., 1., .02, 30 ) >>> O.seed ( 0 ) >>> O.DoABlock ( 4, 30 ) 24 >>> O.DoABlock ( 4, 30 ) 18 >>> O.DoAnExperiment ( [4,2,8,10,6], 50 ) [[4, 37, 50], [2, 24, 50], [8, 47, 50], [10, 49, 50], [6, 49, 50]] """ self.dispersion = params[-1] Observer.__init__ ( self, *(params[:-1]), **(model) ) def DoABlock ( self, stimulus_intensity=1, ntrials=50 ): """Perform a block of trials :Parameters: *stimulus_intensity* : intensity of the presented stimulus *ntrials* : number of trials in the block :Output: number of correct responses (nAFC) or number of yes responses (Yes/No-Task) """ psi = float( interface.diagnostics ( [stimulus_intensity], self.params, sigmoid=self.model["sigmoid"], core=self.model["core"], nafc=self.model["nafc"] ) ) alpha = psi*self.dispersion beta = (1-psi)*self.dispersion prob = stats.beta.rvs ( alpha, beta ) resp = N.random.binomial ( ntrials, prob ) self.data.append ( [stimulus_intensity, resp, ntrials] ) return resp def __str__ ( self ): if self.model["nafc"] < 2: return "< BetaBinomialObserver a=%g,b=%g,lapse=%g,guess=%g,M=%g >" % (self.a,self.b,self.lapse,self.guess,self.dispersion) else: return "< BetaBinomialObserver a=%g,b=%g,lapse=%g,M=%g >" % (self.a,self.b,self.lapse,self.dispersion) ############################################################ # Utilities def yesno2dprime ( hits, signals, falsealarms, noises ): """Determine dprime from hits and false alarms :Parameters: *hits* : number of hits *signals* : number of signal trials *falsealarms* : number of false alarm trials *noises* : number of noise only trials :Output: dprime, variance (based on bootstrap) """ hrate = N.clip(float(hits)/signals, .001, .999 ) frate = N.clip(float(falsealarms)/noises, .001, .999 ) hsample = N.clip ( N.random.binomial ( signals, hrate, size=5000 ).astype('d') / signals, .001, .999 ) fsample = N.clip ( N.random.binomial ( noises, frate, size=5000 ).astype('d') / noises , .001, .999 ) dprime = stats.norm.ppf ( hrate ) - stats.norm.ppf ( frate ) dprimes = stats.norm.ppf ( hsample ) - stats.norm.ppf ( fsample ) return dprime, N.var ( dprimes ) def dprime2Pcorrect ( dprime ): """Convert dprime to 2AFC fraction of correct responses From a given d' the probability of a correct response in a 2AFC trial can be inferred as P(correct) = P(s>n) = P(n200. :Parameters: Z a binary series of 0 and 1 test a function, that returns the BIC for the test of interest a first argument. Useful functions for this task are mctest and indtest kstart starting value for thinning to be used :Output: kstop the first k value at which BIC<=0 """ k = kstart while True: BIC = test ( Z[::k] )[0] if BIC<=0: return k if k>200: raise IndexError k += 1 class MCMCpar (dict): def __init__ (self, d): dict.__init__(self,d) burnin = property ( fget=lambda self: self.setdefault("M",0) ) thin = property ( fget=lambda self: self.setdefault("kthin",1) ) Nsamples = property ( fget=lambda self: self.setdefault("N",self.setdefault("Nmin",1000) ) ) def gibbsit ( D=None, q=0.025, r=0.0125, s=0.95, eps=0.001 ): """The real gibbsit routine This function resembles the functionality of the gibbsit program by Raftery & Lewis (1995). It estimates parameters for a Markov Chain that should result in reasonable estimates of quantiles. These parameters are probabilistic in nature. Thus, they are to be taken as a good guess, not as exact values. :Parameters: D a chain from a testrun of the sampling routine. If D is None, only the length that would be required for this chain is returned q quantile of interest r desired accuracy of the quantile of interest s probability with which the estimated quantile is within q+/-r in the end eps accuracy of estimation of the stationary density around the quantile :Output: params a dictionary with the parameters for an MCMC run """ # A correction parameter that is used multiple times phiterm = (stats.norm.ppf ( 0.5*(s+1) ) / r)**2 params = MCMCpar({}) if not D is None: Z = recode ( D, q ) # Determine thinning kthin = find_index ( Z, mctest, 1 ) # Thinning required for 1st order markov chain kind = find_index ( Z, indtest, kthin ) # Thinning required for independence chain # Estimate parameters of the 1st order markov chain ... alpha,beta = mcest ( Z[::kthin] ) # Derive Quantities that have an explicit form ms = log ( (alpha+beta)*eps/max(alpha,beta) ) / log (1-alpha-beta) ns = (2-alpha-beta)*alpha*beta/(alpha+beta)**3 * phiterm params = MCMCpar({ "kthin": kthin, "kind": kind, "ms": ms, "M": int(ceil(ms*kthin)), "ns": ns, "N": int(ceil(ns*kthin)) }) Nmin = q*(1-q) * phiterm params["Nmin"] = int(ceil(Nmin)) return params def main ( ): # Check whether we obtain similar results as the original D = fromfile ( "/home/ingo/tmp/mcmc_short.dat", sep=" " ) D.shape = (-1,3) par = gibbsit(D[:,0]) print par.thin,par.burnin,par.Nsamples if __name__ == "__main__": main() psignifit3-3.0~beta.20120611.1/rpsignifit/000077500000000000000000000000001176542545200177105ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/rpsignifit/DESCRIPTION000066400000000000000000000007041176542545200214170ustar00rootroot00000000000000Package: rpsignifit Version: 0.0 Date: 2009-27-11 Title: R interface to psignifit 2.0 Author: Ingo Fründ , Valentin Haenel Maintainer: Ingo Fründ Depends: R (>= 2.0.1) Suggests: coda Description: The package offers an R interface to psignifit 2.0. It makes advanced routines for estimation and inference on psychometric functions available. License: MIT psignifit3-3.0~beta.20120611.1/rpsignifit/NAMESPACE000066400000000000000000000002361176542545200211300ustar00rootroot00000000000000useDynLib (rpsignifit) export(PsigniSetup,bootstrap.goodness.of.fit,bayes.goodness.of.fit,MAPestimation,PsigBootstrap,PsigBayes,PsigDiagnostics,PsigEvaluate) psignifit3-3.0~beta.20120611.1/rpsignifit/R/000077500000000000000000000000001176542545200201115ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/rpsignifit/R/rpsignifit.R000066400000000000000000000651501176542545200224210ustar00rootroot00000000000000###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### ###################### PsigniSetup ################################### # Basic data information and fitting directions # PsigniSetup <- function ( x, k, n, priors=list("","","Uniform(0,.1)"), sigmoid="logistic", core="mw0.1", number.of.alternatives=2, cuts=0.5) { # The basic data class that is used for all kinds of fitting data <- list ( stimulus.intensities = as.double(x), number.of.correct = as.integer(k), number.of.trials = as.integer(n), number.of.blocks = as.integer(length(k)), sigmoid = as.character(sigmoid), core = as.character(core), number.of.alternatives = as.integer(number.of.alternatives), priors = priors, cuts = cuts) # Store attributes attr(data,"class") <- "psignisetup" return (data) } print.psignisetup <- function ( data ) { nprm <- if (data$number.of.alternatives<2) 4 else 3 # Get parameter names parnames <- c("alpha","beta","lambda","gamma") if ( substr(data$core,1,2)=="mw" ) { parnames[1] = "m " parnames[2] = "w " } # Basic cat ( paste ("Data from ", data$number.of.alternatives, "-AFC experiment with ", data$number.of.blocks," blocks\n", sep="") ) cat ( paste ("Intended fit is with",data$sigmoid,"sigmoid and",data$core,"core\n") ) cat ( "\nPriors:\n" ) for ( i in 1:nprm ) { cat ( paste ( " ", parnames[i], "\t", data$priors[i], "\n" ) ) } cat ("\n") # Cuts cat ( paste ( "Requested cuts:", data$cuts[1] ) ) for ( i in 2:length(data$cuts) ) { cat ( paste ( ",", data$cuts[i] ) ) } cat ("\n\n") # Data print ( data.frame ( stimulus.intensities=data$stimulus.intensities, number.of.correct=data$number.of.correct, number.of.trials=data$number.of.trials ) ) } ############################################################ # psiginference methods # ############################################################ print.psiginference <- function ( inference ) { ############################################## # Print most important inference information # Determine names of parameters parnames <- c("alpha","beta","lambda","gamma") if ( substr(inference$core,1,2)=="mw" ) { parnames[1] = "m " parnames[2] = "w " } # Write some header information if ( attr(inference,"inference")=="point" ) { cat ( "Point estimate of psychometric function\n" ) } else if ( attr(inference,"inference")=="bootstrap" ) { cat ( "Bootstrap inference on psychometric function\n" ) } else if ( attr(inference,"inference")=="mcmc" ) { cat ( "Bayesian inference (MCMC) on psychometric function\n" ) } cat ( paste ( "Fit performed with", inference$sigmoid, "sigmoid and", inference$core, "core\n" ) ) # Write goodness of fit measures # Deviance cat ( paste ( "\nDeviance:", inference$deviance ) ) if ( attr(inference,"inference") == "point" ) { cat ( paste ( " (asymptotic upper 95% limit:", inference$number.of.parameters-1,")" ) ) } else if ( attr(inference,"inference") == "bootstrap" ) { cat ( paste ( " (monte-carlo upper 95% limit:", quantile(inference$deviance.samples,.95, na.rm=TRUE), ")" ) ) } else if ( attr(inference,"inference") == "mcmc" ) { cat ( paste ( " (Bayesian p-value for deviance:", mean ( as.double(inference$deviance.samples #include #include #include #include PsiSigmoid * determine_sigmoid ( char *sigmoid ) { if ( !strcmp(sigmoid,"logistic") ) { return new PsiLogistic (); } else if ( !strcmp(sigmoid,"exp") ) { return new PsiExponential (); } else if ( !strcmp(sigmoid,"gauss") ) { return new PsiGauss (); } else if ( !strcmp(sigmoid,"gumbel_l") || !strcmp(sigmoid,"gumbel") || !strcmp(sigmoid,"lgumbel") ) { return new PsiGumbelL (); } else if ( !strcmp(sigmoid,"gumbel_r") || !strcmp(sigmoid,"rgumbel") ) { return new PsiGumbelL(); } else if ( !strcmp(sigmoid,"cauchy") ) { return new PsiCauchy(); } else { Rprintf ( "WARNING: no valid sigmoid!" ); return NULL; } } PsiCore * determine_core ( char *core, const PsiSigmoid* Sigmoid, const PsiData* data ) { double dummy; if ( !strcmp(core,"ab") ) { return new abCore(); } else if ( !strncmp(core,"mw",2) ) { sscanf(core, "mw%lf", &dummy); return new mwCore(Sigmoid->getcode(), dummy); } else if ( !strcmp(core,"linear") ) { return new linearCore(); } else if ( !strcmp(core,"log") ) { return new logCore(data); } else if ( !strcmp(core,"poly") ) { return new polyCore(data); } else if ( !strcmp(core,"weibull") ) { return new weibullCore(data); } else { Rprintf ( "WARNING: no valid core!" ); return NULL; } } PsiPrior * determine_prior ( char *prior ) { double prm1,prm2; if ( !strncmp(prior,"Beta",4) ) { sscanf(prior,"Beta(%lf,%lf)",&prm1,&prm2); return new BetaPrior(prm1,prm2); } else if ( !strncmp(prior,"Gamma",5) ) { sscanf(prior,"Gamma(%lf,%lf)",&prm1,&prm2); return new GammaPrior(prm1,prm2); } else if ( !strncmp(prior,"Gauss",5) ) { sscanf(prior,"Gauss(%lf,%lf)",&prm1,&prm2); return new GaussPrior(prm1,prm2); } else if ( !strncmp(prior,"Uniform",7) ) { sscanf(prior,"Uniform(%lf,%lf)",&prm1,&prm2); return new UniformPrior(prm1,prm2); } else { return new PsiPrior(); } } PsiData * determine_data ( double *x, int *k, int *n, int *K, int *nafc ) { std::vector stimulus_intensities ( *K ); std::vector number_of_trials ( *K ); std::vector number_of_correct ( *K ); int i; for ( i=0; i<*K; i++ ) { stimulus_intensities[i] = x[i]; number_of_trials[i] = n[i]; number_of_correct[i] = k[i]; } return new PsiData ( stimulus_intensities, number_of_trials, number_of_correct, *nafc ); } void get_fitting_setup ( double *x, int *k, int *n, int *K, char **sigmoid, char **core, int *nafc, int *nparams, char **priors, PsiData** dataout, PsiPsychometric** pmfout ) { int i; *dataout = determine_data ( x, k, n, K, nafc ); PsiSigmoid *Sigmoid = determine_sigmoid ( *sigmoid ); if (Sigmoid==NULL) { delete *dataout; throw -1; } PsiCore *Core = determine_core ( *core, Sigmoid, *dataout ); if (Core==NULL) { delete *dataout; delete Sigmoid; throw -1; } *pmfout = new PsiPsychometric ( *nafc, Core, Sigmoid ); if (*nparams != (*pmfout)->getNparams() ) { Rprintf ( "WARNING: output vector length does not match number of parameters!" ); delete dataout; delete Sigmoid; delete Core; delete *pmfout; throw -1; } for ( i=0; i<*nparams; i++ ) { (*pmfout)->setPrior ( i, determine_prior ( priors[i] ) ); } } extern "C" { //////////////////////////////////// // Functions go here //////////////////////////////////// void mapestimate ( double *x, // stimulus intensities int *k, // response counts of correct- (nAFC) or Yes-responses (Yes/No) int *n, // numbers of trials per block int *K, // number of blocks char **sigmoid, // the sigmoid to be used char **core, // core description int *nafc, // number of alternatives in the task (a value < 2 indicates Yes/No) char **priors, // priors int *nparams, // number of parameters double *estimate, // output array for the estimated values double *deviance, // output: deviance double *Rpd, // output: correlation between model prediction and deviance residuals double *Rkd // output: correlation between block index and deviance residuals ) { int i; PsiData * data; PsiPsychometric *pmf; try { get_fitting_setup ( x, k, n, K, sigmoid, core, nafc, nparams, priors, &data, &pmf ); } catch (int) { return; } std::vector startest = pmf->getStart ( data ); PsiOptimizer *opt = new PsiOptimizer ( pmf, data ); std::vector est = opt->optimize ( pmf, data ); delete opt; for ( i=0; i<*nparams; i++ ) estimate[i] = est[i]; std::vector devianceresiduals ( pmf->getDevianceResiduals ( est, data ) ); *deviance = pmf->deviance(est,data); *Rpd = pmf->getRpd ( devianceresiduals, est, data ); *Rkd = pmf->getRkd ( devianceresiduals, data ); delete data; delete pmf; return; } void performbootstrap ( double *x, // stimulus intensities int *k, // response counts of correct- (nAFC) or Yes-responses (Yes/No) int *n, // numbers of trials per block int *K, // number of blocks char **sigmoid, // the sigmoid to be used char **core, // core description int *nafc, // number of alternatives in the task (a value < 2 indicates Yes/No) char **priors, // priors double *generating, // generating probabilites (if generating[0]==-999, non parametric bootstrap is performed) int *nparams, // number of parameters int *nsamples, // number of bootstrap samples to be drawn double *cuts, // cuts at which the thresholds should be determined int *ncuts, // number of cuts ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// int *bdata, // output: bootstrap samples (needs to be 'reshaped') double *bestimates, // output: bootstrap estimates (needs to be reshaped) double *bdeviances, // output: deviances of the bootstrap samples double *bRpd, // output: correlations between model prediction and deviance residuals for all bootstrap samples double *bRkd, // output: correlations between block index and deviance residuals for all bootstrap samples double *bthres, // output: thresholds of the bootstrap samples double *influential,// output: influence of the different blocks double *acc, // output: acceleration constants double *bias, // output: bias correction constants double *thresholdci // output: 95% confidence intervals for thresholds ) { int i,j; PsiData * data; PsiPsychometric * pmf; std::vector *start; bool parametric; try { get_fitting_setup ( x, k, n, K, sigmoid, core, nafc, nparams, priors, &data, &pmf ); } catch (int) { return; } std::vector Cuts ( *ncuts ); for ( i=0; i<*ncuts; i++ ) Cuts[i] = cuts[i]; if (generating[0]==-999) { start = NULL; parametric = false; } else { start = new std::vector (*nparams); for ( i=0; i<*nparams; i++ ) { (*start)[i] = generating[i]; } parametric = true; } BootstrapList bslist ( bootstrap (*nsamples,data,pmf,Cuts,start,true, parametric) ); JackKnifeList jack ( jackknifedata ( data, pmf ) ); for ( i=0; i<*nsamples; i++ ) { for ( j=0; j<*K; j++ ) { bdata[*K*i + j] = bslist.getData(i)[j]; } for ( j=0; j<*nparams; j++ ) { bestimates[*nparams*i + j] = bslist.getEst(i, j); } bdeviances[i] = bslist.getdeviance(i); bRpd[i] = bslist.getRpd(i); bRkd[i] = bslist.getRkd(i); for ( j=0; j<*ncuts; j++ ) { bthres[*ncuts*i + j] = bslist.getThres_byPos (i,j); } } for ( j=0; j<*ncuts; j++ ) { acc[j] = bslist.getAcc(j); bias[j] = bslist.getBias(j); thresholdci[3*j] = bslist.getThres(0.025, j); thresholdci[3*j+1] = bslist.getThres(0.5, j); thresholdci[3*j+2] = bslist.getThres(0.975, j); } std::vector ci_lower ( *nparams ); std::vector ci_upper ( *nparams ); for ( j=0; j<*nparams; j++ ) { ci_lower[j] = bslist.getPercentile(0.025,j); ci_upper[j] = bslist.getPercentile(0.975,j); } for ( j=0; j<*K; j++ ) { influential[j] = jack.influential ( j, ci_lower, ci_upper ); } delete data; delete pmf; delete start; return; } void performmcmc ( double *x, // stimulus intensities int *k, // response counts of correct- (nAFC) or Yes-responses (Yes/No) int *n, // numbers of trials per block int *K, // number of blocks char **sigmoid, // the sigmoid to be used char **core, // core description int *nafc, // number of alternatives in the task (a value < 2 indicates Yes/No) char **priors, // priors double *proposal, // standard deviances of the proposal distributions double *start, // starting value of the sampler int *nparams, // number of parameters int *nsamples, // number of bootstrap samples to be drawn double *cuts, // cuts at which the thresholds should be determined int *ncuts, // number of cuts ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// double *mcmcestimates, // output: bootstrap estimates (needs to be reshaped) double *mcmcdeviances, // output: deviances of the bootstrap samples double *mcmcRpd, // output: correlations between model prediction and deviance residuals for mcmc sammples double *mcmcRkd, // output: correlations between block index and deviance residuals for all mcmc samples int *ppdata, // output: bootstrap samples (needs to be 'reshaped') double *ppRpd, // output: correlations between model prediction and deviance residuals for all bootstrap samples double *ppRkd, // output: correlations between block index and deviance residuals for all bootstrap samples double *ppdeviances, // output: acceleration constants double *logpratio // output: logposterior ratio (for determination of influential observations) ) { int i,j; PsiData * data; PsiPsychometric * pmf; try { get_fitting_setup ( x, k, n, K, sigmoid, core, nafc, nparams, priors, &data, &pmf ); } catch (int) { return; } MetropolisHastings S ( pmf, data, new GaussRandom () ); for ( i=0; i<*nparams; i++ ) S.setstepsize ( proposal[i], i ); MCMCList mcmclist ( S.sample( *nsamples ) ); for ( i=0; i<*nsamples; i++ ) { for ( j=0; j<*nparams; j++ ) { mcmcestimates[*nparams*i + j] = mcmclist.getEst (i, j); } mcmcdeviances[i] = mcmclist.getdeviance ( i ); mcmcRpd[i] = mcmclist.getRpd ( i ); mcmcRkd[i] = mcmclist.getRkd ( i ); for ( j=0; j<*K; j++ ) { ppdata[*K*i + j] = mcmclist.getppData ( i, j ); } ppRpd[i] = mcmclist.getppRpd ( i ); ppRkd[i] = mcmclist.getppRkd ( i ); ppdeviances[i] = mcmclist.getppDeviance ( i ); for ( j=0; j<*K; j++ ) { logpratio[*K*i + j] = mcmclist.getlogratio ( i, j ); } } } void getdiagnostics ( double *x, // stimulus intensities int *k, // response counts of correct- (nAFC) or Yes-responses (Yes/No) int *n, // numbers of trials per block int *K, // number of blocks char **sigmoid, // the sigmoid to be used char **core, // core description int *nafc, // number of alternatives in the task (a value < 2 indicates Yes/No) char **priors, // priors int *nparams, // number of parameters double *cuts, // cuts at which the thresholds should be determined int *ncuts, // number of cuts double *estimate, // array of the estimated values double *deviance, // output: deviance double *Rpd, // output: correlation between model prediction and deviance residuals double *Rkd, // output: correlation between block index and deviance residuals double *thres, // output: thresholds at the respective cuts double *devianceresiduals // output: deviance residuals ) { int i; PsiData * data; PsiPsychometric * pmf; std::vector theta ( *nparams ); for ( i=0; i<*nparams; i++ ) theta[i] = estimate[i]; try { get_fitting_setup ( x, k, n, K, sigmoid, core, nafc, nparams, priors, &data, &pmf ); } catch (int) { return; } std::vector dr ( pmf->getDevianceResiduals ( theta, data ) ); *deviance = pmf->deviance ( theta, data ); *Rpd = pmf->getRpd ( dr, theta, data ); *Rkd = pmf->getRkd ( dr, data ); for ( i=0; i<*K; i++ ) { devianceresiduals[i] = dr[i]; } for ( i=0; i<*ncuts; i++ ) { thres[i] = pmf->getThres ( theta, cuts[i] ); } delete data; delete pmf; return; } void pmfevaluate ( double *x, // x values at which the psychometric function should be evaluated int *lenx, // length of x double *params, // parameter values int *nparams, // number of parameters char **sigmoid, // the sigmoid to be used char **core, // core description int *nafc, // number of alternatives in the task (a value < 2 indicates Yes/No) double *Fx // output: output of the psychometric function ) { int i; std::vector xx ( 2 ); std::vector kk ( 2 ); std::vector nn ( 2 ); PsiData * dummydata = new PsiData ( xx, kk, nn, *nafc ); PsiPsychometric * pmf; std::vector theta ( *nparams ); for ( i=0; i<*nparams; i++ ) theta[i] = params[i]; PsiSigmoid *Sigmoid = determine_sigmoid ( *sigmoid ); PsiCore * Core = determine_core ( *core, Sigmoid, dummydata ); delete dummydata; pmf = new PsiPsychometric ( *nafc, Core, Sigmoid ); for ( i=0; i<*lenx; i++ ) { Fx[i] = pmf->evaluate ( x[i], theta ); } delete pmf; return; } // Some more? } psignifit3-3.0~beta.20120611.1/rpsignifit/src/sigmoid.cc000077700000000000000000000000001176542545200256132../../src/sigmoid.ccustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/rpsignifit/src/sigmoid.h000077700000000000000000000000001176542545200253172../../src/sigmoid.hustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/rpsignifit/src/special.cc000077700000000000000000000000001176542545200255652../../src/special.ccustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/rpsignifit/src/special.h000077700000000000000000000000001176542545200252712../../src/special.hustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/scripts/000077500000000000000000000000001176542545200172215ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/scripts/nonstationarity/000077500000000000000000000000001176542545200224665ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/scripts/nonstationarity/coverage.py000077500000000000000000000615061176542545200246460ustar00rootroot00000000000000#!/usr/bin/env python from optparse import OptionParser from pypsignifit import psigobservers from pypsignifit import psigcorrect import pypsignifit from numpy import array,arange,mgrid,clip,zeros,sort, random,mean, asarray import os,sys import pylab from pylab import prctile as ptile import operator import time import subprocess __helptext__ = """ Determine coverage of confidence intervals for a given combination of analysis/generating parameters. """ # Analyze command line options parser = OptionParser ( usage=__helptext__ ) # Generating parameters parser.add_option ( "--gen-observer", dest="observer", default="binomial", help="model for the variance of the observers responses. Valid choices are 'binomial', 'betabinomial', or 'learning'. Default: 'binomial'" ) parser.add_option ( "--gen-observer-params", dest="observer_params", default="", help="parameters of the variance model for the generating observer. If the observer is 'binomial', no parameter is required, the 'betabinomial' observer requires an additional parameter parameter m given the dispersion of the beta distribution used to model the observers response variance. If the 'learning' observer is selected, a string with the following parameters should be given: 'L,r', where L is the learning range both prm1 and prm2 vary from gen_prm+L to gen_prm-L. r is the learning rate. That is, both parameters vary from one trial to the next as prm(n+1)=prm(n)+(prm_gen-L-prm(n))/r. Thus, low values of r indicate faster learning. Default: '' (binomial observer), '10' (betabinomial observer), '0.7,40' (learning observer)" ) parser.add_option ( "--gen-sigmoid", dest="gen_sigmoid", default="logistic", help="sigmoid used when generating the data. Default: 'logistic'" ) parser.add_option ( "--gen-core", dest="gen_core", default="mw0.1", help="core type used when generating the data. Default: 'mw0.1'" ) parser.add_option ( "--gen-prm1", dest="gen_prm1", default=4, type="float", help="first parameter of the psychometric function used to generate the data (typically called alpha, or m). Default: 4" ) parser.add_option ( "--gen-prm2", dest="gen_prm2", default=2, type="float", help="second parameter of the psychometric function used to generate the data (typically called beta, or w). Default: 2" ) parser.add_option ( "--gen-prm3", dest="gen_prm3", default=0.02, type="float", help="third parameter of the psychometric function used to generate the data (this is the lapse rate). Default: 0.02" ) parser.add_option ( "--gen-prm4", dest="gen_prm4", default=0.02, type="float", help="fourth parameter of the psychometric function used to generate the data (this is the guessing rate if a yes-no paradigm is employed). In nAFC, this parameter is not used. Default: 0.02" ) parser.add_option ( "--gen-nafc", dest="gen_nafc", default=2, type="int", help="number of alternatives in the generating task (1 indicates a yes-no task). Default: 2" ) # Analyzing parameters parser.add_option ( "--ana-sigmoid", dest="ana_sigmoid", default="logistic", help="sigmoid used when analyzing the data. Default: logistic" ) parser.add_option ( "--ana-core", dest="ana_core", default="mw0.1", help="core type used when analyzing the data. Default: 'mw0.1'" ) parser.add_option ( "--ana-nafc", dest="ana_nafc", default=None, type="int", help="number of alternatives assumed when analyzing the data. Default is to take the same as gen_nafc" ) parser.add_option ( "--nbootstrap", dest="nbootstrap", default=2000, type="int", help="number of bootstrap repetitions when determining confidence intervals or goodness of fit statistics. Default: 2000" ) # constraints for bootstrap parser.add_option ( "--constraint-prm1", dest="constraint_prm1", default="unconstrained", help="Parameter constraint on first parameter: for bootstrap inference") parser.add_option ( "--constraint-prm2", dest="constraint_prm2", default="unconstrained", help="Parameter constraint on second parameter: for bootstrap inference") parser.add_option ( "--constraint-prm3", dest="constraint_prm3", default="Uniform(0,0.1)", help="Parameter constraint on third parameter: for bootstrap inference") parser.add_option ( "--constraint-prm4", dest="constraint_prm4", default="Uniform(0,0.1)", help="Parameter constraint on fourth parameter: for bootstrap inference") # priors for Bayes parser.add_option ( "--prior-prm1", dest="prior_prm1", default="Gauss(0,100)", help="Parameter prior on first parameter: for Bayesian inference") parser.add_option ( "--prior-prm2", dest="prior_prm2", default="Gamma(1.01, 2000)", help="Parameter prior on second parameter: for Bayesian inference") parser.add_option ( "--prior-prm3", dest="prior_prm3", default="Beta(2,50)", help="Parameter prior on third parameter: for Bayesian inference") parser.add_option ( "--prior-prm4", dest="prior_prm4", default="Beta(2,50)", help="Parameter prior on fourth parameter: for Bayesian inference") # Simulation options parser.add_option ( "--nsimulations", dest="nsimulations", default=1000, type="int", help="number of full simulation runs used to determine coverage information. Default: 1000" ) parser.add_option ( "--blocksize", dest="blocksize", default=10, type="int", help="number of trials per block in the simulated experiment. Default: 10" ) parser.add_option ( "--nblocks", dest="nblocks", default=5, type="int", help="number of blocks in the simulated experiment. Default: 5" ) parser.add_option ( "--fixed-levels", dest="fixed_levels", default=None, type="string", help="list of stimulus levels, if desired, if None,"+\ "psychometric function will be sampled. Default: None") parser.add_option ( "--fixed-sequence", dest="fixed_sequence", action="store_true", help="if this is set, the psychometric function will be sampled at fixed levels" ) parser.add_option ( "--fixed-pmf", dest="fixed_pmf", action="store_true", help="if this is set, samples will be generated from the true pmf" ) parser.add_option ( "--seed", dest="seed", default="fixed", type="string", help="seed for simulation, can be 'fixed, 'time', or an"+\ "integer value.") # output options parser.add_option ( "-o", "--output", dest="outputfile", default="test", help="name of the output file in which the data should be stored,"+\ "'.data' will be appended to the filename." ) parser.add_option ( "--metadata", action="store_true", default=False, help="generate metadata file, filename will the name of the "+\ "outputfile with the suffix '.meta'.") #parser.add_option ( "--datareduce", dest="datareduce", action="store_true", # help="reduce data based on the estimated nu parameter" ) parser.add_option ( "--disable-nonparametric", dest="nonparametric", action="store_false", default=True, help="do not run the non-paramteric bootstrap") parser.add_option ( "--disable-parametric", dest="parametric", action="store_false", default=True, help="do not run the paramteric bootstrap") parser.add_option ( "--disable-bayes", dest="bayes", action="store_false", default=True, help="do not run the bayesian analysis") options,arguments = parser.parse_args() ############################################################ # # # Create useful variables from command line arguments # # # ############################################################ # Observer fixed parameters if options.gen_nafc == 1: gen_prm = [ options.gen_prm1, options.gen_prm2, options.gen_prm3, options.gen_prm4 ] elif options.gen_nafc > 1: gen_prm = [ options.gen_prm1, options.gen_prm2, options.gen_prm3 ] else: raise IOError, "gen_nafc should be > 0, but is %d" % ( options.gen_nafc, ) if options.ana_nafc is None: options.ana_nafc = options.gen_nafc # Observer variable parameters gen_kwargs = { "nafc": options.gen_nafc, "sigmoid": options.gen_sigmoid, "core": options.gen_core } # Create the desired Observer if options.observer == "binomial": def create_new_observer (): return psigobservers.Observer ( *gen_prm, **gen_kwargs ) elif options.observer == "betabinomial": if options.observer_params=="": M = 10 else: M = float(options.observer_params) def create_new_observer (): return psigobservers.BetaBinomialObserver ( *(gen_prm+[M]), **gen_kwargs ) elif options.observer == "learning": if options.observer_params == "": L,r = .7,40. else: L,r = [float(x) for x in options.observer_params.split(",")] end1 = options.gen_prm1 - L end2 = options.gen_prm2 - L start_prm = list(gen_prm) start_prm[0] += L start_prm[1] += L def create_new_observer (): return psigobservers.LinearSystemLearner ( *(start_prm+[{'a': (r,end1), 'b': (r,end2)}]), **gen_kwargs ) else: raise IOError, "Invalid observer model: %s" % ( options.observer, ) # Estimation related parameters ana_kwargs = { "nafc": options.gen_nafc, "sigmoid": options.ana_sigmoid, "core": options.ana_core } if not options.ana_nafc is None: ana_kwargs["nafc"] = options.ana_nafc # Create observer OO = psigobservers.Observer ( *gen_prm, **gen_kwargs ) # Create stimulus levels if options.fixed_levels is not None: # Use the stimulus levels that were given on the command line message = "'fixed-levels' must be a sequence of numbers, of length nblocks." try: x = eval(options.fixed_levels) except Exception: raise ValueError(message + options.fixed_levels) if not operator.isSequenceType(x) or False in [operator.isNumberType(i) for i in x]: raise ValueError(message + options.fixed_levels) if not len(x) == options.nblocks: raise ValueError("Argument mismatch: You gave "+str(len(x))+" levels on the command line"+\ " but specified "+str(options.nblocks)+" blocks.") print "levels:", x else: # Create stimuli (roughly based on results from Hills PhD thesis in chapter 5) Fx = mgrid[.1:.99:1j*(options.nblocks)] # Fx -= Fx.mean() # Fx /= Fx.std() # Fx *= 0.22 # this corresponds to Hills PhD thesis (sigma_p ~ 0.11 in 2AFC) # if options.ana_nafc == 1: # Fx += 0.5 # else: # Fx += 0.6 # This corresponds to Hills PhD thesis (p_bar ~ 0.8 in 2AFC) # Fx = array( Fx.tolist()+[.99] ) # Fx = clip(Fx,.001,.999) x = OO.getlevels(Fx) y = mgrid[0.001:0.999:100j] print x,Fx # Constraints and Priors constraints = [options.constraint_prm1, options.constraint_prm2, options.constraint_prm3] # priors = ["Gauss(4,.1)", "Gamma(1,4)","Beta(2,50)"] # Hilft auch nicht so viel # priors = ["Gauss(0,100)", "Gamma(1.01,2000)","Beta(2,50)"] priors = [options.prior_prm1, options.prior_prm2, options.prior_prm3] if options.ana_nafc < 2: constraints.append(options.constraint_prm4) priors.append(options.prior_prm4) #priors += ["Beta(1,10)"] print priors # Parse and set seed def check_int(value): try: int(value) return True except ValueError: return False if options.seed not in ["fixed", "time"] and not check_int(options.seed): raise ValueError("'seed' must be either 'fixed', 'time' or an integer value.") elif options.seed == 'fixed': print "Seed is default." elif options.seed == 'time': seed = int(time.time()) print "Seed is time since epoch in seconds: '%d'" % seed pypsignifit.set_seed(seed) options.seed = seed else: seed = int(options.seed) print "Seeed is value given on command line: '%d'" % seed pypsignifit.set_seed(seed) # check that there is something to do bayes = options.bayes nonparametric = options.nonparametric parametric = options.parametric if not nonparametric and not parametric and not bayes: raise ValueError("You must specify one of: 'nonparametric', 'parametric' "+\ "'bayes' in order for this script to do anything!") # set the version options.version = pypsignifit.version # Organize output def get_yes_no(): while True: decision = raw_input ( " Overwrite? [Y/N] " ) if decision.upper() == "Y": return True elif decision.upper() == "N": return False else: print "'%s' is not a valid option, please answer [Y/N]." % decision outputfile = options.outputfile + ".data" metadatafile = options.outputfile + ".meta" if options.metadata else None if os.path.exists( outputfile ): sys.stderr.write ( "Output file %s exists.\n" %(outputfile,) ) if metadatafile and os.path.exists( metadatafile ): sys.stderr.write ( "Metadata file %s exists.\n" %(metadatafile,) ) if get_yes_no(): pass else: sys.stderr.write ("Terminating\n") sys.exit(0) print "writing output to", outputfile outfile = open(outputfile, "w") if metadatafile: print "writing metadata to", metadatafile open(metadatafile, "w").write("%s\n" % str(options)) ############################################################ # # # Perform the simulation # # # ############################################################ def getcpe ( est, mc ): mc = mc.copy() mc.sort() return mean ( mctrue_thres: return 1 else: return 0 def write_header(f): outs = "run m.gen w.gen " if nonparametric: outs += ("m.npr.e m.npr.l m.npr.h "+ "w.npr.e w.npr.l w.npr.h "+ "d.npr d.npr.crit nu.npr "+ "rpd.npr rpd.npr.l rpd.npr.h "+ "rkd.npr rkd.npr.l rkd.npr.h "+ "infl.npr." \ + " infl.npr.".join([str(x) for x in range(options.nblocks)]) + " " \ + "npr.time ") if parametric: outs += ("m.par.e m.par.l m.par.h "+ "w.par.e w.par.l w.par.h "+ "d.par d.par.crit nu.par "+ "rpd.par rpd.par.l rpd.par.h "+ "rkd.par rkd.par.l rkd.par.h "+ "infl.par." \ + " infl.par.".join([str(x) for x in range(options.nblocks)]) + " " \ + "par.time ") if bayes: outs += ("m.bay.e "+ "m.bay.map "+ "m.bay.median "+ "m.bay.l "+ "m.bay.h "+ "w.bay.e "+ "w.bay.map "+ "w.bay.median "+ "w.bay.l "+ "w.bay.h "+ "d.bay "+ "d.bay.p "+ "nu.bay "+ "rpd.bay "+ "rpd.bay.p "+ "rkd.bay "+ "rkd.bay.p "+ "conv.bay "+ "Rhat.0 "+ "Rhat.1 "+ "Rhat.2 "+ "infl.bay." \ + " infl.bay.".join([str(x) for x in range(options.nblocks)])+" " + "bay.time ") outs += " stim." + " stim.".join([str(x) for x in range(options.nblocks)]) outs += " resp." + " resp.".join([str(x) for x in range(options.nblocks)]) outs += "\n" f.write(outs) f.flush() def write_id_gen(f, simulation): outs = "%d %g %g " % (simulation, gen_prm[0], gen_prm[1] ) f.write ( outs ) def write_nonparametric(f, Bnpr, runtime): outs = "%g %g %g " % (Bnpr.estimate[0],Bnpr.getCI(1,(.025,)),Bnpr.getCI(1,(.975))) # m.npr.e m.npr.l m.npr.h outs += "%g %g %g " % (Bnpr.estimate[1],ptile(Bnpr.mcestimates[:,1],2.5),ptile(Bnpr.mcestimates[:,1],97.5)) # w.npr.e w.npr.l w.npr.h outs += "%g %g %g " % (Bnpr.deviance, ptile(Bnpr.mcdeviance,95), psigcorrect.estimate_nu (Bnpr)[0]) # d.npr d.npr.crit nu.npr outs += "%g %g %g " % (Bnpr.Rpd,ptile(Bnpr.mcRpd,2.5),ptile(Bnpr.mcRpd,97.5)) # rpd.npr rpd.npr.l rpd.npr.h outs += "%g %g %g " % (Bnpr.Rkd,ptile(Bnpr.mcRkd,2.5),ptile(Bnpr.mcRkd,97.5)) # rkd.npr rkd.npr.l rkd.npr.h outs += ("%g "*options.nblocks) % tuple(Bnpr.infl) outs += "%g " % runtime f.write ( outs ) def write_parametric(f, Bpar, runtime): outs = "%g %g %g " % (Bpar.estimate[0],Bpar.getCI(1,(.025,)),Bpar.getCI(1,(.975))) # m.par.e m.par.l m.par.h outs += "%g %g %g " % (Bpar.estimate[1],ptile(Bpar.mcestimates[:,1],2.5),ptile(Bpar.mcestimates[:,1],97.5)) # w.par.e w.par.l w.par.h outs += "%g %g %g " % (Bpar.deviance, ptile(Bpar.mcdeviance,95), psigcorrect.estimate_nu (Bpar)[0]) # d.par d.par.crit nu.par outs += "%g %g %g " % (Bpar.Rpd,ptile(Bpar.mcRpd,2.5),ptile(Bpar.mcRpd,97.5)) # rpd.par rpd.par.l rpd.par.h outs += "%g %g %g " % (Bpar.Rkd,ptile(Bpar.mcRkd,2.5),ptile(Bpar.mcRkd,97.5)) # rkd.par rkd.par.l rkd.par.h outs += ("%g "*options.nblocks) % tuple(Bpar.infl) outs += "%g " % runtime f.write(outs) def write_bayes(f, mcmc, mcmc_conv, runtime): outs = "%g %g %g %g %g " % ( mcmc.estimate[0], # m.bay.m mcmc.mapestimate[0], # m.bay.map mcmc.posterior_median[0],# m.bay.median mcmc.getCI(1,(.025,)), # m.bay.l mcmc.getCI(1,(.975))) # m.bay.h outs += "%g %g %g %g %g " % ( mcmc.estimate[1], # w.bay.m mcmc.mapestimate[1], # w.bay.map mcmc.posterior_median[1], # w.bay.median ptile(mcmc.mcestimates[:,1],2.5), # w.bay.l ptile(mcmc.mcestimates[:,1],97.5)) # w.bay.h outs += "%g %g %g " % (mcmc.deviance,mcmc.bayesian_p('deviance'), psigcorrect.estimate_nu (mcmc)[0]) # d.bay d.bay.p outs += "%g %g " % (mcmc.Rpd,mcmc.bayesian_p('Rpd')) # d.rpd d.rpd.p outs += "%g %g " % (mcmc.Rkd,mcmc.bayesian_p('Rkd')) # d.rkd d.rkd.p outs += "%d %g %g %g " % (mcmc_conv,mcmc.Rhat(0),mcmc.Rhat(1),mcmc.Rhat(2)) outs += ("%g "*options.nblocks) % tuple(mcmc.infl) outs += "%g " % runtime f.write(outs) def write_data(f, data): # this conversion is required since data[0,:] does not work on lists data = asarray(data) outs = ("%g "*options.nblocks) % tuple(data[:,0]) outs += ("%d "*options.nblocks) % tuple(data[:,1].astype("i")) f.write ( outs ) #if options.datareduce: # outfile_reduced = open ( options.outputfile + "reduce","w" ) # write_header( outfile_reduced ) count_npr = 0. count_par = 0. count_bay = 0. not_converged = 0 random.shuffle ( x ) # write header write_header(outfile) sys.stderr.write("\n") for simulation in xrange ( options.nsimulations ): sys.stderr.write ( "\nSimulation %d is running" % ( simulation, ) ) O = create_new_observer () # print "\nO=",O if not options.fixed_sequence: random.shuffle ( x ) data = O.DoAnExperiment ( x, ntrials=options.blocksize ) print "\ndata =",data print constraints write_id_gen(outfile, simulation) if nonparametric: Bnpr = pypsignifit.BootstrapInference ( data, priors=constraints, parametric=False, **ana_kwargs ) if options.fixed_pmf: Bnpr.estimate = OO.params tic = time.time() Bnpr.sample ( options.nbootstrap ) toc = time.time() count_npr += check_ci ( O, Bnpr ) write_nonparametric(outfile, Bnpr, toc-tic) print "Done npar" if parametric: Bpar = pypsignifit.BootstrapInference ( data, priors=constraints, parametric=True, **ana_kwargs ) if options.fixed_pmf: Bpar.estimate = OO.params tic = time.time() Bpar.sample ( options.nbootstrap ) toc = time.time() count_par += check_ci ( O, Bpar ) write_parametric(outfile, Bpar, toc-tic) print "Done par" #################### # How to make sure that in the end ALL chains have converged? # We can give upper and lower limits for m and w from our sampling positions. # m cannot be outside the sampled range and w should not be wider than the sampled range (or twice that) if bayes: tic = time.time() mcmc = pypsignifit.BayesInference ( data, sample=True, priors=priors, **ana_kwargs ) for prm in [0,1,2]: if not mcmc.geweke(prm)[2] is None: for j in mcmc.geweke(prm)[2]: mcmc.resample(j) N = mcmc.mcestimates.shape[0] mcmc.sample( start = mcmc.farstart ) mcmc.sample( start = mcmc.farstart ) for prm in [0,1,2]: if not mcmc.geweke(prm)[2] is None: for j in mcmc.geweke(prm)[2]: mcmc.resample(j) print "Rhat: ",mcmc.Rhat(0),mcmc.Rhat(1),mcmc.Rhat(2) print "Geweke:",mcmc.geweke(0)[2],mcmc.geweke(1)[2],mcmc.geweke(2)[2] mcmc_conv = 1 if mcmc.Rhat (0)>1.1 or mcmc.Rhat (1)>1.1 or mcmc.Rhat (2)>1.1: not_converged += 1 mcmc_conv = 0 # pypsignifit.ConvergenceMCMC(mcmc,0) # pypsignifit.ConvergenceMCMC(mcmc,1) # pypsignifit.ConvergenceMCMC(mcmc,2) # pypsignifit.GoodnessOfFit(mcmc) # pypsignifit.show() # sys.exit() # pypsignifit.ConvergenceMCMC(mcmc,1) else: count_bay += check_ci ( O, mcmc ) # print count_bay, mcmc.estimate, pylab.prctile(mcmc.mcestimates[:,0], (2.5,97.5)), pylab.prctile(mcmc.mcestimates[:,1], (2.5,97.5)) print count_bay, mcmc.getCI(1,(.025,.975)) toc = time.time() write_bayes(outfile, mcmc, mcmc_conv, toc-tic) print "Done Bayes" write_data(outfile, data) outfile.write ("\n") outfile.flush() # datareduce section is not up-to-date # current state is that it doesn't seem to help much for improving the results # in case you want to use this you must first make it work again if False: data = array ( data ) dataml = data.copy () nu = psigcorrect.estimate_nu (Bpar)[0] print "==============", nu, "===============" dataml[:,1] = ( data[:,1] * nu ).astype("i") dataml[:,2] = ( data[:,2] * nu ).astype("i") print dataml try: Bnpr = pypsignifit.BootstrapInference ( dataml, sample=options.nbootstrap, priors=constraints, parametric=False, **ana_kwargs ) except: sys.stderr ( "An error ocurred in simulation %d during nonparametric bootstrap\n" % ( simulation,) ) print "Done npar" try: Bpar = pypsignifit.BootstrapInference ( dataml, sample=options.nbootstrap, priors=constraints, parametric=True, **ana_kwargs ) except: sys.stderr ( "An error ocurred in simulation %d during parametric bootstrap\n" % ( simulation,) ) print "Done par" #################### # How to make sure that in the end ALL chains have converged? # We can give upper and lower limits for m and w from our sampling positions. # m cannot be outside the sampled range and w should not be wider than the sampled range (or twice that) datamcmc = data.copy () # nu = psigcorrect.estimate_nu (mcmc)[0] print "==============", nu, "===============" datamcmc[:,1] = ( data[:,1] * nu ).astype("i") datamcmc[:,2] = ( data[:,2] * nu ).astype("i") print datamcmc try: mcmc = pypsignifit.BayesInference ( datamcmc, sample=True, priors=priors, **ana_kwargs ) for prm in [0,1,2]: if not mcmc.geweke(prm)[2] is None: for j in mcmc.geweke(prm)[2]: mcmc.resample(j) N = mcmc.mcestimates.shape[0] mcmc.sample( start = mcmc.farstart ) mcmc.sample( start = mcmc.farstart ) for prm in [0,1,2]: if not mcmc.geweke(prm)[2] is None: for j in mcmc.geweke(prm)[2]: mcmc.resample(j) except: sys.stderr ( "An error ocurred in simulation %d during mcmc sampling\n" % ( simulation,) ) print "Rhat: ",mcmc.Rhat(0),mcmc.Rhat(1),mcmc.Rhat(2) print "Geweke:",mcmc.geweke(0)[2],mcmc.geweke(1)[2],mcmc.geweke(2)[2] mcmc_conv = 1 if mcmc.Rhat (0)>1.1 or mcmc.Rhat (1)>1.1 or mcmc.Rhat (2)>1.1: not_converged += 1 mcmc_conv = 0 writelog ( outfile_reduced, Bnpr, Bpar, mcmc, mcmc_conv ) sys.stderr.write ( "\r"+50*" "+"\n" ) outfile.close() print "Coverages:" if nonparametric: print " nonparametric bootstrap:", count_npr/options.nsimulations if nonparametric: print " parametric bootstrap: ", count_par/options.nsimulations if bayes: print " MCMC (bayesian): ", count_bay/(options.nsimulations-not_converged) print " MCMC runs that did not converge:",not_converged # pypsignifit.show() psignifit3-3.0~beta.20120611.1/scripts/nonstationarity/write_submission_condor.py000066400000000000000000000074011176542545200300130ustar00rootroot00000000000000#!/usr/bin/env python import os submission_text = """universe = vanilla notification = Always should_transfer_files = NO initialdir = /home/ingo/Hacking/Psi++/scripts/nonstationarity/ executable = coverage.py environment = "PYTHONPATH=/home/ingo/lib/python/" """ sim_root = "simulation_data" os.makedirs ( sim_root ) # Binomial for nblocks in [4,6,8,12,24]: for blocksize in [10,20,40]: for sigm in ["weibull","logistic","rgumbel"]: for nalternatives in [1,2]: if sigm=="logistic": sigm_args = "" elif sigm=="rgumbel": sigm_args = "--ana-sigmoid=rgumbel" elif sigm=="weibull": sigm_args = "--ana-sigmoid=exp --ana-core=poly" submission_text += "error = %s/%dafc/%s/binomial_%d_%d.log\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) submission_text += "arguments = --blocksize=%d --nblocks=%d " % (blocksize,nblocks) submission_text += " --gen-nafc=%d --ana-nafc=%d %s" % (nalternatives,nalternatives,sigm_args) submission_text += " --datareduce" submission_text += " --output=%s/%dafc/%s/binomial_%d_%d.dat\nqueue\n\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) try: os.makedirs ( os.path.join ( sim_root, "%dafc"%(nalternatives,), "%s" % (sigm,) ) ) except: pass # Betabinomial for nblocks in [4,6,8,12,24]: for blocksize in [10,20,40]: for sigm in ["weibull","logistic","rgumbel"]: for nalternatives in [1,2]: if sigm=="logistic": sigm_args = "" elif sigm=="rgumbel": sigm_args = "--ana-sigmoid=rgumbel" elif sigm=="weibull": sigm_args = "--ana-sigmoid=exp --ana-core=poly" submission_text += "error = %s/%dafc/%s/betabinomial_%d_%d.log\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) submission_text += "arguments = --blocksize=%d --nblocks=%d --gen-observer=betabinomial " % (blocksize,nblocks) submission_text += " --gen-nafc=%d --ana-nafc=%d %s" % (nalternatives,nalternatives,sigm_args) submission_text += " --datareduce" submission_text += " --output=%s/%dafc/%s/betabinomial_%d_%d.dat\nqueue\n\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) try: os.makedirs ( os.path.join ( sim_root, "%dafc"%(nalternatives,), "%s" % (sigm,) ) ) except: pass # Learning for nblocks in [4,6,8,12,24]: for blocksize in [10,20,40]: for sigm in ["weibull","logistic","rgumbel"]: for nalternatives in [1,2]: if sigm=="logistic": sigm_args = "" elif sigm=="rgumbel": sigm_args = "--ana-sigmoid=rgumbel" elif sigm=="weibull": sigm_args = "--ana-sigmoid=exp --ana-core=poly" submission_text += "error = %s/%dafc/%s/learning_%d_%d.log\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) submission_text += "arguments = --blocksize=%d --nblocks=%d --gen-observer=learning " % (blocksize,nblocks) submission_text += " --gen-nafc=%d --ana-nafc=%d %s" % (nalternatives,nalternatives,sigm_args) submission_text += " --datareduce" submission_text += " --output=%s/%dafc/%s/learning_%d_%d.dat\nqueue\n\n" % (sim_root,nalternatives,sigm,blocksize,nblocks) try: os.makedirs ( os.path.join ( sim_root, "%dafc"%(nalternatives,), "%s" % (sigm,) ) ) except: pass print submission_text psignifit3-3.0~beta.20120611.1/setup.py000066400000000000000000000024661176542545200172540ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ setup.py for Psignifit 3.x """ from distutils.core import setup, Extension # metadata definitions name = "pypsignifit" version = "3.0beta" author = "Ingo Fründ, Valentin Haenel" author_email = "psignifit-users@lists.sourceforge.net" description = "Statistical inference for psychometric functions" url= "http://sourceforge.net/projects/psignifit/" license = "MIT" packages = ["pypsignifit", "swignifit"] # swignifit interface swignifit_sources = ["swignifit/swignifit_raw.cxx"] swignifit = Extension('swignifit._swignifit_raw', sources = swignifit_sources, library_dirs=['src/build'], libraries=['psipp'], include_dirs=["src"]) def main(ext_modules=[swignifit]): setup(name = name, version = version, author = author, author_email = author_email, description = description, url = url, license = license, packages = packages, ext_modules = ext_modules) if __name__ == "__main__": main() psignifit3-3.0~beta.20120611.1/src/000077500000000000000000000000001176542545200163215ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/src/Makefile000066400000000000000000000053601176542545200177650ustar00rootroot00000000000000###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### # Makefile for targets in the src subdirectory CC=g++ CFLAGS=-pg -ggdb -Wall -fPIC LFLAGS=-lm -pg BUILD=build HEADERS=core.h data.h errors.h optimizer.h prior.h psychometric.h sigmoid.h bootstrap.h mclist.h special.h mcmc.h rng.h linalg.h getstart.h integrate.h OBJECTS= $(addprefix $(BUILD)/, core.o data.o optimizer.o psychometric.o sigmoid.o bootstrap.o mclist.o special.o mcmc.o rng.o linalg.o getstart.o prior.o integrate.o) TESTS=tests_all libpsipp.so: $(OBJECTS) $(HEADERS) $(CC) -shared $(LFLAGS) $(OBJECTS) -o $(BUILD)/libpsipp.so libpsipp.a: $(OBJECTS) $(HEADERS) $(CC) -static $(LFLAGS) $(OBJECTS) -o $(BUILD)/libpsipp.a tests_all: tests_all.cc $(HEADERS) libpsipp.so testing.h $(CC) -c $(CFLAGS) tests_all.cc -o $(BUILD)/tests_all.o $(CC) $(BUILD)/tests_all.o -L$(BUILD) $(LFLAGS) -lpsipp -o tests_all test: tests_all libpsipp.so LD_LIBRARY_PATH=build ./tests_all play: $(OBJECTS) play.cc $(HEADERS) $(CC) -c $(CFLAGS) play.cc -o $(BUILD)/play.o $(CC) $(OBJECTS) $(BUILD)/play.o $(LFLAGS) -o play $(BUILD): mkdir $(BUILD) $(BUILD)/prior.o: prior.cc $(HEADERS) | $(BUILD) $(CC) -c $(CFLAGS) prior.cc -o $(BUILD)/prior.o $(BUILD)/core.o: core.cc $(HEADERS) | $(BUILD) $(CC) -c $(CFLAGS) core.cc -o $(BUILD)/core.o $(BUILD)/data.o: data.cc $(HEADERS) | $(BUILD) $(CC) -c $(CFLAGS) data.cc -o $(BUILD)/data.o $(BUILD)/optimizer.o: optimizer.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) optimizer.cc -o $(BUILD)/optimizer.o $(BUILD)/psychometric.o: psychometric.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) psychometric.cc -o $(BUILD)/psychometric.o $(BUILD)/sigmoid.o: sigmoid.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) sigmoid.cc -o $(BUILD)/sigmoid.o $(BUILD)/mclist.o: mclist.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) mclist.cc -o $(BUILD)/mclist.o $(BUILD)/bootstrap.o: bootstrap.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) bootstrap.cc -o $(BUILD)/bootstrap.o $(BUILD)/special.o: special.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) special.cc -o $(BUILD)/special.o $(BUILD)/mcmc.o: mcmc.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) mcmc.cc -o $(BUILD)/mcmc.o $(BUILD)/rng.o: rng.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) rng.cc -o $(BUILD)/rng.o $(BUILD)/linalg.o: linalg.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) linalg.cc -o $(BUILD)/linalg.o $(BUILD)/getstart.o: getstart.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) getstart.cc -o $(BUILD)/getstart.o $(BUILD)/integrate.o: integrate.cc $(HEADERS)| $(BUILD) $(CC) -c $(CFLAGS) integrate.cc -o $(BUILD)/integrate.o clean: -rm -rf $(BUILD) -rm tests_all psignifit3-3.0~beta.20120611.1/src/bootstrap.cc000066400000000000000000000155461176542545200206600ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "bootstrap.h" #include "getstart.h" #include "rng.h" #ifdef DEBUG_BOOTSTRAP #include #endif void determineBCa ( const std::vector& l_LF, const std::vector& u_i, double initialthreshold, double *bias, double*acc ) { // Calculate BCa constants double E_l(0); // expected likelihood double E_l3(0); // expectation of cubic likelihood double var_l(0); // variance / standard deviation of likelihood double w(0); // probability to obtain thresholds less than ML-fit int b,B ( l_LF.size() ); // Get expectations for ( b=0; b cuts, std::vector* param, bool BCa, bool parametric ) { #ifdef DEBUG_BOOTSTRAP int l; std::cerr << "Starting bootstrap\n Cuts size=" << cuts.size() << " "; std::cerr.flush(); #endif BootstrapList bootstrapsamples ( B, model->getNparams(), data->getNblocks(), cuts ); unsigned int b,k,cut; // iteration variables for bootstrap sample, block, l-general purpose third level iteration, cut std::vector< std::vector > l_LF (cuts.size(), std::vector(B)); // vector of double-vectors std::vector< std::vector > u_t (cuts.size(), std::vector(B)); std::vector< std::vector > u_s (cuts.size(), std::vector(B)); PsiOptimizer opt ( model, data ); // for ML-Fitting PsiData * localdataset = new PsiData ( data->getIntensities(), // local because it changes in every iteration data->getNtrials(), data->getNcorrect(), data->getNalternatives() ); std::vector initialfit ( model->getNparams() ); // generating parameters for the bootstrap samples std::vector incr ( model->getNparams() ); if (param==NULL) { initialfit = getstart ( model, data, 8, 3, 3, &incr ); initialfit = opt.optimize( model, data ); initialfit.resize ( initialfit.size()+incr.size() ); for ( k=0,b=model->getNparams(); b p ( data->getNblocks() ); // predicted p-correct for parametric bootstrap if (parametric) { for ( k=0; kgetNblocks(); k++ ) { p[k] = model->evaluate ( data->getIntensity(k), initialfit ); } } else { for ( k=0; kgetNblocks(); k++ ) { p[k] = data->getPcorrect( k ); } } std::vector localfit ( model->getNparams() ); std::vector sample ( data->getNblocks() ); std::vector initialthresholds ( cuts.size() ); std::vector initialslopes ( cuts.size() ); std::vector devianceresiduals ( data->getNblocks() ); double deviance; for (cut=0; cutgetThres(initialfit,cuts[cut]); initialslopes[cut] = model->getSlope(initialfit,initialthresholds[cut]); } for ( b=0; bsetNcorrect ( sample ); // put the new sample to the localdataset bootstrapsamples.setData ( b, sample ); // store the new sample in the mc object // Fit localfit = opt.optimize (model, localdataset, &initialfit ); #ifdef DEBUG_BOOTSTRAP for (l=0; ldeviance ( localfit, localdataset ); devianceresiduals = model->getDevianceResiduals ( localfit, localdataset ); bootstrapsamples.setEst ( b, localfit, deviance ); bootstrapsamples.setRpd ( b, model->getRpd( devianceresiduals, localfit, localdataset ) ); bootstrapsamples.setRkd ( b, model->getRkd( devianceresiduals, localdataset ) ); // Store what we need for the BCa stuff for (cut=0; cutleastfavourable ( localfit, localdataset, cuts[cut] ); #ifdef DEBUG_BOOTSTRAP if (l_LF[cut][b] != l_LF[cut][b]) { std::cerr << "deviance = " << deviance << "\n"; std::cerr << "l_LF["<getThres(localfit,cuts[cut]); u_s[cut][b] = model->getSlope(localfit,u_t[cut][b]); #ifdef DEBUG_BOOTSTRAP if (l_LF[cut][b]!= l_LF[cut][b]) { std::cerr << "u_t["< mlestimate ( opt->optimize( model, data ) ); std::vector estimate ( mlestimate ); delete opt; JackKnifeList jackknife ( data->getNblocks(), model->getNparams(), model->deviance(mlestimate, data), mlestimate ); PsiData * localdata; std::vector x ( data->getNblocks()-1 ); std::vector k ( data->getNblocks()-1 ); std::vector n ( data->getNblocks()-1 ); unsigned int i,j,l,exclude(0); for ( i=0; igetNblocks(); i++ ) { exclude=i; j=0; for (l=0; lgetNblocks(); l++) { if (l!=exclude) { x[j] = data->getIntensity(l); k[j] = data->getNcorrect(l); n[j] = data->getNtrials(l); j++; } } localdata = new PsiData ( x,n,k,data->getNalternatives() ); opt = new PsiOptimizer ( model, localdata ); estimate = opt->optimize( model, localdata, &mlestimate ); jackknife.setEst ( i, estimate, model->deviance(estimate,localdata) ); delete localdata; delete opt; } return jackknife; } psignifit3-3.0~beta.20120611.1/src/bootstrap.h000066400000000000000000000032661176542545200205160ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef BOOTSTRAP_H #define BOOTSTRAP_H #include #include #include "psychometric.h" #include "mclist.h" #include "optimizer.h" /** \brief perform a parametric bootstrap * * A parametric bootstrap is performed by sampling from a binomial distribution with success probability given by the psychometric * function. if BCa is true, bias correction and acceleration constant are calculated for the cuts given in cuts. */ BootstrapList bootstrap ( unsigned int B, ///< number of bootstrap samples const PsiData * data, ///< data that are to form the basis of the whole procedure const PsiPsychometric* model, ///< model to be fitted std::vector cuts, ///< performance levels at which the threshold should be calculated std::vector* param=NULL, ///< parameter vector on which parametric bootstrap should be based bool BCa=true, ///< calculate bias correction and acceleration? bool parametric=true ///< Perform parametric bootstrap? ); /** \brief perform jackkifing to detect influential observations and outliers * * Wichmann & Hill (2001) suggest performing jackknife resampling on the data to determine * influential observations and outliers. * * Wichmann & Hill (2001) The psychometric function: I. Fitting, sampling, and goodness of fit. Perception & Psychophysics, 63(8), 1293--1313. */ JackKnifeList jackknifedata ( const PsiData * data, const PsiPsychometric* model ); void newsample ( const PsiData * data, const std::vector& p, std::vector * sample ); #endif psignifit3-3.0~beta.20120611.1/src/core.cc000066400000000000000000000316101176542545200175610ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "core.h" /************************************************************ * abCore methods */ double abCore::dg ( double x, const std::vector& prm, int i ) const { switch (i) { case 0: return -1./prm[1]; break; case 1: return -(x-prm[0])/(prm[1]*prm[1]); break; default: // If the parameter does not exist in the abCore the derivative with respect to it will always be 0 return 0; break; } } double abCore::dgx ( double x, const std::vector& prm ) const { return 1./prm[1]; } double abCore::ddg ( double x, const std::vector& prm, int i, int j ) const { if (i==j) { switch (i) { case 0: return 0; break; case 1: return 2*(x-prm[0])/(prm[1]*prm[1]*prm[1]); break; default: // If the parameter does not exist in the abCore the derivative with respect to it will always be 0 return 0; break; } } else if ((i==0 && j==1) || (i==1 && j==0)) { return 1./(prm[1]*prm[1]); } else // If the parameter does not exist in the abCore the derivative with respect to it will always be 0 return 0; } double abCore::inv ( double y, const std::vector& prm ) const { return y*prm[1] + prm[0]; } double abCore::dinv ( double y, const std::vector& prm, int i ) const { switch (i) { case 0: return 1; break; case 1: return y; break; default: return 0; break; } } std::vector abCore::transform ( int nprm, double a, double b ) const { std::vector out ( nprm, 0 ); out[1] = 1./b; out[0] = -a/b; return out; } /************************************************************ * mwCore methods */ mwCore::mwCore( const PsiData* data, const int sigmoid, const double alpha ) : sigmtype(sigmoid), alpha(alpha), zshift(0) { switch (sigmoid) { case 1: // logistic zalpha = 2*log(1./alpha-1.); break; case 2: // gaussian zalpha = invPhi(1-alpha)-invPhi(alpha); break; case 3: // gumbel zalpha = log(-log(alpha))-log(-log(1.-alpha)); zshift = log(-log(0.5)); break; case 4: // cauchy zalpha = -2*tan(M_PI*(alpha-0.5)); zshift = 0; break; case 5: // Exponential zalpha = log( (1-alpha)/alpha ); zshift = log(2.); break; case 6: // gumbel_r zalpha = -log(-log(1.-alpha))+log(-log(alpha)); zshift = -log(-log(0.5)); break; default: throw NotImplementedError(); } } double mwCore::g ( double x, const std::vector& prm ) const { return zalpha*(x-prm[0])/prm[1] + zshift; } double mwCore::dg ( double x, const std::vector& prm, int i ) const { switch (i) { case 0: return -zalpha/prm[1]; break; case 1: return -zalpha*(x-prm[0])/(prm[1]*prm[1]); break; default: // Irrelevant parameter ~> derivative is 0. return 0; break; } } double mwCore::dgx ( double x, const std::vector& prm ) const { return zalpha/prm[1]; } double mwCore::ddg ( double x, const std::vector& prm, int i, int j ) const { if (i==j) { if (i==0) return 0; else if (i==1) return 2*zalpha*(x-prm[0])/(prm[1]*prm[1]*prm[1]); else return 0; } else if ( (i==0 && j==1) || (i==1 && j==0) ) return zalpha/(prm[1]*prm[1]); else return 0; } double mwCore::inv ( double y, const std::vector& prm ) const { return prm[0] + prm[1]*(y-zshift)/zalpha; } double mwCore::dinv ( double p, const std::vector& prm, int i ) const { switch (i) { case 0: return 1; break; case 1: return (p-zshift)/zalpha; break; default: return 0; break; } } std::vector mwCore::transform ( int nprm, double a, double b ) const { std::vector out ( nprm, 0 ); out[1] = zalpha/b; out[0] = out[1]*(zshift-a)/zalpha; return out; } /************************************************************ * logarithmicCore */ double logCore::g ( double x, const std::vector& prm ) const throw(BadArgumentError) { if (x<0) throw BadArgumentError("logCore.g is only valid in the range x>=0"); return prm[0] * (x==0 ? -1e10 : log(x)) + prm[1]; } logCore::logCore( const PsiData* data, const int sigmoid, const double alpha ) : scale(0) { unsigned int i; // we need this to scale starting values obtained from logistic regression so that they are correct "on average" for (i=0; igetNblocks(); i++) scale += data->getIntensity(i)/log(data->getIntensity(i)); scale /= data->getNblocks(); } double logCore::dg ( double x, const std::vector& prm, int i ) const { switch (i) { case 0: return log(x); break; case 1: return 1; break; default: return 0; break; } } double logCore::dgx ( double x, const std::vector& prm ) const { return prm[0]/x; } double logCore::dinv ( double y, const std::vector& prm, int i ) const { switch (i) { case 0: return exp((y-prm[1])/prm[0]) * (prm[1]-y)/(prm[0]*prm[0]); break; case 1: return -exp((y-prm[1])/prm[0])/prm[0]; break; default: return 0; break; } } std::vector logCore::transform ( int nprm, double a, double b ) const { std::vector prm ( nprm, 0 ); prm[0] = b*scale; // we scale the intercept so that it is correct "on average" prm[1] = a; return prm; } /************************************************************ * weibullCore */ weibullCore::weibullCore( const PsiData* data, const int sigmoid, const double alpha ) : twooverlog2(2./log(2)) , loglog2 ( log(log(2.)) ) { // approximate log(x)~ax+b by a linear function over the range of x values in data double covxlogx(0),varx(0); double meanx(0), meanlogx(0); unsigned int i; for (i=0; igetNblocks(); i++) { meanx += data->getIntensity(i); meanlogx += log(data->getIntensity(i)); } meanx /= data->getNblocks(); meanlogx /= data->getNblocks(); for (i=0; igetNblocks(); i++) { varx += pow( data->getIntensity(i)-meanx, 2); covxlogx += (data->getIntensity(i)-meanx) * (log(data->getIntensity(i))-meanlogx); } varx /= data->getNblocks()-1; covxlogx /= data->getNblocks()-1; loglina = covxlogx/varx; loglinb = meanlogx - loglina*meanx; } double weibullCore::dg ( double x, const std::vector& prm, int i ) const throw(BadArgumentError) { if (x<0) throw BadArgumentError("weibullCore.dg is only valid in the range x>=0"); if (i==0) { // return -twooverlog2*prm[1] * log(prm[0]); return twooverlog2*prm[1] * ( log(x) - log(prm[0]) - 1); } else if (i==1) { return twooverlog2*prm[0]*((x==0 ? -1e10 : log(x))-log(prm[0])); } else { return 0; } } double weibullCore::dgx ( double x, const std::vector& prm ) const { return twooverlog2*prm[0]*prm[1]/x; } double weibullCore::ddg ( double x, const std::vector& prm, int i, int j ) const throw(BadArgumentError) { if (x<0) throw BadArgumentError("weibullCore.ddg is only valid in the range x>=0"); if (i==j) { if (i==0) return -twooverlog2 * prm[1] / prm[0]; else return 0; } else { if ( (i==0 && j==1) || (i==1 && j==0) ) { // return -twooverlog2 * log(prm[0]); return twooverlog2 * ( log(x) - log(prm[0]) - 1 ); } else return 0; } } double weibullCore::inv ( double y, const std::vector& prm ) const { return prm[0] * exp (y/(prm[0]*prm[1]*twooverlog2)); } double weibullCore::dinv ( double y, const std::vector& prm, int i ) const { if (i==0) return exp(y/(prm[0]*prm[1]*twooverlog2)) * (1-y/(twooverlog2*prm[0]*prm[1])); else if (i==1) return -exp(y/(prm[0]*prm[1]*twooverlog2))*y/(twooverlog2*prm[1]*prm[1]); else return 0; } std::vector weibullCore::transform ( int nprm, double a, double b ) const { std::vector prm ( nprm, 0 ); prm[1] = exp ( b/loglinb ); prm[0] = ((a/loglinb)/twooverlog2)/prm[1]; return prm; } /************************************************************ * polyCore */ polyCore::polyCore( const PsiData* data, const int sigmoid, const double alpha ) { double meanx (0),varx(0); unsigned int i; for (i=0; igetNblocks(); i++) { meanx += data->getIntensity(i); } meanx /= data->getNblocks(); for (i=0; igetNblocks(); i++) { varx += pow( data->getIntensity(i)-meanx, 2 ); } varx /= data->getNblocks(); varx = sqrt(varx); x1 = meanx+varx; x2 = meanx-varx; } double polyCore::dg ( double x, const std::vector& prm, int i ) const { if (x<0) return 0; else { if (i==0) return -prm[1] * x * pow(x/prm[0] , prm[1]-1)/(prm[0]*prm[0]); else if (i==1) return pow (x/prm[0], prm[1] ) * log(x/prm[0]); else return 0; } } double polyCore::dgx ( double x, const std::vector& prm ) const { if (x<0) return 0; else { return prm[1]*pow(prm[0],-prm[1])*pow(x,prm[1]-1); } } double polyCore::ddg ( double x, const std::vector& prm, int i, int j ) const { if (x<0) return 0; else { if (i==j) { if (i==0) return prm[1]*x*(prm[1]+1)*pow(x/prm[0],prm[1]-1)/(prm[0]*prm[0]*prm[0]); else if (i==1) return pow(x/prm[0],prm[1]) * pow(log(x/prm[0]),2); else return 0; } else if ( (i==0 && j==1) || (j==0 && i==1) ) { return - pow(x/prm[0],prm[1]) * ( prm[1]*log(x/prm[0]) + 1. ) / prm[0]; } else return 0; } } double polyCore::inv ( double y, const std::vector& prm ) const { return prm[0] * pow ( y, 1./prm[1] ); } double polyCore::dinv ( double y, const std::vector& prm, int i ) const { if (i==0) { return pow ( y, 1./prm[1] ); } else if (i==1) { return - log(y) * prm[0] * pow ( y, 1./prm[1] )/(prm[1]*prm[1]); } else return 0; } std::vector polyCore::transform ( int nprm, double a, double b ) const { std::vector prm ( nprm, 0 ); if ( a+b*x1 < 0 ) a = -b*x1+.1; if ( a+b*x2 < 0 ) a = -b*x2+.1; prm[1] = log ( (a+b*x2)/(a+b*x1) )/log(x2/x1); prm[0] = x1*pow(a+b*x1, - 1./prm[1]); return prm; } /************************************************************ * NakaRushton */ NakaRushton::NakaRushton ( const PsiData *data, const int sigmoid, const double alpha ) : x(data->getNblocks()) { unsigned int i; for ( i=0; igetNblocks(); i++ ) { x[i] = data->getIntensity(i); } } double NakaRushton::dg ( double x, const std::vector& prm, int i ) const { double sigm, k; double xk,sigmk; if (x<0) return 0; sigm = prm[0]; k = prm[1]; xk = pow(x,k); sigmk = pow(sigm,k); // These derivatives are from sympy switch (i) { case 0: return -k * xk * sigmk / ( sigm * pow( xk + sigmk, 2) ); break; case 1: return xk*log(x)/(xk+sigmk) - xk * ( xk * log(x) + sigmk*log(sigm) ) / pow(xk+sigmk,2); break; default: return 0; } } double NakaRushton::ddg ( double x, const std::vector& prm, int i, int j ) const { double sigm,k; double xk,sigmk; double logx,logsigm; if (x<0) return 0; sigm = prm[0]; k = prm[1]; xk = pow(x,k); sigmk= pow(sigm,k); logx = log(x); logsigm = log(sigm); // These derivatives are from sympy if ( (i==0) && (j==0) ) { return 2*xk*k*k*sigmk*sigmk/(sigm*sigm*pow(xk+sigmk,3)) + (k*xk*sigmk - xk*k*k*sigmk)/(sigm*sigm*pow(xk+sigmk,2)); } else if ( (i==1) && (j==1) ) { return -xk * (xk*logx*logx + sigmk*logsigm*logsigm)/pow(xk+sigmk,2) + xk*(xk*logx+sigmk*logsigm)*(2*xk*logx+2*sigmk*logsigm)/pow(xk+sigmk,3) - 2*xk*(xk*logx+sigmk*logsigm)*logx/pow(xk+sigmk,2) + xk*logx*logx/(xk+sigmk); } else if ( ((i==0) && (j==1)) || ((i==1) && (j==0)) ) { return -xk*(x*sigmk*logsigm + xk)/(sigm*pow(xk+sigmk,2)) - k*xk*sigmk*logx / (sigm*pow(xk+sigmk,2)) + 2*k*xk*sigmk*(xk*logx+sigmk*logsigm)/(sigm*pow(xk+sigmk,3)); } else return 0; } double NakaRushton::dgx ( double x, const std::vector& prm ) const { double xmk ( pow(x,prm[1]-1) ); double xk (xmk*x), sgk ( pow(prm[0], prm[1]) ); if ( x<0 ) return 0; else return prm[1]*xmk*(sgk+xk+xk)/((sgk+xk)*(sgk+xk)); } double NakaRushton::inv ( double y, const std::vector& prm ) const { return pow ( pow(prm[0], prm[1])*y/(1-y), 1.0/prm[1] ); } double NakaRushton::dinv ( double y, const std::vector& prm, int i ) const { /* double sqrtpart, k, sigm, logsigm, sigmk; sigmk = pow(sigm,k); sqrtpart = pow ( sigmk / (1-y), 1.0/prm[1] ); logsigm = log ( sigm ); return sqrtpart * ( logsigm/k - log(sigmk/(1-y))/(k*k)); */ double odds (y/(1-y)), sigm(prm[0]), k(prm[1]); switch (i) { case 0: return pow(odds, 1./k); break; case 1: return sigm*pow(odds, 1./k) * ( log(sigm)/k - log(odds*pow(sigm,k))/(k*k) ); } return -1; } std::vector NakaRushton::transform ( int nprm, double a, double b ) const { double s1(0),s2(0),s3(0),s4(0), logxi, xi; double khat, klogsigmhat; unsigned int i; // Using linear regression to approximate the logarithm linearly on the desired stimulus range for ( i=0; i prm ( nprm ); prm[1] = khat; prm[0] = exp ( klogsigmhat/khat ); return prm; } psignifit3-3.0~beta.20120611.1/src/core.h000066400000000000000000000624371176542545200174360ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef CORE_H #define CORE_H #include #include "errors.h" #include "special.h" #include "data.h" /** \brief inner function of the sigmoid term of the psychometric function * * The psychometric function is parameterized by two classes. The outer (PsiSigmoid) takes care * of the saturating nonlinearity. The PsiCore class performs some (potentially parameter dependent) * internal transformations of this nonlinearity. * * The PsiCore class itself is completely virtual: It is meant to be the base class off all other * core objects. */ class PsiCore { public: virtual double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const { throw NotImplementedError(); } ///< evaluate the core of the sigmoid virtual double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter to which the derivative should be evaluated ) const { throw NotImplementedError(); } ///< evaluate the first derivative of the core with respect to parameter i virtual double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const { throw NotImplementedError(); } ///< evaluate the first derivative of the core with respect to stimulus intensity virtual double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< index of the first parameter to which the derivative should be evaluated int j ///< index of the second parameter to which the derivative should be evaluated ) const { throw NotImplementedError(); } ///< evaluate the second derivative of the core with respect to parameter i and j virtual double inv ( double y, ///< transformed intensity const std::vector& prm ///< parameter vector ) const { throw NotImplementedError(); } ///< invert the core virtual double dinv ( double p, ///< transformed inensity at which to evaluate the derivative const std::vector& prm, ///< parameter vector int i ///< evaluate the derivative with respect to parameter i ) const { throw NotImplementedError(); } ///< derivative of the inverse core with respect to parameters virtual std::vector transform ( int nprm, ///< number of parameters in the final parameter vector double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model ) const {throw NotImplementedError();} ///< transform parameters from logistic regression to those used for this core virtual PsiCore * clone ( void ) const { throw NotImplementedError(); } ///< clone object by value static std::string getDescriptor ( void ) { throw NotImplementedError(); }///< get a short string that identifies the type of core }; /** \brief a-b parameterization of the psychometric function * * In the original psignifit release, the nonlinearity was usually defined as a cumulative distribution function. In that * case two parameters describing the mean alpha and the standard deviation beta of this distribution were required. This * yielded a core object of the form (x-alpha)/beta. This type of internal parameterization is implemented here. * * The parameter vector is in any case expected to have the first two parameters alpha and beta */ class abCore : public PsiCore { private: public: abCore( const PsiData* data=NULL, ///< ignored const int sigmoid=1, ///< ignored const double alpha=0.1 ///< ignored ) {} ///< construcor abCore( const abCore& original) {} ///< copy construcor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const { return (x-prm[0])/prm[1]; } ///< evaluate the core of the sigmoid double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter to which the derivative should be evaluated ) const ; ///< evaluate the first derivative of the core with respect to parameter i double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< index of the parameter to which the first derivative should be evaluated int j ///< index of the parameter to which the second derivative should be evaluated ) const; ///< evaluate the second derivative of the core with respect to parameters i and j double inv ( double y, ///< transformed intensity const std::vector& prm ///< parameter vector ) const; ///< invert the core double dinv ( double p, ///< transformed intenstiy at which to evaluate the derivative const std::vector& prm, ///< parameter vector int i ///< evaluate the derivative with respect to parameter i ) const; ///< derivative of the inverse core with respect to parameter i std::vector transform ( int nprm, ///< number of parameters in the final parameter vector double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model ) const; ///< transform parameters from a logistic regression model to the parameters used here PsiCore * clone ( void ) const { return new abCore(*this); } static std::string getDescriptor ( void ) { return "ab"; } }; /** \brief m-w parameterization of the psychmetric function * * An alternative way to parameterize the psychometric function is to describe it in terms of a threshold (m) and the width * of part of the function over which there is significant performance increase. What exactly "significant performance increase" * means is defined by a parameter alpha. By definition significant performance increase happens over the range where f(g(x|theta)) is * larger than alpha but smaller than 1-alpha. Obviously this definition depends on the sigmoid that is used. */ class mwCore : public PsiCore { private: int sigmtype; double alpha; double zalpha; double zshift; public: mwCore( const PsiData* data=NULL, ///< ignored const int sigmoid=1, ///< Type of the sigmoid (1=logistic, 2=gauss, 3=gumbel) const double alpha=0.1 ///< alpha parameter defining what "significant performance increase" means ); ///< construcor mwCore( const mwCore& original ) : sigmtype(original.sigmtype), alpha(original.alpha), zalpha(original.zalpha), zshift(original.zshift) {} ///< copy constructor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the core of the sigmoid double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter to which the derivative should be evaluated ) const; ///< evaluate the first derivative of the core with respect to parameter i double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< index of the parameter to which the first derivative should be evaluated int j ///< index of the parameter to which the second derivative should be evaluated ) const; ///< evaluate the second derivative of the core with respect to parameters i and j double inv ( double y, ///< transformed intensity const std::vector& prm ///< parameter vector ) const; ///< invert the core double dinv ( double p, ///< transformed intenstiy at which to evaluate the derivative const std::vector& prm, ///< parameter vector int i ///< evaluate the derivative with respect to parameter i ) const; ///< derivative of the inverse core with respect to parameter i std::vector transform ( int nprm, ///< number of parameters in the final parameter vector double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model ) const; ///< transform parameters from a logistic regression model to the parameters used here PsiCore * clone ( void ) const { return new mwCore(*this); } static std::string getDescriptor ( void ) { return "mw"; } double getAlpha( void ) const { return alpha; } }; /** \brief linear core * * The core of the sigmoid is simply a*x+b, where a and b are the first two parameters. This is the parameterization that would * be used in the context of generalized linear models. The parameters do not have an obvious interpretation in terms of * psychophysically meaningful quantities. However, it might well be that in this form, the parameters are more independent, which * is particularly important for MCMC. */ class linearCore : public PsiCore { public: linearCore( const PsiData* data=NULL, ///< ignored const int sigmoid=1, ///< ignored const double alpha=0.1 ///< ignored ) {} ///< construcor linearCore( const linearCore& original ) {} ///< copy constructor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const { return prm[0] * x + prm[1]; } ///< evaluate the core of the sigmoid double dg ( double x, ///< stimululs intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter we want the derivative to ) const { switch (i) { case 0: return x; break; case 1: return 1; break; default: return 0; break; } } ///< first derivative w.r.t. parameter i double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const { return prm[0]; } ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< index of the parameter we want for the first derivative int j ///< index of the parameter we want for the second derivative ) const { return 0; } ///< second derivative w.r.t. parameters i and j double inv ( double y, ///< value to be inverted const std::vector& prm ///< parameter vector ) const { return (y-prm[1])/prm[0]; } ///< inverse of the core double dinv ( double y, ///< value at which the derivative of the inverse should be evaluated const std::vector& prm, ///< parameter vector int i ///< index of the parameter we want the derivative to ) const { switch (i) { case 0: return (prm[1]-y)/(prm[0]*prm[0]); break; case 1: return -1./prm[0]; break; default: return 0; break; } } ///< deriviative of the inverse w.r.t. parameter i std::vector transform ( int nprm, ///< number of parameters in the whole model double a, ///< intercept parameter of the logistic regression model double b ///< slope parameter of the logistic regression ) const { std::vector out (nprm,0); out[0] = b; out[1] = a; return out; } ///< transform logistic regression parameters to useful ones for this core PsiCore * clone ( void ) const { return new linearCore(*this); } static std::string getDescriptor ( void ) { return "linear"; } }; /** \brief logarithmic core * * The Weibull function typically gives a good fit for data from visual experiments. Unfortunately, the weibull distribution function * does not allow for a straight forward fit using generalized linear models. However, the weibull distribution function is obtained * if a gumbel is fit on logarithmic contrast values. This core is the same as the linearCore but for the logarithm of x */ class logCore : public PsiCore { private: double scale; public: logCore( const PsiData* data=NULL, ///< use a data set to determine the correct scaling factors of initial values and initialize the objec const int sigmoid=1, ///< ignored const double alpha=0.1 ///< ignored ); ///< construcor logCore ( const logCore& original) : scale(original.scale) {} ///< copy constructor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const throw(BadArgumentError); ///< evaluate the core double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< parameter with respect to which the derivative should evaluated ) const; ///< evaluate derivative of the core double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< first parameter with respect to which the derivative should be taken int j ///< second parameter with respect to which the derivative should be taken ) const { return 0; } ///< evaluate 2nd derivative of the core double inv ( double y, ///< value at which to evaluate the inverse const std::vector& prm ///< parameter vector ) const { return exp((y-prm[1])/prm[0]); } ///< invert the core double dinv ( double y, ///< value at which to evaluate the inverse const std::vector& prm, ///< parameter vector int i ///< take derivative of the inverse core with respect to parameter i ) const; ///< evaluate derivative of the inverse core with respect to parameter i std::vector transform ( int nprm, ///< number of parameters in the final model double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model ) const; ///< transform parameters from a logistic regression model to starting values PsiCore * clone ( void ) const { return new logCore(*this); } static std::string getDescriptor ( void ) { return "log"; } }; /** \brief Core for the psychofun Weibull parameterization * * The R-package psychofun by Kuss et al (2005, J Vis) uses a slightly different parameterization of the Weibull, that is parameterized in * terms of "threshold location m and slope at threshold s". This core should be combined with a PsiGumbelL sigmoid to obtain the Weibull or * with a PsiGumbelR sigmoid to obtain the reversed Weibull. However, any other combination is also valid. However, in that case, the parameters * m and s might not be as interpretable as they are in case of the weibull. */ class weibullCore : public PsiCore { private: double twooverlog2; double loglog2; double loglina; double loglinb; public: weibullCore( const PsiData* data=NULL, ///< use a data set to determine the correct scaling factors of initial values and initialize the objec const int sigmoid=1, ///< ignored const double alpha=0.1 ///< ignored ); ///< construcor weibullCore ( const weibullCore& original ) : twooverlog2(original.twooverlog2), loglog2(original.loglog2), loglina(original.loglina), loglinb(original.loglinb) {} ///< copy constructor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector (m,s,...) ) const { return twooverlog2*prm[0]*prm[1] * (log(x)-log(prm[0])) + loglog2; } ///< evaluate the weibull core double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter with respect to which the derivative should be evaluated ) const throw(BadArgumentError) ; ///< evaluate the derivateive of the core double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intenstiy const std::vector& prm, ///< parameter vector int i, ///< first parameter with respect to which the derivative should be taken int j ///< second parameter with respect to which the derivative should be taken ) const throw(BadArgumentError) ; ///< evaluate the 2nd derivative of the core double inv ( double y, ///< value at which to evaluate the inverse const std::vector& prm ///< parameter vector ) const; ///< invert the core double dinv ( double y, ///< value at which to evaluate the inverse const std::vector& prm, ///< parameter vector int i ///< take the derivative of the inverse core with respect to parameter i ) const; ///< evaluate the derivative of the inverse core with respect to parameter i std::vector transform ( int nprm, ///< number of parameters in the final model double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model ) const; ///< transform the parameters from a logistic regression model to starting values PsiCore * clone ( void ) const { return new weibullCore(*this); } static std::string getDescriptor ( void ) { return "weibull"; } }; /** \brief polynomial Core as used for the weibull function * * The classical weibull function is parameterized as 1-exp(-(x/alpha)^beta), this core defines the (x/alpha)^beta part in this * parameterization. The PsiExponential sigmoid gives the 1-exp(-.) part. */ class polyCore : public PsiCore { private: double x1; double x2; public: polyCore( const PsiData* data=NULL, ///< use a data set to determine the correct scaling factors of initial values and initialize the objec const int sigmoid=1, ///< ignored const double alpha=0.1 ///< ignored ); ///< construcor polyCore ( const polyCore& original ) : x1(original.x1), x2(original.x2) {} ///< copy constructor double g ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector (alpha,beta, ...) ) const { return (x>0 ? pow( x/prm[0], prm[1] ) : 0 ); } ///< evaluate the polyCore double dg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i ///< index of the parameter to which the derivative should be evaluated ) const; ///< derivative of the polyCore with respect to a parameter double dgx ( double x, ///< stimulus intensity const std::vector& prm ///< parameter vector ) const; ///< evaluate the first derivative of the core with respect to stimulus intensity double ddg ( double x, ///< stimulus intensity const std::vector& prm, ///< parameter vector int i, ///< index of the first derivative parameter int j ///< index of the 2nd derivatibe parameter ) const; ///< 2nd derivative of the polyCore object with respect to parameters double inv ( double y, ///< value for which the core should be inverted const std::vector& prm ///< parameter vector ) const; ///< inverse of the core double dinv ( double y, ///< value at which to evaluate the inverse const std::vector& prm, ///< parameter vector int i ///< index of the parameter for which the derivative should be evaluated ) const; ///< derivative of the inverse core std::vector transform ( int nprm, ///< number of parameters in the final model double a, ///< intercept of the logistic regression model double b ///< slope of the logistic regression model to starting values ) const; ///< transform the parameter from a logistic regression model to starting values PsiCore * clone ( void ) const { return new polyCore(*this); } static std::string getDescriptor ( void ) { return "poly"; } }; /** \brief Naka-Rushton function * * The Naka-Rushton function cannot be separated into sigmoid + core. Thus, the complete nonlinear function is implemented * in the Naka-Rushton core object. To use the Naka-Rushton function for fitting psychometric data, this core should be * combined with a PsiId sigmoid. */ class NakaRushton : public PsiCore { private: std::vector x; public: NakaRushton ( const PsiData* data=NULL, const int sigmoid=6, const double alpha=0.1 ); NakaRushton ( const NakaRushton& original ) : x ( original.x ) {} double g ( double x, const std::vector& prm ) const { return (x<0 ? 0 : pow ( x, prm[1] ) / (pow(prm[0],prm[1])+pow(x,prm[1]))); } double dg ( double x, const std::vector& prm, int i ) const; double ddg ( double x, const std::vector& prm, int i, int j ) const; double dgx ( double x, const std::vector& prm ) const; double inv ( double y, const std::vector& prm ) const; double dinv ( double y, const std::vector& prm, int i ) const; std::vector transform ( int nprm, double a, double b ) const; PsiCore * clone ( void ) const { return new NakaRushton ( *this ); } static std::string getDescriptor ( void ) { return "NakaRushton"; } }; #endif psignifit3-3.0~beta.20120611.1/src/data.cc000066400000000000000000000067661176542545200175600ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "data.h" /************************************************************ * Constructors * ************************************************************/ PsiData::PsiData ( std::vector x, std::vector N, std::vector k, int nAFC ) : intensities(x), Ntrials(N), Ncorrect(k), Pcorrect(k.size()), logNoverK(k.size()), Nalternatives(nAFC) { unsigned int i,n; for ( i=0; i x, std::vector N, std::vector p, int nAFC ) : intensities(x), Ntrials(N), Ncorrect(p.size()), Pcorrect(p), Nalternatives(nAFC) { unsigned int i; double k; for ( i=0; i 1e-7 ) // The fraction of correct responses does not correspond to an integer number of correct responses std::cerr << "WARNING: fraction of correct responses does not correspond to an integer number of correct responses!\n"; Ncorrect[i] = int(k); } } /************************************************************ * Setters * ************************************************************/ void PsiData::setNcorrect ( const std::vector& newNcorrect ) { Ncorrect = newNcorrect; unsigned int i; for ( i=0; i& PsiData::getIntensities ( void ) const { return intensities; } const std::vector& PsiData::getNtrials ( void ) const { return Ntrials; } const std::vector& PsiData::getNcorrect ( void ) const { return Ncorrect; } const std::vector& PsiData::getPcorrect ( void ) const { return Pcorrect; } double PsiData::getIntensity ( unsigned int i ) const { if ( i>=0 && i=0 && i=0 && i=0 && i=0 && i PsiData::nonasymptotic ( void ) const { unsigned int i,j,Ngood(0); double guess ( 1./Nalternatives ); if ( Nalternatives<2 ) guess = 0; for (i=0; i guess+0.05 ) if ( Pcorrect[i] < 1. ) Ngood ++; } std::vector out ( Ngood ); j=0; for (i=0; i guess+0.05 ) if ( Pcorrect[i] < 1. ) out[j++] = i; } return out; } psignifit3-3.0~beta.20120611.1/src/data.h000066400000000000000000000070411176542545200174050ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef DATA_H #define DATA_H #include #include #include #include "errors.h" /** \brief basic data set class * * This class holds data from a psychophysical experiment. The experiment can in principle be performed as an nAFC task * or as a yes/no task. Typically for an nAFC task, the number of correct responses would be recorded and for a yes/no * task the number of yes responses would be recorded. The nomenclature of the class corresponds to the nAFC task. * * The block order and number can be crucial under some circumstances, so don't lump multiple blocks into one just * because they have the same stimulus intensity. */ class PsiData { private: std::vector intensities; std::vector Ntrials; std::vector Ncorrect; std::vector Pcorrect; std::vector logNoverK; int Nalternatives; public: PsiData ( std::vector x, ///< Stimulus intensities std::vector N, ///< Numbers of trials presented at the respective stimulus intensities std::vector k, ///< Numbers of correct trials at the respective stimulus intensities int nAFC ///< Number of response alternatives (nAFC=1 ~> yes/no task) ); ///< constructor PsiData ( std::vector x, ///< Stimulus intensities std::vector N, ///< Numbers of trials presented at the respective stimulus intensities std::vector p, ///< Fraction of correct trials at the respective stimulus intensities int nAFC ///< Number of response alternatives (nAFC=1 ~> yes/no task) ); ///< constructor ~PsiData ( void ) {} void setNcorrect ( const std::vector& newNcorrect ///< new number of correct responses ); ///< set the number of correct responses (is probably only useful for bootstrap) const std::vector& getIntensities ( void ) const; ///< get the stimulus intensities const std::vector& getNtrials ( void ) const; ///< get the numbers of trials at the respective stimulus intensities const std::vector& getNcorrect ( void ) const; ///< get the numbers of correct trials at the respective stimulus intensities const std::vector& getPcorrect ( void ) const; ///< get the fraction of correct trials at the respective stimulus intensities double getIntensity ( unsigned int i ) const; ///< get the stimulus intensity for block i int getNtrials ( unsigned int i ) const; ///< get the numbers of trials for block i int getNcorrect ( unsigned int i ) const; ///< get the numbers of correct trials for block i double getPcorrect ( unsigned int i ) const; ///< get the fraction of correct trials for block i int getNalternatives ( void ) const; ///< get the number of response alternatives (1 means yes/no task) unsigned int getNblocks ( void ) const { return intensities.size(); } ///< get the number of blocks in the data set double getNoverK (unsigned int i ) const; ///< return the log of NoverK for block i std::vector nonasymptotic ( void ) const; ///< a vector of indices of those blocks for which the data are not in either asymptote }; #endif psignifit3-3.0~beta.20120611.1/src/errors.h000066400000000000000000000020271176542545200200070ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef ERRORS_H #define ERRORS_H /** \brief base class for all errors */ class PsiError { public: const char *message; PsiError() : message("Unspecified PsiError") {} PsiError(const char* message) : message(message) {} ~PsiError() {} }; /** \brief Error class for errors that arise if some feature is not implemented * * This error should also be raised if a feature is not meant to be implemented as for purely * virtual methods */ class NotImplementedError : public PsiError { }; /** \brief Error class for errors that are related to unsuitable arguments to a method or function */ class BadArgumentError : public PsiError { public: BadArgumentError() {} BadArgumentError(const char* message) : PsiError(message) {} }; /** \brief Error class for errors that are related to small or large indices (out of range) */ class BadIndexError : public PsiError { }; #endif psignifit3-3.0~beta.20120611.1/src/getstart.cc000066400000000000000000000263561176542545200205010ustar00rootroot00000000000000#include "getstart.h" std::vector linspace ( double xmin, double xmax, unsigned int n ) { double dummy; if ( xmin>xmax ) { // make sure that xmin is really less than xmax dummy = xmin; xmin = xmax; xmax = dummy; } unsigned int i; double xstep ( (xmax-xmin)/(n-1) ); std::vector out (n); out[0] = xmin; for (i=1; i& xmin, const std::vector& xmax, unsigned int gridsize ) : ndim ( xmin.size() ), ngrid ( gridsize ), grid1d ( xmin.size() ), lower_bounds(xmin), upper_bounds(xmax) { if ( lower_bounds.size() != upper_bounds.size() ) throw PsiError ( "Upper and lower grid bounds are unequal" ); unsigned int i; for ( i=0; i& newposition ) const { std::vector xmin ( lower_bounds ); std::vector xmax ( upper_bounds ); unsigned int i; double gridmid; for ( i=0; i& newposition ) const { std::vector xmin ( lower_bounds ); std::vector xmax ( upper_bounds ); unsigned int i; double xstep; for ( i=0; i xmin ( lower_bounds.size()-1 ); std::vector xmax ( upper_bounds.size()-1 ); unsigned int i; for ( i=0; i prm, unsigned int pos, std::list< std::vector > *gridpoints ) { unsigned int i; if ( grid.dimension() != prm.size() ) { throw PsiError ( "grid and parameter vector don't match" ); } if ( pos>=grid.dimension() ) { // We are in the lowest level of iteration gridpoints->push_back ( prm ); return; } else { // We have to loop over this level for ( i=0; i pymakegridpoints ( const PsiGrid& grid, std::vector prm, unsigned int pos ) { std::list < std::vector >gridpoints; std::list < std::vector >::const_iterator griditer; makegridpoints ( grid, prm, pos, &gridpoints ); griditer = gridpoints.begin(); unsigned int nparams = griditer->size(); unsigned int npoints = gridpoints.size(); std::cerr << "Gridpoints:" << npoints << "\nParams:" << nparams << "\n"; std::vector out ( nparams*npoints ); unsigned int i,j; for (griditer=gridpoints.begin(),i=0; griditer!=gridpoints.end(); i+= nparams, griditer++) { for (j=0; jat(j); } return out; } void evalgridpoints ( const std::list< std::vector >& gridpoints, std::list< std::vector > *bestprm, std::list< double > *L, const PsiData* data, const PsiPsychometric* pmf, unsigned int nbest ) { std::list< std::vector >::const_iterator griditer; std::list< std::vector >::iterator iter_prm; std::list< double >::iterator iter_L; double l; double a,b; std::vector prm; const PsiCore *core = pmf->getCore(); bool store(true); for ( griditer=gridpoints.begin(); griditer!=gridpoints.end(); griditer++ ) { // Transform parameters and get negative log posterior a = (*griditer)[0]; b = (*griditer)[1]; b = 1./b; a = -a*b; // prm = core->transform ( pmf->getNparams(), 1./b, -a/b ); prm = core->transform ( pmf->getNparams(), a, b ); prm[2] = (*griditer)[2]; if ( pmf->getNparams() > 3 ) prm[3] = (*griditer)[3]; l = pmf->neglpost ( prm, data ); // Where does it belong? for ( iter_L=L->begin(), iter_prm=bestprm->begin() ; iter_L!=L->end(); iter_L++, iter_prm++ ) { if ( l==(*iter_L) ) { if ( (*iter_prm) == (*griditer) ) store = false; else store = true; break; } else if ( l<(*iter_L) ) { store = true; break; } else { store = false; } } // insert the values if they are good enough if ( store ) { L->insert ( iter_L, l ); bestprm->insert ( iter_prm, std::vector(*griditer) ); } // Reduce the size of the best parameters list while ( L->size() > nbest ) { L->pop_back(); bestprm->pop_back(); } } } void updategridpoints ( const PsiGrid& grid, const std::list< std::vector >& bestprm, std::list< std::vector > *newgridpoints, std::list< PsiGrid > *newgrids ) { // modify grid size: If a point in bestprm is on the edge of the grid: make a new, larger grid // if a point is an interior point of the grid, shring the grid to the area around that grid std::list< std::vector >::const_iterator iter_prm; std::vector prm ( bestprm.front().size() ); bool isedge (false); unsigned int i; PsiGrid newgrid; for ( iter_prm=bestprm.begin(); iter_prm!=bestprm.end(); iter_prm++ ) { // Check whether the current point is on the edge of the grid isedge = false; for ( i=0; isize(); i++ ) { isedge += (*iter_prm)[i]==grid.get_lower(i); isedge += (*iter_prm)[i]==grid.get_upper(i); } if (isedge) { newgrid = grid.shift ( *iter_prm ); } else { newgrid = grid.shrink ( *iter_prm); } makegridpoints ( newgrid, prm, 0, newgridpoints ); newgrids->push_back ( newgrid ); } } /*************************************** Range heuristics ****************************************/ void a_range ( const PsiData* data, double *xmin, double *xmax ) { double x; unsigned int i; *xmin = 1e5; *xmax = -1e5; // Heuristic: // a will be between lowest and highest stimulus level for ( i=0; igetNblocks(); i++ ) { x = data->getIntensity ( i ); if ( x<*xmin ) { *xmin = x; } if ( x>*xmax ) { *xmax = x; } } } void b_range ( const PsiData* data, double *xmin, double *xmax ) { double x,p(1),xx,pp(0),pc; std::vector intensities ( data->getIntensities() ); unsigned int i,j; double d; *xmin = 1e5; *xmax = -1e5; // Heuristic: // b will be between rising over the whole range of stimulus levels and // rising between two adjacent stimulus levels // First determine step sizes for ( i=0; i*xmax) { *xmax = d; } if (d<*xmin) { *xmin = d; } } } // Is the psychometric function rising or falling overall for ( i=0; igetPcorrect ( i ); if ( pc

pp ) { pp = pc; xx = intensities[i]; } } if ( xxgetNblocks(); i++ ) { p = data->getPcorrect ( i ); if ( p > pmax ) { pmax = p; } } *xmax = 2*(1-pmax); if (*xmax>=1) *xmax=.99; if (*xmax<=0) *xmax=0.1; } void gm_range ( const PsiData* data, double *xmin, double *xmax ) { double p, pmin(0); unsigned int i; // Heuristic: // gm goes from 0 to twice the lowsest response probability *xmin = 0; for ( i=0; igetNblocks(); i++ ) { p = data->getPcorrect ( i ); if ( p1) *xmax=.99; if (*xmax<0.1) *xmax=.1; } void parameter_range ( const PsiData* data, const PsiPsychometric * pmf, unsigned int prmindex, double *xmin, double *xmax ) { // Call the correct initial range function for the parameter double mps,mms,s; const PsiPrior *prior = pmf->getPrior( prmindex ); // incorporate information from prior mps = mms = prior->mean(); s = prior->std(); // mean plus (+) std-deviation mps += 2*s; // mean minus (-) std-deviation mms -= 2*s; switch ( prmindex ) { case 0: a_range ( data, xmin, xmax ); break; case 1: b_range ( data, xmin, xmax ); break; case 2: lm_range ( data, xmin, xmax ); break; case 3: gm_range ( data, xmin, xmax ); break; } if ( *xmin < mms ) *xmin = mms; if ( *xmax > mps ) *xmax = mps; } std::vector getstart ( const PsiPsychometric* pmf, const PsiData* data, unsigned int gridsize, unsigned int nneighborhoods, unsigned int niterations, std::vector *incr ) { std::vector xmin ( pmf->getNparams() ); std::vector xmax ( pmf->getNparams() ); std::list< std::vector > bestprm; std::list< double > L; unsigned int i,j, ngrids; // Set up the initial grid for ( i=0; igetNparams(); i++ ) { parameter_range ( data, pmf, i, &(xmin[i]), &(xmax[i]) ); } // Make an initial grid PsiGrid grid ( xmin, xmax, gridsize ), currentgrid; std::list< PsiGrid > newgrids; newgrids.push_back ( grid ); // Perform first evaluation on the grid std::list< std::vector > gridpoints; makegridpoints ( grid, xmin, 0, &gridpoints ); evalgridpoints ( gridpoints, &bestprm, &L, data, pmf, nneighborhoods ); // potentially more evaluations for ( i=0; i nneighborhoods ) { newgrids.pop_front (); } ngrids = newgrids.size(); for ( j=0; j > (); updategridpoints ( currentgrid, bestprm, &gridpoints, &newgrids ); evalgridpoints ( gridpoints, &bestprm, &L, data, pmf, nneighborhoods ); } // evalgridpoints ( gridpoints, &bestprm, &L, data, pmf, nneighborhoods ); } // Now transform the best parameter to the suitable format const PsiCore *core = pmf->getCore(); double a ( bestprm.front()[0] ), b ( bestprm.front()[1] ); // std::cerr << "Raw starting values:"; // for (i=0; i out = core->transform ( pmf->getNparams(), a, b ); out[2] = bestprm.front()[2]; if ( pmf->getNparams() > 3 ) out[3] = bestprm.front()[3]; if ( incr!=NULL ) { if ( incr->size() != pmf->getNparams() ) throw ( BadArgumentError ( "Wrong size for incr" ) ); currentgrid = newgrids.front(); for ( i=0; igetNparams(); i++ ) { (*incr)[i] = 10*currentgrid.get_incr(i); } } // std::cerr << "Starting values:"; // for (i=0; i #include /** \brief scalable and shiftable grid object used for the gridsearch */ class PsiGrid { private: unsigned int ndim; // number of parameters over which the grid goes unsigned int ngrid; // number of points per grid dimension std::vector< std::vector > grid1d; // data points along each single dimension std::vector lower_bounds; // lower bounds for each single dimension std::vector upper_bounds; // upper bounds for each single dimension public: PsiGrid ( void ) {} ///< an empty grid PsiGrid ( const std::vector& xmin, ///< lowest values for the parameters --- this should have the same length as the parameters we want to feed into the model const std::vector& xmax, ///< highest values for the parameres --- this should have the same length as the parameters we want to feed into the model unsigned int gridsize ///< size of the grid in every dimension ); ///< Generate a proper grid PsiGrid shift ( const std::vector& newposition ) const; ///< shift the grid to be centered on newposition PsiGrid shrink ( const std::vector& newposition ) const; ///< shrink the grid around newposition PsiGrid subgrid ( void ) const; ///< return a subgrid with the first dimension eliminated unsigned int get_gridsize ( void ) const { return grid1d.front().size(); } ///< return the size of the grid in every dimension bool empty ( void ) const { return grid1d.empty(); } ///< check whether the grid is empty i.e. does not have any grid points const std::vector& front ( void ) const { return grid1d.front(); } ///< return the values along the first dimension of the grid unsigned int dimension ( void ) const { return grid1d.size(); } ///< get dimension of the grid i.e. how many parameters are varied double get_lower ( unsigned int i ) const { return lower_bounds[i]; } ///< get lower bound for parameter i double get_upper ( unsigned int i ) const { return upper_bounds[i]; } ///< get upper bound for parameter i double get_incr ( unsigned int i ) const { return (get_upper(i)-get_lower(i))/(get_gridsize()-1); } ///< Get increment on dimension i double operator() ( unsigned int i, unsigned int j ) const { return grid1d[i][j]; } }; std::vector linspace ( double xmin, double xmax, unsigned int n ); ///< create n linearly spaced values between xmin and xmax void makegridpoints ( const PsiGrid& grid, ///< PsiGrid object on from which the grid points should be generated std::vector prm, ///< current setting of the parameter vector (irrelvant for initial call) should have length grid.dimension() unsigned int pos, ///< position of the currently modified parameter (should be 0 for initial call) std::list< std::vector > *gridpoints ///< gridpoints list to which new gridpoints are added ); ///< generate new grid points based on a PsiGrid object void evalgridpoints ( const std::list< std::vector >& grid, ///< gridpoints on which the negative log posterior should be evaluated std::list< std::vector > *bestprm, ///< list to which the best parameters should be appended std::list< double > *L, ///< list to which the best negative log posteriors should be appended const PsiData* data, ///< data set on which the gridsearch should be performed const PsiPsychometric* pmf, ///< psychometric function for which the gridsearch should be performed unsigned int nbest ///< how many "best" parameter constellations should be determined? ); ///< evaluate negative log posterior on a gridpoints and update bestprm and L to refer to the nbest parameter settings encountered so far void updategridpoints ( const PsiGrid& grid, ///< PsiGrid obejct from which the new grids and gridpoints should be generated const std::list< std::vector >& bestprm, ///< so far best parameter settings std::list< std::vector > *newgridpoints, ///< new gridpoints to be evaluated std::list< PsiGrid > *newgrids ///< grids corresponding to the new gridpoints ); ///< generate new gridpoints by shifting and shrinking the previous grid and store the newly generated PsiGrid objects void a_range ( const PsiData* data, double *xmin, double *xmax ); ///< Heuristic to generate a first idea of the threshold parameter a void b_range ( const PsiData* data, double *xmin, double *xmax ); ///< Heuristic to generate a first idea of the width parameter b void lm_range ( const PsiData* data, double *xmin, double *xmax ); ///< Heuristic to generate a first idea of the lapse rate parameter lm void gm_range ( const PsiData* data, double *xmin, double *xmax ); ///< Heuristic to generate a first idea of the guessing rate parameter gm void parameter_range ( const PsiData* data, const PsiPsychometric* pmf, unsigned int prmindex, double *xmin, double *xmax ); ///< call the proper heuristic associated with the parameter at prmindex to generate a range for the respective parameter std::vector getstart ( const PsiPsychometric* pmf, ///< psychometric function model for which a starting value is desired const PsiData* data, ///< data for which a starting value is desired unsigned int gridsize, ///< number of grid points to be used unsigned int nneighborhoods, ///< number of neighborhoods to be studied unsigned int niterations, ///< number of iterated neighborhood searched to be performed std::vector *incr=NULL ///< increments to be used when constructing a simplex (output) ); ///< Determine a good starting value using nested grid search std::vector pymakegridpoints ( const PsiGrid& grid, ///< PsiGrid object on from which the grid points should be generated std::vector prm, ///< current setting of the parameter vector (irrelvant for initial call) should have length grid.dimension() unsigned int pos ///< position of the currently modified parameter (should be 0 for initial call) ); ///< generate new grid points based on a PsiGrid object and return them as a std::vector to be accessed from python #endif psignifit3-3.0~beta.20120611.1/src/integrate.cc000066400000000000000000000322741176542545200206220ustar00rootroot00000000000000#include "integrate.h" #include "errors.h" #include "linalg.h" // #define DEBUG_INTEGRATE PsiIndependentPosterior::PsiIndependentPosterior ( unsigned int nprm, std::vector posteriors, std::vector< std::vector > x, std::vector< std::vector > fx ) : nparams (nprm), fitted_posteriors ( posteriors ), grids ( x ), margins ( fx ) { unsigned int i,j,k; double p; std::vector w; Matrix M ( grids[0].size(), 2 ); for ( i=0; ipdf ( grids[i][j] ); k = 1; while ( std::isinf ( p ) ) { p = posteriors[i]->pdf ( grids[i][j+k] ); k++; if ( j+k>= grids[i].size() ) p = 1e40; } if ( p!=p ) p=0; M(j,1) = p; // fitted_posteriors[i] = posteriors[i]->clone(); } w = leastsq ( &M ); // Fit the determined margin using the analytical posterior (is this needed?) #ifdef DEBUG_INTEGRATE std::cerr << "w = " << w[0] << "\n"; #endif if ( w[0]==w[0] ) for ( j=0; j lingrid ( double xmin, double xmax, unsigned int gridsize ) { unsigned int i; double dx; std::vector x (gridsize); if ( xmin>xmax ) { dx = xmin; xmin = xmax; xmax = dx; } // std::cerr << "xmax = " << xmax << " xmin = " << xmin << "\n"; dx = (xmax-xmin)/(gridsize-1); // std::cerr << "dx = " << dx << "\n"; for ( i=0; i& fx ) { double mx(-1e5); unsigned int i; for (i=0; i mx ) mx = fx[i]; } return mx; } double min_vector ( const std::vector& fx ) { double mn(1e5); unsigned int i; for (i=0; i& x, std::vector& fx ) { double Z(0); double last_f ( fx[0] ), last_x ( x[0] ); double f, d; unsigned int i; for ( i=1; i& x, const std::vector& fx ) { double m (0.); double last_f(fx[0]),last_x(x[0]); double f,d; unsigned int i; #ifdef DEBUG_INTEGRATE std::cerr << last_f << "," << last_x << "\n"; #endif for ( i=1; i& x, const std::vector& fx, double m ) { double v (0.); double last_f(fx[0]),last_x(x[0]); double mx,mf,d,f; unsigned int i; for ( i=0; i match_gauss ( const std::vector& x, const std::vector& fx ) { std::vector out ( 3 ); out[0] = numerical_mean ( x, fx ); out[1] = sqrt ( numerical_variance ( x, fx, out[0] ) ); return out; } std::vector match_gamma ( const std::vector& x, const std::vector& fx ) { double m ( numerical_mean ( x, fx ) ); double v ( numerical_variance ( x, fx, m ) ); std::vector out (3); double k, theta; theta = v/m; k = m/theta; out[0] = k; out[1] = theta; return out; } std::vector match_beta ( const std::vector& x, const std::vector& fx ) { double m ( numerical_mean ( x, fx ) ); double v ( numerical_variance ( x, fx, m ) ); std::vector out (3); double al, bt; al = m*m*(1-m)/v - m; bt = m*(1-m)*(1-m)/v - (1-m); // al = -m + m*m/v - m*m*m/v; // bt = (al-m*al)/m; // al = eta/(eta2*eta2*eta2*v) - 1./eta2; // al = m*((1-m)*m/v -1 ); // bt = al/m - al; out[0] = al; out[1] = bt; #ifdef DEBUG_INTEGRATE std::cerr << "Matched Beta ( " << al << ", " << bt << " ), m = " << m << ", v = " << v << "\n"; #endif return out; } // End Moment matching /////////////////////////// PsiIndependentPosterior independent_marginals ( const PsiPsychometric *pmf, const PsiData *data ) { unsigned int gridsize (100); unsigned int nprm ( pmf->getNparams() ), i, j; unsigned int maxntrials ( 0 ); double minp,minm,maxm,maxw,s,Z,p,m, count; std::vector< std::vector > grids ( nprm ); std::vector< std::vector > margin ( nprm, std::vector(gridsize) ); std::vector< std::vector > distparams (nprm, std::vector(3) ); std::vector fitted_posteriors (nprm); PsiOptimizer * opt = new PsiOptimizer ( pmf, data ); std::vector MAP ( opt->optimize ( pmf, data ) ); std::vector prm ( MAP ); delete opt; for ( i=0; i1 ) { minm=0; maxm=1.; } if ( i==1 ) { minm=0; maxm*=2; } grids[i] = lingrid ( minm, maxm, gridsize ); for ( j=0; jneglpost ( prm, data ); #ifdef DEBUG_INTEGRATE std::cerr << "p(" << i << "," << j << ") = " << p << " " << prm[i]; #endif // Clip if ( std::isinf ( p ) || p!=p ) { if ( j>0 ) { grids[i][j] = grids[i][j-1]; margin[i][j] = margin[i][j-1]; } else { grids[i][j] = grids[i][j+1]; prm[i] = grids[i][j+1]; margin[i][j] = pmf->neglpost ( prm, data ); if ( std::isinf ( margin[i][j] ) ) std::cerr << "WARNING: margin("< -1e10 ? p : -1e10 ); if ( std::isinf ( margin[i][j] ) ) margin[i][j] = 1e20; #ifdef DEBUG_INTEGRATE std::cerr << " margin = " << margin[i][j] << "\n"; #endif // And compute average Z online if (p>-1e10 && p<1e10) { Z += exp( -margin[i][j] ); count ++; } } Z /= count; Z = log ( Z ); // Include Z for numerical stability for ( j=0; jgetNparams() ), i, j, k; unsigned int nproposals ( nsamples*propose ); MCMCList finalsamples ( nsamples, nprm, data->getNblocks() ); double q,p,q_raw,p_raw; double nduplicate ( 0 ); PsiRandom rng; PsiPrior * posteri; std::vector < PsiPrior* > posteriors ( nprm ); double H(0),N(0); std::vector< std::vector > proposed ( nproposals, std::vector (nprm) ); std::vector weights ( nproposals ); std::vector cum_probs ( nproposals ); std::vector rnumbers ( nsamples ); for ( j=0; jrand(); // determine weight q = 1.; for ( j=0; jpdf ( proposed[i][j] ); if ( q_raw > 1e10 ) q_raw = 1e10; if ( q_raw != q_raw ) q_raw = 1e5; if ( q_raw<1e-5 ) q_raw = 1e-5; q *= q_raw; delete posteri; } p = - pmf->neglpost ( proposed[i], data ); if ( std::isinf ( p ) || p!=p ) weights[i] = 0; else weights[i] = exp ( p - log (q) ); #ifdef DEBUG_INTEGRATE if ( weights[i] != weights[i] || weights[i] > 1e10) { std::cerr << "Index: " << i << ", weight: " << weights[i] << ", p: " << p << ", q: " << q << ", th: (" << proposed[i][0]; for ( j=1; j0) cum_probs[i] = cum_probs[i-1] + weights[i]; else { cum_probs[0] = weights[0]; #ifdef DEBUG_INTEGRATE std::cerr << "w0 = " << weights[0] << "\n"; #endif } } for ( i=0; i 0 ) H = - cum_probs[0] * log(cum_probs[0]); else H = 0; #ifdef DEBUG_INTEGRATE std::cerr << "H=" << H << ", cum_probs[0] = " << cum_probs[0] << "\n"; #endif N = 1.; // Avoid zeros for ( i=0; i0) { H -= (cum_probs[i+1]-cum_probs[i]) * log ( cum_probs[i+1]-cum_probs[i] ); N += 1; } #ifdef DEBUG_INTEGRATE if ( H!=H ) { std::cerr << "H became nan in the " << i << "th iteration, cum_probs["<deviance ( proposed[j], data ) ); nduplicate += k; k=1; i++; if (i>=nsamples) break; } j++; if (j>nproposals) { #ifdef DEBUG_INTEGRATE std::cerr << "What's going on here? i=" << i << ", cum_probs.max() = " << cum_probs[nproposals-1] << "\n"; #endif break; } } finalsamples.set_accept_rate ( double(nduplicate)/nsamples ); finalsamples.set_entropy ( H ); for ( i=0; igetNparams() ), nblocks ( data->getNblocks() ); std::vector probs ( nblocks ); std::vector est ( nprm ); PsiData *localdata = new PsiData ( data->getIntensities(), data->getNtrials(), data->getNcorrect(), data->getNalternatives() ); std::vector posterior_predictive ( nblocks ); std::vector reducedx ( data->getNblocks()-1 ); std::vector reducedk ( data->getNblocks()-1 ); std::vector reducedn ( data->getNblocks()-1 ); std::vector< PsiData* > reduceddata ( data->getNblocks() ); for ( i=0; igetIntensity(k); reducedk[j] = data->getNcorrect(k); reducedn[j] = data->getNtrials(k); j++; } } reduceddata[i] = new PsiData ( reducedx, reducedn, reducedk, data->getNalternatives() ); } for ( i=0; igetNsamples(); i++ ) { for ( j=0; jgetEst ( i, j ); for ( j=0; jevaluate ( data->getIntensity(j), est ); newsample ( localdata, probs, &posterior_predictive ); localdata->setNcorrect ( posterior_predictive ); samples->setppData ( i, posterior_predictive, pmf->deviance ( est, localdata ) ); probs = pmf->getDevianceResiduals ( est, data ); samples->setRpd ( i, pmf->getRpd ( probs, est, data ) ); samples->setRkd ( i, pmf->getRkd ( probs, data ) ); probs = pmf->getDevianceResiduals ( est, localdata ); samples->setppRpd ( i, pmf->getRpd ( probs, est, localdata ) ); samples->setppRkd ( i, pmf->getRkd ( probs, localdata ) ); // Store log posterior ratios for reduced data sets for ( j=0; jsetlogratio ( i, j, pmf->neglpost(est,data) - pmf->neglpost(est,reduceddata[j]) ); } for ( i=0; i #include /** Produce a linearly spaced grid from xmin to xmax */ std::vector lingrid ( double xmin, double xmax, unsigned int gridsize ); // Numerical integration void normalize_probability ( const std::vector& x, ///< nodes at which the density has been evaluated std::vector& fx ///< (unnormalized) density at the respective nodes. ); ///< normalize a probability density (in place!) double numerical_mean ( const std::vector& x, ///< nodes at which the density has been evaluated const std::vector& fx ///< normalized density at the respective nodes ); ///< determine the 1d mean by evaluating the respective integral numerically double numerical_variance ( const std::vector& x, ///< nodes at which the density has been evaluated const std::vector& fx, ///< normalized density at the respective nodes double m ///< numerically evaluated mean ); ///< determine the 1d variance by evaluating the respective integral numerically // Moment matching std::vector match_gauss ( const std::vector& x, ///< nodes at which the density has been evaluated const std::vector& fx ///< normalized density at the respective nodes ); ///< determine parameters of a gaussian that matches with the first and second moments of the sampled density std::vector match_gamma ( const std::vector& x, ///< nodes at which the density has been evaluated const std::vector& fx ///< normalized density at the respective nodes ); ///< determine parameters of a gamma distribution that matches with the first and second moments of the sampled density std::vector match_beta ( const std::vector& x, ///< nodes at which the density has been evaluated const std::vector& fx ///< normalized density at the respective nodes ); ///< determine parameters of a beta distribution that matches the first and second moments of the sampled density /** Independent approximation to the posterior distribution */ class PsiIndependentPosterior { private: unsigned int nparams; std::vector fitted_posteriors; std::vector< std::vector > grids; std::vector< std::vector > margins; public: PsiIndependentPosterior ( unsigned int nprm, ///< number of parameters in the model std::vector posteriors, ///< determined best fitting distributions std::vector< std::vector > x, ///< grids for all parameters std::vector< std::vector > fx ///< densities for all parameters ); PsiIndependentPosterior ( const PsiIndependentPosterior& post ) : nparams ( post.nparams ), fitted_posteriors ( post.nparams ), grids ( post.grids ), margins ( post.margins ) { unsigned int i; for ( i=0; iclone(); } ~PsiIndependentPosterior ( void ) { unsigned int i; for ( i=0; iclone(); } ///< get the fitted posterior distribution for a single parameter std::vector get_grid ( unsigned int parameter ) { return grids[parameter]; } ///< get the grid points of a single parameter std::vector get_margin ( unsigned int parameter ) { return margins[parameter]; } ///< get the (marginal) density of a single parameter }; PsiIndependentPosterior independent_marginals ( const PsiPsychometric *pmf, ///< psychometric function model const PsiData *data ///< dataset ); ///< determine an approximation to the posterior distribution that approximates the posterior as a product of independent distributions for all parameters MCMCList sample_posterior ( const PsiPsychometric *pmf, ///< psychometric function model const PsiData *data, ///< dataset PsiIndependentPosterior& post, ///< posterior approximation unsigned int nsamples=600, ///< number of samples to be drawn unsigned int propose=25 ///< oversampling factor for the proposals ); ///< sample from the posterior using sampling importance resampling void sample_diagnostics ( const PsiPsychometric *pmf, ///< psychometric function model const PsiData *data, ///< dataset MCMCList *samples ///< parameter samples ); ///< calculate sample diagnostics #endif psignifit3-3.0~beta.20120611.1/src/linalg.cc000066400000000000000000000205331176542545200201010ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "linalg.h" #include "limits.h" double sign ( double x ) { return x/fabs(x); } double househ ( const std::vector *x, std::vector *u ) { unsigned int i; double h; h = 0; for ( i=0; isize(); i++ ) { h += (*x)[i]*(*x)[i]; (*u)[i] = (*x)[i]; } h = sqrt(h); if ( (*x)[0] == 0 ) (*u)[0] = h; else (*u)[0] = (*x)[0] + sign((*x)[0])*h; for ( i=u->size()-1; i *u, const Matrix *A, int j, int k, int l ) { unsigned int i, ii; std::vector uA ( A->getncols() - j, 0 ); for ( i=0; isize(); ii++ ) uA[i] += (*u)[ii] * (*A)(j+ii,j+i); return (*u)[k] * uA[l]; } Matrix::Matrix ( const std::vector< std::vector >& A ) : nrows(A.size()), ncols(A[0].size()) { data = new double [nrows*ncols]; unsigned int i,j; for (i=0; ioperator() (i,j) = A[i][j]; } } } Matrix::Matrix ( unsigned int nrows, unsigned int ncols) : nrows(nrows), ncols(ncols) { data = new double [nrows*ncols]; unsigned int i; for (i=0; ioperator() (i,j) = A(i,j); } } } double& Matrix::operator() ( unsigned int row, unsigned int col ) const { //row --; col --; if (row>=nrows || col>=ncols) { throw MatrixError(); } return data[row+nrows*col]; } void Matrix::print ( void ) { unsigned int i,j; std::cout << "[ "; for (i=0; ioperator() (K,K); for (k=0; k= K+1 for (j=K+1; joperator() (j,K); for (k=0; kpivot ) { pivot = fabs((*LU)(k,i)); pivotindex = k; } } // Check that the pivot element does not vanish if ( pivot<1e-8 ) { delete LU; throw std::string ( "Matrix is numerically singular" ); } // Swap pivot elements for (j=i; jprint(); int i, j, k, l; int m ( A->getnrows() ), n ( A->getncols() ); std::vector *u, *x; Matrix *uuAmat; double c; int min ( m-1>n ? n : m-1 ); for ( j=0; j ( m-j ); u = new std::vector ( m-j ); uuAmat = new Matrix ( m-j,n-j ); for ( i=j; i ATb (N); std::vector x (N); int i,j,k; // Compute AAT for (i=0; isolve(ATb); for (j=0; jqr_dec (); //QR->print(); for ( k=getncols()-1; ki; j-- ) { (*QR)(i,k+getncols()) -= (*QR)(i,j)*(*QR)(j,k+getncols()); } (*QR)(i,k+getncols()) /= (*QR)(i,i); (*inv)(i,k) = (*QR)(i,k+getncols()); } //std::cout << "QR(" << k << ") = "; //QR->print(); } delete A; delete QR; return inv; } std::vector Matrix::solve ( const std::vector& b ) { Matrix *LU = lu_dec(); std::vector x ( nrows ); std::vector y ( nrows ); y = forward ( LU, b); x = backward ( LU, y ); delete LU; return x; } std::vector Matrix::forward ( const Matrix *LU, const std::vector& b ) { unsigned int i,k; double s; std::vector y (nrows); for (i=0; i Matrix::backward ( const Matrix *LU, const std::vector& y ) { int i; unsigned int k; double s; std::vector x (nrows); for (i=nrows-1; i>=0; i--) { s = y[i]; for (k=i+1; k x ( nrows, 0); std::vector y ( nrows, 0); unsigned int i,j; for ( i=0; i Matrix::operator* ( std::vector& x ) { if (x.size() != ncols) throw MatrixError(); std::vector out ( nrows, 0 ); unsigned int i,j; for (i=0; i leastsq ( const Matrix *A, const std::vector& b ) { Matrix *M = new Matrix ( A->getnrows(), A->getncols()+1 ); unsigned int i, j; unsigned int nr (A->getnrows()),nc(A->getncols()); for ( i=0; i out ( leastsq ( M ) ); delete M; return out; } std::vector leastsq ( const Matrix *M ) { int i,j; unsigned int nr(M->getnrows()),nc(M->getncols()-1); Matrix *R = M->qr_dec(); std::vector x (nc); double s; for ( i=nc-1; i>=0; i-- ) { s = (*R)(i,nc); for ( j=i+1; j #include #include #include /*************************************************************************************** * This file defines very basic linear algebra facilities * * These are not particularly fast or fancy implementations. They are just intended * to keep the number of dependencies low. */ class MatrixError { }; /** A very simple matrix class */ class Matrix { private: double *data; unsigned int nrows; unsigned int ncols; // given a decomposition A=LU these two methods help solving the equation Ax=b: std::vector forward ( const Matrix* LU, const std::vector& b ); // forward solution of Ly=b std::vector backward ( const Matrix*LU, const std::vector& y ); // backward solution of Ux=y public: Matrix ( const std::vector< std::vector >& A ); ///< Construct a matrix from a vector of vectors Matrix ( unsigned int nrows, unsigned int ncols); ///< Construct a matrix with given dimensions initialized to 0 Matrix ( const Matrix& A ); ///< copy a matrix ~Matrix ( void ) { delete [] data; } ///< delete a matrix double& operator() ( unsigned int i, unsigned int j ) const; ///< data access to the element in row i and column j (indices starting with 0!) void print ( void ); ///< print the matrix to stdout unsigned int getnrows ( void ) const { return nrows; } ///< get the number of rows unsigned int getncols ( void ) const { return ncols; } ///< get the number of columns Matrix* cholesky_dec ( void ) const; ///< return a pointer to a newly allocated Matrix L, such that L*L^T = A Matrix* lu_dec ( void ) const; ///< return a pointer to a newly allocated Matrix LU. If you construct a matrix L from the elements of LU below the diagnonal and L_ii = 1, and a matrix U from the elements above the diagnonal, then A=LU Matrix * qr_dec ( void ) const; ///< QR-decomposition of a matrix, where Q is orthogonal and R is upper right triangular Matrix * inverse_qr ( void ) const; ///< Matrix inversion based on QR decomposition (more stable but slower) Matrix * regularized_inverse ( double alpha ) const; ///< Matrix inversion with Tichonov regularization (regularization factor alpha) std::vector solve ( const std::vector& b ); ///< solve a linear equation Ax=b for x Matrix* inverse ( void ); ///< return a pointer to the (newly allocated) inverse Matrix std::vector operator* ( std::vector& x ); ///< right multiplication with a vector void scale ( double a ); ///< scale the whole matrix by a constant factor bool symmetric ( void ); ///< check whether the matrix is symmetric }; std::vector leastsq ( const Matrix *A, const std::vector& b ); ///< return the least squares solution to the problem Ax=b std::vector leastsq ( const Matrix *M ); ///< return the least squares solution of the problem Ax=b, where M = [A,b] #endif psignifit3-3.0~beta.20120611.1/src/mclist.cc000066400000000000000000000221641176542545200201300ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "mclist.h" void newsample ( const PsiData * data, const std::vector& p, std::vector * sample ) { /* Draw a new sample from the psychometric function */ BinomialRandom binomial ( 10, 0.5 ); // Initialize with nonsense parameters unsigned int k; // Block index for ( k=0; kgetNblocks(); k++ ) { binomial.setprm ( data->getNtrials(k), p[k] ); (*sample)[k] = binomial.draw (); } } /************************************************************ * PsiMClist methods */ std::vector PsiMClist::getEst ( unsigned int i ) const { // Check that the call does not ask for something we don't have if ( i>=getNsamples() ) throw BadIndexError(); unsigned int k; std::vector out ( getNparams() ); for (k=0; k=getNsamples() ) throw BadIndexError(); if ( prm>=getNparams() ) throw BadIndexError(); return mcestimates[prm][i]; } void PsiMClist::setEst ( unsigned int i, const std::vector est, double deviance ) { // Check that the call does not ask for something we can't do if ( i>=getNsamples() ) throw BadIndexError(); unsigned int k; for ( k=0; k=getNparams() ) throw BadIndexError(); if ( p>1 || p<0 ) throw BadArgumentError(); int position; sort( mcestimates[prm].begin(),mcestimates[prm].end() ); position = getNsamples()*p; return mcestimates[prm][position]; } void PsiMClist::setdeviance ( unsigned int i, double deviance ) { if ( i>=getNsamples() ) throw BadIndexError(); deviances[i] = deviance; } double PsiMClist::getdeviance ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return deviances[i]; } double PsiMClist::getDeviancePercentile ( double p ) { if ( p<=0 || p>= 1 ) throw BadArgumentError(); int ind ( p*deviances.size() ); sort( deviances.begin(), deviances.end() ); return deviances[ind]; } double PsiMClist::getMean ( unsigned int prm ) const { double m(0); unsigned int i,Nsamples(getNsamples()); if ( prm>=getNparams() ) throw BadIndexError(); for (i=0; i=getNparams() ) throw BadIndexError(); for (i=0; i& newdata ) { if ( i>=getNsamples() || i<0 ) throw BadIndexError(); unsigned int k; for ( k=0; k BootstrapList::getData ( unsigned int i ) const { if ( i>=getNsamples() || i<0 ) throw BadIndexError(); return data[i]; } double BootstrapList::getThres ( double p, unsigned int cut ) { if ( cut>=cuts.size() ) throw BadIndexError(); if ( p>1 || p<0 ) throw BadArgumentError(); int position; sort( thresholds[cut].begin(), thresholds[cut].end() ); // Bias correction of p if (BCa) p = Phi(bias_t[cut] + (invPhi(p) + bias_t[cut])/(1-acceleration_t[cut]*(invPhi(p) + bias_t[cut]))); position = int(getNsamples()*p); return thresholds[cut][position]; } double BootstrapList::getThres_byPos ( unsigned int i, unsigned int cut ) { if ( cut>=cuts.size() ) throw BadIndexError(); if (i>getNsamples()) throw BadIndexError(); return thresholds[cut][i]; } void BootstrapList::setThres ( double thres, unsigned int i, unsigned int cut ) { if ( i>=getNsamples() ) throw BadIndexError(); if (cut>=cuts.size() ) throw BadIndexError(); thresholds[cut][i] = thres; } double BootstrapList::getSlope ( double p, unsigned int cut ) { if ( cut>=cuts.size() ) throw BadIndexError(); if ( p>1 || p<0 ) throw BadArgumentError(); int position; sort( slopes[cut].begin(), slopes[cut].end() ); // Bias correction of p if (BCa) p = Phi(bias_s[cut] + (invPhi(p) + bias_s[cut])/(1-acceleration_s[cut]*(invPhi(p) + bias_s[cut]))); position = int(getNsamples()*p); return slopes[cut][position]; } double BootstrapList::getSlope_byPos ( unsigned int i, unsigned int cut ) { if ( cut>=cuts.size() ) throw BadIndexError(); if (i>getNsamples()) throw BadIndexError(); return slopes[cut][i]; } void BootstrapList::setSlope ( double slope, unsigned int i, unsigned int cut ) { if ( i>=getNsamples() ) throw BadIndexError(); if (cut>=cuts.size() ) throw BadIndexError(); slopes[cut][i] = slope; } double BootstrapList::getCut ( unsigned int i ) const { if ( i>=cuts.size() || i<0 ) throw BadIndexError(); return cuts[i]; } void BootstrapList::setRpd ( unsigned int i, double r_pd ) { if ( i>=getNsamples() ) throw BadIndexError(); Rpd[i] = r_pd; } double BootstrapList::getRpd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return Rpd[i]; } double BootstrapList::percRpd ( double p ) { if ( p<0 || p>1 ) throw BadArgumentError(); int index ( p*(getNsamples()-1)); sort ( Rpd.begin(), Rpd.end() ); return Rpd[index]; } void BootstrapList::setRkd ( unsigned int i, double r_kd ) { if ( i>=getNsamples() ) throw BadIndexError(); Rkd[i] = r_kd; } double BootstrapList::getRkd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return Rkd[i]; } double BootstrapList::percRkd ( double p ) { if ( p<0 || p>1 ) throw BadIndexError(); int index ( p*(getNsamples()-1) ); sort ( Rkd.begin(), Rkd.end() ); return Rkd[index]; } /************************************************************ * JackKnifeList methods */ double JackKnifeList::influential ( unsigned int block, const std::vector& ci_lower, const std::vector& ci_upper ) const { unsigned int prm; double est; double infl(0),x; for ( prm=0; prminfl ) infl = x; } return infl; } bool JackKnifeList::outlier ( unsigned int block ) const { if ( block>=getNblocks() ) throw BadIndexError(); if ( maxdeviance-getdeviance(block) > 6.63 ) return true; return false; } /************************************************************ * MCMCList methods */ void MCMCList::setppData ( unsigned int i, const std::vector& ppdata, double ppdeviance ) { if ( i>=getNsamples() || i<0 ) throw BadIndexError (); unsigned int k; for ( k=0; k MCMCList::getppData ( unsigned int i ) const { if ( i>=getNsamples() || i<0 ) throw BadIndexError(); return posterior_predictive_data[i]; } int MCMCList::getppData ( unsigned int i, unsigned int j ) const { if ( i>=getNsamples() ) throw BadIndexError(); if ( j>=getNblocks() ) throw BadIndexError(); return posterior_predictive_data[i][j]; } double MCMCList::getppDeviance ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return posterior_predictive_deviances[i]; } void MCMCList::setppRpd ( unsigned int i, double Rpd ) { if ( i>=getNsamples() ) throw BadIndexError(); posterior_predictive_Rpd[i] = Rpd; } double MCMCList::getppRpd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return posterior_predictive_Rpd[i]; } void MCMCList::setppRkd ( unsigned int i, double Rkd ) { if ( i>=getNsamples() ) throw BadIndexError(); posterior_predictive_Rkd[i] = Rkd; } double MCMCList::getppRkd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return posterior_predictive_Rkd[i]; } void MCMCList::setRpd ( unsigned int i, double Rpd ) { if ( i>=getNsamples() ) throw BadIndexError(); posterior_Rpd[i] = Rpd; } double MCMCList::getRpd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return posterior_Rpd[i]; } void MCMCList::setRkd ( unsigned int i, double Rkd ) { if ( i>=getNsamples() ) throw BadIndexError(); posterior_Rkd[i] = Rkd; } double MCMCList::getRkd ( unsigned int i ) const { if ( i>=getNsamples() ) throw BadIndexError(); return posterior_Rkd[i]; } void MCMCList::setlogratio ( unsigned int i, unsigned int j, double logratio ) { if ( i>=getNsamples() ) throw BadIndexError(); if ( j>=getNblocks() ) throw BadIndexError(); logratios[i][j] = logratio; } double MCMCList::getlogratio ( unsigned int i, unsigned int j ) const { if ( i>=getNsamples() ) throw BadIndexError(); if ( j>=getNblocks() ) throw BadIndexError(); return logratios[i][j]; } psignifit3-3.0~beta.20120611.1/src/mclist.h000066400000000000000000000357301176542545200177750ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef MCLIST_H #define MCLIST_H #include #include #include #include #include "errors.h" #include "special.h" #include "data.h" #include "rng.h" /** \brief basic monte carlo samples list * * This list stores monte carlo samples and deviances, nothing else. */ class PsiMClist { private: std::vector< std::vector > mcestimates; std::vector deviances; public: PsiMClist ( int N, ///< number of samples to be drawn int nprm ///< number of parameters in the model that is analyzed ) : mcestimates(nprm, std::vector(N) ), deviances(N) {} ///< Initialize the list to take N samples of nprm parameters PsiMClist ( const PsiMClist& mclist ) : mcestimates ( mclist.mcestimates ), deviances ( mclist.deviances ) {} ///< copy a list of mcsamples ~PsiMClist ( ) {} ///< destructor std::vector getEst ( unsigned int i ) const; ///< get a single parameter estimate at sample i double getEst ( unsigned int i, ///< sample index unsigned int prm ///< parameter index ) const; ///< get a single sample of a single parameter void setEst ( unsigned int i, ///< index of the sample to be set const std::vector est, ///< parameter vector to be set at index double deviance ///< deviance associated with the sample ); ///< set a sample of parameters virtual void setdeviance ( unsigned int i, double deviance ); ///< set the deviance separately for sample i virtual double getPercentile ( double p, ///< desired percentile (in the range (0,1)) unsigned int prm ///< index of the paramter of interest ); ///< get a percentile for parameter prm virtual double getMean ( unsigned int prm ///< index of the parameter of interest ) const ; ///< get the average of parameter prm virtual double getStd ( unsigned int prm ///< index of the parameter of interest ) const ; ///< get the standard deviantion of parameter prm double getdeviance ( unsigned int i ) const; ///< get the deviance of sample i unsigned int getNsamples ( void ) const { return mcestimates[0].size(); } ///< get the total number of samples unsigned int getNparams ( void ) const { return mcestimates.size(); } ///< get the number of parameters double getDeviancePercentile ( double p ); ///< get the p-percentile of the deviance (p in the range (0,1) ) }; /** \brief list of bootstrap samples * * Bootstrap samples support some special operations that regular monte carlo samples don't. In particular bootstrap * samples from a psychometric function should incorporate information about * * -# The thresholds that are associated with each parameter vector * -# the bootstrap samples themselves and not only the resulting parameter estimates * -# correlations of the psychometric function with the bootstrap samples "sequence" */ class BootstrapList : public PsiMClist { private: bool BCa; std::vector acceleration_t; std::vector bias_t; std::vector acceleration_s; std::vector bias_s; std::vector< std::vector > data; std::vector cuts; std::vector< std::vector > thresholds; std::vector< std::vector > slopes; std::vector Rpd; std::vector Rkd; public: BootstrapList ( unsigned int N, ///< number of samples to be drawn unsigned int nprm, ///< number of parameters in the model unsigned int nblocks, ///< number of blocks in the experiment std::vector Cuts ///< performance levels at which thresholds should be determined ) : PsiMClist (N,nprm), BCa(false), acceleration_t(Cuts.size()), bias_t(Cuts.size()), acceleration_s(Cuts.size()), bias_s(Cuts.size()), data(N,std::vector(nblocks)), cuts(Cuts), thresholds (Cuts.size(), std::vector (N)), slopes (Cuts.size(), std::vector (N)), Rpd(N), Rkd(N) { } ///< set up the list // TODO: should setBCa be private and friend of parametric bootstrap? void setBCa_t ( unsigned int i, ///< index of the cut for which Bias and Acceleration should be set double Bias, ///< Bias to be set double Acceleration ///< Acceleration to be set ) { BCa=true; bias_t[i] = Bias; acceleration_t[i] = Acceleration; } ///< set bias and acceleration to get BCa confidence intervals void setBCa_s ( unsigned int i, ///< index of the cut for which Bias and Acceleration should be set double Bias, ///< Bias to be set double Acceleration ///< Acceleration to be set ) { BCa=true; bias_s[i] = Bias; acceleration_s[i] = Acceleration; } ///< set bias and acceleration to get BCa confidence intervals void setData ( unsigned int i, ///< index of the bootstrap sample to be set const std::vector& newdata ///< response counts in the new bootstrap sample (not proportion correct) ); ///< store a simulated data set std::vector getData ( unsigned int i ) const; ///< get a simulated data set at posititon i double getThres ( double p, unsigned int cut ); ///< get the p-th percentile associated with the threshold at cut double getThres_byPos ( unsigned int i, unsigned int cut ); ///< get the threshold for the i-th sample void setThres ( double thres, ///< new value of the threshold unsigned int i, ///< index of the bootstrap sample unsigned int cut ///< index of the desired cut ); ///< set the value of a threshold associated with the threshold at cut double getSlope ( double p, unsigned int cut ); ///< get the p-th percentile associated with the slope at the given cut double getSlope_byPos ( unsigned int i, unsigned int cut ); ///< get the slope at cut for the i-th sample void setSlope ( double sl, ///< new value of the slope unsigned int i, ///< index of the bootstrap sample unsigned int cut ///< index of the desired cut ); ///< set the value of the slope associated with the threshold at cut unsigned int getNblocks ( void ) const { return data[0].size(); } ///< get the number of blocks in the underlying dataset double getCut ( unsigned int i ) const; ///< get the value of cut i double getAcc_t ( unsigned int i ) const { return acceleration_t[i]; } ///< get the acceleration constant for cut i double getBias_t ( unsigned int i ) const { return bias_t[i]; } ///< get the bias for cut i double getAcc_s ( unsigned int i ) const { return acceleration_s[i]; } ///< get the acceleration constant for cut i double getBias_s ( unsigned int i ) const { return bias_s[i]; } ///< get the bias for cut i // TODO: should setRpd be private and friend of parametricbootstrap? void setRpd ( unsigned int i, ///< index of the bootstrap sample double r_pd ///< new correlation );///< set correlation between predicted values and deviance residuals for a simulated dataset double getRpd ( unsigned int i ) const; ///< get correlation between predicted values and deviance residuals for simulated dataset i double percRpd ( double p ); ///< get the p-th percentile of the correlations between predicted values and deviance residuals // TODO: should setRkd be private and friend of parametric bootstrap? void setRkd ( unsigned int i, double r_kd ); ///< set correlation between block index and deviance residuals for a simulated dataset double getRkd ( unsigned int i ) const; ///< get correlation between block index and deviance residuals for simulated dataset i double percRkd ( double p ); ///< get the p-th percentile of the correlations between block index and deviance residuals }; /** \brief list of JackKnife data * * JackKnifeing is not suggested for the assessment of confidence intervals or variability. Instead the close link between jackknife samples * and individual data points is useful to determine influential data points and outliers. */ class JackKnifeList : public PsiMClist { private: double maxdeviance; std::vector mlestimate; public: JackKnifeList ( unsigned int nblocks, ///< number of blocks in the experiment unsigned int nprm, ///< number of parameters in the model double maxldev, ///< deviance of the maximum likelihood estimate on the full dataset std::vector maxlest ///< maximum likelihood estimate of the full dataset ) : PsiMClist ( nblocks, nprm ), maxdeviance(maxldev), mlestimate(maxlest) {} ///< constructor unsigned int getNblocks ( void ) const { return getNsamples(); } ///< get the number of blocks in the current experiment /** determination of influential observations is performed by checking whether a parameter changes significantly (as defined by * the confidence intervals) if one observation is omitted. Thus, if leaving out one observation results in significant changes * in the estimated parameters, this observation is considered "influential". * * \param block index of the block to be checked * \param estimate point estimate of the parameters in the model * \param ci_lower lower confidence limits for each parameter in the model * \param ci_upper upper confidence limits for each parameter in the model * * \return a number indicating the influence of the block. Values > 1 correspond to point estimates for that block that are precisely on the CI limits */ double influential ( unsigned int block, const std::vector& ci_lower, const std::vector& ci_upper ) const; /** determination of outliers is based on the following idea: We add a new parameter that fits the data in block perfectly. * If this "modified" model is significantly better than the original model, then this block is considered an outlier. * * \param block index of the block to be checked * * \return true if block presents an outlier */ bool outlier ( unsigned int block ) const ; ///< is block an outlier? }; /** \brief a list of Bayesian MCMC samples * * This list stores additional data that are important for bayesian analysis.: * 1. For each parameter sample, a sample from the respective psychometric function is stored. These samples * can be considered samples from the posterior predictive distribution * 2. For each sample from the posterior predictive distribution, the deviance is stored * 3. the list allows to obtain the estimated bayesian p-value */ class MCMCList : public PsiMClist { private: std::vector posterior_Rpd; std::vector posterior_Rkd; std::vector< std::vector > posterior_predictive_data; std::vector posterior_predictive_deviances; std::vector posterior_predictive_Rpd; std::vector posterior_predictive_Rkd; std::vector< std::vector > logratios; // log ratios of the unnormalized posteriors for the full model and the models with one block omitted double accept_rate; double H; public: MCMCList ( unsigned int N, ///< number of samples to be drawn unsigned int nprm, ///< number of parameters in the model unsigned int nblocks ///< number of blocks in the experiment ) : PsiMClist ( N, nprm), posterior_Rpd(N), posterior_Rkd(N), posterior_predictive_data(N,std::vector(nblocks)), posterior_predictive_deviances ( N ), posterior_predictive_Rpd ( N ), posterior_predictive_Rkd ( N ), logratios ( N, std::vector(nblocks ) ) {}; ///< set up MCMCList void setppData ( unsigned int i, ///< index of the posterior predictive sample to be set const std::vector& ppdata, ///< posterior predictive data sample double ppdeviance ///< deviance associated with the posterior predictive sample ); ///< store a posterior predictive data set std::vector getppData ( unsigned int i ) const; ///< get a posterior predictive data sample int getppData ( unsigned int i, unsigned int j ) const; double getppDeviance ( unsigned int i ) const; ///< get deviance associated with a posterior predictive sample void setppRpd ( unsigned int i, double Rpd ); double getppRpd ( unsigned int i ) const; void setppRkd ( unsigned int i, double Rkd ); double getppRkd ( unsigned int i ) const; void setRpd ( unsigned int i, double Rpd ); double getRpd ( unsigned int i ) const; void setRkd ( unsigned int i, double Rkd ); double getRkd ( unsigned int i ) const; unsigned int getNblocks ( void ) const { return posterior_predictive_data[0].size(); } ///< get the number of blocks void setlogratio ( unsigned int i, unsigned int j, double logratio ); ///< set the log posterior ratio for sample i and block j double getlogratio ( unsigned int i, unsigned int j ) const; ///< get the log posterior ratio for sample i and block j void set_accept_rate(double rate) {accept_rate = rate; } ///< set the acceptance rate double get_accept_rate(void) const {return accept_rate; } ///< get the acceptance rate void set_entropy ( double entropy ) { H = entropy; } ///< set the entropy if needed double get_entropy ( void ) const { return H; } }; void newsample ( const PsiData * data, const std::vector& p, std::vector * sample ); #endif psignifit3-3.0~beta.20120611.1/src/mcmc.cc000066400000000000000000000342221176542545200175520ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "mcmc.h" // #define DEBUG_MCMC #include #include /********************************************************************** * * MetropolisHastings sampling * */ MetropolisHastings::MetropolisHastings ( const PsiPsychometric * pmf, const PsiData * dat, PsiRandom * proposal ) : PsiSampler ( pmf, dat ), propose(proposal->clone()), currenttheta(pmf->getNparams(),0), newtheta(pmf->getNparams(),0), stepwidths(pmf->getNparams(),.1), accept(0), qold(-1e5) { #ifdef DEBUG_MCMC std::cerr << "Hi my name is MetropolisHastings\n"; #endif setTheta ( currenttheta ); currentdeviance = (pmf->deviance(currenttheta,dat)); } std::vector MetropolisHastings::draw ( void ) { double qnew, acc(propose->rngcall()); const PsiPsychometric * model (getModel()); const PsiData * data (getData()); // propose a new point proposePoint(currenttheta, stepwidths, propose, newtheta); // negative log posterior of the point qnew = acceptance_probability ( currenttheta, newtheta ); // std::cerr << qnew-qold << " " << exp(qnew-qold) << "\n"; if (accdeviance ( currenttheta, data ); accept ++; #ifdef DEBUG_MCMC std::cerr << " ACCEPTED "; #endif } #ifdef DEBUG_MCMC else std::cerr << " REJECTED "; std::cout << "\n"; #endif return currenttheta; } double MetropolisHastings::acceptance_probability ( const std::vector& current_theta, const std::vector& new_theta ) { double qnew; qnew = -getModel()->neglpost ( new_theta, getData() ); #ifdef DEBUG_MCMC std::cerr << "Q_old: " << std::setiosflags ( std::ios::fixed ) << qold << " Q_new: " << std::setiosflags ( std::ios::fixed ) << qnew << " P(accept):" << std::setiosflags ( std::ios::fixed ) << (lratio>1 ? 1 : lratio) << "\n"; int i, Nparams(getModel()->getNparams()); std::cerr << "Current Theta:\t\t"; for(i=0; i ¤t_theta, std::vector &step_widths, PsiRandom * proposal, std::vector &new_theta){ const PsiPsychometric * model( getModel() ); int prm, Nprm(model->getNparams()); for (prm=0; prmdraw ( ); } } void MetropolisHastings::setTheta ( const std::vector& prm ) { if (prm.size()==currenttheta.size()) currenttheta = prm; else throw BadArgumentError(); qold = getModel()->neglpost( currenttheta, getData() ); } void MetropolisHastings::setStepSize ( double size, unsigned int param ) { if ( paramgetNparams() ) stepwidths[param] = size; else throw BadIndexError(); } void MetropolisHastings::setStepSize ( const std::vector& sizes ) { unsigned int i; for (i=0; igetNparams(), data->getNblocks() ); PsiData *localdata = new PsiData ( data->getIntensities(), data->getNtrials(), data->getNcorrect(), data->getNalternatives() ); std::vector< PsiData* > reduceddata (data->getNblocks() ); std::vector posterior_predictive ( data->getNblocks() ); std::vector probs ( data->getNblocks() ); std::vector est ( model->getNparams() ); unsigned int i,j,k,l; std::vector reducedx ( data->getNblocks()-1 ); std::vector reducedk ( data->getNblocks()-1 ); std::vector reducedn ( data->getNblocks()-1 ); for ( k=0; kgetNblocks(); k++ ) { j = 0; for ( l=0; lgetNblocks(); l++ ) { if ( l!=k ) { reducedx[j] = data->getIntensity(l); reducedk[j] = data->getNcorrect(l); reducedn[j] = data->getNtrials(l); j++; } } reduceddata[k] = new PsiData ( reducedx, reducedn, reducedk, data->getNalternatives() ); } qold = acceptance_probability ( currenttheta, currenttheta ); for (i=0; igetNblocks(); k++ ) probs[k] = model->evaluate ( data->getIntensity(k), est ); newsample ( localdata, probs, &posterior_predictive); localdata->setNcorrect ( posterior_predictive ); out.setppData ( i, posterior_predictive, model->deviance ( est, localdata ) ); probs = model->getDevianceResiduals ( est, data ); out.setRpd ( i, model->getRpd ( probs, est, data ) ); out.setRkd ( i, model->getRkd ( probs, data ) ); probs = model->getDevianceResiduals ( est, localdata ); out.setppRpd ( i, model->getRpd ( probs, est, localdata ) ); out.setppRkd ( i, model->getRkd ( probs, localdata ) ); // Store log posterior ratios for reduced data sets for ( k=0; kgetNblocks(); k++) { /* j=0; for ( l=0; lgetNblocks(); l++ ) { if ( l!=k ) { reducedx[j] = data->getIntensity(l); reducedk[j] = data->getNcorrect(l); reducedn[j] = data->getNtrials(l); j++; } } reduceddata = new PsiData ( reducedx, reducedn, reducedk, data->getNalternatives() ); */ out.setlogratio ( i, k, model->neglpost(est,data)-model->neglpost(est,reduceddata[k]) ); } #ifdef DEBUG_MCMC std::cerr << " accept: " << std::setiosflags ( std::ios::fixed ) << double(accept)/(i+1) << "\n"; #endif } #ifdef DEBUG_MCMC std::cerr << "Acceptance rate: " << double(accept)/N << "\n"; #endif out.set_accept_rate(double(accept)/N); delete localdata; for ( k=0; k ¤t_theta, std::vector &step_widths, PsiRandom * proposal, std::vector &new_theta) { const PsiPsychometric * model ( getModel() ); /* update one direction of theta */ new_theta = current_theta; new_theta[currentindex] += step_widths[currentindex] * proposal->draw(); /* iterate parameter index each time a new point is proposed */ currentindex = (currentindex + 1) % model->getNparams(); } void GenericMetropolis::findOptimalStepwidth( PsiMClist const &pilot ){ if ( pilot.getNsamples() < pilot.getNparams() +1 ){ throw BadArgumentError("The number of samples in the pilot must be at least equal to the number of free parameters."); } int i,j,prm, Nparams(pilot.getNparams()), Nsamples(pilot.getNsamples()); double std_residuals; // standard deviation of the residuals int *paramindex = new int[Nparams-1]; Matrix X = Matrix(Nsamples, Nparams+1); // extended data matrix for (prm=0; prmgetNparams () ) { #ifdef DEBUG_MCMC std::cerr << "Hi my name is DefaultMCMC\n"; #endif } DefaultMCMC::~DefaultMCMC ( void ) { unsigned int i; for (i=0; i& current_theta, const std::vector& new_theta ) { double qnew; unsigned int i; qnew = - getModel()->neglpost ( new_theta, getData() ); for (i=0; igetNparams(); i++) { qnew -= log ( proposaldistributions[i]->pdf ( new_theta[i] ) ); } /* std::cerr << "qnew = " << qnew << "\n" << "Points: " << std::setiosflags(std::ios::fixed) << new_theta[0] << " " << new_theta[1] << " " << new_theta[2] << "\n" << "Q*: " << std::setiosflags(std::ios::fixed) << log ( proposaldistributions[0]->pdf ( new_theta[0] ) ) << " " << log ( proposaldistributions[1]->pdf ( new_theta[1] ) ) << " " << log ( proposaldistributions[2]->pdf ( new_theta[2] ) ) // << " " << log ( proposaldistributions[3]->pdf ( new_theta[3] ) ) << "\n" << "P*: " << -getModel()->neglpost ( new_theta, getData () ) << "\n" << "qnew = " << qnew << "\n" << "qold = " << qold << "\n" << "qnew-qold = " << qnew - qold << " P(acceptance) = " << exp(qnew-qold) << "\n"; */ #ifdef DEBUG_MCMC std::cerr << "p(accept) = " << exp(qnew-qold) << "\n"; #endif return qnew; } void DefaultMCMC::proposePoint ( std::vector ¤t_theta, std::vector &stepwidths, PsiRandom * proposal, std::vector &new_theta ) { unsigned int i; for ( i=0; irand (); #ifdef DEBUG_MCMC std::cerr << new_theta[i] << "\t"; #endif } #ifdef DEBUG_MCMC std::cerr << "\n"; #endif } /********************************************************************** * * Hybird MCMC * */ HybridMCMC::HybridMCMC ( const PsiPsychometric* Model, const PsiData* Data, int Nleap ) : PsiSampler ( Model, Data ), currenttheta ( Model->getStart( Data ) ), newtheta ( Model->getNparams(), 0 ), momentum ( Model->getNparams(), 0 ), gradient ( Model->getNparams(), 0 ), currentgradient ( Model->getNparams(), 0 ), stepsizes ( Model->getNparams(), .001), Nleapfrog(Nleap), Naccepted (0) { proposal = new GaussRandom; setTheta ( currenttheta ); stepsizes[0] = 0.001; stepsizes[1] = 0.001; stepsizes[2] = 0.0001; } std::vector HybridMCMC::draw ( void ) { unsigned int i; const PsiPsychometric * model ( getModel() ); const PsiData * data ( getData() ); for (i=0; igetNparams(); i++) momentum[i] = proposal->draw(); currentH = 0; for (i=0; igetNparams(); i++) currentH += momentum[i] * momentum[i]; currentH *= 0.5; currentH += energy; leapfrog(); newenergy = model->neglpost ( newtheta, data ); newH = 0; for (i=0; igetNparams(); i++) newH += momentum[i] * momentum[i]; newH *= 0.5; newH += newenergy; if ( log(proposal->rngcall()) < currentH-newH ) { // Accept for (i=0; igetNparams(); i++) { currenttheta[i] = newtheta[i]; currentgradient[i] = gradient[i]; } energy = newenergy; Naccepted ++; #ifdef DEBUG_MCMC std::cerr << " * "; #endif } #ifdef DEBUG_MCMC else std::cerr << " "; std::cout << currenttheta[0] << "\n"; #endif return currenttheta; } void HybridMCMC::setTheta ( const std::vector& theta ) { unsigned int i; currenttheta = theta; for (i=0; igetNparams(); i++) { gradient[i] = getModel()->dlposteri ( currenttheta, getData(), i ); } energy = getModel()->neglpost ( currenttheta, getData() ); } void HybridMCMC::setStepSize ( const std::vector& sizes ) { if (sizes.size()==stepsizes.size()) stepsizes = sizes; else throw BadArgumentError(); } void HybridMCMC::setStepSize ( double size, unsigned int param ) { if ( param>=stepsizes.size() ) throw BadIndexError(); stepsizes[param] = size; } void HybridMCMC::leapfrog ( void ) { int i,n; int Nparams(getModel()->getNparams()); const PsiPsychometric * model (getModel()); gradient = currentgradient; newtheta = currenttheta; for (n=0; ndlposteri ( newtheta, getData(), i ); for (i=0; ideviance ( currenttheta, getData() ); } MCMCList HybridMCMC::sample ( unsigned int N ) { MCMCList out ( N, getModel()->getNparams(), getData()->getNblocks() ); unsigned int i; for (i=0; i prm ( pmf->getNparams() ); double E(0); unsigned int i,k,n(50000); for ( i=0; igetNparams(); k++ ) prm[k] = pmf->randPrior ( k ); E += exp ( - pmf->negllikeli ( prm, data ) ); } E /= n; return E; } std::vector OutlierDetection ( const PsiPsychometric* pmf, OutlierModel* outl, const PsiData* data ) { unsigned int i; std::vector out ( data->getNblocks() ); double E ( ModelEvidence ( pmf, data ) ); for ( i=0; igetNblocks(); i++ ) { outl->setexclude ( i ); out[i] = E/ModelEvidence ( outl, data ); } return out; } psignifit3-3.0~beta.20120611.1/src/mcmc.h000066400000000000000000000251721176542545200174200ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef MCMC_H #define MCMC_H #include #include "psychometric.h" #include "rng.h" #include "mclist.h" #include "getstart.h" class PsiSampler { private: const PsiPsychometric * model; const PsiData * data; public: PsiSampler ( const PsiPsychometric * Model, const PsiData * Data ) : model(Model), data(Data) {}///< set up a sampler to sample from the posterior of the parameters of pmf given the data dat virtual std::vector draw ( void ) { throw NotImplementedError(); } ///< draw a sample from the posterior virtual void setTheta ( const std::vector theta ) { throw NotImplementedError(); } ///< set the "state" of the underlying markov chain virtual std::vector getTheta ( void ) { throw NotImplementedError(); } ///< get the "state" of the underlying markov chain virtual void setStepSize ( double size, unsigned int param ) { throw NotImplementedError(); } ///< set the size of the steps for parameter param of the sampler virtual void setStepSize ( const std::vector& sizes ) { throw NotImplementedError(); } ///< set all stepsizes of the sampler virtual double getDeviance ( void ) { throw NotImplementedError(); } ///< return the model deviance for the current state virtual MCMCList sample ( unsigned int N ) { throw NotImplementedError(); } ///< draw N samples from the posterior const PsiPsychometric * getModel() const { return model; } ///< return the underlying model instance const PsiData * getData() const { return data; } ///< return the underlying data instance }; class MetropolisHastings : public PsiSampler { private: PsiRandom* propose; std::vector currenttheta; std::vector newtheta; std::vector stepwidths; double currentdeviance; int accept; protected: double qold; public: MetropolisHastings ( const PsiPsychometric * Model, ///< psychometric funciton model to sample from const PsiData * Data, ///< data to base inference on PsiRandom* proposal ///< proposal distribution (will usually be a gaussian) ); ///< initialize the sampler ~MetropolisHastings ( void ) { delete propose; } std::vector draw ( void ); ///< perform a metropolis hastings step and draw a sample from the posterior virtual double acceptance_probability ( const std::vector& current_theta, const std::vector& new_theta ); void setTheta ( const std::vector& prm ); ///< set the current state of the sampler std::vector getTheta ( void ) { return currenttheta; } ///< get the current state of the sampler double getDeviance ( void ) { return currentdeviance; } ///< get the current deviance void setStepSize ( double size, unsigned int param ); ///< set the standard deviation of the proposal distribution for parameter param void setStepSize ( const std::vector& sizes ); ///< set standard deviations of the proposal distribution for all parameters at once std::vector getStepsize ( void ) { return stepwidths; } ///< return the current stepwidth (standard deviations of the proposal distribution) MCMCList sample ( unsigned int N ); ///< draw N samples from the posterior unsigned int getNparams ( void ) { return newtheta.size(); } ///< get the number of parameters for which the sampler is set up virtual void proposePoint( std::vector ¤t_theta, std::vector &step_widths, PsiRandom * proposal, std::vector &new_theta); ///< propose a new sample and save it in new_theta }; class GenericMetropolis : public MetropolisHastings { private: int currentindex; ///< parameter index for proposing a new sample public: GenericMetropolis ( const PsiPsychometric * Model, ///< psychometric funciton model to sample from const PsiData * Data, ///< data to base inference on PsiRandom* proposal ///< proposal distribution (will usually be a gaussian) ): MetropolisHastings ( Model, Data, proposal ), currentindex(0) {} void proposePoint( std::vector ¤t_theta, std::vector &step_widths, PsiRandom * proposal, std::vector &new_theta); ///< propose a new sample and save it in new_theta /** \brief Find the optimal stepwidth by regressing each parameter against the others. * * For each parameter, do a regression using QR-decomposition and * take the residuals to calculate the optimal stepwidth. * * @param pilot a pilot sample to base the regression on */ void findOptimalStepwidth ( PsiMClist const &pilot ); }; class DefaultMCMC : public MetropolisHastings { private: std::vector proposaldistributions; public: DefaultMCMC ( const PsiPsychometric * Model, ///< psychometric function model to sample from const PsiData * Data, ///< data to base inference on PsiRandom* proposal ///< IGNORED ); ~DefaultMCMC ( void ); double acceptance_probability ( const std::vector ¤t_theta, const std::vector &new_theta ); void proposePoint ( std::vector ¤t_theta, std::vector &stepwidths, PsiRandom * proposal, std::vector &new_theta); ///< propose a new sample and save it in new_theta void set_proposal(unsigned int i, PsiPrior* proposal){ delete proposaldistributions.at(i); proposaldistributions.at(i) = proposal->clone(); } }; class HybridMCMC : public PsiSampler { private: PsiRandom* proposal; std::vector currenttheta; std::vector newtheta; std::vector momentum; double currentH; double newH; double energy; double newenergy; std::vector gradient; std::vector currentgradient; std::vector stepsizes; int Nleapfrog; int Naccepted; void leapfrog ( void ); public: HybridMCMC ( const PsiPsychometric * Model, ///< psychometric function model to sample from const PsiData * Data, ///< data to base inference on int Nleap ///< number of leapfrog steps to be performed for each sample ); ///< initialize the sampler ~HybridMCMC ( void ) { delete proposal; } std::vector draw ( void ); ///< draw a sample from the posterior void setTheta ( const std::vector& prm ); ///< set the current state of the sampler std::vector getTheta ( void ) { return currenttheta; } ///< get the current state of the sampler void setStepSize ( double size, unsigned int param ); ///< set stepsize of the leapfrog integration for parameter param void setStepSize ( const std::vector& sizes ); ///< set all stepsizes of leapfrog integration for all parameters at once double getDeviance ( void ); ///< get the current deviance MCMCList sample ( unsigned int N ); ///< draw N samples from the posterior }; /** * Model evidence (or marginal likelihood) is given by the following integral * * \int P(D|theta) * P(theta) d theta. * * Model evidence can be used to compare models. If E_1 is the evidence for model 1 * and E_2 is the evidence for model 2. The Bayes Factor for comparison of these two * models is * * BF = E_1/E_2. * * This can be interpreted as "How much more likeli is model 1 than model 2 given the * data. * * To estimate model evidence, we note that model evidence can be interpreted as the * expectation of likelihood under the prior distribution. Thus, this function draws * samples from the prior distribution and approximates the above integral as follows: * * \int P(D|theta) * P(theta) d theta ~~ 1/n \sum_{i=1}^n P(D|theta_i). * */ double ModelEvidence ( const PsiPsychometric* pmf, const PsiData* data ); /** * Bayesian Outlier detection * * Similar to the procedure proposed by Wichmann & Hill (2001a), outliers are detected * by performing a series of model comparisons. The fitted psychometric function model * M is compared to a series of models M0,M1,...,Mi, that are modified by incorporating * an additional parameter that perfectly fits the i-th block. That is the models Mi * have on parameter more than model M (which makes them worse) but they also explain * the i-th block perfectly (which makes them better). If the i-th block is not from the * same psychometric function as the other blocks, the improvement of adding an additional * parameter for the i-th block should be large. That means, model Mi should be preferred * to model M. If however, it is plausible that the i-th block comes from the fitted * psychometric (defined by all remaining points together), the gain in descriptive power * from the additional parameter is weak and model M should be preferred. Such model * comparisons can easily be performed using the so called "Bayes Factor", that is * the ratio of the evidences of the two models. * This function determines a Bayes Factor for each block for the comparison between * the model that was based on all blocks and the model that uses a separate parameter * for the block of interest. Bayes Factors > 1 favor the global model, Bayes Factors < 1 * favor the model with a special parameter for block i, indicating that block i is * an outlier. */ std::vector OutlierDetection ( const PsiPsychometric* pmf, OutlierModel* outl, const PsiData* data ); #endif psignifit3-3.0~beta.20120611.1/src/optimizer.cc000066400000000000000000000243651176542545200206640ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "optimizer.h" #include "getstart.h" #include #include // #define DEBUG_OPTIMIZER #ifdef DEBUG_OPTIMIZER #include #include std::ofstream logfile ( "optimizer.log" ); #endif const double maxstep (1e-7); const double maxfstep(1e-7); const int maxiter (80); PsiOptimizer::PsiOptimizer ( const PsiPsychometric * model, const PsiData * data) : nparameters ( model->getNparams() ), simplex ( nparameters+1, std::vector (nparameters) ),fx ( nparameters+1 ), x ( nparameters ), xx ( nparameters ), start ( nparameters ), modified ( nparameters+1, true ) {} PsiOptimizer::~PsiOptimizer ( void ) {} double testfunction(const std::vector& x) { double out(0); unsigned int k; for (k=0; k lambda_hat takes place at the beginning * of the optimization run. The transformation lambda_hat -> lambda happens * before each evaluation of the error function (negloglikelihood) and when * returning the final value. * * While we were here, we did the same for gamma, since it is a rate it should * also never be less than 0 or greater than 1. * */ double lgst ( double x ) { return 1./(1+exp(-x)); } double lgit ( double p ) { if ( p<1e-8 ) p=1e-8; if ( p>1-1e-8 ) p = 1-1e-8; return log ( p/(1-p) ); } void copy_lgst(const std::vector& in, std::vector& out, int nparameters){ int l; for ( l=0; l PsiOptimizer::optimize ( const PsiPsychometric * model, const PsiData * data, const std::vector* startingvalue ) { int k, l; std::vector incr ( model->getNparams() ); if (startingvalue==NULL) { // start = model->getStart(data); start = getstart ( model, data, 8, 3, 3, &incr ); } else { start = std::vector(model->getNparams()); incr = std::vector(model->getNparams()); for ( k=0; kgetNparams()); k++ ) { start[k] = startingvalue->at(k); if ( (k+model->getNparams())size() ) { incr[k] = startingvalue->at(k+model->getNparams()); } else { incr[k] = 0.1 * start[k]; } } } for ( k=0; k output ( start ); std::vector prm ( start ); for (run=0; run<2; run++) { for (k=1; kevalPrior ( k-1, simplex[k][k-1] ) > 1000 ) { simplex[k][k-1] -= 2*d; } #ifdef DEBUG_OPTIMIZER std::cout << "Start (regular," << k << "): " << simplex[k][0] << " " << simplex[k][1] << " " << simplex[k][2]; if (nparameters>3) std::cout << " " << simplex[k][3]; std::cout << "\n"; #endif } // transform starting values to logit for ( k=0; k 3 ) { simplex[k][3] = lgit ( simplex[k][3] ); } } #ifdef DEBUG_OPTIMIZER std::cout << "Start (logit): " << simplex[0][0] << " " << simplex[0][1] << " " << simplex[0][2]; if (nparameters>3) std::cout << " " << simplex[0][3]; std::cout << "\n"; #endif // for (k=1; kneglpost(prm, data ); modified[k] = false; } // fx[k] = testfunction(simplex[k]); #ifdef DEBUG_OPTIMIZER for (l=0; lfx[maxind]) maxind = k; } // Avoid inf for ( k=0; k::infinity() ) { for ( l=0; lneglpost(prm, data ); } } // Check Stoping criteria based on simplex and function values stepsize = 0; for (k=0; kneglpost(prm,data); // ffx = testfunction(xx); if (ffx Expand for (k=0; kfx[maxind]) { // The reflected point is even worse than it was before ~> Shrink for (k=0; k maxiter) { #ifdef DEBUG_OPTIMIZER logfile << "Terminating optimization due to large number of iterations (" << iter << "). Final stepsize: " << stepsize << "\n"; logfile.flush(); #endif break; } } // Evaluate model at every simplex node and determine minimum minind = 0; for (k=0; kneglpost( prm, data ); modified[k] = false; } // fx[k] = testfunction(simplex[k]); if (fx[k]3) std::cout << " " << simplex[minind][3]; std::cout << "\n"; #endif for ( k=0; k3 ) { simplex[k][3] = lgst ( simplex[k][3] ); } } #ifdef DEBUG_OPTIMIZER std::cout << "Stop (regular): " << simplex[minind][0] << " " << simplex[minind][1] << " " << simplex[minind][2]; if (nparameters>3) std::cout << " " << simplex[minind][3]; std::cout << "\n"; #endif for (l=0; ldnegllikeli ( start, data ); dl = 0; for (l=0; ldl) dl = fabs(x[l]); } if (dl<1e-6) break; } */ #ifdef DEBUG_OPTIMIZER logfile << "Returning\n"; logfile.flush(); for (l=0; lgetNblocks(); l++) logfile << data->getIntensity(l) << " " << data->getNcorrect(l) << " " << data->getPcorrect(l) << " " << data->getNtrials(l) << "\n"; for (l=0; l #include "psychometric.h" #include "data.h" /** \brief Simplex optimization */ class PsiOptimizer { private: // some variables for the internal processing of the optimization process int nparameters; // Number of parameters std::vector< std::vector > simplex; // data of the simplex std::vector fx; // function values at the simplex nodes std::vector x; // a single simplex node std::vector xx; // another single simplex node std::vector start; // starting values std::vector modified; // bookkeeping vector to indicate which simplex nodes have changed, i.e. which function values need to be updated public: PsiOptimizer ( const PsiPsychometric * model, ///< model to be fitted (this is needed at this point only to determine the amount of internal memory that is required) const PsiData * data ///< data to be fitted (this is needed at this point only to determine the amount of internal memory that is required) ); ///< set up everything ~PsiOptimizer ( void ); ///< clean up everything std::vector optimize ( const PsiPsychometric * model, ///< model to be fitted const PsiData * data, ///< data to be fitted const std::vector* startingvalue=NULL ///< starting value for optimization --- if this is longer the the number of parameters in the model, the additional values are used to span the simplex ); ///< Start the optimization process }; #endif psignifit3-3.0~beta.20120611.1/src/prior.cc000066400000000000000000000045201176542545200177640ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "prior.h" #include void GaussPrior::shrink ( double xmin, double xmax ) { double s ( 0.5*(xmax-xmin) ), m ( 0.5*(xmin+xmax) ); if ( s=1 ) throw BadArgumentError ( "Requested probability is outside the range" ); unsigned int i; double x,d; if (start==NULL) x = mu; else x = start; for ( i=0; i<20; i++ ) { d = (cdf ( x ) - p)/pdf ( x ); x -= d; if ( fabs(d) < 1e-7 ) break; } return x; } void BetaPrior::shrink ( double xmin, double xmax ) { double s ( 0.5*(xmax-xmin) ), m ( 0.5*(xmin+xmax) ); if ( s=1 ) throw BadArgumentError ( "Requested probability is outside the range" ); double x, d, sx; unsigned int i; if ( start == NULL ) x = log ( mean() / ( 1-mean() ) ); else if ( start<=0 || start>=1 ) { throw BadArgumentError ( "Beta Distribution can not be evaluated outside the unit interval" ); } else x = log ( start / (1-start) ); for ( i=0; i<20; i++ ) { sx = 1./(1+exp(-x)); d = (cdf ( sx ) - p) / ( pdf ( sx ) * sx * (1-sx) ); x -= d; if ( fabs ( d ) < 1e-7 ) break; } return 1./(1+exp(-x)); } void GammaPrior::shrink ( double xmin, double xmax ) { double xr ( xmin/xmax ); k = ((1+xr)/(1-xr)); k *= k; theta = xmax / (k+sqrt(k)); normalization = pow(theta,k)*exp(gammaln(k)); rng = GammaRandom ( k, theta ); } double GammaPrior::ppf ( double p, double start ) const { if ( p<=0 || p>=1 ) throw BadArgumentError ( "Requested probability is outside the range" ); double x,d; unsigned int i; if ( start == NULL ) x = sqrt ( mean() ); else x = sqrt ( start ); for ( i=0; i<20; i++ ) { d = (cdf ( x*x ) - p)/(2*pdf( x*x )*x); x -= d; if ( fabs ( d ) < 1e-7 ) break; } return x*x; } void nGammaPrior::shrink ( double xmin, double xmax ) { double ymin(-xmax), ymax(-xmin); GammaPrior::shrink ( ymin, ymax ); } psignifit3-3.0~beta.20120611.1/src/prior.h000066400000000000000000000326161176542545200176350ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef PRIOR_H #define PRIOR_H #include #include "rng.h" #include "special.h" /** \brief base class for all priors * * This default prior does nothing in particular. It poses no restriction on the respective parameter at all. * at any value x, the prior returns 1. Thus it is an "improper" prior in the sense that it does not correspond * to a proper probability distribution. */ class PsiPrior { private: PsiRandom rng; public: virtual double pdf ( double x ) const { return 1.;} ///< evaluate the pdf of the prior at position x (in this default form, the parameter is completely unconstrained) virtual double dpdf ( double x ) { return 0.; } ///< evaluate the derivative of the pdf of the prior at position x (in this default form, the parameter is completely unconstrained) virtual double rand ( void ) { return rng.draw(); } ///< draw a random number virtual PsiPrior * clone ( void ) const { throw NotImplementedError(); }///< clone by value virtual double mean ( void ) const { return 0; } ///< return the mean virtual double std ( void ) const { return 1e5; } ///< return the standard deviation virtual void shrink ( double xmin, double xmax ) { throw NotImplementedError(); } ///< shrink the prior if it is broader than the range between xmin and xmax virtual int get_code(void) const { throw NotImplementedError(); } ///< return the typcode of this prior virtual double cdf ( double x ) const { throw NotImplementedError(); } ///< cdf of the prior virtual double getprm ( unsigned int prm ) const { throw NotImplementedError(); } virtual double ppf ( double p, double start=NULL ) const { throw NotImplementedError(); } }; /** \brief Uniform prior on an interval * * This prior defines a uniform distribution on an interval. It's pdf is thus \f$u-l\f$ if \f$x\in(l,u)\f$ and * 0 otherwise. */ class UniformPrior : public PsiPrior { private: double lower; double upper; double height; UniformRandom rng; public: UniformPrior ( double low, double high ) : lower(low), upper(high), rng ( low, high ) { height = 1./(high-low); } ///< Set up a UniformPrior on the interval from low to high UniformPrior ( const UniformPrior& original ) : lower(original.lower), upper(original.upper), height(original.height), rng(original.rng) {} ///< copy constructor double pdf ( double x ) const { return ( x>lower && x do not shrink int get_code(void) const { return 0; } /// return the typcode of this prior double cdf ( double x ) const { return ( xupper ? 1 : (x-lower)/(upper-lower) ) ); } double getprm ( unsigned int prm ) const { return (prm==0 ? lower : upper ); } double ppf ( double p, double start=NULL ) const { return ( p>1 ? upper : (p<0 ? lower : p*(upper-lower)+lower)); } }; /** \brief gaussian (normal) prior * * This defines a gaussian prior on the entire real axis. It's pdf is defined by the normal * \f[ f(x) = \frac{1}{\sqrt{2 \pi}\sigma} \exp \left( - \frac{(x-\mu)^2}{2\sigma^2} \right). \f] */ class GaussPrior : public PsiPrior { private: double mu; double sg; double normalization; double var; double twovar; GaussRandom rng; public: GaussPrior ( double mean, double sd ) : mu(mean), sg(sd), var(sg*sg), twovar(2*sg*sg), rng(mean,sd) { normalization = 1./(sqrt(2*M_PI)*sg); } ///< initialize prior to have mean mean and standard deviation sd GaussPrior ( const GaussPrior& original ) : mu(original.mu), sg(original.sg), normalization(original.normalization), var(original.var), twovar(original.twovar), rng(original.rng) {} ///< copy contructor double pdf ( double x ) const { return normalization * exp ( - (x-mu)*(x-mu)/twovar ); } ///< return pdf of the prior at position x double dpdf ( double x ) { return - x * pdf ( x ) / var; } ///< return derivative of the prior at position x double rand ( void ) {return rng.draw(); } PsiPrior * clone ( void ) const { return new GaussPrior(*this); } double mean ( void ) const { return mu; } ///< mean double std ( void ) const { return sg; } ///< return standard deviation void shrink ( double xmin, double xmax ); int get_code(void) const { return 1; } /// return the typcode of this prior double cdf ( double x ) const { return Phi ( (x-mu)/sg ); } double getprm ( unsigned int prm ) const { return ( prm==0 ? mu : sg ); } double ppf ( double p, double start=NULL ) const; }; /** \brief beta prior * * This defines a beta prior distribution that is defined on an interval. It's pdf is defined by * \f[ f(x) = \frac{x^{\alpha-1} (1-x)^{\beta-1}} {B(\alpha,\beta)}, \f] * * if \f$x\in(0,1)\f$. It is zero otherwise. */ class BetaPrior : public PsiPrior { private: double alpha; double beta; double normalization; BetaRandom rng; double mode; public: BetaPrior ( double al, double bt ) : alpha(al), beta(bt), normalization(betaf(al,bt)), rng (alpha, beta) { mode = (al-1)/(al+bt-2); mode = pdf(mode); } ///< Initialize with parameters alpha=al, beta=bt BetaPrior ( const BetaPrior& original) : alpha(original.alpha), beta(original.beta), normalization(original.normalization), rng(original.rng), mode(original.mode) {} ///< copy constructor double pdf ( double x ) const { return (x<1e-15||x>1.-1e-15 ? 0 : pow(x,alpha-1)*pow(1-x,beta-1)/normalization); } ///< return beta pdf double dpdf ( double x ) { return (x<1e-15||x>1.-1e-15 ? 0 : ((alpha-1)*pow(x,alpha-2)*pow(1-x,beta-1) + (beta-1)*pow(1-x,beta-2)*pow(x,alpha-1))/normalization); } ///< return derivative of beta pdf double rand ( void ) {return rng.draw();}; ///< draw a random number using rejection sampling PsiPrior * clone ( void ) const { return new BetaPrior(*this); } double mean ( void ) const { return alpha/(alpha+beta); } double std ( void ) const { return sqrt ( alpha*beta/((alpha+beta)*(alpha+beta)*(alpha+beta+1)) ); } void shrink ( double xmin, double xmax ); int get_code(void) const { return 2; } /// return the typcode of this prior double cdf ( double x ) const { return (x<0 ? 0 : (x>1 ? 1 : betainc ( x, alpha, beta ))); } double getprm ( unsigned int prm ) const { return ( prm==0 ? alpha : beta ); } double ppf ( double p, double start=NULL ) const; }; /** \brief gamma prior * * This defines a gamma prior that is defined for the positive axis. It's pdf is defined by * \f[ f(x) = x^{k-1} \frac{\exp(-x/\theta)}{\theta^k\Gamma(k)}, \f] * for positive numbers and it is zero otherwise. */ class GammaPrior : public PsiPrior { private: double k; double theta; double normalization; GammaRandom rng; public: GammaPrior ( double shape, double scale ) : k(shape), theta(scale), rng(shape, scale) { normalization = exp(gammaln(shape) + shape*log(scale));} ///< Initialize a gamma prior GammaPrior ( const GammaPrior& original ) : k(original.k), theta(original.theta), normalization(original.normalization), rng(original.rng) {} ///< copy constructor virtual double pdf ( double x ) const { return (x>1e-15 ? pow(x,k-1)*exp(-x/theta)/normalization : 0 );} ///< return pdf at position x virtual double dpdf ( double x ) { return (x>1e-15 ? ( (k-1)*pow(x,k-2)*exp(-x/theta)-pow(x,k-1)*exp(-x/theta)/theta)/normalization : 0 ); } ///< return derivative of pdf virtual double rand ( void ) {return rng.draw(); }; PsiPrior * clone ( void ) const { return new GammaPrior(*this); } virtual double mean ( void ) const { return k*theta; } double std ( void ) const { return sqrt ( k*theta*theta ); } void shrink ( double xmin, double xmax ); virtual int get_code(void) const { return 3; } /// return the typcode of this prior virtual double cdf ( double x ) const { return ( x<0 ? 0 : gammainc ( k, x/theta ) / exp ( gammaln ( k ) ) ); } double getprm ( unsigned int prm ) const { return ( prm==0 ? k : theta ); } virtual double ppf ( double p, double start=NULL ) const; }; /** \brief negative gamma prior * * This defines a gamma prior that is defined for the negative axis. Thus, the pdf is defined by * \f[ f(x) = (-x)^{k-1} \frac{\exp(x/\theta)}{\theta^k\Gamma(k)}, \f] * for negative numbers and is zero otherwise. */ class nGammaPrior : public GammaPrior { public: nGammaPrior ( double shape, double scale ) : GammaPrior(shape,scale) {} nGammaPrior ( const nGammaPrior& original ) : GammaPrior(original) {} ///< copy constructor double pdf ( double x ) const { return GammaPrior::pdf ( -x ); } double dpdf ( double x ) { return -GammaPrior::dpdf ( -x ); } double rand ( void ) { return -GammaPrior::rand(); } PsiPrior * clone ( void ) const { return new nGammaPrior(*this); } double mean ( void ) const { return -GammaPrior::mean(); } void shrink ( double xmin, double xmax ); int get_code(void) const { return 4; } /// return the typcode of this prior double cdf ( double x ) const { return ( x>0 ? 1 : 1-GammaPrior::cdf ( -x ) ); } double ppf ( double p, double start=NULL ) const { return - GammaPrior::ppf ( 1-p ); } }; /** \brief inverse gamma prior * * This defines an inverse gamma prior that is conjugate to the variance of a normal distribution * and can probably be assumed quasi conjugate to the width or parameters like that. Its pdf is defined * by * \f[ f(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} x^{-\alpha-1} \exp ( -\beta/x ) \f] */ class invGammaPrior : public PsiPrior { private: double alpha; double beta; double normalization; GammaRandom rng; public: invGammaPrior ( double shape, double scale ) : alpha ( shape ), beta ( scale ), rng ( shape, 1./scale ) { normalization = pow(alpha,beta)/exp(gammaln(shape));} ///< Initialize inverse gamma prior invGammaPrior ( const invGammaPrior& original ) : alpha(original.alpha), beta(original.beta), normalization ( original.normalization ), rng(original.rng) {} ///< copy constructor virtual double pdf ( double x ) const { return ( x>0 ? pow ( x, -alpha-1 ) * exp ( -beta/x ) * normalization : 0 ); } virtual double dpdf ( double x ) { return (x>0 ? ( (-alpha-1)*pow(x,-alpha-2) * exp ( -beta/x ) + pow(x,-alpha-1) * exp ( -beta/x ) * beta / (x*x) ) * normalization : 0 ); } virtual double rand ( void ) { return 1./rng.draw(); } PsiPrior * clone ( void ) const { return new invGammaPrior(*this); } virtual double mean ( void ) const { return beta/(alpha-1); } double std ( void ) const { return ( alpha>2 ? beta / ( (alpha-1)*sqrt(alpha-2) ) : 1e5 ); } virtual void shrink ( double xmin, double xmax ) {} /// Doesn't shrink!! virtual int get_code ( void ) const { return 5; } /// return the typecode of this prior }; /** \brief negative inverse gamma prior * * This defines a negative inverse gamma prior that is conjugate to the variance of a normal distribution * and can probably be assumed quasi conjugate to the width or parameters like that. Its pdf is defined * by * \f[ f(x) = \frac{\beta^\alpha}{\Gamma(\alpha)} (-x)^{-\alpha-1} \exp ( \beta/x ) \f] */ class ninvGammaPrior : public invGammaPrior { public: ninvGammaPrior ( double shape, double scale ) : invGammaPrior ( shape, scale ) {} ninvGammaPrior ( const ninvGammaPrior& original ) : invGammaPrior ( original ) {} double pdf ( double x ) const { return invGammaPrior::pdf ( -x ); } double dpdf ( double x ) { return -invGammaPrior::dpdf ( -x ); } double rand ( void ) { return -invGammaPrior::rand(); } PsiPrior * clone ( void ) const { return new ninvGammaPrior ( *this ); } double mean ( void ) const { return -invGammaPrior::mean(); } void shrink ( double xmin, double xmax ) { invGammaPrior::shrink ( -xmax, -xmin ); } int get_code ( void ) const { return 6; } /// return the typecode of this prior }; #endif psignifit3-3.0~beta.20120611.1/src/psipp.h000066400000000000000000000006751176542545200176350ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef PSIPP_H #define PSIPP_H #include "bootstrap.h" #include "core.h" #include "data.h" #include "errors.h" #include "mclist.h" #include "mcmc.h" #include "optimizer.h" #include "prior.h" #include "psychometric.h" #include "rng.h" #include "sigmoid.h" #include "special.h" #include "getstart.h" #include "integrate.h" #endif psignifit3-3.0~beta.20120611.1/src/psychometric.cc000066400000000000000000000624721176542545200213540ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "psychometric.h" #include "special.h" #include "linalg.h" // #ifdef DEBUG_PSYCHOMETRIC #include // #endif ////////////////////////////////// PsiPsychometric /////////////////////////////////// PsiPsychometric::PsiPsychometric ( int nAFC, PsiCore * core, PsiSigmoid * sigmoid ) : Nalternatives(nAFC), guessingrate(1./nAFC), gammaislambda(false), priors( getNparams() ) { unsigned int k; Core = core->clone(); Sigmoid = sigmoid->clone(); for (k=0; kclone(); Sigmoid = sigmoid->clone(); for (k=0; k& prm ) const { double gamma(guessingrate); if (Nalternatives==1) {// Here we talk about a yes/no task if (gammaislambda) gamma = prm[2]; else gamma = prm[3]; } #ifdef DEBUG_PSYCHOMETRIC std::cerr << "Evaluating psychometric function. Parameters: \n"; std::cerr << "alpha = " << prm[0] << "\nbeta = " << prm[1] << "\nlambda = " << prm[2] << "\ngamma = " << gamma << "\n"; std::cerr << "Value of sigmoid: " << Sigmoid->f(Core->g(x,prm)) << "\n"; #endif return gamma + (1-gamma-prm[2]) * Sigmoid->f(Core->g(x,prm)); } double PsiPsychometric::negllikeli ( const std::vector& prm, const PsiData* data ) const { unsigned int i; int n,k; double l(0); double x,p,lognoverk; for (i=0; igetNblocks(); i++) { n = data->getNtrials(i); k = data->getNcorrect(i); x = data->getIntensity(i); lognoverk = data->getNoverK(i); p = evaluate(x, prm); l -= lognoverk; if (p>0) l -= k*log(p); else l += 1e10; if (p<1) l -= (n-k)*log(1-p); else l += 1e10; } return l; } double PsiPsychometric::leastfavourable ( const std::vector& prm, const PsiData* data, double cut, bool threshold ) const { if (!threshold) throw NotImplementedError(); // So far we only have this for the threshold std::vector delta (prm.size(),0), du(prm.size(),0); Matrix * I; double ythres; double rz,nz,xz,pz,fac1; double l_LF(0); double s; unsigned int i,z; // Fill u ythres = Sigmoid->inv(cut); du[0] = Core->dinv(ythres,prm,0); du[1] = Core->dinv(ythres,prm,1); // Determine 2nd derivative I = ddnegllikeli ( prm, data ); // Now we have to solve I*delta = du for delta try { delta = I->solve ( du ); } catch (std::string){ // In this case, the matrix is numerically singular // Thats bad. We simply delete I; return 0; // in that case } // I is not needed anymore delete I; // Normalize the result s = 0; for (i=0; igetNblocks(); z++) { rz = data->getNcorrect(z); nz = data->getNtrials(z); xz = data->getIntensity(z); pz = evaluate(xz,prm); fac1 = rz/pz - (nz-rz)/(1-pz); for (i=0; i<2; i++) l_LF += delta[i] * fac1 * Sigmoid->df(Core->g(xz,prm)) * Core->dg(xz,prm,i); for (i=2; if(Core->g(xz,prm)) ); } // If l_LF is nan, return 0 if (l_LF!=l_LF) return 0; return l_LF; } Matrix * PsiPsychometric::ddnegllikeli ( const std::vector& prm, const PsiData* data ) const { Matrix * I = new Matrix ( prm.size(), prm.size() ); double rz,nz,pz,xz,dldf,ddlddf; unsigned int z,i,j; // Fill I for (z=0; zgetNblocks(); z++) { nz = data->getNtrials(z); xz = data->getIntensity(z); pz = evaluate(xz,prm); rz = data->getNcorrect(z); // rz = pz*nz; // expected Fisher Information matrix dldf = (nz-rz)/(1-pz) - rz/pz; ddlddf = rz/(pz*pz) + (nz-rz)/((1-pz)*(1-pz)); // These parts must be determined /* for (i=0; i<2; i++) { for (j=i; j<2; j++) { (*I)(i,j) += fac1 * (1-guessingrate-prm[2]) * (Sigmoid->ddf(Core->g(xz,prm)) * Core->dg(xz,prm,i) * Core->dg(xz,prm,j) + Sigmoid->df(Core->g(xz,prm)) * Core->ddg(xz,prm,i,j)); (*I)(i,j) -= fac2 * (1-guessingrate-prm[2]) * (1-guessingrate-prm[2]) * pow(Sigmoid->df(Core->g(xz,prm)),2) * Core->dg(xz,prm,i) * Core->dg(xz,prm,j); } for (j=2; jdf(Core->g(xz,prm)) * Core->dg(xz,prm,i); (*I)(i,j) -= fac2 * (1-guessingrate-prm[2]) * Sigmoid->df(Core->g(xz,prm)) * Core->dg(xz,prm,i) * ( (j==2 ? 0 : 1) - Sigmoid->f(Core->g(xz,prm)) ); } } for ( i=2; if(Core->g(xz,prm)) ) * ( (i==2 ? 0 : 1 ) - Sigmoid->f(Core->g(xz,prm)) ); } } */ for ( i=0; i PsiPsychometric::dnegllikeli ( const std::vector& prm, const PsiData* data ) const { std::vector gradient (prm.size()); double rz,xz,pz,nz,dldf; unsigned int z,i; double guess (guessingrate); if ( Nalternatives < 2 ) guess = prm[3]; for (z=0; zgetNblocks(); z++) { rz = data->getNcorrect(z); nz = data->getNtrials(z); xz = data->getIntensity(z); pz = evaluate(xz,prm); dldf = rz/pz - (nz-rz)/(1-pz); // fill gradient vector for ( i=0; i& prm, const PsiData* data ) const { unsigned int i; int n; double D(0); double x,y,p; for ( i=0; igetNblocks(); i++ ) { n = data->getNtrials(i); y = data->getPcorrect(i); x = data->getIntensity(i); p = evaluate( x, prm ); if (y>0) D += n*y*log(y/p); if (y<1) D += n*(1-y)*log((1-y)/(1-p)); } D *= 2; return D; } void PsiPsychometric::setPrior ( unsigned int index, PsiPrior* prior ) throw(BadArgumentError) { if ( index >= priors.size() ) { throw BadArgumentError ( "Trying to set a prior for a nonexistent parameter" ); } delete priors[index]; #ifdef DEBUG_PSYCHOMETRIC std::cerr << "Setting prior for parameter " << index << "\n"; #endif priors[index] = prior->clone(); } double PsiPsychometric::neglpost ( const std::vector& prm, const PsiData* data ) const { unsigned int i; double l; l = negllikeli( prm, data); for (i=0; ipdf ( 0.5 ); l -= log( priors[i]->pdf(prm[i]) ); } return l; } std::vector PsiPsychometric::getStart ( const PsiData* data ) const { unsigned int i; double a,b,a0,b0,abest,bbest; double alpha,beta,alpha0,beta0,minpost,post; std::vector x (data->getIntensities()); std::vector p (data->getPcorrect()); double minp(1000), maxp(-1000); double meanx(0), meanp(0); double varx(0),covxp(0); std::vector relevant (data->nonasymptotic()); double alphamin = 1e10; double alphamax = -1e10; double pmax=0; double pmin=1; double pp; double imax (0),imin (0); if (relevant.size()==1) { // This is not the best solution for ( i=0; igetNblocks(); i++ ) { a = data->getIntensity(i); pp = data->getPcorrect(i); if (a>alphamax) alphamax=a; if (apmax) { pmax=pp; imax=i; } if (ppgetIntensity(relevant[i]); pp = data->getPcorrect(relevant[i]); if (a>alphamax) alphamax=a; if (apmax) { pmax=pp; imax=relevant[i]; } if (ppgetIntensity(imax)-data->getIntensity(imin)); double betamin = (data->getIntensity(imax)>data->getIntensity(imin) ? 1 : -1 ) * 0.01; // First find the best values using logistic regression // Scale the data to the interval (0,1) for (i=0; ip[i]) minp = p[i]; #ifdef DEBUG_PSYCHOMETRIC std::cerr << "minp="< out; out = Core->transform ( getNparams(), abest, bbest ); if (Nalternatives==1 && !gammaislambda) { out[2] = 0.02; out[3] = 0.02; } else { out[2] = 0.02; } minpost = neglpost ( out, data ); // Now perform a little grid search to maybe improve the parameters (and thus avoid the worst local minima) if (alphamax==alphamin) { alphamax += 0.1*(out[1]>0 ? out[1] : 1 ); alphamin -= 0.1*(out[1]>0 ? out[1] : 1 ); } if (betamax==betamin) { betamax += 0.1; betamin -= 0.1; } double betastep = (betamax-betamin)/10.; double alphastep = (alphamax-alphamin)/10.; for ( beta=betamin; beta<=betamax; beta+= betastep ) { for ( alpha=alphamin; alpha<=alphamax; alpha+= alphastep ) { // a = alpha/beta - beta0; a = -alpha/beta; b = 1./beta; out = Core->transform( getNparams(), a,b); if (Nalternatives==1 && !gammaislambda) { out[2] = 0.02; out[3] = .02; } else { out[2] = 0.02; } post = neglpost ( out, data ); if ( post < minpost ) { abest = a; bbest = b; minpost = post; } } } // Store the super best parameters in the end out = Core->transform ( getNparams(), abest, bbest ); if (Nalternatives==1 && !gammaislambda) { out[2] = 0.02; out[3] = 0.02; } else { out[2] = 0.02; } return out; } std::vector PsiPsychometric::getDevianceResiduals ( const std::vector& prm, const PsiData* data ) const { unsigned int i; int n; double x,y,p; std::vector out (data->getNblocks()); for ( i=0; igetNblocks(); i++ ) { n = data->getNtrials(i); y = data->getPcorrect(i); x = data->getIntensity(i); p = evaluate(x,prm); out[i] = 0; if (y>0) out[i] += n*y*log(y/p); if (y<1) out[i] += n*(1-y)*log((1-y)/(1-p)); out[i] = (y>p?1:-1) * sqrt(2*out[i]); } return out; } double PsiPsychometric::getRpd ( const std::vector& devianceresiduals, const std::vector& prm, const PsiData* data ) const { int k,N(data->getNblocks()); double Ed(0),Ep(0),vard(0),varp(0),R(0); std::vector p ( N ); // Evaluate p values in advance for ( k=0; kgetIntensity(k),prm); } // Calculate averages for ( k=0; k& devianceresiduals, const PsiData* data ) const { int i,k; double Ed(0), Ek(0), vard(0), vark(0), R(0); std::vector ofinterest ( data->nonasymptotic() ); int M ( ofinterest.size() ); // Calculate averages for ( k=0; k prm, const PsiData* data, unsigned int i ) const { int k, Nblocks(data->getNblocks()); double rz,pz,nz,xz,dl(0); double guess(1./Nalternatives); if (Nalternatives==1) {// Here we talk about a yes/no task if (gammaislambda) guess = prm[2]; else guess = prm[3]; } for (k=0; kgetNcorrect ( k ); nz = data->getNtrials ( k ); xz = data->getIntensity( k ); pz = evaluate ( xz, prm ); switch (i) { case 0: case 1: dl += (rz/pz - (nz-rz)/(1-pz)) * (1-guess-prm[2]) * Sigmoid->df ( Core->g ( xz, prm ) ) * Core->dg ( xz, prm, i ); break; case 2: dl -= (rz/pz - (nz-rz)/(1-pz)) * Sigmoid->f ( Core->g ( xz, prm ) ); break; case 3: if (Nalternatives==1) // gamma is a free parameter dl += (rz/pz - (nz-rz)/(1-pz)) * (1 - Sigmoid->f ( Core->g ( xz, prm ) )); break; } } return dl; } double PsiPsychometric::dlposteri ( std::vector prm, const PsiData* data, unsigned int i ) const { if ( i < getNparams() ) return dllikeli ( prm, data, i ) + priors[i]->dpdf(prm[i]); else return 0; } double PsiPsychometric::dpredict ( const std::vector& prm, double x, unsigned int i ) const { double guess ( getGuess(prm) ); if (i<2) return (1-guess-prm[2]) * Sigmoid->df ( Core->g ( x, prm ) ) * Core->dg ( x, prm, i ); if (i==2) return -Sigmoid->f(Core->g(x,prm)); if (i==3 && getNalternatives()<2) return 1-Sigmoid->f(Core->g(x,prm)); return 0; } double PsiPsychometric::ddpredict ( const std::vector& prm, double x, unsigned int i, unsigned int j ) const { double guess ( getGuess(prm) ); double ddf; if ( ((i==0)&&(j==0)) || ((i==0)&&(j==1)) || ((i==1)&&(j==0)) || ((i==1)&&(j==1)) ) { ddf = Sigmoid->ddf ( Core->g ( x,prm ) ) * Core->dg ( x, prm, i ) * Core->dg ( x, prm, j ); ddf += Sigmoid->df ( Core->g ( x, prm ) ) * Core->ddg ( x, prm, i, j ); ddf *= (1-guess-prm[2]); } else if ( ((i==2)&&(j==2)) || ((i==2)&&(j==3)) || ((i==3)&&(j==2)) || ((i==3)&&(j==3)) ) { ddf = 0; } else if ( ((i==0)&&(j==2)) || ((i==0)&&(j==3)) || ((i==1)&&(j==2)) || ((i==1)&&(j==3)) || ((i==2)&&(j==0)) || ((i==3)&&(j==0)) || ((i==2)&&(j==1)) || ((i==3)&&(j==j)) ) { i = ( idf ( Core->g ( x, prm ) ) * Core->dg ( x, prm, i ); } return ddf; } /******************************** PMF_with_JeffreysPrior ********************************/ double PMF_with_JeffreysPrior::neglpost ( const std::vector& prm, const PsiData* data ) const { unsigned int i, j, k; double dd, pk, dpi, dpj; // calculate expected Fisher Information for ( i=0; igetNblocks(); k++ ) { pk = evaluate ( data->getIntensity(k), prm ); dpi = dpredict ( prm, data->getIntensity(k), i ); dpj = dpredict ( prm, data->getIntensity(k), j ); dd += data->getNtrials(k) * (1./pk + 1./(1-pk)) * dpi * dpj; } fisher(i,j) = fisher(j,i) = dd; } } // Calculate Determinant if (getNparams()==3) { dd = fisher(0,0)*fisher(1,1)*fisher(2,2) + fisher(0,1)*fisher(1,2)*fisher(2,0) + fisher(1,0)*fisher(2,1)*fisher(0,2) - fisher(0,2)*fisher(1,1)*fisher(2,0) - fisher(0,0)*fisher(1,2)*fisher(2,1) - fisher(2,2)*fisher(0,1)*fisher(1,0); } else if (getNparams()==4) { dd = fisher(0,0)* ( fisher(1,1)*fisher(2,2)*fisher(3,3) + fisher(1,2)*fisher(2,3)*fisher(3,1) + fisher(2,1)*fisher(3,2)*fisher(1,3) - fisher(1,3)*fisher(2,2)*fisher(3,1) - fisher(1,2)*fisher(2,1)*fisher(3,3) - fisher(1,1)*fisher(2,3)*fisher(3,2) ); // std::cout << "dd0 = " << dd << "\n"; dd -= fisher(1,0)* ( fisher(0,1)*fisher(2,2)*fisher(3,3) + fisher(0,2)*fisher(2,3)*fisher(3,1) + fisher(0,3)*fisher(2,1)*fisher(3,2) - fisher(0,3)*fisher(2,2)*fisher(3,1) - fisher(0,2)*fisher(2,1)*fisher(3,3) - fisher(0,1)*fisher(2,3)*fisher(3,2) ); // std::cout << "dd1 = " << dd << "\n"; dd += fisher(2,0)* ( fisher(0,1)*fisher(1,2)*fisher(3,3) + fisher(0,2)*fisher(1,3)*fisher(3,1) + fisher(0,3)*fisher(1,1)*fisher(3,2) - fisher(0,3)*fisher(1,2)*fisher(3,1) - fisher(0,2)*fisher(1,1)*fisher(3,3) - fisher(0,1)*fisher(1,3)*fisher(3,2) ); // std::cout << "dd2 = " << dd << "\n"; dd -= fisher(3,0)* ( fisher(0,1)*fisher(1,2)*fisher(2,3) + fisher(0,2)*fisher(1,3)*fisher(2,1) + fisher(0,3)*fisher(1,1)*fisher(2,2) - fisher(0,3)*fisher(1,2)*fisher(2,1) - fisher(0,2)*fisher(1,1)*fisher(2,3) - fisher(0,1)*fisher(1,3)*fisher(2,2) ); // std::cout << "dd3 = " << dd << "\n"; } // std::cerr << prm[0] << " " << prm[1] << " " << prm[2] << " " << dd << " " << negllikeli (prm, data ) << " " << 0.5*log(dd) << "\n"; // if ( dd!=dd ) { // std::cerr << "I = [ [ " << fisher(0,0) << ", " << fisher(0,1) << ", " << fisher(0,2) << "],\n" // << "[ " << fisher(1,0) << ", " << fisher(1,1) << ", " << fisher(1,2) << "],\n" // << "[ " << fisher(2,0) << ", " << fisher(2,1) << ", " << fisher(2,2) << "]]\n"; // } /* std::cout << "I = [ [ " << fisher(0,0) << ", " << fisher(0,1) << ", " << fisher(0,2) << ", " << fisher(0,3) << "],\n" << "[ " << fisher(1,0) << ", " << fisher(1,1) << ", " << fisher(1,2) << ", " << fisher(1,3) << "],\n" << "[ " << fisher(2,0) << ", " << fisher(2,1) << ", " << fisher(2,2) << ", " << fisher(2,3) << "],\n" << "[ " << fisher(3,0) << ", " << fisher(3,1) << ", " << fisher(3,2) << ", " << fisher(3,3) << "]]\n"; std::cout << "dd = " << dd << "\n"; */ return negllikeli ( prm, data ) - 0.5*log(dd); } double PMF_with_JeffreysPrior::dlposteri ( std::vector prm, const PsiData* data, unsigned int i ) const { // numerical approximation double df, h(.001); std::vector prm2 (prm); prm2[i] += h; df = neglpost ( prm2, data ) - neglpost ( prm, data ); return df/h; } /******************************** BetaPsychometric **************************************/ double BetaPsychometric::negllikeli ( const std::vector& prm, const PsiData* data ) const { unsigned int i; int n; double k; double l(0); double x,p,al,bt; unsigned int nupos ( getNparams()-1 ); double nu; for (i=0; igetNblocks(); i++) { n = data->getNtrials(i); k = data->getPcorrect(i); if ( k==1 || k==0 ) k = double (data->getNcorrect(i))/(0.5+n); x = data->getIntensity(i); p = evaluate (x, prm); nu = prm[nupos]; al = p*nu*n; bt = (1-p)*nu*n; l -= gammaln ( nu*n ) - gammaln ( al ) - gammaln ( bt ); if (k>0) l -= (al-1)*log(k); else l += 1e10; if (k<1) l -= (bt-1)*log(1-k); else l += 1e10; } return l; }; std::vector BetaPsychometric::dnegllikeli ( const std::vector& prm, const PsiData* data ) const { std::vector out ( prm.size(), 0 ); double xz, pz, nz, dldf, dldnu; unsigned int i, z; double nu ( prm[prm.size()-1] ); double nunz, f; double guess ( getGuess( prm ) ); const PsiCore * core = getCore (); const PsiSigmoid * sigmoid = getSigmoid (); for (z=0; zgetNblocks(); z++) { nz = data->getNtrials(z); pz = data->getPcorrect(z); if ( pz==1 || pz==0 ) pz = double (data->getNcorrect(i))/(0.5+nz); xz = data->getIntensity(z); nunz = nu*nz; f = evaluate ( xz, prm ); // dl/dnu dldnu = nz * psi ( nunz ) - f*nz * psi ( f*nunz ) - (1-f)*nz * psi ( (1-f)*nunz ); dldnu += ( pz>0 ? f*nz*log(pz) : -1e10 ); dldnu += ( pz<1 ? (1-f)*nz*log(1-pz) : -1e10 ); // dl/df dldf = psi ( (1-f)*nunz ) - psi ( f*nunz ); dldf += ( pz>0 ? ( pz<1 ? log ( pz/(1-pz) ) : 1e10 ) : -1e10 ); dldf *= nunz; // now fill the output vector for ( i=0; i<2; i++ ) out[i] -= dldf * (1-guess-prm[2]) * sigmoid->df(core->g(xz,prm)) * core->dg(xz,prm,i); for (i=2; if(core->g(xz,prm)) ); // Is that correct? out[i] -= dldnu; } return out; }; Matrix * BetaPsychometric::ddnegllikeli ( const std::vector& prm, const PsiData* data ) const { Matrix * I = new Matrix ( prm.size(), prm.size() ); unsigned int i, j, z; double xz, pz, nz, nunz, fz, dldf, ddlddf, dfda, ddldfdnu; unsigned int nupos ( getNparams()-1 ); double nu ( prm[nupos] ); for ( z=0; zgetNblocks(); z++ ) { xz = data->getIntensity(z); pz = data->getPcorrect(z); nz = data->getNtrials(z); if ( pz==0 || pz==1 ) pz = double (data->getNcorrect(i)) / (0.5+nz); fz = evaluate ( xz, prm ); nunz = nz*nu; // d2l/dnu2 (*I)(nupos,nupos) += digamma(nunz)*nz*nz - fz*fz*nz*nz * digamma(fz*nunz) - (1-fz)*(1-fz)*nz*nz*digamma((1-fz)*nunz); // Now partial derivatives for chainrule ddlddf = - nunz*nunz * ( digamma( fz*nunz ) + digamma( (1-fz)*nunz) ); dldf = nunz* ( (pz>0 ? (pz<1 ? log(pz/(1-pz)) : 1e10 ) : -1e10 ) + psi( (1-fz)*nunz ) - psi ( fz*nunz ) ); ddldfdnu = nz * ( (pz>0 ? (pz<1 ? log(pz/(1-pz)) : 1e10 ) : -1e10 ) + (psi((1-fz)*nunz) - psi(fz*nunz)) + (1-fz)*nunz*digamma ((1-fz)*nunz) - fz*nunz*digamma(fz*nunz) ); for ( i=0; iscale(-1); return I; }; double BetaPsychometric::fznull ( unsigned int z, const PsiData * data, double nu ) const { double x ( data->getPcorrect ( z ) ); double nunz (nu*data->getNtrials ( z ) ); double pz ( x ); double d (1); // Newton optimization (will typically be fine with pz, i.e. without optimization) while ( d>.001 ) { d = -( (pz>0 ? (pz<1 ? log(pz/(1-pz)) : 1e10 ) : -1e10 ) + psi ( (1-x) * nunz ) - psi ( x * nunz ) ) / (nunz * ( digamma(x*nunz)+digamma( (1-x)*nunz) ) ); x -= d; } return x; }; double BetaPsychometric::negllikelinull ( const PsiData * data, double nu ) const { double l ( 0 ); unsigned int z; double nunz, pz; double fz; double al, bt; for ( z=0; zgetNblocks(); z++ ) { fz = fznull ( z, data, nu ); nunz = nu*data->getNtrials ( z ); pz = data->getPcorrect ( z ); al = fz*nunz; bt = (1-fz)*nunz; l -= gammaln ( nunz ) - gammaln ( al ) - gammaln ( bt ); if (pz>0) l -= (al-1)*log(pz); else l += 1e10; if (pz<1) l -= (bt-1)*log(1-pz); else l += 1e10; } return l; }; double BetaPsychometric::deviance ( const std::vector& prm, const PsiData * data ) const { return 2*( negllikeli ( prm, data ) - negllikelinull ( data, prm[getNparams()-1] ) ); }; /******************************** Outlier model *****************************************/ double OutlierModel::getp ( const std::vector& prm ) const { if ( getNalternatives()<2 ) return prm[4]; else return prm[3]; } double OutlierModel::negllikeli ( const std::vector& prm, const PsiData* data ) const { if ( getNalternatives() != data->getNalternatives() ) throw BadArgumentError(); std::vector x ( data->getNblocks()-1 ); std::vector k ( data->getNblocks()-1 ); std::vector n ( data->getNblocks()-1 ); unsigned int i,j(0); double ll; double p; for ( i=0; igetNblocks(); i++ ) { if (i!=jout) { x[j] = data->getIntensity(i); k[j] = data->getNcorrect(i); n[j] = data->getNtrials(i); j++; } } PsiData * localdata = new PsiData ( x, n, k, data->getNalternatives() ); // for (i=0; igetNblocks(); i++) std::cerr << localdata->getIntensity(i) << " " << localdata->getNcorrect(i) << " " << localdata->getNtrials(i) << "\n"; p = getp( prm ); ll = PsiPsychometric::negllikeli ( prm, localdata ); ll -= data->getNoverK(jout); if (p>0) ll -= data->getNcorrect(jout) * log(p); if (p<1) ll -= ( data->getNtrials(jout)-data->getNcorrect (jout) ) * log ( 1-p ); delete localdata; return ll; } double OutlierModel::deviance ( const std::vector& prm, const PsiData* data ) const { unsigned int i; int n; double D(0); double x,y,p; for ( i=0; igetNblocks(); i++ ) { n = data->getNtrials(i); y = data->getPcorrect(i); x = data->getIntensity(i); if (i==jout) p = getp( prm ); else p = evaluate( x, prm ); if (y>0) D += n*y*log(y/p); if (y<1) D += n*(1-y)*log((1-y)/(1-p)); } if (D!=D) std::cerr << p << "\n"; D *= 2; return D; } double OutlierModel::neglpost ( const std::vector& prm, const PsiData* data ) const { unsigned int i; double l; l = negllikeli( prm, data); for (i=0; i 1 ) l += 1e10; return l; } psignifit3-3.0~beta.20120611.1/src/psychometric.h000066400000000000000000000437751176542545200212230ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef PSYCHOMETRIC_H #define PSYCHOMETRIC_H #include #include #include #include "core.h" #include "sigmoid.h" #include "errors.h" #include "prior.h" #include "data.h" #include "linalg.h" /** \brief Standard psychometric function model * * Standard model for the psychometric function that assumes that the number of correct responses is a * binomial random variable with parameters N (number of trials) and Psi, where Psi is * * Psi = guessingrate + (1-guessingrate-lapserate) * Sigmoid ( x | theta ) * * For an nAFC task, the guessingrate is typicall fixed at 1/n. * * The term Sigmoid ( x | theta ) is represented by two objects: * a PsiSigmoid f, that describes a nonlinear function from the real numbers to (0,1) and * a PsiCore g, that describes the "internal" workings of the nonlinear function. Thus, * the Term Sigmoid ( x | theta ) equals f(g(x,theta)). * * The object copies and manages its own memory. This means that when setting * PsiSigmoid and PsiCore in the constructor, as well as setting PsiPrior via * setPrior(), copies of the respective objects are made. Furthermore when the * object is destroyed theses copies are destoryed also. */ class PsiPsychometric { private: int Nalternatives; double guessingrate; bool gammaislambda; PsiCore * Core; PsiSigmoid * Sigmoid; std::vector priors; protected: PsiPsychometric ( int nAFC, ///< number of alternatives (1 indicating yes/no) PsiCore * core, ///< internal part of the nonlinear function PsiSigmoid * sigmoid, ///< "external" saturating part of the nonlinear function unsigned int nparameters ///< number of parameters given explicitely ); ///< Set up a psychometric function model for an nAFC task, explicitely specifiing the number of parameters (useful for derived classes) public: PsiPsychometric ( int nAFC, ///< number of alternatives in the task (1 indicating yes/no) PsiCore * core, ///< internal part of the nonlinear function (in many cases this is actually a linear function) PsiSigmoid * sigmoid ///< "external" saturating part of the nonlinear function ); ///< Set up a psychometric function model for an nAFC task (nAFC=1 ~> yes/no) ~PsiPsychometric ( void ); ///< destructor (also deletes the core and sigmoid objects) virtual double evaluate ( double x, ///< stimulus intensity const std::vector& prm ///< parameters of the psychometric function model ) const; ///< Evaluate the psychometric function at this position virtual double negllikeli ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< negative log likelihood virtual double neglpost ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data for which the posterior should be evaluated ) const; ///< negative log posterior (unnormalized) virtual double leastfavourable ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data, ///< data for which the likelihood should be evaluated double cut, ///< performance level at which the threshold should be evaluated bool threshold=true ///< should the calculations be performed for thresholds? (anything else is not yet implemented) ) const; ///< derivative of log likelihood in the least favourable direction in parameter space virtual double deviance ( const std::vector& prm, ///< parameters of the psychometric functin model const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< deviance for a given data set and parameter constellation virtual Matrix * ddnegllikeli ( const std::vector& prm, ///< parameters at which the second derivative should be evaluated const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< 2nd derivative of the negative log likelihood (newly allocated matrix) virtual std::vector dnegllikeli ( const std::vector& prm, ///< parameters at which the first derivative should be evaluated const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< 1st derivative of the negative log likelihood const PsiCore* getCore ( void ) const { return Core; } ///< get the core of the psychometric function const PsiSigmoid* getSigmoid ( void ) const { return Sigmoid; } ///< get the sigmoid of the psychometric function virtual void setPrior ( unsigned int index, PsiPrior* prior ) throw(BadArgumentError); ///< set a Prior for the parameter indicated by index double evalPrior ( unsigned int index, double x ) const {return priors[index]->pdf(x);} ///< evaluate the respective prior at value x virtual double randPrior ( unsigned int index ) const { return priors[index]->rand(); } ///< sample form a prior const PsiPrior* getPrior ( unsigned int index ) const { return priors[index]; } ///< get a prior int getNalternatives ( void ) const { return Nalternatives; } ///< get the number of alternatives (1 means yes/no) virtual unsigned int getNparams ( void ) const { return (Nalternatives==1 ? (gammaislambda ? 3 : 4 ) : 3 ); } ///< get the number of free parameters of the psychometric function virtual std::vector getStart ( const PsiData* data ) const ; ///< determine a starting value using logistic regression on a dataset double getThres ( const std::vector& prm, ///< parameters of the psychometric function model double cut ///< performance level at which the threshold should be evaluated ) const { return Core->inv(Sigmoid->inv(cut),prm); } ///< get the threshold at a cut between 0 and 1 double getSlope ( const std::vector& prm, ///< parameters of the psychometric function model double x ///< performance level at which the slope should be evaluated ) const { return Sigmoid->df ( Core->g ( x, prm ) ) * Core->dgx ( x, prm ); } ///< get the slope at a stimulus intensity std::vector getDevianceResiduals ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data for which the deviance residuals should be determined ) const; ///< deviance residuals for model checking double getRpd ( const std::vector& devianceresiduals, ///< deviance residuals as determined by getDevianceResiduals const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data set corresponding to the deviance residuals ) const; ///< correlation between deviance residuals and predictions double getRkd ( const std::vector& devianceresiduals, const PsiData* data ) const; ///< correlation between deviance residuals and block sequence double dllikeli ( std::vector prm, ///< parameters of the model const PsiData* data, ///< data for which the likelihood should be evaluated unsigned int i ///< index of the parameter for which the derivative should be evaluated ) const; ///< derivative of the negative loglikelihood with respect to parameter i virtual double dlposteri ( std::vector prm, ///< parameters of the psychometric function model const PsiData* data, ///< data for which the likelihood should be valuated unsigned int i ///< index of the parameter for which the derivative should be evaluated ) const; ///< derivative of the negative log posterior with respect to parameter i void setgammatolambda ( void ) { gammaislambda=true; }; ///< calling this function applies the constraint that gamma and lambda should be equal in a yes/no paradigm double getGuess ( const std::vector& prm ) const { return (gammaislambda ? prm[2] : ( getNalternatives() < 2 ? prm[3] : 1./Nalternatives )); } double dpredict ( const std::vector& prm, double x, unsigned int i ) const; ///< partial derivative of psychometric function prediction w.r.t. i-th parameter double ddpredict ( const std::vector& prm, double x, unsigned int i, unsigned int j ) const; ///< 2nd partial derivative of psychometric function prediction w.r.t. i-th and j-th parameters }; /** \brief psychometric function with Jeffrey's prior on the parameters * * A psychometric function model that has Jeffrey's improper, non-informative prior on the parameters * This model differs in two respects from the regular psychometric function model. * * First, you can't set priors for individual parameters. Jeffrey's prior applies to all parameters. * If you try to obtain a prior for a certain parameter, you will get a PsiPrior instance. This object will * also be used, if you try to sample from the priors. This holds for everything else that tries to access * the priors. * * Second, evaluating the neglpost method takes a bit longer -- Jeffrey's prior is realtively costly to evaluate. */ class PMF_with_JeffreysPrior : public PsiPsychometric { private: Matrix fisher; public: PMF_with_JeffreysPrior ( int nAFC, ///< number of alternatives in the task (1 indicating yes/no) PsiCore * core, ///< internal part of the nonlinear function (in many cases this is actually a linear function) PsiSigmoid * sigmoid ///< "external" saturating part of the nonlinear function ) : PsiPsychometric ( nAFC, core, sigmoid ), fisher(getNparams(), getNparams()) { } ///< Set up a psychometric function model for an nAFC task (nAFC=1 ~> yes/no) ~PMF_with_JeffreysPrior () { } double neglpost ( const std::vector& prm, const PsiData* data ) const; double dlposteri ( std::vector prm, ///< parameters of the psychometric function model const PsiData* data, ///< data for which the likelihood should be valuated unsigned int i ///< index of the parameter for which the derivative should be evaluated ) const; ///< derivative of the negative log posterior with respect to parameter i void setPrior ( unsigned int index, PsiPrior* prior ) throw(BadArgumentError) { throw BadArgumentError ( "With Jeffrey's prior, you can't set independent priors for individual parameters" ); } ///< set a Prior for the parameter indicated by index }; /** \brief Psychometric function that allows for models the variance of the data by a beta distribution * * When fitting psychometric functions, we usually assume independence of the responses. Is this independence is violated, * the binomial variance model is no longer adequate. The beta psychometric function can better deal with this. It fits an * additional parameter nu, such that the subjects responses are distributed according to a beta distribution with parameters * alpha = Psi(x)*nu*n+1, beta = (Psi(x)-1)*nu*n+1 */ class BetaPsychometric : public PsiPsychometric { private: double fznull ( unsigned int z, const PsiData* data, double nu ) const; double negllikelinull ( const PsiData* data, double nu ) const; public: BetaPsychometric ( int nAFC, PsiCore * core, PsiSigmoid * sigmoid ) : PsiPsychometric ( nAFC, core, sigmoid, ( nAFC<2 ? 5 : 4 ) ) {} double negllikeli ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< negative log likelihood std::vector dnegllikeli ( const std::vector& prm, ///< parameters at which the first derivative should be evaluated const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< 1st derivative of the negative log likelihood Matrix * ddnegllikeli ( const std::vector& prm, ///< parameters at which the second derivative should be evaluated const PsiData* data ///< data for which the likelihood should be evaluated ) const; ///< 2nd derivative of the negative log likelihood (newly allocated matrix) unsigned int getNparams ( void ) const { return PsiPsychometric::getNparams()+1; } ///< get the number of free parameters of the psychometric function double deviance ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData * data ///< data for which the likelihood should be evaluated ) const; ///< deviance for a given data set and parameter constellation std::vector getStart ( const PsiData* data ) const { std::vector out (PsiPsychometric::getStart ( data )); out[out.size()-1] = .99999; return out;} }; /** \brief Psychometric function with one separate data point * * Wichmann & Hill (2001) suggest to detect whether or not a data point x0 is an outlier by * fitting a new model to all data points except for the data point of interest and to use * a separate parameter to fit x0. If p is the number of correct trials at position x0, that is * * Psi(x0) = p * Psi(x) = guessingrate + (1-guessingrate-lapserate) * Sigmoid ( x | theta ), if x != x0 * * This model is then compared to the standard psychometric function model. * * Due to the discontinuity at x0, derivatives in this model are treated with respect to the * fitted function. */ class OutlierModel : public PsiPsychometric { private: unsigned int jout; double getp ( const std::vector& prm ) const; public: OutlierModel ( int nAFC, ///< number of alternatives in the task (1 indicating yes/no) PsiCore * core, ///< internal part of the nonlinear function PsiSigmoid * sigmoid, ///< "external" saturating part of the nonlinear function unsigned int exclude ///< index of the data block to be excluded ) : PsiPsychometric ( nAFC, core, sigmoid ), jout(exclude) {}; ///< set up a psychometric function model that treats one block separately void setexclude ( unsigned int exclude ) { jout = exclude; } ///< change the excluded block double negllikeli ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData * data ///< data for which the likelihood should be evaluated ) const; ///< negative log likelihood double neglpost ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData * data ///< data for which the likelihood should be evaluated ) const; ///< negative log likelihood double deviance ( const std::vector& prm, ///< parameters of the psychometric function model const PsiData* data ///< data for which the deviance should be evaluated ) const; ///< deviance unsigned int getNparams ( void ) const { return PsiPsychometric::getNparams()+1; } double randPrior ( unsigned int index ) const { return ( index /* Period parameters */ #define N 624 #define M 397 #define MATRIX_A 0x9908b0dfUL /* constant vector a */ #define UPPER_MASK 0x80000000UL /* most significant w-r bits */ #define LOWER_MASK 0x7fffffffUL /* least significant r bits */ static unsigned long mt[N]; /* the array for the state vector */ static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */ /* initializes mt[N] with a seed */ void init_genrand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti> 30)) + mti); /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */ /* In the previous versions, MSBs of the seed affect */ /* only MSBs of the array mt[]. */ /* 2002/01/09 modified by Makoto Matsumoto */ mt[mti] &= 0xffffffffUL; /* for >32 bit machines */ } } /* initialize by an array with array-length */ /* init_key is the array for initializing keys */ /* key_length is its length */ /* slight change for C++, 2004/2/26 */ void init_by_array(unsigned long init_key[], int key_length) { int i, j, k; init_genrand(19650218UL); i=1; j=0; k = (N>key_length ? N : key_length); for (; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; j++; if (i>=N) { mt[0] = mt[N-1]; i=1; } if (j>=key_length) j=0; } for (k=N-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; /* non linear */ mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */ i++; if (i>=N) { mt[0] = mt[N-1]; i=1; } } mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */ } /* generates a random number on [0,0xffffffff]-interval */ unsigned long genrand_int32(void) { unsigned long y; static unsigned long mag01[2]={0x0UL, MATRIX_A}; /* mag01[x] = x * MATRIX_A for x=0,1 */ if (mti >= N) { /* generate N words at one time */ int kk; if (mti == N+1) /* if init_genrand() has not been called, */ init_genrand(5489UL); /* a default initial seed is used */ for (kk=0;kk> 1) ^ mag01[y & 0x1UL]; } for (;kk> 1) ^ mag01[y & 0x1UL]; } y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; /* Tempering */ y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } /* generates a random number on [0,0x7fffffff]-interval */ long genrand_int31(void) { return (long)(genrand_int32()>>1); } /* generates a random number on [0,1]-real-interval */ double genrand_real1(void) { return genrand_int32()*(1.0/4294967295.0); /* divided by 2^32-1 */ } /* generates a random number on [0,1)-real-interval */ double genrand_real2(void) { return genrand_int32()*(1.0/4294967296.0); /* divided by 2^32 */ } /* generates a random number on (0,1)-real-interval */ double genrand_real3(void) { return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); /* divided by 2^32 */ } /* generates a random number on [0,1) with 53-bit resolution*/ double genrand_res53(void) { unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; return(a*67108864.0+b)*(1.0/9007199254740992.0); } /* These real versions are due to Isaku Wada, 2002/01/09 added */ /****** END OF MERSENNE TWISTER *****/ /* int main(void) { int i; unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; init_by_array(init, length); printf("1000 outputs of genrand_int32()\n"); for (i=0; i<1000; i++) { printf("%10lu ", genrand_int32()); if (i%5==4) printf("\n"); } printf("\n1000 outputs of genrand_real2()\n"); for (i=0; i<1000; i++) { printf("%10.8f ", genrand_real2()); if (i%5==4) printf("\n"); } return 0; } */ double PsiRandom::rngcall ( void ) { return genrand_real2(); } double GaussRandom::draw ( void ) { if ( good ) { good = 0; return y*sigma+mu; } else { do { x1 = 2*rngcall () - 1; x2 = 2*rngcall () - 1; w = x1*x1 + x2*x2; } while ( w >= 1.0 ); w = sqrt ( -2.*log(w)/w ); y = x2*w; good = true; return x1*w*sigma+mu; } } double BinomialRandom::draw ( void ) { int k(0),i; for (i=0; i Jöhnk. Erzeugung von betaverteilten und gammaverteilten zufallszahlen. Metrika 8:5-15. 1964. Notation and implementation from: Devroye, Luc. Non-uniform random variables generation. Springer, New York, 1986. http://cg.scs.carleton.ca/~luc/rnbookindex.html */ while (1) { U = rngcall(); V = rngcall(); X = pow(U, 1.0/alpha); Y = pow(V, 1.0/beta); if ( X + Y <= 1.0) { return (X/(X+Y)); } } } else { /* Sum of Gammas Algorithm */ Ga = grnga.draw(); Gb = grngb.draw(); return Ga/(Ga + Gb); } /* Alternative (possibly faster) algorithms: - UFPExact -> Mahlooji, Mehruzu, Farzan. Fast Generation of Deviates for Order Statistics by an Exact Method. Journal of Industrial and Systems Engineering. Vol.2 , No.4, pp 288-299. 2009. - Hörmann, Leydold. Continuous Random Variate Generation by Fast Numerical Inversion. ACM Trans. Model. Comput. Simul. 13(4): 347-362. 2003. Implementation: statmath.wu.ac.at/unuran */ } void setSeed(long int seedval){ unsigned long init[4]={0x123, 0x234, 0x345, 0x456}, length=4; unsigned long k; init_by_array(init, length); for ( k = 0; k #include #include "errors.h" class PsiRandom { public: PsiRandom ( void ) {} double rngcall ( void ); virtual double draw ( void ) { throw NotImplementedError(); } virtual PsiRandom * clone ( void ) const {throw NotImplementedError(); } }; class GaussRandom : public PsiRandom { private: double mu; double sigma; bool good; double x1; double x2; double w; double y; public: GaussRandom ( double mean=0, double standarddeviation=1 ) : mu ( mean ), sigma ( standarddeviation ), good ( false ) {} double draw ( void ); ///< draw a random number using box muller transform PsiRandom * clone ( void ) const { return new GaussRandom(*this); } }; class UniformRandom : public PsiRandom { private: double lower; double upper; public: UniformRandom ( double low=0, double up=1 ) : lower(low), upper(up) {} double draw ( void ) { return (upper-lower)*rngcall()+lower; } PsiRandom * clone ( void ) const { return new UniformRandom(*this); } }; class BinomialRandom : public PsiRandom { private: int n; double p; public: BinomialRandom ( int number, double probability ) : n(number), p(probability) {} double draw ( void ); void setprm ( int number, double probability ) { n = number; p = probability; } PsiRandom * clone ( void ) const { return new BinomialRandom(*this); } }; class GammaRandom : public PsiRandom { private: double k; double theta; GaussRandom grng; public: GammaRandom ( double shape, double scale ) : k (shape), theta(scale), grng() {} double draw ( void ); ///< draw a random number PsiRandom * clone ( void ) const { return new GammaRandom(*this); } }; class BetaRandom : public PsiRandom { private: double alpha; double beta; GammaRandom grnga; GammaRandom grngb; public: BetaRandom ( double alpha, double beta ) : alpha(alpha), beta(beta), grnga (alpha, 1), grngb (beta, 1) {} double draw ( void ); ///< draw a random number PsiRandom * clone ( void ) const { return new BetaRandom(*this); } }; void setSeed(long int seedval); #endif psignifit3-3.0~beta.20120611.1/src/sigmoid.cc000066400000000000000000000076521176542545200202750ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "sigmoid.h" #ifdef DEBUG_SIGMOID #include #endif /** Logistic Sigmoid **********************************************************/ double PsiLogistic::f ( double x ) const { #ifdef DEBUG_SIGMOID std::cerr << "In logistic function.\n"; #endif /* if (x!=lastx) { lastx = x; lastfx = 1./(1.+exp(-x)); } */ #ifdef DEBUG_SIGMOID std::cerr << " lastx = " << lastx << "\n lastfx = " << lastfx << "\n"; #endif return 1./(1.+exp(-x)); } double PsiLogistic::df ( double x ) const { return f(x)*(1-f(x)); } double PsiLogistic::ddf ( double x ) const { return f(x)*(1-f(x))*(1-2*f(x)); } /** Gauss Sigmoid *************************************************************/ double PsiGauss::f ( double x ) const { /* if (x==lastx) return lastf; else { lastx = x; lastf = Phi(x); return lastf; } */ return Phi(x); } double PsiGauss::df ( double x ) const { /* if (x==lastx_d) return lastdf; else { lastx_d = x; lastdf = exp ( - 0.5*x*x ) / sqrt(2*M_PI); return lastdf; } */ return exp ( - 0.5*x*x ) / sqrt(2*M_PI); } double PsiGauss::ddf ( double x ) const { /* if (x==lastx_dd) return lastddf; else { lastx_dd = x; lastddf = -x*df(x); return lastddf; } */ return -x*df(x); } double PsiGauss::inv ( double p ) const { /* if (p==lastp) return lastinvp; else { lastp = p; lastinvp = invPhi(p); return lastinvp; } */ return invPhi(p); } /** Gumbel_l Sigmoid *********************************************************/ double PsiGumbelL::f ( double x ) const { /* if (x!=lastx) { lastx = x; lastf = 1-exp(-exp(x)); } return lastf; */ return 1-exp(-exp(x)); } double PsiGumbelL::df ( double x ) const { /* if ( x!=lastdx ) { lastdx = x; lastdf = exp( x - exp(x)); } return lastdf; */ return exp( x - exp(x)); } double PsiGumbelL::ddf ( double x ) const { /* if ( x!=lastddx ) { lastddx = x; lastddf = exp ( x - exp(x) ) * (1-exp(x)); } return lastddf; */ return exp ( x - exp(x) ) * (1-exp(x)); } double PsiGumbelL::inv ( double p ) const { /* if ( p!=lastp ) { lastp = p; lastinvp = log(-log(1-p)); } return lastinvp; */ return log(-log(1-p)); } /** Gumbel_r Sigmoid **********************************************************/ double PsiGumbelR::f ( double x ) const { /* if (x!=lastx) { lastx = x; lastf = exp(-exp(-x)); } return lastf; */ return exp(-exp(-x)); } double PsiGumbelR::df ( double x ) const { /* if ( x!=lastdx ) { lastdx = x; lastdf = exp(-x-exp(-x)); } return lastdf; */ return exp(-x-exp(-x)); } double PsiGumbelR::ddf ( double x ) const { /* if ( x!=lastddx ) { lastddx = x; lastddf = exp ( -x - exp(-x) ) * (exp(-x)-1); } return lastddf; */ return exp ( -x - exp(-x) ) * (exp(-x)-1); } double PsiGumbelR::inv ( double p ) const { /* if ( p!=lastp ) { lastp = p; lastinvp = -log(-log(p)); } return lastinvp; */ return -log(-log(p)); } /** Cauchy Sigmoid ************************************************************/ double PsiCauchy::f ( double x ) const { return atan ( x )/M_PI + 0.5; } double PsiCauchy::df ( double x ) const { return 1./(M_PI*(1+x*x)); } double PsiCauchy::ddf ( double x ) const { return -2*x/( M_PI * (1+2*x*x+x*x*x*x) ); } double PsiCauchy::inv ( double p ) const { return tan ( M_PI*(p-0.5) ); } /** Exponential cdf ***********************************************************/ double PsiExponential::f ( double x ) const { if (x<0) return 0; else return 1-exp ( -x ); } double PsiExponential::df ( double x ) const { if (x<0) return 0; else return exp( -x ); } double PsiExponential::ddf ( double x ) const { if (x<0) return 0; else return -exp( -x ); } double PsiExponential::inv ( double p ) const throw(BadArgumentError) { if ( p>0 && p<1 ) return -log(1-p); else throw BadArgumentError("PsiExponential.inv is only valid in the range 0 #include /** \brief common base class for all sigmoids */ class PsiSigmoid { public: virtual double f ( double x ) const { throw NotImplementedError(); } ///< This should return the value of the sigmoid itself (between 0 and 1) virtual double df ( double x ) const { throw NotImplementedError(); } ///< This should give the first derivative of the sigmoid virtual double ddf ( double x ) const { throw NotImplementedError(); } ///< This should give the second derivative of the sigmoid virtual double inv ( double p ) const { throw NotImplementedError(); } ///< This should give the inverse of the sigmoid (taking values between 0 and 1) virtual int getcode ( void ) const { throw NotImplementedError(); } ///< return the sigmoid identifier virtual PsiSigmoid * clone ( void ) const { throw NotImplementedError(); } ///< clone object by value static std::string getDescriptor ( void ) { throw NotImplementedError(); }///< get a short string that identifies the type of sigmoid }; /** \brief identity function as sigmoid * * This is useful if the desired function cannot be separated to the form sigmoid + core * and the whole function has to be implemented in the core object. An example for this * case is the Naka-Rushton nonlinearity typically used to model electrophysiological * data. */ class PsiId : public PsiSigmoid { public: double f ( double x ) const { return x; } double df ( double x ) const { return 1; } double ddf ( double x ) const { return 0; } double inv ( double x ) const { return x; } int getcode ( void ) const { return 6; } PsiSigmoid * clone ( void ) const { return new PsiId(*this); } static std::string getDescriptor ( void ) { return "id"; } }; /** \brief logistic function * * The logistic function is given by f(x) = 1/(1+exp(-x)) */ class PsiLogistic : public PsiSigmoid { public: PsiLogistic ( void ) {} ///< constructor PsiLogistic ( const PsiLogistic& original) {} ///< copy constructor double f ( double x ) const; ///< value of the sigmoid at position x double df ( double x ) const; ///< derivative of the sigmoid at position x double ddf ( double x ) const; ///< second derivative of the sigmoid double inv ( double p ) const { return log(p/(1-p)); } ///< inverse of the sigmoid int getcode ( void ) const { return 1; } ///< return the sigmoid identifier PsiSigmoid * clone ( void ) const { return new PsiLogistic(*this); } static std::string getDescriptor ( void ) { return "logistic"; } }; /** \brief gaussian cdf function * * The gaussian cdf function is given by f(x) = Phi(x), where Phi is the cumulative distribution function for the gaussian distribution. */ class PsiGauss : public PsiSigmoid { public: PsiGauss ( void ) {} ///< constructor PsiGauss ( const PsiGauss& original) {} ///< copy constructor double f ( double x ) const; ///< value of the sigmoid at x double df ( double x ) const; ///< derivative of the sigmoid at x double ddf ( double x ) const; ///< second derivative of the sigmoid at x double inv ( double p ) const; ///< inverse of the sigmoid int getcode ( void ) const { return 2; } ///< return the sigmoid identifier PsiSigmoid * clone (void ) const { return new PsiGauss(*this); } static std::string getDescriptor ( void ) { return "gauss"; } }; /** \brief left-skewed gumbel cdf * * Cumulative densitiy function of the gumbel distribution. */ class PsiGumbelL : public PsiSigmoid { public: PsiGumbelL ( void ) {} ///< contructor PsiGumbelL ( const PsiGumbelL& original ) {} ///< copy constructor double f ( double x ) const; ///< returns the value of the gumbel cdf at position x double df ( double x ) const; ///< returns the derivative of the gumbel cdf at position x double ddf ( double x ) const; ///< returns the 2nd derivative of the gumbel cdf at position x double inv ( double p ) const; ///< returns the inverse of the gumbel cdf at position p int getcode ( void ) const { return 3; } ///< return the sigmoid identifier PsiSigmoid * clone ( void ) const { return new PsiGumbelL(*this); } static std::string getDescriptor ( void ) { return "gumbel_l"; } }; /** \brief right-skewed gumbel cdf * * Cumulative densitiy function of the gumbel distribution. */ class PsiGumbelR : public PsiSigmoid { public: PsiGumbelR ( void ) {} ///< constructor PsiGumbelR ( const PsiGumbelR& original ) {} ///< copy constructor double f ( double x ) const; ///< returns the value of the right skewed gumbel cdf at position x double df ( double x ) const; ///< returns the derivative of the right skewed gumbel cdf at position x double ddf ( double x ) const; ///< returns the 2nd derivative of the right skewed gumbel cdf at position x double inv ( double p ) const; ///< returns the inverse of the right skewed gumbel cdf at position p int getcode ( void ) const { return 6; } ///< return the sigmoid identifier PsiSigmoid * clone ( void ) const { return new PsiGumbelR(*this); } static std::string getDescriptor ( void ) { return "gumbel_r"; } }; /** \brief cauchy cdf * * Cumulative density function of the cauchy distribution */ class PsiCauchy : public PsiSigmoid { public: PsiCauchy( void ) {} ///< constructor PsiCauchy( const PsiCauchy& oiginal) {} ///< copy constructor double f ( double x ) const; ///< returns the value of the cauchy cdf at position x double df ( double x ) const; ///< returns the derivative of the cauchy cdf at position x double ddf ( double x ) const; ///< returns the 2nd derivative of the cauchy cdf at position x double inv ( double p ) const; ///< returns the inverse of the cauchy cdf at position x int getcode ( void ) const { return 4; }///< returns the sigmoid identifier PsiSigmoid * clone ( void ) const { return new PsiCauchy(*this); } static std::string getDescriptor ( void ) { return "cauchy"; } }; /** \brief exponential cdf * * Cumulative density function of the exponential distribution * combined with a polyCore this will give a weibull */ class PsiExponential : public PsiSigmoid { public: PsiExponential( void ) {} ///< constructor PsiExponential( const PsiExponential& oiginal) {} ///< copy constructor double f (double x ) const; ///< returns the value of the exponential cdf at position x double df (double x ) const; ///< returns the derivative of the exponential cdf at position x double ddf (double x ) const; ///< returns the 2nd derivative of the exponential cdf at position x double inv (double p ) const throw(BadArgumentError); ///< returns the return the inverse of the exponential cdf at position x int getcode ( void ) const { return 5; }///< returns the sigmoid identifier PsiSigmoid * clone ( void ) const { return new PsiExponential(*this); } static std::string getDescriptor ( void ) { return "exponential"; } }; #endif psignifit3-3.0~beta.20120611.1/src/special.cc000066400000000000000000000110201176542545200202420ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include "special.h" #include "errors.h" const double SQRT2PI ( sqrt(2*M_PI) ); double Phi ( double x ) { return 0.5*(1+erf(x/M_SQRT2)); } double invPhi ( double p ) { double x(0),step; double g,gprime; do { g = Phi(x)-p; gprime = exp(-0.5*x*x)/SQRT2PI; step = g/gprime; x -= step; } while (fabs(step)>1e-7); return x; } double safe_log ( double x ) { return (x>0 ? log(x) : -1e20); } double gammaln(double xx) { double x,y,tmp,ser; static double cof[6]={ 76.18009172947146, -86.50532032941677, 24.01409824083091, -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5 }; int j; y=x=xx; tmp=x+5.5; tmp -= (x+.5)*log(tmp); ser=1.000000000190015; for (j=0; j<=5; j++) ser += cof[j]/++y; return -tmp+log(2.5066282746310005*ser/x); } double gammainc ( double x, double a ) { double gm,h,dl, b,c,d,an; int i; gm = 0.; if ( x < a+1 ) { dl = exp ( gammaln ( a ) - gammaln ( a+1 ) ); // Series for ( i=0; i<2000; i++ ) { gm += dl; dl *= x/(a+1+i); if ( dl < 1e-7 ) break; } return exp ( -x+ a*log(x) - gammaln ( a ) ) * gm; } else { // Continued fraction gm = gammaln ( a ); b = x+1.-a; c = 1./1e-30; d = 1./b; h = d; for ( i=1; i<=2000; i++ ) { an = -i*(i-a); b += 2.; d = an*d+b; if ( fabs ( d ) < 1e-30 ) d = 1e-30; c = b + an/c; if ( fabs ( c ) < 1e-30 ) c = 1e-30; d = 1./d; dl = c*d; h *= dl; if ( fabs(dl-1.) < 1e-7 ) break; } return 1-exp ( -x+a*log(x)-gm)*h; } return gm; } double betaf(double z, double w) { return exp(gammaln(z)+gammaln(w)-gammaln(z+w)); } double betahelper ( double a, double b, double x ) { int m, m2; double aa, c, d, dl, h, qab, qam,qap; qab = a+b; qap = a+1; qam = a-1; c = 1.; d = 1.-qab*x/qap; if ( fabs(d) < 1e-30 ) d=1e-30; d = 1./d; h = d; for ( m=1; m<=200; m++ ) { // even terms m2 = 2*m; aa = m*(b-m)*x/((qam+m2)*(a+m2)); d = 1.+aa*d; c = 1.+aa/c; if ( fabs(d) < 1e-30 ) d=1e-30; if ( fabs(c) < 1e-30 ) c=1e-30; d = 1./d; h *= c*d; // odd terms aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2)); d = 1.+aa*d; c = 1.+aa/c; if ( fabs(d) < 1e-30 ) d = 1e-30; if ( fabs(c) < 1e-30 ) c = 1e-30; d = 1./d; dl = c*d; h *= dl; if ( fabs ( dl-1 ) < 1e-7 ) break; } return h; } double betainc ( double x, double a, double b ) { /* unsigned int i,m; double h(1), C(1), D(0), d, dl; i = 0; while (i++<2000) { if ( i%2==0 ) { m = i/2; d = m*(b-m)*x / ((a+2*m-1)*(a+2*m)); } else { m = (i-1)/2; d = - (a+m)*(a+b+m)*x / ( (a+2*m-1)*(a+2*m) ); } D = 1 + d*D; C = 1 + d/C; if ( D==0 ) d = 1e-30; if ( C==0 ) d = 1e-30; dl = C/D; h = dl*h; if ( fabs(dl-1) < 1e-7 ) break; } return pow ( x,a )*pow ( x, b ) / (a*betaf ( a, b ) ) * h; */ double bt; if ( x<0 || x>1 ) throw BadArgumentError ( "Invalid x value" ); if (x==0 || x==1) bt = 0; else bt = exp ( gammaln(a+b)-gammaln(a)-gammaln(b) + a*log(x)+b*log(1-x) ); if ( x < (a+1)/(a+b+2) ) return bt*betahelper ( a, b, x )/a; else return 1.-bt*betahelper ( b, a, 1.-x )/b; } double psi ( double z ) { /* This algorithm is based on two identities: * 1. The first is an approximation formula that works for large z * psi(z) ~ log(z) - 1./(2*z) - 1./12*z**2 + 1./120*z**4 - 1./252*z**6 + O(1./z**8) * See for example Abramowitz & Stegun eq 6.3.18 * 2. The second is a recursion formula (Abramowitz & Stegun eq 6.3.5) * psi(z+1) = psi(z) + 1./z * Thus, for sufficiently large z (z>6 results in accuracies of order 1e-9) we take the approximation * formula. For smaller z, we apply the second formula as a telescope. */ if ( z > 6 ) { return log ( z ) - 1./(2*z) - 1./(12*z*z) + 1./(120*z*z*z*z) - 1./(252*z*z*z*z*z*z); } else { return psi ( z+1 ) - 1./z; } } double digamma ( double z ) { /* * This algorithm is similar to that for evaluation of the psi function. * 1. There is again an approximation formula for large z * digamma(z) ~ 1./z + 1./(2*z**2) - 1./(6*z**3) + 1./(42*z**5) - 1./(30*z**9) + O(1./z**10) * See for example Abramowitz & Stegun eq 6.4.12 * 2. There is a recursion formula (Abraomowitz & Stegun eq 6.4.6 * digamma(z) ~ digamma(z+1) = digamma(z) - 1./z**2 * Again, we combine these two and use the recursion for z<5. This results in accuracies of order 1e-9. */ if ( z > 5 ) return 1./z + 1./(2*z*z) + 1./(6*z*z*z) - 1./(30*z*z*z*z*z) + 1./(42*z*z*z*z*z*z*z) - 1./(30*z*z*z*z*z*z*z*z*z); else return digamma ( z+1 ) + 1./(z*z); } psignifit3-3.0~beta.20120611.1/src/special.h000066400000000000000000000021571176542545200201170ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #ifndef SPECIAL_H #define SPECIAL_H #include #include /** \brief gaussian cumulative distribution function */ double Phi ( double x ); /** \brief inverse of the gaussian cumulative distribution function * * This function is really expensive. It inverts the gaussian cdf by performing a numerical * solution of the equation * Phi(x) - p = 0 */ double invPhi ( double p ); /** \brief logarithm that does not return nan but instead a very low value (-1e20) */ double safe_log ( double x ); /** \brief logarithm of the gamma function */ double gammaln ( double xx ); /** \brief incomplete unnormalized gamma function */ double gammainc ( double x, double a ); /** beta function */ double betaf ( double z, double w ); /** regularized incomplete beta function based on continued fractions */ double betainc ( double x, double al, double bt ); /** psi function, i.e. d log Gamma / dx */ double psi ( double z ); /** digamma (derivative of psi function) */ double digamma ( double z ); #endif psignifit3-3.0~beta.20120611.1/src/testing.h000066400000000000000000000054221176542545200201520ustar00rootroot00000000000000#ifndef TESTING_H #define TESTING_H #include #include #include #include #include #include class TestSuite { private: std::vector< int (*)(TestSuite*) > tests; std::fstream testlog; std::vector names; public: TestSuite ( const char* logfile ) { testlog.open( logfile, std::ios::out ); } ~TestSuite () { testlog.close(); } void addTest ( int (*test)(TestSuite*), const char* testname ) { tests.push_back ( test ); names.push_back ( std::string(testname) ); } int runTests ( void ) { int failed(0); unsigned int i; // std::list< int (*)(TestSuite*) > i; // for ( i=tests.begin(); i!=tests.end(); ++i ) // failed += (*i)(this); for ( i=0; i " << names[i] << " <============\n"; failed += tests[i](this); } std::clog << "\n==> " << failed << " tests failed\n"; return failed; } int isequal ( double x, double y, const char* testname, double accuracy=1e-7 ) { if ( fabs(x-y)y ) { std::clog << "[ OK ] " << testname << " value: " << x << " > " << y << "\n"; return 0; } else { std::clog << "[FAIL] " << testname << " value: " << x << " should be less than " << y << "\n"; testlog << testname << " value: " << x << " should be less than " << y << "\n"; return 1; } } int conditional ( bool condition, const char * testname ) { if ( condition ) { std::clog << "[ OK ] " << testname << " good \n"; return 0; } else { std::clog << "[FAIL] " << testname << "\n"; testlog << testname << "\n"; return 1; } } }; #endif psignifit3-3.0~beta.20120611.1/src/tests_all.cc000066400000000000000000001711421176542545200206300ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ #include #include #include "psychometric.h" #include "mclist.h" #include "bootstrap.h" #include "testing.h" #include "mcmc.h" #include "getstart.h" #include "integrate.h" #include #include #include #include #include int PsychometricValues ( TestSuite* T ) { int failures(0),i,j; char message[40]; std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); std::vector p ( 6 ); std::vector prm(3); std::vector dl ( 3 ); double d,l; std::vector prm1 ( 4 ); std::vector dl1 ( 4 ); // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 29; k[1] = 31; k[2] = 36; k[3] = 42; k[4] = 46; k[5] = 49; p[0] = 0.5311852; p[1] = 0.60013209; p[2] = 0.74; p[3] = 0.87986791;p[4] = 0.9488148; p[5] = 0.97136662; PsiData * data = new PsiData (x,n,k,2); // Set up psychometric function abCore * core = new abCore(); PsiLogistic * sigmoid = new PsiLogistic(); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); prm[0] = 4; prm[1] = 1.5; prm[2] = 0.02; // Test forward probabilities for ( i=0; i<6; i++ ) { sprintf(message,"PsychometricValues at x=%g", x[i]); failures += T->isequal ( pmf->evaluate(x[i],prm), p[i], message); } // Test likelihood failures += T->isequal ( pmf->negllikeli(prm,data), 11.996474658154325, "PsychometricValues likelihood"); // Test likelihood gradient dl = pmf->dnegllikeli ( prm, data ); l = pmf->negllikeli ( prm, data ); for ( i=0; i<3; i++ ) { prm[i] += 1e-5; d = pmf->negllikeli ( prm, data ) - l; d /= 1e-5; prm[i] -= 1e-5; failures += T->isequal ( dl[i], d, "PsychometricValues likelihood derivative", .05 ); } // Test likelihood hessian Matrix *H = pmf->ddnegllikeli ( prm, data ); dl = pmf->dnegllikeli ( prm, data ); for ( i=0; i<3; i++ ) { prm[i] += 1e-9; dl1 = pmf->dnegllikeli ( prm, data ); prm[i] -= 1e-9; for ( j=0; j<3; j++ ) { d = dl1[j] - dl[j]; d /= 1e-9; failures += T->isequal ( (*H)(i,j), -d, "Psychometric function likelihood Hessian", .1 ); } } delete H; delete pmf; // Yes no task pmf = new PsiPsychometric ( 1, core, sigmoid ); prm1[0] = 4; prm1[1] = 1.5; prm1[2] = 0.02; prm1[3] = 0.5; // Test likelihood failures += T->isequal ( pmf->negllikeli(prm1,data), 11.996474658154325, "PsychometricValues likelihood-1afc"); // Test likelihood gradient dl1 = pmf->dnegllikeli ( prm1, data ); l = pmf->negllikeli ( prm1, data ); for ( i=0; i<4; i++ ) { prm1[i] += 1e-5; d = pmf->negllikeli ( prm1, data ) - l; d /= 1e-5; prm1[i] -= 1e-5; failures += T->isequal ( dl1[i], d, "PsychometricValues likelihood-1afc derivative", .05 ); } delete pmf; pmf = new BetaPsychometric ( 2, core, sigmoid ); std::vector bprm(4); bprm[0] = 4; bprm[1] = 1.5; bprm[2] = .02; bprm[3] = 1; // Observe, that beta likelihood can also be > 1 implying that both signs for log likelihood are possible failures += T->isequal ( pmf->negllikeli(bprm,data), -11.3918, "PsychometricValues beta likelihood", 1e-4); // Test likelihood gradient dl = pmf->dnegllikeli ( bprm, data ); l = pmf->negllikeli ( bprm, data ); for ( i=0; i<4; i++ ) { bprm[i] += 1e-5; d = pmf->negllikeli ( bprm, data ) - l; d /= 1e-5; bprm[i] -= 1e-5; failures += T->isequal ( dl[i], d, "PsychometricValues beta likelihood derivative", .05 ); } // test likelihood hessian H = pmf->ddnegllikeli ( bprm, data ); // H->print(); for ( i=0; i<4; i++ ) { bprm[i] += 1e-9; dl1 = pmf->dnegllikeli ( bprm, data ); bprm[i] -= 1e-9; for ( j=0; j<4; j++ ) { d = dl1[j] - dl[j]; d /= 1e-9; // failures += T->isequal ( log10((*H)(i,j)/ d), 0, "Psychometric Values beta likelihood Hessian", .12 ); failures += T->isequal_rel ( (*H)(i,j), d, "Psychometric Values beta likelihood Hessian", .12 ); } } delete H; failures += T->ismore ( pmf->deviance ( bprm, data ), 0, "Psychometric Values beta deviance" ); delete pmf; delete core; delete sigmoid; delete data; return failures; } int DerivativeCheck ( TestSuite * T ) { /* Check all derivatives */ int failures (0); unsigned int i,j, coreindex; double d; double y1,y0; double x(2.); std::vector prm (3); prm[0] = 4.; prm[1] = 1.5; prm[2] = .02; char msg[500]; std::vector intensity ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); intensity[0] = 0.1; intensity[1] = 2.; intensity[2] = 4.; intensity[3] = 6.; intensity[4] = 8.; intensity[5] = 10.; k[0] = 29; k[1] = 31; k[2] = 36; k[3] = 42; k[4] = 46; k[5] = 49; PsiData * data = new PsiData (intensity,n,k,2); // Cores PsiCore* core; std::vector cores ( 8 ); std::vector corenames ( 8 ); cores[0] = new abCore (data); corenames[0] = new char [20]; sprintf ( corenames[0], "abCore"); cores[1] = new linearCore (data); corenames[1] = new char [20]; sprintf ( corenames[1], "linearCore"); cores[2] = new logCore (data); corenames[2] = new char [20]; sprintf ( corenames[2], "logCore"); cores[3] = new mwCore (data); corenames[3] = new char [20]; sprintf ( corenames[3], "mwCore"); cores[4] = new polyCore (data); corenames[4] = new char [20]; sprintf ( corenames[4], "polyCore"); cores[5] = new weibullCore (data); corenames[5] = new char [20]; sprintf ( corenames[5], "weibullCore"); cores[6] = new NakaRushton ( data ); corenames[6] = new char [20]; sprintf ( corenames[6], "NakaRushton"); cores[7] = new mwCore (data,3); corenames[3] = new char [20]; sprintf ( corenames[3], "mwCore (GumbelR)"); for ( coreindex=0; coreindexg ( x, prm ); for ( i=0; i<3; i++ ) { prm[i] += 1e-7; y1 = core->g ( x, prm ); prm[i] -= 1e-7; d = y1-y0; d /= 1e-7; sprintf ( msg, "%s 1st derivative w.r.t. prm %d", corenames[coreindex], i ); failures += T->isequal ( core->dg ( x, prm, i ), d, msg, 1e-3 ); } // Second derivative for ( i=0; i<3; i++ ) { y0 = core->dg ( x, prm, i ); for ( j=0; j<3; j++ ) { prm[j] += 1e-7; y1 = core->dg ( x, prm, i ); prm[j] -= 1e-7; d = y1-y0; d /= 1e-7; sprintf ( msg, "%s 2nd derivative w.r.t. prm %d and %d", corenames[coreindex], i, j ); failures += T->isequal ( core->ddg ( x, prm, i, j ), d, msg, 2.5*1e-3 ); } } delete cores[coreindex]; delete corenames[coreindex]; } // Sigmoids PsiSigmoid * sigmoid; std::vector sigmoids ( 6 ); std::vector sigmoidnames ( 6 ); sigmoids[0] = new PsiCauchy (); sigmoidnames[0] = new char [20]; sprintf ( sigmoidnames[0], "PsiCauchy" ); sigmoids[1] = new PsiExponential (); sigmoidnames[1] = new char [20]; sprintf ( sigmoidnames[1], "PsiExponential" ); sigmoids[2] = new PsiGauss (); sigmoidnames[2] = new char [20]; sprintf ( sigmoidnames[2], "PsiGauss" ); sigmoids[3] = new PsiGumbelL (); sigmoidnames[3] = new char [20]; sprintf ( sigmoidnames[3], "PsiGumbelL" ); sigmoids[4] = new PsiGumbelR (); sigmoidnames[4] = new char [20]; sprintf ( sigmoidnames[4], "PsiGumbelR" ); sigmoids[5] = new PsiLogistic (); sigmoidnames[5] = new char [20]; sprintf ( sigmoidnames[5], "PsiLogistic" ); sigmoids[6] = new PsiId (); sigmoidnames[6] = new char [20]; sprintf ( sigmoidnames[6], "PsiId" ); for ( coreindex=0; coreindexf ( x ); y1 = sigmoid->f ( x+1e-7 ); d = y1-y0; d /= 1e-7; sprintf ( msg, "%s 1st derivative", sigmoidnames[coreindex] ); failures += T->isequal ( sigmoid->df ( x ), d, msg, 1e-3 ); // Second derivative y0 = sigmoid->df ( x ); y1 = sigmoid->df ( x+1e-7 ); d = y1-y0; d /= 1e-7; sprintf ( msg, "%s 2nd derivative", sigmoidnames[coreindex] ); failures += T->isequal ( sigmoid->ddf ( x ), d, msg, 1e-3 ); delete sigmoids[coreindex]; delete sigmoidnames[coreindex]; } // Psychometric function core = new abCore(); sigmoid = new PsiLogistic (); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); delete core; delete sigmoid; // First derivatives y1 = pmf->evaluate ( x, prm ); for ( i=0; i<3; i++ ) { prm[i] += 1e-7; y0 = pmf->evaluate ( x, prm ); prm[i] -= 1e-7; d = y0-y1; d /= 1e-7; sprintf ( msg, "Psychometric function 1st derivative w.r.t. prm %d", i ); failures += T->isequal ( pmf->dpredict ( prm, x, i ), d, msg ); } // Second derivatives for ( i=0; i<3; i++ ) { for ( j=0; j<3; j++ ) { y0 = pmf->dpredict ( prm, x, i ); prm[j] += 1e-7; y1 = pmf->dpredict ( prm, x, i ); prm[j] -= 1e-7; d = y1 - y0; d /= 1e-7; sprintf ( msg, "Psychometric function 2nd derivative w.r.t. prm %d and %d", i, j ); failures += T->isequal ( pmf->ddpredict ( prm, x, i, j ), d, msg ); } } delete pmf; // Special functions // psi = d log(Gamma)/ d x for ( x=.5; x<55; x+=5 ) { y1 = gammaln ( x ); y0 = gammaln ( x+1e-7 ); d = y0-y1; d /= 1e-7; sprintf ( msg, "psi function at x=%g", x ); failures += T->isequal ( psi(x), d, msg, 1e-5 ); } // digamma = d psi / dx for ( x=.5; x<55; x+=5 ) { y1 = psi ( x ); y0 = psi ( x+1e-7 ); d = y0-y1; d /= 1e-7; sprintf ( msg, "digamma function at x=%g", x ); failures += T->isequal ( digamma(x), d, msg, 1e-5 ); } return failures; } int BetaModelTest ( TestSuite * T ) { int failures ( 0 ); std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 24; k[1] = 32; k[2] = 40; k[3] = 48; k[4] = 50; k[5] = 48; PsiData * data = new PsiData (x,n,k,2); PsiCore * core = new mwCore (); PsiSigmoid * sigmoid = new PsiLogistic (); PsiPrior * prior = new BetaPrior ( 2, 30 ); PsiPsychometric * pmf = new BetaPsychometric ( 2, core, sigmoid ); std::vector prm(4); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; prm[3] = .99; pmf->setPrior( 2, prior ); delete prior; prior = new UniformPrior ( 0, 1 ); pmf->setPrior( 3, prior ); delete prior; PsiOptimizer optimizer ( pmf, data ); std::vector mapestimate = optimizer.optimize ( pmf, data ); failures += T->isequal ( mapestimate[0], 3.99318, "Beta model MAP estimate m" , 1e-5 ); failures += T->isequal ( mapestimate[1], 3.87268, "Beta model MAP estimate w" , 1e-5 ); failures += T->isequal ( mapestimate[2], 0.02, "Beta model MAP estimate lambda", 1e-5 ); failures += T->isequal ( mapestimate[3], 0.99999, "Beta model MAP estimate nu" , 1e-5 ); setSeed(0); GenericMetropolis * gmS = new GenericMetropolis ( pmf, data, new GaussRandom() ); gmS->setTheta ( prm ); MCMCList pilot ( gmS->sample(1000) ); gmS->findOptimalStepwidth(pilot); MCMCList post = gmS->sample(3000); failures += T->isequal ( post.getMean ( 0 ), 3.33222, "Beta model MEAN estimate m" , 1e-5 ); failures += T->isequal ( post.getMean ( 1 ), 4.31489, "Beta model MEAN estimate w" , 1e-5 ); failures += T->isequal ( post.getMean ( 2 ), 0.0395864, "Beta model MEAN estimate lambda", 1e-5 ); failures += T->isequal ( post.getMean ( 3 ), 0.622763, "Beta model MEAN estimate nu" , 1e-5 ); return failures; } int OptimizerSolution ( TestSuite * T ) { int failures(0); unsigned int i; double deviance(0); /************************ * 2AFC */ std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 24; k[1] = 32; k[2] = 40; k[3] = 48; k[4] = 50; k[5] = 48; PsiData * data = new PsiData (x,n,k,2); // Set up psychometric function abCore * core = new abCore(); PsiLogistic * sigmoid = new PsiLogistic(); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); std::vector prm(4); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; PsiPrior *prior = new UniformPrior(0.,0.1); pmf->setPrior( 2, prior ); // Optimizer PsiOptimizer *opt = new PsiOptimizer (pmf, data); std::vector solution (4); solution = opt->optimize(pmf,data); std::vector devianceresiduals (pmf->getDevianceResiduals ( solution, data )); for ( i=0; iisequal(solution[0],3.29515,"OptimizerSolution 2AFC alpha",1e-2); failures += T->isequal(solution[1],0.960018,"OptimizerSolution 2AFC beta",1e-2); failures += T->isequal(solution[2],0.0190379,"OptimizerSolution 2AFC lambda",1e-3); failures += T->isequal(pmf->deviance(solution,data),3.98476,"OptimizerSolution 2AFC deviance",1e-2); failures += T->isequal(pmf->deviance(solution,data),deviance,"OptimizerSolution 2AFC deviance sum", 1e-7); failures += T->isequal(pmf->getRpd(devianceresiduals,solution,data),0.155395,"OptimizerSolution 2AFC Rpd",1e-2); failures += T->isequal(pmf->getRkd(devianceresiduals,data),-0.320889,"OptimizerSolution 2AFC Rkd",1e-2); delete pmf; delete data; delete opt; /************************ * Yes/No */ std::clog << "\n"; // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 3; k[1] = 10; k[2] = 34; k[3] = 45; k[4] = 50; k[5] = 50; data = new PsiData (x,n,k,2); // Set up psychometric function pmf = new PsiPsychometric ( 1, core, sigmoid ); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; prm[3] = 0.1; pmf->setPrior( 2, prior); pmf->setPrior( 3, prior); // Optimizer opt = new PsiOptimizer (pmf, data); solution = opt->optimize(pmf,data); devianceresiduals = pmf->getDevianceResiduals ( solution, data ); deviance = 0; for ( i=0; iisequal(solution[0],3.43942,"OptimizerSolution Y/N alpha",1e-2); failures += T->isequal(solution[1],0.988357,"OptimizerSolution Y/N beta", 5*1e-3); failures += T->isequal(solution[2],3.61604e-8,"OptimizerSolution Y/N lambda",5*1e-3); failures += T->isequal(solution[3],0.028935,"OptimizerSolution Y/N gamma",5*1e-3); failures += T->isequal(pmf->deviance(solution,data),2.08172,"OptimizerSolution Y/N deviance",1e-2); failures += T->isequal(pmf->deviance(solution,data),deviance,"OptimizerSolution Y/N deviance sum", 1e-7); failures += T->isequal(pmf->getRpd(devianceresiduals,solution,data),0.217146,"OptimizerSolution Y/N Rpd",1e-2); failures += T->isequal(pmf->getRkd(devianceresiduals,data),-0.477967,"OptimizerSolution Y/N Rkd",2e-2); delete pmf; delete opt; // Yes/No with gamma==lambda std::cerr << "\n"; pmf = new PsiPsychometric ( 1, core, sigmoid ); pmf->setgammatolambda (); opt = new PsiOptimizer ( pmf, data ); pmf->setPrior( 2, prior); solution = opt->optimize(pmf,data); failures += T->isequal ( solution[0], 3.3044829936747959, "Optimizer Solution Yes/No gamma=lambda, alpha", 1e-3 ); failures += T->isequal ( solution[1], 1.0698582800005716, "Optimizer Solution Yes/No gamma=lambda, beta", 1e-3 ); failures += T->isequal ( solution[2], 1.15629e-09, "Optimizer Solution Yes/No gamma=lambda, lambda", 1e-9 ); failures += T->isequal (pmf->deviance(solution,data),2.49387706984, "Optimizer Solution Yes/No gamma=lambda, deviance", 1e-2); delete pmf; delete data; delete opt; delete core; delete sigmoid; delete prior; return failures; } int InitialParametersTest ( TestSuite * T ) { int i, failures(0); std::vector x ( 4 ); std::vector k ( 4 ); std::vector n ( 4, 20 ); PsiPsychometric * pmf; PsiData * data; std::vector prm ( 3 ); for (i=1; i<=4; i++) { x[i-1] = i; k[i-1] = 10+(i-1)*3; } data = new PsiData ( x, n, k, 2 ); abCore * core = new abCore(); PsiLogistic * sigmoid = new PsiLogistic(); pmf = new PsiPsychometric ( 2, core, sigmoid ); prm = pmf->getStart ( data ); failures += T->ismore ( prm[1], 0, "PsiPsychometric->getStart() for increasing data" ); delete data; for (i=1; i<=4; i++) { x[i-1] = 5-i; } data = new PsiData ( x, n, k, 2 ); prm = pmf->getStart ( data ); failures += T->isless ( prm[1], 0, "PsiPsychometric->getStart() for decreasing data" ); delete data; delete pmf; delete core; delete sigmoid; return failures; } int BootstrapTest ( TestSuite * T ) { setSeed ( 0 ); int failures(0); unsigned int i; std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); char testname[40]; // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 24; k[1] = 32; k[2] = 40; k[3] = 48; k[4] = 50; k[5] = 48; PsiData * data = new PsiData (x,n,k,2); // Set up psychometric function abCore * core = new abCore(); PsiLogistic * sigmoid = new PsiLogistic(); PsiPrior * prior = new UniformPrior ( 0, .1 ); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); std::vector prm(4); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; pmf->setPrior( 2, prior ); std::vector cuts (1, 0.5); // BootstrapList boots = bootstrap ( 9999, data, pmf, cuts ); BootstrapList boots = bootstrap ( 999, data, pmf, cuts ); // Check against psignifit results // These values are subject to statistical variation. "equality" is defined relatively coarse failures += T->isless(boots.getAcc_t(0), 0.018662,"Acceleration constant (threshold)"); failures += T->isequal(boots.getBias_t(0), -0.0928786,"Bias (threshold)", .05); failures += T->isequal(boots.getThres(.1,0), 2.65266,"th(.1)", .05); failures += T->isequal(boots.getThres(.9,0), 3.89757,"th(.9)", .05); failures += T->isequal(boots.getAcc_s(0), -0.000155314, "Acceleration constant (slope)", .01); failures += T->isequal(boots.getBias_s(0), -0.0351, "Bias (slope)", .01); failures += T->isequal(boots.getSlope(0.1,0), 0.181289, "sl(.1)", .01); failures += T->isequal(boots.getSlope(0.9,0), 0.497512, "sl(.9)", .01); failures += T->isequal(boots.getDeviancePercentile(0.975),9.67016,"Deviance limits",.5); failures += T->isequal(boots.percRpd(.025), -0.451653, "Rpd( 2.5%)", .1); // Testing mean and standard error failures += T->isequal(boots.percRpd(.975), 0.632072, "Rpd(97.5%)", .1); failures += T->isequal(boots.percRkd(.025), -0.932597, "Rkd( 2.5%)", .1); failures += T->isequal(boots.percRkd(.975), 0.601175, "Rkd(97.5%)", .1); // Check for influential observations and outliers JackKnifeList jackknife = jackknifedata (data, pmf); std::vector ci_lower ( pmf->getNparams() ), ci_upper ( pmf->getNparams() ); for ( i=0; igetNparams(); i++ ) { ci_lower[i] = boots.getPercentile(0.025,i); ci_upper[i] = boots.getPercentile(0.975,i); } for ( i=0; i<6; i++ ) { sprintf(testname,"influential %d",i); failures += T->conditional(jackknife.influential(i,ci_lower,ci_upper)<1,testname); sprintf(testname,"outliers %d",i); failures += T->conditional(!jackknife.outlier(i),testname); } delete core; delete sigmoid; delete prior; delete pmf; delete data; return failures; } int MCMCTest ( TestSuite * T ) { int failures ( 0 ); std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 24; k[1] = 32; k[2] = 40; k[3] = 48; k[4] = 50; k[5] = 48; PsiData * data = new PsiData (x,n,k,2); // Set up psychometric function PsiCore * core = new abCore (); PsiSigmoid * sigmoid = new PsiLogistic(); PsiPrior * prior = new UniformPrior ( 0, .1 ); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); std::vector prm(3); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; pmf->setPrior( 2, prior ); MetropolisHastings * mhS = new MetropolisHastings( pmf, data, new GaussRandom() ); mhS->setTheta( prm ); mhS->setStepSize(0.1,0); mhS->setStepSize(0.1,1); mhS->setStepSize(0.001,2); GenericMetropolis * gmS = new GenericMetropolis ( pmf, data, new GaussRandom() ); gmS->setTheta ( prm ); /* // We don't use HybridMCMC anywhere HybridMCMC * S = new HybridMCMC ( pmf, data, 20 ); S->setTheta ( prm ); // This gives rather bad sampling but at least it gives something // We don't use the HybridMCMC anyhow S->setStepSize ( 0.013, 0 ); S->setStepSize ( 0.007, 1 ); S->setStepSize ( 0.001, 2 ); srand48(0); MCMCList post ( S->sample(1000) ); */ srand48(0); MCMCList mhpost ( mhS->sample(1000) ); srand48(0); MCMCList pilot ( mhS->sample(1000) ); gmS->findOptimalStepwidth(pilot); srand48(0); MCMCList gmpost = gmS->sample(1000); /* int i,j; for ( i=0; i<1000; i++ ) { for ( j=0; j<3; j++) std::cout << " " << post.getEst ( i, j ); std::cout << "\n"; } */ /* failures += T->isequal ( post.getMean(0), 3.58027, "Hybrid MCMC alpha", .3 ); failures += T->isequal ( post.getMean(1), 0.909616, "Hybrid MCMC beta", .2 ); failures += T->isequal ( post.getMean(2), 0.0217217, "Hybrid MCMC lambda", .02 ); */ failures += T->isequal ( mhpost.getMean(0), 3.22372, "Metropolis Hastings alpha", .2 ); failures += T->isequal ( mhpost.getMean(1), 1.12734, "Metropolis Hastings beta", .2 ); failures += T->isequal ( mhpost.getMean(2), 0.0199668, "Metropolis Hastings lambda", .02 ); failures += T->isequal ( gmpost.getMean(0), 3.22372, "Generic Metropolis MCMC alpha", .2 ); failures += T->isequal ( gmpost.getMean(1), 1.12734, "Generic Metropolis MCMC beta", .2 ); failures += T->isequal ( gmpost.getMean(2), 0.0199668, "Generic Metropolis MCMC lambda", .02 ); delete core; delete sigmoid; delete prior; delete pmf; delete mhS; // delete S; delete data; return failures; } int PriorTest ( TestSuite * T ) { int failures ( 0 ); PsiPrior * prior; prior = new PsiPrior; failures += T->isequal ( prior->pdf ( 0 ), 1, "Flat prior at 0" ); failures += T->isequal ( prior->dpdf ( 0 ) , 0, "Flat prior derivative at 0" ); delete prior; prior = new UniformPrior ( 0, 1 ); failures += T->isequal ( prior->pdf ( -.5 ) , 0, "Uniform prior at -0.5" ); failures += T->isequal ( prior->pdf ( .5 ) , 1, "Uniform prior at 0.5" ); failures += T->isequal ( prior->pdf ( 1.5 ) , 0, "Uniform prior at 1.5" ); failures += T->isequal ( prior->dpdf ( -.5 ) , 0, "Uniform prior derivative at -0.5" ); failures += T->isequal ( prior->dpdf ( .5 ) , 0, "Uniform prior derivative at 0.5" ); failures += T->isequal ( prior->dpdf ( 1.5 ) , 0, "Uniform prior derivative at 1.5" ); delete prior; prior = new GaussPrior ( 0, 1 ); failures += T->isequal ( prior->pdf ( -1 ), 0.24197072, "Gaussian prior at -1" ); failures += T->isequal ( prior->pdf ( 0 ), 0.39894228, "Gaussian prior at 0" ); failures += T->isequal ( prior->pdf ( 1 ), 0.24197072, "Gaussian prior at 1" ); failures += T->isequal ( prior->dpdf ( -1 ), 0.24197072, "Gaussian prior derivative at -1" ); failures += T->isequal ( prior->dpdf ( 0 ), 0, "Gaussian prior derivative at 0" ); failures += T->isequal ( prior->dpdf ( 1 ), -0.24197072, "Gaussian prior derivative at 1" ); delete prior; prior = new BetaPrior ( 1.5, 3. ); failures += T->isequal ( prior->pdf ( -.1 ), 0, "BetaPrior at 0" ); failures += T->isequal ( prior->pdf ( .1 ), 1.68094822, "BetaPrior at 0.1" ); failures += T->isequal ( prior->pdf ( .5 ), 1.16009706, "BetaPrior at 0.5" ); failures += T->isequal ( prior->pdf ( 1.1 ), 0, "BetaPrior at 1.1" ); failures += T->isequal ( prior->dpdf ( -.1 ), 0, "BetaPrior derivative at 0" ); failures += T->isequal ( prior->dpdf ( .1 ), 12.14018158, "BetaPrior derivative at 0.1" ); failures += T->isequal ( prior->dpdf ( .5 ), 5.80048531, "BetaPrior derivative at 0.5" ); failures += T->isequal ( prior->dpdf ( 1.1 ), 0, "BetaPrior derivative at 1.1" ); delete prior; prior = new GammaPrior ( 1.5, 3. ); failures += T->isequal ( prior->pdf ( -0.5 ), 0., "GammaPrior at -0.5" ); failures += T->isequal ( prior->pdf ( 0.5 ), 0.12997977, "GammaPrior at 0.5" ); failures += T->isequal ( prior->pdf ( 1.0 ), 0.15559955, "GammaPrior at 1.0" ); failures += T->isequal ( prior->pdf ( 1.5 ), 0.16131382, "GammaPrior at 1.5" ); failures += T->isequal ( prior->dpdf ( -0.5 ), 0., "GammaPrior derivative at -0.5" ); failures += T->isequal ( prior->dpdf ( 0.5 ), 0.08665318, "GammaPrior derivative at 0.5" ); failures += T->isequal ( prior->dpdf ( 1.0 ), 0.02593326, "GammaPrior derivative at 1.0" ); failures += T->isequal ( prior->dpdf ( 1.5 ), 0., "GammaPrior derivative at 1.5" ); delete prior; prior = new nGammaPrior ( 1.5, 3. ); failures += T->isequal ( prior->pdf ( 0.5 ), 0., "nGammaPrior at 0.5" ); failures += T->isequal ( prior->pdf ( -0.5 ), 0.12997977, "nGammaPrior at -0.5" ); failures += T->isequal ( prior->pdf ( -1.0 ), 0.15559955, "nGammaPrior at -1.0" ); failures += T->isequal ( prior->pdf ( -1.5 ), 0.16131382, "nGammaPrior at -1.5" ); failures += T->isequal ( prior->dpdf ( 0.5 ), 0., "nGammaPrior derivative at 0.5" ); failures += T->isequal ( prior->dpdf ( -0.5 ), -0.08665318, "nGammaPrior derivative at -0.5" ); failures += T->isequal ( prior->dpdf ( -1.0 ), -0.02593326, "nGammaPrior derivative at -1.0" ); failures += T->isequal ( prior->dpdf ( -1.5 ), 0., "nGammaPrior derivative at -1.5" ); delete prior; return failures; } int SigmoidTests ( TestSuite * T ) { int failures(0); PsiSigmoid * sigmoid; // Check gaussian cdf themselves failures += T->isequal(Phi(0),.5,"Phi(0)",1e-5); failures += T->isequal(invPhi(0.5),0.,"invPhi(0.5)",1e-5); failures += T->isequal(invPhi(Phi(.3)),.3,"invPhi(Phi(0.3))",1e-5); failures += T->isequal(Phi(invPhi(0.3)),.3,"Phi(invPhi(0.3))",1e-5); sigmoid = new PsiLogistic (); // Check specific function values // f should be 0.5 at 0 and close to 0 resp. 1 at low resp. high values failures += T->isequal ( sigmoid->f ( 0), 0.5, "PsiLogistic->f( 0)" ); failures += T->isless ( sigmoid->f (-3), 0.05, "PsiLogistic->f(-3)" ); failures += T->ismore ( sigmoid->f ( 3), 0.95, "PsiLogistic->f( 3)" ); // Check symmetry failures += T->isequal ( sigmoid->f ( 3), 1-sigmoid->f(-3), "PsiLogistic( 3)-PsiLogistic(-3)" ); // Check saturation // f should have low derivative at values far from 0 failures += T->isless ( sigmoid->df( 3), 0.05, "PsiLogistic->df(3)"); failures += T->isless ( sigmoid->df(-3), 0.05, "PsiLogistic->df(-3)"); // Check monotonicity double mindf(1e20),x,df; for ( x=-5; x<5; x+=0.1 ) if ( (df=sigmoid->df(x))ismore ( mindf, 0, "PsiLogistic monotonically increasing" ); // Check convexity // if x>0, ddf<0 // if x<0, ddf>0 failures += T->isless ( sigmoid->ddf(3), 0, "PsiLogistic->ddf(3)"); failures += T->ismore ( sigmoid->ddf(-3),0, "PsiLogistic->ddf(-3)"); delete sigmoid; sigmoid = new PsiGauss (); // Check specific function values failures += T->isequal ( sigmoid->f ( 0), 0.5, "PsiGauss->f( 0)" ); failures += T->isless ( sigmoid->f (-3), 0.01, "PsiGauss->f(-3)" ); failures += T->ismore ( sigmoid->f ( 3), 0.99, "PsiGauss->f( 3)" ); // Check symmetry failures += T->isequal ( sigmoid->f ( 3), 1-sigmoid->f(-3), "PsiGauss( 3)-PsiGauss(-3)" ); // Check monotonicity mindf = 1e20; for ( x=-5; x<5; x+=0.1 ) if ( (df=sigmoid->df(x))ismore ( mindf, 0, "PsiGaussian monotonically increasing" ); // Check saturation failures += T->isless ( sigmoid->df( 3), 0.01, "PsiGauss->df(3)"); failures += T->isless ( sigmoid->df(-3), 0.01, "PsiGauss->df(-3)"); // Check convexity failures += T->isless ( sigmoid->ddf(3), 0, "PsiGauss->ddf(3)"); failures += T->ismore ( sigmoid->ddf(-3),0, "PsiGauss->ddf(-3)"); delete sigmoid; sigmoid = new PsiGumbelL (); // Check specific function values failures += T->isequal ( sigmoid->f (0), 0.63212055882855767, "PsiGumbelL->f(0)"); failures += T->isequal ( sigmoid->f (-3), .048568007099546562, "PsiGumbelL->f(0)"); failures += T->isequal ( sigmoid->f (3), .99999999810782125, "PsiGumbelL->f(0)"); // Check asymmetry failures += T->ismore ( sigmoid->f ( 3 ), 1-sigmoid->f( -3 ), "PsiGumbelL( 3 )-PsiGumbelL (-3 )" ); // Check monotonicity mindf = 1e20; for (x=-5; x<5; x+=.1 ) if ( (df=sigmoid->df(x))ismore ( mindf, 0, "PsiGumbelL monotonically increasing" ); // Check saturation failures += T->isless ( sigmoid->df( 3), 0.01, "PsiGumbelL->df(3)"); failures += T->isless ( sigmoid->df(-3), 0.05, "PsiGumbelL->df(-3)"); // Check convexity failures += T->isless ( sigmoid->ddf(3), 0, "PsiGumbelL->ddf(3)"); failures += T->ismore ( sigmoid->ddf(-3),0, "PsiGumbelL->ddf(-3)"); delete sigmoid; sigmoid = new PsiGumbelR (); // Check specific function values failures += T->isequal ( sigmoid->f (0), 0.36787944117144233, "PsiGumbelR->f(0)"); failures += T->isequal ( sigmoid->f (-3), 1.8921786948382924e-09, "PsiGumbelR->f(0)"); failures += T->isequal ( sigmoid->f (3), .95143199290045344, "PsiGumbelR->f(0)"); // Check asymmetry failures += T->ismore ( 1-sigmoid->f ( -3 ), sigmoid->f( 3 ), "PsiGumbelR( -3 )-PsiGumbelR (3 )" ); // Check monotonicity mindf = 1e20; for (x=-5; x<5; x+=.1 ) if ( (df=sigmoid->df(x))ismore ( mindf, 0, "PsiGumbelR monotonically increasing" ); // Check saturation failures += T->isless ( sigmoid->df( 3), 0.05, "PsiGumbelR->df(3)"); failures += T->isless ( sigmoid->df(-3), 0.01, "PsiGumbelR->df(-3)"); // Check convexity failures += T->isless ( sigmoid->ddf(3), 0, "PsiGumbelR->ddf(3)"); failures += T->ismore ( sigmoid->ddf(-3),0, "PsiGumbelR->ddf(-3)"); delete sigmoid; sigmoid = new PsiCauchy (); // Check specific function values failures += T->isequal ( sigmoid->f ( 0 ), 0.5, "PsiCauchy->f(0)" ); double zalpha = -2*tan(M_PI*(0.1-0.5)); failures += T->isequal ( sigmoid->f(-0.5*zalpha), 0.1, "PsiCauchy->f(-z(0.1)*(-.5) )" ); failures += T->isequal ( sigmoid->f(0.5*zalpha), 0.9, "PsiCauchy->f( z(0.9)*.5 )" ); // Check monotonicity mindf = 1e20; for (x=-5; x<5; x+=.1 ) { if ( (df=sigmoid->df(x))ismore ( mindf, 0, "PsiCauchy monotonically increasing" ); // Check saturation failures += T->isless ( sigmoid->df( 3), 0.05, "PsiCauchy->df(3)"); failures += T->isless ( sigmoid->df(-3), 0.05, "PsiCauchy->df(-3)"); // Check convexity failures += T->isless ( sigmoid->ddf(3), 0, "PsiCauchy->ddf(3)"); failures += T->ismore ( sigmoid->ddf(-3),0, "PsiCauchy->ddf(-3)"); delete sigmoid; sigmoid = new PsiId (); // A number of values failures += T->isequal ( sigmoid->f ( -1. ), -1., "PsiId->f(-1)" ); failures += T->isequal ( sigmoid->f ( 0. ), 0., "PsiId->f(0)" ); failures += T->isequal ( sigmoid->f ( 1. ), 1., "PsiId->f( 1)" ); // df failures += T->isequal ( sigmoid->df ( -1. ), 1., "PsiId->df(-1)" ); failures += T->isequal ( sigmoid->df ( 0. ), 1., "PsiId->df( 0)" ); failures += T->isequal ( sigmoid->df ( 1. ), 1., "PsiId->df( 1)" ); // ddf failures += T->isequal ( sigmoid->ddf ( -1. ), 0., "PsiId->ddf(-1)" ); failures += T->isequal ( sigmoid->ddf ( 0. ), 0., "PsiId->ddf( 0)" ); failures += T->isequal ( sigmoid->ddf ( 1. ), 0., "PsiId->ddf( 1)" ); // inv failures += T->isequal ( sigmoid->inv ( sigmoid->f ( -1. ) ), -1., "PsiId->inv(PsiId->f(-1))" ); failures += T->isequal ( sigmoid->inv ( sigmoid->f ( 0. ) ), 0., "PsiId->inv(PsiId->f( 0))" ); failures += T->isequal ( sigmoid->inv ( sigmoid->f ( 1. ) ), 1., "PsiId->inv(PsiId->f( 1))" ); return failures; } int CoreTests ( TestSuite * T ) { int failures(0); PsiCore * core; PsiData * data; std::vector *x; std::vector *k,*n; unsigned int i; double th; std::vector prm(4,0); std::vector prm2(4,0); core = new abCore; prm[0] = 3.; prm[1] = 2.; failures += T->isequal ( core->g(3.,prm),0, "abCore at threshold"); failures += T->isequal ( core->dgx(3.,prm),1./prm[1], "abCore derivative stimulus"); failures += T->isequal ( core->dg(3.,prm,0),-1./prm[1], "abCore derivative 0"); failures += T->isequal ( core->dg(3.,prm,1),0, "abCore derivative 1"); failures += T->isequal ( core->ddg(3.,prm,0,0),0, "abCore 2nd derivative 0,0"); failures += T->isequal ( core->ddg(3.,prm,0,1),1./(prm[1]*prm[1]), "abCore 2nd derivative 0,1"); failures += T->isequal ( core->ddg(3.,prm,1,1),0, "abCore 2nd derivative 1,1"); failures += T->isequal ( core->g(core->inv(2.,prm),prm),2, "abCore inversion g(inv(2))"); failures += T->isequal ( core->inv(core->g(2.,prm),prm),2, "abCore inversion inv(g(2))"); failures += T->isequal ( core->dinv(2.,prm,0),1., "abCore inversion dinv(2,0)"); failures += T->isequal ( core->dinv(2.,prm,1),2., "abCore inversion dinv(2,1)"); // TODO: Transform tests delete core; core = new mwCore (NULL, 1,0.1); prm[0] = 3.; prm[1] = 2.; failures += T->isequal ( core->g(3.,prm),0, "mwCore at threshold"); failures += T->isequal ( core->dgx(3.,prm),log(9.), "mwCore derivative stimulus"); failures += T->isequal ( core->dg(3.,prm,0),-log(9.), "mwCore derivative 0"); failures += T->isequal ( core->dg(3.,prm,1),0, "mwCore derivative 1"); failures += T->isequal ( core->ddg(3.,prm,0,0),0, "mwCore 2nd derivative 0,0"); failures += T->isequal ( core->ddg(3.,prm,0,1),0.5*log(9.), "mwCore 2nd derivative 0,1"); failures += T->isequal ( core->ddg(3.,prm,1,1),0, "mwCore 2nd derivative 1,1"); failures += T->isequal ( core->g(core->inv(2.,prm),prm),2, "mwCore inversion g(inv(2))"); failures += T->isequal ( core->inv(core->g(2.,prm),prm),2, "mwCore inversion inv(g(2))"); failures += T->isequal ( core->dinv(2.,prm,0),1., "mwCore inversion dinv(2,0)"); failures += T->isequal ( core->dinv(2.,prm,1),1./log(9.), "mwCore inversion dinv(2,1)"); // TODO: Transform Tests delete core; // Tests for m and w with all sigmoids std::vector sigmoids ( 6 ); std::vector sigmnames ( 6 ); sigmoids[0] = new PsiLogistic(); sigmnames[0] = new char [20]; sprintf ( sigmnames[0], "Logistic" ); sigmoids[1] = new PsiGauss(); sigmnames[1] = new char [20]; sprintf ( sigmnames[1], "Gauss" ); sigmoids[2] = new PsiGumbelL(); sigmnames[2] = new char [20]; sprintf ( sigmnames[2], "GumbelL" ); sigmoids[3] = new PsiCauchy(); sigmnames[3] = new char [20]; sprintf ( sigmnames[3], "Cauchy" ); sigmoids[4] = new PsiExponential(); sigmnames[4] = new char [20]; sprintf ( sigmnames[4], "Exponential" ); sigmoids[5] = new PsiGumbelR(); sigmnames[5] = new char [20]; sprintf ( sigmnames[5], "GumbelR" ); prm[0] = 4; prm[1] = 2; char message[40]; prm[0] = 3.; for (i=0; igetcode(), 0.1 ); sprintf(message,"mwCore (m) for Psi%s", sigmnames[i]); failures += T->isequal ( sigmoids[i]->f(core->g(prm[0],prm)), 0.5, message ); sprintf(message,"mwCore (w) for Psi%s", sigmnames[i]); failures += T->isequal ( core->inv(sigmoids[i]->inv(0.9),prm) - core->inv(sigmoids[i]->inv(0.1),prm), prm[1], message ); delete core; delete sigmoids[i]; delete sigmnames[i]; } core = new linearCore; prm2 = prm; th = -2./3; failures += T->isequal ( core->g(th,prm), 0, "linearCore at threshold"); failures += T->isequal ( core->dgx(3.,prm),prm[0], "linearCore derivative stimulus"); failures += T->isequal ( core->dg(th,prm,0), th, "linearCore derivative(0) at threshold"); failures += T->isequal ( core->dg(th,prm,1), 1., "linearCore derivative(1) at threshold"); failures += T->isequal ( core->ddg(th,prm,0,0), 0, "linearCore derivative(0,0) at threshold"); failures += T->isequal ( core->ddg(th,prm,1,0), 0, "linearCore derivative(0,0) at threshold"); failures += T->isequal ( core->ddg(th,prm,1,1), 0, "linearCore derivative(0,0) at threshold"); failures += T->isequal ( core->ddg(th,prm,0,1), core->ddg(th,prm,1,0), "linearCore 2nd derivative symmetry at threshold"); failures += T->isequal ( core->inv(0,prm),th, "linearCore inverse threshold"); failures += T->isequal ( core->g(core->inv(2.,prm),prm), 2., "linearCore inverse g(inv(2))"); failures += T->isequal ( core->inv(core->g(2.,prm),prm), 2., "linearCore inverse inv(g(2))"); prm2[0] += 1e-8; failures += T->isequal ( core->dinv(2.,prm,0), (core->inv(2,prm2)-core->inv(2.,prm))/1e-8, "linearCore inverse derivative(0)"); prm2[0] = prm[0]; prm2[1] += 1e-8; failures += T->isequal ( core->dinv(2.,prm,1), (core->inv(2,prm2)-core->inv(2.,prm))/1e-8, "linearCore inverse derivative(1)"); prm2[1] = prm[1]; delete core; x = new std::vector (6,0); k = new std::vector (6,0); n = new std::vector (6,50); for (i=0; i<6; i++) (*x)[i] = 2*i+.1; (*k)[0] = 24; (*k)[1] = 32; (*k)[2] = 40; (*k)[3] = 48; (*k)[4] = 50; (*k)[5] = 48; data = new PsiData ( *x, *n, *k, 2 ); core = new logCore ( data ); th = exp(-2./3); failures += T->isequal ( core->g(th,prm), 0, "logCore at threshold"); failures += T->isequal ( core->dgx(3.,prm),prm[0]/3., "linearCore derivative stimulus"); failures += T->isequal ( core->dg(th,prm,0), log(th), "logCore derivative(0) at threshold"); failures += T->isequal ( core->dg(th,prm,1), 1, "logCore derivative(1) at threshold"); failures += T->isequal ( core->ddg(th,prm,0,0), 0, "logCore derivative(0,0) at threshold"); failures += T->isequal ( core->ddg(th,prm,1,0), 0, "logCore derivative(1,0) at threshold"); failures += T->isequal ( core->ddg(th,prm,1,1), 0, "logCore derivative(1,1) at threshold"); failures += T->isequal ( core->ddg(th,prm,0,1), core->ddg(th,prm,1,0), "logCore 2nd derivative symmetry at threshold"); failures += T->isequal ( core->inv(0,prm), th, "logCore inverse"); failures += T->isequal ( core->inv(core->g(2.,prm),prm),2., "logCore inversion g(inv(2))"); failures += T->isequal ( core->g(core->inv(2.,prm),prm),2., "logCore inversion inv(g(2))"); prm2[0] += 1e-8; failures += T->isequal ( core->dinv(2.,prm,0), (core->inv(2,prm2)-core->inv(2,prm))/1e-8, "logCore inversion dinv(2,0)"); prm2[0] = prm[0]; prm2[1] += 1e-8; failures += T->isequal ( core->dinv(2.,prm,1), (core->inv(2,prm2)-core->inv(2,prm))/1e-8, "logCore inversion dinv(2,1)"); prm2[1] = prm[1]; delete core; core = new NakaRushton ( data ); prm2[0] = 4.; prm2[1] = 2.; prm2[2] = .02; prm = prm2; th = prm2[0]; failures += T->isequal ( core->g(th,prm), 0.5, "NakaRushton at threshold"); failures += T->isequal ( core->dgx(2.,prm), 96./400., "NakaRushton derivative stimulus"); // Derivatives are tested separately failures += T->isequal ( core->inv(0.5,prm), th, "NakaRushton inverse"); failures += T->isequal ( core->inv(core->g(2.,prm),prm),2., "NakaRushton inversion inv(g(2))"); failures += T->isequal ( core->g(core->inv(.5,prm),prm),.5, "NakaRushton inversion g(inv(0.5))"); prm2[0] += 1e-8; failures += T->isequal ( core->dinv(.2,prm,0), (core->inv(.2,prm2)-core->inv(.2,prm))/1e-8, "NakaRushton inversion dinv(2,0)"); prm2[0] = prm[0]; prm2[1] += 1e-8; failures += T->isequal ( core->dinv(.2,prm,1), (core->inv(.2,prm2)-core->inv(.2,prm))/1e-8, "NakaRushton inversion dinv(2,1)"); prm2[1] = prm[1]; delete core; delete data; delete x; delete k; delete n; return failures; } int LinalgTests ( TestSuite * T ) { // These tests compare the results with the respective numpy/scipy routines int failures (0); Matrix *M = new Matrix (3,3); std::vector x(3),b(3); (*M)(0,0) = 0.75; (*M)(0,1) = 0.52; (*M)(0,2) = -.16; (*M)(1,0) = 0.52; (*M)(1,1) = 1.38; (*M)(1,2) = -.42; (*M)(2,0) = -.16; (*M)(2,1) = -.42; (*M)(2,2) = 0.53; Matrix *I = M->inverse(); failures += T->isequal ( (*I)(0,0), 1.80488979, "Inverse (0,0)" ); failures += T->isequal ( (*I)(1,0), -0.67772799, "Inverse (1,0)" ); failures += T->isequal ( (*I)(2,0), 0.00780493, "Inverse (2,0)" ); failures += T->isequal ( (*I)(0,1), -0.67772799, "Inverse (0,1)" ); failures += T->isequal ( (*I)(1,1), 1.20943876, "Inverse (1,1)" ); failures += T->isequal ( (*I)(2,1), 0.75382604, "Inverse (2,1)" ); failures += T->isequal ( (*I)(0,2), 0.00780493, "Inverse (0,2)" ); failures += T->isequal ( (*I)(1,2), 0.75382604, "Inverse (1,2)" ); failures += T->isequal ( (*I)(2,2), 2.48652024, "Inverse (2,2)" ); delete I; b[0] = 1; b[1] = 0.5; b[2] = 0; x = M->solve(b); failures += T->isequal ( x[0], 1.4660258, "solving Ax=b, x[0]" ); failures += T->isequal ( x[1], -0.0730086, "solving Ax=b, x[1]" ); failures += T->isequal ( x[2], 0.38471795, "solving Ax=b, x[2]" ); I = M->cholesky_dec (); failures += T->isequal ( (*I)(0,0), 0.8660254, "Cholesky (0,0)" ); failures += T->isequal ( (*I)(1,0), 0.60044428, "Cholesky (1,0)" ); failures += T->isequal ( (*I)(2,0), -0.18475209, "Cholesky (2,0)" ); failures += T->isequal ( (*I)(0,1), 0. , "Cholesky (0,1)" ); failures += T->isequal ( (*I)(1,1), 1.00968642, "Cholesky (1,1)" ); failures += T->isequal ( (*I)(2,1), -0.30610164, "Cholesky (2,1)" ); failures += T->isequal ( (*I)(0,2), 0. , "Cholesky (0,2)" ); failures += T->isequal ( (*I)(1,2), 0. , "Cholesky (1,2)" ); failures += T->isequal ( (*I)(2,2), 0.63416753, "Cholesky (2,2)" ); delete I; I = M->lu_dec (); failures += T->isequal ( (*I)(0,0), 0.75 , "LU (0,0)" ); failures += T->isequal ( (*I)(1,0), 0.69333333, "LU (1,0)" ); failures += T->isequal ( (*I)(2,0), -0.21333333, "LU (2,0)" ); failures += T->isequal ( (*I)(0,1), 0.52 , "LU (0,1)" ); failures += T->isequal ( (*I)(1,1), 1.01946667, "LU (1,1)" ); failures += T->isequal ( (*I)(2,1), -0.30316505, "LU (2,1)" ); failures += T->isequal ( (*I)(0,2), -0.16 , "LU (0,2)" ); failures += T->isequal ( (*I)(1,2), -0.30906667, "LU (1,2)" ); failures += T->isequal ( (*I)(2,2), 0.40216845, "LU (2,2)" ); delete I; b = (*M)*x; failures += T->isequal ( b[0], 1., "Ax=b, b[0]" ); failures += T->isequal ( b[1], .5, "Ax=b, b[1]" ); failures += T->isequal ( b[2], 0., "Ax=b, b[2]" ); T->isequal ( M->symmetric(), 1., "M should be symmetric" ); int i,j; I = new Matrix (3,3); for (i=0; i<3; i++) for (j=0; j<3; j++) (*I)(i,j) = (*M)(i,j); I->scale(2); for (i=0; i<3; i++) for (j=0; j<3; j++) failures += T->isequal ( (*I)(i,j), 2*(*M)(i,j), "matrix scaling" ); delete I; // Test that should only give the right solution with pivoting (*M)(0,0) = 11; (*M)(0,1) = 44; (*M)(0,2) = 1; (*M)(1,0) = .1; (*M)(1,1) = .4; (*M)(1,2) = 3; (*M)(2,0) = 0; (*M)(2,1) = 1; (*M)(2,2) =-1; b[0] = b[1] = b[2] = 1; x = M->solve(b); // We need pivoting only to make sure that we are not blown off completely. failures += T->isequal ( x[0], -5.26445, "pivot Ax=b, x[0]", .025 ); failures += T->isequal ( x[1], 1.33131, "pivot Ax=b, x[1]", .02 ); failures += T->isequal ( x[2], 0.331307, "pivot Ax=b, x[2]", .02 ); delete M; return failures; } int ReturnTest ( TestSuite * T ) { // In some cases, jackkifing doesn't terminate PsiCore * core = new mwCore ( NULL, 1, 0.1 ); PsiSigmoid * sigmoid = new PsiLogistic (); PsiPsychometric *pmf = new PsiPsychometric ( 2, core, sigmoid ); // std::vector x (5); x[0] = 1; x[1] = 2; x[2] = 3; x[3] = 4; x[4] = 5; // std::vector k (5,10); k[1] = 9; k[2] = 8; // std::vector n (5,10); std::vector x (3); x[0] = 3.8091348774813367; x[1] = 4.3712635982077179; x[2] = 6.0913291693220737; std::vector k (3,20); k[0] = 16; std::vector n (3,20); PsiData * data = new PsiData ( x, n, k, 2 ); pid_t childpid; int hang; pid_t phang; if ((childpid = fork()) == 0) { // Run the optimizer in a child process with a limited amount of time PsiOptimizer *opt = new PsiOptimizer ( pmf, data ); std::vector solution ( opt->optimize ( pmf, data ) ); delete opt; delete data; delete core; delete sigmoid; delete pmf; exit(0); // If we got this far, we kill the child process } else { sleep(3); // We wait 3s for the child. Otherweise, we consider it as a failure. phang = waitpid ( childpid, &hang, WNOHANG ); if (phang!=0) kill ( childpid, 9 ); // The optimizer process can be killed delete data; delete core; delete sigmoid; delete pmf; return T->isequal ( !phang, 0, "optimizer hung" ); } } int GetstartTest ( TestSuite * T ) { int failures (0); /************************ * 2AFC */ std::vector x ( 6 ); std::vector n ( 6, 50 ); std::vector k ( 6 ); double xmin,xmax; double ymin,ymax; // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 3; k[1] = 10; k[2] = 34; k[3] = 45; k[4] = 50; k[5] = 50; PsiData *data = new PsiData (x,n,k,1); // Set up psychometric function PsiPrior *prior = new UniformPrior(0.,0.1); abCore * core = new abCore(); PsiLogistic * sigmoid = new PsiLogistic(); PsiPsychometric *pmf = new PsiPsychometric ( 1, core, sigmoid ); std::vector prm(4); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; prm[3] = 0.1; pmf->setPrior( 2, prior); pmf->setPrior( 3, prior); std::vector start; start = getstart ( pmf, data, 7, 3, 3 ); failures += T->isequal ( start[0], 3.33333, "yes-no: Starting value for alpha", 1e-5 ); failures += T->isequal ( start[1], 1.03704, "yes-no: Starting value for beta", 1e-5 ); failures += T->isequal ( start[2], 0.00185185, "yes-no: Starting value for lambda", 1e-5 ); failures += T->isequal ( start[3], 0.0166667, "yes-no: Starting value for gamma", 1e-5 ); a_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 0, &ymin, &ymax ); failures += T->isequal ( xmin, 0, "yes-no: minimum of alpha range", 1e-5 ); failures += T->isequal ( xmax, 10, "yes-no: maximum of alpha range", 1e-5 ); failures += T->isequal ( ymin, 0, "yes-no: minimum of alpha range", 1e-5 ); failures += T->isequal ( ymax, 10, "yes-no: maximum of alpha range", 1e-5 ); b_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 1, &ymin, &ymax ); failures += T->isequal ( xmin, 2.0, "yes-no: minimum of beta range", 1e-5 ); failures += T->isequal ( xmax, 10.0, "yes-no: maximum of beta range", 1e-5 ); failures += T->isequal ( ymin, 2.0, "yes-no: minimum of beta range", 1e-5 ); failures += T->isequal ( ymax, 10.0, "yes-no: maximum of beta range", 1e-5 ); lm_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 2, &ymin, &ymax ); failures += T->isequal ( xmin, 0, "yes-no: minimum of lambda range", 1e-5 ); failures += T->isequal ( xmax, .1, "yes-no: maximum of lambda range", 1e-5 ); failures += T->isequal ( ymin, 0, "yes-no: minimum of lambda range", 1e-5 ); failures += T->isequal ( ymax, .1, "yes-no: maximum of lambda range", 1e-5 ); gm_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 3, &ymin, &ymax ); failures += T->isequal ( xmin, 0, "yes-no: minimum of gamma range", 1e-5 ); failures += T->isequal ( xmax, .1, "yes-no: maximum of gamma range", 1e-5 ); failures += T->isequal ( ymin, 0, "yes-no: minimum of gamma range", 1e-5 ); failures += T->isequal ( ymax, .1, "yes-no: maximum of gamma range", 1e-5 ); delete data; delete pmf; // Set up data x[0] = 0.; x[1] = 2.; x[2] = 4.; x[3] = 6.; x[4] = 8.; x[5] = 10.; k[0] = 24; k[1] = 32; k[2] = 40; k[3] = 48; k[4] = 50; k[5] = 48; data = new PsiData (x,n,k,2); // Set up psychometric function pmf = new PsiPsychometric ( 2, core, sigmoid ); prm[0] = 4; prm[1] = 0.8; prm[2] = 0.02; pmf->setPrior( 2, prior ); start = getstart( pmf, data, 7, 3, 3); failures += T->isequal ( start[0], 3.33333, "2afc: Starting value for alpha", 1e-5 ); failures += T->isequal ( start[1], 0.888889, "2afc: Starting value for beta", 1e-5 ); failures += T->isequal ( start[2], 0.0203704, "2afc: Starting value for lambda", 1e-5 ); a_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 0, &ymin, &ymax ); failures += T->isequal ( xmin, 0, "2afc: minimum of alpha range", 1e-5 ); failures += T->isequal ( xmax, 10, "2afc: maximum of alpha range", 1e-5 ); failures += T->isequal ( ymin, 0, "2afc: minimum of alpha range", 1e-5 ); failures += T->isequal ( ymax, 10, "2afc: maximum of alpha range", 1e-5 ); b_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 1, &ymin, &ymax ); failures += T->isequal ( xmin, 2.0, "2afc: minimum of beta range", 1e-5 ); failures += T->isequal ( xmax, 10.0, "2afc: maximum of beta range", 1e-5 ); failures += T->isequal ( ymin, 2.0, "2afc: minimum of beta range", 1e-5 ); failures += T->isequal ( ymax, 10.0, "2afc: maximum of beta range", 1e-5 ); lm_range ( data, &xmin, &xmax ); parameter_range ( data, pmf, 2, &ymin, &ymax ); failures += T->isequal ( xmin, 0, "2afc: minimum of lambda range", 1e-5 ); failures += T->isequal ( xmax, .1, "2afc: maximum of lambda range", 1e-5 ); failures += T->isequal ( ymin, 0, "2afc: minimum of lambda range", 1e-5 ); failures += T->isequal ( ymax, .1, "2afc: maximum of lambda range", 1e-5 ); delete core; delete sigmoid; delete prior; std::vector pmin ( 3, 0 ); std::vector pmax ( 3, .5 ); pmax[2] = .05; std::vector u; char txt[200]; unsigned int i; PsiGrid grid ( pmin, pmax, 5 ); for ( i=0; i<3; i++ ) { sprintf ( txt, "grid parameter %d lower limit", i ); failures += T->isequal ( grid.get_lower(i), pmin[i], txt, 1e-5 ); sprintf ( txt, "grid parameter %d upper limit", i ); failures += T->isequal ( grid.get_upper(i), pmax[i], txt, 1e-5 ); } failures += T->isequal ( grid.empty(), false, "grid.empty() on nonempty grid" ); failures += T->isequal ( PsiGrid().empty(), true, "grid.empty() on empty grid" ); failures += T->isequal ( grid.dimension(), 3, "grid.dimension() on 3d grid" ); failures += T->isequal ( grid.get_gridsize(), 5, "grid.get_gridsize() on small grid" ); u = grid.front(); failures += T->isequal ( u[0], 0.000, "grid.front()[0]" ); failures += T->isequal ( u[1], 0.125, "grid.front()[1]" ); failures += T->isequal ( u[2], 0.250, "grid.front()[2]" ); failures += T->isequal ( u[3], 0.375, "grid.front()[3]" ); failures += T->isequal ( u[4], 0.500, "grid.front()[4]" ); PsiGrid newgrid; u = std::vector ( 3, .125 ); newgrid = grid.shift ( u ); u = newgrid.front(); failures += T->isequal ( u[0], -0.125, "shifted grid.front()[0]" ); failures += T->isequal ( u[1], 0., "shifted grid.front()[1]", 1e-5 ); failures += T->isequal ( u[2], 0.125, "shifted grid.front()[2]", 1e-5 ); failures += T->isequal ( u[3], 0.25, "shifted grid.front()[3]", 1e-5 ); failures += T->isequal ( u[4], 0.375, "shifted grid.front()[4]", 1e-5 ); u = std::vector ( 3, .125 ); newgrid = grid.shrink ( u ); u = newgrid.front (); failures += T->isequal ( u[0], 0., "shrunken grid.front()[0]" ); failures += T->isequal ( u[1], 0.0625, "shrunken grid.front()[1]", 1e-5 ); failures += T->isequal ( u[2], 0.125, "shrunken grid.front()[2]", 1e-5 ); failures += T->isequal ( u[3], 0.1875, "shrunken grid.front()[3]", 1e-5 ); failures += T->isequal ( u[4], 0.25, "shrunken grid.front()[4]", 1e-5 ); newgrid = grid.subgrid (); failures += T->isequal ( newgrid.dimension(), 2, "subgrid dimension" ); u = linspace ( 0,1,3 ); failures += T->isequal ( u[0], 0, "linspace 0" ); failures += T->isequal ( u[1], 0.5, "linspace 1" ); failures += T->isequal ( u[2], 1, "linspace 2" ); std::list< std::vector > gridpoints; std::list< std::vector >::iterator i_gp; grid = PsiGrid ( pmin, pmax, 2 ); makegridpoints ( grid, u, 0, &gridpoints ); failures += T->isequal ( gridpoints.size(), 8, "Number of generated gridpoints from 2x2x2 grid" ); for ( i=0, i_gp=gridpoints.begin(); i_gp!=gridpoints.end(); i_gp++, i++ ) { sprintf ( txt, "gridpoint %d first param", i ); failures += T->isequal ( (*i_gp)[0], (i<4 ? 0 : 0.5), txt ); sprintf ( txt, "gridpoint %d second param", i ); failures += T->isequal ( (*i_gp)[1], ((i/2)%2 == 0 ? 0 : 0.5), txt ); sprintf ( txt, "gridpoint %d third param", i ); failures += T->isequal ( (*i_gp)[2], (i%2 == 0 ? 0 : 0.05), txt ); } std::list< std::vector > bestprm; std::list< double > L; evalgridpoints ( gridpoints, &bestprm, &L, data, pmf, 2 ); failures += T->isequal ( L.front(), 35.4381, "Best fit on grid", 1e-4 ); failures += T->isequal ( L.back(), 43.346 , "Second best fit on grid", 1e-4 ); failures += T->isequal ( bestprm.front()[0], .5, "Best fitting alpha on grid" ); failures += T->isequal ( bestprm.front()[1], .5, "Best fitting beta on grid" ); failures += T->isequal ( bestprm.front()[2], .05, "Best fitting lambda on grid" ); failures += T->isequal ( bestprm.back()[0], .0, "Second best fitting alpha on grid" ); failures += T->isequal ( bestprm.back()[1], .5, "Second best fitting beta on grid" ); failures += T->isequal ( bestprm.back()[2], .05, "Second best fitting lambda on grid" ); gridpoints = std::list< std::vector > (0); std::list< PsiGrid > newgrids; bestprm.pop_back(); // Delete the last element to keep number of points small updategridpoints ( grid, bestprm, &gridpoints, &newgrids ); for ( i=0, i_gp=gridpoints.begin(); i_gp!=gridpoints.end(); i_gp++, i++ ) { sprintf ( txt, "gridpoint %d first param", i ); failures += T->isequal ( (*i_gp)[0], (i<4 ? 0.25 : 0.75), txt ); sprintf ( txt, "gridpoint %d second param", i ); failures += T->isequal ( (*i_gp)[1], ((i/2)%2 == 0 ? .25 : 0.75), txt ); sprintf ( txt, "gridpoint %d third param", i ); failures += T->isequal ( (*i_gp)[2], (i%2 == 0 ? .025 : 0.075), txt ); } delete data; delete pmf; return failures; } int IntegrateTest ( TestSuite * T ) { int failures (0); unsigned int i; std::vector intensity ( 6 ); std::vector ncorrect ( 6 ); std::vector ntrials ( 6, 50 ); intensity[0] = 0.; ncorrect[0] = 24; intensity[1] = 2.; ncorrect[1] = 32; intensity[2] = 4.; ncorrect[2] = 40; intensity[3] = 6.; ncorrect[3] = 48; intensity[4] = 8.; ncorrect[4] = 50; intensity[5] = 10.; ncorrect[5] = 48; PsiData * data = new PsiData ( intensity, ntrials, ncorrect, 2 ); mwCore * core = new mwCore(); PsiLogistic * sigmoid = new PsiLogistic(); PsiPsychometric * pmf = new PsiPsychometric ( 2, core, sigmoid ); //std::vector grid; //std::vector tar ( 7 ); //std::vector start ( 3 ); //grid = raw_grid ( data, pmf, 0, 7 ); //failures += T->isequal ( grid[0], 0, "Lower bound of m" ); //failures += T->isequal ( grid[6], 10, "Upper bound of m" ); //failures += T->isequal ( grid.size(), 7, "Length of m grid" ); //grid = raw_grid ( data, pmf, 1, 7 ); //failures += T->isequal ( grid[0], 2, "Lower bound of w" ); //failures += T->isequal ( grid[6], 10, "Upper bound of w" ); //failures += T->isequal ( grid.size(), 7, "Length of w grid" ); //grid = raw_grid ( data, pmf, 2, 7 ); //failures += T->isequal ( grid[0], 0, "Lower bound of lm" ); //failures += T->isequal ( grid[6], 0.1, "Upper bound of lm" ); //failures += T->isequal ( grid.size(), 7, "Length of lm grid" ); //PsiPrior * dist = new GaussPrior ( 0, 1 ); //tar[0] = -1.28155157; //tar[1] = -0.72791329; //tar[2] = -0.34069483; //tar[3] = 0.; //tar[4] = 0.34069483; //tar[5] = 0.72791329; //tar[6] = 1.28155157; //grid = cdf_grid ( dist, 0.1, 0.9, 7 ); //for ( i=0; i<7; i++ ) { // failures += T->isequal ( grid[i], tar[i], "cdf_grid Gauss", 1e-4 ); // tar[i] = dist->pdf ( grid[i] ); //} //start[0] = -2; start[1] = 1.5; start[2] = -9; //start = fit_posterior ( grid, tar, start, 0 ); //failures += T->isequal ( start[0], 0, "fit_posterior Gauss mean", 1e-4 ); //failures += T->isequal ( start[1], 1, "fit_posterior Gauss std", 1e-4 ); //delete dist; //dist = new GammaPrior ( 4, 1 ); //tar[0] = 1.74476956; //tar[1] = 2.4572856; //tar[2] = 3.06204868; //tar[3] = 3.67206075; //tar[4] = 4.35885352; //tar[5] = 5.23689165; //tar[6] = 6.68078307; //grid = cdf_grid ( dist, 0.1, 0.9, 7 ); //for ( i=0; i<7; i++ ) { // failures += T->isequal ( grid[i], tar[i], "cdf_grid Gamma", 1e-4 ); // tar[i] = dist->pdf ( grid[i] ); //} //start[0] = 2; start[1] = 1.5; start[2] = -9; //start = fit_posterior ( grid, tar, start, 1 ); //failures += T->isequal ( start[0], 4, "fit_posterior Gamma shape", 1e-3 ); //failures += T->isequal ( start[1], 1, "fit_posterior Gamma scale", 1e-3 ); //delete dist; //dist = new BetaPrior ( 2, 20 ); //tar[0] = 0.025617; //tar[1] = 0.043710; //tar[2] = 0.060631; //tar[3] = 0.078644; //tar[4] = 0.099659; //tar[5] = 0.127175; //tar[6] = 0.172935; //grid = cdf_grid ( dist, 0.1, 0.9, 7 ); //for ( i=0; i<7; i++ ) { // failures += T->isequal ( grid[i], tar[i], "cdf_grid Beta", 1e-4 ); // tar[i] = dist->pdf ( grid[i] ); //} //start = fit_posterior ( grid, tar, start, 2 ); //failures += T->isequal ( start[0], 2, "fit_posterior Beta alpha", 1e-3 ); //failures += T->isequal ( start[1], 20, "fit_posterior Beta beta", 1e-2 ); //delete dist; //PsiIndependentPosterior posterior = independent_marginals ( pmf, data, 3, 7 ); //failures += T->isequal ( posterior.get_posterior ( 0 )->getprm ( 0 ), 3.280, "Posterior for m -- mu", 1e-3 ); //failures += T->isequal ( posterior.get_posterior ( 0 )->getprm ( 1 ), 0.436, "Posterior for m -- sg", 1e-3 ); //failures += T->isequal ( posterior.get_posterior ( 1 )->getprm ( 0 ), 12.732, "Posterior for w -- k", 1e-3 ); //failures += T->isequal ( posterior.get_posterior ( 1 )->getprm ( 1 ), 0.362, "Posterior for w -- th", 1e-3 ); //failures += T->isequal ( posterior.get_posterior ( 2 )->getprm ( 0 ), 3.170, "Posterior for lm -- al", 1e-3 ); //failures += T->isequal ( posterior.get_posterior ( 2 )->getprm ( 1 ), 111.26, "Posterior for lm -- bt", 1e-3 ); //MCMCList samples = sample_posterior ( pmf, data, posterior, 600 ); //failures += T->isequal ( samples.getMean ( 0 ), posterior.get_posterior ( 0 )->getprm ( 0 ), "Sampled and fitted posterior mean for m", .2 ); //failures += T->isequal ( samples.getMean ( 1 ), // posterior.get_posterior ( 1 )->getprm ( 0 ) * posterior.get_posterior ( 1 )->getprm(1), // "Sampled and fitted posterior mean for w", 1e-2 ); //failures += T->isequal ( samples.getMean ( 2 ), // posterior.get_posterior ( 2 )->getprm ( 0 ) / ( posterior.get_posterior ( 2 )->getprm(0)+posterior.get_posterior ( 2 )->getprm(1) ), // "Sampled and fitted posterior mean for lm", 1e-2 ); //failures += T->isless ( samples.get_accept_rate (), 0.1, "number of duplicates in SIR" ); //sample_diagnostics ( pmf, data, &samples ); //// Simply check whether these values have been set (i.e. whether they are not 0) //failures += T->isequal ( samples.getRkd ( 0 )!=0, true, "Rkd is set" ); //failures += T->isequal ( samples.getRpd ( 0 )!=0, true, "Rpd is set" ); //failures += T->isequal ( samples.getlogratio ( 0, 0 )!=0, true, "logratio is set" ); //failures += T->isequal ( samples.getppRkd ( 0 )!=0, true, "ppRkd is set" ); //failures += T->isequal ( samples.getppRpd ( 0 )!=0, true, "ppRpd is set" ); //failures += T->isequal ( samples.getppData ( 0 ).size(), 6, "ppData is set" ); //failures += T->isequal ( samples.getdeviance ( 0 )!= 0, true, "Deviance is set" ); //failures += T->isequal ( samples.getppDeviance ( 0 )!= 0, true, "ppDeviance is set" ); /* This is if you want to get the fits to plot them with gnuplot double x; unsigned int myprm ( 0 ); std::vector wgrid; std::vector wmargin; for ( myprm=0; myprm<3; myprm++ ) { wmargin = posterior.get_margin ( myprm ); wgrid = posterior.get_grid ( myprm ); x = posterior.get_posterior ( myprm )->pdf ( wgrid[4] ) / wmargin[4]; for ( i=0; i<7; i++ ) { wmargin[i] *= x; std::cout << wgrid[i] << " " << wmargin[i] << "\n"; } std::cout << "\n\n"; if ( myprm < 2 ) for ( x=0; x<10; x+=.1 ) { std::cout << x << " " << posterior.get_posterior ( myprm )->pdf ( x ) << "\n"; } else for ( x=0; x<.1; x+=.001 ) { std::cout << x << " " << posterior.get_posterior ( myprm )->pdf ( x ) << "\n"; } std::cout << "\n\n"; } */ return failures; } int main ( int argc, char ** argv ) { TestSuite Tests ( "tests_all.log" ); Tests.addTest(&PsychometricValues, "Values of the psychometric function"); // Tests.addTest(&BetaModelTest, "Beta psychometric function model"); Tests.addTest(&DerivativeCheck, "Derivaties of elements" ); Tests.addTest(&OptimizerSolution, "Solutions of optimizer"); Tests.addTest(&BootstrapTest, "Bootstrap properties"); Tests.addTest(&SigmoidTests, "Properties of sigmoids"); Tests.addTest(&CoreTests, "Tests of core objects"); Tests.addTest(&MCMCTest, "MCMC"); Tests.addTest(&PriorTest, "Priors"); Tests.addTest(&LinalgTests, "Linear algebra routines"); Tests.addTest(&ReturnTest, "Testing return bug in jackknifedata"); Tests.addTest(&InitialParametersTest, "Initial parameter heuristics" ); Tests.addTest(&GetstartTest, "Finding good starting values" ); Tests.addTest ( &IntegrateTest, "Approximate numerical integration" ); int failed = Tests.runTests(); if (failed > 0){ exit(2); } } psignifit3-3.0~beta.20120611.1/swignifit/000077500000000000000000000000001176542545200175355ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/swignifit/__init__.py000066400000000000000000000007011176542545200216440ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### from interface_methods import bootstrap, mcmc, mapestimate, diagnostics, asir def set_seed(value): swignifit_raw.setSeed(value) psignifit3-3.0~beta.20120611.1/swignifit/interface_methods.py000066400000000000000000000670221176542545200236010ustar00rootroot00000000000000#/usr/bin/env python # encoding: utf-8 # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### import numpy as np import swignifit.swignifit_raw as sfr import swignifit.utility as sfu import operator as op def bootstrap(data, start=None, nsamples=2000, nafc=2, sigmoid="logistic", core="ab", priors=None, cuts=None, parametric=True, gammaislambda=False ): """ Parametric bootstrap of a psychometric function. Parameters ---------- data : A list of lists or an array of data. The first column should be stimulus intensity, the second column should be number of correct responses (in 2AFC) or number of yes- responses (in Yes/No), the third column should be number of trials. See also: the examples section below. start : sequence of floats of length number of model parameters Generating values for the bootstrap samples. If this is None, the generating value will be the MAP estimate. Length should be 4 for Yes/No and 3 for nAFC. nsamples : number Number of bootstrap samples to be drawn. nafc : int Number of alternatives for nAFC tasks. If nafc==1 a Yes/No task is assumed. sigmoid : string Name of the sigmoid to be fitted. Valid sigmoids include: logistic gauss gumbel_l gumbel_r See `swignifit.utility.available_sigmoids()` for all available sigmoids. core : string \"core\"-type of the psychometric function. Valid choices include: ab (x-a)/b mw%g midpoint and width linear a+bx log a+b log(x) See `swignifit.utility.available_cores()` for all available sigmoids. priors : sequence of strings length number of parameters Constraints on the likelihood estimation. These are expressed in the form of a list of prior names. Valid prior choices include: Uniform(%g,%g) Gauss(%g,%g) Beta(%g,%g) Gamma(%g,%g) nGamma(%g,%g) if an invalid prior or `None` is selected, no constraints are imposed at all. See `swignifit.utility.available_priors()` for all available sigmoids. cuts : a single number or a sequence of numbers. Cuts indicating the performances that should be considered 'threshold' performances. This means that in a 2AFC task, cuts==0.5 the 'threshold' is somewhere around 75%% correct performance, depending on the lapse rate parametric boolean to indicate whether or not the bootstrap procedure should be parametric or not. parametric : boolean If `True` do parametric, otherwise do a non-parametric bootstrap. gammaislambda : boolean Set the gamma == lambda prior. Returns ------- (samples,estimates,deviance, threshold, th_bias, th_acceleration, slope, slope_bias, slope_accelerateion Rkd,Rpd,outliers,influential) samples : numpy array, shape: (nsamples, nblocks) the bootstrap sampled data estimates : numpy array, shape: (nsamples, nblocks) estimated parameters associated with the data sets deviance : numpy array, length: nsamples deviances for the bootstraped datasets threshold : numpy array, shape: (nsamples, ncuts) thresholds/cuts for each bootstraped datasets th_bias : numpy array, shape: (ncuts) the bias term associated with the threshold th_acc : numpy array, shape: (ncuts) the acceleration constant associated with the threshold slope : numpy array, shape: (nsamples, ncuts) slope at each cuts for each bootstraped datasets sl_bias : numpy array, shape: (ncuts) bias term associated with the slope sl_acc : numpy array, shape: (ncuts) acceleration term associated with the slope Rkd : numpy array, length: nsamples correlations between block index and deviance residuals Rpd : numpy array, length: nsamples correlations between model prediction and deviance residuals outliers : numpy array of booleans, length nblocks points that are outliers influential : numpy array of booleans, length nblocks points that are influential observations Example ------- >>> x = [float(2*k) for k in xrange(6)] >>> k = [34,32,40,48,50,48] >>> n = [50]*6 >>> d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] >>> priors = ('flat','flat','Uniform(0,0.1)') >>> samples,est,D,thres,thbias,thacc,slope,slbias,slacc,Rkd,Rpd,out,influ \ = bootstrap(d,nsamples=2000,priors=priors) >>> np.mean(est[:,0]) 2.7547034408466811 >>> mean(est[:,1]) 1.4057297989923003 """ dataset, pmf, nparams = sfu.make_dataset_and_pmf(data, nafc, sigmoid, core, priors, gammaislambda=gammaislambda) cuts = sfu.get_cuts(cuts) ncuts = len(cuts) if start is not None: start = sfu.get_start(start, nparams) bs_list = sfr.bootstrap(nsamples, dataset, pmf, cuts, start, True, parametric) jk_list = sfr.jackknifedata(dataset, pmf) nblocks = dataset.getNblocks() # construct the massive tuple of return values samples = np.zeros((nsamples, nblocks), dtype=np.int32) estimates = np.zeros((nsamples, nparams)) deviance = np.zeros((nsamples)) thres = np.zeros((nsamples, ncuts)) slope = np.zeros((nsamples, ncuts)) Rpd = np.zeros((nsamples)) Rkd = np.zeros((nsamples)) for row_index in xrange(nsamples): samples[row_index] = bs_list.getData(row_index) estimates[row_index] = bs_list.getEst(row_index) deviance[row_index] = bs_list.getdeviance(row_index) thres[row_index] = [bs_list.getThres_byPos(row_index, j) for j in xrange(ncuts)] slope[row_index] = [bs_list.getSlope_byPos(row_index, j) for j in xrange(ncuts)] Rpd[row_index] = bs_list.getRpd(row_index) Rkd[row_index] = bs_list.getRkd(row_index) thacc = np.zeros((ncuts)) thbias = np.zeros((ncuts)) slacc = np.zeros((ncuts)) slbias = np.zeros((ncuts)) for cut in xrange(ncuts): thacc[cut] = bs_list.getAcc_t(cut) thbias[cut] = bs_list.getBias_t(cut) slacc[cut] = bs_list.getAcc_s(cut) slbias[cut] = bs_list.getBias_s(cut) ci_lower = sfr.vector_double(nparams) ci_upper = sfr.vector_double(nparams) for param in xrange(nparams): ci_lower[param] = bs_list.getPercentile(0.025, param) ci_upper[param] = bs_list.getPercentile(0.975, param) outliers = np.zeros((nblocks), dtype=np.bool) influential = np.zeros((nblocks)) for block in xrange(nblocks): outliers[block] = jk_list.outlier(block) influential[block] = jk_list.influential(block, ci_lower, ci_upper) return samples, estimates, deviance, thres, thbias, thacc, slope, slbias, slacc, Rpd, Rkd, outliers, influential def mcmc( data, start=None, nsamples=10000, nafc=2, sigmoid='logistic', core='mw0.1', priors=None, stepwidths=None, sampler="MetropolisHastings", gammaislambda=False): """ Markov Chain Monte Carlo sampling for a psychometric function. Parameters ---------- data : A list of lists or an array of data. The first column should be stimulus intensity, the second column should be number of correct responses (in 2AFC) or number of yes- responses (in Yes/No), the third column should be number of trials. See also: the examples section below. start : sequence of floats of length number of model parameters Starting values for the markov chain. If this is None, the MAP estimate will be used. nsamples : int Number of samples to be taken from the posterior (note that due to suboptimal sampling, this number may be much lower than the effective number of samples. nafc : int Number of responses alternatives for nAFC tasks. If nafc==1 a Yes/No task is assumed. sigmoid : string Name of the sigmoid to be fitted. Valid sigmoids include: logistic gauss gumbel_l gumbel_r See `swignifit.utility.available_sigmoids()` for all available sigmoids. core : string \"core\"-type of the psychometric function. Valid choices include: ab (x-a)/b mw%g midpoint and width linear a+bx log a+b log(x) See `swignifit.utility.available_cores()` for all available sigmoids. priors : sequence of strings length number of parameters Prior distributions on the parameters of the psychometric function. These are expressed in the form of a list of prior names. Valid prior choices include: Uniform(%g,%g) Gauss(%g,%g) Beta(%g,%g) Gamma(%g,%g) nGamma(%g,%g) if an invalid prior or `None` is selected, no constraints are imposed at all. See `swignifit.utility.available_priors()` for all available sigmoids. if an invalid prior is selected, no constraints are imposed on that parameter resulting in an improper prior distribution. stepwidths : sequence of floats of length number of model parameters Standard deviations of the proposal distribution. The best choice is sometimes a bit tricky here. However, as a rule of thumb we can state: if the stepwidths are too small, the samples might not cover the whole posterior, if the stepwidths are too large, most steps will leave the area of high posterior density and will therefore be rejected. Thus, in general stepwidths should be somewhere in the middle. sampler : string The type of MCMC sampler to use. See: `sw.utility.available_samplers()` for a list of available samplers. gammaislambda : boolean Set the gamma == lambda prior. Output ------ (estimates, deviance, posterior_predictive_data, posterior_predictive_deviances, posterior_predictive_Rpd, posterior_predictive_Rkd, logposterior_ratios, accept_rate) estimates : numpy array, shape: (nsamples, nparameters) Parameters sampled from the posterior density of parameters given the data. deviances : numpy array, length: nsamples Associated deviances for each estimate posterior_predictive_data : numpy array, shape: (nsamples, nblocks) Data that are simulated by sampling from the joint posterior of data and parameters. They are important for model checking. posterior_predictive_deviances : numpy array, length: nsamples The deviances that are associated with the posterior predictive data. A particular way of model checking could be to compare the deviances and the posterior predicitive deviances. For a good model these should be relatively similar. posterior_predictive_Rpd : numpy array, length: nsamples Correlations between psychometric function and deviance residuals associated with posterior predictive data posterior_predictive_Rkd : numpy array, length: nsamples Correlations between block index and deviance residuals associated with posterior predictive data. logposterior_ratios : numpy array, shape: (nsamples, nblocks) Ratios between the full posetrior and the posterior for a single block for all samples. Used for calculating the KL-Divergence to detrmine influential observations in the Bayesian paradigm. accept_rate : float The number of proposed MCMC samples that were accepted. Example ------- >>> x = [float(2*k) for k in xrange(6)] >>> k = [34,32,40,48,50,48] >>> n = [50]*6 >>> d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] >>> priors = ('Gauss(0,1000)','Gauss(0,1000)','Beta(3,100)') >>> stepwidths = (1.,1.,0.01) >>> (estimates, deviance, posterior_predictive_data, posterior_predictive_deviances, posterior_predictive_Rpd, posterior_predictive_Rkd, logposterior_ratios, accept_rate) \ = mcmc(d,nsamples=10000,priors=priors,stepwidths=stepwidths) >>> mean(estimates[:,0]) 2.4811791550665272 >>> mean(estimates[:,1]) 7.4935217545849184 """ dataset, pmf, nparams = sfu.make_dataset_and_pmf(data, nafc, sigmoid, core, priors, gammaislambda=gammaislambda) if start is not None: start = sfu.get_start(start, nparams) else: # use mapestimate opt = sfr.PsiOptimizer(pmf, dataset) start = opt.optimize(pmf, dataset) proposal = sfr.GaussRandom() if sampler not in sfu.sampler_dict.keys(): raise sfu.PsignifitException("The sampler: " + sampler + " is not available.") else: sampler = sfu.sampler_dict[sampler](pmf, dataset, proposal) sampler.setTheta(start) if stepwidths != None: stepwidths = np.array(stepwidths) if len(stepwidths.shape)==2: if isinstance ( sampler, sfr.GenericMetropolis ): sampler.findOptimalStepwidth ( sfu.make_pilotsample ( stepwidths ) ) elif isinstance ( sampler, sfr.MetropolisHastings ): sampler.setStepSize ( sfr.vector_double( stepwidths.std(0) ) ) else: raise sfu.PsignifitException("You provided a pilot sample but the selected sampler does not support pilot samples") elif len(stepwidths) != nparams: raise sfu.PsignifitException("You specified \'"+str(len(stepwidths))+\ "\' stepwidth(s), but there are \'"+str(nparams)+ "\' parameters.") else: if isinstance ( sampler, sfr.DefaultMCMC ): for i,p in enumerate(stepwidths): p = sfu.get_prior(p) sampler.set_proposal(i, p) else: sampler.setStepSize(sfr.vector_double(stepwidths)) post = sampler.sample(nsamples) nblocks = dataset.getNblocks() estimates = np.zeros((nsamples, nparams)) deviance = np.zeros(nsamples) posterior_predictive_data = np.zeros((nsamples, nblocks)) posterior_predictive_deviances = np.zeros(nsamples) posterior_predictive_Rpd = np.zeros(nsamples) posterior_predictive_Rkd = np.zeros(nsamples) logposterior_ratios = np.zeros((nsamples, nblocks)) for i in xrange(nsamples): for j in xrange(nparams): estimates[i, j] = post.getEst(i, j) deviance[i] = post.getdeviance(i) for j in xrange(nblocks): posterior_predictive_data[i, j] = post.getppData(i, j) logposterior_ratios[i,j] = post.getlogratio(i,j) posterior_predictive_deviances[i] = post.getppDeviance(i) posterior_predictive_Rpd[i] = post.getppRpd(i) posterior_predictive_Rkd[i] = post.getppRkd(i) accept_rate = post.get_accept_rate() return (estimates, deviance, posterior_predictive_data, posterior_predictive_deviances, posterior_predictive_Rpd, posterior_predictive_Rkd, logposterior_ratios, accept_rate) def mapestimate ( data, nafc=2, sigmoid='logistic', core='ab', priors=None, cuts = None, start=None, gammaislambda=False): """ MAP or constrained maximum likelihood estimation for a psychometric function. Parameters ---------- data : A list of lists or an array of data. The first column should be stimulus intensity, the second column should be number of correct responses (in 2AFC) or number of yes- responses (in Yes/No), the third column should be number of trials. See also: the examples section below. nafc : int Number of responses alternatives for nAFC tasks. If nafc==1 a Yes/No task is assumed. sigmoid : string Name of the sigmoid to be fitted. Valid sigmoids include: logistic gauss gumbel_l gumbel_r See `swignifit.utility.available_sigmoids()` for all available sigmoids. core : string \"core\"-type of the psychometric function. Valid choices include: ab (x-a)/b mw%g midpoint and width linear a+bx log a+b log(x) See `swignifit.utility.available_cores()` for all available sigmoids. priors : sequence of strings length number of parameters Prior distributions on the parameters of the psychometric function. These are expressed in the form of a list of prior names. Valid prior choices include: Uniform(%g,%g) Gauss(%g,%g) Beta(%g,%g) Gamma(%g,%g) nGamma(%g,%g) if an invalid prior or `None` is selected, no constraints are imposed at all. See `swignifit.utility.available_priors()` for all available sigmoids. if an invalid prior is selected, no constraints are imposed on that parameter resulting in an improper prior distribution. cuts : sequence of floats Cuts at which thresholds should be determined. That is if cuts = (.25,.5,.75), thresholds (F^{-1} ( 0.25 ), F^{-1} ( 0.5 ), F^{-1} ( 0.75 )) are returned. Here F^{-1} denotes the inverse of the function specified by sigmoid. If cuts==None, this is modified to cuts=[0.5]. start : sequence of floats of length number of model parameters Values at which to start the optimization, if None the starting value is determined using a coarse grid search. Output ------ estimate, fisher, thres, slope, deviance estimate : numpy array length nparams the map/cml estimate fisher : numpy array shape (nparams, nparams) the fisher matrix thres : numpy array length ncuts the model prediction at the cuts slope : numpy array length ncuts the gradient of the psychometric function at the cuts deviance : numpy array length 1 the deviance for the estimate Example ------- >>> x = [float(2*k) for k in xrange(6)] >>> k = [34,32,40,48,50,48] >>> n = [50]*6 >>> d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] >>> priors = ('flat','flat','Uniform(0,0.1)') >>> estimate, fisher, thres, slope, deviance = mapestimate ( d, priors=priors ) >>> estimate array([ 2.75180624, 1.45717745, 0.01555658]) >>> deviance array(8.0713313642328242) """ dataset, pmf, nparams = sfu.make_dataset_and_pmf(data, nafc, sigmoid, core, priors, gammaislambda=gammaislambda) cuts = sfu.get_cuts(cuts) opt = sfr.PsiOptimizer(pmf, dataset) estimate = opt.optimize(pmf, dataset, sfu.get_start(start, nparams) if start is not None else None) H = pmf.ddnegllikeli(estimate, dataset) thres = [pmf.getThres(estimate, c) for c in cuts] slope = [pmf.getSlope(estimate, th) for th in thres] deviance = pmf.deviance(estimate, dataset) # convert to numpy stuff estimate = np.array(estimate) fisher = np.zeros((nparams,nparams)) for (i,j) in ((i,j) for i in xrange(nparams) for j in xrange(nparams)): fisher[i,j] = sfr.doublep_value(H(i,j)) thres = np.array(thres) slope = np.array(slope) deviance = np.array(deviance) return estimate, fisher, thres, slope, deviance def diagnostics(data, params, nafc=2, sigmoid='logistic', core='ab', cuts=None, gammaislambda=False): """ Some diagnostic statistics for a psychometric function fit. This function is a bit messy since it has three functions depending on the type of the `data` argument. Parameters ---------- data : variable real data : A list of lists or an array of data. The first column should be stimulus intensity, the second column should be number of correct responses (in 2AFC) or number of yes- responses (in Yes/No), the third column should be number of trials. See also: the examples section below. intensities : sequence of floats The x-values of the psychometric function, then we obtain only the predicted values. no data : empty sequence In this case we evaluate the psychometric function at the cuts. All other return values are then irrelevant. params : sequence of len nparams parameter vector at which the diagnostic information should be evaluated nafc : int Number of responses alternatives for nAFC tasks. If nafc==1 a Yes/No task is assumed. sigmoid : string Name of the sigmoid to be fitted. Valid sigmoids include: logistic gauss gumbel_l gumbel_r See `swignifit.utility.available_sigmoids()` for all available sigmoids. core : string \"core\"-type of the psychometric function. Valid choices include: ab (x-a)/b mw%g midpoint and width linear a+bx log a+b log(x) See `swignifit.utility.available_cores()` for all available sigmoids. cuts : sequence of floats Cuts at which thresholds should be determined. That is if cuts = (.25,.5,.75), thresholds (F^{-1} ( 0.25 ), F^{-1} ( 0.5 ), F^{-1} ( 0.75 )) are returned. Here F^{-1} denotes the inverse of the function specified by sigmoid. If cuts==None, this is modified to cuts=[0.5]. Output ------ (predicted, deviance_residuals, deviance, thres, Rpd, Rkd) predicted : numpy array of length nblocks predicted values associated with the respective stimulus intensities deviance_residuals : numpy array of length nblocks deviance residuals of the data deviance float deviance of the data thres : numpy array length ncuts the model prediction at the cuts Rpd : float correlation between predicted performance and deviance residuals Rkd : float correlation between block index and deviance residuals Example ------- >>> x = [float(2*k) for k in xrange(6)] >>> k = [34,32,40,48,50,48] >>> n = [50]*6 >>> d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] >>> prm = [2.75, 1.45, 0.015] >>> pred,di,D,thres,slope,Rpd,Rkd = diagnostics(d,prm) >>> D 8.0748485860836254 >>> di[0] 1.6893279652591433 >>> Rpd -0.19344675783032755 """ # here we need to hack stuff, since data can be either 'real' data, or just # a list of intensities, or just an empty sequence # in order to remain compatible with psipy we must check for an empty # sequence here, and return a specially crafted return value in that case. # sorry.. # TODO after removal of psipy we can probably change this. if op.isSequenceType(data) and len(data) == 0: pmf, nparams = sfu.make_pmf(sfr.PsiData([0],[0],[0],1), nafc, sigmoid, core, None, gammaislambda=gammaislambda ) thres = np.array([pmf.getThres(params, cut) for cut in sfu.get_cuts(cuts)]) slope = np.array([pmf.getSlope(params, th ) for th in thres]) return np.array([]), np.array([]), 0.0, thres, np.nan, np.nan shape = np.shape(np.array(data)) intensities_only = False if len(shape) == 1: # just intensities, make a dataset with k and n all zero k = n = [0] * shape[0] data = [[xx,kk,nn] for xx,kk,nn in zip(data,k,n)] intensities_only = True else: # data is 'real', just do nothing pass dataset, pmf, nparams = sfu.make_dataset_and_pmf(data, nafc, sigmoid, core, None, gammaislambda=gammaislambda) cuts = sfu.get_cuts(cuts) params = sfu.get_params(params, nparams) predicted = np.array([pmf.evaluate(intensity, params) for intensity in dataset.getIntensities()]) if intensities_only: return predicted else: deviance_residuals = pmf.getDevianceResiduals(params, dataset) deviance = pmf.deviance(params, dataset) thres = np.array([pmf.getThres(params, cut) for cut in cuts]) slope = np.array([pmf.getSlope(params, th ) for th in thres]) rpd = pmf.getRpd(deviance_residuals, params, dataset) rkd = pmf.getRkd(deviance_residuals, dataset) return predicted, deviance_residuals, deviance, thres, slope, rpd, rkd def asir ( data, nsamples=2000, nafc=2, sigmoid="logistic", core="mw0.1", priors=None, gammaislambda=False, propose=25 ): dataset, pmf, nparams = sfu.make_dataset_and_pmf ( data, nafc, sigmoid, core, priors, gammaislambda=gammaislambda ) posterior = sfr.independent_marginals ( pmf, dataset ) if nsamples > 0: samples = sfr.sample_posterior ( pmf, dataset, posterior, nsamples, propose ) sfr.sample_diagnostics ( pmf, dataset, samples ) out = {'mcestimates': np.array( [ [samples.getEst ( i, par ) for par in xrange ( nparams ) ] for i in xrange ( nsamples )]), 'mcdeviance': np.array( [ samples.getdeviance ( i ) for i in xrange ( nsamples ) ] ), 'mcRpd': np.array ( [ samples.getRpd ( i ) for i in xrange ( nsamples ) ] ), 'mcRkd': np.array ( [ samples.getRkd ( i ) for i in xrange ( nsamples ) ] ), 'posterior_predictive_data': np.array ( [ samples.getppData ( i ) for i in xrange ( nsamples ) ] ), 'posterior_predictive_deviance': np.array ( [ samples.getppDeviance ( i ) for i in xrange ( nsamples ) ] ), 'posterior_predictive_Rpd': np.array ( [ samples.getppRpd ( i ) for i in xrange ( nsamples ) ] ), 'posterior_predictive_Rkd': np.array ( [ samples.getppRkd ( i ) for i in xrange ( nsamples ) ] ), 'logposterior_ratios': np.array ( [ [samples.getlogratio ( i,j ) for j in xrange(len(data)) ] for i in xrange ( nsamples ) ] ), 'duplicates': samples.get_accept_rate (), 'posterior_approximations_py': [posterior.get_posterior(i) for i in xrange ( nparams ) ], 'posterior_approximations_str': [r"$\mathcal{N}(%.2f,%.2f)$" % (posterior.get_posterior(0).getprm(0),posterior.get_posterior(0).getprm(1)), r"$\mathrm{Gamma}(%.2f,%.2f)$" % (posterior.get_posterior(1).getprm(0),posterior.get_posterior(1).getprm(1)), r"$\mathrm{Beta}(%.2f,%.2f)$" % (posterior.get_posterior(2).getprm(0),posterior.get_posterior(2).getprm(1))], 'posterior_grids': [ posterior.get_grid ( i ) for i in xrange ( nparams ) ], 'posterior_margin': [ posterior.get_margin ( i ) for i in xrange ( nparams ) ], 'resampling-entropy': samples.get_entropy () } else: out = {'posterior_approximations_py': [posterior.get_posterior(i) for i in xrange ( nparams ) ], 'posterior_approximations_str': [r"$\mathcal{N}(%.2f,%.2f)$" % (posterior.get_posterior(0).getprm(0),posterior.get_posterior(0).getprm(1)), r"$\mathrm{Gamma}(%.2f,%.2f)$" % (posterior.get_posterior(1).getprm(0),posterior.get_posterior(1).getprm(1)), r"$\mathrm{Beta}(%.2f,%.2f)$" % (posterior.get_posterior(2).getprm(0),posterior.get_posterior(2).getprm(1))], 'posterior_grids': [ posterior.get_grid ( i ) for i in xrange ( nparams ) ], 'posterior_margin': [ posterior.get_margin ( i ) for i in xrange ( nparams ) ] } if nparams==4: out['posterior_approximations_str'].append ( r"$\mathrm{Beta}(%.2f,%.2f)$" % (posterior.get_posterior(3).getprm(0),posterior.get_posterior(3).getprm(1)) ) return out psignifit3-3.0~beta.20120611.1/swignifit/swignifit_raw.i000066400000000000000000000036271176542545200225730ustar00rootroot00000000000000/* * See COPYING file distributed along with the psignifit package for * the copyright and license terms */ /* This is the interface file for the swig wrapper to psignifit, swignifit */ %module swignifit_raw %{ #define SWIG_FILE_WITH_INIT #include "psipp.h" using std::ptrdiff_t; %} // custom exception handler // code need not declare that it will throw an exception %include "exception.i" %exception { try { $action // psignift BadArgumentException } catch (BadArgumentError& e){ SWIG_exception(SWIG_ValueError, e.message ); // All remaining STL exceptions } catch (const std::exception& e) { SWIG_exception(SWIG_RuntimeError, e.what()); } } // make the STL vectors available %include "std_vector.i" namespace std { %template(vector_double) vector; %template(vector_int) vector; }; // include methods for dealing with double pointers %include cpointer.i %pointer_functions(double,doublep); // This translates BadArgumentError (c++) -> ValueError (python) // including the error message // however the function must specify that it throws this error %typemap(throws) BadArgumentError %{ PyErr_SetString(PyExc_ValueError, $1.message); SWIG_fail; %} %include "std_string.i" // we need to ignore the second constructor for PsiData since swig can't handle // this type of overloading TODO write a factory method in python that // implements this functionality %ignore PsiData::PsiData (std::vector x, std::vector N, std::vector p, int nAFC); // We wrap the following headers %include "data.h" %include "sigmoid.h" %include "core.h" %include "prior.h" %include "psychometric.h" %include "optimizer.h" %include "bootstrap.h" %include "mcmc.h" %include "mclist.h" %include "rng.h" %include "linalg.h" %include "getstart.h" %include "integrate.h" psignifit3-3.0~beta.20120611.1/swignifit/utility.py000066400000000000000000000250631176542545200216200ustar00rootroot00000000000000#/usr/bin/env python # encoding: utf-8 # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """Variety of utilities for working with swig generated code.""" __docformat__ = "restructuredtext" import operator as op import re import numpy as np import swignifit_raw as sfr class PsignifitException(Exception): pass def extract_subclasses(base, sub_func): """Recursively extract subclasses, given a swig base class. Parameters ---------- base : swig class The base class from which to start. sub_func : string The function or attribute to use as name for subclass. Returns ------- subs : dict A dictionary mapping subclass names to constructors. """ to_visit = base.__subclasses__() subclasses = dict() for cl in to_visit: descriptor = eval("cl."+sub_func) if descriptor not in subclasses.keys(): subclasses[descriptor] = cl to_visit.extend(cl.__subclasses__()) return subclasses def extract_subclasses_descriptor(base): """Recursively extract subclasses, using the `getDescriptor()` method.""" return extract_subclasses(base, "getDescriptor()") def extract_subclasses_reflection(base): """Recursively extract subclasses, using the `__name__` attribute.""" return extract_subclasses(base, "__name__") sig_dict = extract_subclasses_descriptor(sfr.PsiSigmoid) core_dict = extract_subclasses_descriptor(sfr.PsiCore) prior_dict = extract_subclasses_reflection(sfr.PsiPrior) sampler_dict = extract_subclasses_reflection(sfr.PsiSampler) def available_cores(): print "The following cores are availabe:" print core_dict.keys() def available_sigmoids(): print "The following sigmoids are available:" print sig_dict.keys() def available_priors(): print "The following priors are available:" print prior_dict.keys() def available_samplers(): print "The following mcmc samplers are available:" print sampler_dict.keys() def make_dataset(data, nafc): """Create a PsiData object from column based input. Parameters ---------- data : sequence on length 3 sequences Psychometric data in colum based input, e.g.[[1, 1, 5], [2, 3, 5] [3, 5, 5]]. nafc : int Number of alternative choices in forced choice procedure. Returns ------- data: PsiData Dataset object. """ data = np.array(data).T x = sfr.vector_double(map(float, data[0])) k = sfr.vector_int(map(int, data[1])) N = sfr.vector_int(map(int, data[2])) return sfr.PsiData(x,N,k,nafc) def make_pmf(dataset, nafc, sigmoid, core, priors, gammaislambda=False): """Assemble PsiPsychometric object from model parameters. Parameters ---------- dataset: sequence of length 3 sequences Psychometric data in colum based input, e.g.[[1, 1, 5], [2, 3, 5] [3, 5, 5]]. nafc : int Number of alternative choices in forced choice procedure. sigmoid : string Description of model sigmoid. core : string Description of model core. priors : sequence of strings The model priors. gammaislambda : bool Constrain guessing rate and lapsing rate to be equal Returns ------- pmf : PsiPsychometric Model object. nparams : int Number of free parameters in model.. """ sigmoid = get_sigmoid(sigmoid) core = get_core(core, dataset, sigmoid) if not priors is None: pr = "".join(priors) else: pr = "" if pr in ["Jeffreys","jeffreys","Jeffrey","jeffrey"]: pmf = sfr.PMF_with_JeffreysPrior ( nafc, core, sigmoid ); else: pmf = sfr.PsiPsychometric(nafc, core, sigmoid) if gammaislambda: pmf.setgammatolambda() nparams = pmf.getNparams() if not pr in ["Jeffreys","jeffreys","Jeffrey","jeffrey"]: set_priors(pmf,priors) return pmf, nparams def make_dataset_and_pmf(data, nafc, sigmoid, core, priors, gammaislambda=False ): """Assemble PsiData and PsiPsychometric objects simultaneously. Parameters ---------- see: make_dataset and make_pmf Returns ------- data : PsiData Dataset object. pmf : PsiPsychometric Model object. nparams : int Number of free parameters. """ dataset = make_dataset(data, nafc) pmf, nparams = make_pmf(dataset, nafc, sigmoid, core, priors, gammaislambda) return dataset, pmf, nparams def get_sigmoid(descriptor): """Convert string representation of sigmoid to PsiSigmoid object. Parameters ---------- descriptor : string Description of sigmoid. Returns ------- sigmoid : subclass of PsiSigmoid An instantiated sigmoid of the requested type. Raises ------ ValueError If the requested sigmoid is not available. See Also -------- `available_sigmoids()` """ if not sig_dict.has_key(descriptor): raise ValueError("The sigmoid '%s' you requested, is not available." % descriptor) return sig_dict[descriptor]() def get_core(descriptor, data, sigmoid): """Convert string representation of core to PsiCore object. Parameters ---------- descriptor : string Description of core. data : PsiData Instantiated dataset. sigmoid : PsiSigmoid Instantiated sigmoid. Returns ------- prior : subclass of PsiCore An instantiated core of the requested type. Raises ------ ValueError If the requested core is not available. See Also -------- `available_cores()` Notes ----- The core objects may require a dataset and a sigmoid type identifier to be instantiated. See the Psi++ code for details. """ descriptor, parameter = re.match('([a-z]+)([\d\.]*)', descriptor).groups() sigmoid_type = sigmoid.getcode() if descriptor not in core_dict.keys(): raise ValueError("The core '%s' you requested, is not available." % descriptor) if len(parameter) > 0: return core_dict[descriptor](data, sigmoid_type, float(parameter)) else: return core_dict[descriptor](data, sigmoid_type) def get_prior(prior): """Convert string based representation of prior to PsiPrior object. Parameters ---------- prior : string Description of prior, with paramters. Returns ------- prior : PsiPrior An instantiated prior of the requested type. See Also -------- `available_priors()` Notes ----- This function does not raise any error and silently returns `None` if the prior does not exist. """ try: prior = "sfr."+"Prior(".join(prior.split('(')) return eval(prior) except Exception, e: return None def set_priors(pmf, priors): """Set the priors to be used in the model object. Parameters ---------- pmf : PsiPsychometric object Instantiated model. priors : Sequence of strings of length of free parameters of `pmf` Model priors. Raises ------ ValueError If the number of priors is not equal to the number of free parameters in the model. """ if priors is not None: nparams = pmf.getNparams() if len(priors) != nparams: raise ValueError("You specified %d priors, " % len(priors) + "but there are %d free parameters in the model." % nparams) for (i,p) in enumerate((get_prior(p) for p in priors)): if p is not None: pmf.setPrior(i, p) def get_start(start, nparams): """Convert sequence of starting values to vector_double type. Parameters ---------- start : sequence of numbers Starting values. nparams : int Number of free parameters of the model. Returns ------- start: vector_double Starting values. Raises ------ ValueError If the length of the sequence is not equal to the number of free parameters. """ if len(start) != nparams: raise ValueError("You specified %d starting value(s), " % len(start) +"but there are %d parameters." % nparams) else: return sfr.vector_double(start) def get_params(params, nparams): """Convert sequence of parameter values to vector_double type. Parameters ---------- params : sequence of numbers Parameter values. nparams : int Number of free parameters in the model. Returns ------- params : vector_double Parameter values. Raises ------ ValueError If the length of the sequence is not equal to the number of free parameters. """ if len(params) != nparams: raise ValueError("You specified %d parameters, " % len(params) + "but the model has parameters." % nparams) else: return sfr.vector_double(params) def get_cuts(cuts): """ Convert `cuts` argument to vector_double type. Argument can be None, a number or a sequence of numbers. If None, there is only one cut at 0.5. If `cuts` is a number, function returns a vector_double with that number as a single element. If its a sequence, that sequence will be converted to vector_double type. Parameters ---------- cuts : None, number or sequence of numbers Cut values Returns ------- cuts : vector_double Cut values. Raises ------ TypeError If `cuts` is not None, a number or a sequence of numbers. """ if cuts is None: return sfr.vector_double([0.5]) elif op.isSequenceType(cuts) and np.array([op.isNumberType(a) for a in cuts]).all(): return sfr.vector_double(cuts) elif op.isNumberType(cuts): return sfr.vector_double([cuts]) else: raise TypeError("'cuts' must be either None, a number or a "+ "sequence of numbers.") def make_pilotsample ( mcsamples ): """create an MCList from a set of pilot samples Deviances of the pilot list will be meaningless! Parameters ---------- mcsamples : array of Nsamples x Nparams pilot samples Returns ------- pilot : PsiMClist MClist with the pilot samples """ N,nprm = mcsamples.shape pilot = sfr.PsiMClist ( N, nprm ) for i in xrange ( N ): pilot.setEst ( i, mcsamples[i,:], -1 ) return pilot psignifit3-3.0~beta.20120611.1/tests/000077500000000000000000000000001176542545200166745ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/tests/cli_test.py000066400000000000000000001376361176542545200210740ustar00rootroot00000000000000#!/usr/bin/env python # Unit tests for the command line interface # These tests mainly assume that the fitting procedures work. So the tests just make sure that # all commands can be called, that the results can be read again, and that the results are complete. import os import unittest as ut import re import numpy as np x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 data2afc = zip ( x, k, n ) x = [float(2*k) for k in xrange(6)] k = [2,21,29,42,50,49] n = [50]*6 data1afc = zip ( x, k, n ) def writedata ( f, d ): for l in d: f.write ( "%g %d %d\n" % l ) return None def getvariable ( varname, datastring ): pattern = r"# %s\n(.*?)\n\n" % (varname,) m = re.search ( pattern, datastring, re.DOTALL ) v = np.fromstring ( m.group(1), sep=' ' ) return v class TestCLImapestimate ( ut.TestCase ): def test_2afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-mapestimate -nafc 2 .testdata -o .testresults2" os.system ( cmd ) f = open ( ".testresults2" ) results = f.read() f.close() th = getvariable ( "thetahat", results ) self.assertAlmostEqual ( th[0], 2.751832 ) self.assertAlmostEqual ( th[1], 6.403953 ) self.assertAlmostEqual ( th[2], 0.015555 ) fisher = np.reshape( getvariable ( "fisher_info", results ), (3,3) ) self.assertAlmostEqual ( fisher[0,0], -4.339672 ) self.assertAlmostEqual ( fisher[0,1], -0.826837 ) self.assertAlmostEqual ( fisher[0,2], -58.007662 ) self.assertAlmostEqual ( fisher[1,0], -0.826837 ) self.assertAlmostEqual ( fisher[1,1], -0.384938 ) self.assertAlmostEqual ( fisher[1,2], -25.336736 ) self.assertAlmostEqual ( fisher[2,0], -58.007662 ) self.assertAlmostEqual ( fisher[2,1], -25.336736 ) self.assertAlmostEqual ( fisher[2,2], -6349.783561 ) thres = getvariable ( "thres", results ) self.assertAlmostEqual ( thres[0], 1.150844 ) self.assertAlmostEqual ( thres[1], 2.751832 ) self.assertAlmostEqual ( thres[2], 4.352820 ) D = float ( getvariable ( "deviance", results ) ) self.assertAlmostEqual ( D, 8.071331 ) os.remove ( ".testdata" ) os.remove ( ".testresults2" ) def test_1afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-mapestimate -nafc 1 .testdata -o .testresults1" os.system ( cmd ) f = open ( ".testresults1" ) results = f.read() f.close() th = getvariable ( "thetahat", results ) self.assertAlmostEqual ( th[0], 3.268666 ) self.assertAlmostEqual ( th[1], 6.050049 ) self.assertAlmostEqual ( th[2], 0.004847 ) self.assertAlmostEqual ( th[3], 0.021376 ) fisher = np.reshape( getvariable ( "fisher_info", results ), (4,4) ) self.assertAlmostEqual ( fisher[0,0], -15.996856 ) self.assertAlmostEqual ( fisher[0,1], -0.544973 ) self.assertAlmostEqual ( fisher[0,2], -112.664222 ) self.assertAlmostEqual ( fisher[0,3], 62.230531 ) self.assertAlmostEqual ( fisher[1,0], -0.544973 ) self.assertAlmostEqual ( fisher[1,1], -1.933384 ) self.assertAlmostEqual ( fisher[1,2], -57.822245 ) self.assertAlmostEqual ( fisher[1,3], -8.574196 ) self.assertAlmostEqual ( fisher[2,0], -112.664222 ) self.assertAlmostEqual ( fisher[2,1], -57.822245 ) self.assertAlmostEqual ( fisher[2,2], -7375.069598 ) self.assertAlmostEqual ( fisher[2,3], 247.270163 ) self.assertAlmostEqual ( fisher[3,0], 62.230531 ) self.assertAlmostEqual ( fisher[3,1], -8.574196 ) self.assertAlmostEqual ( fisher[3,2], 247.270163 ) self.assertAlmostEqual ( fisher[3,3], -395.088389 ) thres = getvariable ( "thres", results ) self.assertAlmostEqual ( thres[0], 1.756153 ) self.assertAlmostEqual ( thres[1], 3.268666 ) self.assertAlmostEqual ( thres[2], 4.781178 ) D = float ( getvariable ( "deviance", results ) ) self.assertAlmostEqual ( D, 11.162991 ) os.remove ( ".testdata" ) os.remove ( ".testresults1" ) def test_1afc_e ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-mapestimate -nafc 1 -e .testdata -o .testresults1e" os.system ( cmd ) f = open ( ".testresults1e" ) results = f.read() f.close() th = getvariable ( "thetahat", results ) self.assertAlmostEqual ( th[0], 3.210313 ) self.assertAlmostEqual ( th[1], 6.261821) self.assertAlmostEqual ( th[2], 0.001765 ) fisher = np.reshape( getvariable ( "fisher_info", results ), (3,3) ) self.assertAlmostEqual ( fisher[0,0], -16.421624 ) self.assertAlmostEqual ( fisher[0,1], -0.571775 ) self.assertAlmostEqual ( fisher[0,2], -133.113719 ) self.assertAlmostEqual ( fisher[1,0], -0.571775 ) self.assertAlmostEqual ( fisher[1,1], -1.977617 ) self.assertAlmostEqual ( fisher[1,2], -78.395747 ) self.assertAlmostEqual ( fisher[2,0], -133.113719 ) self.assertAlmostEqual ( fisher[2,1], -78.395747 ) self.assertAlmostEqual ( fisher[2,2], -10130.614861 ) thres = getvariable ( "thres", results ) self.assertAlmostEqual ( thres[0], 1.644858 ) self.assertAlmostEqual ( thres[1], 3.210313 ) self.assertAlmostEqual ( thres[2], 4.775768 ) D = float ( getvariable ( "deviance", results ) ) self.assertAlmostEqual ( D, 10.616 ) os.remove ( ".testdata" ) os.remove ( ".testresults1e" ) class TestCLIdiagnostics ( ut.TestCase ): def test_2afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-diagnostics -nafc 2 -params '4,2,.02' .testdata -o .testdiag2" os.system ( cmd ) f = open ( ".testdiag2" ) diagnostics = f.read() f.close() prediction = np.reshape ( getvariable ( "prediction", diagnostics ), (-1,2) ) self.assertAlmostEqual ( prediction[0,1], 0.500073 ) self.assertAlmostEqual ( prediction[1,1], 0.505854 ) self.assertAlmostEqual ( prediction[2,1], 0.74 ) self.assertAlmostEqual ( prediction[3,1], 0.974146 ) self.assertAlmostEqual ( prediction[4,1], 0.979927 ) self.assertAlmostEqual ( prediction[5,1], 0.979999 ) evaluated = np.reshape ( getvariable ( "pmf", diagnostics ), (-1,2) ) self.assertAlmostEqual ( evaluated[0,1], 0.500073 ) self.assertAlmostEqual ( evaluated[-1,1], 0.979999 ) d = getvariable ( "devianceresiduals", diagnostics ) d_ = [ 2.573423, 1.911003, 0.994806, -0.584292, 1.423986, -0.890531] for found,should in zip ( d, d_ ): self.assertAlmostEqual ( found, should ) thres = getvariable ( "thres", diagnostics ) thres_ = np.array([ 3.5, 4. , 4.5]) for found, should in zip ( thres, thres_ ): self.assertAlmostEqual ( found, should ) D = getvariable ( "deviance", diagnostics ) self.assertAlmostEqual ( D, 14.426254 ) rpd = getvariable ( "rpd", diagnostics ) self.assertAlmostEqual ( rpd, -0.801282 ) rkd = getvariable ( "rkd", diagnostics ) self.assertAlmostEqual ( rkd, -0.982893 ) os.remove ( ".testdata" ) os.remove ( ".testdiag2" ) def test_1afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-diagnostics -nafc 1 -params '4,2,.02,.01' .testdata -o .testdiag1" os.system ( cmd ) f = open ( ".testdiag1" ) diagnostics = f.read () f.close() prediction = np.reshape ( getvariable ( "prediction", diagnostics ), (-1,2) ) self.assertAlmostEqual ( prediction[0,1], 0.010148 ) self.assertAlmostEqual ( prediction[1,1], 0.021829 ) self.assertAlmostEqual ( prediction[2,1], 0.495000 ) self.assertAlmostEqual ( prediction[3,1], 0.968171 ) self.assertAlmostEqual ( prediction[4,1], 0.979852 ) self.assertAlmostEqual ( prediction[5,1], 0.979998 ) evaluated = np.reshape ( getvariable ( "pmf", diagnostics ), (-1,2) ) self.assertAlmostEqual ( evaluated[0,1], 0.010148 ) self.assertAlmostEqual ( evaluated[-1,1], 0.979998 ) d = getvariable ( "devianceresiduals", diagnostics ) d_ = [1.595850, 9.689173, 1.204377, -3.729350, 1.426659, 0.000092] for found,should in zip ( d, d_ ): self.assertAlmostEqual ( found, should ) thres = getvariable ( "thres", diagnostics ) thres_ = np.array([ 3.5, 4. , 4.5]) for found, should in zip ( thres, thres_ ): self.assertAlmostEqual ( found, should ) D = getvariable ( "deviance", diagnostics ) self.assertAlmostEqual ( D, 113.820741 ) rpd = getvariable ( "rpd", diagnostics ) self.assertAlmostEqual ( rpd, -0.699618 ) rkd = getvariable ( "rkd", diagnostics ) self.assertAlmostEqual ( rkd, -0.534870 ) os.remove ( ".testdata" ) os.remove ( ".testdiag1" ) def test_1afc_e ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-diagnostics -nafc 1 -e -params '4,2,.02' .testdata -o .testdiag1e" os.system ( cmd ) f = open ( ".testdiag1e" ) diagnostics = f.read () f.close() prediction = np.reshape ( getvariable ( "prediction", diagnostics ), (-1,2) ) self.assertAlmostEqual ( prediction[0,1], 0.020146 ) self.assertAlmostEqual ( prediction[1,1], 0.031707 ) self.assertAlmostEqual ( prediction[2,1], 0.500000 ) self.assertAlmostEqual ( prediction[3,1], 0.968293 ) self.assertAlmostEqual ( prediction[4,1], 0.979854 ) self.assertAlmostEqual ( prediction[5,1], 0.979998 ) evaluated = np.reshape ( getvariable ( "pmf", diagnostics ), (-1,2) ) self.assertAlmostEqual ( evaluated[0,1], 0.020146 ) self.assertAlmostEqual ( evaluated[-1,1], 0.979998 ) d = getvariable ( "devianceresiduals", diagnostics ) d_ = [ 0.882222, 8.876392, 1.133807, -3.736160, 1.426604, 0.000091] for found,should in zip ( d, d_ ): self.assertAlmostEqual ( found, should ) thres = getvariable ( "thres", diagnostics ) thres_ = np.array([ 3.5, 4. , 4.5]) for found, should in zip ( thres, thres_ ): self.assertAlmostEqual ( found, should ) D = getvariable ( "deviance", diagnostics ) self.assertAlmostEqual ( D, 96.848264 ) rpd = getvariable ( "rpd", diagnostics ) self.assertAlmostEqual ( rpd, -0.659141 ) rkd = getvariable ( "rkd", diagnostics ) self.assertAlmostEqual ( rkd, -0.494372 ) os.remove ( ".testdata" ) os.remove ( ".testdiag1e" ) class TestCLIbootstrap ( ut.TestCase ): def test_2afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-bootstrap -nafc 2 -nsamples 100 .testdata -o .testboots2" os.system ( cmd ) f = open ( ".testboots2" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslopes = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) influential = getvariable ( "influential", results ) outliers = getvariable ( "outliers", results ) bias_thres = getvariable ( "bias_thres", results ) bias_slope = getvariable ( "bias_slope", results ) acc_thres = getvariable ( "acc_thres", results ) acc_slope = getvariable ( "acc_slope", results ) data_ = np.array([[ 31., 33., 37., 49., 49., 50.], [ 28., 35., 39., 49., 49., 50.], [ 22., 33., 45., 46., 48., 50.], [ 24., 31., 40., 50., 48., 49.]]) est_ = np.array([[ 3.33819500e+00, 5.60458100e+00, 2.68500000e-03], [ 3.03828900e+00, 5.70957800e+00, 5.40700000e-03], [ 2.71095100e+00, 4.19333400e+00, 2.83910000e-02], [ 3.02637000e+00, 6.40395300e+00, 1.55550000e-02]]) dev_ = np.array([ 5.590425, 3.67402 , 6.205791, 9.107808]) thres_ = np.array([[ 1.93705 , 3.338195, 4.739341], [ 1.610894, 3.038289, 4.465683], [ 1.662617, 2.710951, 3.759284], [ 1.425382, 3.02637 , 4.627359]]) slopes_ = np.array([[ 0.147015, 0.19602 , 0.147015], [ 0.144312, 0.192416, 0.144312], [ 0.196493, 0.26199 , 0.196493], [ 0.128664, 0.171552, 0.128664]]) rpd_ = np.array([-0.183562, 0.07488 , 0.388136, 0.515715]) rkd_ = np.array([-0.314035, -0.087545, 0.077809, 0.957769]) for k,b in enumerate([0,13,52,99]): self.assertAlmostEqual ( mcdeviance[b], dev_[k] ) self.assertAlmostEqual ( mcRpd[b], rpd_[k] ) self.assertAlmostEqual ( mcRkd[b], rkd_[k] ) for i in xrange ( 6 ): self.assertAlmostEqual ( mcdata[b,i], data_[k,i] ) for i in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[b,i], est_[k,i] ) self.assertAlmostEqual ( mcthres[b,i], thres_[k,i] ) self.assertAlmostEqual ( mcslopes[b,i], slopes_[k,i] ) influential_ = np.array([ 0.48018 , 0.862859, 0.356132, 0.434502, 0.357766, 0.847707]) for i in xrange ( 6 ): self.assertAlmostEqual ( influential[i], influential_[i] ) bias_thres_ = np.array([-0.368003, -0.162024, 0.086973]) bias_slope_ = np.array([-0.476577, -0.476577, -0.476577]) acc_thres_ = np.array([ -6.78200000e-03, -4.49780000e-02, -2.60209610e+01]) acc_slope_ = np.array([ -6.78200000e-03, -4.49780000e-02, -2.60209610e+01]) for i in xrange ( 3 ): self.assertAlmostEqual ( bias_thres[i], bias_thres_[i] ) self.assertAlmostEqual ( bias_slope[i], bias_slope_[i] ) self.assertAlmostEqual ( acc_thres[i], acc_thres_[i] ) self.assertAlmostEqual ( acc_slope[i], acc_slope_[i] ) os.remove ( ".testdata" ) os.remove ( ".testboots2" ) def test_1afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-bootstrap -nafc 1 -nsamples 100 .testdata -o .testboots1" os.system ( cmd ) f = open ( ".testboots1" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,4) ) mcdeviance = getvariable ( "mcdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslopes = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) influential = getvariable ( "influential", results ) outliers = getvariable ( "outliers", results ) bias_thres = getvariable ( "bias_thres", results ) bias_slope = getvariable ( "bias_slope", results ) acc_thres = getvariable ( "acc_thres", results ) acc_slope = getvariable ( "acc_slope", results ) data_ = np.array([[ 11., 14., 26., 47., 49., 50.], [ 8., 15., 31., 47., 47., 50.], [ 4., 19., 33., 44., 48., 50.], [ 5., 12., 33., 50., 48., 49.]]) est_ = np.array([[ 3.39125900e+00, 6.38257200e+00, 8.30000000e-05, 6.53660000e-02], [ 3.26135500e+00, 6.12111300e+00, 9.10000000e-05, 5.42920000e-02], [ 3.04542000e+00, 6.19016800e+00, 2.00000000e-06, 1.33770000e-02], [ 3.42222900e+00, 3.14740200e+00, 2.68020000e-02, 9.93700000e-02]]) dev_ = np.array([ 9.116104, 4.294998, 2.197431, 6.289036]) thres_ = np.array([[ 1.795616, 3.391259, 4.986902], [ 1.731077, 3.261355, 4.791633], [ 1.497878, 3.04542 , 4.592962], [ 2.635379, 3.422229, 4.20908 ]]) slopes_ = np.array([[ 0.129095, 0.172127, 0.129095], [ 0.134609, 0.179479, 0.134609], [ 0.133108, 0.177477, 0.133108], [ 0.26179 , 0.349054, 0.26179 ]]) rpd_ = np.array([ 0.219986, 0.097852, 0.233106, 0.190961]) rkd_ = np.array([ 0.123775, -0.218641, -0.076982, -0.04086 ]) for k,b in enumerate([0,13,52,99]): self.assertAlmostEqual ( mcdeviance[b], dev_[k] ) self.assertAlmostEqual ( mcRpd[b], rpd_[k] ) self.assertAlmostEqual ( mcRkd[b], rkd_[k] ) for i in xrange ( 6 ): self.assertAlmostEqual ( mcdata[b,i], data_[k,i] ) for i in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[b,i], est_[k,i] ) self.assertAlmostEqual ( mcthres[b,i], thres_[k,i] ) self.assertAlmostEqual ( mcslopes[b,i], slopes_[k,i] ) influential_ = np.array([ 0.827883, 0.85784 , 0.538477, 0.302408, 0.96394 , 0.965507]) for i in xrange ( 6 ): self.assertAlmostEqual ( influential[i], influential_[i] ) bias_thres_ = np.array([-0.368003, -0.162024, 0.062085]) bias_slope_ = np.array([-0.561792, -0.561792, -0.561792]) acc_thres_ = np.array([ 0.012912, 0.014571, 0.016806]) acc_slope_ = np.array([ 0.012912, 0.014571, 0.016806]) for i in xrange ( 3 ): self.assertAlmostEqual ( bias_thres[i], bias_thres_[i] ) self.assertAlmostEqual ( bias_slope[i], bias_slope_[i] ) self.assertAlmostEqual ( acc_thres[i], acc_thres_[i] ) self.assertAlmostEqual ( acc_slope[i], acc_slope_[i] ) os.remove ( ".testdata" ) os.remove ( ".testboots1" ) def test_1afc_e ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-bootstrap -nafc 1 -e -nsamples 100 .testdata -o .testboots1e" os.system ( cmd ) f = open ( ".testboots1e" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslopes = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) influential = getvariable ( "influential", results ) outliers = getvariable ( "outliers", results ) bias_thres = getvariable ( "bias_thres", results ) bias_slope = getvariable ( "bias_slope", results ) acc_thres = getvariable ( "acc_thres", results ) acc_slope = getvariable ( "acc_slope", results ) data_ = np.array([[ 10., 14., 26., 47., 49., 50.], [ 7., 15., 31., 47., 47., 50.], [ 4., 19., 33., 44., 48., 50.], [ 5., 12., 33., 50., 48., 49.]]) est_ = np.array([[ 3.07800800e+00, 6.57922400e+00, 3.90000000e-05], [ 3.03700700e+00, 6.54174800e+00, 3.70000000e-05], [ 3.00542200e+00, 6.28976500e+00, 6.10000000e-05], [ 3.07839800e+00, 4.12339800e+00, 2.40690000e-02]]) dev_ = np.array([ 10.87362 , 4.61029 , 1.987836, 9.019021]) thres_ = np.array([[ 1.433202, 3.078008, 4.722814], [ 1.40157 , 3.037007, 4.672444], [ 1.432981, 3.005422, 4.577864], [ 2.047548, 3.078398, 4.109247]]) slopes_= np.array([[ 0.125237, 0.166982, 0.125237], [ 0.125954, 0.167939, 0.125954], [ 0.131 , 0.174667, 0.131 ], [ 0.199825, 0.266434, 0.199825]]) rpd_ = np.array([ 0.065197, 0.137176, 0.218727, 0.006982]) rkd_ = np.array([ 0.003441, -0.155417, -0.114861, -0.426397]) for k,b in enumerate([0,13,52,99]): self.assertAlmostEqual ( mcdeviance[b], dev_[k] ) self.assertAlmostEqual ( mcRpd[b], rpd_[k] ) self.assertAlmostEqual ( mcRkd[b], rkd_[k] ) for i in xrange ( 6 ): self.assertAlmostEqual ( mcdata[b,i], data_[k,i] ) for i in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[b,i], est_[k,i] ) self.assertAlmostEqual ( mcthres[b,i], thres_[k,i] ) self.assertAlmostEqual ( mcslopes[b,i], slopes_[k,i] ) influential_ = np.array([ 0.678465, 1.106128, 0.484737, 0.289692, 0.382489, 0.16962 ]) for i in xrange ( 6 ): self.assertAlmostEqual ( influential[i], influential_[i] ) bias_thres_ = np.array([-0.263612, 0.037236, 0.289397]) bias_slope_ = np.array([-0.421668, -0.421668, -0.421668]) acc_thres_ = np.array([-0.001037, -0.000433, 0.004147]) acc_slope_ = np.array([-0.001037, -0.000433, 0.004147]) for i in xrange ( 3 ): self.assertAlmostEqual ( bias_thres[i], bias_thres_[i] ) self.assertAlmostEqual ( bias_slope[i], bias_slope_[i] ) self.assertAlmostEqual ( acc_thres[i], acc_thres_[i] ) self.assertAlmostEqual ( acc_slope[i], acc_slope_[i] ) os.remove ( ".testdata" ) os.remove ( ".testboots1e" ) class TestCLImcmc ( ut.TestCase ): def test_2afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-mcmc -nafc 2 -nsamples 100 .testdata -o .testmcmc2" os.system ( cmd ) f = open ( ".testmcmc2" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [0,13,52,99] # In 2afc # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 29., 32., 40., 49., 49., 50.], [ 29., 35., 41., 50., 50., 49.], [ 30., 32., 43., 46., 50., 50.], [ 25., 28., 43., 49., 47., 50.]]) mcestimates_ = np.array([[ 2.64190300e+00, 6.35792300e+00, 1.06100000e-03], [ 2.92947800e+00, 6.50634300e+00, 7.14700000e-03], [ 2.92993800e+00, 6.27773900e+00, 1.49940000e-02], [ 2.53914700e+00, 6.02901700e+00, 1.30110000e-02]]) mcdeviance_ = np.array([ 11.469979, 8.596646, 8.173506, 8.652527]) ppdeviance_ = np.array([ 3.522112, 9.31121 , 5.82404 , 9.986468]) mcthres_ = np.array([[ 1.052422, 2.641903, 4.231384], [ 1.302892, 2.929478, 4.556064], [ 1.360503, 2.929938, 4.499373], [ 1.031893, 2.539147, 4.046401]]) mcslope_ = np.array([[ 0.09321 , 0.10437 , 0.115816], [ 0.081644, 0.091848, 0.102528], [ 0.080642, 0.091363, 0.102685], [ 0.097277, 0.109657, 0.122384]]) mcRpd_ = np.array([-0.387785, -0.291975, -0.226538, -0.255566]) ppRpd_ = np.array([ 0.291323, 0.269911, 0.41512 , 0.544918]) mcRkd_ = np.array([-0.732192, -0.668121, -0.610352, -0.580557]) ppRkd_ = np.array([ 0.131472, -0.897023, -0.470602, 0.249781]) influential_ = np.array([ 187.606016, 113.069619, 109.988082, 83.446715, 85.701597, 87.319936]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc2" ) def test_1afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-mcmc -nafc 1 -nsamples 100 .testdata -o .testmcmc1" os.system ( cmd ) f = open ( ".testmcmc1" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,4) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [10,13,52,99] # print "In 1afc" # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 4., 15., 36., 39., 50., 50.], [ 4., 14., 33., 47., 48., 50.], [ 2., 16., 29., 45., 50., 50.], [ 2., 14., 32., 46., 49., 50.]]) mcestimates_ = np.array([[ 3.17255800e+00, 5.94703500e+00, 6.81800000e-03, 2.13760000e-02], [ 3.38775600e+00, 5.98046000e+00, 1.83400000e-03, 2.13760000e-02], [ 3.54890100e+00, 5.51406200e+00, 4.38100000e-03, 2.13760000e-02], [ 3.42993300e+00, 5.25737800e+00, 9.49900000e-03, 2.13760000e-02]]) mcdeviance_ = np.array([ 11.314784, 11.404113, 12.97937 , 12.815567]) ppdeviance_ = np.array([ 10.751542, 3.978192, 7.274981, 3.450069]) mcthres_ = np.array([[ 1.685799, 3.172558, 4.659317], [ 1.892641, 3.387756, 4.882871], [ 2.170386, 3.548901, 4.927417], [ 2.115589, 3.429933, 4.744278]]) mcslope_ = np.array([[ 0.068529, 0.079079, 0.090588], [ 0.060576, 0.070202, 0.080833], [ 0.050019, 0.059275, 0.069829], [ 0.051162, 0.061175, 0.072682]]) mcRpd_ = np.array([ 0.213388, 0.099306, -0.08982 , -0.09154 ]) ppRpd_ = np.array([ 0.320027, 0.580915, 0.600779, 0.768739]) mcRkd_ = np.array([ 0.00158 , -0.129608, -0.268318, -0.25366 ]) ppRkd_ = np.array([-0.327134, 0.372361, 0.431476, 0.707143]) influential_ = np.array([ 95.035529, 273.533598, 118.391833, 117.362097, 83.772145, 54.976046]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 4 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc1" ) def test_1afc_e ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-mcmc -nafc 1 -e -nsamples 100 .testdata -o .testmcmc1e" os.system ( cmd ) f = open ( ".testmcmc1e" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [11,13,52,99] # print "In 1afc e" # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 28., 41., 43., 46., 48., 49.], [ 26., 37., 42., 49., 50., 46.], [ 30., 38., 46., 46., 50., 50.], [ 30., 34., 45., 47., 47., 50.]]) mcestimates_ = np.array([[ -0.132204, 10.175802, 0.0116 ], [ -0.132204, 10.175802, 0.0116 ], [ -0.374314, 9.790229, 0.019928], [ -0.765105, 9.541507, 0.017945]]) mcdeviance_ = np.array([ 13.295048, 13.295048, 12.981131, 13.662284]) ppdeviance_ = np.array([ 3.740625, 11.692917, 9.792765, 5.63142 ]) mcthres_ = np.array([[-2.676155, -0.132204, 2.411746], [-2.676155, -0.132204, 2.411746], [-2.821871, -0.374314, 2.073243], [-3.150482, -0.765105, 1.620272]]) mcslope_ = np.array([[ 0.107231, 0.105976, 0.104138], [ 0.107231, 0.105976, 0.104138], [ 0.110041, 0.108003, 0.105363], [ 0.109071, 0.105896, 0.102188]]) mcRpd_ = np.array([-0.256815, -0.256815, -0.144461, -0.059835]) ppRpd_ = np.array([-0.599741, 0.04276 , 0.318483, 0.19923 ]) mcRkd_ = np.array([-0.420435, -0.420435, -0.267914, -0.14653 ]) ppRkd_ = np.array([-0.615887, -0.344268, -0.475148, -0.160335]) influential_ = np.array([ 196.257643, 170.316221, 139.005295, 91.174052, 119.386247, 71.220669]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc1e" ) class TestCLIgmcmc ( ut.TestCase ): def test_2afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data2afc ) f.close() cmd = "psignifit-bootstrap -nafc 2 -nsamples 100 .testdata -o .pilot2" os.system ( cmd ) cmd = "psignifit-mcmc -nafc 2 -nsamples 100 -generic -proposal .pilot2 .testdata -o .testmcmc2" os.system ( cmd ) f = open ( ".testmcmc2" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [0,13,52,99] # print "In 2afc" # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 31., 36., 41., 49., 49., 50.], [ 31., 36., 40., 46., 50., 50.], [ 31., 37., 43., 42., 47., 48.], [ 32., 38., 45., 46., 48., 48.]]) mcestimates_ = np.array([[ 1.90600100e+00, 6.40395300e+00, 1.55550000e-02], [ 2.64465800e+00, 8.67314900e+00, 4.01100000e-03], [ 1.74393300e+00, 1.58297130e+01, 2.56720000e-02], [ 1.12192900e+00, 2.03367120e+01, 1.18100000e-03]]) mcdeviance_ = np.array([ 11.222675, 8.888714, 18.997799, 20.212403]) ppdeviance_ = np.array([ 5.122639, 5.528634, 3.606824, 7.732305]) mcthres_ = np.array([[ 0.305013, 1.906001, 3.506989], [ 0.476371, 2.644658, 4.812945], [-2.213495, 1.743933, 5.701361], [-3.962249, 1.121929, 6.206107]]) mcslope_ = np.array([[ 0.126225, 0.137095, 0.147162], [ 0.08949 , 0.095569, 0.101446], [ 0.066501, 0.067373, 0.068098], [ 0.053545, 0.053778, 0.053934]]) mcRpd_ = np.array([-0.087845, 0.04226 , 0.683976, 0.7236 ]) ppRpd_ = np.array([ 0.270714, 0.522033, 0.70528 , 0.788184]) mcRkd_ = np.array([-0.309592, -0.327452, 0.62385 , 0.692216]) ppRkd_ = np.array([ 0.203812, -0.507867, 0.696117, 0.722177]) influential_ = np.array([ 111.878579, 208.20494 , 104.901806, 181.676591, 238.259331, 79.115505]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc2" ) os.remove ( ".pilot2" ) def test_1afc ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-bootstrap -nafc 1 -nsamples 100 .testdata -o .pilot1" os.system ( cmd ) cmd = "psignifit-mcmc -nafc 1 -nsamples 100 .testdata -generic -proposal .pilot1 -o .testmcmc1" os.system ( cmd ) f = open ( ".testmcmc1" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,4) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [10,13,52,99] # print "In 1afc" # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 5., 17., 34., 48., 47., 50.], [ 7., 17., 35., 46., 50., 50.], [ 6., 18., 34., 41., 47., 49.], [ 3., 8., 26., 47., 48., 50.]]) mcestimates_ = np.array([[ 2.72517100e+00, 5.81558800e+00, 2.85860000e-02, 2.13760000e-02], [ 2.72517100e+00, 5.81558800e+00, 2.85860000e-02, 2.07710000e-02], [ 3.42634800e+00, 5.59988900e+00, 4.34700000e-02, 2.00650000e-02], [ 3.17301000e+00, 5.52024300e+00, 1.48230000e-02, 2.48100000e-03]]) mcdeviance_ = np.array([ 15.504518, 15.458316, 16.423193, 11.446102]) ppdeviance_ = np.array([ 6.982574, 8.55622 , 7.033939, 11.095793]) mcthres_ = np.array([[ 1.271274, 2.725171, 4.179068], [ 1.271274, 2.725171, 4.179068], [ 2.026376, 3.426348, 4.82632 ], [ 1.792949, 3.17301 , 4.553071]]) mcslope_ = np.array([[ 0.087412, 0.099961, 0.113237], [ 0.087412, 0.099961, 0.113237], [ 0.055359, 0.065182, 0.076258], [ 0.064491, 0.075699, 0.088187]]) mcRpd_ = np.array([ 0.453156, 0.451473, 0.295966, 0.045298]) ppRpd_ = np.array([ 0.617999, 0.687053, -0.561595, 0.597242]) mcRkd_ = np.array([ 0.392086, 0.389713, 0.182683, -0.144049]) ppRkd_ = np.array([ 0.400548, 0.359163, -0.386448, 0.440935]) influential_ = np.array([ 126.033895, 226.040904, 131.002927, 113.542458, 128.385688, 60.451446]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 4 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc1" ) os.remove ( ".pilot1" ) def test_1afc_e ( self ): f = open ( ".testdata", "w" ) writedata ( f, data1afc ) f.close() f = open ( ".testd", "w" ) writedata ( f, data1afc ) f.close() cmd = "psignifit-bootstrap -nafc 1 -e -nsamples 100 .testdata -o .pilot1e" os.system ( cmd ) cmd = "psignifit-mcmc -nafc 1 -e -nsamples 100 -generic -proposal .pilot1e .testdata -o .testmcmc1e" os.system ( cmd ) f = open ( ".testmcmc1e" ) results = f.read() f.close() mcdata = np.reshape ( getvariable ( "mcdata", results ), (-1,6) ) mcestimates = np.reshape ( getvariable ( "mcestimates", results ), (-1,3) ) mcdeviance = getvariable ( "mcdeviance", results ) ppdeviance = getvariable ( "ppdeviance", results ) mcthres = np.reshape ( getvariable ( "mcthres", results ), (-1,3) ) mcslope = np.reshape ( getvariable ( "mcslopes", results ), (-1,3) ) mcRpd = getvariable ( "mcRpd", results ) mcRkd = getvariable ( "mcRkd", results ) ppRpd = getvariable ( "ppRpd", results ) ppRkd = getvariable ( "ppRkd", results ) influential = getvariable ( "influential", results ) ts = [11,13,52,99] # print "In 1afc e" # print "mcdata_ = np.%s" % (repr(mcdata[ts,:]),) # print "mcestimates_ = np.%s" % (repr(mcestimates[ts,:]),) # print "mcdeviance_ = np.%s" % (repr(mcdeviance[ts]),) # print "ppdeviance_ = np.%s" % (repr(ppdeviance[ts]),) # print "mcthres_ = np.%s" % (repr(mcthres[ts,:]),) # print "mcslope_ = np.%s" % (repr(mcslope[ts,:]),) # print "mcRpd_ = np.%s" % (repr(mcRpd[ts]),) # print "ppRpd_ = np.%s" % (repr(ppRpd[ts]),) # print "mcRkd_ = np.%s" % (repr(mcRkd[ts]),) # print "ppRkd_ = np.%s" % (repr(ppRkd[ts]),) # print "influential_ = np.%s" % (repr(influential),) mcdata_ = np.array([[ 7., 13., 40., 42., 49., 48.], [ 7., 15., 31., 44., 50., 50.], [ 9., 22., 34., 41., 47., 49.], [ 6., 12., 26., 44., 48., 50.]]) mcestimates_ = np.array([[ 3.26083400e+00, 6.78055500e+00, 3.95100000e-03], [ 3.02569000e+00, 6.78055500e+00, 3.95100000e-03], [ 3.06885200e+00, 6.86530000e+00, 2.35320000e-02], [ 3.04677000e+00, 7.72253400e+00, 4.85300000e-03]]) mcdeviance_ = np.array([ 11.364161, 11.641574, 14.460014, 14.385695]) ppdeviance_ = np.array([ 11.153502, 6.482785, 3.708924, 9.635855]) mcthres_ = np.array([[ 1.565695, 3.260834, 4.955972], [ 1.330551, 3.02569 , 4.720829], [ 1.352527, 3.068852, 4.785177], [ 1.116137, 3.04677 , 4.977404]]) mcslope_ = np.array([[ 0.070599, 0.079499, 0.088946], [ 0.078954, 0.088372, 0.098207], [ 0.077677, 0.086845, 0.096422], [ 0.079982, 0.087619, 0.095388]]) mcRpd_ = np.array([ 0.368229, 0.428669, 0.612444, 0.63752 ]) ppRpd_ = np.array([-0.098848, 0.615304, -0.630584, 0.753689]) mcRkd_ = np.array([ 0.167808, 0.24518 , 0.537823, 0.543597]) ppRkd_ = np.array([-0.239527, -0.020323, -0.475612, 0.682009]) influential_ = np.array([ 205.008381, 147.835769, 124.361312, 97.577949, 158.19065 , 54.382314]) for k,s in enumerate ( ts ): for block in xrange ( 6 ): self.assertAlmostEqual ( mcdata[s,block], mcdata_[k,block] ) for prm in xrange ( 3 ): self.assertAlmostEqual ( mcestimates[s,prm], mcestimates_[k,prm] ) for cut in xrange ( 3 ): self.assertAlmostEqual ( mcthres[s,cut], mcthres_[k,cut] ) self.assertAlmostEqual ( mcslope[s,cut], mcslope_[k,cut] ) self.assertAlmostEqual ( mcdeviance[s],mcdeviance_[k] ) self.assertAlmostEqual ( mcRpd[s],mcRpd_[k] ) self.assertAlmostEqual ( mcRkd[s],mcRkd_[k] ) self.assertAlmostEqual ( ppRpd[s],ppRpd_[k] ) self.assertAlmostEqual ( ppRkd[s],ppRkd_[k] ) for block in xrange ( 6 ): self.assertAlmostEqual ( influential[block], influential_[block] ) os.remove ( ".testdata" ) os.remove ( ".testmcmc1e" ) # os.remove ( ".pilot1e" ) if __name__ == "__main__": ut.main() psignifit3-3.0~beta.20120611.1/tests/interface_test.py000066400000000000000000000147621176542545200222570ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ Unit tests for interface methods provided by swignifit. """ import numpy as np import numpy.testing as npt import unittest as ut import os import swignifit.swignifit_raw as sfr import swignifit.utility as sfu import swignifit.interface_methods as interface ################################################################################ # original swignifit tests x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 data = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] class TestBootstrap(ut.TestCase): def test_basic(self): interface.bootstrap(data) def test_old_doctest(self): x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] priors = ('flat','flat','Uniform(0,0.1)') sfr.setSeed(1) samples,est,D,thres,thbias,thacc,slope,slbias,slacc,Rkd,Rpd,out,influ = interface.bootstrap(d,nsamples=2000,priors=priors) self.assertAlmostEqual( np.mean(est[:,0]), 2.7537742610139397, places=2) self.assertAlmostEqual( np.mean(est[:,1]), 1.4072288392075412, places=2) def test_start(self): interface.bootstrap(data, nsamples=25, start=[0.1, 0.2, 0.3]) def test_nsamples(self): interface.bootstrap(data, nsamples=666) def test_nafc(self): interface.bootstrap(data, nafc=23) def test_sigmoid(self): interface.bootstrap(data, nsamples=25, sigmoid='gumbel_l') def test_core(self): interface.bootstrap(data, nsamples=25, core='linear') def test_prior(self): priors = ('Gauss(0,10)', 'Gamma(2,3)', 'Uniform(1,5)') interface.bootstrap(data, nsamples=25, priors=priors) def test_cuts(self): interface.bootstrap(data, nsamples=25, cuts=[0.5,0.6,0.75]) def test_parameteric(self): interface.bootstrap(data, nsamples=25, parametric=False) class TestMCMC(ut.TestCase): def test_basic(self): interface.mcmc(data) def test_old_doctest(self): x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] priors = ('Gauss(0,1000)','Gauss(0,1000)','Beta(3,100)') stepwidths = (1.,1.,0.01) sfr.setSeed(1) (estimates, deviance, posterior_predictive_data, posterior_predictive_deviances, posterior_predictive_Rpd, posterior_predictive_Rkd, logposterior_ratios, accept_rate) = interface.mcmc(d,nsamples=10000,priors=priors,stepwidths=stepwidths) self.assertAlmostEqual( np.mean(estimates[:,0]), 2.5463976926832483) self.assertAlmostEqual( np.mean(estimates[:,1]), 7.335732619111738, places=3) def test_start(self): interface.mcmc(data,nsamples=25, start=[0.1,0.2,0.3]) def test_nsamples(self): interface.mcmc(data,nsamples=666) def test_nafc(self): interface.mcmc(data,nsamples=25, nafc=23) def test_sigmoid(self): interface.mcmc(data,nsamples=25, sigmoid='gumbel_r') def test_core(self): interface.mcmc(data, nsamples=25, core='ab') def test_prior(self): priors = ('Gauss(0,10)', 'Gamma(2,3)', 'Uniform(1,5)') interface.mcmc(data, nsamples=25, priors=priors) def test_stepwidth(self): interface.mcmc(data, nsamples=25, stepwidths=[0.1, 0.2, 0.3]) def test_alternate_samplers(self): # this used to fail for psipy, since it does not support alternative # samplers interface.mcmc(data, nsamples=25, sampler="MetropolisHastings") interface.mcmc(data, nsamples=25, sampler="GenericMetropolis") self.assertRaises(sfu.PsignifitException, interface.mcmc, data, sampler="DoesNotExist") class TestMapestimate(ut.TestCase): def test_basic(self): interface.mapestimate(data) def test_old_doctest(self): x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] priors = ('flat','flat','Uniform(0,0.1)') estimate, fisher, thres, slope, deviance = interface.mapestimate ( d, priors=priors ) npt.assert_almost_equal(np.array([ 2.7517523 , 1.45728454, 0.01555464]), estimate, decimal=3) self.assertAlmostEqual(2.7517523000189286, thres[0], places=3) self.assertAlmostEqual(8.07133136423, deviance, places=3) def test_nafc(self): interface.mapestimate(data, nafc=23) def test_sigmoid(self): interface.mapestimate(data, sigmoid='gauss') def test_core(self): interface.mapestimate(data, core='mw0.2') def test_priors(self): priors = ('Gauss(0,10)', 'Gamma(2,3)', 'Uniform(1,5)') interface.mapestimate(data, priors=priors) def test_cuts(self): interface.mapestimate(data, cuts=[0.5, 0.75, 0.85]) def test_start(self): estimate, fisher, thres, slope, deviance = interface.mapestimate (data, start=[0.1, 0.2, 0.3]) class TestDiagnostics(ut.TestCase): prm = [2.75, 1.45, 0.015] def test_basic(self): interface.diagnostics(data, TestDiagnostics.prm) def test_old_doctest(self): x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 d = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] prm = [2.75, 1.45, 0.015] pred,di,D,thres,slope,Rpd,Rkd = interface.diagnostics(d,prm) self.assertAlmostEqual(8.07484858608, D) self.assertAlmostEqual(1.68932796526, di[0]) self.assertAlmostEqual(-0.19344675783032761, Rpd) def test_nafc(self): interface.diagnostics(data, TestDiagnostics.prm, nafc=23) def test_sigmoid(self): interface.diagnostics(data, TestDiagnostics.prm, sigmoid='logistic') def test_core(self): interface.diagnostics(data, TestDiagnostics.prm, core='linear') def test_cuts(self): interface.diagnostics(data, TestDiagnostics.prm, cuts=[0.5, 0.75, 0.85]) def test_intensities_only(self): predicted = interface.diagnostics(x, TestDiagnostics.prm) def test_empty_data(self): # if an empty sequence is passed we only obtain the threshold result = interface.diagnostics([], TestDiagnostics.prm) psignifit3-3.0~beta.20120611.1/tests/memory_test.py000066400000000000000000000024151176542545200216170ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### __doc__ = """This file is intended to be run with valgrind --tool=memcheck --leak-check=full /usr/bin/python memory_test.py to detect memory leaks in the python interface.""" from pypsignifit.psigobservers import Observer import swignifit.interface_methods as interface import os import pylab O = Observer ( 4,2,.02 ) d = O.DoAnExperiment ( [0.,1.,2.,3,4.,5.,6.,7.,8.,9.], 20 ) priors = ("Gauss(0,100)","Gamma(1,4)","Beta(2,50)") def sample (): boots = interface.bootstrap ( d, priors=priors, nsamples=1500-2*k ) mape = interface.mapestimate ( d, priors=priors ) mcmc = interface.mcmc ( d, start=(4,2,.02), priors=priors, nsamples = 1500-2*k ) diag = interface.diagnostics ( d, (4,1,.02) ) return float(os.popen ( "ps -C python -o rss" ).readlines()[1])/1024 n = [] n.append ( float(os.popen ( "ps -C python -o rss" ).readlines()[1])/1024 ) for k in xrange ( 200 ): print k n.append ( sample() ) pylab.plot(n) pylab.ylabel("kB") pylab.show() psignifit3-3.0~beta.20120611.1/tests/psignidatatest.py000066400000000000000000000220701176542545200222720ustar00rootroot00000000000000#!/usr/bin/env python import unittest as ut import pypsignifit.psignidata as pd import swignifit.swignifit_raw as sft import numpy as np import sys def approximatedly_equal ( x, y, eps=1e-4 ): e = abs ( x-y ) > eps if not e==0: sys.stderr.write ( "%g != %g\n" % (x,y) ) return e class TestPsiInference ( ut.TestCase ): def setUp ( self ): self.pinf = pd.PsiInference () self.pinf.estimate = [2.,1.,.02] def test_evaluate ( self ): evaluated = self.pinf.evaluate ( [1,2],[2.,1.,.02] ) self.assertEqual ( approximatedly_equal ( evaluated[0], 0.62909188225759771), 0 ) self.assertEqual ( approximatedly_equal ( evaluated[1], 0.74), 0 ) evaluated = self.pinf.evaluate ( [1,2] ) self.assertEqual ( approximatedly_equal ( evaluated[0], 0.62909188225759771), 0 ) self.assertEqual ( approximatedly_equal ( evaluated[1], 0.74), 0 ) def test_getThres ( self ): self.assertRaises ( NotImplementedError, self.pinf.getThres, .5 ) self.pinf.data = [[1,2,3]] evaluated = self.pinf.getThres ( .5 ) self.assertEqual ( approximatedly_equal ( evaluated, 2.), 0 ) evaluated = self.pinf.getThres ( .3 ) self.assertEqual ( approximatedly_equal ( evaluated, 1.1527021396127963), 0 ) def test_repr ( self ): self.assertEqual ( self.pinf.__repr__(), "< PsiInference object >" ) def test_properties ( self ): self.assertEqual ( self.pinf.desc, 'sigmoid: logistic\ncore: ab\nnAFC: 2' ) self.assertEqual ( self.pinf.label, "Psychometric function fit" ) self.assertEqual ( self.pinf.color, "b" ) self.assertEqual ( self.pinf.linestyle, "-" ) self.assertEqual ( self.pinf.marker, "o" ) self.assertEqual ( self.pinf.linewidth, 1 ) class TestBootstrapInference ( ut.TestCase ): def setUp ( self ): sft.setSeed(0) nafc = 2 stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] number_of_correct = [34,32,40,48,50,48] number_of_trials = [50]*len(stimulus_intensities) data = zip(stimulus_intensities,number_of_correct,number_of_trials) self.parametric = pd.BootstrapInference ( data, priors=("","","Beta(2,30)"), parametric=True ) self.nonparametric = pd.BootstrapInference ( data, priors=("","","Beta(2,30)"), parametric=False ) def test_map ( self ): map1 = self.parametric.estimate map2 = self.nonparametric.estimate should_be = [ 2.7373, 1.40406, 0.020320093764199146 ] for val1,val2,val3 in zip(map1,map2,should_be): self.assertEqual ( approximatedly_equal ( val1, val2 ), 0 ) self.assertEqual ( approximatedly_equal ( val1, val3 ), 0 ) def test_boots ( self ): self.parametric.sample () self.nonparametric.sample () parci = self.parametric.getCI(1) nprci = self.nonparametric.getCI(1) self.assertEqual ( approximatedly_equal ( parci[0], 1.69 ), 0 ) self.assertEqual ( approximatedly_equal ( parci[1], 3.8539 ), 0 ) self.assertEqual ( approximatedly_equal ( nprci[0], 1.11463 ), 0 ) self.assertEqual ( approximatedly_equal ( nprci[1], 4.05597 ), 0 ) self.assertEqual ( self.parametric.nsamples, 2000 ) self.assertEqual ( self.nonparametric.nsamples, 2000 ) self.assertEqual ( approximatedly_equal ( self.parametric.deviance, 8.1689126711025022 ), 0 ) self.assertEqual ( approximatedly_equal ( self.nonparametric.deviance, 8.1689126711025022 ), 0 ) def test_sensitivity ( self ): self.parametric.sensitivity_analysis (verbose=False) parci = [ 1.5905, 3.87779 ] extci = self.parametric.getCI(1) for par,ext in zip(parci,extci): self.assertEqual ( approximatedly_equal ( par, ext ), 0 ) def test_keywordhandling ( self ): self.assertRaises ( ValueError, pd.BootstrapInference, self.parametric.data, shape="logistic" ) def test_pickling ( self ): import pickle string = pickle.dumps ( self.parametric ) unpickled_parametric = pickle.loads ( string ) string = pickle.dumps ( self.nonparametric ) unpickled_nonparametric = pickle.loads ( string ) class TestBayesInference ( ut.TestCase ): def setUp ( self ): sft.setSeed(0) nafc = 2 stimulus_intensities = [0.0,2.0,4.0,6.0,8.0,10.0] number_of_correct = [34,32,40,48,50,48] number_of_trials = [50]*len(stimulus_intensities) data = zip(stimulus_intensities,number_of_correct,number_of_trials) self.mcmc = pd.BayesInference ( data, priors=("Gauss(0,100)","Gamma(1.01,200)","Beta(2,30)") ) def test_all ( self ): mapest = self.mcmc.mapestimate meanest = self.mcmc.estimate map_target = [ 2.73973931, 6.15554732, 0.02034599] mean_target =[ 2.64938, 6.44707, 0.027297] steps_made = self.mcmc._steps steps = [ 0.726551, 2.45564, 0.013264] burnin = 0 thinning = 1 nsamples = 600 for k in xrange ( 3 ): self.assertEqual ( approximatedly_equal ( mapest[k], map_target[k] ), 0 ) self.assertEqual ( approximatedly_equal ( meanest[k], mean_target[k] ), 0 ) self.assertEqual ( approximatedly_equal ( steps_made[k], steps[k] ), 0 ) self.assertEqual ( approximatedly_equal ( self.mcmc.bayesian_p(),0.126667 ), 0 ) self.assertEqual ( burnin, self.mcmc.burnin ) self.assertEqual ( thinning, self.mcmc.thin ) self.assertEqual ( nsamples, self.mcmc.nsamples ) target_rpd = -0.0244598 target_rkd = -0.362064 self.assertEqual ( approximatedly_equal ( self.mcmc.Rpd, target_rpd ), 0 ) self.assertEqual ( approximatedly_equal ( self.mcmc.Rkd, target_rkd ), 0 ) target_dr = (1.64122, -0.675137, -0.709666, 0.925372, 2.00248, -0.376286) target_thres = [ 1.03761, 2.64938, 4.26115] target_deviance = 8.66087 for dr,tdr in zip ( self.mcmc.devianceresiduals, target_dr ): self.assertEqual ( approximatedly_equal ( dr, tdr ), 0 ) for th,tth in zip ( self.mcmc.thres, target_thres ): self.assertEqual ( approximatedly_equal ( th, tth ), 0 ) self.assertEqual ( approximatedly_equal ( self.mcmc.deviance, target_deviance ), 0 ) # Randomly check single samples target_mcRpd = [ -0.162011225773 , -0.658780099748 , 0.142264200236 ] target_mcRkd = [ -0.519220509587 , -0.969883465483 , -0.199933951214 ] target_mcthres = [ [ 1.20085248224 , 2.73973931207 , 4.27862614189 ], [ 2.87682033438 , 3.73674348349 , 4.5966666326 ], [ 0.70405560915 , 2.68052230561 , 4.65698900207 ] ] indices = [10,50,100] for k in xrange ( 3 ): self.assertEqual ( approximatedly_equal ( self.mcmc.mcRpd[indices[k]], target_mcRpd[k] ), 0 ) self.assertEqual ( approximatedly_equal ( self.mcmc.mcRkd[indices[k]], target_mcRkd[k] ), 0 ) for l in xrange ( 3 ): self.assertEqual ( approximatedly_equal ( self.mcmc.mcthres[indices[k]][l], target_mcthres[k][l] ), 0 ) def test_keywordhandling ( self ): self.assertRaises ( ValueError, pd.BayesInference, self.mcmc.data, shape="logistic" ) def test_pickling ( self ): import pickle string = pickle.dumps ( self.mcmc ) unpickled_mcmc = pickle.loads ( string ) self.mcmc = unpickled_mcmc class Testcheck_kwargs ( ut.TestCase ): def test_checking ( self ): self.assertRaises ( ValueError, pd.check_kwargs, {"test": 1}, "Some text" ) docstr = """:Parameters: *test* : useless documentation *anotherprm* : dummy parameter *prm0* : should work with numbers, too *prmCamelCase* : should work with capitals, too *prm_with_underscores* : and should work with underscores *prmtype* : float and should work with type specifications """ self.assertEqual ( 0, pd.check_kwargs ( {"test": 1}, docstr ) ) self.assertEqual ( "notavailable", pd.check_kwargs ( {"notavailable": 1}, docstr ) ) self.assertEqual ( 0, pd.check_kwargs ( {"prm0": 1}, docstr ) ) self.assertEqual ( 0, pd.check_kwargs ( {"prmCamelCase": 1}, docstr ) ) self.assertEqual ( 0, pd.check_kwargs ( {"prm_with_underscores": 1}, docstr ) ) self.assertEqual ( 0, pd.check_kwargs ( {"prmtype": 1}, docstr ) ) self.assertEqual ( "notin1", pd.check_kwargs ( {"notin1": 1, "test": 1}, docstr ) ) self.assertEqual ( "notin1", pd.check_kwargs ( {"test": 1, "notin1": 1}, docstr ) ) self.assertEqual ( "notin1", pd.check_kwargs ( {"test": 1, "notin1": 1, "notin2": 1}, docstr ) ) if __name__ == "__main__": ut.main() # suite = ut.TestLoader().loadTestsFromTestCase(TestBayesInference) # ut.TextTestRunner ().run(suite) psignifit3-3.0~beta.20120611.1/tests/swignifit_raw_test.py000066400000000000000000000271271176542545200231720ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ Unit Tests for raw swig wrapper """ import numpy, pylab import unittest as ut import swignifit.swignifit_raw as sfr import swignifit.utility as sfu import pypsignifit.psignipriors as pfp class TestData(ut.TestCase): @staticmethod def generate_test_dataset(): x = sfr.vector_double([0.,2.,4.,6., 8., 10.]) k = sfr.vector_int([24, 32, 40,48, 50,48]) n = sfr.vector_int(6*[50]) return sfr.PsiData(x, n, k, 2) def test_data(self): data = TestData.generate_test_dataset() data.setNcorrect(sfr.vector_int([24, 32, 40,48, 50,48])) data.getIntensities() data.getNtrials() data.getNcorrect() data.getPcorrect() blocks = data.getNblocks() for i in range(blocks): data.getIntensity(i) data.getNtrials(i) data.getNcorrect(i) data.getPcorrect(i) data.getNoverK(i) data.getNalternatives() data.nonasymptotic() class TestSigmoid(ut.TestCase): """ test that all sigmoids have been wrapped and can be executed """ def all_methods(self, sigmoid): s = sigmoid() s.f(0.0) s.df(0.0) s.ddf(0.0) s.inv(0.1) s.clone() s2 = sigmoid(s) def test_cauchy(self): self.all_methods(sfr.PsiCauchy) def test_exponential(self): self.all_methods(sfr.PsiExponential) def test_gauss(self): self.all_methods(sfr.PsiGauss) def test_gumbell(self): self.all_methods(sfr.PsiGumbelL) def test_gumbelr(self): self.all_methods(sfr.PsiGumbelR) def test_logistic(self): self.all_methods(sfr.PsiLogistic) def test_exponential_exception(self): s = sfr.PsiExponential() self.assertRaises(ValueError, s.inv, 0) self.assertRaises(ValueError, s.inv, 1) class TestCore(ut.TestCase): data = TestData.generate_test_dataset() def all_methods(self, core): c = core(TestCore.data, 1, 0.1) params = sfr.vector_double([1.0,1.0]) c.g(0.0, params) c.dg(0.0,params,0) c.dg(0.0,params,1) c.ddg(0.0,params,0,0) c.ddg(0.0,params,0,1) c.ddg(0.0,params,1,0) c.ddg(0.0,params,1,1) c.inv(0.0,params) c.dinv(0.0,params,0) c.dinv(0.0,params,1) c.transform(2,1.0,1.0) c.clone() c2 = core(c) def test_ab_core(self): self.all_methods(sfr.abCore) def test_linear_core(self): self.all_methods(sfr.linearCore) def test_log_core(self): self.all_methods(sfr.logCore) def test_mw_core(self): # mwCore constructor is a bit different than the rest self.all_methods(sfr.mwCore) def test_poly_core(self): self.all_methods(sfr.polyCore) def test_weibull_core(self): self.all_methods(sfr.weibullCore) def test_exceptions(self): c = sfr.logCore(TestCore.data) params = sfr.vector_double([1.0,1.0]) self.assertRaises(ValueError, c.g, -1.0, params) c = sfr.weibullCore(TestCore.data) self.assertRaises(ValueError, c.dg, -1.0, params, 0) self.assertRaises(ValueError, c.ddg, -1.0, params, 0, 1) class TestPriors(ut.TestCase): def all_methods(self, prior): p = prior(1.5, 3) p.pdf(0.0) p.dpdf(0.0) p.rand() p.clone() p2 = prior(p) p.get_code() def test_beta_prior(self): self.all_methods(sfr.BetaPrior) def test_gamma_prior(self): self.all_methods(sfr.GammaPrior) def test_ngamma_prior(self): self.all_methods(sfr.nGammaPrior) def test_gauss_prior(self): self.all_methods(sfr.GaussPrior) def test_uniform_prior(self): self.all_methods(sfr.UniformPrior) class TestPsychometric(ut.TestCase): @staticmethod def generate_test_model(): # IMPORTANT: here we can use the fact that PsiPsychometic manages its # own memory, and we don't need to hang on to th sigmoid, core, and # prior. return sfr.PsiPsychometric(2, sfr.abCore(), sfr.PsiLogistic()) def test_pschometric(self): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() params = sfr.vector_double([0.5,0.5,0.01]) pr = sfr.UniformPrior(0,1) psi.setPrior(0,pr) psi.setPrior(1,pr) psi.setPrior(2,pr) psi.evaluate(0.0,params) psi.negllikeli(params,data) psi.neglpost(params, data) psi.leastfavourable(params, data, 0.0) psi.deviance(params, data) psi.ddnegllikeli(params, data) psi.dnegllikeli(params, data) psi.getCore() psi.getSigmoid() def test_memory_management(self): core = sfr.abCore() sigmoid = sfr.PsiLogistic() psi = sfr.PsiPsychometric(2,core,sigmoid) def test_exceptions(self): psi = TestPsychometric.generate_test_model() # for 2AFC we have 3 paramters with indices [0,1,2] self.assertRaises(ValueError, psi.setPrior,3, sfr.UniformPrior(0,1)) class TestOptimizer(ut.TestCase): def test_optimize(self): model = TestPsychometric.generate_test_model() data = TestData.generate_test_dataset() opt = sfr.PsiOptimizer(model, data) opt.optimize(model, data, None) class TestBootstrap(ut.TestCase): @staticmethod def generate_test_bootstrap_list(): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() cuts = sfr.vector_double([1, 0.5]) return sfr.bootstrap(999, data, psi, cuts) @staticmethod def generate_test_jackknife_list(): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() return sfr.jackknifedata(data, psi) def test_bootstrap(self): TestBootstrap.generate_test_bootstrap_list() def test_jackknifedata(self): TestBootstrap.generate_test_jackknife_list() class TestMCMC(ut.TestCase): def all_sampler_methods(self, sampler): sampler.draw() theta = sampler.getTheta() sampler.setTheta(theta) sampler.setStepSize(sfr.vector_double([0.1,0.2,0.3])) sampler.getDeviance() sampler.sample(25) sampler.getModel() sampler.getData() def test_metropolis_hastings(self): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() sampler = sfr.MetropolisHastings(psi, data, sfr.GaussRandom()) self.all_sampler_methods(sampler) new_theta = sfr.vector_double(sampler.getNparams()) sampler.proposePoint(sfr.vector_double(sampler.getTheta()), sfr.vector_double(sampler.getStepsize()), sfr.GaussRandom(), new_theta) def test_generic_metropolis(self): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() sampler = sfr.GenericMetropolis(psi, data, sfr.GaussRandom()) self.all_sampler_methods(sampler) new_theta = sfr.vector_double(sampler.getNparams()) sampler.proposePoint(sfr.vector_double(sampler.getTheta()), sfr.vector_double(sampler.getStepsize()), sfr.GaussRandom(), new_theta) mclist = sampler.sample(4) sampler.findOptimalStepwidth(mclist) def test_independence_mcmc(self): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() # just test initialization sampler = sfr.DefaultMCMC(psi, data, sfr.GaussRandom()) # default priors has length 4 priors = pfp.default(data.getIntensities()) for i,p in enumerate(priors): sampler.set_proposal(i, sfu.get_prior(p)) def test_not_enough_samples(self): data = TestData.generate_test_dataset() psi = TestPsychometric.generate_test_model() sampler = sfr.GenericMetropolis(psi, data, sfr.GaussRandom()) pilot = sampler.sample(2) self.assertRaises(ValueError, sampler.findOptimalStepwidth, pilot) class TestMCList(ut.TestCase): def test_psi_mclist(self): bs_list = TestBootstrap.generate_test_bootstrap_list() bs_list.getEst(0) bs_list.getEst(0,0) bs_list.getPercentile(0.95, 0) bs_list.getMean(0) bs_list.getdeviance(0) bs_list.getNsamples() bs_list.getNparams() bs_list.getDeviancePercentile(0.95) bs_list.setEst(0, sfr.vector_double([0.1,0.1,0.1]), 0.95) bs_list.setdeviance(0,0.95) def test_bootstrap_list(self): bs_list = TestBootstrap.generate_test_bootstrap_list() bs_list.getData(0) # segmentation fault? #bs_list.getThres(0.95, 0) bs_list.getThres_byPos(0,0) bs_list.getNblocks() bs_list.getCut(0) bs_list.getAcc_t(0) bs_list.getAcc_s(0) bs_list.getBias_t(0) bs_list.getBias_s(0) bs_list.getRpd(0) # should this not throw a BadIndexError bs_list.percRpd(0) bs_list.getRkd(0) # should this not thow a BadIndexError? bs_list.percRkd(0) bs_list.setBCa_t(0, 0.1, 0.1) bs_list.setBCa_s(0, 0.1, 0.1) bs_list.setData(0, sfr.vector_int([24, 32, 40,48, 50,48])) bs_list.setThres(0.5, 0, 0) bs_list.setRpd(0, 0.5) bs_list.setRkd(0, 0.5) def test_jackknifedata(self): jk_list = TestBootstrap.generate_test_jackknife_list() jk_list.getNblocks() jk_list.influential(0, sfr.vector_double([0.0, 0.0, 0.0]), sfr.vector_double([0.0, 0.0, 0.0])) jk_list.outlier(0) class TestRNG(ut.TestCase): def all_methods(self, random): random.draw() random.clone() def test_gauss_random(self): self.all_methods(sfr.GaussRandom()) self.all_methods(sfr.GaussRandom(mean=5, standarddeviation=0.1)) def test_uniform_random(self): self.all_methods(sfr.UniformRandom()) self.all_methods(sfr.UniformRandom(low=-1, up=2)) def test_binomial_random(self): binomial = sfr.BinomialRandom(6, 0.25) self.all_methods(binomial) binomial.setprm(10, 0.9) self.all_methods(binomial) def test_set_seed(self): sfr.setSeed(1) class TestLinalg(ut.TestCase): def test_matrix(self): rows = columns = 5 matrix = sfr.Matrix(rows, columns) for (i,j) in ((i,j) for i in xrange(rows) for j in xrange(columns)): # here we use the typemap magic from cpointer.i sfr.doublep_assign(matrix(i,j), 1 if i ==j else 0) # print is a python keyword, hence it was wrapped as _print # do not test print! #matrix._print() matrix.getnrows() matrix.getncols() matrix.cholesky_dec() # TODO some of these fail due to segementation faults matrix.lu_dec() matrix.qr_dec() matrix.inverse_qr() matrix.regularized_inverse(0.1) matrix.solve(sfr.vector_double([0.1]*5)) matrix.inverse() matrix * sfr.vector_double([0.5] * 5) matrix.scale(0.1) matrix.symmetric() # TODO use a dependent matrix (all ones) to test that decompositions, # solve and inverse don't work psignifit3-3.0~beta.20120611.1/tests/test_interface_extended.py000066400000000000000000000143161176542545200241320ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ Extended Unit tests for interface methods provided by swignifit. """ ###################################################################### # old psipy tests, now also useful for swignifit #################### 2afc ######################### def makedata ( neg=False ): if neg: return zip([1,2,3,4,5,6],[49,50,45,29,26,25],[50]*6) else: return zip([1,2,3,4,5,6],[25,26,29,45,50,49],[50]*6) class TestPsipy_2afc ( ut.TestCase ): def test_bootstrap ( self ): """Call bootstrap""" priors = ("","","Uniform(0,.1)") interface.bootstrap ( makedata(), priors=priors ) def test_mcmc ( self ): """Call mcmc""" priors = ("Gauss(0,100)","Gamma(1,4)","Beta(2,50)") interface.mcmc ( makedata(), start=(4,1,.02), priors=priors ) def test_map ( self ): """Call mapestimator""" priors = ("","","Uniform(0,.1)") interface.mapestimate ( makedata(), priors=priors ) def test_diagnostics ( self ): """Call diagnostics""" interface.diagnostics ( makedata(), (4,1,.02) ) def test_sigmoids ( self ): """Try different sigmoids (assumes working mapestimator)""" priors = ("","","Uniform(0,.1)") for s in ["logistic","cauchy","gauss","gumbel_r","gumbel_l","exponential"]: interface.mapestimate ( makedata(), priors=priors, sigmoid=s ) def test_cores ( self ): """Try different cores (assumes working mapestimator)""" priors = ("","","Uniform(0,.1)") for c in ["ab","mw0.1","poly","weibull","log","linear"]: interface.mapestimate ( makedata(), priors=priors, core=c ) def test_weibull ( self ): """Try different parameterizations of the weibull (assumes working mapestimator)""" interface.mapestimate ( makedata(), priors = ("","","Uniform(0,.1)"), sigmoid="exponential", core="poly" ) interface.mapestimate ( makedata(), priors = ("","","Uniform(0,.1)"), sigmoid="gumbel_r", core="weibull" ) interface.mapestimate ( makedata(), priors = ("","","Uniform(0,.1)"), sigmoid="gumbel_r", core="log" ) def test_priors ( self ): """Try different combinations of priors (assumes working mapestimator)""" for mprior in ["Gauss(0,100)","Uniform(-30,30)",""]: for wprior in ["Gauss(0,100)","Gamma(1,4)","Uniform(0,5)",""]: for lprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: interface.mapestimate ( makedata(), priors = (mprior,wprior,lprior), core="mw0.1" ) for mprior in ["Gauss(0,100)","Uniform(-30,30)",""]: for wprior in ["Gauss(0,100)","nGamma(1,4)","Uniform(-5,0)",""]: for lprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: interface.mapestimate ( makedata(True), priors = (mprior,wprior,lprior), core="mw0.1" ) ##################### yes/no ######################## def makedata_yn ( neg=False ): if neg: return zip ( [1,2,3,4,5,6],[40,46,27,25,14,1],[50]*6) else: return zip ( [1,2,3,4,5,6],[1,14,25,27,46,49],[50]*6) class TestPsipy_yn ( ut.TestCase ): def test_bootstrap ( self ): """Call bootstrap""" priors = ("","","Uniform(0,.1)","Uniform(0,.1)") interface.bootstrap ( makedata_yn(), priors=priors, nafc=1 ) def test_mcmc ( self ): """Call mcmc""" priors = ("Gauss(0,100)","Gamma(1,4)","Beta(2,50)","Beta(2,50)") interface.mcmc ( makedata_yn(), start=(4,1,.02,.02), priors=priors, nafc=1 ) def test_map ( self ): """Call mapestimator""" priors = ("","","Uniform(0,.1)","Uniform(0,.1)") interface.mapestimate ( makedata_yn(), priors=priors, nafc=1 ) def test_diagnostics ( self ): """Call diagnostics""" interface.diagnostics ( makedata_yn(), (4,1,.02,.02), nafc=1 ) def test_sigmoids ( self ): """Try different sigmoids (assumes working mapestimator)""" priors = ("","","Uniform(0,.1)","Uniform(0,.1)") for s in ["logistic","cauchy","gauss","gumbel_r","gumbel_l","exponential"]: interface.mapestimate ( makedata_yn(), priors=priors, sigmoid=s, nafc=1 ) def test_cores ( self ): """Try different cores (assumes working mapestimator)""" priors = ("","","Uniform(0,.1)","Uniform(0,.1)") for c in ["ab","mw0.1","poly","weibull","log","linear"]: interface.mapestimate ( makedata_yn(), priors=priors, core=c, nafc=1 ) def test_weibull ( self ): """Try different parameterizations of the weibull (assumes working mapestimator)""" interface.mapestimate ( makedata_yn(), priors = ("","","Uniform(0,.1)","Uniform(0,.1)"), nafc=1, sigmoid="exponential", core="poly" ) interface.mapestimate ( makedata_yn(), priors = ("","","Uniform(0,.1)","Uniform(0,.1)"), nafc=1, sigmoid="gumbel_r", core="weibull" ) interface.mapestimate ( makedata_yn(), priors = ("","","Uniform(0,.1)","Uniform(0,.1)"), nafc=1, sigmoid="gumbel_r", core="log" ) def test_priors ( self ): """Try different combinations of priors (assumes working mapestimator)""" for mprior in ["Gauss(0,100)","Uniform(-30,30)",""]: for wprior in ["Gauss(0,100)","Gamma(1,4)","Uniform(0,5)",""]: for lprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: for gprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: interface.mapestimate ( makedata_yn(), priors = (mprior,wprior,lprior,gprior), core="mw0.1", nafc=1 ) for mprior in ["Gauss(0,100)","Uniform(-30,30)",""]: for wprior in ["Gauss(0,100)","nGamma(1,4)","Uniform(-5,0)",""]: for lprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: for gprior in ["Uniform(0,.1)","Beta(2,30)","Gauss(0.05,0.01)",""]: interface.mapestimate ( makedata_yn(), priors = (mprior,wprior,lprior,gprior), core="mw0.1", nafc=1 ) psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/000077500000000000000000000000001176542545200236045ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/README000066400000000000000000000001471176542545200244660ustar00rootroot00000000000000These files are used to generate comparison data from the command line interface to psignifit classic. psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/test.dat000066400000000000000000000000661176542545200252570ustar00rootroot00000000000000 0 24 50 2 32 50 4 40 50 6 48 50 8 50 50 10 48 50 psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/test_yn.dat000066400000000000000000000000661176542545200257650ustar00rootroot00000000000000 0 3 50 2 10 50 4 34 50 6 45 50 8 50 50 10 50 50 psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/testprefs000066400000000000000000000001551176542545200255470ustar00rootroot00000000000000#shape logistic #n_intervals 2 #runs 999 #lambda_limits 0, 0.1 #cuts 0.5 #conf 0.1 0.9 #write_st_sim dummy psignifit3-3.0~beta.20120611.1/tests/testdata_from_psignifit/testprefs_yn000066400000000000000000000001551176542545200262550ustar00rootroot00000000000000#shape logistic #n_intervals 1 #runs 9999 #lambda_limits 0, 0.1 #gamma_limits 0, 1. #cuts 0.5 #conf 0.1 0.9 psignifit3-3.0~beta.20120611.1/tests/utility_test.py000066400000000000000000000070611176542545200220140ustar00rootroot00000000000000#!/usr/bin/env python # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### x = [float(2*k) for k in xrange(6)] k = [34,32,40,48,50,48] n = [50]*6 data = [[xx,kk,nn] for xx,kk,nn in zip(x,k,n)] import unittest as ut import numpy as np import swignifit.swignifit_raw as sfr import swignifit.utility as sfu from interface_test import k, n, x, data class TestUtility(ut.TestCase): def test_make_dataset(self): dataset = sfu.make_dataset(data, 1) self.assertTrue((np.array(x) == np.array(dataset.getIntensities())).all()) self.assertTrue((np.array(k) == np.array(dataset.getNcorrect())).all()) self.assertTrue((np.array(n) == np.array(dataset.getNtrials())).all()) self.assertEqual(1, dataset.getNalternatives()) def test_get_sigmoid(self): logistic = sfr.PsiLogistic() self.assertEqual("PsiLogistic", logistic.__class__.__name__) gauss = sfr.PsiGauss() self.assertEqual("PsiGauss", gauss.__class__.__name__) gumbel_l = sfr.PsiGumbelL() self.assertEqual("PsiGumbelL", gumbel_l.__class__.__name__) gumbel_r = sfr.PsiGumbelR() self.assertEqual("PsiGumbelR", gumbel_r.__class__.__name__) cauchy = sfr.PsiCauchy() self.assertEqual("PsiCauchy", cauchy.__class__.__name__) exponential = sfr.PsiExponential() self.assertEqual("PsiExponential", exponential.__class__.__name__) def test_get_core(self): sigmoid = sfr.PsiLogistic() dataset = sfu.make_dataset(data, 1) ab = sfu.get_core("ab", dataset, sigmoid) self.assertEqual("abCore", ab.__class__.__name__) mw = sfu.get_core("mw", dataset, sigmoid) self.assertEqual("mwCore", mw.__class__.__name__) self.assertEqual(0.1, mw.getAlpha()) mw = sfu.get_core("mw0.2", dataset, sigmoid) self.assertEqual("mwCore", mw.__class__.__name__) self.assertEqual(0.2, mw.getAlpha()) linear = sfu.get_core("linear", dataset, sigmoid) self.assertEqual("linearCore", linear.__class__.__name__) log = sfu.get_core("log", dataset, sigmoid) self.assertEqual("logCore", log.__class__.__name__) weibull = sfu.get_core("weibull", dataset, sigmoid) self.assertEqual("weibullCore", weibull.__class__.__name__) poly = sfu.get_core("poly", dataset, sigmoid) self.assertEqual("polyCore", poly.__class__.__name__) def test_get_prior(self): uniform = sfu.get_prior("Uniform(1,2)") self.assertEqual("UniformPrior", uniform.__class__.__name__) gauss = sfu.get_prior("Gauss(0,1)") self.assertEqual("GaussPrior", gauss.__class__.__name__) beta = sfu.get_prior("Beta(1.5, 3)") self.assertEqual("BetaPrior", beta.__class__.__name__) gamma = sfu.get_prior("Gamma(1.5, 3)") self.assertEqual("GammaPrior", gamma.__class__.__name__) ngamma = sfu.get_prior("nGamma(1.5,3)") self.assertEqual("nGammaPrior", ngamma.__class__.__name__) flat = sfu.get_prior("flat") self.assertEqual(None, flat) unconstrained = sfu.get_prior("unconstrained") self.assertEqual(None, unconstrained) def test_get_cuts(self): # this used to cause an error since # operator.isNumberType() on an ndarry is always true cuts = np.array([1.0, 2.0, 3.0]) sfu.get_cuts(cuts) psignifit3-3.0~beta.20120611.1/todo_separate/000077500000000000000000000000001176542545200203635ustar00rootroot00000000000000psignifit3-3.0~beta.20120611.1/todo_separate/R000066400000000000000000000002061176542545200205050ustar00rootroot00000000000000- continue R interface - Diagnostic plots: Influential, Parameter inspection - MCMC convergence diagnostics and Raftery & Lewis stuff psignifit3-3.0~beta.20120611.1/todo_separate/c++000066400000000000000000000034661176542545200206670ustar00rootroot00000000000000- change transform method of cores to new getstart - noninformative Jeffreys Priors - Goodness of fit (Correlations?) [OK] but correlations are wrong - Unit test with gamma as a free parameter [OK] but only very rough correspondence to psignifit -- should be stricter - Bugs with different cores -> no convergence, exceptionally high deviance with ok looking fit, ... This is only due to the logCore-Kernel that returns -inf for contrasts of 0 - codes in sigmoids should be constants with ' const unsigned int $VARIBALE' - add 'void' to the clone method calls - In PsiMCList, getdeviance and setdeviance should be getDeviance and setDeviance - Review the documentation for BootstrapList - in PsiSigmoid getcode() should be getCode() - Use pure virtual functions in PsiSigmoid, PsiCore, and PsiPrior, instead of NotImplemetedError - Make proper copy constructors for rng.h instead of relying on implicit ones - When using [] to access elements from the vector class, we need to manually check that the index value is within range. Alternatively we could use the 'at()' method, which is index safe, and throws an 'std::out_of_range' exception. Consider replacing parts of the code that do th manual checking with calls to 'at()'. In this case we would also benefit from the swig exception handling for all STL exceptions. MayBe: - implement fullmodel, nullmodel - Implement alternative SimplexAlgorithm (Numerical Recipes?, gsl-Wrapper-Object?) The current one depends heavily on the initial simplex! - Perform some gradient based steps after simplex optimization (doesn't work good) - alternative: Perform some gradient based steps as a special case of simplex optimization (e.g. particularly good points are moved in the direction of the gradient?) psignifit3-3.0~beta.20120611.1/todo_separate/doc000066400000000000000000000010031176542545200210450ustar00rootroot00000000000000- add a delete/uninstall possibility - Makefile/setup.py call for doctests - List _all_ dependencies in terms of packages for debian (python/numpy headers sphinx etc...) - Figure for sigmoid/core philosophy - math symbols in documentation according to http://matplotlib.sourceforge.net/sampledoc/extensions.html in particular: :math:`f(g(x,m,w))` for inline math and .. math:: f(g(x,m,w)) for display style math. - Tutorial 1 - suggest using ipython, especially object? and %cpaste for examples psignifit3-3.0~beta.20120611.1/todo_separate/done000066400000000000000000000071761176542545200212460ustar00rootroot00000000000000+ negative Gamma prior + Influential observations and outliers for Bayes [OK] + improved search for starting values [OK] + influential observations marked graded [OK] + posterior predictive Rkd, Rpd [OK] + more meaningfull errors if sample based plot functions are used before sampling [OK] + Inference objects take relative probabilities, too [OK] + nonparametric bootstrap [OK] + Sensitivity analysis [OK] + Add ThresholdPlot to Tutorial [OK] + resampling of chains in BayesInference objects [OK] + Like ParameterPlot but for thresholds [OK] + move numbers further away from the axes. [OK] + warning message for Rpd: "Try other sigmoid!" [OK] + unit tests [OK] + write a number of simulated observers [OK] + complete tutorial [OK] + setup.py [OK] + More Sigmoids (gumbel, weibull, gauss, ...) [OK] at least for now + log-core to allow fitting data on log contrast (i.e. gumbel to weibull) [OK] + unit tests for logCore and linearCore [OK] + linear core ax+b [OK] + Unit test for mwCore [OK] + Outliers and Influential observations [OK] + MCMC implement dlposteri und dnegllikeli [OK] check hybrid MCMC versus MH-MCMC [OK] can we put both MCMC strategies together to have the same base class? [OK] + Documentation [OK] + pointer arithmetic for datasets [OK] + low level Python interface + generate some functions that perform the parameter parsing -- the code is really ugly in its current state + bootstrap, missing: + return BCa stuff [OK] but is this what we wanted? + return correlations and outliers [OK] + many python functions return new references. Not all of them are properly dereferenced yet. [OK] + ML/MAP-estimate separately [OK] + MCMC [OK] + evaluation, deviance and deviance residuals [OK] + refactor the python toolbox to have "strict" data objects and plot functions working on top of these [OK] + Convergence diagnostics for MCMC [OK] + posterior intervals and posterior histograms for model parameters [OK] + Using linalg matrix routines in leastfavourable [OK] + Don't use asymptotic values for the correlations. [OK] only for Rkd, Rpd seemed be be based on all blocks (Why?) + copy Core, Sigmoid, ... in psychometric [OK] done for priors too + migrate to boost-python? [OK] decided to use SWIG instead psignifit3-3.0~beta.20120611.1/todo_separate/interface000066400000000000000000000003041176542545200222430ustar00rootroot00000000000000- warn if constraint/prior list is too short - Check when we need #include and when #include - Make sure that sscanf does not use locale for Numbers! psignifit3-3.0~beta.20120611.1/todo_separate/matlab000066400000000000000000000000331176542545200215420ustar00rootroot00000000000000+ add sensitivity analysis psignifit3-3.0~beta.20120611.1/todo_separate/python000066400000000000000000000027401176542545200216320ustar00rootroot00000000000000- optimize automatic proposal distribution generation - enable fixing the guessing rate to an arbitrary value (? which?) <- This is actually possible by putting a strong prior on the guessing rate... - what is going on with type checking in psigniplot.GoodnessOfFit? - add a dictionary to the data objects to make them know what they are (stimulus intensity, ...) - ROC curves for 1AFC - allow for the gamma=lambda prior - Blob size reduction for PF - Deviance Bootstrap only one sided test - Error bars on PF. Simply streched bars? (Not sure what is meant) - 68 Confidence Interval - In 3d/4d, we could also integrate the posterior without monte carlo methods. Advantage: We get a somehow analytical formula for the posterior. Disadvantage: Might still take quite long and complicates things like CI estimation. In addition, it would be difficult to estimate the errors originating from the fact that we approximate |R by a compact interval. - Plot MCMC diagnostics for all parameters (Not sure what is meant) - Plot the blue line on top of all the white ones, in the diagnostic plot. - Alternative view: Shaded region of the posterior instead of 20 sample PFs - In diagnostic plots, evtl. ad a message on top (what does this mean) - Replace "model correction" with psi(x) or psi(stimulus intensity) (for people with less elaborated statistics background) - Influence for Slope and Influence for Threshold seperately instead of using an aggregation in the Plot for the Influential Observers. psignifit3-3.0~beta.20120611.1/todo_separate/research000066400000000000000000000004161176542545200221030ustar00rootroot00000000000000- Nonstationarity for single trials (e.g. randomized presentations, conditions interleaved) - Determine a prior that is "flat in function space" i.e. with flat slope. Can we feed back the derivative information to determine this prior analytically? - Blockwise adaptive psignifit3-3.0~beta.20120611.1/windows_setup.py000066400000000000000000000022141176542545200210150ustar00rootroot00000000000000#!/usr/bin/env python # encoding: utf-8 # vi: set ft=python sts=4 ts=4 sw=4 et: ###################################################################### # # See COPYING file distributed along with the psignifit package for # the copyright and license terms # ###################################################################### """ Windows specific setup.py for Psignifit 3.x Instead of linking to a shared library like in `setup.py`, all of Psi++ is compiled into the extension. """ # other imports, metadata and extension definition from setup import * # Psi++ source files psipp_sources = [ "src/bootstrap.cc", "src/core.cc", "src/data.cc", "src/mclist.cc", "src/mcmc.cc", "src/optimizer.cc", "src/psychometric.cc", "src/rng.cc", "src/sigmoid.cc", "src/special.cc", "src/linalg.cc", "src/getstart.cc", "src/prior.cc", "src/integrate.cc"] # swignifit interface, override the definition in `setup.py` swignifit = Extension('swignifit._swignifit_raw', sources = psipp_sources + swignifit_sources, include_dirs=["src"]) if __name__ == "__main__": main(ext_modules=[swignifit])