pax_global_header00006660000000000000000000000064137456346630014533gustar00rootroot0000000000000052 comment=3f48b0d9801ff3c02c388fa3599f769cb05433be pyxnat-1.4/000077500000000000000000000000001374563466300127225ustar00rootroot00000000000000pyxnat-1.4/.coveragerc000066400000000000000000000001521374563466300150410ustar00rootroot00000000000000[run] omit = ./setup.py ./setupegg.py ./sphinx_pypi_upload.py ./doc/* /home/travis/virtualenv/* pyxnat-1.4/.gitignore000077500000000000000000000001251374563466300147130ustar00rootroot00000000000000*.pyc MANIFEST pyxnat.egg-info/ build/ dist/ *.DS_Store* .project .pydevproject .ideapyxnat-1.4/.travis.yml000066400000000000000000000015001374563466300150270ustar00rootroot00000000000000dist: xenial before_install: - sudo apt-get update - docker-compose --version language: python python: - "2.7" - "3.6" - "3.7" install: - "pip install -r requirements-dev.txt" - if [[ $TRAVIS_PYTHON_VERSION == 3.7 ]]; then pip install sphinx sphinx_theme; fi script: - git clone https://github.com/NrgXnat/xnat-docker-compose - cd xnat-docker-compose - sudo docker-compose up -d &> /tmp/docker.log - sleep 120 - tail -100 /tmp/docker.log - sudo docker-compose logs --tail=20 xnat-web - "cd -" - export PYTHONPATH=$PYTHONPATH:$(pwd) - "nosetests pyxnat/tests --nologcapture --with-coverage --cover-inclusive --cover-erase --cover-package ." - "coverage report -m" after_success: - coveralls - if [[ $TRAVIS_PYTHON_VERSION == 3.7 ]]; then ./build-docs.sh; fi pyxnat-1.4/.xnat.cfg000066400000000000000000000001051374563466300144270ustar00rootroot00000000000000{"password": "admin", "user": "admin", "server": "http://localhost"} pyxnat-1.4/CHANGES.rst000066400000000000000000000135531374563466300145330ustar00rootroot00000000000000:orphan: Latest changes =============== Release 1.3.0.0 --------------- - Docker-based tests are temporarily removed from Travis - Tests are now included with the PyPI package Release 1.2.0.0 --------------- * New Features - CI tests can be skipped if no network connectivity or no Docker-based XNAT available - bin/sessionmirror.py: migrate an experiment between two XNAT instances * Improvements - More tests - Refreshing documentation * Bug fixes - XNAT REST API compatibility (`Interfaces.version()`, `Schemas`, etc) - Removed deprecated references to cache support - Python 3 fixes Release 1.1.0.2 --------------- * Improvements - Refreshing documentation * Bug fixes - If verify not defined, don't store it - Closing requests session on disconnection Release 1.1.0.0 --------------- * New Features - Python 3 compatibility * Improvements - Get aliases from a project - CI tests may now (partially) run within a Docker container - `ArrayData` class makes no more assumption on data type and use broader/generic types (avoids missing results from other types) - Specific methods added for MRSessions and MRScans - Added certification verification to configuration file - Added test coverage * Bug fixes - CI tests run again (partially) - Fixed vulnerability (upgraded `requests` package version) - Replaced '\n' newline chars by an OS-agnostic alternative Release 1.0.1.0 --------------- * New Features * Improvements - Pass keyword arguments on some put/create methods, to allow passing event_reason. * Bug fixes - Minor docs inconsistencies that generated sphinx warnings - Clean up deprecated references in sphinx autogenerate extension - Remove deprecated sphinx plugin pngmath in favor of imgmath Release 1.0.0.0 --------------- * New Features - Convenience methods on interface: get, put, post, delete, head - Verify option on interface for ssl-cert-verification * Improvements - More useful error messages when things go wrong - streaming file upload - streaming file download - Use the requests library instead of httplib2 for REST calls * Bug fixes - Removed custom httplib2 caching. Release 0.9.5.2 --------------- * New Features * Improvements * Bug fixes - Ticket #50 404 error causes connection to be broken until end of object life. - Tiekct #52 fix zip file downloading. Release 0.9.5 ------------- * New Features - Add __getitem__ to CObject for slice operations. * Improvements - Add toggle for overwriting files on the Resources object (put, put_dir, put_zip) - Add toggle for not extracting the zip file on the Resources object (put, put_dir, put_zip) * Bug fixes - fix proxy support - mset attributes fixed - fixed url separator issue on windows. Release 0.9.4 ------------- * New Features - add proxy support to interface. * Improvements * Bug fixes - python <2.7 compatibility. - project.parent() does not throw error. - removed simplejson requirement - md5 cache key Release 0.9.0 ------------- * New features - Global listing functions: - interface.array.experiments() - interface.array.search_experiments() - interface.array.scans() - Support for XNAT configuration file format - Batch function for downloading all files related to a scan or an assessor - Create element with an XML document - New xpath function for EObjects - xpath store facility to query cached subject XMLs with xpath * Improvements - Catching authentication errors - Toggle option for cache warnings - Description for search templates is displayed * Bug fixes - Config file Release 0.8.0 ------------- * Compatible with XNAT 1.5 * New features - provenance annotation on assessors and recontructions - search templates - callback system to monitor data streams to and from the server * Improvements - support for proxies in the Interface object - a description can be added when a search is saved on the server - python strings can be uploaded and saved just like files * Bug fixes including - improved unicode support for uploaded files - solved cache issue on Windows - a major bug in the Collection.where method Release 0.7.0 ------------- * Errors following the PEP-249 * Some operations follow the PEP-249 - e.g. `fetchall` replaces `get` * New inspection functions: - experiement_types - assessor_types - scan_types - reconstruction_types - project_values - subject_values - experiment_values - assessor_values - scan_values - reconstruction_values * Inspect method `fieldvalues` changed to `field_values` * `Interface` Object now supports config files. * Bug fix regarding the file names in the cache. It means that cached data from older versions has to be re-downloaded. * The disk check for available space is performed against a timer instead of always. * The default `get` function to download file now supports custom paths. * Bug fix for HTTP sessions management. * New `last_modified` method for project to get subjects last modified date. * Resource elements are now fully configurable at creation. * Added support for XNAT pipelines. * Added push and pull zip files at the resource level. * Added simple schema parsing capabilities. * Add a global management interface to gather different managers. * Interface now follows redirections on the server url. pyxnat-1.4/LICENSE000066400000000000000000000031371374563466300137330ustar00rootroot00000000000000This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. Copyright (c) 2010-2011, Yannick Schwartz All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Yannick Schwartz. nor the names of other pyxnat contributors may be used to endorse or promote products derived from this software without specific prior written permission. **This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.** pyxnat-1.4/README.rst000066400000000000000000000100201374563466300144020ustar00rootroot00000000000000======= pyxnat ======= .. image:: https://img.shields.io/travis/pyxnat/pyxnat.svg :target: https://travis-ci.org/pyxnat/pyxnat .. image:: https://coveralls.io/repos/github/pyxnat/pyxnat/badge.svg?branch=master :target: https://coveralls.io/github/pyxnat/pyxnat?branch=master .. image:: https://img.shields.io/pypi/dm/pyxnat.svg :target: https://pypi.org/project/pyxnat/ .. image:: https://img.shields.io/pypi/pyversions/pyxnat.svg :target: https://pypi.org/project/pyxnat .. image:: https://img.shields.io/pypi/v/pyxnat.svg :target: https://pypi.org/project/pyxnat Where to get it =============== The source code is currently hosted on GitHub at: https://github.com/pyxnat/pyxnat Binary installers for the latest released version are available at the `Python package index `_. **pyxnat** can be installed using ``pip`` with the following command:: pip install pyxnat Dependencies ============ - `requests `_ v2.20 or higher - `python-lxml `_ v4.3.2 or higher recommended, earlier versions may work. For development purposes: - *python-nose* v1.2.1 or higher - *coverage* v3.6 or higher See the `full installation instructions `_ for recommended and optional dependencies. Installation from sources ========================= To install **pyxnat** from source, from the ``pyxnat`` directory (same one where you found this file after cloning the git repo), execute:: python setup.py install Documentation ============= The official documentation is hosted at: https://pyxnat.github.io/pyxnat Running the test suite ========================= Until v1.1 tests were exclusively performed on `XNAT Central `_ using a dedicated user account (``nosetests``). Yet some tests were not allowed to run due to restricted permissions. In v1.1, tests were restructured and were directed to two independent XNAT instances based on permission level. Hence `XNAT Central `_ is still used for most tests with read access whereas other tests requiring write permissions are run on a local XNAT instance in a Docker container. Consequently, running the test suite now requires the following: - *python-nose* v1.2.1+ - *coverage* v3.6+ - *docker* v18+ Setting up a local Docker-powered XNAT instance may be achieved easily using ``docker-compose`` and any available recipe. We recommend the one from the `following repository `_ (maintained by the XNAT team). Once the repository cloned, run the following command (possibly as ``sudo``) :: docker-compose up -d After a couple of minutes, the XNAT instance should be up and running locally. You may check it out visiting http://localhost. The script ``tests/setup_xnat.py`` may then be executed to populate the local instance before running the tests. Finally run the tests with the following command (from the root of the project):: nosetests pyxnat/tests The file ``.travis.yml`` (used for CI) features these described steps and may be referred to for further information. Building the documentation ========================== Building the docs requires to have `setuptools `_ and `sphinx `_ (v2.0+) installed. Then run the command:: python setup.py build_sphinx The docs are built in the ``build/sphinx/html`` folder. Contribute to **pyxnat** ========================= To contribute to **pyxnat**, first create an account on `GitHub `_. Once this is done, fork the `pyxnat repository `_ to have you own repository, clone it using ``git clone`` on the computers where you want to work. Make changes in your clone, push them to your GitHub fork, test them on several computers and when you are happy with them, send a `pull request `_ to the main repository. License ======= `BSD 3 `_ pyxnat-1.4/bin/000077500000000000000000000000001374563466300134725ustar00rootroot00000000000000pyxnat-1.4/bin/sessionmirror.py000077500000000000000000000600451374563466300167720ustar00rootroot00000000000000#!/usr/bin/env python ''' The MIT License (MIT) Copyright (c) 2014 VUIIS 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. ''' ''' Adapted from xnatmirror (https://github.com/VUIIS/dax/blob/master/bin/Xnat_tools/Xnatmirror) ''' def cmp(a, b): return (a > b) - (a < b) from builtins import zip from builtins import str import os import os.path as op import sys from xml.etree import cElementTree as ET import pyxnat PROJ_ATTRS = [ 'xnat:projectData/name', 'xnat:projectData/description', 'xnat:projectData/keywords', ] SUBJ_ATTRS = [ 'xnat:subjectData/group', 'xnat:subjectData/src', 'xnat:subjectData/investigator/firstname', 'xnat:subjectData/investigator/lastname', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/dob', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/yob', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/age', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/gender', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/handedness', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/ses', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/education', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/\ educationDesc', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/race', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/ethnicity', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/weight', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/height', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/\ gestational_age', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/\ post_menstrual_age', 'xnat:subjectData/demographics[@xsi:type=xnat:demographicData]/\ birth_weight' ] MR_EXP_ATTRS = [ 'xnat:experimentData/date', 'xnat:experimentData/visit_id', 'xnat:experimentData/time', 'xnat:experimentData/note', 'xnat:experimentData/investigator/firstname', 'xnat:experimentData/investigator/lastname', 'xnat:imageSessionData/scanner/manufacturer', 'xnat:imageSessionData/scanner/model', 'xnat:imageSessionData/operator', 'xnat:imageSessionData/dcmAccessionNumber', 'xnat:imageSessionData/dcmPatientId', 'xnat:imageSessionData/dcmPatientName', 'xnat:imageSessionData/session_type', 'xnat:imageSessionData/modality', 'xnat:imageSessionData/UID', 'xnat:mrSessionData/coil', 'xnat:mrSessionData/fieldStrength', 'xnat:mrSessionData/marker', 'xnat:mrSessionData/stabilization' ] OTHER_DICOM_SCAN_ATTRS = [ 'xnat:imageScanData/type', 'xnat:imageScanData/UID', 'xnat:imageScanData/note', 'xnat:imageScanData/quality', 'xnat:imageScanData/condition', 'xnat:imageScanData/series_description', 'xnat:imageScanData/documentation', 'xnat:imageScanData/frames', 'xnat:imageScanData/startTime', 'xnat:imageScanData/scanner/manufacturer', 'xnat:imageScanData/scanner/model' ] MR_SCAN_ATTRS = [ 'xnat:imageScanData/type', 'xnat:imageScanData/UID', 'xnat:imageScanData/note', 'xnat:imageScanData/quality', 'xnat:imageScanData/condition', 'xnat:imageScanData/series_description', 'xnat:imageScanData/documentation', 'xnat:imageScanData/frames', 'xnat:imageScanData/startTime', 'xnat:imageScanData/scanner/manufacturer', 'xnat:imageScanData/scanner/model', 'xnat:mrScanData/parameters/flip', 'xnat:mrScanData/parameters/orientation', 'xnat:mrScanData/parameters/tr', 'xnat:mrScanData/parameters/ti', 'xnat:mrScanData/parameters/te', 'xnat:mrScanData/parameters/sequence', 'xnat:mrScanData/parameters/imageType', 'xnat:mrScanData/parameters/scanSequence', 'xnat:mrScanData/parameters/seqVariant', 'xnat:mrScanData/parameters/scanOptions', 'xnat:mrScanData/parameters/acqType', 'xnat:mrScanData/parameters/pixelBandwidth', 'xnat:mrScanData/parameters/voxelRes/x', 'xnat:mrScanData/parameters/voxelRes/y', 'xnat:mrScanData/parameters/voxelRes/z', 'xnat:mrScanData/parameters/fov/x', 'xnat:mrScanData/parameters/fov/y', 'xnat:mrScanData/parameters/matrix/x', 'xnat:mrScanData/parameters/matrix/y', 'xnat:mrScanData/parameters/partitions', 'xnat:mrScanData/fieldStrength', 'xnat:mrScanData/marker', 'xnat:mrScanData/stabilization', 'xnat:mrScanData/coil' ] SC_SCAN_ATTRS = [ 'xnat:imageScanData/type', 'xnat:imageScanData/UID', 'xnat:imageScanData/note', 'xnat:imageScanData/quality', 'xnat:imageScanData/condition', 'xnat:imageScanData/series_description', 'xnat:imageScanData/documentation', 'xnat:imageScanData/frames', 'xnat:imageScanData/scanner/manufacturer', 'xnat:imageScanData/scanner/model' ] PET_EXP_ATTRS = [ 'xnat:experimentData/date', 'xnat:experimentData/visit_id', 'xnat:experimentData/time', 'xnat:experimentData/note', 'xnat:experimentData/investigator/firstname', 'xnat:experimentData/investigator/lastname', 'xnat:imageSessionData/scanner/manufacturer', 'xnat:imageSessionData/scanner/model', 'xnat:imageSessionData/operator', 'xnat:imageSessionData/dcmAccessionNumber', 'xnat:imageSessionData/dcmPatientId', 'xnat:imageSessionData/dcmPatientName', 'xnat:imageSessionData/session_type', 'xnat:imageSessionData/modality', 'xnat:imageSessionData/UID', 'xnat:petSessionData/studyType', 'xnat:petSessionData/patientID', 'xnat:petSessionData/patientName', 'xnat:petSessionData/stabilization', 'xnat:petSessionData/start_time/scan', 'xnat:petSessionData/start_time/injection', 'xnat:petSessionData/tracer/name', 'xnat:petSessionData/tracer/startTime', 'xnat:petSessionData/tracer/dose', 'xnat:petSessionData/tracer/specificActivity', 'xnat:petSessionData/tracer/totalMass', 'xnat:petSessionData/tracer/intermediate', 'xnat:petSessionData/tracer/isotope', 'xnat:petSessionData/tracer/isotope/half-life', 'xnat:petSessionData/tracer/transmissions', 'xnat:petSessionData/tracer/transmissions/startTime' ] CT_EXP_ATTRS = [ 'xnat:experimentData/date', 'xnat:experimentData/visit_id', 'xnat:experimentData/time', 'xnat:experimentData/note', 'xnat:experimentData/investigator/firstname', 'xnat:experimentData/investigator/lastname', 'xnat:imageSessionData/scanner/manufacturer', 'xnat:imageSessionData/scanner/model', 'xnat:imageSessionData/operator', 'xnat:imageSessionData/dcmAccessionNumber', 'xnat:imageSessionData/dcmPatientId', 'xnat:imageSessionData/dcmPatientName', 'xnat:imageSessionData/session_type', 'xnat:imageSessionData/modality', 'xnat:imageSessionData/UID' ] PET_SCAN_ATTRS = [ 'xnat:imageScanData/type', 'xnat:imageScanData/UID', 'xnat:imageScanData/note', 'xnat:imageScanData/quality', 'xnat:imageScanData/condition', 'xnat:imageScanData/series_description', 'xnat:imageScanData/documentation', 'xnat:imageScanData/frames', 'xnat:imageScanData/scanner/manufacturer', 'xnat:imageScanData/scanner/model', 'xnat:imageScanData/startTime', 'xnat:petScanData/parameters/orientation', 'xnat:petScanData/parameters/originalFileName', 'xnat:petScanData/parameters/systemType', 'xnat:petScanData/parameters/fileType', 'xnat:petScanData/parameters/transaxialFOV', 'xnat:petScanData/parameters/acqType', 'xnat:petScanData/parameters/facility', 'xnat:petScanData/parameters/numPlanes', 'xnat:petScanData/parameters/frames/numFrames', 'xnat:petScanData/parameters/numGates', 'xnat:petScanData/parameters/planeSeparation', 'xnat:petScanData/parameters/binSize', 'xnat:petScanData/parameters/dataType' ] CT_SCAN_ATTRS = [ 'xnat:imageScanData/type', 'xnat:imageScanData/UID', 'xnat:imageScanData/note', 'xnat:imageScanData/quality', 'xnat:imageScanData/condition', 'xnat:imageScanData/series_description', 'xnat:imageScanData/documentation', 'xnat:imageScanData/frames', 'xnat:imageScanData/scanner/manufacturer', 'xnat:imageScanData/scanner/model' ] PROC_ATTRS = [ 'proc:genProcData/validation/status', 'proc:genProcData/procstatus', 'proc:genProcData/proctype', 'proc:genProcData/procversion', 'proc:genProcData/walltimeused', 'proc:genProcData/memused' ] def copy_attrs(src_obj, dest_obj, attr_list): """ Copies list of attributes form source to destination""" src_attrs = src_obj.attrs.mget(attr_list) src_list = dict(list(zip(attr_list, src_attrs))) # NOTE: For some reason need to set te again b/c a bug somewhere sets te # to sequence name te_key = 'xnat:mrScanData/parameters/te' if te_key in src_list: src_list[te_key] = src_obj.attrs.get(te_key) dest_obj.attrs.mset(src_list) return 0 def copy_attributes(src_obj, dest_obj): '''Copy attributes from src to dest''' src_type = src_obj.datatype() types = {'xnat:projectData': PROJ_ATTRS, 'xnat:subjectData': SUBJ_ATTRS, 'xnat:mrSessionData': MR_EXP_ATTRS, 'xnat:petSessionData': PET_EXP_ATTRS, 'xnat:ctSessionData': CT_EXP_ATTRS, 'xnat:mrScanData': MR_SCAN_ATTRS, 'xnat:petScanData': PET_SCAN_ATTRS, 'xnat:ctScanData': CT_SCAN_ATTRS, 'xnat:scScanData': SC_SCAN_ATTRS, 'proc:genProcData': PROC_ATTRS, 'xnat:otherDicomScanData': OTHER_DICOM_SCAN_ATTRS} try: copy_attrs(src_obj, dest_obj, types[src_type]) except KeyError: print('ERROR:cannot copy attributes, unsupported datatype:' + src_type) def subj_compare(item1, item2): '''Compare sort of items''' return cmp(item1.label(), item2.label()) def copy_file(src_f, dest_r, cache_d): ''' Copy file from XNAT file source to XNAT resource destination, using local cache in between''' f_label = src_f.label() loc_f = cache_d + '/' + f_label # Make subdirectories loc_d = op.dirname(loc_f) if not op.exists(loc_d): os.makedirs(loc_d) try: # Download file if op.exists(loc_f) is False: src_f.get(loc_f) # Get File Attributes f_in_attrs = src_f.attributes() f_content = f_in_attrs.get('file_content') f_format = f_in_attrs.get('file_format') f_tags = f_in_attrs.get('file_tags') # Upload File if f_format and f_content and not f_tags: # format & content dest_r.file(f_label).put(loc_f, f_format, f_content) elif f_format and not f_content and not f_tags: # format only dest_r.file(f_label).put(loc_f, f_format) elif f_format and f_content and f_tags: # format, content, & tags dest_r.file(f_label).put(loc_f, f_format, f_content) else: # none dest_r.file(f_label).put(loc_f) # Delete local copy os.remove(loc_f) except Exception: print("ERROR:failed to copy file:%s, error=%s" % (f_label, sys.exc_info()[0])) def copy_res_zip(src_r, dest_r, cache_d): ''' Copy a resource from XNAT source to XNAT destination using local cache in between ''' try: # Download zip of resource print('INFO:Downloading resource as zip...') cache_z = src_r.get(cache_d, extract=False) # Upload zip of resource print('INFO:Uploading resource as zip...') dest_r.put_zip(cache_z, extract=True) # Delete cached zip os.remove(cache_z) except IndexError: print('ERROR:failed to copy:%s:%s' % (cache_z, sys.exc_info()[0])) raise def is_empty_resource(_res): '''Check if resource contains any files''' f_count = 0 for f_in in _res.files().fetchall('obj'): f_count += 1 break return f_count == 0 # copy_project and copy_subject are untested # def copy_project(src_proj, dst_proj, proj_cache_dir): # '''Copy XNAT project from source to destination''' # # if not dst_proj.exists(): # try: # dst_proj.create() # except Exception as e: # msg = 'ERROR: can not create project on destination '\ # 'xnat. Check your user rights. %s' % e # raise Exception(msg) # copy_attributes(src_proj, dst_proj) # print('INFO:loading and sorting subject list...') # # proj_label = src_proj.label() # subj_list = src_xnat.get_subjects(proj_label) # subj_list = [x for x in subj_list if x['label'] not in SUBJECTS_MIRRORED] # subj_i = 0 # for subj in subj_list: # subj_i += 1 # subject_label = subj['label'] # # print("INFO:Processing subject %s (%d)..." % (subject_label, subj_i)) # src_subj = src_proj.subject(subject_label) # dst_subj = dst_proj.subject(subject_label) # subj_cache_dir = op.join(proj_cache_dir, subject_label) # copy_subject(src_subj, dst_subj, subj_cache_dir) # def copy_subject(src_subj, dst_subj, subj_cache_dir): # '''Copy subject from XNAT src to XNAT dst''' # # if not dst_subj.exists(): # print('INFO:uploading subject attributes as xml') # # # Create dirs # if not op.exists(subj_cache_dir): # os.makedirs(subj_cache_dir) # # # Write xml to file # subj_xml = src_subj.get() # xml_path = op.join(subj_cache_dir, 'subj.xml') # write_xml(subj_xml, xml_path) # dst_subj.create(xml=xml_path, allowDataDeletion=False) # # # Process each experiment of subject # for src_sess in src_subj.experiments().fetchall('obj'): # sess_label = src_sess.label() # sess_type = src_sess.datatype() # if sess_type != 'xnat:mrSessionData' and \ # sess_type != 'xnat:petSessionData' and \ # sess_type != 'xnat:ctSessionData': # print('WARN:Skipping, session is not MR, CT, or PET Session') # continue # # print("INFO:Processing session:%s..." % (sess_label)) # # dst_sess = dst_subj.experiment(sess_label) # sess_cache_dir = op.join(subj_cache_dir, sess_label) # copy_session(src_sess, dst_sess, sess_cache_dir) def copy_session(src_sess, dst_sess, sess_cache_dir): '''Copy XNAT session from source to destination''' print(dst_sess.exists()) print(dst_sess._uri) print('INFO:uploading session attributes as xml') # Write xml to file if not op.exists(sess_cache_dir): os.makedirs(sess_cache_dir) sess_xml = src_sess.get() xml_path = op.join(sess_cache_dir, 'sess.xml') write_xml(sess_xml, xml_path) print(xml_path) sess_type = src_sess.datatype() dst_sess.create(experiments=sess_type) copy_attributes(src_sess, dst_sess) # Process each scan of session for src_scan in src_sess.scans().fetchall('obj'): scan_label = src_scan.label() print('INFO:Processing scan:%s...' % scan_label) dst_scan = dst_sess.scan(scan_label) scan_cache_dir = op.join(sess_cache_dir, scan_label) copy_scan(src_scan, dst_scan, scan_cache_dir) # Process each assessor of session for src_assr in src_sess.assessors(): assr_label = src_assr.label() print('INFO:Processing assessor:%s:...' % assr_label) dst_assr = dst_sess.assessor(assr_label) assr_cache_dir = op.join(sess_cache_dir, assr_label) copy_assr(src_assr, dst_assr, assr_cache_dir) for src_res in src_sess.resources().fetchall('obj'): res_label = src_res.label() print('INFO:Processing resource:%s...' % (res_label)) dst_res = dst_sess.resource(res_label) res_cache_dir = op.join(scan_cache_dir, res_label) copy_res(src_res, dst_res, res_cache_dir, use_zip=True) def copy_scan(src_scan, dst_scan, scan_cache_dir): '''Copy scan from source XNAT to destination XNAT''' scan_type = src_scan.datatype() if scan_type == '': scan_type = 'xnat:otherDicomScanData' dst_scan.create(scans=scan_type) copy_attributes(src_scan, dst_scan) # Process each resource of scan for src_res in src_scan.resources().fetchall('obj'): res_label = src_res.label() print('INFO:Processing resource:%s...' % (res_label)) dst_res = dst_scan.resource(res_label) res_cache_dir = op.join(scan_cache_dir, res_label) if res_label == 'SNAPSHOTS': copy_res(src_res, dst_res, res_cache_dir) else: copy_res(src_res, dst_res, res_cache_dir, use_zip=True) def copy_res(src_res, dst_res, res_cache_dir, use_zip=False): '''Copy resource from source XNAT to destination XNAT''' # Create cache dir if not op.exists(res_cache_dir): os.makedirs(res_cache_dir) # Prepare resource and check for empty is_empty = False print(dst_res._uri) if not dst_res.exists(): dst_res.create() is_empty = True elif is_empty_resource(dst_res): is_empty = True # Check for empty source if is_empty_resource(src_res): print('WARN:empty resource, nothing to copy') return if is_empty: if use_zip: # Try to copy as zip try: print('INFO:Copying resource as zip: %s...' % src_res.label()) copy_res_zip(src_res, dst_res, res_cache_dir) return except Exception: try: print('INFO: second attempt to copy resource as zip: %s...' % src_res.label()) copy_res_zip(src_res, dst_res, res_cache_dir) return except Exception: msg = 'ERROR:failed twice to copy resource as zip, will'\ 'copy individual files' print(msg) copy_count = 0 for f in src_res.files(): print('INFO:Copying file: %s...' % f.label()) copy_count += 1 copy_file(f, dst_res, res_cache_dir) print('INFO:Finished copying resource, %d files copied' % copy_count) # def copy_assr(src_assr, dst_assr, assr_cache_dir): # '''Copy assessor from source XNAT to destination XNAT''' # # # Check type # assr_type = src_assr.datatype() # if assr_type != 'proc:genProcData' and assr_type != 'fs:fsData': # print('WARN:skipping unsupported assessor type: {}'.format(assr_type)) # return # # if not dst_assr.exists(): # print('INFO:uploading assessor attributes as xml') # # Write xml to file # if not op.exists(assr_cache_dir): # os.makedirs(assr_cache_dir) # assr_xml = src_assr.get() # xml_path = op.join(assr_cache_dir, 'assr.xml') # write_xml(assr_xml, xml_path) # dst_assr.create(xml=xml_path, allowDataDeletion=False) # # # Process each resource of assr # for src_res in src_assr.out_resources(): # res_label = src_res.label() # print('INFO:Processing resource:%s...' % res_label) # dst_res = dst_assr.out_resource(res_label) # res_cache_dir = op.join(assr_cache_dir, res_label) # # if res_label == 'SNAPSHOTS': # copy_res(src_res, dst_res, res_cache_dir) # else: # copy_res(src_res, dst_res, res_cache_dir, use_zip=True) def write_xml(xml_str, file_path, clean_tags=True): """Writing XML.""" root = ET.fromstring(xml_str) # We only want the tags and attributes relevant to root, no children if clean_tags: # Remove ID if 'ID' in root.attrib: del root.attrib['ID'] # Remove sharing tags tag = '{http://nrg.wustl.edu/xnat}sharing' for child in root.findall(tag): root.remove(child) # Remove out for child in root.findall('{http://nrg.wustl.edu/xnat}out'): root.remove(child) break # Remove session ID tag = '{http://nrg.wustl.edu/xnat}imageSession_ID' for child in root.findall(tag): root.remove(child) # Remove subject ID for child in root.findall('{http://nrg.wustl.edu/xnat}subject_ID'): root.remove(child) # Remove _session ID tag = '{http://nrg.wustl.edu/xnat}image_session_ID' for child in root.findall(tag): root.remove(child) # Remove scans for child in root.findall('{http://nrg.wustl.edu/xnat}scans'): root.remove(child) break # Remove assessors for child in root.findall('{http://nrg.wustl.edu/xnat}assessors'): root.remove(child) break # Remove resources for child in root.findall('{http://nrg.wustl.edu/xnat}resources'): root.remove(child) break # Remove experiments for child in root.findall('{http://nrg.wustl.edu/xnat}experiments'): root.remove(child) break try: # Write to file ET.register_namespace('xnat', 'http://nrg.wustl.edu/xnat') ET.register_namespace('proc', 'http://nrg.wustl.edu/proc') ET.register_namespace('prov', 'http://www.nbirn.net/prov') ET.register_namespace('fs', 'http://nrg.wustl.edu/fs') ET.ElementTree(root).write(file_path) except IOError as error: print('ERROR:writing xml file: {}: {}'.format(file_path, str(error))) def create_parser(): import argparse """Parse commandline arguments.""" parser = argparse.ArgumentParser(description='Downloads a given experiment/'\ 'session from an XNAT instance and uploads it to an independent one. '\ 'Only DICOM resources will be imported. \n\n'\ 'More information at: https://wiki.xnat.org/docs16/4-developer-documen'\ 'tation/xnat-rest-api-directory/data-services-import', formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('--h1', '--source_config', dest='source_config', help='Source XNAT configuration file', required=True) parser.add_argument('--h2', '--dest_config', dest='dest_config', help='Destination XNAT configuration file', required=True) parser.add_argument('-e', '--experiment_id', help='Which resource to download? (Entity name/identifier)', required=True) parser.add_argument('-p', '--project_id', dest='project_id', help='Which project to store the resource in', required=True) parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', default=False, help='Display verbosal information (optional)', required=False) return parser def main(args): x1 = pyxnat.Interface(config=args.source_config) x2 = pyxnat.Interface(config=args.dest_config) columns = ['subject_label', 'label'] e1 = x1.array.experiments(experiment_id=args.experiment_id, columns=columns).data[0] p = x2.select.project(args.project_id) s = p.subject(e1['subject_label']) if not s.exists(): s.create() e = s.experiment(e1['label']) e.create() src_sess = x1.select.project(e1['project']).subject(e1['subject_ID']).experiment(e1['ID']) dst_sess = e copy_session(src_sess, dst_sess, '/tmp') if __name__ == '__main__': parser = create_parser() args = parser.parse_args() main(args) pyxnat-1.4/build-docs.sh000077500000000000000000000013071374563466300153070ustar00rootroot00000000000000python setup.py build_sphinx rm -rf /tmp/html mv build/sphinx/html /tmp TARGET_REPO="$TRAVIS_REPO_SLUG" GITHUB_REPO=https://${GH_TOKEN}@github.com/${TARGET_REPO}.git git clone "$GITHUB_REPO" &> /dev/null git checkout --orphan gh-pages git rm --cached -r . git config --local user.name "Travis CI" git config --local user.email "travis@travis-ci.org" git remote rm origin # Add new "origin" with access token in the git URL for authentication git remote add origin $GITHUB_REPO > /dev/null 2>&1 mv /tmp/html/* . touch .nojekyll curl "https://raw.githubusercontent.com/pyxnat/pyxnat/master/pyxnat.ico" -o _static/pyxnat.ico git add --all git commit -m 'Update documentation' git push origin gh-pages --force pyxnat-1.4/debian/000077500000000000000000000000001374563466300141445ustar00rootroot00000000000000pyxnat-1.4/debian/blends000066400000000000000000000001341374563466300153340ustar00rootroot00000000000000Tasks: debian-science/neuroscience-cognitive, debian-med/imaging-dev Depends: pyxnat pyxnat-1.4/debian/changelog000066400000000000000000000002451374563466300160170ustar00rootroot00000000000000pyxnat (0.9.0~dev0-1) unstable; urgency=low * Initial release (Closes: #609820). -- Yannick Schwartz Thu, 08 Sep 2011 15:31:48 -0400 pyxnat-1.4/debian/compat000066400000000000000000000000021374563466300153420ustar00rootroot000000000000007 pyxnat-1.4/debian/control000066400000000000000000000024211374563466300155460ustar00rootroot00000000000000Source: pyxnat Section: python Priority: extra Maintainer: Yannick Schwartz Uploaders: Yaroslav Halchenko , Michael Hanke Build-Depends: debhelper (>= 7.2.18), python-all, python-lxml, python-httplib2 (>= 0.7.0), python-simplejson, python-nose Standards-Version: 3.9.2 Homepage: http://packages.python.org/pyxnat/ Vcs-Git: git://github.com/pyxnat/pyxnat.git Vcs-Browser: https://github.com/pyxnat/pyxnat.git Package: python-pyxnat Architecture: all Depends: ${python:Depends}, ${misc:Depends}, python-lxml, python-simplejson, python-httplib2 (>= 0.7.0), Recommends: python-networkx, python-matplotlib Provides: ${python:Provides} Description: Interface to access neuroimaging data on XNAT servers pyxnat is a simple Python library that relies on the REST API provided by the XNAT platform since its 1.4 version. XNAT is an extensible database for neuroimaging data. The main objective is to ease communications with an XNAT server to plug-in external tools or Python scripts to process the data. It features: . - resources browsing capabilities - read and write access to resources - complex searches - disk-caching of requested files and resources pyxnat-1.4/debian/copyright000066400000000000000000000060501374563466300161000ustar00rootroot00000000000000Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=173 Upstream-Name: pyxnat Upstream-Contact: Yannick Schwartz Source: http://github.com/pyxnat/pyxnat Files: * Copyright: 2010-2011, Yannick Schwartz License: BSD-3 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Yannick Schwartz nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. . This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. Files: doc/sphinxext/* Copyright: 2008, Stefan van der Walt 2008, Pauli Virtanen License: BSD-2 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: . 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. . THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyxnat-1.4/debian/gbp.conf000066400000000000000000000003631374563466300155650ustar00rootroot00000000000000[DEFAULT] # the default branch for upstream sources: upstream-branch = master # the default branch for the debian patch: debian-branch = debian # the default tag formats used: upstream-tag = release/%(version)s debian-tag = debian/%(version)s pyxnat-1.4/debian/pyversions000066400000000000000000000000051374563466300163030ustar00rootroot000000000000002.6- pyxnat-1.4/debian/rules000077500000000000000000000014631374563466300152300ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- PACKAGE_NAME = python-pyxnat PACKAGE_ROOT_DIR = debian/${PACKAGE_NAME} INSTALL_PATH = $(CURDIR)/debian/${PACKAGE_NAME} # default Python PYTHON=$(shell pyversions -d) %: dh $@ override_dh_auto_test: : # Do not test just after build, lets install and then test override_dh_auto_install: dh_auto_install # All tests later on # cd build to prevent use of local/not-built source tree ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) cd build; \ for PYTHON in $(shell pyversions -r); do \ echo "I: Running pyxnat unittests using $$PYTHON"; \ PYTHONPATH=$$(/bin/ls -d $(INSTALL_PATH)/usr/lib/$$PYTHON/*-packages):$$PYTHONPATH \ $$PYTHON /usr/bin/nosetests --exclude=test_del_provenance pyxnat; \ done endif override_dh_auto_clean: dh_auto_clean -rm -rf doc/build build pyxnat-1.4/debian/source/000077500000000000000000000000001374563466300154445ustar00rootroot00000000000000pyxnat-1.4/debian/source/format000066400000000000000000000000141374563466300166520ustar00rootroot000000000000003.0 (quilt) pyxnat-1.4/debian/watch000066400000000000000000000002151374563466300151730ustar00rootroot00000000000000version=3 opts="filenamemangle=s/.*\/(.*)/pyxnat-$1\.tar\.gz/" \ http://github.com/pyxnat/pyxnat/downloads .*tarball/release/([\d\.a-z]+) pyxnat-1.4/doc/000077500000000000000000000000001374563466300134675ustar00rootroot00000000000000pyxnat-1.4/doc/CHANGES.rst000077700000000000000000000000001374563466300173012../CHANGES.rstustar00rootroot00000000000000pyxnat-1.4/doc/__init__.py000066400000000000000000000001361374563466300156000ustar00rootroot00000000000000""" This is a phony __init__.py file, so that nose finds the doctests in this directory. """ pyxnat-1.4/doc/about.rst000066400000000000000000000024601374563466300153350ustar00rootroot00000000000000:orphan: .. module:: pyxnat About ===== :mod:`pyxnat` was originally developed at `CEA/Neurospin `_ and funded by the European project `IMAGEN `_. The project was started in 2009 with Yannick Schwartz as the main developer but has since benefited from the help of a lot of people. We would like to give special thanks to the XNAT team at the Washington University of St Louis, and to the people at Neurospin. People ------ * Yannick Schwartz * Jean-Baptiste Poline * Vincent Frouin * Alexis Barbot * Benjamin Thyreau * Gael Varoquaux * Satra Ghosh * Stephan Gerhard * Dan Marcus * Tim Olsen * Deech * Yaroslav Halchenko * David Just * David Gutman * Alexandra Anghelescu * Mark Scully * Adam Harding * Janis Breeze * Jordi Huguet * Greg Operto .. note:: If we forgot anyone, do not hesitate to send an email to goperto@barcelonabeta.org and we will include you in the list. Funding ------- * Originally funded by the European Project IMAGEN. * PyXNAT workshop that took place at Washington University in 2011 was generously funded by the `INCF `_ and the XNAT team: - http://nrg.wustl.edu/events/nrg-to-host-2011-pyxnat-workshop/ - http://datasharing.incf.org/ni/PyXNAT_Workshop pyxnat-1.4/doc/advanced_tutorial.rst000066400000000000000000000221331374563466300177120ustar00rootroot00000000000000:orphan: .. module:: pyxnat ============================== Advanced Tutorial ============================== .. currentmodule:: pyxnat This advanced tutorial is not much more complicated than the one for beginners. It only reviews parts of the API that may be less used (not that they are less useful!) and that are more likely to change in future releases. Introspection ------------- In order to browse a database people have to be aware of: - the REST hierarchy - schema types and fields - values of fields and resources within a project The idea of this interface is to help users find their way around a XNAT server by making it easier to gather the preceding information. Searchable datatypes and fields ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> # simple datatypes listing >>> central.inspect.datatypes() [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> # datatypes listing with filter >>> central.inspect.datatypes('cnda:*') ['cnda:manualVolumetryData', 'cnda:clinicalAssessmentData', 'cnda:psychometricsData', 'cnda:dtiData', 'cnda:atlasScalingFactorData', 'cnda:segmentationFastData', 'cnda:modifiedScheltensData'] >>> # simple fields listing >>> central.inspect.datatypes('xnat:subjectData') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', ...] >>> # field listing with filter >>> central.inspect.datatypes('xnat:subjectData', '*ID*') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/ADD_IDS'] >>> # field listing on multiple types >>> central.inspect.datatypes('cnda:*', 'EXPT_ID') ['cnda:manualVolumetryData/EXPT_ID', 'cnda:clinicalAssessmentData/EXPT_ID', 'cnda:psychometricsData/EXPT_ID', 'cnda:dtiData/EXPT_ID', 'cnda:atlasScalingFactorData/EXPT_ID', 'cnda:segmentationFastData/EXPT_ID', 'cnda:modifiedScheltensData/EXPT_ID'] To known what values fields can take in the database:: >>> central.inspect.field_values('xnat:mrSessionData/SESSION_ID') REST hierarchy ~~~~~~~~~~~~~~ :mod:`pyxnat` does not support all the REST resources. The reasons for this is that, some of these resources are still experimental, or do not work exactly the same way which would make it difficult to provide a consistent interface at the Python level. However support for these exotic resources will increase in future releases. A good way to know what is the supported REST hierarchy is to use the following method:: >>> central.inspect.structure() - PROJECTS + SUBJECTS + EXPERIMENTS + ASSESSORS + RESOURCES + FILES + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + RECONSTRUCTIONS + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + SCANS + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES Naming conventions ~~~~~~~~~~~~~~~~~~ Administrators usually use a consistent vocabulary across single projects, that maps to XNAT datatypes. A new feature in introduced in 0.6 and improved in 0.7 is to be able to define a mapping so that specific name patterns can be used to cast a resource when creating a new one. For example with the following mapping:: '/projects/my_project/subjects/*/experiments/SessionA_*':'xnat:mrSessionData' Creating an experiment in ``my_project`` that matches `Session_*`, creates an `xnat:mrSessionData`:: >>> central.select('/projects/my_project/subjects/*/experiments/SessionA_new').create() In the 0.7, it is no longer up to the user to manually save and load the mapping file. Files are created automatically and the mappings are discovered `on the fly` when queries are issued on the server. Files are loaded at the ``Interface`` creation and the mappings are updated regularly. This functionality can be configured with the following method:: >>> # activate (default) >>> central.inspect.set_autolearn('True') >>> # setup update frequency >>> central.inspect.set_autolearn(tick=10) When a mapping is available, re-running the ``rest_hierarchy`` method will display additional information such as:: - PROJECTS + SUBJECTS + EXPERIMENTS ----------- - xnat:mrSessionData - xnat:petSessionData +ASSESSORS .... There are additional methods to visualize and display the mappings:: >>> central.inspect.experiment_types() >>> central.inspect.assessor_types() >>> central.inspect.scan_types() >>> central.inspect.reconstruction_types() Methods also allow to have a quick look on the values at those levels on the database:: >>> central.inspect.experiment_values('xnat:mrSessionData') >>> central.inspect.assessor_values('xnat:mrSessionData') >>> central.inspect.scan_values('xnat:mrSessionData') >>> central.inspect.reconstruction_values('xnat:mrSessionData') For more details check the reference documentation. .. note:: With ``networkx`` and ``matplotlib`` installed, a ``draw`` subinterface will be made available to display some data from the inspect subinterface as a graph:: >>> central.draw.experiments() >>> central.draw.assessors() >>> central.draw.scans() >>> central.draw.reconstructions() >>> central.draw.architecture() >>> central.draw.field_values() Sharing ------- It is possible to share ``Subjects``, ``Experiments`` and ``Assessors`` via the REST API. The methods to control sharing are:: >>> subject = interface.select('/project/project1/subject/subject1') >>> subject.share('project2') >>> subject.unshare('project2') >>> # to know to in which projects a subject is available >>> subject.shares() Almost the same interface is available for collection objects:: >>> subjects = interface.select('/project/project1/subjects') >>> subjects.share('project2') >>> subjects.unshare('project2') >>> # to retrieve the subjects sharing a list of projects >>> subjects.sharing(['project1', 'project2']) .. note:: Of course the permissions policies (user level and project accessibility)still apply. .. warning:: The ``shares`` and ``sharing`` methods are not implemented in an efficient way at the moment. There is another more concerning issue: subjects for example are accessible through their ID or label. But labels stop working when trying to access a subject through a project that is not its orginial one. Search templates ---------------- :mod:`pyxnat` is also able to define templates to use with XNAT search engine. They work basically the same way as usual searches but instead of defining values to filter the data, one need to define keywords to replace them later with the actual values:: >>> contraints = [('xnat:subjectData/SUBJECT_ID','LIKE','subject_id'), ('xnat:subjectData/PROJECT', '=', 'project_id'), 'OR', [('xnat:subjectData/AGE','>','age'), 'AND' ] ] >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID'] >>> interface.manage.search.save_template('name', 'xnat:subjectData', columns, criteria, sharing='public', description='my first template' ) >>> interface.manage.search.use_template('name', {'subject_id':'%', 'project_id':'my_project', 'age':'42' } ) >>> interface.select(...).where(template=('name', {'subject_id':'%', 'project_id':'my_project', 'age':'42'} ) ) And now it is also possible to reuse saved searches in the where clause in the same way as the templates. It means that you reuse the constraints but not the data selection which still changes: >>> interface.select(...).where(query='saved_name') Provenance definition --------------------- :mod:`pyxnat` 0.8 introduces a way to store provenance i.e. to describe the steps that were performed on an initial data to produce this one. Reconstructions and assessors only can be annotated with provenance information: >>> prov = {'program':'young', 'timestamp':'2011-03-01T12:01:01.897987', 'user':'angus', 'machine':'war', 'platform':'linux', } >>> element.provenance.attach(prov) >>> element.provenance.get() >>> element.dettach() The provenance :meth:`Provenance.attach` method adds new steps with each call, unless the `overwrite` parameter is set to `True`. The following keywords for the provenance dictionary are available: - program - program_version - program_arguments - timestamp - cvs - user - machine - platform - platform_version - compiler - compiler_version pyxnat-1.4/doc/conf.py000066400000000000000000000155571374563466300150030ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # pyxnat documentation build configuration file, created by # sphinx-quickstart on Tue Nov 24 11:04:02 2009. # # This file is execfile()d with the current directory set to its parent 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 import os import sphinx_theme def get_version(): try: import re import os.path as op fp = op.join(op.split(op.dirname(__file__))[0], 'pyxnat', 'version.py') s = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format('VERSION'), open(fp).read()) return s.group(1) except Exception: raise RuntimeError("No version found") sys.path.append(os.path.abspath('..')) # If your extensions (or modules documented by autodoc) are in another # directory, add these directories to sys.path here. If the directory is # relative to the documentation root, use os.path.abspath to make it absolute, # like shown here. # sys.path.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.napoleon', 'sphinx.ext.autosummary'] # 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 = 'pyxnat' copyright = '2010, Yannick Schwartz' # 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 = get_version()[:3] # The full version, including alpha/beta/rc tags. release = get_version() # 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' # 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 theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'stanford_theme' html_theme_path = [sphinx_theme.get_html_theme_path('stanford-theme')] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. html_favicon = "pyxnat.ico" # 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 = 'pyxnatdoc' # 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', 'pyxnat.tex', r'pyxnat Documentation', r'Yannick Schwartz', '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 # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/dev': None} pyxnat-1.4/doc/external_resources.rst000066400000000000000000000016531374563466300201420ustar00rootroot00000000000000:orphan: External Resources ================== Documentation ------------- The ICTS at the University of Iowa has published its own documentation for :mod:`pyxnat`. A very good `User Guide ` can be found here: https://wiki.uiowa.edu/display/ICTSit/pyxnat+Usage A very detailed `Installation Guide ` can be found here: https://wiki.uiowa.edu/display/ICTSit/pyxnat+Installation+Instructions NiPyPE ------ `NiPyPE `_ is a Python library that interfaces to existing neuroimaging software such as SPM, FSL and Freesurfer. It also features a workflow engine that enables it to distribute jobs over multiple machines or clusters. It is able to pull data from XNAT and push back the results using :mod:`pyxnat`. .. image:: images/pyxnat_nipype.png :scale: 100 % :align: center pyxnat-1.4/doc/features/000077500000000000000000000000001374563466300153055ustar00rootroot00000000000000pyxnat-1.4/doc/features/attributes.rst000066400000000000000000000024201374563466300202230ustar00rootroot00000000000000Working with attributes ----------------------- XNAT defines its data model, i.e. its data types and their relations in an XML Schema. The elements stored in the database follow this specification which can be used to get and set a range of attributes. The only way to know all the attributes is to look at the relevant schemas. The schemas are found on the XNAT server instances: e.g. https://central.xnat.org/schemas/xnat/xnat.xsd XNAT provides some documentation on the attributes here: http://docs.xnat.org/XNAT+REST+XML+Path+Shortcuts The attributes interface in **pyxnat** follows the same syntax. Predefined shortcuts: .. code-block:: python >>> project.attrs.set('secondary_ID', 'myproject') >>> project.attrs.get('secondary_ID') 'myproject' Generic, xpath-like syntax: .. code-block:: python >>> project.attrs.set('xnat:projectData/keywords', 'test project') >>> project.attrs.get('xnat:projectData/keywords') 'test project' Get or set variables in a single call for optimal performance: .. code-block:: python >>> project.attrs.mset({'xnat:projectData/keywords':'test project', ... 'secondary_ID':'myproject' ... }) >>> project.attrs.mget(['xnat:projectData/keywords', 'secondary_ID']) ['test project', 'myproject'] pyxnat-1.4/doc/features/custom_variables.rst000066400000000000000000000020231374563466300213760ustar00rootroot00000000000000Schemaless Data --------------- XNAT uses an XML schema to declare datatypes and variables. However it offers several mechanisms to store data that do not fit in the schemas. The trade off is in general that those data cannot be queried using the search engine. .. Custom Variables ~~~~~~~~~~~~~~~~ Variables have to be declared at the project level and then set at any StudyProtocol level. .. warning:: At the moment this system suffers several limitations: - the "first" time, this feature has to be enabled through the web interface by clicking at the "custom variables" button under a project and adding a custom variable. - a custom variable cannot be deleted Parameters ~~~~~~~~~~ Key/value mechanism accessible at the assessor and reconstruction levels. .. code-block:: python >>> assessor.set_param('one', '1') >>> assessor.set_param('two', '2') >>> assessor.params() ['one', 'two'] >>> assessor.get_param('two') '2' .. warning:: Currently a parameter cannot be deleted. pyxnat-1.4/doc/features/files.rst000066400000000000000000000037721374563466300171520ustar00rootroot00000000000000Working with Files ------------------ Files, containing images or other data are attached to elements with URIs defining a ``resource`` level and a ``file`` level: .. code-block:: python >>> project.resources().files() ['image.nii'] Upload Files ~~~~~~~~~~~~ Files are uploaded with the :func:`~pyxnat.File.insert` method, which is similar to the :func:`~pyxnat.EObject.insert` method but supports different arguments: .. code-block:: python >>> project.resource('NIFTI').file('T1.nii').insert('/tmp/image.nii') >>> project.resource('NIFTI').file('image.nii').insert( ... '/tmp/image.nii', ... content='T1', ... format='NIFTI' ... tags='image test') .. note:: The old :func:`~pyxnat.File.put` method is equivalent to :func:`~pyxnat.File.insert` and is still working. .. warning:: The `content`, `format` and `tags` attributes can only be set when uploading the file, and then cannot be modified. Download Files ~~~~~~~~~~~~~~ Files are downloaded with the :func:`~pyxnat.File.get` method. Given no location, a default path in the cachedir will be automatically generated and returned. .. code-block:: python >>> project.resource('NIFTI').file('T1.nii').get() '/tmp/nosetests@central.xnat.org/c7a5b961fc504ffc9aa292f76d75fb0c_image.nii' >>> project.resource('NIFTI').file('T1.nii').get('/tmp/test.nii') '/tmp/test.nii' >>> project.resource('NIFTI').file('T1.nii').get_copy() '/tmp/nosetests@central.xnat.org/workspace/projects/Volatile/resources/123150742/files/image.nii' >>> project.resource('NIFTI').file('T1.nii').get_copy('/tmp/test.nii') '/tmp/test.nii' Get attributes ~~~~~~~~~~~~~~ If attributes were defined they can be retrieved: .. code-block:: python >>> project.resource('NIFTI').file('image.nii').size() 98098 >>> project.resource('NIFTI').file('image.nii').content() 'T1' >>> project.resource('NIFTI').file('image.nii').format() 'NIFTI' >>> project.resource('NIFTI').file('image.nii').tags() 'image test' pyxnat-1.4/doc/features/global_listing.rst000066400000000000000000000032031374563466300210260ustar00rootroot00000000000000A few shorcuts -------------- There are two competing interfaces in XNAT REST API to retrive array of values. One is the search engine, the other one is URIs with advanced filtering. The search engine offers more flexibiblity but can be slower in some cases. This is why **pyxnat** wraps some REST calls to list all the experiments and scans from the server with the filering capabilities. List all the experiments from an XNAT instance: .. code-block:: python >>> central.array.experiments() List all the experiments from an XNAT instance with some filters: .. code-block:: python >>> central.array.experiments(project_id='my_project', ... subject_id='my_subject', ... experiment_id='my_expt', ... experiment_type='xnat:mrSessionData') List all the experiments from an XNAT instance with custom filters. The following call returns all the mrSessionData experiments whose subject is 42 years old: .. code-block:: python >>> central.array.experiments(constraints={'xnat:mrSessionData/age':'42'}) To customize the returned columns: .. code-block:: python >>> central.array.experiments(columns=['xnat:mrSessionData/age']) The syntax to list all scans is exactly the same: .. code-block:: python >>> central.array.scans(project_id='my_project') There is also a shortcut that uses the search engine to list all the experiments it combines the syntax from the previous shortcuts and the syntax from the search engine to express the contraints. .. code-block:: python >>> central.array.search_experiments( ... project_id='my_project', ... constraints=[('xnat:subjectData/AGE','>','14'), 'AND'] ... ) pyxnat-1.4/doc/features/index.rst000066400000000000000000000007101374563466300171440ustar00rootroot00000000000000:orphan: .. module:: pyxnat User Guide ============= The modules in this section are intended to give in-depth overviews of how to accomplish specific tasks with :mod:`pyxnat`, as well as advanced options for operations described in the tutorial. .. toctree:: :maxdepth: 2 operations files attributes paths search_engine inspect permissions provenance custom_variables users schema global_listing xpath_store pyxnat-1.4/doc/features/inspect.rst000066400000000000000000000120241374563466300175030ustar00rootroot00000000000000XNAT Introspection ------------------ Prior knowledge is needed to traverse an XNAT database, general knowledge on XNAT, such as the REST hierarchy, a knowledge specific to a database such as datatypes and values of variables. The idea of this features is to help users find their way around an XNAT server by making it easier to gather information. The REST hierarchy ~~~~~~~~~~~~~~~~~~ The REST hierarchy is the first thing to know. It can be found on the `XNAT web site `_ or printed on screen: .. code-block:: python >>> central.inspect.structure() - PROJECTS + SUBJECTS + EXPERIMENTS + ASSESSORS + RESOURCES + FILES + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + RECONSTRUCTIONS + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + SCANS + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES Searchable datatypes and fields ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To write queries for the search engine, or just to have a better insight of the data within an XNAT instance users have to know about datatypes and data values. There are a few methods in the :class:`~pyxnat.Interface.inspect` sub-interface to get this information. Get the datatypes: .. code-block:: python >>> central.inspect.datatypes() [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> central.inspect.datatypes('cnda:*') ['cnda:manualVolumetryData', 'cnda:clinicalAssessmentData', 'cnda:psychometricsData', 'cnda:dtiData', 'cnda:atlasScalingFactorData', 'cnda:segmentationFastData', 'cnda:modifiedScheltensData'] Get the fields: .. code-block:: python >>> central.inspect.datatypes('xnat:subjectData') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT'] >>> central.inspect.datatypes('xnat:subjectData', '*ID*') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/ADD_IDS'] >>> central.inspect.datatypes('cnda:*', 'EXPT_ID') ['cnda:manualVolumetryData/EXPT_ID', 'cnda:clinicalAssessmentData/EXPT_ID', 'cnda:psychometricsData/EXPT_ID', 'cnda:dtiData/EXPT_ID', 'cnda:atlasScalingFactorData/EXPT_ID', 'cnda:segmentationFastData/EXPT_ID', 'cnda:modifiedScheltensData/EXPT_ID'] Get the field values in an XNAT instance: .. code-block:: python >>> central.inspect.field_values('xnat:mrSessionData/SESSION_ID') Resources organization ~~~~~~~~~~~~~~~~~~~~~~ It is also useful to have a preview, even incomplete, of the resources names and values in the REST tree. The REST resources map to datatypes defined in the schema. It's not possible to guess the mapping but **pyxnat** provides methods to retrieve it: .. code-block:: python >>> central.inspect.experiment_types() >>> central.inspect.assessor_types() >>> central.inspect.scan_types() >>> central.inspect.reconstruction_types() Methods also enable to have a quick look on the values at those levels on the database: .. code-block:: python >>> central.inspect.experiment_values('xnat:mrSessionData') >>> central.inspect.assessor_values('xnat:mrSessionData') >>> central.inspect.scan_values('xnat:mrSessionData') >>> central.inspect.reconstruction_values('xnat:mrSessionData') The mappings can also be used to create a resource by guessing its type. For example all the resources at the experiment level named ``Session_*`` are ``xnat:mrSessionData`` so the following line will create an ``xnat:mrSessionData``: .. code-block:: python >>> exp = subject.experiment('SessionA_new').insert() >>> exp.datatype() 'xnat:mrSessionData' When a mapping is available, re-running the :func:`~pyxnat.Interface.inspect.structure` method will display additional information such as: .. code-block:: python >>> central.inspect.structure() ... - PROJECTS ... + SUBJECTS ... + EXPERIMENTS ... ----------- ... - xnat:mrSessionData ... - xnat:petSessionData ... +ASSESSORS ... ... .. note:: A bit more on how the mapping are discovered: Administrators usually use a consistent vocabulary across single projects, that maps to XNAT datatypes. A new feature introduced in 0.6 and improved in 0.7 is to be able to define a mapping so that specific name patterns can be used to cast a resource when creating a new one. In the 0.7, it is no longer up to the user to manually save and load the mapping file. Files are created automatically and the mappings are discovered on the fly when queries are issued on the server. Files are loaded at the :class:`~pyxnat:Interface` creation and the mappings are updated regularly. A small example: .. code-block:: python {'/projects/my_project/subjects/*/experiments/SessionA_*':'xnat:mrSessionData'} pyxnat-1.4/doc/features/operations.rst000066400000000000000000000066201374563466300202260ustar00rootroot00000000000000Operating the database ---------------------- Basic operations ~~~~~~~~~~~~~~~~ Common operations for :class:`~pyxnat.EObject` objects include creation, deletion and existence checking. .. code-block:: python >>> project = central.select.project('my_project') >>> project.exists() False >>> project.insert() >>> project.exists() True >>> subject = project.subject('first_subject') >>> subject.insert() >>> subject.delete() >>> subject.exists() False .. note:: previous versions of **pyxnat** documentation mentionned :func:`~pyxnat.EObject.create` instead of :func:`~pyxnat.EObject.insert` to create new resources. :func:`~pyxnat.EObject.create` still exists and will probably never be deprecated. Custom datatypes ~~~~~~~~~~~~~~~~ REST resources are given a default type when they are created but it is possible to customize it with a type defined in the XNAT XML Schema(s). .. code-block:: python >>> experiment.insert(experiments='xnat:petSessionData') >>> scan.insert(scans='xnat:petScanData') Multiple creation ~~~~~~~~~~~~~~~~~ It is also possible to create resources without having to create the parent resources first. For example: .. code-block:: python >>> subject = central.select('/project/PROJECT/subject/SUBJECT') >>> subject.exists() False >>> experiment = subject.experiment('EXP') >>> experiment.exists() False >>> experiment.insert() >>> subject.exists() True >>> experiment.exists() True Specifiy the datatype on multiple elements in a single statement: .. code-block:: python >>> scan = central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP/scan/SCAN' >>> scan.insert(experiments='xnat:mrSessionData', scans='xnat:mrScanData') Additional data at creation ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Additional fields can be configured at the resource creation. It can be especially useful for datatypes that have some mandatory fields, and thus would not be created if not specified (this is not a best practice for XML Schema writers though). It also enables users to set the resource ID through the REST API instead of just the label (the ID in this case is generated automatically). Custom ID example: .. code-block:: python >>> experiment.insert(experiments='xnat:mrSessionData', ID='my_custom_ID' ) With additional fields: .. code-block:: python >>> experiment.insert(**{'experiments':'xnat:mrSessionData', 'ID':'mr_custom_ID', 'xnat:mrSessionData/age':'42'} ) .. warning:: When using xpath syntax to declare fields, it is mandatory to pass the arguments using a dictionnary because of the ``/`` and ``:`` characters. And do not forget to expand the dict with the ``**``. Since you can create different resource levels in a single create call in pyxnat, it is also possible to configure those levels in a single call. For example if the subject for that experiment was not created, you could have specified: .. code-block:: python >>> experiment.insert( ... **{'experiments':'xnat:mrSessionData', ... 'ID':'mr_custom_ID', ... 'xnat:mrSessionData/age':'42', ... 'xnat:subjectData/investigator/lastname':'doe', ... 'xnat:subjectData/investigator/firstname':'john', ... 'xnat:subjectData/ID':'subj_custom_ID' ... }) pyxnat-1.4/doc/features/paths.rst000066400000000000000000000073131374563466300171620ustar00rootroot00000000000000More on Paths ------------- The ``paths`` which are passed as arguments to :class:`~pyxnat.Interface.select` can take different forms. They are in fact compatible with native REST calls, except for query strings in the URLs (see `XNAT doc `_ and `Wikipedia `_ for more on query strings). They also expose additional functionalities and can easily generate thousands of queries in a single statement. Absolute Paths ~~~~~~~~~~~~~~ A full path to a resource is a sequence of resource level and resource_id pairs, whereas a full path to a resource listing is a sequence of resource level and resource_id pairs finishing by a plural resource level (i.e. with an 's') .. code-block:: python >>> central.select('/project/IMAGEN/subject/000055982442') >>> central.select('/project/IMAGEN/subject/000055982442/experiments') The :class:`~pyxnat.Interface.select` statement is smart enough to deal with `plural` and `singluar` resources names which means that the following ``paths`` are equivalent in **pyxnat**. .. code-block:: python >>> central.select('/project/IMAGEN/subject/000055982442/experiments') >>> central.select('/project/IMAGEN/subjects/000055982442/experiment') Relative Paths and Shortcuts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When browsing resources, some levels are often left without any IDs and filled with ``*`` filters instead, which leads to paths like. .. code-block:: python >>> central.select('/projects/*/subjects/*/experiments/*') **pyxnat** offers shorter ways to do it. There are intended to explore faster the database from an interactive python shell such as `ipython `_, but not in production programs where using Python string replacement capabilities to generate identifiers is always faster. The previous statement is equivalent to the following calls: .. code-block:: python >>> central.select('/projects/subjects/experiments') >>> central.select('//experiments') Another example to get all the experiments from a specific project. .. code-block:: python >>> central.select('/project/IMAGEN//experiments') >>> central.select('/project/IMAGEN/subjects/*/experiments') The double slash syntax can be used anywhere in the path and any number of time to avoid writing unused `levels` in the ``path``. .. code-block:: python >>> central.select('//subjects//assessors') >>> central.select('/projects/*/subjects/*/experiments/*/assessors/*') A ``path`` will generate several ``paths`` and thus several queries if it's ambiguous and can be interpreted in differents ways. For example the path ``//subjects//assessors//files`` generates: .. code-block:: python /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* .. warning:: If you try ``//files``, it will generate all the possible descendant paths. If the server has a large amount a data it will take ages to go through all the resources: | /projects/*/subjects/*/experiments/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/scans/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* | /projects/*/subjects/*/resources/*/files/* | /projects/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* pyxnat-1.4/doc/features/permissions.rst000066400000000000000000000045021374563466300204130ustar00rootroot00000000000000Permission Model ---------------- Project Configuration ~~~~~~~~~~~~~~~~~~~~~ XNAT permission model uses a number of methods. The first thing is the project accessibility. A project can be private, protected or public. A private project is visible only by its users, a protected project is only accessible by its users and a public project is accessible by everyone. .. code-block:: python >>> central.select('/project/PROJ').set_accessibility('public') >>> central.select('/project/PROJ').accessibility() 'public' The second thing is user roles within a project. Users can be owners, members or collaborators to give read or write access to projects: .. code-block:: python >>> central.select('/project/PROJ').add_user('my_friend', 'member') >>> central.select('/project/PROJ').add_user('my_other_friend', 'owner') Resource Sharing ~~~~~~~~~~~~~~~~ The last thing is the ability to share subjects, experiments and assessors accross projects. Subjects shared to a private project enables a user to add experiments, or processing results to the subject which would not have been possible if the user didn't have write access to the original project. This functionality is also used to share a subject which is scanned across multiple studies, but restrain access of its data to the relevant investigators. .. code-block:: python >>> subject = interface.select('/project/project1/subject/subject1') >>> subject.share('project2') >>> subject.unshare('project2') >>> # to know to in which projects a subject is available >>> subject.shares() Almost the same interface is available for collection objects: .. code-block:: python >>> subjects = interface.select('/project/project1/subjects') >>> subjects.share('project2') >>> subjects.unshare('project2') >>> # to retrieve the subjects sharing a list of projects >>> subjects.sharing(['project1', 'project2']) .. note:: Of course the permissions policies (user level and project accessibility) still apply. .. warning:: The ``shares`` and ``sharing`` methods are not implemented in an efficient way at the moment. There is another more concerning issue: subjects for example are accessible through their ID or label. But labels stop working when trying to access a subject through a project that is not its orginial one. pyxnat-1.4/doc/features/provenance.rst000066400000000000000000000022211374563466300201740ustar00rootroot00000000000000Provenance ---------- XNAT offers some support for provenance. Provenance is the description of processing steps that a particular data went through to be created. While all the complexity of a processing workflow cannot be represented at the moment, it provides sufficient information to have a good idea of what the data is. Reconstructions and assessors are the only level that support provenance in XNAT. .. code-block:: python >>> prov = {'program':'young', ... 'timestamp':'2011-03-01T12:01:01.897987', ... 'user':'angus', ... 'machine':'war', ... 'platform':'linux', ... } >>> element.provenance.set(prov) >>> element.provenance.get() >>> element.delete() .. warning:: The `delete` method doesn't work currently. The provenance ``set`` method adds new steps with each call, unless the overwrite parameter is set to True. The following keywords for the provenance dictionnay are available: - program - program_version - program_arguments - timestamp - cvs - user - machine - platform - platform_version - compiler - compiler_version pyxnat-1.4/doc/features/schema.rst000066400000000000000000000030301374563466300172730ustar00rootroot00000000000000Schema Manager -------------- This manager is intented to provide a few helpers for those who wish to explore the schema. This is useful to find paths that can be used to get and set attributes for XNAT datatypes (see documentation on attributes). However this helpers are far from perfect and do not provide all the paths, and all the paths that are provided are not valid. Addictional documentation on attributes paths is available here: http://docs.xnat.org/XNAT+REST+XML+Path+Shortcuts. The first things to do when using this manager is to add a schema. There is currently no way to guess the URLs of the schema so this is a manual step. For example to add the core XNAT schema, the following calls are equivalent: .. code-block:: python >>> central.manage.schemas.add('xnat/xnat.xsd') >>> central.manage.schemas.add('xnat.xsd') .. note:: it is better to use a full path to the schema, so the first call is preferred to the second. To remove a schema from the manager: .. code-block:: python >>> central.manage.schemas.remove('xnat.xsd') You can look manually at the datatypes from schema using the :func:`~pyxnat.inspect.schemas` methods, but the preferred way is to call the :class:`~pyxnat.EObject.attrs` methods to list all the attributes relevant to that element. If no schema was added to the manager, the returned list will be empty: .. code-block:: python >>> element.attrs() .. note:: This functionalities will eventually disapear, as it is part of the XNAT roadmap to provide REST services to query the schemas. pyxnat-1.4/doc/features/search_engine.rst000066400000000000000000000114351374563466300206350ustar00rootroot00000000000000The Search Engine ------------------ Querying the Database ~~~~~~~~~~~~~~~~~~~~~ XNAT search engine can be queried via the REST model. It can be used to retrieve a specific subset of REST resources or a table containing the relevant values. The following queries find all the subjects that are within `my_project` or that have an age superior to 14. Writing the query constraints: .. code-block:: python >>> contraints = [('xnat:subjectData/SUBJECT_ID','LIKE','%'), ... ('xnat:subjectData/PROJECT', '=', 'my_project'), ... 'OR', ... [('xnat:subjectData/AGE','>','14'), ... 'AND' ... ] ... ] Combining the ``select`` statement and the ``where`` clause to retrieve the results. The result set will depend on the ``select`` which accepts paths to resources, or a specification of a table datasets with variables from the schema. .. code-block:: python >>> central.select('//experiments').where(contraints) >>> central.select('xnat:subjectData', ... ['xnat:subjectData/SUBJECT_ID', ... 'xnat:subjectData/AGE'] ... ).where(constraints) .. note:: For additional documentation on the Search Engine: - :class:`~pyxnat.Search` - :class:`~pyxnat.SearchManager` - :class:`~pyxnat.CObject` The query syntax ~~~~~~~~~~~~~~~~ Constraints for the ``where`` clause are expressed as follows: - A query is an unordered list that contains - 1 or more constraint(s) - 0 or more sub-queries (lists as this one) - 1 comparison method between the constraints ('AND' or 'OR') - A constraint is an ordered tuple that contains - 1 valid searchable_type/searchable_field - 1 operator among '=', '<', '>', '<=', '>=', 'LIKE' Search Help ~~~~~~~~~~~ To get the searchable types and fields to put in the contraints, rows and columns parameters, use the :func:`~pyxnat.Interface.inspect.datatypes`` method: .. code-block:: python >>> central.inspect.datatypes(optional_filter) [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> central.inspect.datatypes('xnat:subjectData', optional_filter) ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', ...] .. tip:: How to get all the results in a query? .. code-block:: python >>> central.select('xnat:subjectData', ... ['xnat:subjectData/SUBJECT_ID', ... 'xnat:subjectData/AGE']).all() How to get all the columns from a datatype? .. code-block:: python >>> table = central.select('xnat:subjectData').where(...) Then to get everything: .. code-block:: python >>> table = central.select('xnat:subjectData').all() Search Templates ~~~~~~~~~~~~~~~~ **pyxnat** offers a templating feature for the search engine. The first thing is to create a template. The syntax is the same as for saving a normal search, but values in the contraints must be keys to be re-used in the future. In the following example ``sid`` is a key for the subject identifiers. .. code-block:: python >>> central.manage.search.save_template( ... 'template_name', ... 'xnat:subjectData', ... ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBHECT_ID'], ... [('xnat:subjectData/SUBJECT_ID', 'LIKE', 'sid'), 'AND']) To use the template, the easiest way is through the search manager. .. code-block:: python >>> central.manage.search.use_template('template_name', ... {'sid':'*5*'}) >>> central.manage.search.use_template('template_name', ... {'sid':'CENTRAL'}) It can also be used with the usual syntax with the ``select`` statement. In that case only the constraints will be used because the return data is re-defined in the select statement. .. code-block:: python >>> central.select('//subjects').where(template=('my_template', ... {'sid':'*5*'})) >>> central.select('xnat:mrSessionData', ... ['xnat:mrSessionData/SESSION_ID'] ... ).where(template=('my_template', {'sid':'*5*'})) .. warning:: This functionality hacks a bit the search saving system of XNAT. The only problem is that it will create saved searches that will be names ``template_something`` that will not work from the web interface. Do not use this feature if it is an issue for you. .. note:: For additional documentation on templates: - :func:`~pyxnat.SearchManager.use_template` - :func:`~pyxnat.SearchManager.saved_template` - :func:`~pyxnat.SearchManager.save_template` - :func:`~pyxnat.SearchManager.get_template` pyxnat-1.4/doc/features/users.rst000066400000000000000000000013661374563466300172060ustar00rootroot00000000000000User Manager ------------ The REST API currently offers a limited number of features to manage users. The class :class:`~pyxnat.Interface.manage.users` may be used to know about registered users on the server. To list all existing users: .. code-block:: python >>> central.interface.manage.users() On a specific user: .. code-block:: python >>> central.interface.manage.users.firstname('username') >>> central.interface.manage.users.lastname('username') >>> central.interface.manage.users.id('username') >>> central.interface.manage.users.email('username') To assign users with specific roles (owner/member/collaborator) in a project: .. code-block:: python >>> central.select.project('project').add_user('admin', 'collaborator') pyxnat-1.4/doc/features/xpath_store.rst000066400000000000000000000027551374563466300204100ustar00rootroot00000000000000Xpath Store ----------- This store is another use of the local cache directory. It basically enables users to perform xpath queries on subjects XML documents. It also provides a few utility functions to help figure out what information is in the documents. An xpath example to retrieve the IDs from all the subjects in cache: .. code-block:: python >>> central.xpath('//xnat:Subject/attribute::ID') Download the XML documents from a project or from a subject list: .. code-block:: python >>> central.xpath.checkout(project='my_project') >>> central.xpath.checkout(subjects=['CENTRAL_00001', 'CENTRAL_00005']) Update the subjects XML documents if any data related to them has changed on the server since the last update: .. code-block:: python >>> central.xpath.update() .. warning: currently the creation date of the cached files are checked against the time of the server. If the server is not in the same time zone you can encounter some issues. This will be fixed. Helper methods to get the subject IDs, the subject attributes, the elements attached to subject and their attributes or text elements: .. code-block:: python >>> central.xpath.subjects() >>> central.xpath.keys() >>> central.xpath.values('key') >>> central.xpath.attrs() >>> central.xpath.elements() >>> central.xpath.element_keys('element_name') >>> central.xpath.element_values('element_name') >>> central.xpath.element_attrs('element_name') >>> central.xpath.element_text('element_name') pyxnat-1.4/doc/images/000077500000000000000000000000001374563466300147345ustar00rootroot00000000000000pyxnat-1.4/doc/images/pyxnat_nipype.png000066400000000000000000002432331374563466300203600ustar00rootroot00000000000000‰PNG  IHDRò< ›)‰sBIT|dˆ pHYsaa¨?§itEXtSoftwarewww.inkscape.org›î< IDATxœìÝyx\eÙøñï}f²¯Ý›¦{ËR -¡ì‚ì²/²ú*A_DDE}EqCw_*«D\@Pv”­²+…@ËÖ–îmš6]³'3sîßçLr&ÍÞ6g&¹?×Õ«ç½â±¯T‡ˆ1é̹Ù#¦œýݲ¨F~‚rJر˜a%ü¬  í–7ï¹±=ì`ŒIG–ÈÍn›uæÍ³\• Œ–;޳9šy;''ç윜aÅg2€º‘ÖÖöímmsâñÄU- >,ðïü‚¶s-™³«hؘÌ&ß™¿&qGdËø²1ß?ê˜Ã^ 14“¡Zc‰ÈsO¾XÙÔÐx¹úßQ G47g_|'äðŒI;V#7»eú·|AD¿–ÜÏÉÉ~æÃæ⤱ aÆe2߯½3{ÍʵßJ¸ît¿(!Žsêʇ®{-̸ŒI7–ÈÍ M;ãæý‘Ù‘ˆ³òÄÓŽùï‚‚XÈ¡™aâ­7—N_þÎÊß©zŸ1`ù˜M£Y´èJûŒãsÂÀd.GäcÐñëN™Zö=KâfO:ð ýVÞ(ÚgËøíÇ…1iȹ٠’99ÙÏT6ïí0ƒ1ÃÓ±'}·ˆ³3¹/¢ z;Þ˜‘ƹ”N¸) ÌMîçææ. 13ŒåfEѬÈ;É}Š0ã1&ÝX"7ƒ²:?k“Ü/UüN/‡³[r²³:>_j‰Ü˜–ÈÍ ˆ83ƒû³˜½,¬XÌð—Wü|ÛÿÜ[ {<ؘƹE"ÁýÒ¼¶°b1Ã_Ô‘”ÏW›ÓééXcFKäÆcL³DnŒ1Æd0KäÆcL³DnŒ1Æd0KäÆcL³DnŒ1Æd0KäÆcL³õÈMFšûNþôü—&•d­/ϋ옔í4Ot$‘'¸¹‚›#âæ šÓ’(yõþ ?¿=ìx1fo±Dn2Â9“®» 0ºéøˆ´OŠH¼\pKús^C|â{;6cŒ “%r“öŽsû~c²WÜ h6¯˜›ÿâƒ5·Þ××qãs–æµ´û§-‰ÒD°ì„±ß;í?üOÙ›nncçæÅ³iNŒ^;ÈP1fÈY"7i¯5Q\CVÿŽMhö;ÕÞôXrÿÒ?MÍŠ>õ½¯l‹.Ø:cuŸçk”ííÓÖ6VcŒj–ÈMÚkŒOØo÷ëØ¦ø˜¸ÕÑÙ«rOë•klºòn·>âŽkí×ù¥ËO¶DnŒÉ–ÈMÚÛÐ2ýìÂg¾Ž-ŒnþЇ¦\>5i8ñÚíÑÒe¹ÛôZ%â´ìŒMjl¬Æ3ÔlŠV“öV6»½ÝÍ®?Ç:’˜qêÏ¿rSÁ€“8ÀX‰nðIÆ"Kä#ˆ†Ã@mj=àwý9nGk>—­ˆâÚ¿ˆ ³É±fõaLD²Eä³"’v,Æì)–ÈG9X%"†Ë@<¹ùú—š½´·cZQ>Q[ÂÖ±«õ‘†±LÈoÛ2¨“MFPÕvà`¹ˆ\."šhȘtd‰|‘‰ÀÀXà¹!äd{ûÔßõô˜ \µ±„ÞôóG¶M¢(¯Í&ƒþn&wKEä !ÇcÌn±D>BˆHð7¼/0ð:Ž…Qï¢/ÍèZ¶°î ¸ÙԵܮ©+`ØÝþÙZNíÎÑ}v¨ *j}tž»íÙ¹»õÂfH©ê¿€åþî,à‡"òŠˆbXÆ šõZ9nŽ ì?|5¤Xz¥›î½ü±Å³¾4êýKËÊ'}>Qxäj€†ø„X}|Ò¥Yë®ÿÿ¶òná.ù½okÊЧ@Î|ެÚÙ¬/]M?zd×ÿcÁ‹oæÝQ×PžpØŒû—ŒÝ÷ü‹Do}íÚ'ãnÄ9|~ÁéñüC»vvOq¶üý¬Õµ‘/6µåº®ã$TïG®ã$\G\…˜""¢u\uW#âºoÛuÄu³#‰ØÔñõf—_òí½ó =ìØ?xND¾ªªo†–1g‰|‘/•¢ÅÀGTÕ )¤^­¨)üDÜðêêYûåmhôé÷>_Z~äÝœ) /lùÔ½g”}í*Á°¾©#õƒz][Û¼iÜõ±cˆ8eÔ5l-ê«+`ž®,|m¹üv½nÉij]NIé &ŒÜœJ.ºý‘ccmÍÈÄ‹~=¨à|mÛß¼tu[QŽ:1ÚV{Evþ¡7 äü¬†g÷]¿aë˧ͼ"ž7¿Ï«õ[cW½Ü°eb¼)†6eCBÀuü 4Ðh!*D\p’ÿ".‘QíäÉtv¶N¼hA9é˜È¿|Š]‡4ž œ)"w7ªªÍògÒž5­s"r6ð½@ÑfàUíyžÒEb5ùk¶ëXƤ%–-/,ß÷Ø—^Yó’Öþñú-í³Zâ㫮à «§àf· êµdr ¯m)¥¹x1kêJßïH¼×æõš¯V-mmÌmZÛLdt;cÖ'FŸûà1ÍM'ücñ¬Ïo]~ß=N|Ó {HÇã:®5k=í‘:ÚbΤž_[[÷×ÖÌœ½½vÙ·úsüè|wIqãJœy—N£püxò';Å!kZ+2¶Ël¹~R—â"ZÈ.ƒÂÑ“(i=šœær¦Ù:øN {‘ªnêáaø°LDn‘ÑC˜1ƒ`5òaLDî¦ó‚­8_UׄUïÜí/ž×ßg—òmME‘Çß8ð²9›?ÿµÄœ7sSÓ]oQ°qŸ þÅfl€©µ°v"­uí¼“39Îä?_Ñ2úÒÛ»¯ö/×¼¸vÒþM;—CŒŽÏeÚä–ëâ]Žkjìß\øOo©Ÿ{àÎ7žŸwÀèsÓ,KHi¢5†“íà*997Ò¶¢ä­ “j*~w6ìó¾#§Ög¹‘âXoçäN¹äú3'Ö|[_;´­µy^kû5¶fMß\?zòúícs¶å¿ ÍÞµIáô"ŠctÆØÍuÙíÛs³›r²Öçd¯|7R¸ÏÂxÞùu}ÏCè×À9½<ž|¸BDn~ªªÍC™1`‰|˜‘1x5Ž`‡¶Oªê !…Ô/;õ”Þgã”Â÷6Oúúò ù‚îßk^ê•Ó0†¬™ÐÞV»©vÐ4ë ÞX=ñÊ}G³K"—í ç>ÿî´OÖó4•’;K9d̦·ã%Tw=¶¡5§ i_‘Ï[³ÖÄ–DYpàóÆ P 5wJ5!€âº’=s›7/ºn[V–´­P76ißôø5ÑIßÖ×y‰¬IÍŒšôlž- €²ø¦Ü‚·^}rimù§¸ ×OäÙÍåœX±ê[:î‚?ŸC®7ièq`=@{R‚תuµˆÜÜ©ªðöÌHaMëÈd÷Ážß?PÕß…QÿílÊÝ¥·zW±D„'Þ^àd­žÓTÚ×á»JD)^r"—¬:­û¯/åpœ²´m޳bë¸Bjÿ|m𔨻9ç­±;ksÞ·¦gÒÆ´ì£eååÝ]Š'"Y*Þ]óöù,sWæügIâþ¬úgH¨íñHqALäËkÇžÞ«…X”æü·XQ[2èÎxntBë>“ã78yþ‡¬89Æžþ×Á>o˜ü>"wà”Ixµø7E䂽•1g‰|xº8.°ÿ0ð•bíÍýÏÌn„¼Eg èùÖBŽ_zbüK“ò?/®<{¿ŠO=kîkK‹‡@N òi(|—MýĨ¶‡;†•m[ýôŸ—µ5ÆVåBVœBg™¾æ¥XÁ‘ÝÞ¦pUèìþÖ¾"Ÿ,ÏzqIôÏÑÞßxÛãÑBNò9ûÈ¥îþóW5FóÜo)÷ö:X¹eBQdë§õ÷9vQxàp)ºì8¹Yí®J~&×NïÄÁ8û‘‹Èñ{>$cÆù0#"§ÁZâ[À‡Óµ‡zhs´®¡d@÷³×Ì%÷ícûulnãh¾££¹â ­×½¿ú17×-žòK›ºa[îD¯¹8¶*:g‹¼±Ì½#Ÿ ¹¥õ¿þæó«¦îßT·\‡ì©íŒä¸£Êéq"Uq´K~h_‘Ïjgiô¹%EÿÝþðûûs[,š§qTI¸N?s…õ›#ŸjÉy×ëmPŸOKÑ;¬ß¬×ô÷9ºJäÌÚYZÐHvô–¬8ÑHBû|éÀï/òÄ NÝ l*D¤xÏFeÌÀX"FDd,ð{:‡Ô´«jCÏg¥Hý sc‰wÛÈ{õ ¢›{o‘/ÝQÆÿ•º6z+ÕÛÿëÙàcÛcSÛö™=ù‚ÙÙãÚòà:4nÛÌ’Íã‹^}õ­=òúÜKvÊëИ‡Œn¤°a‡L_ÿ@"gÖΞ^Ïí&‘ƒ—Ì×Gßq.ó«þÔŽ[ãY9Ä# ô;‘G›^œùNí¤É±MþáâåÚÖ¦¼µaÊô¬¦—§õçyºSœÛÜ*ÉW–K–“Hô~FFøíŽ}o>†1ªzŽªþXU7þј=ÄùðrPØÿ¢ªöo!ït=¾FdLˆÈ§HJó ªþ¿°âŒxÞüMó§¬yo0ÉÜi-¤è‰Oà4—¤”ÏÛ´/wNÙLŽÓ™oÆå,?¨»çpÇž÷ð‚ ÛVfMò¾£µ®˜úš¸¼$™ºƒœ¦™Ì›V÷ë¾î »®#øw3œòMƒSÖ9{ûŠ|6å,‘§Où›ïûpOÏÓËŠøÝ"}&rÑæè»ÊŽjk¬÷îå·LvÓ¢“½±ö-¬æ­ “Žt[Ôq.)⸮$¿6¢5rUáµdõf)pׄcÌ€Y"Däà‡¢ÀÇC g·”Í9÷ì3­¹rÞäÕë&t§qEÿø$Ѻ©H[óVŧoØeꮼȶ{ŽO™Röéñ±ý”üV¯ÀõÏÎi§(>—Yã6Ö;eÿ²¯X\GÕ‹_¢BVËDJãï#{V‹7^2¯Ë{CžZ2íëºéÞn_M®“ÛkZï3‘Çk¾z£6DtS ‘òF²Ü\ö™P³½°eä¶“ØPÄÖ‘öÚ'µPHÄqã5r¢Ž›ñ‰ÜwG|m(1f ,‘g81”?y~‘—©jÆ.ÇéŽ>ã¹òÏ=åœ#Ö]yðÔU’І1=þiJïù:ŸŸÔýšäQiŸØÓù±‚#×\^»({bêkFÆ7‰³ÿÔÖïôë=¨ˆ÷«‰xf%yMnaý¡ä͈BÔ˱ùlÍ«æ©%³þ'±ñž«SÞK¢>«Íõ[¼DÞç’›«6]Ò"«Èwg±`ÚÊ7÷?`ÿÓ¦7µd•Ç!¡)÷mÞ«5¨áSޏ‰d\‡hÄÍäëTõ]àù.ÅÛUý¯‹ÈÑC•1ýc‰<ó}˜Øÿ¡ª>V0{R[ÉÙÏ•Í9ïä3ÝðÉ&­«é÷²d*©ówáâô:;— ´›œ)ŠD¢ýê8躎¨ë%rG¢ŒÊoLsô¬§W,¿yÿ¬1ÍS Û»g[YÀ¶‚E<õæ>Ÿ‰×üåKÉçpÚ–×H›¿“ÒÖ³èöÇŽ\¶uTi¢¦gâNòÛÇ1aÊì«ãÙ3êçÍh¼± ñ`Èo%¶ÙaÕÖq…Ζ¿lìq4N ‘{5ôa#8 \ \$gа^ê&ÝX"Ï`"r*NôQkŒ÷Gbô™ÏN›{ÖI'¼ùS³Ço쾚ݕ[º¯x«F{œgÞIÔg½W;þÐxKkj ‹ˆeogåzúµh‰ã¸êWÈqÈfÒ¨m›Ýè„VÆ_x×AÏ{ßa¥‘õ…“FC®—¨c+ ÙQð O½¹ßåíëÿr£W¸}¼ë´ âEÞÛknÙÖøéæüw¡=JVA¥ùñäB)îØó“Û–ˆŒoƒÆÞu7û3Ûæ·y÷âåÞ®™2ÞÙò·sûzí¬H"‘üÍ8šCN4ÞqñàF'´–pÆ©ÇNh_\4¾ ¼‹†ØÊBvþ›§ßÞïC­ëþr³Æ[ƪŸÈýLÞ«÷6M¨hoô:µå´M¥8·9¥åaæøM+sem±-¼»±|F´}Õ€j—ш¶uÜ#ÇV‰ÜŸGýþnpÕºOö?""—Y`ÆôÁyæº oÊȤkTuiXÁ ¥âq³/ώƈÔÐ4îßÄs¶v{Üê­º-w‰v›È£Í‹Ê­œvFSëjpgÊJ‹":Ý&ì®+¥­pËÖåö9K^°ÉÙIM¤¾¦d¹£÷¹à’“¦Õ?Q2f*{ÇV±=çEž^6í¼5µ|Ù/OŠÓ{.—ºûÏߨꦤ¤‰hÛA´¹£ƒ\vÔÝ™Ó4Dq7ÑäºÒR÷Êgûz/AQÇm¼ÛB„¨ã¶ äü p;°x4Y ^¯ÅË€àíEdæÇfL·,‘g ™¿€WÕLj‘ÑʧN_;Êêš¶ÃþIÛz¡~c EÿF#©•Ã5=$ò„vŸÈ7®[û¿›³—‹n.†ÜvŠó“Ûž(l> )ñNin¨eùæ²R6ÿõ²ÞbŒFñdæud9ÚíkL»øs§ÎÚz÷¨’ÙÈ(¯Òî®+e{ó^Ýî”·»ÉÜáµ­÷ôz›·qYK¶·‹¶Gq+ë&Wÿûּ߯ý÷ÇW/~øÙ××N]О¿Áë?Ð’ÿ.kêŠÎìí}tq´U’K—j„ˆ£­}œ’QTµøL×qâªZ\(*þo(c3¦'–È3ŒˆÞ=ºdM«¸ºç3†§ý&m}XsZ‘ ž„¬±•…ìh_D<»³ÒÔØ–Çö¦¢]ÎmŒOØe²È¶‡N|uÃÄýZk½‹œr—Ù¥ G=·âÈék–ä ¢è–bš‹óöÚâÏõ_Ôq;5wbD"Úã,pYå—|çÔ}ê~;&2Ο$lg«ëI¬öÆÅ‹È.Ãè’œÄÖìeµeûÄ·úG´ä°£ùuvd¿ÀÒIJìwî˜öŸÆãj#‹¤q}`,{c ïm.•Uÿ̽½— HÄmNÞ#‡(G‡[UívrUý;ð›@Ñû­‰Ý¤Kä™çcÀûû·¨êŠb MÁøŠ;òÜ,½ùàÓM ÛŠihYNÇ}e`í¶ñ)ç¹­YX÷…—º>ß»k¢ßÛ™½šs‘1 Œj™Ç³œOº‘âØøé‡_>%2:æ%ÙÖÚ8«v”$6ÞÓc28n pÇÍ&+ʶÞÞOdÒÅ?V<é  véï ùîgóêÁQdÎ*ôÕpwäá·þ2¦°saªv·à¹·êÏJ‡¾sÃó·­‘¶¨n.\oÖCößðûDÎ1»´oOž6åãëÚžX?½Ö‰­,¢©`1‹VÍ;åÄq‹Êãù‡¦ ‰‹8Ú&âÏàæDójû»ºˆŽ¿ð'9÷·.|sÁwjg¾.±•E$›³»jÞºø3;ò\hõjÛ³²²[ž;þäxîq=6åÏh}gtÎ’Ø“K&-ËskJi›±’MÛ¨7–û{:'IiLÎìæhŽCcò‡¹O‹,¼OÛ/EäÕÞÇú³7X<ˆ×®úÿèü}5ý¾¯9\Õ´Ìo<51º³@ùf²¦·@}*qF4íìɾµ}æ½Áó£/ÍxemÙñÉn¹å¾£švF']Òm-;ž¿ æˆ}Öß^Ôx2¶žØÆ ±ˆl\¿ö]u×oå§ïì±ëòÞܱçßüÜÚ/–Åækö¬V ‚#î.×ë¶ÖÖºÕHqÓ!Ì^s3-±o"¿á rÚRnœG›^œ¹|[ÑhwSù%8dꚥ:îü{{z¾ wþ½‡—íXž3EIÔæSÛX˜ÝŸÞëŽã4Fc¥ÈèFœx>Ž##µFðm`M`ÿ¿‹1CÊyš‘H™ômà'!…“vþ¹éÆžÒRæuz+i 6ãmH8´»;9xŠ?®i]ÞxâçÚÜÂŽ±ÁÑí¿ÿµõåû&¼ûâ¥RÁ1sÖý$^rò}½æŒéÿ{F^¤%wšˆµ’pv6^<ÆqhÍŽM$WË)+ÙÖ†d jÝîÄ賞9úÐÑÇ/˜¶jù˜¢¶×‚5o_wYB²¦¶0+»°µlúüä¹Ë¦tÙ¾ÎÔ¶ÈÄf‘fšê7_Ô×9ÉÞ†%·´ìhŒ¬â}è{.ü™à‚S$¾R8f³{äéïÓÀØÀþgüõ“ àjTO*)ûÊãu;oo·†Ä*oˆU,¶ƒy“W°¥mŸo¼¸õ“列Wüþ—NŸûÏooosFvÔÝTT´ù±Äè‹úµØL¬àðuó*6=eí¶_mi˜¾OÁø•;JF»#øK)=þ—§G7Õ´Çe|qIÖ_vge‘xî[ÆïwÀ9]Ë F͸ã„Y«‹s²K×F'õ‹Dk¤w•ÈÙwÇÁ‡Ž9|ÿu_qœÚæ¼ÂñöõÁJŒ:ká©óïýyKk֜‚5ÏÇó.èW'¾áJU‘‡ä4Ÿ‘Ûý‰eŒb}3Ò—ˆäã-£˜ ý´ªžbHfœuËùf“ûàŧ‡º¼cÍŽ<³púsõ·„ÖÊjâ÷ç=NS|Ì]÷¬ÿÍÍaÆfvßËÏ-:rãÆºud·ÍXõ·{œdg(‰È à-:—~XUÏ1$3ÂXÓzz»ŠÎ$ôoå­‘è”òIW•¿yœÒšCdZ=g”·sóþóÐÆ[o ;63¼©ê*àG¢³Dä°â1#%ò4%"yx³H%ýKUŸ +žt÷VÓG–Þ°ÿæ‹fŘ.ûsÒK^yiÛ'®mI”&ú>Û˜Ýö# ¸Vý7 Č†7L¼2/”þYõÌm@G«AkKË!†c†¹x,~@çždÒZß¿‡ŽÛQàÒc1Ô%ò‰ˆ|4PtŸªÖ‡Ï€(_¨ím±“ß~sÙÔ0Ã1ÃÓ3O¾t®«:6¹¯“ÈUuðd Èš×Íg‰<|'Sûé߬ÞÁ¹PUÍY±lõõ‰xLú8ɘ~{ï½µãwnßyu hcLÚž - Á þM("‡…‰–,‘‡¯2°½x&¤8lÕ£×-BåWÉýx<1ÿ‰ÇŸ»¦±©É†Ù˜Ý¶båšqï,^ú-U-nÃ7¶ôxRzú;°#°oµr³GY"‘ˆpJ è~™Œ/Ìþ6ž¹-Ím?ýçï|½úí}B Ëd¸gŸ~ùÔ%¯¾ý‡x<Þ±z˜ŠÜµê‘¯dZmUmþ(ú¿T±1{„dXÞVDd.°8Pt‚ª. )œA›yö­‡¨ë>t|9 Ä#ÑÈ[Ñì¬eùù9K ‹ ×’1H“ÖhVÓŽ†Ù-mmûÆcñ9‰„;³Ë!ïåDß}àºÆPÜM"r(ðJ è4UýGXñ˜áÅyˆDäZàGþn 0JUÛB iÐfž}ËAêê/[ÙìQ ÷$9ׯ{üÚíaDz;Dd=PîïÞ¦ª_ 33|XÓz¸Nl?Ÿ©I`åC_~szsÛÉ‚|h;3 (µú_«ùÊU™žÄ}ÁÛ'÷x”1d5òøó.o ý¢¯¨ê-!†´ÇÌ<ó»S\¢§Šj(ûb¦o­(K^SåµÂ–¶Gß|æÆ¦°ƒÚSD¤¸ËßU`¼ªn 1$3LX"‰ˆ<(:LU…ÏÞ4ñÔÛòó£mcÔØÐ4Ó-'KÜ© ­µÏSDf„‰6,‘‡ãý@pö3KäÆŒ ÿ‚ý¬÷ºÙm–ÈÃqP`{‹ª¾Z$Ƙ!£ª À¿EÖ¼nv›%òp§/]ZƘ0<Ø~hQ˜aÃy8‚‰|YhQcÂfZ&"E¡Eb†Käá&òå¡EaŒ C׿ùÙ¡Da† KäCLD €I"«‘3²¬‚”%„l¥@³[,‘½Y]ö­FnÌ¢ª1`M È¹Ù-–ȇ^ðV÷ Äšà¼%r³[,‘½àíUm-cLX,‘›=ÆùгëÆ˜`Kœ%r³[,‘=KäÆ˜`|œˆ”„‰Éx–ȇ^pnå•¡EaŒ S×N®V+7ƒf‰|èå¶›B‹Â¦ÕØ4³‡X"zÁÅRb¡EaŒ ?ms ¨,¬XLæ³D>ô,‘cÚÛY=eL,‘½ìÀv{Gc†»à…¼%r3h–ȇˆ8¤þÌ­FnÌÈe‰Üì–ȇV×?V«‘3rÿþ³{<ʘ>X"Z]ÿX­FnÌÈe5r³GX"ZV#7Æ$Yg7³GX"Z]ÿX­FnÌÈüû·¦u3h–ȇ–5­c’¬FnöKäC«±Ë~q(QcÒÝ#7{„%ò!¤ªÛಥ“ÊÅ:7° - “ñ,‘½õmKäÆŒ\Û›B‹Âdàû\àrû!`À‰8 ø¼¿½oIÀ©®”¯á½ÿºŠ*ýßAÄ0X–È1“HmMÛDÎø¾Í×S€mÀ­Õ•R |Á|iE•þ)¤Øú4’;X| ÈÞ,‘c†R×ÛjéœÈGªb:+£i›ÈíùÐÛØ.‘üÐ"1Æ„%xï2¸–IcˆVWÊãþö{À-ÀmÀ1ÀJà¶Š*} ypu¥|8ÅßýTE•®ê­|O¨®”9À€Ààæ^޽Ù}PŠ×tð£Š*}Ê?æ8àz:ÇmN ü UTéת+åh¼¦¤yÀX@ñ~O7WTiýn¼¥®WÞ“ý1#G0‘oRÕ'‡ª®”‡ñZO×7?Žõ÷TQ¥÷޽8ÝßýlE•.ï£üà€9x÷ˆ·o÷VTéïzˆçÓx·G'OŸéë;±ºR>œáï~ø ð! ·¢JçøÇ”âÕ€f+€Ç€ïVTuþ|ª+e6^‹êû€ñxós¬^®¨Òÿ ¼¯/ú§üª¢JÿÞ[y7ñþpe èˆ@žx°¢JY])〯§ú?‹V`ðàUºµ·ŸÉžõƒ8ï=Ãߟ]])>(óÇž§§òÝR])³€çñî·LÄû/éá”O£ûEÀlàŒêJ©¬¨Ò?eX ûêÿ$pQ—ç œ]])WTi|àï°DnŒXõàU<6'â}§×<Tu¥|$pÿö :¿ÏJϱKyu¥‰—(#ãŠéþëý®›X¾œØ¿ÿÿÞ_ÿ»À…þvË,àY¼¼“4ï;÷´êJ9¶¢JcÕ•R<‰WY Æ< x_u¥|©¢Jïg“|½ÇÇöTÞÕ,àøÀþ¸ÀyËýÿÿ8¦¯ã¡À/€!KäÁ¦õÉx¿Ðk€g¿ºR"]O"7ЙÄß> ¼ÖÃñOá} Æ»0ù$“.|ÇÿÿM¼«Ú„¿¿Åß¿ øƒ_V‡Wó?ïz ?“ÿü[¢h ìÏÜç2Æd¦à=ò =•ª ÈÅk-|Â/à{Õ•2˜þNçã}çÇñë,à8à›xß·Ý9x/'¿C/©®”Tà.và](¼ì—ý”Î$~+^2ü­¿^->¹Lâ7ûáåƒOá]ì)Ï?ì/£3OÛðÕ¡ ̬ŸTQ¥k«+å—xÍ?%]®¨Ò‹ü‹Ž xµ÷ÅÀkxŠiÕ•RRQ¥ooVWÊWð>Ä[*ªô›]ž§ :z-– À_é¼7Ø7¤ª*"oÑ9ïX:?°Æ˜‘a°cÈÏ­¨Ò×€ŸVWÊ»x‰l:^2{i€1$ûç$["·WTéJzOˆª¨ÒTWÊAx£¢x¹bq?_÷EàÔŠ*môŸgp¦ÿØ¢Š*ý²_þ9¼JSð1¼[ Á>E ´WTé"`ð«~¾~Ÿ*ªôY?^ë- æ‰êJÙ'p¸ëDz¸¢Jß ³B8d‚5òzà­À~ðClÆÕ•2(ôwk*ªt-@E•ºx„îÎùÞż —ð’xÒÔ~¾ö¬êJy ïªñ]¼«Æ`ÏöÝýyü+°}Ün>—1&ƒˆˆƒ×²—´¶Ÿ§6“š,w÷;z¡ÿ^Ee[u¥,¯®”ßTWJO#jžl×¶Gw=°%“¸oßÀöÜêJÙQ]);ðn%äù峫+Å^šü²¯«ª+esu¥…Î[“à<{—ŸƒïØÄ¼Ï½ËêtUº¤¢JOÂë`},ð­Àà àuv[×ê«+弯|¿¬žÎæœ`§ŒÏUWJ3ÞÐ…àÕQQ¥nu¥¼€÷¡àçÕ•ò-à2ºo"Ï l¨®”‹Hm ڈ÷áQ])—â}˜Ö’ú ˯®”\¼«çOþݤRÕ"òPáܵ§žß“Ö‚î/ªj{Gîê‡~ÿž3ñ†ä‚×Yío¿£¯®®”íx÷ywéST])gã}ß=ä^U])Gà ë‚Ýoyì¯Uþ¿À)þ÷ößý^ê¥ÀÇñUúeèÙÀ*ªtðdu¥(pE—˜ƒ?‡WWÊ#x5è`û¾Ôá%óp¨ßd^ƒ×ñ­øpGE•®ž¯®”õtmÒâÁùN¼&‹¥xãÉ“ü,0FðÁÀñâu0ø°y/Å÷Àv%^·ÿ¯ãý€»z2°}{u¥l›¶§U…’÷z  ¯¹§/™'‡ì矿ÚßÞ“¶­FnÌ "Bj­páNoÀ þ.^ǯd¥ã“µU¼ïèdMù<¼¾B—ÒýwôÁxÓg7WWÊjÿ;óKþc[ñš¯÷ºŠ*Màõ:OÆ}°¹ºRjðn£Þ†×é¼JÚO­Õ•RëwH{"ðtÉíWèœdg?¼\u#»Þ¦í-®8½êÇàý¬^»ˆâõî_W])[«+e9^e0ù;ùg_gO&òUxƒô“oTÛñ‚Àï‘wÍ+ÍÀUÀãìþ$.WÉ+Öv¼îÿwwsìŸIíµX„7”îéžþ«xú”±~þÄJ:{’ã[ÿРÞD϶gŠôعÄ3|„—’àÜux•­mþ¾â áúZò€Š*}ø2ÍÂÍxÃvƒ•°¤÷ð¾ç¢xåÆûåK€vé¶WUTé?ð*4ÉÖßR¼äíâ5÷'û(m÷ãsñF'ÍÀk±­Ã›èf¡ÿ|mÀÓ™ÏÀxùk ®ÂûíìRû%û¸˜Wùm›Àì7|Ý"¯]ÚqôzE•Vø÷SÖ®òRø+›MÞª¨P³Ð øÍÛûãM\ßÒDZñ>ogÄkfû¯Y7˜Úú""¥xÉ‹©KUu— cÌð!"W?÷w[€Ò¾šÖ«+¥¯¦÷vE•øŽÞà7/wwN)^’ëó;ÚþUdã uÞw¿?Ô¾x-ë*ª´©›cŠñ†ð•à%ñµÝ½Ï@îXUQ¥]“ñžˆ5ïVïh¼‹ŒµUÚS¿¬½f—D>ÔŒd"ò÷ÉoWÕ+{;Þ“ÙDä¯tv„zZUOê뜮‰|oÆg2“-š®…ítÂ0Æd¦÷¶†„^¢@rQ”•a2B=CçÌA³EäUýw˜cö9oÌsÒÂ~žú Þwu'Ž1#Œ¨v( Ù]"’‹7œ!¹ÐËoUõ!†dŒÙKDä x½Í¡Ÿ÷ÇékZ‘ª¶’:/ï‡D¤°§ã1íãíç-‰›=Åyø‚ ¦C:µŸ1fï‘£€EÿV,fø±D2U]LêWôt¬1&cÿ®·÷‡ˆ~,‘§‡`­üH±!&Æ "RDjK[•ª¶…~,‘§‡?áÍ—œdµrc†‘ºÅo{:ИÁ°DžTµ‘ÔÕÕ*E$;¬xŒ1{TðÂüeU}3´H̰d‰<}¯ÒÇàÍ{oŒÉ`"28ÞªXIÖ¬nö KäiDU·? !"¶˜Š1FDà«¢7TuQXñ˜áÍyú¹ØØÿˆHXÁcåc@ðÖØ/CŠÃŒ–ÈÓŒª6ß -À‡jŒÉ"’|;P´ ¸3¤pÌ`«Ÿ¥!‰oûøE«€ým‘…îÉ-R@kÊ„fïR`›Þ¨‰°IG"rð@Ñùªú·°â1ß%ò4%" }AUV<éD¾-3P*Pf³²°cÚñ.0W ,Gù·Þ¨ a6¬Šü¢çUõØC2#€%ò4&"/Gù»Û€Yªº#ÄB%·J-\œv,f À¯ôF}6ì@Â$"¿>(:JU_+32X"Oc"ò>àù@Ñ­ªúå°â “Ü$ó€k€ñaÇbzõ"ÙüR¯×a2ÔDd_à- êÝ«ª‡’!,‘§9ùpž¿Û 짪kC iÈÉ·ä$”kðÆÖ'ÅÕÀ\ÖàPJp#SPL¦³ë­-ÀõFÝ6Äq…JDîÃ;æ¨êŠC2#„%ò4'"ûoÒy•ÿU­ìå”aEn’‰ÀÏÜ@ñ à÷¤Ó3aq9‡ÿ¢ó¾0À«z£~3¤ˆ†œˆ ¼(ú™ª^V¡ª5!…dLKä™ï³À{ýÿ›ãÙ˜=ëkÀûû·«êß Ƙ KäNU‹ñ¦ÈLú±ˆØò‰Æì"r pc hpmHá³ KäÀßcö¼¥Á›Hå.9.¼¨ŒÉ|"r©«1M‘ÒB2&£ˆÈ(¼$œ—á'ªjãÅMZ²D><]ÜØ?x@DrBŠÇ˜Œ "¹ÀƒÀâ{°yÔM³D> ù3¿}„Ôi\ßMcLü¿?ÇŠb“¾˜4g_êÔ¿&ò¹ÀÛâ‹€‡‘1iïçÀûK€óTµëÜñƤKäØªnN6Š?'"_ëácF$¹øt hpºªî )$cúÍù0§ªë€ÓàÒ·Eä6‘N3fÄ‘â­(˜´8MU7ôpŠ1iÅù ªK€ó€Ö@ñ;ý9¤‘DäRà·¢VàU}»‡SŒI;–ÈGU]ˆW3¯ ¸ßï©k̈""ŸÇ›µ-ê¹ÀGTõùð¢2fà,‘ ~2?Ø(>oœyq1ù.^ÇÏäí%¸JUïïù,cÒ“%òÆŸ—ý`U ø8`¡ˆŒïí\¶+c2–ˆ8"òkà«âÞüé·‡–1»Åù¤ªïá-ɸ$P\¼ "Ó»;GDòðænÏîîqcÒ?!Ò=À•â&à,UýK8Q³û,‘Pªºo’˜àýÀÙxɼ»…VöÅKößÜûѳg‰Hð(Þ*IÛ€“ü‡ŒÉXѾ1Õªî‘àÕRÎò‹'ÏŠÈ™ªúRàðýüÿ¯‘‡º<–>\òIpC¶ Ô«‰ð,B|·^KÉ#Îut®Žµƒ,nÃ[%+Ó|žä…³°(¿ Î(ïë86øXçëäçcž&ÊSÝÆ”`?\.K)%Ê ûq®F)À;áU¢däýc‡7wú‚@ñzàTën†Kä#œª¶ˆÈ; #Œž‘ Tõq¿lŽÿo­óƒÓtMæ(©_Ø©’)6·qø1Þô+ -«P>ÜQg)QL9.ÁUÀa’`Bœ’¯²€Oai ,Bê{z·Ç˜”Sèúþ@"WföøÝ?ï¶Ÿ&DdðO¼¥¤¥ÀTum8Q³gYÓºAUãxCÑ~(ΑJ‰ <6¸mè"Ü+&ãòu\v¯·~„?;ö•â2ªc?ΡÀ±3ž%JïëY»|hÑš2OxÒüÝ~ŸHDÄ»€ &ñEÀ±–ÄÍpb5r€¿(ÄE¤¸Ù/ÎÂgû1`F—S®‘5ötõ½xÌ桜I­—‹qR&¡áQ¾ã—àJnAÉF¹:pt3~Ýg=’Ó‰°z@±Ä™‹·}W\Þ‡Ãc~Ì%umP®ÀkmØê´f@±„LDŽFŠŸÆ›;½!œ¨ŒÙ;,‘›ªú}?™ÿšÎ/ö{8ü™«ªéÜ캕(/úÛ/ç-40ôHÙ€8G¡ï—&ˆò£]î¡Ç¹e ÂJ¢x=£,"ÆstÖ¼O Î?€ùÀÄŽó…ßã°µ1 .—á–¼Q¼Î‹I @É&tåXðy”§w93Æåtþ¾wåo|í´!"»U”(¾o²[Å ;Ö´nv¡ªwàM麣C'A—ŽYé.Â+¤vFó:} ëðÆÓœH"åž6(¹(Žiïò¼¿ZÇ_‹rQàˆDy¨&æÇ‘P‡´®ÍêÿARF$ ûæuÉ‘Ÿ"5‰ß\lIÜ W–ÈM·Tõaàktí½«KüPfHp³yl Âz‚K¾j—Vˆ èì®8<›ò¸ÃV„»%èlñR~†7{Xï„û:žÑ»p蟮ÍêÂKÁ‘^óú0%"“gÏvyè{ªz¥ªöý³7&CY"7Ý‘³I²7¿‘I{9¤ÁÊ#ÁL%ÎÙ(W¥<*ûÐBð~ÿ¸ZrDà±%Ý6‘GyX¹K¹ðhJ/ôÞ8<‚×,îõ@wÓ¯óR›ÕÛ‰°ˆ«€ÚŽRMét7lˆÈ)@5pd ¸¸DU{Šh̰a‰ÜìBD> Ü‹×Ù­?FwvË\nÇå7(Ÿÿ·§-¥SW„gé\!.·£©Z€Ã;ŽöðZ.Bwã’—tSÖ=‡„ü½(.ö㬮Íê¯#þûH­•«æuñ|xxè-à0U½'œÈŒZ–ÈMù€ˆ¼Ü ä ðôSEäS{!¬½¥ áÇD¨é(ñ’ß¿:ö“Íë ö§³Ù:C÷«c%˜rú.åÊÇQú¿ÂœÃ$/(”ÓÑ.=̻ڵYýÅÀ£Ã²y]DFß"õ{ìnàUíy¬½1ÃŒ%r“\Hâ»xÃuݧºMDöÙCaí)mÀfÿßjà%„?ár¢ÝÔ¬”æõù¸ŒA9*PöNÊR°I‚Ëgéìù4Ž—ö;b‡„Gü½\”óú8ãý]ö§çâ\H°ŸÃ0h^‘C×€3ÅíÀ§UõÒ4¨È˜½Æ†ŸüŽ@7ˆÈ-À À)þ¿}{=qWùÀ½"²@U{8ÌÁz…¬Ž1Þ}‹ð.ëðšà—ãRîK ÆçTà€Àq÷£ÌøW IDATx›òA<Ùï±á÷‘à å´^ŽÜuåü^Ž÷š×»¿I{"òI৤¶­.RÕW‰ʘpYÜtPÕzU}@U¯VÕý€iÀÀ_HöîîÛ|à÷{+Æ!ìô¦|ïçÐŽ“Òlíq)F¹ÁÇ!ЉLøB+–#)ó®Dœ“û‡7#]_-©ÍêÂ#ßå_pÜ{†5¯û·k^*Å.ðu¼%HÓyB"cö:kZ7ýâOáúšÿï}òcðšà?€WOŠU~{æMÂá°ƒ/C—škw½Õ½q锼’²Ò˜ÃïIp,É©B•+py‡¾§ P‹Ë¿èyf½®Íêk‰òónŒQ·2¦yÝÿœ=Kp†­šªUµJDŽÂ»óeU…“1éĹÙ+üq¼C?–Wh#š’ÈGÉ"Øb%<³Ë16@?_«§EH¼%M{_Ö4Ê£=”/&˜Ô{ãPÓK¬Qþدç ÏgüÛ;Ƙ.,‘”`?”±('AǺ∲(̰F:KâÆô̹1A.×å)eÞb(–HŒ1iɹ1=‹#ü‘h“ÀcL°DnLð hÆa;ÃÉczc‰Ü˜ (Õa‡`Œ1aãÈ1Ƙ f‰ÜcŒÉ`Ö´nÌ–ý·¬g8“>¨«]5±æŽ`è&ð1Æì6KäÆ G«È¼ìì?«xâ ÅÑCã±Ø ÕDQN¶¶7å­Üº©Õ-(ÒƒæV\„“ˆî¬‹±}m×ð‘+>¶hé; «þ·õâöEYq«ëï'»¸mÏgÙSyœúù­äìº(ݨ’Ñ\r©|ôã×søñhɬQq¼Ñwí[þ?{çEµðßÙͦ÷J½HA:ˆ (( ` *>{ybGEì,O…€ (EQ¤Jo¡wB ¤Nz6»{ß³©„2¿ï›/3wîÌ=s³»gî½§Àñí´m.º·pâް𬬜÷_xñ³‰.ÞNËÄH†Õ¤Ž©¿ˆˆjík]‘ëè\I$àè»Î³{]oŸÛ2“s»¦ŸÌ h{›¿8äâ쩟³Z äÅ\Ç_¿›› ÷?½¾•Ms´¹-g·Óo«›2 Ý¼õöT¯ß‡_Y^K1ìjË^§Qú,X°œy¿,òë~[ Y–ÃÃÎ6|½}hz´ÖÛÙœÒv¨ä¬œ±õˆx::—]‘ëè\Ô^èUËËë>ß@‡zƒò\ÄëÎî°~}^yüUFŽz‰°N´™¨X¿îUrròxè™gqn¶‹Ä-þ4ì’³GÅûÚ,à›ßžËÈGž'¸û®Óê¤úõìC£†u‰M`„o(,*äàñ=´Ž8EÒDªÉÔ Á„4Jó ޼ܭΞ†i[¨U ¤£s £»Ÿéè\Æx®piÔaU í»òVûŽ¡ÍBëû¸}Oââ bq°Ñ¾} F¸R¿g ‡gТ‹‰Cq±…¡î (®!ÙÉŽø‡ÙN»ì:wFß7†1¯ŒC½=§)qGƒ;¯àÀcôºá?¸º9òî;ÏðËìïˆ]ã‹¥*§4qôO—ŽƒÒ<Úìî7ÏsÈ%êtE®£sÙÒ⯺„{ºü>øDÌ#^òáØ÷xç…ØûK0ûÌ·§§;IIiäg%8ºB£>)Ô黓Q/>Dü‰$| ͨÕ>õ´û› !Ì¿ ±± lس’À&§¯›äÄ{Ò¤I=ý"½ŸÊ&Ñã'î|è¦Oÿ…ŸýÇÄëil‹Â?y(…©^¥×9˜ ÝÐc›&®Ïù¹ÞvI:IGGGŸZש^DÄÚ‘ö¿ÁJ©ú5*ØeFÀož]¶æÕŽŽþ¸¸8áââÄOÓ§òâpñÏÅXìA½z!L~ï-Vm\ÉÆ#‹0;Ç;öNfóßXýë)nS|Z§’ Þù`mnÏ­RŽœx÷ÆÄ?&¨Ó!Lîàa§øcÑ|úß|#_Nü«ÕÆý£Nq|ï^\ƒrpôËâÈZš5õw9æk›!"•R.a·éè\“èŠ\ç’""Í€€öhŠ»%`ª¢^m¥TB5‹wy²ˆÐ@qú"¸C¼# ¼=ËFº¡¡Áü0m2fs1K—mà…ñc9tl~œÇGÍãåñã9rh5¾³HL?Jíº€ôÓšq+h§«7;ÍN)8±Ý…ˆ ›¸càMŒ|qµ;V¬\ßÐzÁD=ò6›áƒïaÆ·o¡”"=ý±qÇHOaÐí}Hz!Íkèп‘J©ªßtttþº"×¹¨ˆHÐèÜÔ9ÇK#]‘oÃ30Þgn—Š}­(ë˜ Z¡ZBB “&Í ,´¬×‘ȈæX-6ºwìIxz$?.™9ºwäDÊ1<ͥקǺqw{˜øþ$Œ..xdvåpÜaÄ'™À0#É7æ½1¯Þ¼ÿ}þ-‚Û&—^[\ Ä® àÎ~C˜5wæÚëñ €WÆcô³Ÿà슳«&“‘ ÿ ¶l:@xx#>úhtÛ[nyòuà…êèJk]‘ë\"â t§Lq·‚ô»€mömû¥’ñJ¡Öž€X‡?›vöÁMKÂVc ™ç-˜­…Ü2è&ø& Ô¦ví@ÞyçIŠŠÌìßÇÎÝyïãÿ±fÍN’SNR§žÙi6nìÙq¯=Íóc HµþŠwÄï2Ñ¿íHºvºŽŸf¯â­—&Ñ´i=&~ô1.EžLüäüý5sôĬÃxÛçPò’ÝÌ¿‰èOGQ·n<ò"-É=âO—vAÄç¯'¸ãÞ Ï•nqᵘò½xŠÁö¤··GLVVÎÕ׳::W7¢*››êèœqúwý*<“+P lµo%Š{Rêô…Û’6ÆÉ3h#{€½Àg(öåÍbê¶w ü³AƒŸæÉ¤çœ$ó ?ƒûÜÅc÷?ÀK¯|ĨÓ¨Q‹•Ùsóùçs ô÷§~ýÚl;ºŒ¦ýN"å^¡òްæ{÷/$7·€Ç'܇Åý ygì¾ÿ~ áá IMO#7'?:uj…ÁPfkµÚøx_jµÍÄb†¼Íøqúd²³óèÖíA>ùä9zõjÀ}¾„µÁÜ ª|L¥ }k£Â]ç/9´?ñ¥Tá¥ëTk]‘ëœ"búw·žg¹d7ð°X}¾ë¢×”"/Fÿâ³½ãð,¿eŸyÓ""ˆ{î@Ô]w0nÜ׌ÑŸ¦Më‘––Å䯢‰9´—FGpóQ¤njÌÂé?0}ÖOdœdÑÊ4ì¡å<ÉÚÑ„¤Œ8z†ßÁø1Ï5j4L|ûõ[ &Lø†…Ká^? '¯bR:’ïH³VµhÙ  ¼óã©O†R/ÂBîÞ&|úê—X­6¾1—ÙsþÀËß„“« F®nNäe8°;™ÆŒGžÄÕû œåÎáåq‡wgß”x"í`5ö¶ŽÎU‡>µ®sFDÄ€¦Lï>ÿP=Mqÿü¥”Jþ‡º:å趯ޫþ·ÆûÒòþ»#6¬ñ <óÖcÈ©ú4mZŬ`ÒÔ¯ñŒ%¸‹–¯DÙ  0Ÿìì(7Ì30tS`÷¨”“Y?]üžÕѹ6йÎiˆˆððÐàªf³•R;«C¶«ŽdLU44 ¾¿'òöÓíÙ³Ÿ/æ½I^’;Ó&æ‹iÓøc×·„Þ˜_zYv ¤l eô£O3{áÏ ¼y¾,˜;™é?Ì%æð"r²Š18@ÃÎ…Ìÿûk~û}aaµÈÍ)âûo?¡Ø”†á ‘$‚›ñÓÏËoÙô]ÁìØL“6 ´œLý³ýj¸ÒòæBrÓáÀRoüü|ð;‰•"¼‚­88iõjw=îÕÉØ`ZƵՑ# ?_´~Õѹ†Ð¹N)"Òx¸ž¡Z<0øQ)µ¥ºd»Z©³Õ÷VcË4âÚââu«ÕÆÂßcÉwä×ßàýI_°-eÁÍ5‹ó¢ïƒüôç÷ 8ggŠs4#»&–.ÝHíØ±{7Ó¢gÓõ!Íb¾ak×¶¥“ut®tE~!"À;ÀHNO\²MÿQÝrý[Ô•&ãäà){‘'¼Žâ´xíW4Ç’V¯ÞÆôéo2õû˜=7ãèZÑ»Ï;v_È‹ãsy8êA–þ¹“ÉîÝÛuÿKGžÄůÉß4aøw3th:wNHÇâã͸탬“¡ ö5·@Ú·iÍÌŸwÒÈÂ<+yVv¥Sb"/-‘¡C_$ÛpïMÙø;4gð ÃéÓ»3Ó¿ŸÃqójÜê'ãÚ2첉7p8~ß|óC†¼HH˜ ^ )Œ×VIÖ­Á %¹³z&°r¾¶Fpøøaz>~ª4@«µá¥í}«]‘_ˆˆmòM rtëƒÀ•R‹«]°‹€«–Ê8錖ÏÀ€íØØ„8ÊôÈžģ+ÿüsÃкuƒœòó ‰þúS¾ùn6«·,Ã-|¦r~Û^¡ydØ~áéÿ@ ½INMå»_½HOsdãä,î¿ÿ6þóø­tíˆð}ô{üüëo¤z®eÃÌüôóÛì?tˆ)Óæ\ßDÜÁL°ì )wáÝÀ±br)&—Ú­8˜ 1™0äÄ#Õ‹Ô8vŸJbñ÷ãe¯–‘æ]IØå@Ý6eFuž6ŽíÛ‰ŸŸýúufÑêù4ï ©Gµå’¿Vá]O‹P—g=ÉæÍ˜ÍÅ„Ôu'µœÅŽ›‡ƒ“ˆ8*¥NŸ¢ÐÑÑ©€®È¯pD¤+š¯w›J§ò€ ÀGWü¡ ïQÀS@ù8dˆ°ïçiÕ/Ø…‘UÀ;S¾ÍøaòÛ!S§. ¬~-²ó3yæþÿòÖW¨Õ%¶B}ƒj…'í\27#c_Gýzuس'–¥K7PPP€‡‡+ÅE‚£ÉDô÷¿™›DPC…»Gž¹‰Z¾õñr Æ×+aÝúmüoÚ÷x6A»éY   Ówg,ŽÉ¸-ä¦(8V“9OW_ôè‚'‡’MýLi ñÈOuÆl5ãìfÃlÖ¬ñ22³*Dò÷òw4ah/¢:::ÿ€®È¯PDÄmý)NŸFŸ <§”:Qí‚]Ô ªxWÆÉzà R <ª(»"Xãµãð´Ù ½§L™ï²7q-®áÛY6qÏ>ù³·½³_.Öb°ZÀ±Šø-îR›;÷ÁÉÉ‘öí[pàÀ1öí;ʾ}GÙ³÷8æÓöV!×emš·%Ðý¼<ÝÈÌNckÌn²òVRhˤ |ÒéôÛimä¤iëæÖg¼½¼p5ya(ôÂÇAv4õ«GÔK·áå寬ŸfÚôŸèѵ#IIiœJ†ž!ÿåÞgðÆkO°ø÷ŒF#|>“é(ŽŽ&RS³ð-Õ?#¹4#M]‘ëèœ]‘_ˆH$0m€Tž=ÀJ©•Õ.T5 ÆªÕò–즘h†|¾5-Ó…R\·øÔGßÍÌ prÙ¾c?]ZC@ãB®kÁïuÇÙj¡^Pc<\™ýë<›ÃÓîÖ n)ÂÉÉ‘¥K7²bÅfZ´hÀÔïæR§• ¯n‡hn-"ëˆ?~FÔ*â ÅXâºæ§m&´­2™ÇÜ(<ܯZ èÝ™oèDJJf³…  _ ‹Ì¤e¤²xÙÆ|ø2Eqø5Ê#!Ûˆ““#3füÆ=÷ô£aýú¥cæÎ[²¥[yêÉ{л?Û×}€«wEŸ÷ÔÅ6´˜:::gAWäWv—²qTüíÍ^&×@(ÕjE½¢2€Odœø€†\¡#rOñhuÃÉÀŒDØùs½»t" À‡Iï¿ÉÚõ[ygò‡¸ùZyæ§Ù¸i';·n¢^Pz‡_Ï›¿·c̘Ï4¨íº†°hã4>Šƒƒà˜Û€ô#nx)oT¼ Å6ðññÀÓÓ•‚‚"r² ÈÎ) ?¯€Â¢BŠÌEX­ŒÌ Owo>ýä5ªËôè<ÿærPl+Da ÎnšÏ¹Gë²@ý°ºüòË*6mÚƒÕ£ï)ºwkËÜ¿1gã{¸5,äÁ§6ìÑ„–-µa¸—§Eåú$'ÍP ”Нö†ŽÎˆ®È¯D¤>ZèÔ.•N­¢”RGª_ªšEU™ÀfûvуRêô9æKÄuÝê p÷ÍÄÝÜ=3Ù°i1ÛÑ”'}Mp·ŒðÕ´YüýuéukÖl烢é{{8sÖ¿O†a'!F¼ò¯§u^tëÛ™°°ZÿØvVV )šquuÆÅÅ gŒFÙÙydg碔âç…Kðí²·¼*¾]š÷àá‡'R'Ô—v÷&ÓÌõ.–møƒÀ¦šõzÛ{O²æ O<<€øýVËep±S+ß[GG§jtE~ " BË:-Àxà-¥TÕAµuÎqžÞ®®6ÝÝÜ—ÛÌ Ž|C-¸îçÑ—ÃÇ¡'SÒñê.…hT»6›É“çpäH<­"ëÑü–4~;4F‚mÝéÒl=;weÞ¼õìÚuŒ­[÷aµÚHJJ#!!…ÃGc9ŸˆÁhÃÛß‹2c³Y Ú&F\]M¸¸9‘t<›}ÛSékÆ}š§^MÓ~'«Ìan<†)³)Öl/Þ›Õjãúáùøäu£ß -©^Ž9w{ý¼,ˆ;’ÆÐ¡Z~WoÌùZøâ|¹™W¸¦ŽN5"zFÊËq¦Q•N†+¥ôÄy訔êYmzY÷dH§ø ‰BSb…-sÝI>ž›› &<Æöíyæ™{9eÚÍkßÃb+¦SãþD ¤U³Ö:tœ~X‰ÕêE‡ôï?“£‘ºÜñ©Wˆo½"‚–¥4­ s¾–ÅÑ8ôKC\$€?~–§LÂæ’޹¸GñÄ o\ü(8%lܸ›­[÷àççÉÃÏô層v­@¢gþÆŸ±á¬E^7ˉºî‘,^ô9Œ~Õt9'Ö³$:Åf³Ù”RW¤k¡ŽNu¢È/SD$˜\_éÔWÀh¥T~õKuu#"mÑ@âÙê^L”RÙ=ojþ‘Ó¶&/zµŒ5º›üH‹u¡iCWr:¤Ñ¸~c¼‘Y³~gР^´lYŸi+¦Ñ+ünz´¸?÷l6?ýôS¦ÌÇÕՕ믿¼ü“<óAkr]wc0ž!„¾‚œ/’wøpdW.i'sÈÏ/[­6 ˆ!Kñnºé ÂÃâí[ ‹ÕL‘räÈÉL6n\Ka¡6€ ôeÙ²¯hÔ¨.ÎÎŽ(¥˜ùã/LýMh2dœö®13aÞââɰÀ-í¶¥…¼ÿþÓ¹£GÜøýRö½ŽÎÕÀ?ŽÈc¢d šQUZd´š\mR]ãˆH{`ó„§÷_©ÝÖ IDAT].wDĈAó°.Õíß³gû‰iiYÏŽûç–-àëëEaaQé:÷ÛoË!7Ò¨Ñé‰Nþ ‹­˜ôìD&ocÓáß9˜¸› ŽnrdÏRg’Odc29p×]}Y¿aíz{âÚð(f««Å†Õ6 ö¿B±Ya)‚¼ #‰[ýxîÙ‘L>‡†7¤`-2aÍòÁÙÑk1¸zÈu<@`#Í_¼ þüØÛû÷åÿÀ¨'^€Ë0:@ú¾v-vaëÖY÷}377ÿõ‹ÛË::WgSäù€ p02Z5­6©Î‘˜(y-÷©ÈhõqMËs1‘{€©hý^Â6` nÅ{é‘/¨˜¤£RªÚÃÀÖªP'"¢éWµjù·èÞ½»¿¿—¿ÉdÀòÙg?X¼¼Üß~û†Éd:·É´œœ|<<\KmÊÆ«ï¿ÎŒ/Ö“p, €nÝ"™6m,Õå¦Ã©Ó{Ng¿wâ~[¿ÀŽÃ›É ZvÖkŠ‹àOœ nŠ_ãèh"##›v†ÐzP:Á뿪ËÐÁýyõÕQôþ"55óñszPk˜+}jý4oØÀ­ÈEDÐ"±½RéÔ´‘¸>•~‰°§Ì|¨RqPMÈ’˜˜zè "þþþÞ­-«)++'HmذÎC£G<~üøGðööÀf³‘––ERRÉÉé$%¥{‚ÜÜ<=ÝhÒ¤MØ·ï(û÷Ç1gÎRvî<@Hˆ?¯¾:ŠG½íã_}6×&¼r£³…´ìD M‰„†Ÿ.kp¨‰ éädšIÎp"4¢lJÞfŠÂPÊŠGX&™é9lùÑŠ˜7ïCM˜ÍÅøúzòÎÄÑlÛµ9üIÒñ“<ôû`RS3 ssó+ç¤×ÑÑ©‚³ÈТ†Ù"£/?+Ò˜(IîÈ#£ÕùÍ7^Fˆˆ;0 ¸­\±^WJM¨©® ì/P+€•N=¦”ú²DúG®ëQç[ÿÆ9#Sº²?æ¾tïIP® 23³9xð8û÷ÇqäH‡‡+ßý’…ßâiàîG‡ãXJÜ‘rrò‰OŽ#Ë)-»8ŸÚ²Ô¬ÛƒèèœgSä}±¯‘—+«ÜdßwFS°%±¾ )önöcc¹ºM€!@ûqÐ9&JFF«Eö²ˆrõˇž¨\Pî¸DŽÊ×}DÅ5O øíÅ¢Foà C¹â£ÀíJ©]5#ÕµƒˆÔB{±¬ŠËR‘e;lËH¤k­&àèfÁ¯E ›C@ -UiA†&›tåÅ¬úÏ8Â'áä•Ïï;¿A}ëÈý÷߯ì9¿³3ã'ü;æ`Vþ~Ч ‡—È£ÿ}‘:m,H¾ýMWz¿mÛ÷²rÍZ¶îØAP/µkòæ[“‰Ž^LÜ‘T¬V‡2oÞûÜzk7–þµ%­`û¡õ4»|BlX‹SYý¹Ã‡Or×#-q!ïd¦›V+¥Šk ‹ut®8ªíp^ô@Ësý*Z¶-€®1QÒ¬Šºõ3Úè}½Ìx'&J*'ý8ÑFäöãlûñ8`š½lˆýïzà: 90-:Z5Œˆø˨¨Ä·t%^m|xáÜe©Èc6$|˜ŸT10¹4éB,ø5( eËFŒ?…>šI^žö5±X‹qôÐL-¼¥²tå*zßp=ñ;5…¯”bÕÙÙ__O ò-H@Æ;x僗X°`%{÷ÆÒ·ÿ¼5ëQöåÍç@ÊZ®ë8œ>}ã×¾åıL†íËŠ_³fÍT~Y¼”[ï›_%¿Á|šÝš @~6üýU ‡ö¤óíîxEî¡Ø [rK9²­xDµuªŽÎÎ…»­‹ŒV]b¢$-@c`õûFF«#Àä˜(IBËnަdÏy„­oÄDÉh3Ù‘ÑêJÕJLu­h3‡#£Õ~4·®ED€¿€ÖåŠ77+¥²jFªk ÜþU.KE®”:~ÓÀËO%ä÷õª}ºÙJþ)ðPaÜ1¸7w îÍwßýJDÄ=ÜrKê׫ǟ¿Ðü–T r œÊ,ÀË˃MúrtõnRN䓚°‡ÛŽü—øø“lßÇÆÕ%wÏaÐÂÑ¥m~LŽfL&òó ¨’Ã?¾MŸ>×ãëëÉÚµ;èÞkMû¥Ö®âà:#ÁÀê¯ÝIIN¡c¯º„÷‹Ç|Ê™­s]¥ŸÌ袔ʹT}¨£sµq¡Š|M¹ý¤rû~UÔMµ+ñ6íûõ¸øSÝ+[ÐrXo c¢d;šQÙW‘Ñ5“\Äèe3—­nѼªñ&¥š§ˆø)¥ÒÏR¯ÚùcÁÞ›:õ [[·}n'§€,QX1˜½pÍn…»Ù±)­;räzõjOË–CJGæ;V;ãíí¹è -[áСã—}D„ÂB3!!þ ЂƒýÈÍ-àË/çRPPÄ Q ¸îÚ$›™‚HXa£W¯ö ÂØ7?eËá¿èòh•ìéN fñ™äçgcrt M/'kÌìàì¼tãÒ½;»û\GçræByùQwáYêV-U~äYE¦eŒåökWqþlŒB['¿Ý~g´(i×Ûï÷ò¿¸ç!"µåhö%¬ú+¥j|ºÿâCÎͽ¬pY*• +õÈNi0%)É|×ð¨›ûõëfìwsY>ŒŒlV¬ØÌòå›Y´h Î.Ü6ª!Ž¡±$)äØö"ÔI'R3‹0:ÅÅзïõ |·ÝÖ³¹˜-[ö²uë>¶lÙËœ¹bµYªíŽ_`ñ{y¹µë™&£ “r'0З~ý%´ÏAêt©8¹d-p$}kÎ܃»»ë6(z»ØlqøúõÃÇ€}úl”ŽÎ¿ãB¹:Ã~U4Љ¿ÈèÒ·íò¡GÙÿ”+s°[Ÿ·?Ã=KüjN{»åü=1Qâ´B³ Ín0Õ¬ÈEÄX…–r³„¥h†mU_¥s±‘>ÀÈs¬Þ€‹œYíbaOW{¿ˆ<ùÓÜ£–ýµõO?ù¡Ip°ŸÓ·رã6›öõhÓ9^CsptÑ&|ÂÚ@XEÉ»w^¼?»~ñ¦C‡p,XÉ„ SiÑ¢>:„ãééΡCÇiw“3õ»§a0Ròn“çÇÊÏý k鈓øÒ³['”RÄÆÆê¢éds>žô%ïh–ýz€üüÝäçD‹õø::Nu„ù,&JÆ¢¹„•DŠK§lZ=¡\Ýgb¢ä4…{&g×$4 öà˜(y؃æS~"&J^~ŒV»­1Q²xM‘Ïp¿K‚=ùÉ|**ñÅÀ`¥TQÕWé\lDÄøßy\rY®“—G)• |""_'&¦Ž-,,úoa¡ÙôŸÿ ¦k×:v 營çs¢ð/pI¢¸rÝUúQGs~–!÷ø^‹{Ò‰4'Hc×®#,Xð!^>®|øá N$%r÷Ð~>ü óç/gÙß+pðÊ#+'sžàÀ`žz4/O’“Óù⋹L™2ØØ$2^õÀÅÕ‰ÇÓÑòžTÌ}b³)A³ÙTݦ£sUQŠ< Ü[©üÃÈèÒéBÊFÊÃì›RÑveÖPf0öýïà54ÿà·b¢$- F= $ˆäŸô$çÏ7hkõ%ü ªîXÞ:L@óž8W.{E^‚}dû¢ˆ¼áçç=ôÈ‘½SR2æÍ[n0™lGb=k] ÒSòÅKýÅbÉ]­”:Ù¯_—¯B3~æ™{ùòËŸ¸í¶té}-‡Ä!x?z-³~Šà½ñc¸óÎÈÏ/äïu[Ø·›œâÆûìÇc aΜ¥Ì›·œ¿ÿŽ!þXZ©|&“V« Ún´èS€›—QýòqQp u—ŽÎUEu*ò}hk“ߢrQÀçÀ»%"£ÕƘ(yÍMУ<ÜJ™;YyÆhnp•ý&´uPwÊÖ¤-À\´Ð®Õ‚ˆ¼ /W´ª+ñêED:OŸçeWŒ"/Á¾L3ݾ•Çã'=ûì°û6¬ãwìü±_3bwLmØí–âU¼ý‘Ÿ¾7ޏc'=þeœÂá¤Y¢ÿùür>Ÿø)¡¡ÁŒ9€‘#PPPDff6n8;;Ò§ÿêßrGØ6ßÑ ü} º@Gçšã’æ#‰WÊ|¶×EF«.1QbZÇ#£«6n‰‰?´hl{"£ÿ}Pˆ˜(qBÑ”}ž½Í3äs¼øˆÈÝÀ÷”Ì9‰æ'~¼ºdÐ1¡ùè·:ÏKã”Rç3‚¿"6¬ßZù]òþ&aikê5ôÃÚp%.^e¡] ¶ubÆW“zßãøtÞPö‰²’ ¸ïGÏ8pàíÛ·àæ›;ãâ¢M€™Yµj þ0†°NÙØ¬°ô3·Íqûr;T–EGGçü©ö¤)‘ÑÊ ìÿë7ìäæ›:3zÌ›š¬ÅÍWaP&2·7JZ¹0iÞɤ¬çõ0Ä::—]‘_Däv*¦G]ôPJÙÎp‰N5""“ÇË=¬”úº¦ä¹R «5§}_÷!^­‘¶¾UÂÂïwÖ‘ˆ–á ¨ÝÀµsJÒ©†bq1¼üò¹Ë–oô;~*£IeççØRò2Œ«6®:ú­RjKM?‡ŽÎÕŽ®È/ vQY.h£”:zæ«tª é‚f·PâÏ¿ è¥ôþY‘æ=6d¥»!pάÕyG&ºWQ'(j5M)u¢ú¤ÔÑÑÑýÈ/œw©öéËY‰o½Oºm8X…‚v3ÔÆêj7æ©%Z¨\+h§e§»¤ˆˆ3Zœû%^<¤+ñsC)µï©§îYúî„燵j.®MrròVª“ $׈:::èÆn„ˆ´¢Ê-TJ}[Sòœ ¿+XaP̪ֆMܦ`…‚·US«Ÿ¡Eq+á ÝàêüX»vûìãÇ“‹n¿½§k‡áÕõÓÑÑ9tE~a¼GYÏÔ ,:å‘(´(m%lAKÚ£slݺïׯ¾úi¢Éd´¶iÓ¤cMË£££s:úù¿DDúP1êJ©ç/fÛ£äVôh pÜÚÎd.åþi1QrŠÆfø¢ãL•]U¹‹bU B‡–ß=ň‹œ¡~Œ&Ý:Xs?eà.þÀ‘Ñꇒv÷ß"Gþ FöELW ÏT%#  0_)-µÑÀìÖ3ÔÑŠG~1÷‹"B?Š, ÄÊêÈYjõùô›ˆ´DË~Wø%ÍŸÿ²]ò¸œÄ ½}Ë-]žÙµëðÐ#^_XÓ2é@L”|Ü „mg¨}5,’N ¡¯‘ÿ DÄ€6/!˜x±î¿ò~qö²0¸£dqW¡-ôÆ ã!ÛP¹³ÝœÒ,n#mªÚÁÀ÷@vUåVáåÝáüJË€•›^p€:J…*Íá~ßöáÒ%b¦z ØlöëmÌA‹-_e¹Àc@éhNÁ „Aˆ9ð ¤å›Ù4)}C­¢ˆžkßÙýù¢L‰+`„®Äÿ=vï‹|pà‘ˆˆ&£?ýô¹½O?ý¾Dq™%qh9²"£•O ‹£S èSëÿŽá@D¹ã7•ª:%ë¿ÁÓÂKÀöÃ|Ñh¾Ï Ü(N¼uÞ7µ‘Šf±]³Ð~¼ ØQ¹ºâåå˶GIçómZÁ6 üÿÁ’¶ 62òЏ²œñ? Œá~SÂùæmÿ×ÅßVJýv¾2ëœÎÔ© ¾~ê©÷{/_¾¥NMË¢££S†>"?Oì–Ðo–+:‚–`㢰²—8xÕáÅ’c£Þ:ZÝtŸø™lœœÙ;T^k1Geœë}íÓÓ=c¢$p"£Uϸd•Í•>íþ§ŠcFÈ8¯(xX÷×Þv´z,f„<‚âKû=>j]¿<&Jn(ÙWÞi;]•¦¹Ý;TNsy:"2¸·\Ñr@OÐqQJ+jZŽê`ë½â/XMĹå‘QäL'QD¸82­éT•Úg´ØÄuJh® ÅæÈYêXåûÙ—n¡¶³H´ÚØTâÁqø)qÊÎ À H˜¥fž©¼2‡‹§ Zˆ”΢9l.×(Èk7SíX?T\œè£„º(Ä œ´XÙÚ~–ªötÏ:]‘Ÿ?O¡åŽ_VJï¨ñŒxÔ£V-ý©‚­ghS¦«ôíQ²EAWÀPèH´<Ú—Šeíþ§Š–”(rÐ~Ø.&»K¦ÔÅÆŽmQrÀ›m°Æ3˜ïÎé"cÊ%÷è :tþ-#·ÓLV^)râV]PTÌ/@ζ2@œøPÃV°ÄDÉøÈFLd¬*&JîÀ‰é€[Ég]Ù´)ÑíÃ¥kÄLµ6;“º"¬PÂOÀ€3•WÆIh«*¾d¹—\'°ˆŒ!íX ˆ]¥Àh€˜2*r†šzÁ§SíèSë爧˭WJͽ˜m-eÁ5”?§„R^ƒT¡]k¨ðÿôº A¤l*ÜV\aZÜ¿rUUîsdSxžoSÑjН´[@SþÊÎdËÊûÅùŸ®‘;Ñ\ÍJÈ+¥RÎWªPŠ.å˶“QÌGSâV)h¤ñÛQ>ëáW€­´(?#ì°I5þ+>A‹{a–?*ˆ”Øt}p¥¢ÈÏ@írÇo\ì p¬Ü²]…“ж%»bà˜½ÌRîDl8l}XL¸î‚QD?LDPl6 Ø‚ÅXöµw,•Ë>b9_"gªGw—‰V¡›‚¶v ÷Fá^n~®ê:é̤ìe Uªú‚Ýè\x_Œ|n³áâPHj‘#_bO’dPÜÒf¦úÓn¨z T„¹CeZsü1Ú_€¶©Æ—Ütç /2’v1ŒˆV+9‹±[Kûßy‘ÑꞒ˜aRrßc+ ]‘Ÿ”Û?,½Ø ´žEBÌpNA@í˜(¹-2Zý²õ>éj€Ööj¹¢´Ñ¹@R‰â´)nÞú°5ðœ*³Ú®L:ÚyݘaR¯ªµ<;b†É—FíGæþÒRÅN€âb’ŒN¥¥×í*¾Å.øÛà>9íV ®Êö¯;ü”|×è3U°-JÙlØìkt??l!›”bŽý‚€*n‰ˆ´B³–w*WüRjñžIGçß²72Z=V¾ &J:Øw³­ÐbÛpiá $@`}õÒ9îU3਄ç¶GI„MØ`´²ÙâΚëJ–°ª‡DÀ3\–ˆ°a³ÑȪÖ3T^5Ê¡sѧRÎiô-WôÕ% õ©Ýôår% c¢ä ÁÆßØÿ_Jx³Ü—®ÌðLñ©!ŸT¥x‹2ëô ˆ°Ë¾ëˆ¸˜()Œ./UQµ)XGQ¥dV«âS€NsTÚº@H‘Çm6öHÙËFl°»Üáƒ9™äÅDIáá§ÄÉ è`4px{”lØ%3·GI´RL*•ÙÆÖÓŸCš M –_BxY)õ]Uíëè\¢*øm*^@Éh×S„K6Êy´˜„F=W( ¢È x($Šwm–K>»¶Ž”ªÜ+K߇E]Ä‘²&G1àˆp“‚7”b‘Uqxë}Òõ¢µ£S­èŠüÜy˜Š1»¿»T µÉw"¼‚-лVQ¼§\ø¸¤nVsD˶V‚НDø½ª{‹•7©Û Ãé33£TÊâÈ[.oÙjÐÖ KÒSº!d#åFïåŸI V1¹\‘‘’‘´b@t¦4÷¾ À†ðaÄLµ¹‚l"áÀj V¹âIJ©wªj[GçB±8Rþ¸]Kr(ù~  ÆUµa$ r†š Š(&Ø×ÒOi—ÒÔhՖ蔑òSéž¡ÒÛ9Cýh0nÿ}ù8i?lÐÖÏu®@ô©õs@D¡‚‚š­Ô¹»~7J©x{Ç}2êèhP4°Áq›-•]Dz®P–­Ë †|nSŠºFź6³Ô¦#$ÜfIêåUúe¥Í,µéðS–—M#› Qˆ²rz°ვÖ¡·@ ‚•‘Ñjoù*mfª?·“6}€,ebia.¹.NÄkAc³Èhõäî{e‚Ù@}ƒh–ù&aF©¹;î“:VEG±QpÉ6Åš¶3Ôá b‰´þüÊÿˆ·»Qf šV°ý¯'ÚËÓ™6‡óTJ=WC"]0"Ц°#)SÞa—¨¹Sh‰c¬öÍVnÿß[Ñ|þ=д¯}óæÂgí%¦.Ч ‘ªPðÀá‹”©;ŒÀ¦V©LäLõôŽa2Ëjàv4·ˆ¯l¬uÓ¯h(ú)¡›•Â_à”••)íÊyŽDÎPŸm.i·+È6(æšÌl)t" À fÒ~VZ¸c”…Ԓ¶ÑjɶÒJ=mšý‰Fñ Í@/Q´E³q‰³*¾-‰ü¦så¡g?; "2œÒ `l€¿R*³EºfÆÚ·òŒSJ½Qý?"â€û½²Òö½À[ÛÐŒ“ÊmÉUí+¥ Ît“‹‰=™7Ú³•WðUíW~8ŸUàÊXXªÅ_:[Ë]‘Ÿ™DÙ7)¥ôœÌÕ€}=øÿìy|TåÕÇ¿çÎd@v@Ô°ªU‘Uq#÷µV«Ö bP´ ¾¥­MßV߈ÖÚ´V*UÔp_ê¾¢@@%l¢¨uaGY²¯$™¹çýã™™L’Id²Üïç3fî}î½gÂÌœûœçœßù7pu½]w¨êa0i¿ø:¯H]‡}u# Í¡ “ð“ºÎ9ØAïé,ò³¾€ÌòÁ±Aã0‰`1½_¶br6r€UÝrçrph—8޼ |3Â1¥PVÕ»ÂhR—@DýŒ Ú\‰Ij{>ÆéèÌr¦ïßõ˜Pq§OÞk¾ïà‘4tðǬoÞ|¶b:ïå`»ÓÞÖ¡Ãã8ò&‘“0?°~ÎTÕÃeOWÀ÷7óãíçGà2ÕºõäáÀw“q!&™èÌ:qs°ï¨ë°×©êî&rh‰¥®ƒ÷;ùÁ×a7Í6ŒS_†qìN0‡‡ãÈ›@D~dù^–‰ªê £IßÌë×À_¨Š^ \ªª;Ãh×(Œã¾£¿¿Y÷>às‚6°¡£”Uut|y ƒ1eUg©¾ç͉–l§6¿LU’,‡vãÈ›@Dþ^Ù¯«êeá´§³""ý1Jy©õv½\¯ªmlOOŒïE˜ÙwŸ¦`ððÆiÝYÖ¯; "’œ ŒÃ|ÎN¤yŽ}uרÇîÐîpy#ˆH F¤Â¯s|«ªÎ £IIþIݵSÓ:£­jÄ}ÚíþY÷™4šUL¤à-ß#·³Ô²wD$óÿœŠqî'Ò¼Ò¹ï07˜ÿQÕÕ­f ƒÃà8òF‘ó¡Ž^ù1ªZ_ÁÌá ‘>Àc˜Ö°Á|LTÕ jq†1ÉjûSÏ*Åt»{ x[Uwíg¼CBD¨uì©4ϱoÁ(*þøÄ¹™s]Ö‘‹HbS5¦"ò|Zå@ª&ù¶ˆDÜâ¬y"rF•-¹Þ®G€ßµæßÕ÷ƒýK`2A]ªá[jgÝË[ItÄ¡âûœø××Sa4íØwRëÔ?rªÚ’®ìÈïÇ$ÄüCU? ±.ð+ßËU˜5Ó?a¤ßuÖËŸélLw³`~&«ê»­t]Æcœ÷åÔí_L5¦«Ú[À[NÆÁï³{p&o¢©Úö] ölUýª ÌsèâteG>³ÞecšqlÇ$·lÇ$_æ¾ èŽé ®ªÿnK{;:"rMݲ2€ç1zé-®À%"Gbœ÷ @ÿF†•bÖ<ßÞWÕ²–¶Ã¡sá+:ãÔ/¡öw!+1ŸûçUµ´ Ìsè‚tYG "o`ÖG/p˜ªæµ‚Iéü ˜JÝ,áBŒ®®9¸¸–Æ“Ö>^t–HŸ(Ð9§~Kï–/bf鎅C‹ÒÕù¹˜ÞÖÂ2UMms:"r1ð pt½]ïa¢-ÚÍJDÎ~É<UZ´X<¡ª_·äµ|õëã1 ŸÒøηùá;I“-AWwä‚i®pÌökU}¨•LêˆÈ™a—ÓêíªÀ$³µX9ßÿáe>6Äsãð8ð†ª¶›®n_yÛ/tOª¬žTÕ/ÚÊ6‡ÎG—vä"r;p Žy€jmÛA‡Z|å\÷„ؽSVö] ]Ë”Žý£q^Ÿ*ÌìûUý¦%®éàp0ø¾éÇžÐȰ÷0ŸÕÚÌ0‡NƒãÈ^óN G3†¯SÕ­lR‡Ã'¦rp CÚ;}ûžh)µ3¹ø+¦³X} ¹ÀlGÇÜ¡=!"Q˜ª‰tàlB/ÿlÀ”½>ç”;:4—æ(ujTµ3sk¯´¦- 9RDæaZn^Mݦ|LÂÙQª:ÏïÄ}7N{½“E$x“†N|+¦40EUïtœ¸C{CU«Tõ9U=8˜‡ÑåæD`°YDþà«gwph’.?#‘ã1Îh uÖ²ºÕÿ L£a¯í2`&&LXRï8 “%~Å^ïhÌšû•!v Ü ¼à4´qèhˆH/LEÇT wˆ!ÅÀÀ?ÒH‡Æp¹z RBñªÖϾîRˆHà7ÀoiX;[…Qfû‹ªîiäøŸ/ÐL¹[_ÂП›w½Ý»1!ûyŽ?x2L¦õ@?L­}_L·ïá zÞØk0K{<ß#øy^–“dØ$"Jú ¦k}ö÷ÿRÕú³x‡.ŽãÈ}ˆÈåÀËM y@Uïh+{Ú"Ò³®7èUo·x¸{I€"’‹i úGU½?c¯Â¨ÀÕŸ¥”af(ÿpf(û'ÃÜ|õ§ÖQ×ÿ÷pjqkRLCGÿ-ð•ïñ}–sCæ¯Â¸s³jb±¸SÞåÿ^Ç‘û° óŠÓÚ¢‘G{AD"0e]7b/BåS¼ ÜÙJI–ø^~ ÕdBDÇ$«Õ—À­Á¬)ÞÓØŒß2ÌM×Aãh^»ÎpSqì_RëÜ¿¾Éê¢3P9SrfˆÝß™˜¤8G×½‹ã8ò Dä˜ðU}v‡w…/Œˆ‹‘5½ž†³o?`fÕ¹pÞw0²–~~«ªíLýo@\½Ã_~ãô‚®K†ù›‹ù¡÷;îÆnD Pê…½ðƒ~¬†öÁ.ªlðÚàUß¿6xìÚç^¯yx¼àµ@z@B7Hˆ‚ÄHpC‚Ë<-H° Q AIi sƒíwì_Ÿfu!AŸpÕ}˜hV}6b¾‹ÚÖ*‡ö„ãȃ‘dLèªþÍÕŸcfß§72¬ãPç¨êÒ<ÿPLYMý󪪫Eä(LKÓÔzcv·©ê‹r½ÎL†È‰˜Ò¥30ÿWõ;ÈãõÀW5°¹~¨‚Ëá‡Bøá;øq³Y¦hSR { $$BR ˆÁ‘pT v™›æ†ù÷`Ü,óýûyV'ÿ1ó-ÿÝ ±ûe`ºªnk[«ÚŽ#¯‡ˆÌÇÌFƒ¹ µ:s…qÞ×Òpìç¿ÀÀ‚ƒ i‹È“4ìx¦÷ø\Ìl£~öû¿1³öƒ¹fg"ÃtÞº“§0²±q ûj`C%¬Î‡Ü•°n'T¶™¡‡H“07ÖßïoKà•°b ü·Ú¬!w9bÀ•Cƒ110*FJÓíD+02Á¯¯d©noK[ßrà_1ÑšúI¯`zC8áöNŽãÈC "¿žò½¼ZU_§=‚/ÛüdŒÓ>Cã­<ÁÌ\žWÕ5-lK°æÉß‚©C «%µùfß?Ã̰T(”TÀ[[ॷ Ë …"¬48æÈZÇ>Új¼¥(˜¨ÛËÀËY@‹_DNÆ,SÕ—®þÌ U%âÐ9py|=†·ñ@/U- ³IâËöŠqÚã1ÌÍqœcÌ^l­°ˆü ú;PÖaz7¿ÔᘎL†)1z]o—VÃ'ùðŸwaÑ^#¸ãpœƒûÃè0* N¶B+§É†÷;õumhb‹â[?¿ó«/íº˜¤$áPÇ‘7‚ˆÜ ŒPÕ‹ÂmK(Äd/ÿ/F4¢±¨`v‹1¥c‹UõÇV4ϯTµès‡{1?¬SÕÕ-iW{!Cd¦Ô®Ž\­ ?”ÂËŸÃË+LÇâ"šçÄÀ¹®Ë>¶àsêÀʬXrê“}ÍÂ,чۋ[Uõ©PÇ9t\GÞ"rpŽªÎ·-¡‘‘@SN®È¡Öqÿ·-ìò#"S€Gð°}˜lõtÖðº/ýNà6‚2±=ðíNxà%Xæ5ù­Èx8j0œÛÎq›&¡Ø¼ŠYk^ÒÑ”ç|"Lói¨-ðp‹ªæ·¹Q­‚ãÈ›@D¬ö*ã £í¥vp¦üÆ?ë^.Û}¶} 4W›¾˜ƒi=Ú)UÛ|šæ·`¼$ù·Û—³ž‡—*M$¡9Ž8Ή…s#L%G(Ãݘ›Ìdz:ÐM¦¯Ûàl`b½]?“Uõ¶·Ê¡¥qyFDîÄÎ>V´—f "ò3à?ͺ Ó)í1U-o]«ÂG†ÈÅÀß1*l(T•¿ßy[¡Ó¾÷ŽÆ0HgÇÁ9‘p Ë&XŠ‘ ~%«ƒ”¥ŠÈ˜dÒúBs1B2â}8„Æqä-Žˆ|EÓ Áç˜õáç:s㇠£˜÷FÌÅV›¹ðà'ðC˜LshGCì)šE%½úªsyÀB౎ +"‡aÄ.¬·k%pEkçÍ8´Ž#whQDä< 1¼e@VWçeˆ Ĭ­óo«µßÂýo6”«uh猆ÆÃ±p¥e:ÆÕçC|U í½É‹ˆÜ üˆ Úü#ð3Uý$~M—ý¢gˆŒÇÈÉ&€YßÏÂûáµÌ!Ü\ ÃûÄnp>u3Þk€'¿eµ±PSSˆÈ1˜Òã‚6:Ipí›våÈO¹å™Á^[—ÔžPDVØe©ì £ijŸˆÈ VŠúº(:1íÛYt9-ð ‘1˜šâîଇ;„æ èw"LŽ1q‚Ãî6Æqþ5K57ôÑm‹O@æ)à’ ÍåÀeªº8'î…ÍïÂ-Žwh.ßBÉU}¸Z÷sŸˆL‡= iŽ\­:2•¶ÚÛÂfŒCó±ë4Šˆ*ýaç1a³¥•É™¤û^z·ÀmïÀÆ0šäÐÉð‚>KfÂ5ßÂu5f½ÜÏh 'Cä ‘Æú§·ªú,p9u—þ!"×6rˆCÒ.¹ yC¾·ÔrD4:ª®:}™E5”Le‡'Cäàÿü¯wÁŸ^4½ßZ…W w&\»¦yasЮ‹ "eˆômK›TõMàRŒ&;˜0û|1½ÂH»päŠXÿQÛÑ÷í(ˆU·‡±Jûø<µ$"Gbä5(‚‡š®f­Î³ðÁ#pÑ^¸Û6mSÁˆËÜ|—!ro†H϶²GUß&aš!D/‹Èȶ²Á¡!î‡×Á¡…ù'Р^™sÃlC£¼ÿ†gŸ‡sŠáa5J—`„ˆîÄ8ôi¾dÌVÇfÿmЦÀÛ¾ŽjaÀqä!r!p€ ù‹à/a6É¡ ³*…ÙïÃÙå&ÎëÛÕxø2C䊶°EUgmê ¼'"NwÊ0à8r‡dˆtÃü8°þú 4»/»ƒCk±òæ@æj¸¸ –í:x)CdE†Èim`Êï1r®~ïˆÑZphCGîàš;Õðé“ðz˜íqp¨ÃØôüêøe |´k,ðQ†ÈÓ>ÂVA,h:°(hópLc‡6ÄqäõÈ9øïe͸;Œæ884É«°z&\µþÇ [ƒv] |!rSk ʨj fùimÐæ "rck\Ï!4Ž#wphÈ\|]ªJàñ%°)Ìö88ì—§áÝÇàÂ|¸Ok—0=З·Vý¹ª–a:»mž-"'¶Æõâ8r‡ 2D&©^Øþ <^‹šO xž€…ïÃûàí ]§ë3Dþœ!ÝÒ×UÕ­ÀõÔ–¥E/J–ÆueGîàà#C$ LÜípÓ Å¡#²òfÁô-pSPS–àOÀç"g·ô5}‚1Út ðXK_Ç¡!Ž#wp¨e*¾þâûà½`y˜íqp8$^€åOÃE¥¦‹¿\í(àý ‘'3Dzµð%ÿD]ÕëEäW-| ‡z8ŽÜÁȱ0jYºþN{ZŠ¡ò_ð÷Ïàg5°!h×u˜d¸É-• §ªà`oÐæ™"2¢%ÎïÇ‘;8ÎTÃ'Ëëfÿ:8txÞƒ¯çÀÕyp¯B™os"f¶žã«Ö8dTu'æ&Áß3# xJÂØ[½³ã8rÃÿ“½ð|8 qph-ªÁΆ§–˜d¸àúï31Ép÷dˆDêuTup_Цã€;õ¼¡q¹C—Ç×Eê0R¬oÁa6ÉÁ¡UY{fÁmÛàW6üèÛ Ü…I†;¥.3ƒºB5wŠÈà8¯C=Gîà“7@9¼RN>‡.Ás°äy¸°æS› w4ða†È]"®ƒ=·ªz[¨[’6çPìuãȺ4õ“Ü6 á´ÇÁ¡­Ùÿ‚û?‡Ÿ{`£o³¸³vÞÿ`Ï­ªŸ`iüœ'"W‚¹!p¹CWç< ?8In]›w`ã£ðób£l蟟|–!ò‹C8õ€=A¯gŠHì!œÏ¡Ž#wèê8In>ÊÁû(<ô_˜`þÍqÀ3¾ºóvÀªZDÝþå}©›çpˆ8ŽÜ¡ËâKr»œ$7‡`^ƒ5¯À¥•ðfÐæë0™í§èùTõ)ê¶\êÔ–·Ž#wèÊœCm’Û«N’›ƒC-ßCéløípGPÝù@L–̃H„› Tûž[˜¬v‡Àqä Ðc½Æÿ°”ƒÎÚth÷Œõ?Ƀá4ÄÁ¡½ò$¼¾.«u¾M.Lkßå"›{Uý/ð`Ц‹YyËà·-‹ºAë4µW±eMÝaöÏ.¨}éš*–Ö(œú»À>—õ*¶ú?ôLÐ ®ª¢‚æ«È6DV5¸ÞÁ¾åDû¶P×S±‹Dd›ª¬·B=tôþ¯"¯ƒ¼Ñöv@ü!B{mÝzW‡ >†ká—áWqffíÂ|ÖgˆLË2¡óæðwàV ‡ïõÿ?my‹»Ê‘{ÅeYê9=x›¨ºAn¨;R(çÛ²i†Ô°r˜ §7Ø.ê+”TPE‘ÅbéØVÑA¼Z,;A5ôõAQôSUù£%âONAE%Ô±õQÖ·ŒÊrÇ"ôW<Àߥa6ÉÁ¡]Siá¾>>pÁ‘@,ðd†ÈÀÔ,Õâ¦Î¡ª"2ÈðmºTD†©ªs#}túк¢§ØªÃš;^T÷‚lð?<*öþjpÕñ¶-ÿwàÇ4'[¢SÛê‚.ù ƒïó_kÃl‹ƒC‡áuX÷2\V ¯m¾S¦¶ÿɃiHTî{.˜Y¹Ã!Щfä!–}3êšÚÌÁ¯ ¼îéÒÆý¸ óUìÕ¨œ šŠ 9!è¶²Ài±;M…WDt1¶D ¤ªp¦! #±<瀵(ä±Â,±_žZ,]vIÿȼ-­]ûspph›¡l6üþ:XÞîè‰ÑcX–!òÇ,լƎUÕ½"òµ%i—‹ÈPUý¼-lïŒt GŽJªŠ#*ßì,ijÙ—^{]þõóCU¿\‹}/_WÑÑÚµw †Ÿ©è¯AûˆÊ ÙuNdiµu†‰—ƒÀ ¨õIýëYÈw¨µØ· ðØ® 9%¤#w©õ‚ ù!ÞoW%è¶Õ™‘;8OÁ›caí)ð÷…‰rý5Cd8ž¥ZÑÈ¡ǬµwÃÌÊï®j£;!=´îw\‚ê”&GúPÑA(ø–û²ÖUrêË缩ðŸOÑiàg›µì }cηmÙ֜ˉP÷zJ¿fÛÚ…ñõ^>À†‚eŽš›ƒÃA³~x&–ÀcA›¯Vdˆ uŒªî¦®tëÒBmT»"Ü‘Ë[Ô6¸?ßV»uèÈà—*ì°U^¥Vò°»bUç04-èåúव¦P[ê\ÏÂ\/6ö-àýmý‡W¤{s®ÕÉø PëÃl‹ƒC‡§¼À?Àt…JßæaÀê ‘³9ìo@ð_`°ÿˆ©CH:µ#ìjþí{é²›ZòüjÑ[…A`Eõ7¨Q «½¾ å[Âk·k to).”qA‡½ÝèõÐD©rœ-ö¯ýeÝúmæ^§ÈõnÕnÍ|»‰Àúx…Vwph1ž‚·7À56ìômJeˆüºþXUýó]<^UŸôuKs8:ý¹âz^ðÞ Ä©èe.чíJîå÷`ÿ^}/ê±ÖFWº| Ú*ú*©Æ&N mK‡£ÄùŽñŠ¥ïÒx~ÝdÔžŒ„¸œ°Y,×ÛjwÝEï P_ŸçÌÈ; ½"»EDïdç§´¼¼¸¢¸¸±5êVã=øzüì<øg¤ÉEq33ŒøË”,Õ}þ±ªêÜH·Þ‘»L²ÅB…Û€/¤‹ ç´·àú_—Ö¦¼‹ZË@óÕÜ¡ºû|°žU «+¹Ø®¼ƒ¸âàwj×~ABØôŽØ ß·º´ »Ëe­÷õ?ÙÛÃiˆÃ!c}ÜË#¢£N³,×q$‡Û öBµm{›íµ¿,//{këwß|ÚV×þ жÀäIðûž&l08>Cäò,Uç{ׂtzGàë)Kít å*ê68 J$_±·"²Êm[¯ØR?L$E_Ò.xä,ê¸Z¼Õpbt(Q(SP ŠTØ&Êz¯¸Ÿs©]Ýø‘`©u_Ȭõƒ¨’ïôò?Ùbþ: ½ú¦¤ô>¬O¦Ë’fëDt)TÅéo¹]ýãââ.8nØð×¶nÙô`[ÍÒ+Áû/¸"|ÙîS*;³n~e–ê‡ ­Î? IDATû;‡CóèŽÜ¥”¨Ès¨N¢UôâýÔ”ûD¬·üóYÁJã\±þƒ¹¡ŽØg  ð½öh#5àA'xTìÀõ|N¿©Zw‡$(TîmíèŒC«2`ð ñI‰sÅ”/¡Ê¯×û¹×ëÙ¤¶]nûÚ–ËÕÇåv ´Ä5B„¸·û²Aƒ¾í»M7””´Ùßh!¼v!|w<̱L4¬7°8Cä×YªsÛÊŽÎL—pä"ö|U¹sW–54Q6© pO`|äRœ ¶ÁïÈÙx¤{÷îÑñI ÷tSðx<5/–½áµm'Y*nwqñ7¸,×é–H¿#õÿý—ë îlKÞ†;àŠñðP„ÉQ‰æøÖͧf©6QthšNµ^³öür¸Íþx¦V»YÍVo lì*öƒõ¶Ø-šÉßÞñµ^L°GÞ!éwÔ1· ’P]UõXqaÁ«Žoœ§¬0?o¶×ëYàv¹Ï|챩mmÇÈ&•Ã3A›'cÔàok{:]Ç‘–¸ž ¶ž;,Øâz¨¿FµÏ+ÖâPã[ñÁB7þ‡ØÒŒiŠDŒ’”ãÈ; ‘‘‘îÈÈÈ˼¶wuiIQN˜Mê0””–ü[Ñ€èè˜ËÃbxæÀŒ=ð'j{“Ÿ‚Y7›:]Ê‘«êN–Jt;(|YôïoÈq5.eèв²š½Ž#ïpôîÛwª‘UUûÞ ·= oMM…Çãù@\Öñá´e>¼ôL°aoS_`I†Èya4«ÃÒ©ÖÈ#lÛ뵘Ø Vƒ¾àbËuéŽàmj¹<ؾ„1eÁç@jüYå6l©Ý'zpJDÿQ¸¢Öy;TU k‹-vÐûÑu4§Ýª1ö=,65Ö®&Oê8òLT÷?ñ?¯®®ÞFS:$êñnÂñ}úÑw÷î?†Ë–7`ýNøY*<â6-…c€72DnÈR}:\vuD:•#·¯¨õp“ƒ,¶×TEem¨}–ÈFT6Ö>HC…¨ f%¥,•w®ÊVa?ï§±KˆõŠ3ciH ôÌã8ò‡Ûí: @¡ÌS]í$‡ 5Þš­‘¾\ߨÑ}ÙMØ9ÀZØ»&\³#PV¦¿y¯,Õ†Ó¶ŽD§räío´ªœ¨ýDer í˜È 6Ò®J ¾|íÿ.õì+íÐ=©ÿ§GýëÜpÛÔ‚fä( §!nŸ=aµ#¶m»K‹Š†ÛªÝ,Ë*‰KHøŒvÖ_PU7 W»P‚ÚÙpóõð×np fŠ43Cä°,Õ?„Û¾Ž€ãÈÛ ×‘ˆ½ÀÔ~û¾ÛJ° -­Ø¶bÁ1EÛ×ŸÛØþžGô›–x‚Y¦úñ£9Üó›ë§½òÊL>^½mΉWϬøâÅ;&õvQdò1gv¤Ò‘$ÿ“*gFîÐBTíÛ—P^Z::6>þCwDDeÕ¾}ñù{÷^—°ØívWîÿ ]›ðÌ…;¦@~\F†HoŒ¬k»»qkO8Ží¸ Œ å”c6>Àô›Ç’š:’ËÒ&oЭl_:·Q'P½u.³' ãþyëÈ?ê6Rú×·1{Ó¯Á¸;G’šjZ£çäØää¬NM9kZj¿ñ·ÆVìù.'ÿ‹÷–©êÝ-÷®Š€#wApâÐiÄ,šEwë–W^Z:6.!áýpÕ‘Y¯]ýa¶O†÷4àà ‘ó²Twîïø®†ãÈ;(žŸþ+ÛS|Ø)×^ ÐcÐz Cò¦Ù° rrÖrÖ4âŒfûÒ9¼šmÜf.XÇΊ$ª6›üµÆœxò¦‡™>q83®#oЭô 1fúõ#ÈÌœ˜ë͘ñ(ë¶Z I_HJÃá©\Mj¿ñ·fn_2gFz°#wf䇌ˆØ¶×›P\P0  ¦¦&αÏVu>cÉ ðáÅ0ñ8˜'Fq°ÂçÌ¿·}í Ç‘w06q899kÈtÄ„ž±ïÙãÆ$'g 7üå žXî&-m ©©#yïíy”¬]HÉæ\¶/KÉæºÕk±GÓ÷ò©ÉCÎý¸þ,JÀ‘[Ž#w8Ô¶]yyã]nwAbròqññ–ž\˜ŸfYIɰ„¤¤÷“z÷~¹¦ººoqA#?zäÀ–%pµþëÛ”„Q;?Œfµ+GÞøîý™c¾ù`æW)W¯ ¬÷èÑÔÔ‘L¿~»?1SÒ¦²bÅgŒ7’íKëvLI›ÊKÛÆrYúãסlBjêH~šþX£aw€Aú)?MŒ”´©†øA·“³†3¯aö„j¶-NçÊ~+8s€Ÿü⟧&=éÿE‰`G;û*+{æçKHø0¦Gí.·»*>)éㄤ¤åñ‰‰ŸŠeyâVGFEm+Ø»÷¯×^Ë;&kaïkðËjðÏÂc€×3D®h긮‚ãÈ;î¸>Ó‚Ãàãúoàyfæ&Œöpe¿•œëŸq&ñlá]ÃøøÎ}œëp¢±GSÜïdrr(׸tÒ¯˜1c#Ò$§ðÏÚyêÑáù!éó™¹p©©#Y¶lMÀÆ+û­¤ô…ËHÞô0Û—ÎeÅ]C8×;‹¡Éy©"Ò–ÎÜ™‘;4 Û¶Ýe¥¥ƒ*+*] ËKKìݵëúª}ûú'öêµÈår5KC¡[LÌ®ø¤¤÷‹ R÷îÚ5%È¡KEYÙ‘åeeýTµ]´´W¾‡Ò'aò>Š•À³"—…Ó®ö€ãÈÛ9žŸ~kŸ‘WÖ Ëmù¦nFfæ¦O@ZÚ†Nþœ‰÷~ÆW_m&3s ×·>0Cßôan ü>%›sÞßæ™×REÃÙxÉæ\†ð0 ïÀF ½~~Ñ)‰Ì˜1—¶¥ßølf̘Gfæ6lxž×²odÛâtT×™9…¥Kç±té¼TI=°¿ÌApäâ8r‡F()*:¡¸ à4—eUx=žž{÷ž_V\|tIqñmÛ>".!aõžÓ²,Oϸ¸^gèÞ]»f”—–,ÈË;KU]Z˜ŸViIÉ1­ñ~: ùPýüº¢¶%uðB†È…á´+Ü8Éní˜o=xrtR¿iÁ!îËçòå[³Œ}úéwÈÌœBfæV¬øŒªª9î¸ä䬡¼¢’m‹§?h·\5„nÝFñÄÒ¹uÂë%›s™=¡šeËÖ°{Ü2a%%[rÉÉYMõx³Þ=¤üæÝy?“&e{TVã=;æpÍ©#˜2e ýÆg“’fìž¹`3ÜÒ`]>&b׌Àí·ÿb)¯^ 83r‡&©(/?BDì„ääe¾M»€o÷îÚ5).>þžî=zìhêø¦ˆˆŒ,;ìÈ#o+ÊÏ»oß¾ã’zõzÛ¿¯{Û‹ N®Ú·/!*:Ú©—n„j°çÁŸn†Ÿ¤k$ðr†È¥Yª‹Âm_8py;eíüô=Ž:&%­6Ä]²9—ùFökßrçŸLI™výË_^ÀŒóã/¿ü·ô=å8ÊkÆðÄølºu‹"3s ãrÖ0ñ^ãÌK6ç2H?%5õF–-[CѦG|gNfæf̘ý 3óþÀ¹—lïOÊQµv%ošÍÒ¥µ×.Ù¼Šäþ6÷MÎÓÖ‘|ÙÿÏ!ÞåTùŽ/Þ’Ë,‘¥ª­›Éž¥êÍ©º‰³F}û&$%}¤ªR”Ÿ¦ÇãÐë°ÃÄÆÇ¿VµoßáÀA;ò"vBbâûy»w_ùm\BšøÄÄO óòR£¢£sù˜j°‡Œ›À QÀ«>ј.§¤ç„ÖÛ!kç§/8nÂ#cÀ¬kGù0³'T“š:’üoVÖqâ3fÌ#.îLDFröÙ'““³šE®Ûò»OI<}~ -vàrrLD08¼~e¿•¼–}c൩ ŸÇŒ¦œÌ?Ó÷³}ûî:öö¯YQljϛ÷2™·ÁkÙ7’š:’Ç»“ÈÅéîÝ{%vàhRÒ¦rê½SãÑ6³X×Ê×qè€Ø"¢1±±kÝßDDF–Ú¶JRáÀQuY.W €;"b‹§¦&„ô‚CST‚÷ øí>ð‹ïtÃ$À §]áÀ™‘·36‰éׯáË<‹ã“m23§ý½ú›ÎÆìI±ãøWó½uŠ9öÍìÚ7f‚'{î”i 7šj+tFüôù”lÎ]*"9­8;ÿ/ÐW ~$ltš§8ÔE=O´ÛíÞWVR2&.!áC€²ââ!QÑÑ›Zâ½eeGvïÑc‡€GUÝUûö%Z.WYK\£+PÞùðëàá(HºofˆœŸ¥ŽòÖ°à8òvFïQWN‹8šÙ“P5Yß99kèv6 2o&5ÕÔn_>ù1Ž¿a>)!\Ýé§ŸÄé§ŸÀs+æÀÀù€ w§¤M剥¹ŒËYë¯Ömžòå—›H:}~Ç?$}>‹úÀ w ÜDÄM50¼¿ÍŒ2ñÞSHI»ÆJÕ͇Y“ÿ~é\J6ÏiT6vàhN˜·5œùF à8j#t¦6­‡H\bâ§{÷^Ÿ”ô®¿áIeEE¯×Û½ûg-q±±ßìÝ{žËí.‹KL\ ¬®©©‰)+-›Ô«×[-q®B xž‚Û¯ƒ¹QpfÉì ‘s³T? ·}mZoGlx~ú­þ5ëé×›$°×__ÆmOFrR?›ÔÔ‘¤¥Má¶'#9þ†ùuŽ-ٜ˕ýV2nÜÈÀ:yfæ¾zï®L1uÜþd³”´©L¼÷3ÒÒ¦0cÆ<ßLßÐTíxÊYÓÈÉYøq#Y7³'±n«Eõø…Ö¥‡Êì Õ¬Ýjñ§Nã‰åî:IoÓ¯ΕýV_Š”´©ä º'–»©¿°ÎøÆHI›¨ ?ùh@H™×äMê×ýên¡ÞÌÚý46fO¢ßÆßp®wçzgÕ³i%g¾Ñÿ¤;ÝÂçvèàT”•¥¸Üî= IIKã“’V$$%-OLN^ì©©9¼¥]â?OJúØ÷XµéPKТmÛÝÓãIŒóx’ãkjzõª®>ÌÕjÔ÷BÕóð« ј8`Q†ÈðpÚÕ8¡õvFÉæ\RÒ¦Q²e%0œ’Í«Xx×0þùÏg8ñ’͹,¼k©©#ùì³oX·Õ"eOÅm³ Ÿ7V3föÝÔ <3¬%ÇwÞŽr̈þv 3~Ù²5œ5i4gœa¾Kï¾»„O?ý‚µ[-Öm­½Üµ+gŸý ™ÀCÎÂŽͬÇåð±ÓR¥e3ÚŽ<ÂqäA¨ªì«¬’ث׻õ÷Å%&~XTP0®5û‹÷ˆý® /ïÛëÝìO†kŠ>ÕÕ1»##Ë뜣Þ͆‚ôôz£ŠÜî:-U»{˲<‘‘‘[ËJJZõæ/.!aYQaá™û7¤¬ìÈÊÊN8±´´¿+Hƒ¡»×ÛÀA÷ Ú&@|e¥uRqáñ§C¯3¼°*^†kÀŸÏ|!r|8íjMGÞNH9åºï¡n¨zèУÈÊšÏÄ{?#%mš¿D+PNæ_kþüÈ{XäºÝ'ܲŠOž¼„¢Mð³ŸÅ¿þõ‹\·ïw »9Ž~ûÒ9 :ïÈÌœÂ>mØ¢ds.÷^œ_§µiü [˜¾h$‹\·3tòç\–þ8Ë—¯Œ£.¡›¹`mõúÛžŒäª?®bܸ@Tá?û5²ùl° qˆ¹kwèâäåmYViD½n0=bc¿«®®PRT4´µìp¹\Õ;ò÷ìùiccN(/?â°êê#zÕÔ6¦¸ø'Ѷí>¼ª*îSë^‡~••)öíKŒ´mwry™«GU•0†tFg¾Êß„=µÑ·^˜F+2ç8òv‚It3â/%›¢ÚàÑ”œö˜¯¼y!ð!éó9eÂLŸþ"##B6, Ÿq#)ýjnÈ}¥[M²Üı&:ÜÕOò¦ÙœuR­XZjêH^;‰äMû’íF“7èV®»ý™:Çùå\‡¤Ï'oÐmÜsÏc€éæ¶³û™Ì\¸ŽeËÖpBú|Däîf½™ý¯ã„×»<奥ý«*+orGDäíw°mG——–ÞÑšÚèn·»¸ºªêšÒââ³È¯7¢Wuußàmݽ޸S‹Š†W^~lwÛn tmÛ1ƒ+*Ž^Pp|T'`·‚ü~ ®Öy'áã[(ynð€¿wyL6{r8íj GÞN¨*Ù=­xK.½ŸðEö$¾+·í¾?RÒ¦òŸ f’9v쉛€íKæ4yÌ·ßn£¨‘¼Ü¢M¹ufõ#B8òó/©M}î¹÷˜1cË–­áµìÙ¾4èÚIÇ× £gfN tS‹8š盄:¿~üvw†ÿ ±G7ptfSïý8ò'¼Þ娮ªŠ-ÌÏ?ÓŸ•^^VvQ·˜˜ýÌš"±wï7Ü9{÷^V˜ŸzQ~þ©EcUµÅ~O»ÅÄìŠéÙó/•ååÙy†ÇãéVîrÕ|ß­Û÷õ‘füžkä¯àëjð¶”í퉯¡ø=˜äýÿ`ൠ‘èpÚÕÒ8Éní€ ÏO¿UuO¨å$Þ\0š~—Îoò˜Ý+çR½¯ñý#{¤“š:’s—ÍjVèüŽûß#uŒÍ^†áK6¯‚´©<±ÜM&Æù®M˜¼A·Æ<µq,<¾ŠãûìãškÎ`ݺÿœ¶?2P²y™‹!-m ™¾Úø×²o¤ßø¹Lv¿hMÉŒY<øö£ÄN2çHI›†ˆÜ­ªwï÷ 5MÀ‘wsfä]Šò²²~Õûö LHN^¨ªZEùùQÑ!œccDEG¯VUâ6xjjºìÝ{QBrò;–eyZÂN—ËUµ*!)éC0ýÏ ÎŠéÑcͶè肞ÏNxý`Ù›VÀþ£˜P7…,³^~*°0Cäê,U ·}-A»˜‘‹R\ûBú61´SctÍç5h.LÉæ\Òö=Èwo¥³mqãWž­;ãݶ8¿üåÖ&Ãì±Ç0ü¸Q!Çû¶M>³ö7êµì%cçzg™d¼X»öëÀ˜áÃBfæŠ6=Bò¦Ù$ošÐrÿÞ:…‰÷ÖêkøÏ;p4wßýhÀöâ=keo¾èBKh¤jÉ#œy—¢ª²òØ„ääeeeGæçŸéõz#’“߯(/ÖœãmÛv{½Þø¸„„ žššn…ùùgŸ”ô^qaá)-fç¾}G'$%}X]U[TPp²­êJLN~¿¢¬l8ÀÆ=vzEÍl÷ŠÔØ"δ½"Þ%°­¥ìmÏ| ;¾†[üÓŸŸ §M-I»päÀçAϳ„ø°Yf JB®?û±ÜðñÇëCî3 cë8ÿ¶f.XW§ïø{ï­dÑ¢•oiz½<3s ÕÛ†à“ެ}îOb»,ýqÒÒF´Ø·-NgD›/ªN¢ßølNûs4§ý9š~ã³¹,ýñ€{°]qj×þïÿÛ£µÛŽŒ‹t ?©(¤œ5í·M¾‰f¥šìˆ0k„íå»àЊضí˪è³3º[·oÊKJN°DšˆqÕR^V6(::ú€âÂÂsÔr¹j|½É[äsäõz#-—« ¬¤äÔ˜ž=¿(),< Ÿó>¼ª*Ö¥ÑÀ>—«hul솜„„µKÖ|٣Ǘ5¾÷ŒKÕ5ÂÌP»o†ð[|ZúÀï3Dn§M-E»­‹×úLݵ7Ž^¼Ç ®.!­Ð=±ßªœœ5ÓRSG2kÖ³¨®á¬+³¨:)£ÁØ)£©NYH¿ñsùû”#ùúë-ää¬&5Õ¬O¯Ûjñå—›øòKˆólcö s܃ó×R=~!IaÏ’Uì\KòèiÄ ¨[K>cÆêøÎİ  žô½t/dˆ4kY¥½Ò.fä]FðCábÁþ¬Uû;ª³ð÷YoÎ?þäiþf'—¥?˜Ìí™ ë&•ù©´G“’V·Á‰¼{m „íÏÆ¿öìïR7`,—N:™áým†÷·IM õ1kÓO,w¢`£Vn*§ž´Ã—Ýîï3>ùLãîIjjz`HÙ×s m*C£Íù¸q#yâÞ\"í\ö6cÕNDF«ê¡6; 8ò8 ø×!žÏ¡÷Qa^ÞyQÑÑ_Å%&~XQV6 ¸°pd|RÒ{Í=G·îÝ7äïÙsaL«{ÆÇ¯./)9¾¦¦¦_RïÞ¯·”ݺwß·{÷5Ýbb>ŽMHø¤² àôkjŽ?22r]¨ñ¶ˆ· "¢²±óFD”Q]Ýä5«kÃΚÇá/¿‚#¢à,Œ.û["'g©î ·mC»˜‘¨èÝ@ià5ü¯Úv—é}âÕ3~ø_¯¬IÞ [Ét+_lZÓ ݹ# IDATÔ+X‹<˜’͹Üÿm×þp»Ÿ™ Ö’rÖ4N½w#ß[§0}âp~}ê÷ ÖO)Û‘Ë&ëd²—»é7>›¡“?çO“©_Ǭ¡>éôj&ŸéáÊ”•u’ßfO¨fÛâtÆɲek8úèZ}‹aÇŒä\ï,Þzë!Ÿ­#Ù¶8\?ŒÉgzL–<æf¢‘™ú–fýa› Ku ð-@ O1-:9ÊÄ^½ÞQU«¤°ð©IìÕë­É6ˆŒ,v¹\ÅÕÕÕ½J‹ŠFFFGï‘ÉV÷SYQ1<¹OŸçÔ¶#K Oq‹Ôô‹ŠZc‰„t¶.UiJSÝ­ºßZq»‡Õƒ©û%øM`ÌgÞ2ýæÛ˜vãÈW?:aµë}°äIUûôÆŽéll‹›p}Ö?%nàè@hzÕŽ“7n$›^ºóìY||ç>¶-N'rñÄáëâ-¹,Y’KNŽ)e[¾Üt*›¹`m@p%nÀh¶/5e^/mKö×°Èu;ïêí<±ÜÍËÝM ДlÎeÛ‹Ó¸²ßÊ@†üM©6ƒìO™~ýpzôèÆM7]ΨQÇóñ×ÕôŸÍmOF²Èu;Uý.¨³¦ï''g "#ùôÓÏM¦ºï½™5ò†¶¨êÞCþƒü³r÷iÐbÇퟱ±›â“’>ŠéÙ3d8º)J‹‹O‰KL\¿1>)iet·n{»ÅĬ..,ѶžÔ­{÷õ€öˆý.>)é£èèè-5–UÑX&º‚Õ·ªªÑÉOïšš&'F 5åÐô”½±*—ÀüKÃ0aöv©nÒÞÊèÆLyúY…óên•÷UYâ¶øÒVi©ðvÉ®ï?þ*%m*³';pL ) g÷ÓôLjë î7ì7Üù'3Šý퀔録t©É`Ï^ñÍäïø…‡‚füvìØxš:²NöùÄ{?#&Ü æM)ÐE.žHfæÍ¤¥M!nàhbŽaÛâtÖ¯ÿ†Kû)iSÙ¾t.ƒíOزåG&Mº€E®ÛëœgûÒ¹l[üp‹¨jeˆ\ ¼POÏ{Zâ¼á¤÷á‡Ñ3.aDd„û8—Ë=¡E;v…9BÄ:ð¨z¿:cm/¶íÝìõÔ|WQ^¶ÑV=¨ô¾ŠŠÞÕUU}cô&/ÈË;;!)i‰42kn5551e%%#’’–76&Þã‰>º¢"%¶^Â[HÕšØØåõ®$×ÔÄœXZz¼'**¹$>ñF€øü¼9®¢Âµ›`Ç(½×À®ÝP|l$X£!ùc_‚ÎÆÙpôpxVLˆàÑ,Õ[ÂjÔÒîùðæÇ¹Ý#ŒodH>H‹önOìþ~Åé~µ‚&qÍØíòøA·ÔÞŒ3K¯sìŒóèÞ=wï¡^²9—ã?å˜X;pž–bÆŒy œlcøû¥ß}÷£v º~#çzg‘™9…GžœÇ“[o¯3ö‹ìI¨® Ü,«Ê­¸kHNKuBó…Òò/lýœÛç ‘‘‘ƒ~rìM‘Q¥JnúˆB$PT”T5E·W”•Ï©¬,o¶ @YIÉÑååöîÛ÷¡Æö—•”LësÄÓEä€\KKJŽÙWQqfrŸ>Ùû»è]]ÝchYÙúÛ½"5?FEýPäv—Z`%VWÇõ©®î+`ÕDE%;ò]E…oö‡~}aŒzGaIðùn€1)pq|÷=¬|¾«êd!ø+`ì`xœÚ¼±Œ,Õ¿…Ó¦¡Ý…Öý{R1ðóÑ7=s¢÷ý?{gUuþÿ÷¹wö}&“„}PA‘*ZûUÛ¯µÚÚÅÖR­èW¿Úå×~ÓÍ’ÔV›îÚbëFµµµµjµVëR!Z¤ ". (K@6dö}æÞóûcf’É „ÌûõòõÊ=÷œsŸIdž{ÎyžÏCÛ[R‘ Ã"÷Ñwö½<Ô´Ž:1›ºº«IíÏo7[Ä:&ëyå¶b@€k¶)g²a§‚kb¾.ø/ŸÅ¼yŸ§¡á¾Öò£@§úãuuw`uÿŒëèÈûk–c±ƒç´ü½]+—*›]Í/®XÒ£”l¤i“äË|x¼Þhç_p/»VÝ·ßɾù^cKÜrxǺV;kjfùôÒÖºÏ÷õwØ RFk…x 8G…ñóaôr/U£Fª®õ¡ˆÖZÖÐu};’n‹€ 5E™"„˜‚$«ëzŸƒ%EÕ F Pb¬Íáø¡Ñlús$|´¯ó$âñI]¯ ŸªÖÉ™Yíö±HÄ …f¹½ÞWû:oëü±ØEHéìËŠ>£(YºìpDªJi“Jï-ü\BÆÂŶJ˜¬}bcÀ< Ø`Ê)0Å ß Gh:¨xþó¸±n)4ý¨Vˆw¤|l@ ë#ƒÎ‘Yw×gïŸ{ÅŸWIƒþ5Àˆ¶éX '#9Jþ.®‰s˜Ó&îYu;鬹1ÿþ w· ¦\¸äîyÁÀ3…úÞW.È1I™šï~ €ÆÆ½ÔÕÝA]]]ku1w¸fäs¾ªZ÷+뎕ÓÜæ°aÕrêëïàÑWó‹ßÿšíâÌÖ€¢èÌ ÇK˜"ê~—·Õ=1Ÿ²öûO㬳Níòy»V.çʺ6seÛv}áx`P×ïñPy†BúÙ48{ ü¥ç>ê˜L&¥²zÔÍE'®KýX4rO&>îv®Ü^ߥFÅ4d4™ˆ=pÈ¡šL–¹£ñBf“Ñt™ÃéÚ‹F^éª{,™œÍdÆ !2RJ£Ôõ•#G~ŸnV¤ªªf<>_}$¾4ÔÒbRšÜ^ïêŽõÅuM3†ƒÁ³…™B? ªFú^oèëꩱشŽNüPP¥TsÎÄ0}½ | jT°—öÙ‡S0¸¹Ƹá:ò/j÷Ö 1»AÊí½h­#‡ÖüòkN¿òÏ#T57 Á©R*Çm4»Áh·iÅ’Ë:®rÇ.º÷„9l\±„ºº«Y°àK­çÕçÿd#‘ôé\¹ Ç­ª³©¯¿³ÕŸþùùy_×kIShK‹4­m <+b÷‚Ñ[T^»ƒšš3pnù ¼q _üâ…Œ_WÙ}òÉk׿ƒB‹+øâÏE-ZJÕ)m‘öÛZЮjÕܶ]‚HÓZêê®FQ#¥lìõƒô§›\ù4´!åÈ'N;ñrUÓ²¹Ü£á`Ë¡;¸á‚”Z&ü–˾c¶Ú¾,Ài¶X—¦RÉ͹l6VÚ5Ÿ(^¿¿±Ø‹DöDÃáSÜ^o—)`RJ%‹ÍóWWÿ¶¯kš1œë«¬|²´o(8×ãó=[t𺮂ÍÍvºYí— fE£SŒº~ÄYVpKH °Û|0ûÛp¢ªRÒ Cìx=+¸n»N°À‡ð×Z!æ7H™îmì@2èÎÈË€¢XuÏó¯nZ‡GßÅ{ïåWEW_' Înç{¢X„àßïFÙò~¾:ZÇb*‘¦u¼ûÀ2…lÔššÙ46®gìâÎ[îÝ‘}o9'Ž™Íøñ#yô…ý­Úñ“õ—ÚE«ßó‚¡²\ñlü±Ç~Î….òùôÅúÒ³s!f×÷Cáj…P€ƒ€OBä×0/9DªA¹Ýnûø)ÓžÌRÊw[ÍËÐõã6Øíõ]j4š>‰”Ñx,rD•ðL&Ë £Ét@6›ýk8x°ô~°¹y‘×ï_F'¤S©i6‡c½Åjm 47Ðç÷?×Õœ¡––³,6ÛÖx4zNEUÕ#Ñpø$]Ó›mk:•çòx^ˆ„B3Lfóû«µYËåÌ¡@àÃUUç²Yk,™é©¨øOwvû²YëÌhtFÇjgYEIuÝÚÝ8€´Å⊹½×@þŒÜ nóÂ4s>ýªWb°éçCìE÷P™ ΋ào*Œ-4 úà·A½"®H)…‹þù«ÿ·lÆŒÉ5_í‡ µÒ@·s¦99gZ~å~Å‚·<¾‡ðÞ¿–·Kû*V&;é¼kðÝw‰TÿvÇV|‰]q7Ó¯hhmÏpm› ´;/:éššÙ­N¼¾þN¶‹³púìZµœººþ—FnR¯â_À¥\穇.W\ƒ ·ß`H%ã8žx“ɤ6LÆ&˜h0¨'têPHó*”'UtM³B^“]×uCWyçRJ“Åj=˜ˆÇ£N·ûí@só¹f‹%˜ˆÇ[%RuMsY¬Ö‘Ph^q{Ý`4&¥”=fŒÆäf»ý“âñi䃵&«µi»ÕÚ2*vMI&'ttè)Un·ZwMÍf?`Ô5¡‹|Ò‡Fè$õÚv˜ö˜ø4™Aœ#'Á¤ûaÍñ"&³ ¢oÁ §ä_XLÀÕµBü»AÊ?´mÝQv䃔¶q#€¢®äV%ùÕ#·ßþ­eÿó?Ÿèu¾—_ÞÈSO­!Oòã¹µ½±q=»þù oÞõPk[]ÝÕíÿ´Qg°¡D„¦£>{G"Mk©¯×Û9áž(uâÅÔ6€‰G³±n s–^G¸iË–ý¶3O—Œ2D¹Ùb+: =™NïH[†"º®ïPu"B™Ô]‹ÕºÏ`4†ñøL›Ã±[JiîVß¿Zû¹Ý¯…ZZ>諬|º¢ªêïéTÊk0“Áææ§Ûýr_lßk6‡÷šÍovl¨j¼´´ý É] ý…•xNU¤äèÆ‰ Ðdþ¬¾«û&'´‹Ts9Ž9À½ð—ëá +\H>àï¡Z!æ4H9è²@ÊŽ|#„¨[ôý{yhG>ek×ʶ­çë¯ÿt—ꔥK/æÝwwÒØ¸)»îWLS+]¡ ±,_þ{‰µŠ¹©[qG«c~þùÛZÛK5×-ZÚšWìû±+îæùÆWil\JMÍ,\8›ü ¯;?nÜ.ºâ®â™{ÛB?Ð e¸Vˆ¿Ÿà¹ÿ)7¸Q(ú8üœê£‰®ë†l&ã2[,ß6’Öß›P”v߇nŸo]¨¥ål)¥YQÕ–PKËB„мÿîn:ƒÑ˜´X­›S‰Ät=¿½­èšæ¶ÚíëK£ÖEÉYíö ƒÏST5 èñhÔm±Ù6zÐKï ƒ¡]`VVˆÌØTÊgÕõ‘9µM^ «è¨ ¼ÿ:<ùoØe±&œ 1ôRîÔ “æƒ 4‰íƒGà{Ÿ†“U˜œÜ|n€ÍêD9Øm#„¨›sÕuËŒãÚ¯Š7­XÒ.Ò<ïxÏ`Μ“¹à‚6ÅÛ¢RÜô+î%ûÞíüø³m*r‹-¥yÒõ­[è¦ç.o§èöüóëÛÛÝtÓ]ÜxãU=ÚûÛß>ÄþýùïóbNyé6~}ý­±EŠévνžQ ®aç§7î~»aJ©â¿Èo±“†U·Â p8yæ¬eÕðQ]ê[Í¿;ÐöÑ4Í(B$Uh¹\¥ªª®ÔÐ…þ v0™,'M¦¥±høÚT*Õ¥rd&v™Ìæ(‡ „’Ëå¬tµƒc툖˙%(ƒáˆxDu:í²èºQ•RI+Jö=‹%8+89“9/mµžàŽFW[ÒéÖÏ›¿†ßÄ:zVƒùJ¸ÎâݰêO°þx9'/e1Lž —Dö_Ó åjTÊ+ò¡Íïß߯²±ãÚ7N¿âÞvùÜšÖ2nûžNÊn<ðTë¶·qܵ\tÅBÛóŽyÃN…él;/®ìÛœí <³ü¿ÿ5­øR«¯¯¿“÷Í O<«0k¼Î¿VƒÑhäÌóoi÷rQtàëiøÙ,Ò´wâÉ­ù¾{âœV;#MëØ³™ú#ûµu˳äÏ G›aÁLð¿vœ­0Žá@ ÆSQ±²ô,9NŒ†Ã':ÝîÍiÛá`ÊŸI}u̽9úCE¹×lwlßàt6m1›Ÿ¦Ë‡;}÷¿Ovtâû!ÝÏN…Ov¸%߇烗öÇí+aÛh¸q$ü´Ðtk­ë¤Û°SaÑ¢¥Ô×߉³¹çO<›ÿßêùÆW8å”Oqâ‰nÊ«µÕÕ]”ëY°àt<“®áú?˜ø{ò†V[‹¤7.aÃ}Ë1…vN|ãŠ%ý˜?ÞŽ)uJêŸ;Ï9ÞÑ4ͤ¨jXQ”\4™ÖràÀEéd²Âît6år¹ª¶o8“Sý=7—S:}õë«aWwã6w-#î…Õdz/òx<E}3ùüò.w(‚òŠ|ˆ|çùk"MëVõT­ì…Üíâ6ø9ç\ٺݾó_˻躂*ÛZ M¿Ý¾é§ìÚ±]+—sîŠöóîZ¹¼ígÚVì¥í•'çmºë®ïò¥/}¼µ½±q=¿òîn¥]Kü îmý'Þï[ê¸ø&€>Üs”ŸwÜ‘N¥üF£q?€Óåz7NOV «SýZê³L¿!l tÈ ºöRgšë=ñg¸ù pª¦“€{‹zul(;ò!N1ç|ìâëV]t-"±Žðþ|ÎõW¿p:Œë¨VTiu¾á¦%­÷…è(0³±õ§®r¸ï½÷ïL˜0*_7¼d ¼ÈTà?º‚/}éã…h÷ ùmû>8qÏ伜뾵4¶l|ºþh­ÄKirs­/gª0õ#0ã‰Ò_B™^±Úlí°#pðàùº®{4M3ŒÆ„”Ò|D“Ëü‹€“$V]¦ïT§ÓU£“L]Gäw Šˆù0ùAè2½j:Lè¢Y\?Oî~9ßÌ´@æe¸a>üM€ øX­_oò§½>Ê”ùq@Ñ™ïZ¹üîššÙ“?Qs˶wη.©Íf\qo~%¾cá¦uä‚kÙ·¡sÜÂ…³™0a$÷Ý÷~úÓ?‹åƒ}«'Ã6åbÆ.Î@Ù´bIë ò+é¯|~&@k`ÝØ.2vw­º½u5/¥BˆºÐ¶u·®­ëŸßÒ!qp&À¸„²#?$Òɤ_ËåÆ$‰*_eå?‹íææsÑõ#r䚦í5B³j0Tè¹\Ë|rÙûï ÐuÈe%²Òç{z~(4Ϫªÿ•2›C.-3ΛM;:8å™àß©´t7œ¶¦ì…UÁúèQD<\^„Ýc¡v\>UU7× ñlƒ”GÄy¤”ùqBaµ:EQÓØ¸¾F×õeJá¬cZÇ•³kÂ\æ×2ñâ|ÛÖ—PSs:¯´‹0øú×?Ocã+lSæuÖm/¤¡EÞZŽ´Íe×Êå¼YHm+=ƒ‡6=÷ÒíxÈGã÷—üêaògà€Ù­€[Z†Á9`gJ)Íþêê?…ƒÁÓSÉä‰Hi°Úl¯ !´–.ty½ÏÆCÎÇÍdÓMk>xØ Æd(;òŽŒÌdœU™Ì%Åk º/›}±"›=%j4y]&T]o÷ÿ´<—Á {`åfØa¦Âä1°X€¥»ç©`çWæ(ÇO¥½îø3¬üø3i$_\enƒ”¦;QväÇ%ŠpuBˆU@ äð”)c¹ì²óùØw³½i];u¶bx©S­{s]ëV|cãz-ZÚ*SŒ8¯¯¿œmʼÖ1³Æë|xœä`ÁÕí¶ë;:ín¸ˆþ­nvH4H¬â1 ’­çÁâ?ÒÒÊt®ë†PKËb‹Õú¶ÍáØÐ]O³Åò`só‡Lfs“ÃåÚr(ÏɤR¤S†…nƒÉt^&“ÚÄ0>wŸ”Lú·[­í2+ªÓév9ߣ®«!³9¦ŒÕ 1h¹€ƒìð»SÁ>þ»C"L¯„áõ­ÃÀ‰y~±ª0˜ |‹6¸cNÙ‘ÇH) !jÌfc °lëÖ]Ô×ßÉéã!Òø+^ÿçz‚ûxx(Dƒÿ!„ìx~ùM¯3ÿ¦Md€knY ¿ßÀŸ—¾¤*´¯s^<›/*ÊWöÝ1vñu¸'Ìaתå§ñ‡?rî£ Ùꇋ);ò.Ée³¶T29*“NOqû|+û"1*„Ð}••ÏDB¡Áææ‹ÕúŽÕnß×ÇGÊL:ý€Ùb¹FQmµ:.J$c dzò‹üÈ„dòšÝË=UUµÖT¯Èf«;ö­ÌåÆ¿;rÌiS‚Í Ý‹°Ã)x!¡Cy®-MP)óZ﬇5Gþ‰†-y¾uR>’]¾[+Ä£ R¾1ö”aÊtB±JÊõ5õõw²eË{L:Ž?®7P9·ý6úêm|ç[mb.½wVë*?úÞ:*¶üª“£…¢Üzk>“ãŠ+.dÅŠ¿·»æÆéýVÙìp©Bv#íßð¡ÿÀÞ´©+Ž• L2‘¨J%3D^/\BdœÏ«öî½!äˆÑ£ÿïpæ†Ã'Ç"‘e›íWN—ëÕh8|VáBJ©z|¾ÕBQ:»zý•ßQu&€®ë[Óéä_ç¼¼¯‚0ƒ‹<B2y½(Äû… †çþR]}ÛÄd²j~8|•CÓÚcíw8¯#¥€YïílªN$fn%“ðbúô» m‚‚·ùͪà:IÅþ¾á„¢†õ`nƒ”Ç|‡¨ìÈËtBQ·nÝý˾ø›áë¸ëÿN⪿Ýé<|ç£KØýÊo©¯¿“gÔ:ͳkÕí¼÷Ü­AvƒÊw¾se»>ë¹ü¦×[玾u;o>°|ѱˆPïZ!êïÄàþÛ 5ËÇ‘§S)o"ŸQ*MšN¥|á@à‹ŠªîñUV>Ôm‘>D¦%b±O †7¼••ÿBHÈ+£…ƒÁÅ••Otc0™<.·ç[JI±)e³Ôµ]º”ÑŽý»CŠ_Q”™9-÷´„:Úqe2–‹7¿}¡’¯ÊÖJZU“&M³ö´;‘S”ŒA×ÛUW“ŠÁôáˆ"koƒžåÇ•`¾Sab¡é{ Róï‰òÖz™NH)ë„Ëæß´ €óÎ[Òz¯èp#Më)òßy`dû9"Mëˆ4­EˆåídX׳a§Â/~¿HÓZ]Ñ^ÖõÍ–5Á—Ãà6àÿv;|b,߃S3ü(’ˆÅNóúý¹lÖ ‡çJ0ùüþgMËj‡ËõÆ‘8qÈçškÙìJ§ÛýªB¶8p¡ÑdÚæòx6Ùl¶W£áð N·»ðQ.“ …Zš¿ít{.6Œ—!T!„_¨ÿ!ª\©ä–0Œ5 •MÒ`dýØq™9ïíl€f.”Y퉎N “_M÷éohë: mØrÒ[à['ÂŸÈ ¬ÝXØb?¦;eG~ BŒN‘R>;жôúf~¹lñççpò-ÿâSŸªý%xî%×SWw5 ?ÿ>ùÉsyü¦¶‚)ñw–ØS”amKƒ;y!ã?ýk¤uc‹®åò›no}9Øü§ë_=‚/}¦AÊ–Z!î¾"Àr6\¾~9ÐvkJkeێד‰ÄI«u[*‘s¨kÝ=¦DªÔ uÝ`µÛ÷…ZZ&v5@×u- üÕbµ®6š-§e’¢¨¥ÀÞç‡"¬B`Ð¥<À œ{«²’ÊXtÄ„@À}$ó$à b¥mAXÿ ü3Úá|O¾²&¨š®pÈ’µÇ+‡ £áÞQìgË-ö²#?!,ÀWo9!ÄT)å Öð–RÖ]zé¹ ¿ÿýkjêëï$óÁß·+`ò ù€äçŸ_Ocã+ì*IoëXϼÈîù9—ß´XGÍÂÙìZµ÷¤ëyÍíì}a9ɘì¨F3øp`tÂeãá®Ã(:@–|OÄc±9Ÿo@&•m±ÙšúéJA?@:\®•±H¤òÅJ„¢ôXÙ-•LîK%“} –k‡Ãáši±Z¿ppßÞ+÷ïÝ{Xó Áüÿ Q€¯«û2¯¼ÖíN»„Ð6øÓøo ý2pàwðD¬ðBó,4~2•m"ßI Þ²#oÏ#pëç`±šß±8¼:äŽÕóËŽüØppsÉõ•µ|ðÙEUU¾UžS¦ÔT.ÊG•Ù¬¬kK%몖yWuϯºêãŒ]òevWM+d9 IDAT,)Þ4+ñR¤Ü]+ÄýÀ¸> Ÿ¹ îh»Ž%&“ig$šîòx6ÙŽõТ䤮«¹\®Úd6÷‹†ÃéÜjiYàõûŸO%“n÷J€X$r–×ï ;XÇœÅ0­+'žƒ-ÛáG«á5'˜çÁüQðMü¥ýx `z–Ÿ pòføg¬dWâmˆí‡ÕÕPM/Às¯Ãã¥ÞØ©­ð­à´m±?v¬¶ØËÁnÇ‘¯u]ÔåÕ€Óå¥**Bˆº±‹¯[öµ/Ìâ7?ü>ÕŸú>𩽶{¤i“äË|õòY­Î¼äùT´úú;ùÅ}¯âš8-´–½¯¶ªÈ õæVˆM€¢Cóï`Ñ`ˆ9VQë-\¨(J\5jšæÒ²Ù‰.¯÷±Ã© ÖñhtB:žªªêA¤4ær¹jƒÑ¸Ïíõ®ï}t÷¤TF§Ó R™V”ìA“)íWäû÷í¹p0¯ÈÍyÕ“a’ÆWÀÅF8¥´OÞº>ձɠêBø‡í¶âÓðÒ¸{llÔŽ.¤V}`¨Ûæò*¼W®…o;à …ËõÀ¼c±Å^väÇ!Ä$ò:ÆE‰ÊURÊÅhÒ!!„¨©©™½jÕª;¹äsKy×|=]jYsãôV-÷st/ûÞ…[>Âá°µJ´–òÎ_¾ÖØüæSƒÖ‰©âaòùä„e¿Ë«¿ 8Ç*j=™Hœàñù^ʤÓ.£Ñ— BÀ"ßQX-ç²Y›P”œªª™@só¹ŸoÕ‘Ôù²YëéÑè©Å댢$_ðxÞ€¡åÈ¿×úàË=õy>u?¼ÖÕ½oÀåUð†§ß‡[~ÖVå«Ì!2¬ŸÍG±/4}·AÊíç–˘#¤”ÛÉË~Y$„¸x ì9T¤”ë—Ö×ßÉ»æë oZÞªWÊØÅ×µÃm~f¿ú|‡ÃÆõ0µs⑦u¬¹qúpâ~TüÁWZ BÃx4:Ïãó½ùºÜBQ4EQr&“i{,™ÚßÏ3‰¢°ŒÛë}>,ìëØ®„­"µºnŠ2¦N¹!H>ÖC>w¬ëî^³Fÿ_ öAr[>ª¸Bþ^­Ó{Ó”ù±å‡@éÿO…GV ê"¥¼«®îŽ|­óÞË®•Ë×Ü8½~çcKZúØE×R_Ë–--ä¿Âõ0µ+¢²iÅ6®XR7˜·Ó;Ò å:à9Æ]ç °IÇ„p p†ÍnïrkÛármËf2ãt]?j±6ªªfŒFãžx4Úeäz)ãR)ï١ЩÞl¶]–UÓÚý Ø5­s·f³bA$2Ý3ˆã†Tpôt_‚èiÕЇï{Ò½õ)Ó3Â+1øCáÒÜz´ŸYväÇ)eŒ¼&o‘‰À×Ȝå~תۉ4­cìâëj¤”u»×­»V.Ÿ±æÆéõknœ^Ÿ×`¿“úú;¹ûîG ïXÇþç–°æÆé÷l\±¤>´}­RÖô9 ZWåUÐ9,ÿ8#Jù¤”‹Ív »>.¯÷ßá@à©ëGm%çt»7§S©©¹\®Û<éq©”wj"1ŬëÖYÑèôq©”À$¥êÍå\ûM¥*)€;•Rüñ¸j×u×…pš{:ó,dåBX>ÝÊ+Tôë‰ ô˜!P¦oü ~®·)A~°Vˆÿ>šÏ+Ÿ‘c„x‰¶ÜÌ0MJ9hÏæJBÔ47?·êÍ7·Q_«V½2w)›Z!Ög쀥ÂóiÏÑ:#G£ã#¡Ð*ªª®ë- íÀ¾}×I]Q=zôýõüŽ„ƒÁ3±Ø Õ£G_Ññ¼¼"›µÍŒF§‹’…‰5‚vMs©Rvé˜5!²§k¬nµ]P¹oÏMæD"˜€ðáU½«Aƒ€ÓÀ3¦O„kL%9ÞYxw9\Ú±>x Œºþ.ÀYÚžƒ­Axì¼þ¼µú¬ŠW¦g>Œj;N}˜q´*¤•WäÇ™sú2mg(òµm‡RÊÆ•+_i,¦› Cn)þ0Ž«_@"g¥S)O<½Äh2=Ñ—¨t·×û')eE&vÅ"‘)‘PhFO«çÃÁíõ®WTõ`KËù‰Xll8œ™I§]£15Â¥ýW.çëΉ¨R­]ØyV'ð:„à·ïaÚÿ£×ÀO_ Œú*|âø[G'°nû1Üy/¼\vâýËýðd6¯¿0 øß£õ¬²#¤”/÷—4]$„¸²»þƒK/­­‡|n€Í9Ö< ¼`„ÙŸ*”‰ʤS)OààÁ ¤”F»Ã±9•LNRTõ}uuŸ"óÍKÐæt.†ÃçªCÔbµ¾ ‡g‡ƒÁþø‘Ÿï7RÓ|RJÕîp¼›L$¦[ZHàu‡c[FQRGú¼ÿ4ìê{:¯ÂÛ@§ž&L†Û?ÿù¬?àéØOBè>ø×11v˜²%¯RøVÑSÿÃ¥ìÈŽ¯Ð¾šÖ/…“ʘCAJÙø™Ï|ûi€lèsDññ@ƒ”:%â>cà›ö!éFçù*+Ÿ4šL-™LÆçöz_uºÝÿ ƒ§÷e¼¦i&-›­¬¨ªzØj³íÏd2~OEÅjEQñhtB?Úy†Ĉûlvû®\.gw{½ë­6Û[á`ðô´¢hoÚíïʶ/ÍC&#DòñÂKÚ`ÇÆKàWtâžkaIÿYU¦#ÿ€7’mEf<ÀQ‰ *;òBJ ÿ¨t‹ý~‘/Ÿ9èyà§Î»ôÒÚÆ|äì!DÍ@ÛsŒ¹Ÿ| wT˜ø)øìÛsØd3»ªª-š¦ÙÒ©Ôäx,6Öl±u]ï1JºH<9Éît¾ hn>W×4 œn÷Û™tº×hó¾I§]ƒa?@°¥åÜt29>‹µX­ÍE;MRº’$Í ‘Ým6¿·Én{«Í¶%h0t)l”Òì¤n¹êL…X#Áÿïʼòd™£ÄZø™„ânÑÕµBœÜßÏ(;ò¤P<å¶’¦yô,Ø0¨xðÁgÙl–E 7<2жK «ò¯¯+àúiÐ)2z(Ë努ÆÌK³®i>›ÍvHu×u]·ŒÆ€–ËÉe³cÓ…¨qŽ`…ÜÁNgÑNƒÑ¸;—ËÍe³•FP*3ǤdrLÇqiEI¼ìv¿±Ùnß·ÏlŽì°Xë]®mÛ¬Ö­û PæÂhç ßa¹NpĉJÑ;?é ™W•lE€:qd` $/þ¬(\È×oèWÊŽ|àù&°±äúF!ÄÜî:>Noü¿ÿ»Õ'„¨Éä¤|x@€ûCG1åhbµÙög³ÙÑ¡@`¡"™Éd\RJA!=«7,6Û»±px:€Åj}ÈM¦H&“qŠ~8·°Ùí{³™Ì8UU£BQ"s †–š`ðŒ3²Ù)§ÅbÓíšÖéeêm»}{² U¸&«µ%l0´tl> ç,3/ƒ™§ ´‡áÝðͧ¬·À/àÌ=ðM öw“ƒ­»à‚ ¼\l—yŽZ¶A™<ÿ€;u(¦qžW+Äùý9Ù‘0RÊpmÚÈò[ì}.Å8R6ÃTÆoPÐpÀe5C´V³Á`x? ÍðùýÏù*+Ÿ6™L‘@sóN·»7%0,Vk‹¦ë®D,6Öév¿å«¬|FÓ4s4^èñù^î}†>!U …ƒÁÓíNçNŸßÿœK×í{R©³ªÆ.ϵsBdšÆn+ÕµÁnn 3Øàuª~ 6n…Çv÷%Þ…«~¿ @î—ð·Há³”&h¸ þ¾šo/†á^ ‰7aé³°{ >Ãpb$¶WöüY­ývŒSv䃀Bñ”o—4M¥ý½Ì ¤AÊ&Úê“NƒÚ´çpqy< C(ØÜ¼(ØÜ¼0,p{½+‹Ûå}œãåd"1«0GM,>C"A?m­hšæWU5\|ÆdòôÑ&Ó«ÆB½ôŽä„èQŸ=£(ZO÷²0h3ÑnƒGo…ÅwÁêÒöP¾ÀO+´UðJñ:Úà–‡àChK*s”¹þ–kûÛœD?VÀ,;òÁÃÏU%×W !>=PÆ”é37SØ23ÃâKòqC›Ã±Ûë÷¯òúýÏ{ýþUƒ¡[±®ˆ„Bó¼ÿ,ÌÑèõûŸGˆl6“é—¥X$2Õd2íp¸\ÛŠÏk±l0ôà¬Íºn5JÙíwœ;—ëÕ¶l‡3åÁFGá€}°³ôZÂû[ºPl[ ŽÊ=4M%:@}­ÞneG>H(Å\„Jš7´Îˇ RF€VEµñð-Ó0ûw•I§]Š EUÛå4{|¾£‘ÈGDëºnÈd2.×–Òöõ.×;¯9on±ÙÞ}ßdÚ“¢Ýóˆé±ØØ®æ´iš±*“ѱ=™ h‚­àõw‡ HÊع¾×¿ Á]àî¶©Lž¿ÁºÈRþUñ}ÚÞÔFBœ#¥ì6p§ÌÀÑ ¥^+ÄW)TGóÃWÆÃ“;á¸ÿ{…ƒÁËuM tY—\J©fÒéOh¹ÜªÁpÈ•µ‚ÍÍ×I)]ªª>×[ßÝfsKGGàÏf«Ï …ª2Š’R¥4¨Rv)¢’"5N‹‹m³áÜUp_ñÚ †Ið!3}æ¬öîÙ}sðàÁãnûÿßðÞ)ð'|übí«a|MÙ‘Nê€K ׳€?!.‘Ã04|(Ð åÊZ!>¦€ÿ|¸ú·ù¸‡ãŠ\6kE"³!4]ÓÆzýþ›»ëïñù^Îe³ ¶´|Â`0ì„ÙjÝjµÙº\DÃá´\Σټ[êúH_UU¯Å`'Åãã{è"LºÞ£þ»QJS®Ã¹± &_S…­—Â|µDîTW¨‡ŠdÅgŸ|Ú¬ †®u‰Ü¡çômº®íCô_@àƦª†ÉBQ¦ pªªaÁ˜±N³Y×ïy¯éí6®¿Y ÷,Î IWå77Hîm\w”ù DJ)…K€I´©7}øCH0fòuà|Àä„%óá/kú°R*$âñQédrš§¢â!„žËf­¹Lf²¢(=®´E [l¶M6»}@$:-›ÉT¹<ž7Jû››š,–íN·ûE€p08Ëb±T†UPÎPBJ™.¤½#ø¶âsdR™^hr+ðkæ¹ðý6©_I'“'xýþÆD<>&ØÜ¼PJ©TTW?Dæw7& Î2›ÍÛ2éô¸ÂõLƒÑج뺭4¢=Ÿh¶X¶ÙŽ]º¦#¡Ð©n¯wƒPÕH*™¬ìÉ®1é´§*“ÙOSèVب¨€ù^˜+:ä•Ç`{O“U9Æb±}@"·[~³ìÄ»G—2 µÜŸN¥~ 1~ܤ)ƒú|ÿpÙwÑ–ÞøåZ!»b`Ù‘b 5Ê/¤}êÈÝBˆ Iezç& éh&8{ |b`Íér¹œUQ”@&•š*„ÐUÍ !¤è¢W]×6§s{QÝîtnN§R“íN盉xüÄb?-—«°9»¡м\6; Àåñ¼–J&§ôdÛ>“)6Ú­Š[ŒÆo8 í¶®5!rûM¦½a“9¬—(*`Ð!¶Á^w‡ÍSÁ]ü¹¢²ê³,‘Ec·ëRv™ó^¦=ÑHè]×^0˜LŸt¹\J°uVASª-¶¤ ¸âpç*;òAŽ”òUòiiÅ/#3ð„bÎÀYU¦;¤ ׯ+á[s SšÓPC¡É‚¹×ïÎb³½ ‡go÷2V–ü¬H]7ˆ.rÀsÙ¬MËåÆår¹)RJ!¥TéE”EB®w¹¶F †€}‡Å²}ƒÓÙtÀdНs¹¶„ †N noÙíïä„ÈÍ´ÌFDÃ_.7¹N7@ŸKMZaâUðéKáäàc߯ ¾2lªj˜ kÚ†t*1$Ê£’ÉÔß¼ÕÕ'öÖ(² î,¹üú᪽•ù@Jù0íõÝÀ3Bˆþ¬÷\¦ŸhÈÿ½þ À1?Û0¤QU5£ëº NLÆã3.×뺦õXFÓ`04GÃá‘Ò˜ˆÇGÇ£ÑiR×mñXì4»Ã±¹ØÏh2íF"Ó FcÂ_]ýG›Ýþ¤BFB¡Ù6»}sOÏÐA®w:·np:7nµÙ–Þ‹«j»¶&„vÐdŠOÇç(RÇ éØ4mŒ‡,`cƒi'§=0[—uœn2™ŒBQ§èz®S‘–2=“NÆwHȘM–~¯6x6fà?…Ë Àa‰€•ùAJùCàÖ’&yg>³›!e–ÿ˜áœ/äƒZ†4v‡cCààÁóMfóA¯ßÿ|6“q…»¼Þ»ãt»ßÊår~£É´Íf·ïu8ï(Š5 ûKÓÑìNg“–Íú#¡Ð )¥°9ï…¹Š¢ÄMfsŸ¢y5!dÀhìAžPÕv…[ÒŠ’˜LVØ5mtk£ÙAP¦@¶^Ü n‚ÇbðV_l©†¹þªª‘‚|ª[N˽חqeÚÐ¥ÌIä^Õ Žh{Ž»Û¯Êkk£úT9j}!¥üŠÈo½ƒ?|À¿„‹ zíe R6× q-a˜*øÖ°ú•.*S ÌKÀh2= …féºnS †_eå½óVT¬ŽÇbcƒÍÍ „9›Ãñ¦ÉlŽtì穨X“ˆÇG…sÝf·o2[,Ý6é3-C¼Â`8h”Ò$@DU5’V”lLUwšzØF× ú4ÜÓ!*}ýgàÔ©½Ä>¤`ŸMÓ,Åk!Å K1Ëf2öD<~‚ªªQ»Ã±]ôA{þ˜#‘B·‹Î‡`Í×`“¦3€ÊeG>ÄRþ¯B¥Mp¿xN±HJ¹±‡¡eŽ1 R>T+Ä_O p~¾ÿ \=Ðv Š¢äÜ>_Ÿª¢•bw8vÙŽ^ψmvû^›Ý~HõÐ{#j0¤×»\¢Ë®ªzlº$=&“9ͤå:­‚ކǺJ-{Þ¸&z ÓÑV v¼ÿz Þ¡(lý÷1ú•p 0G‚bw86å²Yg0Xl±XÞ.–9¶ì‡;FÃm…ËorˆŽü¸}Ë9ι–|êB?yg~\ž# q®£m‹½ær¸h€í)SÂN§ëý7FŽêI.!ûdA¦+vC'‘ B?†OÁ ÞFE"S Fc³Çç[›N§«LK‹Ïï6•J¤ëzyq7üžÕ`Gár~­ e|Ù‘A ênW+J𫀕Bˆ“ƪ2]Ñ åAJt®«á;§CyÑeŽ-ºè¼í­C<ÕC´|¤‹jb ‘ïÓl6;Òît6išfBdC--çX­Öñhtò@Û7É€ÞÒ¾¸Í7eüø¯Lg Îü*Jt jàßBˆsƪ2]Ñ å_‡¸ÎéO¡½˜–xüž!MºâÇU ]¶¹ žb YWŒÌÿ[k‡æÿ‚.«­ FTUÍh¹œËh2m0Q]×»|í¡Â£ð¨^РΫbb_Ç–ÿña¤”:yûKš+ÈÀ•à×ͯ[þù¼ÐÏ£Ký €@ŒDÊCŽvXtÝpf$2íŒHdòi±Ø¸ Éd…̉D¦ÖìÛwñ¤@³Š®µ“½>ØÕ|#À4:m} 0Ÿ _ºΟ‡­Òu´ÍårÖ\6kM§RgRЈÇbÓ­6Û»lÞ°%Ùh!m•¼6Ãú:¶ìȇ8g¾¸½¤ÙD¾ÈJÝ@ØT¦3·ØGÀwgæcŽˆL&ó€ØÌVky˾ ¦&#ç‡B·ž ýzq pÇGZZ~xf8|âÉñøù)«TM)ÛEm{aÎup~e‰,ë<¨¸¾`o7pÖçàS^ÌfP¡išI×uO88!¨1b…Ëãy=‰LÊe³S2ét§†2ÇŽð(m{C_èk*Z9°á8@æ¿€®Bl~BÛ Ú2!ÄàJ)åqUt`(Ò åƒµB\ \"À½¾ÿZ‰ Ü዆7;ùª˜V‹mQ:•úK/C†¾lÖWzmÔõŽí“R)ES >ƒ¦u™æVg]s3°_³±ªo1ØšbP¥s%âñÑ©dòdOEųB=œ)óÕ·0ûüÕÕŒF"Ó‚-- ¼ÿ¦ iÛ2G—a÷Xg‚¹äb½+¯È#¤”?'ŸßZ*Šqð¬¢Ï²“eŽ*¥[ì¼2/¿{ØØ»w¯¦ék FãEV«cj?Ø8$9;š¾tÏžŒK¥Ú­–ݹ\»U¦³7›µï¨¬'¸‰5_Ù¬Ów¢Õ £úêÄÞ€5‡ýAŽá`ðŒ\6ë÷ùýÏ*Š’B螊Šÿx+*^ðVT¼àp¹¶8]®wíNç†ÀÁƒÿ•ÉdÊçå@)¹üb_Æ”ùq†”òo@ í…GÎ^B Û/ùÁBƒ”(É%¯€Úÿ†ÓŽdÎæû~  @±Ùmÿçtºç©Cùáðɳ#‘›ìš6û¢ƒ5/>À$¥âÍå:ét3¿½ÛësÐîÐÐr›\¹ìLœ`Íÿ-é{q?4®‚_oƒ‡[à¥0¼ºöõÓGë3RJ¡åræÒ¶`só¢ÀÁƒ6[,;]Ïë}™Çd2E}••O%¢ÑÓ‚ÍÍ‹±Ø˜Òû¹\nОÿ<Oɶ¬ˆKj…pô6¦¼µ~"¥\+„˜< ÓѦw柕R>=pÖ•iò‘Z!n¾ N€_n…¿ ¡Ã™oÿÞ½ûÏOì6Ç÷¸ÌËWfÓ›zN{;›Ín×u=Ö¿Ÿ`p1!­ž‰|]ÉB•²b^8üÓñÙìj*uªI×}ÇÌÙ³gÆÔ@@‹™L‘1mÅ_0À4+ØRðb_ö•ðÒ°²py蓳ìOr¹œ5 }@"!%¥kš×`2íJ%Èe³çº}¾oX¬Öƒ½ÏÔOEÅêý{öÔ¥R©ÏŒÆ¯Ç£ÑY!E‰êšæQT5êöz_9Ÿi8³’IxÊ“×þÿ$ð»žÆ”ùqŠ”r‡b>ð0°¸Ðìþ)„ø)ð)e·å'Ëu¾œ ÌS`Ô‡á'ïÂRí0Ï%·½õÖ?&Lž¶Ïáv}Ob”"”S£rŠÁØcM“ã‚»@(hðÇÛj£0ŒJ$jzçI&UO2Ù)hMB¬¯¥pÆøþûW¥S)¯Çç{Éh4¾u$N¼ˆÛë}Íh2m2ñ`só¢`sóÂl6k·9»5MóôÇç(Óž¿Ã+%Ï©¢G¡žòŠü8§°êþ¢b5y-ߢÈÅ\`ƒb©”òÁ3pÓ å®Ú|¾ÿ“€ðÀõëÀˇ;g"Nl¿q;p»ÉdRýÕÕTÕtÜŸi×Γç†õâ0(:ìi¿:àÔb›чáÏÛ pÈÉ%STpÏÿšBã±&N²ÚlÛ!_i.›ÉŒ/)4Ó/Qó™tÚ©(JÀd6ïH§R'dR)éê¼Lÿ¢ŒÂßU+Äïê$øùépÑ«}ö#!“Éh{wíÚväV æA®+'.!ƒ‡Ã°Ñ ^,2ÜŽý¸^†çgBÂs¨[àÉ¢ø ¼ùu˜o‚Q:Äšà™µ…]•Àj³5%‰É&³yC&v+ŠRZòµ_¾ßMfs$º —!²RæË³"eyW÷(±=®'ïÈ/¯bYC^ѳeG>ŒR¾-„˜ üøŸ’[Wó…Ÿ.WP–óÅ øÀÏ߆%É7®® IDAT~ZQ æBÅ)ù/½vè°÷¸â h*¶™aÅ—áªJø¥}8Ï„ý˜ óá¤aSiŸȵðø(¨~ÞCîè}ªÞ1™ÍáX4Z‘Édœ&³9l2›×@>ZÝîtr•ºîPT5šŒÇGÚÎv§s@$ša2›wô×3Ê´g ì™ kMùXšñÀ"Ú+ÛQväà )e ¸Vñ/à xÆ5X'„ø>ðÓr ܱ£AJ½VˆÏ€‘&˜ûøÊoágmÛ`æ«pi%\ªÂDºLÑÙ µ¥N òÇpçM0ÇÒAju$Ô5ÀWsðNö|â…Í¥}VÂòÿ ìÇ+‘`ð|ƒÁ°Ð¥”V)¥±«šï‡‹Ûë]g¦R©©rRJ³®ëgeåcG:÷¸TÊçÌålB©¾ÓbiI¨j§ŠtÑ<2"ïÈ!¿½Þ¥#/o‹ S¤”À(®°7“?;ÿÀ€6Lir?ði «p\õ©üx™nðBNéΉëÐò;XÛÝøxª«vÜ&˜ë€WÀèþ²÷hÅæø««ôTT¬öTT¬ñúýÏM¦¦X4:©?Ÿãöz_óVT¼PxÆ*·×ût(8ûHç™ÉøGd2£«Óé1£ÒéqUe!šVžƒ§e›À×µ¢ëâHeG>Œ‘Rî$/x3íK6N'_Eí!DwšÒeú™)_¾S¸ãàÇó‡€#(Ô|:e·híE‘:íå>@vGþ‡ƒÁY6›­SîºÓí~'“JM‘º~ÔôÞ FcBUÕ`"Õ—þ–nju½] Ÿ]×ÍûˆaZh$3m/£~àô®ú•ù0GJ™“R~˜G~k·ˆ–o‹ü¶o™cÃÇ!|5nõ ‚\åÁHoÑéF˜ìëáøÐß:¢ bGžÉdœR×­›í@W÷]^ï¿C@§*mý‰Ëãy3•HÌ ÿ}Ñ-NM3O?3™fìðra²ã6upäM¡ª ¡_w† 1X]rùá®ú”y¤”ëÈGò~ (U«þ(„xFô’ËXæÈ)D¥~Ø`€S.k[¥—)a|g\{nŽÃã²$º¼€yiþe´'à ]•úMfàÕ0ü~7|ûx§ÿ-?rRɤ?ÀSQñŸîú †¤j0Œ„B3ަ-N·ûÅ`só‚tûÖûšf:=9É ¥Å‘ËyÏŠD¦{r9‹*¥˜šHT©Åøî\Î=!•ò© lÙ¬¡:Ušn㇣3ßÿ.¹ìÒ‘‹n¢ÙË c„c_ëp+4?“RF¹aÈZ!Î^¤PB3?º»u§áÎwánøR‡f­~þ X‘)-†Ñ„›àŒŽs4Áõ·Ã3ýaψѣ'TõW€T2yK,y­?æx÷î_*в«jÔ¨"³™Œ£yÿþ;íNgC_µÖÓžÛTU}«räÈßv¼7/>ÁÞA8F ‘ÓAvtâ¥ä„ÈFýUWéŠReʤ×Uíz`ãê~HÏJ|V)0 Ⱦ)ÛÉ.—Wäe:!¥Ü%¥¼¸ˆ6u!ÈÃ-¶ !¾*„° ˆÃ€)_¡¤Ä©þï³Ý¼—Éóüµ‹fÕ߸ Vß÷Ü œÏtåÄ5Ø÷pJF±HdJ¨¥å¡––ùÑpøD@óWWßÖÛ8£É³Øl·'‰ó#Áài¡––ù¡@`ž¦i¦ÞÆ ÞŠŠzM×'Å"‘©E;3é´`³Ý¾C¢]šžÒГ0Hiì¨XƒÐºßH’mÛëFòE±Ú1¨ùkŸ5>/ä†Ï ùÚåâÅö ŸOÛ7~VT÷4GòŸK…µøÜ Ÿ­ÑÞ>'n*¶¿ú9ñÑceÏÑFJùp2ð Úç4ûÉç¢oB\%„(§1¤¼‡| "€2~òßùLƒ2]pFIU¹Ž(Pa³0]tsn.Àv*T= `ss"멨xÑSQñŸ\6;Êæpܧ¨jŸRD]ÏZUU›ÌVë.OEŧÛýj$<;è/ÍVk‹ÑhüwÑN·Ï÷ŸD<~R4>!d0¤ßµÙ¶Š#¬o®Aê)ؘ†uÒƒ½œ“jG~4Øp¹¸²Õé~^üï@ÛÓ¯}N\Õú2ó9qmï#ú)eLJù5ò+˜Ž[Žc€;·„ŸB ËÈÒ£ÌwXN€ßœãئÿßÞ™‡IQ]ÿû=ÕÝÓ³/0 ›‚ âΦÆwQ£q!‰.Q“h‚…&+1¿Di4&úMLŒ ¸`4FcŒQ‰ûÊ (¨€¸² ³/=]ç÷Ç­ž®ééYÀaf`îû<õLWÕ­[·{fúÔ=÷œÏéqLƒïå$‹Ll =FÒ¶¢¬lTVvöòœ¼¼Ïª++÷Œ76f/ˆÇã…-'ZQVvtŸââÇÙ™[êëê c±Ü¢ââµ55·uÇ(/+›“—÷zN^Þ'uµµýPu ûôy³1Ç3Ö†Ã奡PÚ ¼Ž²Vn1®å^Ç"xƒädj×0ä*<‚Y«:-\vE4&î‹0§«îÛPÕ%ªz*&·95ÀfÆØ”ˆÈé]>¸]/øí¼€úwíkäu-À%pX?¸¾3ú Á¾—´Îè«3p]773;{£‰oݲå4€œ¼¼’šªªŽlq@ V_WWTUQqÞŒ6 nnllì”å1uݬ̬¬Í y5UUcÊ6o> ;7wYMUÕ^ùñx~‹ëÀ]ñv~þÒ— ß~?'gEm 6þfô팱„ŠX²˜ÏȈÈPÿùå]ô]Ù=âD6Ç\^ ·2¿Ó8oà° ¶È—""%“/.û¸#›%β•1–?_ã%eö’¦æ [ݺd¢êB@„Ú1sôÝÅ“d¸cÖ$–Λ‹Wò@ H«Á^Ë'HnC˜c]èïùßèûô“ĹUS$\±…1޲yô<]ÙÚñw/–Ôa¯„#ÉM3ÞD¿‹'Ë~£€BqY–ÑÀ¢ýçk§«#©ê‹9×3ß‘Ômsÿ‰È2à6`ž§$gù DUë#"gcÄ{F`Øið—Mpñfèõ XoÂòáðn4Õ¯ƒ×Ácƒáâ —æ²x5ÌR… Ü«|´x¢4¥¹”W0$ч:ÜÔÖq7ÎßP¦ûúžšhCœ#–O>%“äAQ–£<„ò^­ óæÒI’öóë Tõ)ÌzíD õËå ànàsù"2pG£·UÝ|/Z7ã.€™vòw{+ j6\Úïî¸í·ðƒ;à¿?‡ êà¥Ôk>‚+~ ×Eáî¥0Ù…Rý~õ ì°èîmÅqœªÚššþYuµµG$Š”TWVŽÎÎÍ]ÕÁnÄuÝ`Nnî‡ñP(ô@¼±±¸3ÊœˆãÔÖ×ÖöWDjûdf.:¾¬ìÐa••§S õ‹ÅZ¬Ço…6­O/#«ïåä¬I]Sw ¸?ø 8âr8öB_•ºÞÀÚ6ÖÉ{„!g’ åALT4@9ÐOàOíÃÉàzñžVÞB™ƒqGÖ)lºÑ`”©í"Ü ìN²nqH„Ùo_(;$ÿ±Þ<¤|×ÛýT…ÿ™a0&O¾ó}Ùab"ªêªê<`?L–µ)MŠ1k¼ŸŠÈ\iQqÊÒq¢ªgâI6fÁé—›¼ÿ^ÏJ¨™ —-ƒI7Áþ€¨Xæo«P÷¤Oºu,~Îú ®» ëÂa·K~QÑ»µ555Ô×÷é7`À=ùEEKËËÊ ƒ›ƒÁ`‡ªæ½V¶yó©ñx<\T\übn~þòÍ›6ž•½´ý«;FAQÑâÊŠŠSjª«¿48;{Íú††}2gk %b=Ay0ت|u «sœVߟ€èeBIÏÃ2…Ägv¢_®µGr 5Ÿ'ƒ.{ºöGèè'"à½\7zŽ>f®N3GÇ»õ å£çè1H2ÏTáÇc樌™£2v®¦ºš²–©p..ÃîïàPÖ84(Ã0kù€puGßK‚1sô(Ѥ …(W%Æ;úýwÉ…2óŰ`Ìpöû€ž€òSïØ>RÃ¥ÛzßmEUcªúW`8F€ãý”&!àB`¡ˆ¼&"çÛH÷í#ªúÆ âäÃ÷»uP=„•Pó¼z¼>öï7ÂÊ )Ko@éŸàé=Æí¡Oqñ ñÆÆü²ÒÒãÊJKLJ33×ä,ïèõ@ Á©®­®YVZzlyYَ㔂ÁN‹/ª®¬Ü3œ™¹8ÞØXPVZzܦòò£ ‚Áµ}ƒÁÏÛ¿:=íE¹ksYé]žZˆ×'kcáË`é)_¦£/î;hž–e%åH“QjÖy>Æ%“d!ÂË겈0/ž£Û[Îïê±h“ªÎ¤Ý(Qº_?(¹HîF½/YI¾ÇÎBóý¥oX¼’)Lúøâîìì{§Ã«g~p—ˆœ\ œNóÆ#½m£ˆ<‚YG«+Æ·«U}<"2¯:Z˜1ÖÎo®eñXËwƒ7B0×ÁNWª7¯ `˜¸ m¥®¶¶¯l-(*ò ÒÈ–ÒÒû„ÃÏÕ±©ëêëë÷îS\œèky¿úúüpMÍ>¨¶ê -llÌ£•Zî™® »nv[O½0 ­ÞÍ„¯{»‹¡‡r1iLÄ30…E] 8Üæº|Ùx(Ê¡" P¿x²\7öýó6«6³žm60®&Ç®eq}R5xH‹Æš\ß—mhpaOßçó]‘&»ÿÝ"«ªª//ˆÈpLèKU£þÞñ‹È*`ƨ¯ìòÁî„DUoˆì\†Âm_‡ ÿ³_ö»2OÚ§áâîGwQS]=¶Oqñs)‡5 ­­©®œ“ó•J²n-+;*¿°Ð¿~›Z{;äºâÆÆ¬â††¢þ ÍŠ«ô‰Åú÷oh(ݘ‘QE WUí©)ñº¾Ü •[ º5Û0²¾LV Û¥¨€U¾JA /tÏp­«°%ñÚQölz-7B£îׂ.#D¹ áAMj$‡Eùò ·¹Š×Ûõ-’](ùÌ{Ô˜ï)R|RnÚÈÚöðË>ªpCê&0w;úí4Tu•ª^©âu -ãÀ¸äg‰È["2E¤ë„~vb®&Y`%ç@¸ók` -MlÞ¸ñÜŒŒŒOÒË+(X^Y^~áWÑbß²iÓ)Á`pSkAs1lj¯ËȨZž›ûE£H³ïS9¨ªjßýª«äÅãUéßÐ{Dyù~y-*ÛUÀæO`Ã~pàYpå7LÙßf ÌKàšëáÒó`¿ð. úÍ–›› y˜‘cw<€*§/qƒ8ªœÚÑ_Ã;¤`Ü|-îð6–L’[®B1#¶ÿŽºT%dKDÙÆâ„G'ÈçÏ׸àŸ”ý*€¼L6Õ$þœ…}¸AœwÖpà[­ô×ä]R§ùxÅWÐA@ÇÌÑ_ûÏ/ú®ìN%»O›ý6ù?àDàŒ€GjnéaÞv«ˆ,þ üWU;¼&Ø[ˆªÆ#"ßÅDes`·£áþ\¸¸—iQ[ZR[S³[C}ý„̬¬Åm4 ÔÕÖž˜_X¸ÍË •ûÔ×Õ]’•ÝnÀe´&¨Êoi ƒê뇪¯šöB› ìLÜé ç»pÀC¾˜œ3`¼YÙ0l¶'¬¾™Ç7õxÞ„µÇoD=Í;.w©p9€ÀÏO’C"Ír”Ûî#ƒß”L’#€§>Á¥I*=…¼€>n²­ÂÔ’Ir"rff¾{ö: îä÷“i–]Ù²iÓ™ùEE/$ŒpMuõÇõuumª¿UlÝ:*+'çéD¼ªJYiéɹùùofør¼+ËË÷U× õíûrÓýJKƒáÌÌv£ÒÔ×ç­«öU#Ó²  Þ¼Ä2!è{%\¦ B¡¤¤¯OÉX؈% ¹`ja,ê†`콪d²,F9Ua“ó%À§n#ëÔ' ªfÝ÷M7h~±ân#ËƉ2¨ð¥OŒžÃ3<¼W¸žc29K]öViÊ]oø ¢-g3õ›ˆ…‡p€8ɪ`޲ .F7 <¨Êl5¹Ý^3‡;ý‚®cæêÿ•L’R³*åQGYsH(µ%ÝȪž ÇÔ…9[”½|ãy0yçûr€Ôp©§ì6Ø ð‘#LÀ Œ§¥öµc½m:Ð "ïa"8ßñ~.í U9U]-"×`pô¶DÊ_­ˆ,Æõ…ÀBUmuvôUˆª®ñóAAq*ÌŽÃäŒ.ƒefë–-_Ë/,\ …ªË6o Kó –»ñxNMuõ ìœœTqãñ"×ucÕ••{C¡­UÇôíßÿ©²ÒÒã3Âቆ±Ø ¢ââ[·˜“—÷QŸââçËJKOÈÌÊZ¦ï&ö®­Ý#5p ãÅÚf}¸ b à+â6ùéÐE» !¯ƒUÙÉÝ€E¶¹¥Gã•J=8ÕÛ:˜ÓˆY;ó÷÷UµUН8Î`ʾ¶Ç&šÏÚ©Qmë""û`Œù€FxÿŸpÑjZ—¶ìvd=òTÊJK+*.~`Óúõ—eç伓—·FUeë–-GõíÛ"5±¶¦f@<σõuuC ŠŠ–l)-=¹Oqñs[7o>²°oß×b 95ÕÕ# ŠŠ××ÕUlÝznAQÑ£ápyÙæÍã}³ô´ä56†ÇTVîR Ô•ïææ®,hlÌZW78»¥{¼4#cC\Dƒ…?¤(Ö°h·Ï?{8åÂ>ý\>‡Ýç‰ÿd€s ÞÕ‹wb—û8f˜™8ÜUÚcfäK:¼YõsÞv½ˆ Â,½œŠY?o­Bã¡…qÇ "ewxÚí+úŸÓ1CÞŒŸ)ÇÈ‚>†1îKTµ>ýåmUýÈ›™¿ôÂß„{‡K>¥ë Yºœ¦o¿îÞ²iÓé9yykc±lÇqÒþÞC¡PyC}ý W]7W]7 ®›ÓØØ˜©¾¥­`(T«žNzueåa€[W[;$#î§§2¬/ÉË[1®²r¿²`pë{¹¹ŸÆE´:ˆÕ ã**šil”ƒeïåä|1aƉ5ªùˆ ÅçÁØ@ËàØ6ÙN¿ ŠÂŸ ÃÈ*‡%‹áñmé§'ñ)¬–ÜÝzH°›ÅÒQTu-0˜-F¢p&6bœ·mæäyÛ˜t'Ed+°#…XÙÆV…qñ…1ÒÂaÌzô¶¦9‚©d6ÞÛªEäGª:{;ú"ªº""r°(Á¨sàî¿Ã÷>‡šíéÓÒ³ÉÌÊZQ±uë¨üÂÂ¥e¥¥Ç…22VTUTš_Tôzºk‚¡Pm¼±±_ (ƒ[â®›ÊÈø¸¦ªjoÇqšþNDÄUÕLUuúôë÷lMuõàp8\ÚP_Ÿ/"zଠë_+(Xsœ¸ÿøÖ`°Î‰;>ᘭ¡PÅa#3T‹jWLÔÓ¶ñÄðûÂQþypà0xæ“4×ü-X7>%rÝrw/’1êšÒ£‡ó23´]ù¿w.’=qvGZjþƳymÜÚ+kçv^|‰· "÷û8š÷ަáz[w À£ÀÏUõ+eDU—EDN^ú„`ì¹pç#pźô ÌÒ:Y99ëc[·—•–ÎÊúP]7¼eÓ¦SÂYYVAs ^¯*/?* }ދ庮›£®›QT\ܬÐL^aáke¥¥§C¡µáðÚªŠŠQ®ëæÿ¯£cL5â Dê2UsûÕ@ݘººfKФ[Ö-°p%,Ûå{Àá0>lj]´ŠÁ`ܽ͋ìTø"×÷ˆˆäZCîáºüÞ“ÛÒÕä܆rùÉ­ó”Çi+yî¡Zv6ZZÇ‹^_ìmwˆHS3}X+[¿.f:ÖTµ…VøöU]9x(̀þ w̃l‚írÝ[z.ù……ï¹ñx¨¦ºz˜ˆ4?/"mNH222*ûôë÷ŸÚššþ±††~9¹¹KC-¾û‚Á`]Ÿ~ýþSW[Û·¡¾~@VnŒŒN‰»ø43ó‹üx<'èºA€Š@ nyNÎVWÝÖuÁü‡}9äK <V^çåµKSŸ~º“Á¥D®ïg ùvPæZLr*/ÊÜ…ý¥¹ ©¥ ª1Ìï(­¨ŒˆäC1F}Æ…—äz?óÒìç`"g¼­SÄaì6ï] ¢ªÏnãu"ªúNDäTLŒA~yüy.\ik™ïz8@,7?›e޳²³7Ò‰GfVÖæÌ¬¬NÕ'ø"33±œÕÄû¹¹_|›ûÈþ¡ð1{T”ç¦^S >ܲ8 àþžšû:)çظ þûwø¨3Çß4‚_G£Ÿ5äÛGS9Î@€#FÍÖ÷J&ÉK$×9-; ªZM†¾£ˆH?:î…ùø%F_~‡¦ŽDUFDNžrÃpÌD¸í>øq=WgÀÒ»‰ƒ~YPPV7>´¾¹iKz©g>ÚX› {ø¯í F ÞÜcœ×­†üÝ‹d°g^s¿¾°x²œ#.ûˆðùè9:`éd90îr€:üsìÚTbÉd9å…=>Fxeìú”ÿ^‰>àŽL8\á› £çhZ‰ÁG'H`x&WábÒö„gPNC’ns^ÉD9³1μ`Ÿæ’Kd˜ÆøŽ ¢Äáý`œ9>¨šÚL’«UÉBX;fŽ>ðÎD9Èñ"œËCüñ¸û´nÕ WnáZoLËÇÌÑ'_$ã2I`(JØ(°Xü{Ôýú• #X:DGþŸJßwt¥ˆMTõõˆÈéÉÛœ0œp1üñ¸ºÚ—“k±ô4$Ísn¼PÝÅÿ¦{”!W‡j\nD]æ‘}QnD©Fbr@£2Y„©ÇŠXr‰j#óñd<ÁËÁP¦–L’ÇòЏpøí&G\&#œ\W™é5o5·sx˜¿¢\æƽ#(TÄá¦fï~@Ð!md(À’Ir¡Â_rŤ±‘w'Ê…£æê½¾¾…p,PÁ 2—ê`¢ Ó c¼¼Vµ…C3~<¹x²œ#ÊcM7•¦ñ¡.×·¶6>K§ÑÖÿS ð`ÖŽÊeo¨êË‘31u·³2áäËàÏÃ5`‡‹çô:|ëÓ*­EÓXÚ¢¸¦*«¨¶Öš[ó>f),mïfGx?Ÿq1׈ËõÞ¡2Ÿ‹r…Â-ì"®¤„t•ÇRÃÃUõÝeÄDUÿœ…g¸Ãpü0{_“géD6oذ^½™c0j3’º7sÌÖ­}sÓ¦SÏ(OÅÃe IDAT-=ñ´Í›Ç¬¯Ï߯ºzàù7~gä¦ÍCÂ1 ÄÝfxùpÐÉéJCß“$M–J& ;~ô=8:w'ÏØêQ†@i2^{—\*ýb_ÃÌ'kÔáˆå$šÊ|¾†ª¾s#\á«9 3W'»nê\ˆ<:AÒÉ.uÆŽž£{—86õd#\…ð ¯GÆŽà{¨ê¸9ºnÌ= @½rú˜9zÜØûuiº÷~ž¬ª0sÌ=iÌ\SÏÓô‹LÁ'ùYàºþâñiú,Ôr7ùPS_PÀ"Ìʼn?êÅõÜ2z®Þ5vŽN3GG†ëMÁË眔ýÇUõªÚna‰®"ªúFþ¶ cN‡‡l ÔÎ%‹5¨º«§MÍóÞÌÈêê³÷®­½fDMÍõûVWÿôપƒGWVžÙQ ØK­à]‡ ƒ¬0ÈaÐ÷8·8ùýØð`8å;ðµùžv4 Í5ç»ß‹$—6r¸HSõSzN9¢6“1xÆPCŽr¸ªçJVþ4"ás«7¹’]1ZÒÍÜÇ"É:ÝñæíL×./¥K!±žUÜ‹_9h¢éþÉq4ùZ¼1޼G+oÍ^9" Mnõ×QÞ¾{¡¦.¹ªï!H¸áo7rÂk%“¤ÝzÁ–¯†ˆ‚ùç:CUUÕ7»{LíU-Áh'$Jüžµí)t–V(Û\ú0&51#;'÷JGd§vén/ò.^·îÖÉëÖ]öòÅ„Tûû÷sâñˆìQÐÊØ »¾þ³<×=$”fÝ;ÐR”+›’f¹–®ÜÉkzš!÷¢©×€Y8 Ø0f®.Gx8P\Nõš×Åbâ|êë¦Ùj“šµÃ»O›µ¬Õ”Æ8¿d"·lÛ;jÁ'‰¡xrœnÀ7fM¶IxöS1ï;.¼‰šjoq‡ë|}7ò±èŠUuè¸| ájà!’¢ic,ÊÀ(U}º»²-DUWc”—äï÷}Ç”’µ|EÖñŧõµµpÄQØ·ßYYYCÛ»nWb@CCÞ97ÞvÝá}c±3/Y»ö¦Aõõù'”•Pm¦¤˜ G÷sÝ«ÖôéÛ˜“[º[ee~vÏ„£3ÚQmK¥>»f>ÑwaÎxqÑN¬è– ª'E­ûxØ“ƒí ü@\ÞTaÂ)^»7²§™1>¬Sæµd¢5z®¾¶d’œMr­oý˜‡4]ù¾6Ɉ39à?Àhà'K&Ég£çèmÛõΔÅßð^_´t²¼T'd†”ï$šÞà àÂ+×`– Îê³ê(i“ï•YÿF¢©ÛŒ”/¹PÆ÷Ëaá¨û4QYëö’Iò"p,ЇÄù*K–¶QÕõÝ=†í%ªº!"r,ðp¼@æð§‹aÆl#kù |¸ü½‡=fl ïˆ ÍÎÍ¿1+;ouܯV×]«éò«v!NY¹ò[a×Ý+±Ÿåºž]ZzWÜqbÙ±X‹¢GÙ±XÁi®`kVV¬ ¶¶Ÿo¶-a8B!ƒv¿×]¨½foÆ-иÊ,¹n³XNO¤4e¼GrW&“\ó6µÆáM«hÊ*KÎ@÷Ÿ¯U%å·^V@…WK&ÉJ|k|¢Lßžñ¸Aª.gÆ…EÀ…[K&Écæècí^œúÞBü^ù>ÐOaB\9.¤d’( |Ïfv¢}^õùò dÿùÚðÎYè„ñl9KÇÍ×r_Ë› âì[2IÞRá ”¡BS _‰5â–¶ˆªVx¢1ó€s@øíÐïopG7ogÇ}IÉõ#ö;àœÌœì)¢d‹##'8²»Ö,ºgà”> à&¿‚Âñx>ñ¶W- kk[Ö°€]r k8,4iÌ»k›/ t¿kšGkˆCNâgâ¸6oçæð{ J2ù?aÄ~>zl«_8nSšŽÌ]2QŽj粌¾O·:FÈ&!`ÓŸdŸEålq•ƒÐJr?ñYxF»I!µ¾p ¥pš(— M^ŒMWnë¸-½¨):økâX!\}ÌÈ𕵴lºrÅûmü|íwêêÿÖèÆ_Ñv–øvJsrâoí1ô+êq¡¼¨O F¡~)<ð üåã4¥IÚ†Úå;µÆæ%ì^f˜‘‰Jë¦Á¸L#@> ÞÞûõdv7͉Ôê2ÙÁ2Ï‹e'%"òCàOx³ñXø\¹ÚÔc·X¶‰a~(MzX<ú%üg+”À´L.‡ûÀ݇Ãñ¹p@-¬¹9‘¦ìq >®p¡n=¼ú0¼Qµ Ö8Ò¼ÏÞîÖ[,–V‰ˆœÌÅSÊj„^„Ëæn˜e§`?ÈCw‡CûÓ2féSøÉŸŒdpà ër¸7#%É…-Kàû/‡… C ÜêÙ0üeødË.hÀœ@“$÷ÝÖ[,–6‰ˆ‰hÏpaã‡ð£§| ‡‹Ÿñ°Ûéð¸ƒY LG <=Òj\œ CN1¥wÓÅfÄã°®Þº~ÖYcÞ™˜Ç 3Òß3m‹ÅbiŸ Üzúïs/2ÑíK v‡mq€-´Ømâ9ø¢‘–  ï¢l! þÜûRkÈ-K»x*p〷¼C»ÁWÂ/s’A7 YÉ"Q­ÒØŽºš6=Iw~—u·Gùv­!·X,#ªº£Mp_âX.L¼f}ºod–ž†$õ.Z¥Èn¥edÛ™qk/.½L1ävÜb±l3‘cjÜ\Xû>üèx¿{Gfé)ŒÂaÐoìÛŽÍ3ýçê^†³ÿåItûùü:¾›rØ­…jà½RxïøèÕŠÃìj\¿ÎI~>_³†Üb±l‘ã0®FóÀ¤üüb<Õ­³ô8BøZxU’bX¸Pú)üæX°bGA¿“áºøVjõðæ/ࢮuÏe ÜžIS ’½­!·X:À "5pib_൙ªËºsL=ˆÈPàÀ˜Ä±J¸o6Ü\ËW®hÙ…¸n͆Ó[9s¡¼­¹O`ÊŸáÙ3º‹k`N†)0PÐ#”Ý,–î "2¸ód»&@ç U ¹0ïfÕj€ZÈþ’¸VáZ Ë ùõ"Å!/¨b·ª~ÙÕcðUý4"rpž«/.ù>Œü\óAš<_Kïãpb6œÖF“P{Qîàì ü·zýì3`¤¾꣪6ØÍÒ+™nTËV?Áke{©Ñ©¿Óñ• í)àvÖ¸°&”TvêV¢ªµQÕ €i€ GžŸ½¢0ˆ¥uÎ}ö‚ßóõú3á„i0¥“†µÓ2òIÚ¥` !Xz!‘©j*zeµÓ´ +Ƴ«U½Sf· CFÁ#¶=³ìâ3¥ýÿµQ?8uF_;+cL´"+à °†ÜÒ˘*ò5à&ÿ15•NU€ý&<ßMCÜ©‰ª>‹Y»{@ k0üñp­ Ö;Y ¿R¨HìÇá³·à¬ÏáúF_¥GñZxv\P•”!`+ÜóBj‘ïÊùâQ€×ÁK±Xz b\é~“‡?‰óµ© ÝzààÑi"_ïHŸSEv|R‘qøÍ-ªËû‘ß̉}7ªz“ïÚ.ÎÃTjÊWØâÀ ‹\øçͪoEDN.ŽðÝz`Däaß{{h¦ê?û׊†aªÍê}1Ëœ©Ú"²<"2æí.ʆ?Ô Í“Æ Lœi u›DUWEDÀ‹>·+®„_È;½4e¨·ò0¼çÂŇÀìzx{>D–ÃþÁ7aù1ðoûZxþWIú;Sá£þ0µ^øü¡ëßAÏ"«¹ý` ¹¥ÉãúMÐLõñfÌRýOGú À@…o'öC¦ž÷r_““ýׅx "=Í—ØxýÕÞ“0£¦¶7¾{xäù©Ñ>ÿ'À4‘S2`¶šëý ði"É)3TýêX§â‰t(dÖÂP…ûúï°{4ªZ9ø%ðk@2àÈà©}àçYG¯b>¼¿Î| 6øƒÕž…5GC­ßõ^NórÕ7Ãìóá­°ª¦—gBdA {»k£ªŸuuYz‡Ó|6¾ ªúEgß$ÞÁ/›=M*Žßˆ/“—ý°e{ïÿs‘ÝæÓ܈¿!Ðá.ðÃjøak}œà7âÛCTU£ª¿Á< ¬õú-Üþ|üf`'­›Zv^‚õ©çõàÆásÿ±Í°:õÚGaÅfˆíè1ötŽƒ‘bj‘ƒçVkÈ-½ˆÔÙ©ÀÊq§ƒ†\›KTþ+ª:f¦ê„¨êÑk ¿À×Õ›¹fÃì <é»f{&61|Äa&É@½¸‡DU,3×7Õo¸áZñ?y˜ µ«ŽR¸HÒ(pu„¨ês˜YÄ?ÇràÛÀ?Nƒ¶§OˮØ]ÕÂóµðÂø¬»ÇÔSØü;£Ésa]ë–^ƒ9þé€Â†qõR°:0žßxÆN™ƒ—~¯ú¹çîoZž¡ZTEDü…$b7©~’æþMËOܤúÀª±i"÷HR«(Å”‹L7¾ónRM¤¸½ž®MG‰ªnΉˆ\üÈÀžÁü!ð‡ûáÞ†~n–]‹?š€¶ÇÚmh!'Íú8XCné]¤Š“ìÑ-£Hâ7ŽƒæˆÈÌ?霨êãÛÒáµ"…I±N‰ˆ¬Oì§)f1‚ô†|ψwQÕ»""/ó0ÕÔ‚E0õJ8æU˜ööz¸²Xv2’ëõÀâÄqëZ·ô&R]vû툛HËäŒtífª¾ DiéŠß 8x,"r×¶Ü;Ð2Ç6Ïë/±õO9ßÚÃÌÇÛrßm!ªú!&ú~I™Ã‡§.HêG[,‡Â€ ñvGUëç¬!·ô²`!Pë;tôt‘Q_µ_7%€G!œÒdpk×FU§\ÈÁ7£jCP’ØqM>¸ŸŸ*Æê ì¬È†ßÔÀ…$×Ëo Áï§‹|äy ò:ò¾ºš¨ê½‘W0p‡bá~rS¿x±±±Xº‚ÍÅ îL=o×È-½Ž¨êßSálU;M;ìÖõ¤_kS«À€%è"KŒš›ßˆÇ®¸Ñ¤n0KõßÀßÛêh†j•±™ßá Cï7âéa3]o¦qFýÎÁ¡‡ÁSWÀU…ɇ/‹¥W0úe Þîà‰Ô6vFné•ܤúâ÷Eö/„³0Sö¯¹šzäOܬڔ§YuY&8,Á›þþfª¾ð;àJ’D­Çž‡Y´Ô°Xv2À™Ï{ëã.0<ªÚBaÑr‹ÅÒ㉈†Yl’¨taó¸i´¨äf±ì L€c†ÁÝÞ§¥kg×È-K'ªº7/Šß¾á–kàÞcº_¥ÏbétÚ rK`gä‹e§""2ø3& …º­pÇ#pO4¶~µÅ²sp2ŒcÊ0• ‡F[)¹l ¹Å’ÂOEŠÄ'â†üAa–žADä™.’¶´j*QÕò¨êUÀ‘ÀRï°äÀw΂g&úÜïËÎÀ~Pئù]å/’kÈ-K@LýP`¨¶Qh&QÕ·03˜žä¬ŃàÖkᑳ’³‹¥Gs"L£úðpTµÝ‡ZkÈ-–>†Û²!+±EU+»{L–ö‰ª6FUgÏ$އ`ôHxðj¸ãxسûFh±´ÍY0.ÎñvË1ÎíbƒÝ,ÝÆ4‘cöSht`™À³7©¶N.rº¯ªØú¨ê‘‘ÀÀ(…xÀ¯„6Uä[‰Êc Ÿyò¦©ý^®žj’ïܤºhªÈÁŽqÕ°î¹ÓSSŠˆN2—9U½çz‘¡8M´èÿf©ÞëCNÎRØ_aOÏø÷ª›HaºÈš\ÛýЫvˆÂסðžwߤZæ¿."r"0ÂÛ­ŒªÎ›&2VàL ¿Â39ðߪ ?9Ô5ç ¼]÷Þ™F1 àg"}‹z?`O®$þ™8U¤¿“ü"¢žÎ‡ 5æ÷t¼ºWf©>’hs½ÈþS<æ2’3çõø”ôÞœ¥Ú©[ÿgr0Ó÷¹Ä«aþ«ð§wSªÖY,ÝI¾ÿ &ÿ^Umµè’kÈ-]Îõ"ÅSìÛiN× \;SµYÎät‘gÕ裃)Ux˜æÅH6¹pÒͪK""31®V€ÍÙ0`†jSj’gÌú®?)ªúÂt‘Ÿhóà’üĬ<"2‹de±Œüéë@ïØÞš-ÓEÆ«)7˜®žø&…ÎR}Ì0"ò1Þ¬QàÞ¸ _54`eŽýê:ßußõv?®ÆTAóË0Ï‹ªNŒˆ\Ü’2žWjáäÛSÖ⦉œ+&Õ+])Ö—aâïU?÷ãp IÚVá<ï'§\{WTõ €é"?T°Ö*‘™f¶½MDD‚˜ûÿ èïWM9Üý4ÜûeK|‹¥Ë¹.+J~·¼í`¶Œu­[º‘ƒ¦ºØ/0%V\x1E$ì=D$øÐã·Bšv‰>÷)„)mŒ¥/0OàÀßü'\ï~ .¡¹wdÂ%‰--–E¶…¨jeTõ—ƒ~7p _øW“ßIV˜²XºŒ8Ü)æÿŒWïméÃV?³t5ßó½^ ¿ò èæé"¿UHh ¬1®ôÇÓu¢0q–ꦋôWãª3{݃d ÒyÀÞ‰oÝ ò£ªît‘ƒð­:ÍgïÛÂkà¼ù>Å¥€È>ñdmr€»g©þŸ÷úÓˆÈÞÀo¼ýµp8ðrš¾]ÎHÄ x³ü«½sý"’u«jknáË¢ªó i­ø`ß¹k¢ªwxçNŽ÷ŽM4Ȇãöö]sÓMª/z¯š.r±o©ãbZÏs}cLR³†÷LDäl<·x÷‹ª~|9äCÞÖYª³[és»‰šåˆË#"¢˜µ{0|øË5°p%ÌzzJØZ,ÛK_È8þì[ÿ ó€½MXCnéRFúvÝx0"Æs,-=D#HOiˆ{4+õ7®àe<äz†Pk‚Ø^M™xÓ6>'pàÆù)²‰nó÷ˆÀ¿üû OKÒãšYb:C¾Ðøç§~{ؼÏOÒK}eVÕ\×dÈ^ó½~O“†|€ï^û¦øóÏö mâº!¾sÃED4MÀÂC)Ç?Ç3äš~ݽKˆª.ÎŒˆ ÜŒÑq';Ý þ½þøJÊß–ÅÒY@.„hFòáµ 8-ªºÍý¬!·t?éK2?Œ¡n2ÖiÂ.÷ny0Æ  mînö@p“ê'‘×IF¡Ÿ¼JsC>¯ÝÁ·B=¼—z,e&‹Â†”ñ­OÙÖJ÷Ÿ¥´kˆÖØrí<ÁÖYª«}×ù—j?öYM|BÇ÷bï”ßÇÙþ”s™× Œt3œ–†°®ùéî%ªúRDäk˜%š11 ’§_ ÿùþöl7Ög·ìš\‘L³äæû,ïs›±†ÜÒe¬‚­{ÑXþ hQ[×GkçêRöÛ,’!ð z†\ᜟ‰ü80q^·ß­^ÛŠk»YZ™“"€|ÿ^as+ãÞ¦÷é£Â¿£÷YüJ¿AÀI—·’úð¼B2 ±Y­ŸÛÞ÷ÐeDÇà‘ˆÈ?€¿Ä¬í²àôQpú¾ðò§pçðv·Ö²Kð=¸(ÏÄ…€ùß™U}e{û³†ÜÒeÌWGD>Â3¢ f©·£ïëÀü8üó÷>4n½¼éŸ½n#­ån~èßqa °À·?6e|-òæ{+ü;Ñ™ªOïà{úŸoR3v8Q“c[Dd6ðàÇ@@Æï㯅’µpçßáÅxë¿‹¥U.„¯÷…Ÿú]ëÕ ØnºÝµeéu¼˜x!pèT‘“RL92"òÔOE†uÆ =á•ç}‡üigÛíVolXNóYù"2`ºH6×Q®uMÎhOãM|³i…koif\#"yÓE¦M‰vÒ=ýK{FDNž*’sƒH¦ˆ´¶ŒÐéxúí30A“×á[2Á˜¡ð׫á©IðÍ›¶fÙ¾‡61‰¿ç[¢ª··uMG°†ÜÒ¥ÄMJԖľÏMyšÈ‘DD>PŒuFkÀÛC:÷y£ ó;ñÌP­!)D04+""¯)¬FùÎEg©®§‡U]‹‰êNpb ”FD‹ˆÜyøR!*¾2¢_Mñÿu ªjÚzàã#ªZU½³n~ðQâ\F „›Ï] îÖ ËÎÅipÀp“–šXZ|ˆæõÛ5ä–.åÕRÌÚP“1WØ_ÌÚäÙ¤D|wÙðZ*x=³êÆq¿Y0¸Ëw(³Nß×wì_1Øfµ²®"f*<å;”ƒñf|8óž:˜KÛ1ÝBTµ!ªzF¢ö<|ëä .†_M‚WÀöîäÏIJk0 Î<”d¼Ìàâh'I«Ú5rK—U}rªÈ~¿ñ´Ö÷²Ÿ(üWቛU›¾Ô]X*{7•n IDATДHq¶ºðRb_| f¨VEDþˆOC]Z‘uásñõ—í[»X­És©\Mx)WWLù‡ÂµbÔèVÌŽªÞŸæÒ7ñ"½5%RZa­\Íï¿‚ä¹ÔþÊĹ4ŸÍjßuþvf¨Ößœ&r¾Wx©ƒC¼÷ý…Àà‰zŸXK*mü.–ø¾¹Þ÷Ÿ›¡Z7Edt&L8Pa7ñ¼2õ=@FÕSÚz x,b–„¦'8з®=.¯‚‡ß‚Ù‹S‚-½,\ ÓòŒÖB‚…À9^LF§`µÖ-ÝŽˆÈ¯!4£ÿ°{"7ˆdììïqWxIÄÈÌNÇx“üÎÆ:xaÌÿ'¼ÞÐFÄ¿e×ä(:þ˜aŸÌ~Ð^}ñmÅr‹ÅbùŠx•ø¦I®à—ð÷w̶C–r,=‹Ó`ÿàÏŽÑW#i|­§ûßéXCn±X,DÄd'ü’ª\¯‡—ÖÃü'áåÚæév–]„Ipæø­$ 7çEU_ÝQ÷´†Üb±X:¯|ê7Ë1šôÍ‹]X_ ½ ÖvÇ-K&·\ 87ªÚBõ°3±†Üb±Xv ‘¡˜HÿK1~Üzxm#<ò$,¨¶³ô’oÃqC`Z ¹<ó=ÀU½žkÈ-‹¥ ˆˆ0ÚÚ—{?›‰É¸PZO,0Ù–Î)0r˜žáˆÁ¬‡O‰ªþµ«Æa ¹Åb±t1ÞZú¥˜™úÐÔóqø¸žûž³%U{£¡øh¸6Ûè*ø—M^Çñ.Uk´†Üb±Xº‰ˆˆœ \œ „RÛ¸°¾ž[Ï=oÛ ¹îc7È< .-€ËÅh_$XD¢ªvǸ¬!·X,–@Dd7àÌ,ïHÒ(o*l­…JáùàµM)¥m-;¯vø7ûÃOà;Uü¸½+ÖÂ[Ãr‹ÅbéaxFýlŒQ?ž43u…šzxe ü÷5xq Tuõ8wu…cà[ypnv÷jþ̈ÙénÅr‹ÅbéÁDD 1n÷s€S¬4Íbõðf5¼¾.€Ö¿}Bèt8±Î ÃQ´ôŒü¸>ªšZä§Û°†Üb±Xv""ÙÀ×1Fý   ];…ê”ÔÀ¢ °ð%X¶ÕDS[Zá9ÎËo ¦œVàeàwQÕçºaxmb ¹Åb±ì„DD2€0Fý, kmêb°´–¢×áÝu= Mw³/ß(‚ó‚p`š&_÷÷FU{lJ 5ä‹Å²“ãE¿Æ{ÛÑ@Ÿ6.iŒÁ²ZX´-ƒ¥+`kWŒµ; ÅÀ!pH&4ýR]ç1àIà^àÙ¨j_¢°†Üb±Xv1""‚™aŽ÷mںƅͰ:«kau¬^«væB/ÇÀ{Á!ypH ¤ÉÙ÷ñ>FmnTu§*Ak ¹Åb±ô""#hn؇uä:…*ÏÀ¯ªƒ+aÕ—°z!|ÙSʳ }w‡0(gè 8Ä~m\æK1kßó¢ª »f´5ä‹ÅÒ ‰ˆìŽ1èGafïû};z½B½B© eqØâBY#li„²l©‡²ØReë`ËJ¨ˆ› ±vÉ‚@62ÍÜúà˜ ƒB00ƒ0Èát[¼1ܯ¯GUË;ú~{2Ö[,‹€ˆH?`?ŒQ÷ÿL-ö²=Ä]³_€½ùô½´ÑǶP‰‘L}ÅÛFUë:©ï…5ä‹Åbi“ˆH>Æ ûû~˜u÷œnZ-ð9ð)ð™ïç{À’!P­3°†Üb±X,ÛMD$³]ìmí½ÎÀ(£%¶xö7ÓÜP |UÝiñ:“ÿEN{“.Ó`_IEND®B`‚pyxnat-1.4/doc/index.rst000066400000000000000000000043601374563466300153330ustar00rootroot00000000000000.. pyxnat documentation master file, created by sphinx-quickstart on Tue Nov 24 11:04:02 2009. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. .. module:: pyxnat pyxnat: XNAT in Python ====================== **Date**: |today| **Version**: |version| **Useful links**: `Binary Installers `__ | `Source Repository `__ | `Issues & Ideas `__ Overview -------- :mod:`pyxnat` is an open source, BSD-licenced library providing a programmatic interface with `XNAT `_ which is an extensible management system for imaging data (and related). :mod:`pyxnat` uses the RESTful Web services provided by XNAT and allows easier interaction with an XNAT server through a simple and consistent API using the `Python `_ programming language. * :doc:`installing` * :doc:`tutorial` * :doc:`starters_tutorial` * :doc:`advanced_tutorial` * :doc:`features/index` * :doc:`reference_documentation` * :doc:`external_resources` * :doc:`about` * :doc:`CHANGES` Short examples """""""""""""" **Setup a connection** .. code-block:: python >>> from pyxnat import Interface >>> interface = Interface(server='https://central.xnat.org', user='login', password='pass') **Traverse the resource tree** .. code-block:: python >>> list(interface.select.projects()) ['CENTRAL_OASIS_CS', 'CENTRAL_OASIS_LONG', ...] **Operate the database** .. code-block:: python >>> project = interface.select.project('my_project').insert() >>> project.resource('images').file('image.nii').insert('/tmp/image.nii') **Use the search engine** .. code-block:: python >>> table = interface.select( 'xnat:subjectData', ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID'] ).where([('xnat:subjectData/SUBJECT_ID','LIKE','%'), ('xnat:subjectData/PROJECT', '=', 'my_project'), 'AND' ]) Module contents ---------------- .. currentmodule :: pyxnat .. autosummary:: Interface Select SearchManager Users pyxnat-1.4/doc/installing.rst000066400000000000000000000045611374563466300163730ustar00rootroot00000000000000:orphan: .. module:: pyxnat Installation ============ Python version support ---------------------- Officially Python 2.7, 3.6, and 3.7. Installing from PyPI -------------------- :mod:`pyxnat` can be installed via pip from `PyPI `__. :: pip install pyxnat Prerequisites ------------- - *python* v2.7+ - `requests `_ v2.20 - `python-lxml `_ v4.3.2+ recommended, earlier versions may work. For development purposes: - *python-nose* v1.2.1+ to run the unit tests - *coverage* v3.6+ The manual way --------------- To install :mod:`pyxnat`, first download the latest tarball (e.g. from http://pypi.python.org/pypi/pyxnat) and expand it. Installing in a local environment .................................. If you do not need to install for all users, we strongly suggest that you create a local environment and install :mod:`pyxnat` in it. One advantage of this method is that you never have to become administrator and thus all changes are local and easy to clean up. #. First, create the following directory (where `~` is the home folder, or any directory that you want to use as a base for your local Python environment, and `X` is your Python version number, e.g. `2.6`):: ~/usr/lib/pythonX/site-packages #. Second, make sure that you add this directory in your environment variable `PYTHONPATH`. Windows users may do this by editing your environment variables in the system configuration dialog. Unix users may add the following line to their `.bashrc` or any file sourced at login:: export PYTHONPATH=$HOME/usr/lib/python2.6/site-packages:$PYTHONPATH #. In the folder resulting from the :mod:`pyxnat` tarball, run the following command:: python setup.py install --prefix ~/usr You should not be required to become administrator, provided you have write access to the destination folder. Installing for all users ........................ If you have administrator rights and want to install for all users, all you need to do is to go in directory created by expanding the :mod:`pyxnat` tarball and run the following line:: python setup.py install For Unix users, we suggest that you install in '/usr/local' in order not to interfere with your system:: python setup.py install --prefix /usr/local pyxnat-1.4/doc/reference_documentation.rst000066400000000000000000000031301374563466300211050ustar00rootroot00000000000000:orphan: ============================== Reference documentation ============================== .. currentmodule:: pyxnat.core The `Interface` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.Interface :members: :inherited-members: The `Select` class ~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.select.Select :members: __call__, project, projects The `Inspect` class ~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.help.Inspector :members: The `SearchManager` class ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.search.SearchManager :members: The `Search` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.search.Search :members: The `EObject` class ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.EObject :members: The `CObject` class ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.CObject :members: The `Project` class ~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.Project :members: The `File` class ~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.File :members: The `Attributes` class ~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.attributes.EAttrs :members: The `Provenance` class ~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.provenance.Provenance :members: The `Users` class ~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.users.Users :members: The `Inspector` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.help.Inspector :members: The `SchemaManager` class ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.manage.SchemaManager :members: pyxnat-1.4/doc/starters_tutorial.rst000066400000000000000000000323401374563466300200150ustar00rootroot00000000000000:orphan: .. module:: pyxnat ============================== Starters Tutorial ============================== .. currentmodule:: pyxnat This is a short tutorial going through the main features of this API. Depending on the policy of the XNAT server you are using, and your user level, you can have read and write access to a specific set of resources. During this tutorial, we will use a `fake` standard user account on the XNAT central repository, where you will have limited access to a number of projects and full access to the projects you own. .. note:: `XNAT Central `_ is a public XNAT repository managed by the XNAT team and updated regularly with the latest improvements of the development branch. Getting started --------------- Connecting to an XNAT server requires valid credentials so you might want to start by requesting those on the web interface of your server. >>> from pyxnat import Interface >>> central = Interface( server='http://central.xnat.org:8080', user='my_login', password='my_pass') It is also possible to define an :class:`Interface` object without specifying all the connection settings. In that case :mod:`pyxnat` switches to interactive mode and prompts the user for the missing information. >>> central = Interface(server='http://central.xnat.org:8080') >>> User:my_login >>> Password: You can also use a configuration file. The best way to create the file is to use the ``save_config()`` method on an existing interface. >>> central.save_config('central.cfg') >>> central2 = Interface(config='central.cfg') .. warning:: Depending on the server configuration, you may have to include the port in the server URL, as well as the name of the XNAT `tomcat` application. You might end up with something like: http://server_ip:port/xnat The main interface class is now divided into logical subinterfaces: - data selection - general management - cache management - server instrospection Data selection -------------- Now that we have an `Interface` object, we can start browsing the server with the ``select`` subinterface which can be used, either with explicit Python objects and methods, or through a ``path`` describing the data. Simple requests:: >>> interface.select.projects().get() [..., 'CENTRAL_OASIS_CS', 'CENTRAL_OASIS_LONG', ...] >>> interface.select('/projects').get() [..., 'CENTRAL_OASIS_CS', 'CENTRAL_OASIS_LONG', ...] Nested requests:: >>> interface.select.projects().subjects().get() >>> interface.select('/projects/*/subjects').get() >>> interface.select('/projects/subjects').get() >>> interface.select('//subjects').get() ['IMAGEN_000000001274', 'IMAGEN_000000075717', ...,'IMAGEN_000099954902'] Filtered requests:: >>> interface.select.projects('*OASIS_CS*').get() >>> interface.select('/projects/*OASIS_CS*').get() ['CENTRAL_OASIS_CS'] >>> interface.select.project('IMAGEN').subjects('*55*42*').get() >>> interface.select('/projects/IMAGEN/subjects/*55*42*').get() ['IMAGEN_000055203542', 'IMAGEN_000055982442', 'IMAGEN_000097555742'] Resource paths --------------- The resource paths that can be passed as an argument to ``select`` is a powerful tool but can easily generate thousands of queries so one has to be careful when using it. Absolute paths ~~~~~~~~~~~~~~ A full path to a resource is a sequence of resource level and resource_id pairs:: /project/IMAGEN/subject/IMAGEN_000055982442 A full path to a resource listing is a sequence of resource level and resource_id pairs finishing by a plural resource level (i.e. with an 's'):: /project/IMAGEN/subject/IMAGEN_000055982442/experiments The first nice thing here is that you actually don't have to worry about resource level to be plural or singular within the path:: /project/IMAGEN/subject/IMAGEN_000055982442 EQUALS /projects/IMAGEN/subjects/IMAGEN_000055982442 /project/IMAGEN/subject/IMAGEN_000055982442/experiments EQUALS /project/IMAGEN/subjects/IMAGEN_000055982442/experiment Relative paths and shortcuts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When browsing resources, some levels are often left without any IDs and filled with ``*`` filters instead, which leads to paths like:: /projects/*/subjects/*/experiments/* That can instead be written:: /projects/subjects/experiments OR //experiments To have all the experiments from a specific project:: /project/IMAGEN//experiments EQUALS /project/IMAGEN/subjects/*/experiments The double slash syntax can be used anywhere in the path and any number of time:: //subjects//assessors EQUALS /projects/*/subjects/*/experiments/*/assessors/* Sometimes, a path will generate more than one path because it can be interpreted in different way:: //subjects//assessors//files Generates:: /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* .. warning:: If you try ``//files``, it will generate all the possible descendant paths: | /projects/*/subjects/*/experiments/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/scans/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* | /projects/*/subjects/*/resources/*/files/* | /projects/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* If the server has decent amount a data it will take ages to go through all the resources. Resources operations -------------------- Several operations are accessible for every resource level. The most important are for creating new resources, deleting existing ones and testing whether a given resource exists or not:: >>> my_project = central.select.project('my_project') >>> my_project.exists() False >>> my_project.create() >>> my_project.exists() True >>> subject = my_project.subject('first_subject') >>> subject.create() >>> subject.delete() >>> subject.exists() False An optional keyword argument is available to specify the datatype from the XNAT schema. The keyword must match the name of the REST level. >>> subject.create() >>> subject.experiment('pet_session' ).create(experiments='xnat:petSessionData') It is also possible to create resources without having to create the parent resources first. For example:: >>> central.select('/project/PROJECT/subject/SUBJECT').exists() False >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP').exists() False Specifiy the datatype on multiple levels:: >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP/scan/SCAN' ).create(experiments='xnat:mrSessionData', scans='xnat:mrScanData') Use default datatypes:: >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP/scan/SCAN' ).create() Additional fields can be configured at the resource creation. It can be especially useful for datatypes that have some mandatory fields, and thus would not be created if not specified (this is not a best practice for XML Schema writers though). It also enables users to set the resource ID through the REST API instead of just the label (the ID in this case is generated automatically). Custom ID example:: >>> experiment.create(experiments='xnat:mrSessionData', ID='my_custom_ID' ) With additional fields:: >>> experiment.create(**{'experiments':'xnat:mrSessionData', 'ID':'mr_custom_ID', 'xnat:mrSessionData/age':'42'} ) .. warning:: When using xpath syntax to declare fields, it is mandatory to pass the arguments using a dictionnary because of the ``/`` and ``:`` characters. And do not forget to expand the dict with the ``**``. Since you can create different resource levels in a single create call in pyxnat, it is also possible to configure those levels in a single call. For example if the subject for that experiment was not created, you could have specified:: >>> experiment.create( **{'experiments':'xnat:mrSessionData', 'ID':'mr_custom_ID', 'xnat:mrSessionData/age':'42', 'xnat:subjectData/investigator/lastname':'doe', 'xnat:subjectData/investigator/firstname':'john', 'xnat:subjectData/ID':'subj_custom_ID' }) File support ------------ It is possible to upload and then download files at every REST resource level:: >>> my_project.files() [] >>> my_project.file('image.nii').put('/tmp/image.nii') >>> # you can add any of the following arguments to give additional >>> # information on the file you are uploading >>> my_project.file('image.nii').put( '/tmp/image.nii', content='T1', format='NIFTI' tags='image test' ) >>> my_project.resource('NIFTI').file('image.nii').size() 98098 >>> my_project.resource('NIFTI').file('image.nii').content() 'T1' >>> my_project.resource('NIFTI').file('image.nii').format() 'NIFTI' >>> my_project.resource('NIFTI').file('image.nii').tags() 'image test' >>> my_project.resource('NIFTI').file('image.nii').get() '~/.store/nosetests@central.xnat.org/c7a5b961fc504ffc9aa292f76d75fb0c_image.nii' >>> my_project.file('image.nii').get_copy() '~/.store/nosetests@central.xnat.org/workspace/projects/Volatile/resources/123150742/files/image.nii' >>> my_project.file('image.nii').get_copy('/tmp/test.nii') '/tmp/test.nii' >>> # the resource level can be used to group files >>> my_project.resource('ANALYZE').file('image.hdr').put('/tmp/image.hdr') >>> my_project.resource('ANALYZE').file('image.img').put('/tmp/image.img') >>> my_project.resources() ['NIFTI', 'ANALYZE'] >>> my_project.resource('ANALYZE').files() ['image.hdr', 'image.img'] .. tip:: New since 0.7, the default ``get()`` method on a file can be given a custom path. It will still be handled and tracked by the cache in the same way as other files. Attributes support ------------------ Each resource level also has a set of metadata fields that can be informed. This set of fields depends on the resource level and on its type in the XNAT schema. >>> # use hard-coded shortcuts from the REST API >>> my_project.attrs.set('secondary_ID', 'myproject') >>> my_project.attrs.get('secondary_ID') 'myproject' >>> # use XPATH from standard or custom XNAT Schema >>> my_project.attrs.set('xnat:projectData/keywords', 'test project') >>> my_project.attrs.get('xnat:projectData/keywords') 'test project' >>> # get or set multiple attributes in a single request to improve performance >>> my_project.attrs.mset({'xnat:projectData/keywords':'test project', 'secondary_ID':'myproject'}) >>> my_project.attrs.mget(['xnat:projectData/keywords', 'secondary_ID']) ['test porject', 'myproject'] The search engine ------------------ The XNAT search engine can be queried via the REST model. It can be used to retrieve a specific subset of REST resources or a table containing the relevant values. The following queries find all the subjects that are within `my_project` older than 14:: >>> constraints = [('xnat:subjectData/SUBJECT_ID','LIKE','%'), ('xnat:subjectData/PROJECT', '=', 'my_project'), 'OR', [('xnat:subjectData/AGE','>','14'), 'AND' ] ] >>> # retrieve experiments >>> interface.select('//experiments').where(constraints) >>> # retrieve table with one subject per row and the columns SUBJECT_ID and AGE >>> interface.select('xnat:subjectData', ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/AGE']).where(constraints) See the ``Search``, ``SeachManager`` and ``CObject`` classes reference documentation for further details. To get the searchable types and fields to put in the constraints, rows and columns parameters, use the ``Interface.inspect.datatypes`` method:: >>> central.inspect.datatypes(optional_filter) [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> central.inspect.datatypes('xnat:subjectData', optional_filter) ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', ...] .. tip:: How to get all the results in a query? >>> interface.select('xnat:subjectData', ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/AGE']).all() .. tip:: How to get all the columns from a datatype? >>> table = interface.select('xnat:subjectData').where(...) .. tip:: Then to get everything: >>> table = interface.select('xnat:subjectData').all() pyxnat-1.4/doc/tutorial.rst000066400000000000000000000137371374563466300160770ustar00rootroot00000000000000:orphan: .. module:: pyxnat Getting started =============== This tutorial is intended as an introduction on how to work with **XNAT** and :mod:`pyxnat`. Reading the `XNAT documentation `_, especially on the pages on the REST Web Services, can be a huge help to deeper understand **XNAT** and consequently :mod:`pyxnat` design decisions. Prerequisites ------------- Before starting, make sure that you have the :mod:`pyxnat` distribution :doc:`installed `. In the Python shell, the following should run without raising an exception: .. code-block:: python >>> import pyxnat This tutorial also assumes that you have access to an XNAT instance. You may also use `XNAT Central `_, which is a public instance managed by the XNAT team and updated on a regular basis. Setting up a connection ----------------------- The first step when working with :mod:`pyxnat` is to connect to an XNAT instance with :class:`~pyxnat.Interface`. For this, you will need valid credentials. Make sure you have them or request them through the web interface of the targeted host. .. code-block:: python >>> from pyxnat import Interface >>> central = Interface(server="https://central.xnat.org", ... user='my_login', ... password='my_pass') .. warning:: Depending on the server configuration, you may have to include the port in the server URL, as well as the name of the XNAT `tomcat` application. You might end up with something like: `http://server_ip:port/xnat` Alternative connections ~~~~~~~~~~~~~~~~~~~~~~~ If at least one of server, user and password arguments is missing, the user will be prompted for it (them). In this mode, a connection to the server will be attempted at the object creation and will raise an exception if something is wrong. .. code-block:: python >>> central = Interface(server="https://central.xnat.org") User:my_login Password: There are two types of configuration files that :mod:`pyxnat` uses. The first one is used with the `config` parameter. .. code-block:: python >>> central = Interface(config='central.cfg') The easiest way to create this configuration file is to use the :func:`~pyxnat.Interface.save_config()` method on an existing interface. .. code-block:: python >>> central.save_config('central.cfg') The second one is the XNAT format config file, which is placed at a default location (i.e. `~/.xnatPass` in Linux). It is used without passing any argument to the :class:`~pyxnat.Interface` object. It is formatted as follows and supports multiple accounts and servers, the active one being the one selected by a ``+`` sign: .. code-block:: none +loginone@http://central.xnat.org=password -logintwo@http://central.xnat.org=password -logintwo@http://localhost=password .. code-block:: python >>> central = Interface() .. note:: If :class:`~pyxnat.Interface` is used without any parameter and any configuration file at default location, user will be prompted for server, user and password. .. warning:: You may prefer not to have your password either displayed onscreen or embedded in your programs. Two alternatives for interactive sessions and scripts: if you omit any of these three required parameters, the call to Interface(.) will prompt for the missing ones, and will not display the password as you enter it from the keyboard. Alternately, you can prompt for the password in the same way by using Python's getpass.getpass(.) method, some variations of which are demonstrated in examples below. You can save an entire configuration to a file and then load it later. Note that the configuration file contains the password, so be sure only to save this file in an access-protected location. Traversing the database ----------------------- Traversing the database requires basic knowledge of XNAT data model. This information is available in the :func:`~pyxnat.Interface.inspect.structure` method of the :class:`~pyxnat.Interface.inspect` sub-interface, which prints the hierarchical organization of the data and helps constructing valid ``paths`` for accessing the data. The :class:`~pyxnat.Interface.select` sub-interface allows for data selection and basic filtering through Python objects or ``paths``, more akin to native REST calls. Simple requests:: >>> central.select.projects().get() [..., 'CENTRAL_OASIS_CS', 'CENTRAL_OASIS_LONG', ...] >>> central.select('/projects').get() [..., 'CENTRAL_OASIS_CS', 'CENTRAL_OASIS_LONG', ...] Nested requests:: >>> central.select.projects().subjects().get() >>> central.select('/projects/*/subjects').get() >>> central.select('/projects/subjects').get() >>> central.select('//subjects').get() ['IMAGEN_000000001274', 'IMAGEN_000000075717', ...,'IMAGEN_000099954902'] Filtered requests:: >>> central.select.projects('*OASIS_CS*').get() >>> central.select('/projects/*OASIS_CS*').get() ['CENTRAL_OASIS_CS'] >>> central.select.project('IMAGEN').subjects('*55*42*').get() >>> central.select('/projects/IMAGEN/subjects/*55*42*').get() ['IMAGEN_000055203542', 'IMAGEN_000055982442', 'IMAGEN_000097555742'] Operating the database ---------------------- Python resource Objects that are retrieved from the :class:`~pyxnat.Interface.select` interface support a range of operations to interact and insert data in **XNAT**. :class:`~pyxnat.EObject` objects support operations for creation, deletion and existence checking. .. code-block:: python >>> subject.insert() >>> subject.exists() True >>> subject.delete() >>> subject.exists() False Working with Files ~~~~~~~~~~~~~~~~~~ **XNAT** was built to store images which means it can handle files. Files resources in :mod:`pyxnat` are just :class:`~pyxnat.EObject` objects with a few additional methods to upload and download the data. .. code-block:: python >>> file.get() '/hash_of_file_uri.extension' >>> file.get('/tmp/image.nii') '/tmp/image.nii' >>> file.put('/tmp/modified_image.nii') pyxnat-1.4/doc/under_the_hood.rst000066400000000000000000000047221374563466300172140ustar00rootroot00000000000000:orphan: ==================== Under the Hood ==================== The REST model -------------- Check out the `Wikipedia page `_ if you are not familiar with REST. The REST model in XNAT ---------------------- Resources are accessible through URI which start by /REST and include pairs _level_/_ID_. Uniquely identifiable resources: - /REST/projects/{ID} - /REST/projects/{ID}/subjects/{ID} Listing the resources is done by not giving an ID at the end of a URI: - /REST/projects - /REST/projects/{ID}/subjects Requesting specific data in specific format is done with a query string: - /REST/projects?format=csv - /REST/projects/{ID}?format=xml REST in Python -------------- The REST resource levels supported by this Python library are the following:: - projects - subjects - experiments - scans - reconstructions - assessors Attached to each resource level are:: - resources - files Every level corresponds to a Python class sharing common methods from ResourceObject and adding methods relevant to the specific resource. +-----------------+----------------+ | REST resource | Python Class | +=================+================+ | REST | Interface | +-----------------+----------------+ | projects | Project | +-----------------+----------------+ | subjects | Subject | +-----------------+----------------+ | experiments | Experiment | +-----------------+----------------+ | scans | Scan | +-----------------+----------------+ | reconstructions | Reconstruction | +-----------------+----------------+ | assessors | Assessor | +-----------------+----------------+ | resources | Resource | +-----------------+----------------+ | files | File | +-----------------+----------------+ This classes may but should not be instantiated manually. The HTTP requests are handled by a slightly modified version of httplib2, which is shipped the package. The main fix was made to enable back the built-in HTTP cache to avoid downloading again files that are already in the cache. This changes nothing for other resources that don't have to necessary HTTP headers to enable a cache service. pyxnat-1.4/pyxnat.ico000066400000000000000000000040361374563466300147440ustar00rootroot00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“ pHYs  šœtIMEã 7!æê$ï«IDATXÕ—il\ÕÇç¾÷fÆöxwpŒÓì& &QiËÒÐ ‚U-BªZ¤¨ªšJT•*èFù@©ŠªÒªµ…¤²´ a+!)a©¤ $²;Á؉;Ž—±'ã™÷îé‡7žÅ‡öI3ïͼ{ïÙþçΑÝÔ­ˆ€ €2ûþ—¿D$÷;wPAŒ¿Ï®!{¶dO—ìSp|ÑÆy—jþc-j4Pk1Õ”/Y…[S¾ÿ?.7/PýV«†_em­D›+#ˆkpc¦ÜÅ­tðj nU"sjÛpn£f½¥j1V²6Ê PUD·Ð@!¼ZA@íÕ_yp®Krw[ÉÀ¶cãç‘YÍ!Þ¹‚¾Mëhë9KúåWÀõŠ=@A,ç ×£¬E ιœNÿu†™“'0®‹ú>e5L]ÑÅîË2¼^{Š û<ØYŽC‘<ÀՂ臠ӼÂÄÄliáìYJêØ^Äu#x—^ÆË·-æÏ©°I «¤ ½ƒ‚JN·Ø¥2ÏNͤ™™vð\Åõ¤cN¬‰W‡Ñ Cymûo[Å£M‡8Ø‹ƒdÍiIG0™ ¤Ý"À¡E©7+ì|ÿ ã3jë]¢Q“mPMzx·ãž¼½§2»ðÒ..N!´©Îx 6Ÿg 4Ÿ–&âÒ'§0âpn$Cr*My¹¯Œ¯ŒRóÅ<°ÕáIy­H𬬠e©÷„P…D¤€¨"(b Ó=Ã4nì$1sš]ûêxýí§&±Áà}„ݰº»ÔõÊ©ª3ØÀ‚B0àŸK“¶A.¼’Å€ÌÇ@žˆˆ4_„‹‘ê;N˜ ³·‹{ß>ËŽí/ÒÔ}-ñ¦ !*©)ýå-ä¡!®ýÛ&×÷œõÑ´¢(Qkò¦ÿ#M·¬ænïçlYô(ë{gÇ?þÉöC\þíˆÄëqcq|À‚ZZ/ßÄñ]bäÁ~ÌÀŸ± ¡ÕQ5!¾”¦ …ænVÃ1§Žž>åž¾oðÐÚÇ9TÖLUû*23Iö=rê§°þ ÖOa3)¬õ¹xýf†zF©÷js†×°È­œgú¬¼ÒD$Ðïv`|‹ã*/n¦å³/³)¶‹Á±A–nÚJ&9‰- ëa}0Fð}Ÿ•‘e”Ç˹¼¬…›Žñ½Ç TKÖ™’D„8:p È1–ás.#ÞÍ\Ó~€ãÏl¦ß­bÍ­wg…!¿XËÀ@Ïn~ÏxÓ$î’EÜÒQƒ¢a>êzœ˜iÅ8sI)ÞÞKéúÎ^êìn>™ð1¡ä¬ƒ-xä¾Õ,눳÷ýQ¾ÿ» ¥¶.o.é#AÑl©õZ/áôL#¶Dî –C72»•–ºjld÷¹0/í¨¦ky5[¾Öɽß]Ísdžðí|"*êr 1†žÞã,™þ=—­Ô4(VÂs•£'‚Š/Ѷ¨Ôâ¸.‰3'¨«k`ÙºÐLÒ+;«8ïÛ…x(¯€H¶ã!19Π݃w~'7¬=H÷ê ꪅÀç[Äðj®fzàz_{Š£/nã+7¯ÃxI°&Û¼èœrGZ¢Ç‹rv2ÅÈX†ct·5à/^Éž›ß‚@ÄUöõ4Ó’žà“¾ýüä®Û¹íËýLL|L½¸ éßJI"22¯Á(DEýÿÞ»ûxîÇKùÙµ»X·Â#ã‡KIeó–rp÷¾yÝa2ÉԆ䄵Å£sÊ" h Õ­¬Íæ9Œ~ô6m7n8ȲΟò¹µŠª`PÞ<ÙL¹ëp>€·‚TI&}œ¢FU²òæ€P üP`§Î1}¦ãE0Æ™'ÐM°3µʾÅÒÅi°Jÿx9˜é´â¸B¼¼qT-?ÝËŠ†J\)Ýî-@¡HØ@4Ä<6¶7pèé_Òûê ½ÿ©ñ3€ƒã°æ¢‹Ø—x‡å‹†h‡€£=c$S±x/¾t„ß>vŒ _ƒNó½®VŒHiÎÏó0wuµqUS‚WÞâÌÇ>ei¤ R\y¾…'÷ÓßòoškDct”æ±ÂÇ­mäŽ;wPq¸¢±’û®é ©Ì[0 Ý""*«g ›k¸¾µ×öœå› _m¯ã±*Tgèh‚®êA.ñ\†ö¼4ÆýëÛY[_o!£³UV/Üi‰dTIá§Â5ŒO¦A-MÎ[¿pƒ£#TUeèjbàÔ'¬¹b#ßñ>c8(i« å×ÂD„dKÖ=V•Ï7ÄHñ›?!•œäÎ.Á \õÑÝ:LM­ðëm½”MŽÒeßìhV¨Î,$?fçÁlÍš; °{p’_襺*B×gj¨»ñ*–®[ÕGøÏÑ€÷<lèdEMYéÙP¦¤p6tåSÚò·׵V³ª¦‹÷ÎNqj,Eû›}¬¿æšÇRDö<ËW/§>êb¹À!sAÿêMÝZ˜RàŠÖìƒ*Æj1•øS Œ#Ù:ŸŸór–j¡7ókŠfCa>M.<(+A¶fØéDØûéÂ[/tä±o1ÄܹÄIEND®B`‚pyxnat-1.4/pyxnat/000077500000000000000000000000001374563466300142455ustar00rootroot00000000000000pyxnat-1.4/pyxnat/__init__.py000066400000000000000000000012321374563466300163540ustar00rootroot00000000000000""" PyXNAT ====== :mod:`pyxnat` provides an API to access data on XNAT servers (see http://xnat.org). Visit https://pyxnat.github.io/pyxnat for more information. """ from .version import VERSION as __version__ from .core import Interface from .core import SearchManager from .core import Select from .core import Inspector from .core import Users from .core import attributes from .core import help from .core import interfaces from .core import resources from .core import manage from .core import schema from .core import select from .core import users from .core import jsonutil from .core import uriutil from .core import xpass from .core import xpath_store pyxnat-1.4/pyxnat/core/000077500000000000000000000000001374563466300151755ustar00rootroot00000000000000pyxnat-1.4/pyxnat/core/__init__.py000066400000000000000000000002241374563466300173040ustar00rootroot00000000000000from .interfaces import Interface from .search import SearchManager from .select import Select from .help import Inspector from .users import Users pyxnat-1.4/pyxnat/core/array.py000066400000000000000000000227221374563466300166720ustar00rootroot00000000000000from .jsonutil import JsonTable class ArrayData(object): def __init__(self, interface): self._intf = interface def _get_array(self, query_string, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:subjectAssessorData', columns=None, constraints=None ): if constraints is None: constraints = {} uri = '%s/experiments?xsiType=%s' % (self._intf._get_entry_point(), experiment_type) if project_id is not None: uri += '&project=%s' % project_id if subject_id is not None: uri += '&%s/subject_id=%s' % (experiment_type, subject_id) # Subject Label is only held in the xnat:subjectData so look for it # there. This should join against whatever the experiment type is. if subject_label is not None: uri += '&xnat:subjectData/label=%s' % (subject_label) if experiment_id is not None: uri += '&ID=%s' % experiment_id if experiment_label is not None: uri += '&label=%s' % experiment_label uri += query_string if constraints != {}: uri += ',' + ','.join(constraints.keys()) if columns is not None: uri += ',' + ','.join(columns) c = {} [c.setdefault(key.lower(), value) for key, value in constraints.items() ] return JsonTable(self._intf._get_json(uri)).where(**c) def experiments(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:subjectAssessorData', columns=None, constraints=None): """ Returns a list of all visible experiment IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. experiment_type: string xsi path type; e.g. 'xnat:mrSessionData' columns: list Values to return. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ query_string = '&columns=ID,project,%s/subject_id' % experiment_type return self._get_array(query_string, project_id, subject_id, subject_label, experiment_id, experiment_label, experiment_type, columns, constraints ) def mrsessions(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, columns=None, constraints=None): """ Returns a list of all MR sessions, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. columns: list Values to return. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ return self.experiments(project_id, subject_id, subject_label, experiment_id, experiment_label, 'xnat:mrSessionData', columns, constraints ) def scans(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:imageSessionData', scan_type='xnat:imageScanData', columns=None, constraints=None ): """ Returns a list of all visible scan IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. experiment_type: string xsi path type; e.g. 'xnat:mrSessionData' scan_type: string xsi path type; e.g. 'xnat:mrScanData', etc. columns: list Values to return. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ query_string = '&columns=ID,project,%s/subject_id,%s/ID' % ( experiment_type, scan_type) array = self._get_array(query_string, project_id, subject_id, subject_label, experiment_id, experiment_label, experiment_type, columns, constraints) id_key = ('%s/ID' % scan_type).lower() return JsonTable([i for i in array if i[id_key]]) def mrscans(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, columns=None, constraints=None): """ Returns a list of all MR scans, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. columns: list Values to return. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ return self.scans(project_id, subject_id, subject_label, experiment_id, experiment_label, 'xnat:mrSessionData', 'xnat:mrScanData', columns, constraints ) def search_experiments(self, project_id=None, subject_id=None, subject_label=None, experiment_type='xnat:subjectAssessorData', columns=None, constraints=None ): """ Returns a list of all visible experiment IDs of the specified type, filtered by optional constraints. This function is a shortcut using the search engine. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_type: string xsi path type must be a leaf session type. defaults to 'xnat:mrSessionData' columns: List[string] list of xsi paths for names of columns to return. constraints: list[(tupple)] List of tupples for comparison in the form (key, comparison, value) valid comparisons are: =, <, <=,>,>=, LIKE """ if columns is None: columns = [] where_clause = [] if project_id is not None: item = ('%s/project' % experiment_type, "=", project_id) where_clause.append(item) if subject_id is not None: where_clause.append(('xnat:subjectData/ID', "=", subject_id)) if subject_label is not None: where_clause.append(('xnat:subjectData/LABEL', "=", subject_label)) if constraints is not None: where_clause.extend(constraints) if where_clause != []: where_clause.append('AND') if where_clause != []: sel = self._intf.select(experiment_type, columns=columns) table = sel.where(where_clause) return table else: table = self._intf.select(experiment_type, columns=columns) return table.all() pyxnat-1.4/pyxnat/core/attributes.py000066400000000000000000000140501374563466300177350ustar00rootroot00000000000000import difflib import six if six.PY3: from urllib.parse import quote elif six.PY2: from urllib import quote from .jsonutil import JsonTable from .uriutil import uri_parent from .schema import datatype_attributes class EAttrs(object): """ Accessor class to resource fields. Help to retrieve the attributes paths relevant to this element:: >>> subject.attrs() ['xnat:subjectData/sharing', 'xnat:subjectData/sharing/share', 'xnat:subjectData/resources', ... 'xnat:subjectData/experiments/experiment' ] All paths are not valid but they give an indication of what is available. To retrieve the paths, the corresponding schemas must be downloaded first through the schema management interface in order to be parsed:: >>> interface.manage.schemas.add('xnat.xsd') >>> interface.manage.schemas.add('myschema/myschema.xsd') """ def __init__(self, eobj): """ Parameters ---------- eobj: :class:`EObject` Object """ self._eobj = eobj self._intf = eobj._intf self._datatype = None self._id = None def __call__(self): """ List the attributes paths relevant to this element. """ paths = [] for root in self._intf.manage.schemas._trees.values(): paths.extend(datatype_attributes(root, self._get_datatype())) return paths def _get_datatype(self): if self._datatype is None: self._datatype = self._eobj.datatype() return self._datatype def _get_id(self): return self._eobj.id() def set(self, path, value, **kwargs): """ Set an attribute. Parameters ---------- path: string The xpath of the attribute relative to the element. value: string The attribute's value. Note that the python type is always a string but the content of the value must match what is defined in the schema. e.g. an element defined as a float in the schema must be given a string containing a number, a valid date must follow the ISO 8601 which is the standard representation for dates and times established by the W3C. """ dt = self._get_datatype() if dt is None: dt = '' put_uri = self._eobj._uri + '?xsiType=%s&%s=%s' % (quote(dt), quote(path), quote(value)) self._intf._exec(put_uri, 'PUT', **kwargs) def mset(self, dict_attrs, **kwargs): """ Set multiple attributes at once. It is more efficient to use this method instead of multiple times the `set()` method when setting more than one attribute because only a single HTTP call is issued to the server. Parameters ---------- dict_attrs: dict The dict of key values to set. It follows the same principles as the single `set()` method. """ t = ['&%s=%s' % (quote(path), quote(val)) for path, val in dict_attrs.items()] query_str = '?xsiType=%s' % quote(self._get_datatype()) + ''.join(t) put_uri = self._eobj._uri + query_str self._intf._exec(put_uri, 'PUT', **kwargs) def get(self, path): """ Get an attribute value. .. note:: The value is always returned in a Python string. It must be explicitly casted or transformed if needed. Parameters ---------- path: string The xpath of the attribute relative to the element. Returns ------- A string containing the value. """ query_str = '?columns=ID,%s' % path get_uri = uri_parent(self._eobj._uri) + query_str jdata = JsonTable(self._intf._get_json(get_uri)) jdata = jdata.where(ID=self._get_id()) # unfortunately the return headers do not always have the # expected name header = difflib.get_close_matches(path.split('/')[-1], jdata.headers()) if header == []: header = difflib.get_close_matches(path, jdata.headers())[0] else: header = header[0] replaceSlashS = lambda x: x.replace('\s', ' ') if type(jdata.get(header)) == list: return map(replaceSlashS, jdata.get(header)) else: return jdata.get(header).replace('\s', ' ') def mget(self, paths): """ Set multiple attributes at once. It is more efficient to use this method instead of multiple times the `get()` method when getting more than one attribute because only a single HTTP call is issued to the server. Parameters ---------- paths: list List of attributes' paths. Returns ------- list: ordered list of values (in the order of the requested paths) """ query_str = '?columns=ID,%s' % ','.join(paths) get_uri = uri_parent(self._eobj._uri) + query_str jdata = JsonTable(self._intf._get_json(get_uri) ).where(ID=self._get_id()) results = [] # unfortunately the return headers do not always have the # expected name for path in paths: header = difflib.get_close_matches(path.split('/')[-1], jdata.headers()) if header == []: header = difflib.get_close_matches(path, jdata.headers())[0] else: header = header[0] results.append(jdata.get(header).replace('\s', ' ')) return results pyxnat-1.4/pyxnat/core/derivatives/000077500000000000000000000000001374563466300175225ustar00rootroot00000000000000pyxnat-1.4/pyxnat/core/derivatives/__init__.py000066400000000000000000000032671374563466300216430ustar00rootroot00000000000000# Since pyxnat v1.2.1.0.post3, we introduced a mechanism to tune these objects # and allow adding custom functions for specific types of resources. # # For instance, one could now directly write: # # resource = experiment.resource('FREESURFER6') # aparc = resource.aparc() # aseg = resource.aseg() # and thus get access to FreeSurfer measurements. # # Another example, with the ASHS pipeline for hippocampal subfield segmentation: # # resource = experiment.resource('ASHS') # volumes = resource.volumes() # # Again, this would only work provided that corresponding resources respect a # certain naming and structure on XNAT. Here in this present example, FreeSurfer # results are stored in resources called FREESURFER6 and the whole FreeSurfer # folder (named after the subject) is stored in the resource. Having access # to such additional functions would be conditioned by the existence of these # resources with proper matching structure. # # Nevertheless, this mechanism has been implemented so as to get easily adapted # to local configurations, by editing/adding this very same folder. # # Adding a custom function can be done simply as follows. # # In this same folder (pyxnat/core/derivatives/), edit any existing file or add a new # one (filename does not matter): # # Define XNAT_RESOURCE_NAME. This variable names the XNAT resource which needs # a custom function. # Write the custom function with self as first parameter (self will be the # pyxnat Resource object). # If the resources which the custom function should be added has multiple names # instead of a single one, their list may be provided under the variable # XNAT_RESOURCE_NAMES. # # An example is provided in pyxnat/core/derivatives/ashs.py # pyxnat-1.4/pyxnat/core/derivatives/ashs.py000066400000000000000000000017761374563466300210450ustar00rootroot00000000000000XNAT_RESOURCE_NAME = 'ASHS' def volumes(self, mode='corr_nogray'): import pandas as pd f = list(self.files('*icv.txt'))[0] uri = f._uri res = self._intf.get(uri).text.split(' ') f = list(self.files('*_left_%s_volumes.txt'%mode))[0] uri = f._uri resl = self._intf.get(uri).text.split('\n') f = list(self.files('*_right_%s_volumes.txt'%mode))[0] uri = f._uri resr = self._intf.get(uri).text.split('\n') table = [] for resx in [resl, resr]: for line in resx: if line == '': continue line = line.split(' ') s = line[0] side = line[1] region = line[2] i = int(line[-2]) m = float(line[-1]) table.append([s, side, region, i, m]) table.append([res[0], None, 'tiv', None, float(res[1].rstrip('\n'))]) columns = ['subject', 'side', 'region', 'n_slices', 'volume'] return pd.DataFrame(table, columns=columns) pyxnat-1.4/pyxnat/core/downloadutils.py000066400000000000000000000171071374563466300204450ustar00rootroot00000000000000import os.path as op import zipfile import sys from .schema import class_name from . import uriutil DEBUG = False def unzip(fzip, dest_dir, check={'run': lambda z, d: True, 'desc': ""}): """ Extracts the given zip file to the given directory, but only if all members of the archive pass the given check. Parameters ---------- src: fzip zipfile dest_dir: string directory into which to extract the archive check: dict An dictionary that has the keys: 'run' : A function that takes a filename and parent directory and returns Bool. By default this function always returns True. 'dest' : A string description of this test. By default this is empty. Returns a tuple of type (bool,[string]) where if the extraction ran successfully the first is true and the second is a list of files that were extracted, and if not the first is false and the second is the name of the failing member. """ for member in fzip.namelist(): if not check['run'](member, dest_dir): return (False, member) fzip.extractall(path=dest_dir) return (True, map(lambda f: op.join(dest_dir, f), fzip.namelist())) def download(dest_dir, instance=None, type="ALL", name=None, extract=False, safe=False, removeZip=False): """ Download all the files at this level that match the given constraint as a zip archive. Should not be called directly but from a instance of class that supports bulk downloading eg. "Scans" Parameters ---------- instance : 'object The instance that contains local values needed by this function eg. instance._cbase stores the URI. dest_dir : string directory into which to place the downloaded archive. type: string a comma separated list of file types, eg. "T1,T2". Default is "ALL". name: string the name of the zip archive. Defaults to None. See below for the default naming scheme. extract: bool If True, the files are left extracted in the parent directory. Default is False. safe: bool If true, run safety checks on the files before extracting, eg. check that the file doesn't exist in the parent directory before overwriting it. Default is False. Default Zip Name ---------------- Given the project "p", subject "s" and experiment "e", and that the "Scans" (as opposed to "Assessors" or "Reconstructions") are being downloaded, and the scan types are constrained to "T1,T2", the name of the zip file defaults to: "p_s_e_scans_T1_T2.zip" Exceptions ---------- A generic Exception will be raised if any of the following happen: - This function is called directly and not from an instance of a class that supports bulk downloading eg."Scans" - The destination directory is unspecified A LookupError is raised if there are no resources to download A ValueError is raised if any of the following happen: - The project, subject and experiment names could not be extracted from the URI - The type constraint "ALL" is used with other constraints. eg. "ALL,T1,T2" - The URI associated with this class contains wildcards eg. /projects/proj/subjects/*/experiments/scans An EnvironmentError is raised if any of the following happen: - If "safe" is true, and (a) a zip file with the same name exists in given destination directory or (b) extracting the archive overrides an existing file. In the second case the downloaded archive is left in the parent directory. Return ------ A path to the zip archive if "extract" is False, and a list of extracted files if True. """ if instance is None: raise Exception('This function should be called directly but from an' 'instance of a class that supports bulk downloading, ' 'eg. "Scans"') if dest_dir is None: raise Exception('Destination directory is unspecified') # the URI must be fully qualified with a project,subject and experiment if '%2A' in instance._cbase: raise ValueError('URI contains wildcards :' + instance._cbase) # Check that there are resources at this level available = instance.get() if len(available) == 0: raise LookupError( 'There are no %s to download' % class_name(instance).lower()) pse = uriutil.extract_uri(instance._cbase) if pse is None: raise ValueError("Could not extract project, subject and experiment " "from the uri: " + instance._cbase) # Extract the desired scan types. Clean up whitespace and remove dupes types = {} for t in type.split(','): cleaned = t.strip() if cleaned != "": types[cleaned] = cleaned # Make sure the user hasn't asked us to download ALL the scans and then # asked for them to be constrained to a type. if len(types) > 1 and 'ALL' in types: raise ValueError('The \"ALL\" scan type constraint cannot be used with' ' any other constraint') (p, s, e) = pse # Make the name of the zip file default_zip_name = lambda: '%s_%s_%s_%s_%s' % ( p, s, e, class_name(instance).lower(), '_'.join(types.values())) zip_name = name if name is not None else default_zip_name() zip_location = op.join(dest_dir, zip_name + '.zip') if safe: if op.exists(zip_location): raise EnvironmentError("Unable to download to " + zip_location + " because this file already exists.") # Download from the server with open(zip_location, 'wb') as f: response = instance._intf.get(uriutil.join_uri( instance._cbase, ','.join(types.values())) + '/files?format=zip', stream=True) try: count = 0 for chunk in response.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) count += 1 if count % 10 == 0: # flush the buffer every once in a while. f.flush() f.flush() # and one last flush. except Exception as e: sys.stderr.write(e) finally: response.close() if DEBUG: print(zip_location) ## # Extract the archive fzip = zipfile.ZipFile(zip_location, 'r') if extract: check = {'run': lambda f, d: not op.exists(op.join(dest_dir, f)), 'desc': 'File does not exist in the parent directory'} safeUnzip = lambda: unzip(fzip, dest_dir, check) \ if safe else lambda: unzip(fzip, dest_dir) (unzipped, paths) = safeUnzip()() if not unzipped: fzip.close() msg = "Unable to extract " + zip_location + " because file " +\ paths + " failed the following test: " + check['desc'] raise EnvironmentError(msg) else: if removeZip: fzip.close() import os os.remove(zip_location) return paths else: fzip.close() return zip_location pyxnat-1.4/pyxnat/core/errors.py000066400000000000000000000065471374563466300170770ustar00rootroot00000000000000import re from lxml import etree import six if six.PY3: unicode = str # parsing functions def is_xnat_error(message): a = [''] try: return message.startswith(a[0]) or message.startswith(a[1]) except TypeError: if isinstance(message, bytes): a = [bytes(e, 'utf-8') for e in a] return message.startswith(a[0]) or message.startswith(a[1]) def parse_error_message(message): try: if message.startswith(''): message_tree = etree.XML(message) error_tag = message_tree.find('.//h3') if error_tag: error = error_tag.xpath("string()") elif message.startswith('>> central = Interface(server='http://central.xnat.org:8080', user='login', password='pwd') Or with config file: >>> central = Interface(config='/home/me/.xnat.cfg') Or for interactive use: >>> central = Interface('http://central.xnat.org') .. note:: The interactive mode is triggered whenever an argument (between server, user or password) is missing. In interactive mode pyxnat will check that connection settings are valid. .. note:: Proxy support requires the socks module be installed. This can be installed via pip:: `pip install SocksiPy-branch` Or anonymously (unauthenticated): >>> central = Interface('http://central.xnat.org', anonymous=True) """ def __init__(self, server=None, user=None, password=None, config=None, anonymous=False, proxy=None, verify=None): """ Parameters ---------- server: string | None The server's full URL (including port and XNAT instance name if necessary) e.g. http://central.xnat.org, http://localhost:8080/xnat_db If None the user will be prompted for it. user: string | None A valid login registered through the XNAT web interface. If None the user will be prompted for it. password: string | None The user's password. If None the user will be prompted for it. config: string Reads a config file in json to get the connection parameters. If a config file is specified, it will be used regardless of other parameters that might have been given. anonymous: boolean Indicates an unauthenticated connection. If True, user and password are ignored and a session is started with no credentials. proxy: string | None Indicates the full URL for an HTTP proxy server to be used for transactions with the specified XNAT server. If you need to specify a username and password for proxy access, prepend them to the hostname: http://user:pass@hostname:port verify: True, False, or path to file containing certificate for your site. Added to the requests Session, as documented here: http://docs.python-requests.org/en/latest/user/advanced/#ssl-cert-verification Simplifies handling self-certified sites, or sites where there is an issue with certification """ self._interactive = False self._anonymous = anonymous self._verify = verify if self._anonymous: if server is None: self._server = input('Server: ') self._interactive = True else: self._server = server self._interactive = False self.__set_proxy(proxy) self._user = None self._pwd = None else: if not all([server, user, password]) and not config: self._interactive = True if all(arg is None for arg in [server, user, password, config]) \ and os.path.exists(xpass.path()): connection_args = xpass.read_xnat_pass(xpass.path()) if connection_args is None: raise Exception('XNAT configuration file not found ' 'or formatted incorrectly.') self._server = connection_args['host'] self._user = connection_args['u'] self._pwd = connection_args['p'] if 'proxy' in connection_args: self.__set_proxy(connection_args['proxy']) else: self.__set_proxy(None) elif config is not None: self.load_config(config) else: if server is None: self._server = input('Server: ') else: self._server = server if user is None: user = input('User: ') if password is None: password = getpass.getpass() self._user = user self._pwd = password self.__set_proxy(proxy) self._callback = None self._struct = {} self._entry = None self._jsession = None # 'authentication_by_credentials' self._connect_extras = {} self._connect() self.inspect = Inspector(self) self.select = Select(self) self.array = ArrayData(self) self.manage = GlobalManager(self) self.xpath = XpathStore(self) if _DRAW_GRAPHS: self._get_graph = GraphData(self) self.draw = PaintGraph(self) if self._interactive: self._get_entry_point() self.inspect() def __getstate__(self): return { '_server': self._server, '_user': self._user, '_pwd': self._pwd, '_anonymous': self._anonymous, } def __setstate__(self, dictionary): self.__dict__ = dictionary if self._anonymous: self.__init__(self._server, anonymous=True) else: self.__init__(self._server, self._user, self._pwd) def __set_proxy(self, proxy=None): if proxy is None: proxy = os.environ.get("http_proxy") if proxy is None: self._proxy_url = None else: self._proxy_url = urlparse(proxy) def _get_entry_point(self): if self._entry is None: # /REST for XNAT 1.4, /data if >=1.5 self._entry = '/REST' try: ans = self._exec('/data/JSESSION', force_preemptive_auth=True) self._jsession = 'JSESSIONID=' + str(ans) self._entry = '/data' if is_xnat_error(self._jsession): catch_error(self._jsession) except Exception as e: if '/data/JSESSION' not in str(e): raise e return self._entry def _connect(self, **kwargs): """ Sets up the connection with the XNAT server. Parameters ---------- kwargs: dict Can be used to pass additional arguments to the Http constructor. See the httplib2 documentation for details. http://code.google.com/p/httplib2/ """ if kwargs != {}: self._connect_extras = kwargs else: kwargs = self._connect_extras self._http = requests.Session() # requests verify defaults to True, but can be set from environment # variables Leave as-is unless user has explicitly overridden it if self._verify is not None: self._http.verify = self._verify if not self._anonymous: self._http.auth = (self._user, self._pwd) if self._proxy_url: self._http.proxies = {'http': self._proxy_url.geturl()} # Turns out this doesn't work any more: XNAT doesn't do the 401 # response that forces httplib2 to re-submit the request with # credentials. See where the Authorization header is added manually in # the _exec function. # if not self._anonymous: # self._http.add_credentials(self._user, self._pwd) def _exec(self, uri, method='GET', body=None, headers=None, force_preemptive_auth=False, **kwargs): """ A wrapper around a simple httplib2.request call that: - avoids repeating the server url in the request - deals with custom caching mechanisms :: Depricated - manages a user session with cookies - catches and broadcast specific XNAT errors Parameters ---------- uri: string URI of the resource to be accessed. e.g. /REST/projects method: GET | PUT | POST | DELETE | HEAD HTTP method. body: string | dict HTTP message body headers: dict Additional headers for the HTTP request. force_preemptive_auth: boolean .. note:: Depricated as of 1.0.0.0 Indicates whether the request should include an Authorization header with basic auth credentials. **kwargs: dictionary Additional parameters to pass directly to the Requests HTTP call. HTTP:GET ---------- When calling with GET as method, the body parameter can be a key:value dictionary containing request parameters or a string of parameters. They will be url encoded and appended to the url. HTTP:POST ---------- When calling with POST as method, the body parameter can be a key:value dictionary containing request parameters they will be url encoded and appended to the url. """ if headers is None: headers = {} self._get_entry_point() uri = join_uri(self._server, uri) if DEBUG: print(uri) response = None def request(method, uri, headers, body, kwargs): if method == 'PUT': response = self._http.put(uri, headers=headers, data=body, **kwargs) elif method == 'GET': response = self._http.get(uri, headers=headers, params=body, **kwargs) elif method == 'POST': response = self._http.post(uri, headers=headers, data=body, **kwargs) elif method == 'DELETE': response = self._http.delete(uri, headers=headers, data=body, **kwargs) elif method == 'HEAD': response = self._http.head(uri, headers=headers, data=body, **kwargs) else: print('Unsupported HTTP method (%s)' % method) return return response response = request(method, uri, headers, body, kwargs) if response is None: return # Dirty trick to help Travis CI tests on CENTRAL: consider fixing it if STUBBORN: if (response is not None and response.status_code == 500): print('Retrying request... %s' % uri) response = request(method, uri, headers, body, kwargs) if (response is not None and not response.ok) or \ is_xnat_error(response.content): if DEBUG: print(response.content) print(response.status_code) catch_error(response.content, '''pyxnat._exec failure: URI: {response.url} status code: {response.status_code} headers: {response.headers} content: {response.content} '''.format(response=response)) return response.content def _get_json(self, uri): """ Specific Interface._exec method to retrieve data. It forces the data format to csv and then puts it back to a json-like format. Parameters ---------- uri: string URI of the resource to be accessed. e.g. /REST/projects Returns ------- List of dicts containing the results """ if 'format=json' in uri: uri = uri.replace('format=json', 'format=csv') else: if '?' in uri: uri += '&format=csv' else: uri += '?format=csv' content = self._exec(uri, 'GET') if is_xnat_error(content): catch_error(content) json_content = csv_to_json(content) # add the (relative) path field for files base_uri = uri.split('?')[0] if uri_last(base_uri) == 'files': for element in json_content: element['path'] = file_path(element['URI']) return json_content def _get_head(self, uri): if DEBUG: print('GET HEAD') response = self._http.head('{server}{uri}'.format(server=self._server, uri=uri)) if not response.ok: time.sleep(1) self._http.head('{server}{uri}'.format(server=self._server, uri=uri)) return response.headers def save_config(self, location): """ Saves current configuration - including password - in a file. .. warning:: Since the password is saved as well, make sure the file is saved at a safe location with appropriate permissions. .. note:: This method raises NotImplementedError for an anonymous interface. Parameters ---------- location: string Destination config file. """ if self._anonymous: raise NotImplementedError( 'no save_config() for anonymous interfaces') if not os.path.exists(os.path.dirname(location)): os.makedirs(os.path.dirname(location)) config = {'server': self._server, 'user': self._user, 'password': self._pwd, } if self._verify: config['verify'] = self._verify if self._proxy_url: config['proxy'] = self._proxy_url.geturl() with open(location, 'w') as fp: json.dump(config, fp) def load_config(self, location): """ Loads a configuration file and replaces current connection parameters. .. note:: This method raises NotImplementedError for an anonymous interface. Parameters ---------- location: string Configuration file path. """ if self._anonymous: raise NotImplementedError( 'no load_config() for anonymous interfaces') if os.path.exists(location): with open(location, 'rb') as fp: config = json.load(fp) self._server = str(config['server']) self._user = str(config['user']) self._pwd = str(config['password']) self._verify = bool(config.get('verify', True)) if 'proxy' in config: self.__set_proxy(str(config['proxy'])) else: self.__set_proxy(None) else: raise Exception('Configuration file does not exist.') def version(self): """ Get version of the currently running XNAT instance. """ from pyxnat.core.errors import DatabaseError try: return self._exec('/data/version') except DatabaseError: j = self._exec('/xapi/siteConfig/buildInfo').decode() return json.loads(j) def set_logging(self, level=0): pass def disconnect(self): """ Tell XNAT to disconnect this session """ self._exec('/data/JSESSION', method='DELETE') self._http.close() def get(self, uri, **kwargs): ''' Wrapper around requests.get() returns rquests.response object ''' uri = join_uri(self._server, uri) response = self._http.get(uri, **kwargs) return response def put(self, uri, **kwargs): ''' Wrapper around requests.put() returns rquests.response object ''' uri = join_uri(self._server, uri) response = self._http.put(uri, **kwargs) return response def post(self, uri, **kwargs): ''' Wrapper around requests.post() returns rquests.response object ''' uri = join_uri(self._server, uri) response = self._http.post(uri, **kwargs) return response def delete(self, uri, **kwargs): ''' Wrapper around requests.delete() returns rquests.response object ''' uri = join_uri(self._server, uri) response = self._http.delete(uri, **kwargs) return response def head(self, uri, **kwargs): ''' Wrapper around requests.head() returns rquests.response object ''' uri = join_uri(self._server, uri) response = self._http.head(uri, **kwargs) return response def __enter__(self): return self def close_jsession(self): ''' Closes the session with XNAT server and consumes the JSESSIONID token. ''' uri = '/data/JSESSION' response = self.delete(uri) response.raise_for_status() self._jsession = None def __exit__(self, type, value, traceback): if self._jsession: self.close_jsession() self._http.close() pyxnat-1.4/pyxnat/core/jsonutil.py000066400000000000000000000233411374563466300174210ustar00rootroot00000000000000import csv import copy from fnmatch import fnmatch import json import six if six.PY2: from StringIO import StringIO elif six.PY3: unicode = str from io import StringIO # jdata is a list of dicts def join_tables(join_column, jdata, *jtables): indexes = [] for jtable in [jdata]+list(jtables): if isinstance(jtable, dict): jtable = [jtable] index = {} [index.setdefault(entry[join_column], entry) for entry in jtable] indexes.append(index) merged_jdata = [] for join_id in indexes[0].keys(): for index in indexes[1:]: indexes[0][join_id].update(index[join_id]) merged_jdata.append(indexes[0][join_id]) return merged_jdata def get_column(jdata, col, val_pattern='*'): if isinstance(jdata, dict): jdata = [jdata] if val_pattern == '*': return [entry[col] for entry in jdata if col in entry] else: return [entry[col] for entry in jdata if fnmatch(entry.get(col), val_pattern) ] def get_where(jdata, *args, **kwargs): if isinstance(jdata, dict): jdata = [jdata] match = [] for entry in jdata: match_args = all([arg in entry.keys() or arg in entry.values() for arg in args ]) match_kwargs = all([entry[key] == kwargs[key] for key in kwargs.keys() ]) if match_args and match_kwargs: match.append(entry) return match def get_where_not(jdata, *args, **kwargs): if isinstance(jdata, dict): jdata = [jdata] match = [] for entry in jdata: match_args = all([arg in entry.keys() or arg in entry.values() for arg in args ]) match_kwargs = all([entry[key] == kwargs[key] for key in kwargs.keys() ]) if not match_args and not match_kwargs: match.append(entry) return match def get_headers(jdata): if isinstance(jdata, dict): jdata = [jdata] return [] if jdata == [] else jdata[0].keys() def get_selection(jdata, columns): if isinstance(jdata, dict): jdata = [jdata] sub_table = copy.deepcopy(jdata) rmcols = set(get_headers(jdata)).difference(columns) for entry in sub_table: for col in rmcols: if col in entry.keys(): del entry[col] return sub_table def csv_to_json(csv_str): import csv import six if six.PY2: csv_reader = csv.reader(StringIO(csv_str), delimiter=',', quotechar='"') elif six.PY3: try: csv_reader = csv.reader(StringIO(csv_str), delimiter=',', quotechar='"') except TypeError: csv_reader = csv.reader(StringIO(csv_str.decode('utf-8')), delimiter=',', quotechar='"') headers = next(csv_reader) ans = [dict(zip(headers, entry)) for entry in csv_reader] return ans class JsonTable(object): """ Wrapper around a list of dictionnaries to provide utility functions. """ def __init__(self, jdata, order_by=[]): self.data = jdata self.order_by = order_by def __repr__(self): # if len(self.data) == 0: # return '[]' # elif len(self.data) == 1: # return str(self.data[0]) if len(self.headers()) <= 5: _headers = self.headers() else: _headers = '%s ... %s' % (','.join(list(self.headers())[:2]), ','.join(list(self.headers())[-2:]) ) return ' %s' % ( len(self.data), len(self.headers()), _headers ) # return ('[%s\n .\n .\n . \n%s]\n\n' # '------------\n' # '%s rows\n' # '%s columns\n' # '%s characters') % (str(self.data[0]), # str(self.data[-1]), # len(self), # len(self.headers()), # len(self.dumps_csv()) # ) def __str__(self): return self.dumps_csv() def __len__(self): return len(self.data) def __iter__(self): return iter(self.data) def __getitem__(self, name): if isinstance(name, (str, unicode)): return self.get(name) elif isinstance(name, int): return self.__class__([self.data[name]], self.order_by) elif isinstance(name, list): return self.select(name) def __getslice__(self, i, j): return self.__class__(self.data[i:j], self.order_by) def join(self, join_column, *jtables): """ Join jsontables with a common column. Parameters ---------- join_column: string The name or header of the join column. jtables: *args Other jtables. """ return self.__class__( join_tables(join_column, self.data, *[jtable.data for jtable in jtables]), self.order_by ) def has_header(self, name): return name in self.headers() def headers(self): """ Returns the headers of the object. """ return get_headers(self.data) def get(self, col, val_pattern='*', always_list=False): """ Gets a single column value. Parameters ---------- col: string The column name val_pattern: string Enable a filter on the values to be returned. always_list: boolean If only a single value is to be returned - i.e. there is only on element in the list of dicts or there is only one match against the value filter - is can be returned within a list (with True) or not (default). """ res = get_column(self.data, col, val_pattern) if always_list: return res if len(self.data) == 1: return res[0] return res def where(self, *args, **kwargs): """ Filters the object. Paramaters ---------- args: Value must be matched in the key or the value of an entry. kwargs: Value for a specific key must be matched in an entry. Returns ------- A :class:`JsonTable` containing the matches. """ return self.__class__(get_where(self.data, *args, **kwargs), self.order_by ) def where_not(self, *args, **kwargs): """ Filters the object. Conditions must not be matched. Paramaters ---------- args: Value must not be matched in the key or the value of an entry. kwargs: Value for a specific key must not be matched in an entry. Returns ------- A :class:`JsonTable` containing the not matches. """ return self.__class__(get_where_not(self.data, *args, **kwargs), self.order_by ) def select(self, columns): """ Select only some columns of interest. Returns ------- A :class:`JsonTable` with the selected columns. """ return self.__class__(get_selection(self.data, columns), self.order_by ) def dump_csv(self, dest, delimiter=','): """ Dumps the object content in a csv file format. Parameters ---------- dest: string Destination file path. delimiter: char Character to separate values in the csv file. """ fd = open(dest, 'w') fd.write(self.dumps_csv(delimiter)) fd.close() def dumps_csv(self, delimiter=','): str_buffer = StringIO() csv_writer = csv.writer(str_buffer, delimiter=delimiter, quotechar='"', quoting=csv.QUOTE_MINIMAL) for entry in self.as_list(): csv_writer.writerow(unicode(entry)) return str_buffer.getvalue() def dump_json(self, dest): fd = open(dest, 'w') fd.write(self.dumps_json()) fd.close() def dumps_json(self): return json.dumps(self.data) def as_list(self): table = [[]] for header in self.order_by: if header in self.headers(): table[0].append(header) for header in self.headers(): if header not in self.order_by: table[0].append(header) for entry in self.data: row = [] for header in self.order_by: if header in entry.keys(): row.append(entry.get(header)) for header in self.headers(): if header not in self.order_by: row.append(entry.get(header)) table.append(row) return table def items(self): table = [] for entry in self.data: row = () for header in self.order_by: if header in entry.keys(): row += (entry.get(header), ) for header in self.headers(): if header not in self.order_by: row += (entry.get(header), ) table.append(row) return table pyxnat-1.4/pyxnat/core/manage.py000066400000000000000000000245051374563466300170050ustar00rootroot00000000000000from lxml import etree import urllib from .search import SearchManager from .users import Users from .resources import Project from .tags import Tags from .jsonutil import JsonTable class GlobalManager(object): """ Mainly a container class to provide a clean interface for all management classes. """ def __init__(self, interface): self._intf = interface self.search = SearchManager(self._intf) self.users = Users(self._intf) self.tags = Tags(self._intf) self.schemas = SchemaManager(self._intf) self.prearchive = PreArchive(self._intf) def register_callback(self, func): """ Defines a callback to execute when collections of resources are accessed. Parameters ---------- func: callable A callable that takes the current collection object as first argument and the current element object as second argument. Examples -------- >>> def notify(cobj, eobj): >>> print eobj._uri >>> interface.manage.register_callback(notify) """ self._intf._callback = func def unregister_callback(self): """ Unregisters the callback. """ self._intf._callback = None def project(self, project_id): """ Returns a project manager. """ return ProjectManager(project_id, self._intf) class ProjectManager(object): """ Management interface for projects. This functionalities are also available through `Project` objects. """ def __init__(self, project_id, interface): self._intf = interface self._intf._get_entry_point() project = Project('%s/projects/%s' % (self._intf._entry, project_id ), self._intf ) self.prearchive_code = project.prearchive_code self.set_prearchive_code = project.set_prearchive_code self.quarantine_code = project.quarantine_code self.set_quarantine_code = project.set_quarantine_code self.current_arc = project.current_arc self.set_subfolder_in_current_arc = \ project.set_subfolder_in_current_arc self.accessibility = project.accessibility self.users = project.users self.owners = project.owners self.members = project.members self.collaborators = project.collaborators self.user_role = project.user_role self.add_user = project.add_user self.remove_user = project.remove_user class SchemaManager(object): """ Management interface for XNAT schemas. The aim is to provide a minimal set of functionalities to parse and look at XNAT schemas. """ def __init__(self, interface): self._intf = interface self._trees = {} def __call__(self): return self._trees.keys() def add(self, url): """ Loads an additional schema. Parameters ---------- url: str url of the schema relative to the server. e.g. for http://central.xnat.org/xapi/schemas/xnat give ``/xapi/schemas/xnat`` """ # if not re.match('/?schemas/.*/.*\.xsd', url): # if not 'schemas' in url and re.match('/?\w+/\w+[.]xsd', url): # url = join_uri('/schemas', url) # # elif not re.match('^[^/].xsd', url): # url = '/schemas/%s/%s'%(url.split('.xsd')[0], url) # else: # raise NotImplementedError self._trees[url.split('/')[-1]] = \ etree.fromstring(self._intf._exec(url)) def remove(self, name): """ Removes a schema. """ if name in self._trees.keys(): del self._trees[name] """ Fields Of the Prearchive ------------------------ Each session in the prearchive has the following fields: "project" - The name of the project. "Unassigned" if the session is unassigned. "timestamp" - The time (down to millisecond) that this session was received by XNAT. "20110603_124835868" for example. "lastmod" - The time this session as last modified. Moving, resetting etc. updates this time "uploaded" - The time this session was uploaded to XNAT. Usually the same as "timestamp" "scan_date" - The date this session was scanned. "scan_time" - The time this session was scanned. "subject" - The name of the subject "folderName" - The id of this session. Corresponds to XNAT's session id, "name" - The name of this session. Corresponds to XNAT's session label. "tag" - This session's unique DICOM identifier. Usually the SOP instance UID. "status" - The current status of this session "url" - The unique uri of this session. "autoarchive" - Whether this session should be auto-archived. For more in-depth information about the prearchive see: http://docs.xnat.org/Using+the+Prearchive#XNAT%201.5:%20Managing%20Data%20with%20the%20Prearchive-Operations-Session%20Status Uniquely identifying a session ------------------------------ Every session in the prearchive uniquely is identified by "project", "timestamp" and "folderName". (13/7/2011) - Each session could have been uniquely identified by the "url" field or the "tag" field. These are arguably more elegant identifiers but for now the "project", "timestamp", "folderName" triple is used. """ class PreArchive(object): def __init__(self, interface): self._intf = interface """ Retrieve the status of a session Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def status(self, triple): return JsonTable( self._intf._get_json('/data/prearchive/projects') ).where( project=triple[0], timestamp=triple[1], folderName=triple[2] ).get('status') """ Retrieve the contents of the prearchive. """ def get(self): return JsonTable(self._intf._get_json('/data/prearchive/projects'), ['project', 'timestamp', 'folderName'] ).select(['project', 'timestamp', 'folderName'] ).as_list()[1:] """ Retrieve the scans of a give session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def get_scans(self, triple): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s/scans' % '/'.join(triple))).get('ID') """ Retrieve the resource of a session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. scan_id - id of the scan """ def get_resources(self, triple, scan_id): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s' '/scans/%s/resources' % ('/'.join(triple), scan_id) )).get('label') """ Retrieve a list of files in a given session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. scan_id - id of the scan resource_id - id of the resource """ def get_files(self, triple, scan_id, resource_id): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s' '/scans/%s/resources/%s/files' % ('/'.join(triple), scan_id, resource_id) )).get('Name') """ Move multiple sessions to a project in the prearchive asynchronously. If only one session is it is done now. This does *not* archive a session. Parameters ---------- uris - a list of session uris new_project - The name of the project to which to move the sessions. """ def move(self, uris, new_project): add_src = lambda u: urllib.urlencode({'src': u}) async_ = len(uris) > 1 and 'true' or 'false' print(async_) post_body = '&'.join((map(add_src, uris)) + [urllib.urlencode({'newProject': new_project})] + [urllib.urlencode({'async': async_})]) request_uri = '/data/services/prearchive/move?format=csv' ct = {'content-type': 'application/x-www-form-urlencoded'} return self._intf._exec(request_uri, 'POST', post_body, ct) """ Reinspect the file on the filesystem on the XNAT server and recreate the parameters of the file. Essentially a refresh of the file. Be warned that if this session has been scheduled for an operation, that operation is cancelled. Parameters ---------- uris - a list of session uris new_project - The name of the project to which to move the sessions. """ def reset(self, triple): post_body = "action=build" request_uri = '/data/prearchive/projects/%s?format=single' \ % '/'.join(triple) ct = {'content-type': 'application/x-www-form-urlencoded'} return self._intf._exec(request_uri, 'POST', post_body, ct) """ Delete a session from the prearchive Parameters ---------- uri - The uri of the session to delete """ def delete(self, uri): post_body = "src=" + uri + "&" + "async=false" request_uri = "/data/services/prearchive/delete?format=csv" ct = {'content-type': 'application/x-www-form-urlencoded'} return self._intf._exec(request_uri, 'POST', post_body, ct) """ Get the uri of the given session. Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def get_uri(self, triple): j = JsonTable(self._intf._get_json('/data/prearchive/projects')) return j.where(project=triple[0], timestamp=triple[1], folderName=triple[2]).get('url') pyxnat-1.4/pyxnat/core/pathutil.py000066400000000000000000000013511374563466300174010ustar00rootroot00000000000000import os def find_files(src): names = os.listdir(src) errors = [] files = [] for name in names: srcname = os.path.join(src, name) try: if os.path.islink(srcname): linkto = os.readlink(srcname) files.extend(find_files(linkto)) # os.symlink(linkto, dstname) elif os.path.isdir(srcname): files.extend(find_files(srcname)) else: files.append(srcname) except (IOError, os.error) as why: errors.append((srcname, str(why))) return files def ensure_dir_exists(dir_path): if not os.path.exists(dir_path): os.makedirs(dir_path) return os.path.isdir(dir_path) pyxnat-1.4/pyxnat/core/pipelines.py000066400000000000000000000221431374563466300175410ustar00rootroot00000000000000import os import json # import six # if six.PY2: # from urllib2 import urlopen # elif six.PY3: # from urllib.request import urlopen # import smtplib # from copy import deepcopy # import email.mime.text # import xml.dom.minidom # import suds.client # import suds.xsd.doctor from . import httputil class PipelineNotFoundError(Exception): """workflow not found""" class Pipelines(object): def __init__(self, project, interface): self._intf = interface self._project = project def get(self): response = self._intf._exec('%s/projects/%s/pipelines' % ( self._intf._get_entry_point(), self._project, )) return json.loads(response)['ResultSet']['Result'] def add(self, location): f = open(location, 'rb') pip_doc = f.read() f.close() body, content_type = httputil.file_message( pip_doc, 'text/xml', location, os.path.split(location)[1]) pipeline_uri = '%s/projects/%s/pipelines/%s' % ( self._intf._get_entry_point(), self._project, os.path.split(location)[1] ) self._intf._exec(pipeline_uri, method='PUT', body=body, headers={'content-type': content_type} ) def delete(self, pipeline_id): pass class Pipeline(object): def __init__(self, pipeline_id, interface): self._intf = interface self._id = pipeline_id def run(self): pass def stop(self): pass def update(self): pass def complete(self): pass def fail(self): pass # class Pipeline(object): # """class for mirroring workflow information (XML) in XNAT""" # def __init__(self, base_url, username, password, workflow_id): # self._base_url = base_url # self._username = username # self._password = password # self._cookiejar = None # res = self._call('CreateServiceSession.jws', # 'execute', # (), # authenticated=True) # self._session = str(res) # args = (('ns1:string', self._session), # ('ns1:string', 'wrk:workflowData.ID'), # ('ns1:string', '='), # ('ns1:string', workflow_id), # ('ns1:string', 'wrk:workflowData')) # workflow_ids = self._call('GetIdentifiers.jws', 'search', args) # self._doc = None # for w_id in workflow_ids: # url = '%s/app/template/XMLSearch.vm/id/%s/data_type/wrk:workflowData' % (self._base_url, str(w_id)) # r = urllib2.Request(url) # self._cookiejar.add_cookie_header(r) # data = urllib2.urlopen(r).read() # doc = xml.dom.minidom.parseString(data) # workflow_node = doc.getElementsByTagName('wrk:Workflow')[0] # status = workflow_node.getAttribute('status').lower() # if status in ('queued', 'awaiting action', 'hold'): # self._doc = doc # break # if self._doc is None: # raise PipelineNotFoundError # return # def _call(self, # jws, # operation, # inputs, # authenticated=False, # fix_import=False): # """perform a SOAP call""" # url = '%s/axis/%s' % (self._base_url, jws) # if authenticated: # t = suds.transport.http.HttpAuthenticated(username=self._username, # password=self._password) # else: # t = suds.transport.http.HttpTransport() # if self._cookiejar is not None: # t.cookiejar = self._cookiejar # if fix_import: # xsd_url = 'http://schemas.xmlsoap.org/soap/encoding/' # imp = suds.xsd.doctor.Import(xsd_url) # doctor = suds.xsd.doctor.ImportDoctor(imp) # client = suds.client.Client('%s?wsdl' % url, # transport=t, # doctor=doctor) # else: # client = suds.client.Client('%s?wsdl' % url, transport=t) # typed_inputs = [] # for (dtype, val) in inputs: # ti = client.factory.create(dtype) # ti.value = val # typed_inputs.append(ti) # # the WSDL returns the local IP address in the URLs; these need # # to be corrected if XNAT is behind a proxy # client.set_options(location=url) # f = getattr(client.service, operation) # result = f(*typed_inputs) # if self._cookiejar is None: # self._cookiejar = t.cookiejar # return result # def _close(self): # """close the XNAT session (log out)""" # self._call('CloseServiceSession.jws', 'execute', ()) # return # def _update_xnat(self): # """update XNAT with the current state of this (WorkflowInfo) object""" # inputs = (('ns0:string', self._session), # ('ns0:string', self._doc.toxml()), # ('ns0:boolean', False), # ('ns0:boolean', True)) # self._call('StoreXML.jws', # 'store', # inputs, # authenticated=True, # fix_import=True) # return # def _append_node(self, root, name, value): # """add a simple text node with tag "name" and data "value" under # the node "root" # """ # node = self._doc.createElement(name) # node.appendChild(self._doc.createTextNode(value)) # root.appendChild(node) # return # def set_environment(self, arguments, parameters): # """set the execution environment # should be run only once before update() is called # """ # # order is important # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # ee_node = self._doc.createElement('wrk:executionEnvironment') # ee_node.setAttribute('xsi:type', 'wrk:xnatExecutionEnvironment') # workflow_node.appendChild(ee_node) # self._append_node(ee_node, 'wrk:pipeline', arguments['pipeline']) # self._append_node(ee_node, 'wrk:xnatuser', arguments['u']) # self._append_node(ee_node, 'wrk:host', arguments['host']) # params_node = self._doc.createElement('wrk:parameters') # ee_node.appendChild(params_node) # for key in parameters: # param_node = self._doc.createElement('wrk:parameter') # param_node.setAttribute('name', key) # for val in parameters[key]: # param_node.appendChild(self._doc.createTextNode(val)) # params_node.appendChild(param_node) # for email in arguments['notify_emails']: # self._append_node(ee_node, 'wrk:notify', email) # self._append_node(ee_node, 'wrk:dataType', arguments['dataType']) # self._append_node(ee_node, 'wrk:id', arguments['id']) # if arguments['notify_flag']: # self._append_node(ee_node, 'wrk:supressNotification', '0') # else: # self._append_node(ee_node, 'wrk:supressNotification', '1') # return # def update(self, step_id, step_description, percent_complete): # """update the workflow in XNAT""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Running') # t = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # workflow_node.setAttribute('current_step_launch_time', t) # workflow_node.setAttribute('current_step_id', step_id) # workflow_node.setAttribute('step_description', step_description) # workflow_node.setAttribute('percentageComplete', percent_complete) # self._update_xnat() # return # def complete(self): # """mark the workflow comleted in XNAT and close the session""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Complete') # t = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # workflow_node.setAttribute('current_step_launch_time', t) # workflow_node.setAttribute('percentageComplete', '100.0') # try: # workflow_node.removeAttribute('current_step_id') # except xml.dom.NotFoundErr: # pass # try: # workflow_node.removeAttribute('step_description') # except xml.dom.NotFoundErr: # pass # self._update_xnat() # self._close() # return # def fail(self, description=None): # """mark the workflow failed in XNAT and close the session""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Failed') # if description is not None: # workflow_node.setAttribute('step_description', description) # self._update_xnat() # self._close() # return pyxnat-1.4/pyxnat/core/provenance.py000066400000000000000000000227541374563466300177210ustar00rootroot00000000000000import time import platform import socket from lxml import etree from lxml.etree import Element, QName from .uriutil import uri_parent from .jsonutil import JsonTable from . import httputil _nsmap = {'xnat': 'http://nrg.wustl.edu/xnat', 'prov': 'http://www.nbirn.net/prov', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} _required = ['program', 'timestamp', 'user', 'machine', 'platform'] _optional = ['program_version', 'program_arguments', 'cvs', 'platform_version', 'compiler', 'compiler_version', 'library', 'library_version' ] _all = ['program', 'program_version', 'program_arguments', 'timestamp', 'cvs', 'user', 'machine', 'platform', 'platform_version', 'compiler', 'compiler_version', # 'library', 'library_version' ] _platform_name, _hostname, \ _platform_version, _platform_version2,\ _machine, _machine2 = platform.uname() _machine = socket.gethostname() def provenance_document(eobj, process_steps, overwrite): root_node = etree.fromstring(eobj.get()) existing_prov = None for child in root_node.getchildren(): if str(child.tag).endswith('provenance'): existing_prov = child break if existing_prov is not None and not overwrite: prov_node = existing_prov else: if existing_prov is not None and overwrite: root_node.remove(existing_prov) prov_node = Element(QName(_nsmap['xnat'], 'provenance'), nsmap=_nsmap ) root_node.insert(0, prov_node) prov_node.extend(provenance_parameters(process_steps)) return etree.tostring(root_node.getroottree()) def provenance_parameters(process_steps): prov = [] for step in process_steps: if not set(_required).issubset(step.keys()): missing = list(set(_required).difference(step.keys())) raise Exception(('Following attributes are ' 'required to define provenance: %s' % missing ) ) prov.append(process_step_xml(**step)) return prov def process_step_xml(**kwargs): step_node = Element(QName(_nsmap['prov'], 'processStep'), nsmap=_nsmap) program_node = Element(QName(_nsmap['prov'], 'program'), nsmap=_nsmap) program_node.text = kwargs['program'] if 'program_version' in kwargs.keys(): program_node.set('version', kwargs['program_version']) if 'program_arguments' in kwargs.keys(): program_node.set('arguments', kwargs['program_arguments']) step_node.append(program_node) timestamp_node = Element(QName(_nsmap['prov'], 'timestamp'), nsmap=_nsmap ) timestamp_node.text = kwargs['timestamp'] step_node.append(timestamp_node) if 'cvs' in kwargs.keys(): cvs_node = Element(QName(_nsmap['prov'], 'cvs'), nsmap=_nsmap) cvs_node.text = kwargs['cvs'] step_node.append(cvs_node) user_node = Element(QName(_nsmap['prov'], 'user'), nsmap=_nsmap) user_node.text = kwargs['user'] step_node.append(user_node) machine_node = Element(QName(_nsmap['prov'], 'machine'), nsmap=_nsmap) machine_node.text = kwargs['machine'] step_node.append(machine_node) platform_node = Element(QName(_nsmap['prov'], 'platform'), nsmap=_nsmap) platform_node.text = kwargs['platform'] if 'platform_version' in kwargs.keys(): platform_node.set('version', kwargs['platform_version']) step_node.append(platform_node) if 'compiler' in kwargs.keys(): compiler_node = Element(QName(_nsmap['prov'], 'compiler'), nsmap=_nsmap ) compiler_node.text = kwargs['compiler'] if 'compiler_version' in kwargs.keys(): compiler_node.set('version', kwargs['compiler_version']) step_node.append(compiler_node) if 'library' in kwargs.keys(): library_node = Element(QName(_nsmap['prov'], 'library'), nsmap=_nsmap) library_node.text = kwargs['library'] if 'library_version' in kwargs.keys(): library_node.set('version', kwargs['library_version']) step_node.append(library_node) return step_node class Provenance(object): """ Class to annotate processed data with provenance information. The following parameters are available: - program - program_version - program_arguments - timestamp - cvs - user - machine - platform - platform_version - compiler - compiler_version Examples -------- >>> prov = {'program':'young', 'timestamp':'2011-03-01T12:01:01.897987', 'user':'angus', 'machine':'war', 'platform':'linux', } >>> element.provenance.set(prov) >>> element.provenance.get() >>> element.delete() """ def __init__(self, eobject): self._intf = eobject._intf self._eobject = eobject def set(self, process_steps, overwrite=False): """ Set provenance information for the data within this element. .. note:: If some required parameters are not provided, theses parameters will be extracted from the current machine and set automatically. Those parameters are: - machine - platform - timestamp - user .. warning:: overwrite option doesn't work because of a bug with the allowDataDeletion flag in XNAT Parameters ---------- process_steps: list or dict dict or list of dicts to define the processing steps of the data. The minimum set of information to give is: program, timestamp, user, machine and platform. More keywords in the class documentation. overwrite: boolean If False the process_steps are added to the existing ones. Else the processing steps overwrite any existing provenance. """ if isinstance(process_steps, dict): process_steps = [process_steps] for process_step in process_steps: _timestamp = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime() ) if 'machine' not in process_step.keys(): process_step['machine'] = _machine if 'platform' not in process_step.keys(): process_step['platform'] = _platform_name process_step['platform_version'] = _platform_version if 'timestamp' not in process_step.keys(): process_step['timestamp'] = _timestamp if 'user' not in process_step.keys(): process_step['user'] = self._intf._user doc = provenance_document(self._eobject, process_steps, overwrite) doc = doc.decode('utf-8') body, content_type = httputil.file_message( doc, 'text/xml', 'prov.xml', 'prov.xml') prov_uri = self._eobject._uri if overwrite: prov_uri += '?allowDataDeletion=true' self._intf._exec(prov_uri, method='PUT', body=body, headers={'content-type': content_type}) def get(self): """ Gets all the provenance information for that object. Returns ------- A list of dicts. """ datatype = self._eobject.datatype() columns = ['%s/ID' % datatype] + [ '%s/provenance/processStep/%s' % (datatype, field) for field in _all ] prov_uri = uri_parent(self._eobject._uri) prov_uri += '?columns=' prov_uri += ','.join(columns) steps = [] table = JsonTable(self._intf._get_json(prov_uri)) id_header = 'ID' if table.has_header('ID') \ else '%s/id' % datatype.lower() for step in table.where(**{id_header: self._eobject.id()}): step_dict = {} for key in step.keys(): if 'processstep' in key: step_dict[key.split('processstep/')[1]] = step[key] steps.append(step_dict) return steps def delete(self): """ Removes the provenance attached to this object. .. warning:: doesn't work because of a bug with the allowDataDeletion flag in XNAT """ provenance_node = self._eobject.xpath('//xnat:provenance') if provenance_node != []: provenance_node = provenance_node[0] parent_node = provenance_node.getparent() parent_node.remove(provenance_node) doc = etree.tostring(parent_node.getroottree()) body, content_type = httputil.file_message( doc, 'text/xml', 'prov.xml', 'prov.xml') self._intf._exec( '%s?allowDataDeletion=true' % self._eobject._uri, method='PUT', body=body, headers={'content-type': content_type} ) pyxnat-1.4/pyxnat/core/resources.py000066400000000000000000002504651374563466300175750ustar00rootroot00000000000000import lxml import os import os.path as op import sys import re import shutil import tempfile import zipfile # import time import codecs from fnmatch import fnmatch from itertools import islice from lxml import etree from pathlib import Path from .uriutil import join_uri, translate_uri, uri_segment from .uriutil import uri_last, uri_nextlast from .uriutil import uri_parent, uri_grandparent from .uriutil import uri_shape from .uriutil import file_path from .jsonutil import JsonTable, get_selection from .pathutil import find_files, ensure_dir_exists from .attributes import EAttrs from .search import rpn_contraints, query_from_xml from .errors import is_xnat_error, parse_put_error_message from .errors import DataError, ProgrammingError, catch_error from .provenance import Provenance # from .pipelines import Pipelines from . import schema from . import httputil from . import downloadutils from . import derivatives import types import pkgutil import inspect import six from six import string_types, add_metaclass if six.PY2: from urllib import quote, unquote # Python 2.X elif six.PY3: from urllib.parse import quote, unquote unicode = str DEBUG = False # metaclasses def get_element_from_element(rsc_name): def getter(self, ID): Element = globals()[rsc_name.title()] return Element(join_uri(self._uri, rsc_name + 's', ID), self._intf) return getter def get_element_from_collection(rsc_name): def getter(self, ID): Element = globals()[rsc_name.title()] Collection = globals()[rsc_name.title() + 's'] return Collection([Element(join_uri(eobj._uri, rsc_name + 's', ID), self._intf) for eobj in self], self._intf) return getter def get_collection_from_element(rsc_name): def getter(self, id_filter='*'): Collection = globals()[rsc_name.title()] return Collection(join_uri(self._uri, rsc_name), self._intf, id_filter ) return getter def get_collection_from_collection(rsc_name): def getter(self, id_filter='*'): Collection = globals()[rsc_name.title()] return Collection(self, self._intf, id_filter, rsc_name, self._id_header, self._columns) return getter class ElementType(type): def __new__(cls, name, bases, dct): rsc_name = name.lower() + 's' \ if name.lower() in schema.resources_singular \ else name.lower() for child_rsc in schema.resources_tree[rsc_name]: dct[child_rsc] = get_collection_from_element(child_rsc) dct[child_rsc.rstrip('s')] = \ get_element_from_element(child_rsc.rstrip('s')) return type.__new__(cls, name, bases, dct) def __init__(cls, name, bases, dct): super(ElementType, cls).__init__(name, bases, dct) class CollectionType(type): def __new__(cls, name, bases, dct): rsc_name = name.lower() + 's' \ if name.lower() in schema.resources_singular \ else name.lower() for child_rsc in schema.resources_tree[rsc_name]: dct[child_rsc] = get_collection_from_collection(child_rsc) dct[child_rsc.rstrip('s')] = \ get_element_from_collection(child_rsc.rstrip('s')) return type.__new__(cls, name, bases, dct) def __init__(cls, name, bases, dct): super(CollectionType, cls).__init__(name, bases, dct) # generic classes def __get_modules__(m): modules = [] prefix = m.__name__ + '.' for importer, modname, ispkg in pkgutil.iter_modules(m.__path__, prefix): module = __import__(modname, fromlist='dummy') if not ispkg: modules.append(module) else: modules.extend(__get_modules__(module)) return modules def __find_all_functions__(m): functions = {} modules = __get_modules__(m) for m in modules: for name, obj in inspect.getmembers(m): if inspect.isfunction(obj): functions.setdefault(m, []).append(obj) return functions class EObject(object): """ Generic Object for an element URI. """ def __init__(self, uri, interface): """ Parameters ---------- uri: string URI for an element resource. e.g. /REST/projects/my_project interface: :class:`Interface` Main interface reference. """ self._uri = quote(translate_uri(uri)) self._urn = unquote(uri_last(self._uri)) self._urt = uri_nextlast(self._uri) self._intf = interface self.attrs = EAttrs(self) functions = __find_all_functions__(derivatives) for m, mod_functions in functions.items(): is_resource = False if (hasattr(m, 'XNAT_RESOURCE_NAME') and self._urn == m.XNAT_RESOURCE_NAME) or \ (hasattr(m, 'XNAT_RESOURCE_NAMES') and self._urn in m.XNAT_RESOURCE_NAMES): is_resource = True if is_resource: for f in mod_functions: setattr(self, f.__name__, types.MethodType(f, self)) def __getstate__(self): return {'uri': self._uri, 'interface': self._intf} def __setstate__(self, dict): self.__init__(dict['uri'], dict['interface']) def __repr__(self): return '<%s Object> %s' % (self.__class__.__name__, unquote(uri_last(self._uri))) def _getcell(self, col): """ Gets a single property of the element resource. """ return self._getcells([col]) def _getcells(self, cols): """ Gets multiple properties of the element resource. """ p_uri = uri_parent(self._uri) id_head = schema.json[self._urt][0] lbl_head = schema.json[self._urt][1] filters = {} columns = set([col for col in cols if col not in schema.json[self._urt] or col != 'URI'] + schema.json[self._urt]) get_id = p_uri + '?format=json&columns=%s' % ','.join(columns) for pattern in self._intf._struct.keys(): if fnmatch(uri_segment( self._uri.split( self._intf._get_entry_point(), 1)[1], -2), pattern): reg_pat = self._intf._struct[pattern] filters.setdefault('xsiType', set()).add(reg_pat) if filters: get_id += '&' + \ '&'.join('%s=%s' % (item[0], item[1]) if isinstance(item[1], string_types) else '%s=%s' % (item[0], ','.join([val for val in item[1]])) for item in filters.items()) for res in self._intf._get_json(get_id): if self._urn in [res.get(id_head), res.get(lbl_head)]: if len(cols) == 1: return res.get(cols[0]) else: return get_selection(res, cols)[0] def exists(self, consistent=False): """ Test whether an element resource exists. """ try: return self.id() is not None except Exception as e: if DEBUG: print(e) return False def id(self): """ Returns the element resource id. """ return self._getcell(schema.json[self._urt][0]) def label(self): """ Returns the element resource label. """ return self._getcell(schema.json[self._urt][1]) def datatype(self): """ Returns the type defined in the XNAT schema for this element resource. +----------------+-----------------------+ | EObject | possible xsi types | +================+=======================+ | Project | xnat:projectData | +----------------+-----------------------+ | Subject | xnat:subjectData | +----------------+-----------------------+ | Experiment | xnat:mrSessionData | | | xnat:petSessionData | +----------------+-----------------------+ """ return self._getcell('xsiType') def create(self, **params): """ Creates the element if it does not exists. Any non-existing ancestor will be created as well. .. warning:: An element resource both have an ID and a label that can be used to access it. At the moment, XNAT REST API defines the label when creating an element, but not the ID, which is generated. It means that the `name` given to a resource may not appear when listing the resources because the IDs will appear, not the labels. .. note:: To set up additional variables for the element at its creation it is possible to use shortcuts defined in the XNAT REST documentation or xpath in the schema: - `element.create(ID='theid')` - `subject.create(**{'xnat:subjectData/ID':'theid'})` Parameters ---------- params: keywords - Specify the datatype of the element resource and of any ancestor that may need to be created. The keywords correspond to the levels in the REST hierarchy, see Interface.inspect.architecture() - If an element is created with no specified type: - if its name matches a naming convention, this type will be used - else a default type is defined in the schema module - To give the ID the same value as the label use use_label=True e.g element.create(use_label=True) Examples -------- >>> interface.select('/project/PROJECT/subject' '/SUBJECT/experiment/EXP/scan/SCAN' ).create(experiments='xnat:mrSessionData', scans='xnat:mrScanData' ) See Also -------- :func:`EObject.id` :func:`EObject.label` :func:`EObject.datatype` """ if 'xml' in params and op.exists(params.get('xml')): f = codecs.open(params.get('xml')) doc = f.read() f.close() try: doc_tree = etree.fromstring(doc) doc_tree.xpath('//*')[0].set('label', uri_last(self._uri)) doc = etree.tostring(doc_tree) except Exception: pass body, content_type = httputil.file_message( doc.decode(), 'text/xml', 'data.xml', 'data.xml') _uri = self._uri if ('allowDataDeletion' in params and params.get('allowDataDeletion') is False): _uri += '?allowDataDeletion=false' else: _uri += '?allowDataDeletion=true' self._intf._exec(_uri, method='PUT', body=body, headers={'content-type': content_type}) return self datatype = params.get(uri_nextlast(self._uri)) struct = self._intf._struct if datatype is None: for uri_pattern in struct.keys(): if fnmatch( self._uri.split( self._intf._get_entry_point(), 1)[1], uri_pattern): datatype = struct.get(uri_pattern) break else: datatype = schema.default_datatypes.get( uri_nextlast(self._uri)) if datatype is None: create_uri = self._uri else: local_params = \ [param for param in params if param not in schema.resources_types + ['use_label'] and (param.startswith(datatype) or '/' not in param) ] create_uri = '%s?xsiType=%s' % (self._uri, datatype) if 'ID' not in local_params \ and '%s/ID' % datatype not in local_params \ and params.get('use_label'): create_uri += '&%s/ID=%s' % (datatype, uri_last(self._uri)) if local_params: create_uri += '&' + '&'.join('%s=%s' % (key, params.get(key) ) for key in local_params ) # avoid to reuse relative parameters for key in local_params: del params[key] parent_element = self._intf.select(uri_grandparent(self._uri)) if not uri_nextlast(self._uri) == 'projects' \ and not parent_element.exists(): parent_datatype = params.get(uri_nextlast(parent_element._uri)) if DEBUG: print('CREATE', parent_element, parent_datatype) parent_element.create(**params) if DEBUG: print('PUT', create_uri) if 'params' in params and 'event_reason' in params['params']: if DEBUG: print('Found event_reason') output = self._intf._exec(create_uri, 'PUT', **params) else: if DEBUG: print('event_reason not found') output = self._intf._exec(create_uri, 'PUT') if is_xnat_error(output): paths = [] for datatype_name, element_name \ in parse_put_error_message(output): path = self._intf.inspect.schemas.look_for( element_name, datatype_name) paths.extend(path) if DEBUG: print(path, 'is required') return paths return self insert = create def delete(self, delete_files=True): """ Deletes an element resource. Parameters ---------- delete_files: boolean Tells if files attached to the element resources are removed as well from the server filesystem. """ delete_uri = self._uri if not delete_files \ else self._uri + '?removeFiles=true' out = self._intf._exec(delete_uri, 'DELETE') if is_xnat_error(out): catch_error(out) def get(self): """ Retrieves the XML document corresponding to this element. """ return self._intf._exec(self._uri + '?format=xml', 'GET') def xpath(self, xpath): root = etree.fromstring(self.get()) return root.xpath(xpath, namespaces=root.nsmap) def namespaces(self): pass def parent(self): uri = uri_grandparent(self._uri) klass = uri_nextlast(uri).title().rsplit('s', 1)[0] if klass: Klass = globals()[klass] return Klass(uri, self._intf) else: return None def children(self, show_names=True): """ Returns the children levels of this element. Parameters ---------- show_name: boolean If True returns a list of strings. If False returns a collection object referencing all child objects of this elements. Examples -------- >>> subject_object.children() ['experiments', 'resources'] >>> subject_object.children(False) 170976556 """ children = schema.resources_tree.get(uri_nextlast(self._uri)) if show_names: return children return CObject([getattr(self, child)() for child in children], self._intf ) def tag(self, name): """ Tag the element. """ tag = self._intf.manage.tags.get(name) if not tag.exists(): tag.create() tag.reference(self._uri) return tag def untag(self, name): """ Remove a tag for the element. """ tag = self._intf.manage.tags.get(name) tag.dereference(self._uri) if not tag.references().get(): tag.delete() class CObject(object): """ Generic Object for a collection resource. A collection resource is a list of element resources. There is however several ways to obtain such a list: - a collection URI e.g. /REST/projects - a list of element URIs - a list of collections e.g. /REST/projects/ONE/subjects **AND** /REST/projects/TWO/subjects - a list of element objects - a list a collection objects Collections objects built in different ways share the same behavior: - they behave as iterators, which enables a lazy access to the data - they always yield EObjects - they can be nested with any other collection Examples -------- No access to the data: >>> interface.select.projects() 173667084 Lazy access to the data: >>> for project in interface.select.projects(): >>> print project Nesting: >>> for subject in interface.select.projects().subjects(): >>> print subject """ def __init__(self, cbase, interface, pattern='*', nested=None, id_header='ID', columns=[], filters={}): """ Parameters ---------- cbase: string | list | CObject Object from which the collection is built. interface: :class:`Interface` Main interface reference. pattern: string Only resource element whose ID match the pattern are returned. nested: None | string Parameter used to nest collections. id_header: ID | label Defines whether the element label or ID is returned as the identifier. columns: list Defines additional columns to be returned. filters: dict Defines additional filters for the query, typically options for the query string. """ self._intf = interface self._cbase = cbase self._id_header = id_header self._pattern = pattern self._columns = columns self._filters = filters self._nested = nested if isinstance(cbase, string_types): self._ctype = 'cobjectcuri' elif isinstance(cbase, CObject): self._ctype = 'cobjectcobject' elif isinstance(cbase, list) and cbase: if isinstance(cbase[0], string_types): self._ctype = 'cobjecteuris' if isinstance(cbase[0], EObject): self._ctype = 'cobjecteobjects' if isinstance(cbase[0], CObject): self._ctype = 'cobjectcobjects' elif isinstance(cbase, list) and not cbase: self._ctype = 'cobjectempty' else: raise Exception('Invalid collection accessor type: %s' % cbase) def __repr__(self): return ' %s' % id(self) def _call(self, columns): try: uri = translate_uri(self._cbase) uri = quote(uri) # request_shape = uri_shape( # '%s/0' % uri.split(self._intf._get_entry_point(), 1)[1]) # gather = uri.split('/')[-1] in ['experiments', 'assessors', # 'scans', 'reconstructions'] # tick = time.gmtime(time.time())[5] % \ # self._intf.inspect._tick == 0 and\ # self._intf.inspect._auto columns += ['xsiType'] query_string = '?format=json&columns=%s' % ','.join(columns) if self._filters: query_string += '&' + '&'.join( '%s=%s' % (item[0], item[1]) if isinstance(item[1], (str, unicode)) else '%s=%s' % ( item[0], ','.join([val for val in item[1]])) for item in self._filters.items() ) if DEBUG: print(uri + query_string) jtable = self._intf._get_json(uri + query_string) _type = uri.split('/')[-1] self._learn_from_table(_type, jtable, None) return jtable except Exception as e: if DEBUG: raise e return [] def _learn_from_table(self, _type, jtable, reqcache): request_knowledge = {} for element in jtable: xsitype = element.get('xsiType') if xsitype: # Only some of the xnat elements return xsiType like we asked # them to.Projects and Subjects are two known offenders so we # cannot update our knowledge of them. uri = element.get('URI').split(self._intf._get_entry_point(), 1)[1] uri = uri.replace(uri.split('/')[-2], _type) shape = uri_shape(uri) request_knowledge[shape] = xsitype self._intf._struct.update(request_knowledge) def __iter__(self): if self._ctype == 'cobjectcuri': if self._id_header == 'ID': id_header = schema.json[uri_last(self._cbase)][0] elif self._id_header == 'label': id_header = schema.json[uri_last(self._cbase)][1] else: id_header = self._id_header for res in self._call([id_header] + self._columns): try: eid = unquote(res[id_header]) if fnmatch(eid, self._pattern): klass_name = uri_last(self._cbase ).rstrip('s').title() Klass = globals().get(klass_name, self._intf.__class__) eobj = Klass(join_uri(self._cbase, eid), self._intf) if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjecteuris': for uri in self._cbase: try: title = uri_nextlast(uri).rstrip('s').title() Klass = globals().get(title, self._intf.__class__) eobj = Klass(uri, self._intf) if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjecteobjects': for eobj in self._cbase: try: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.rstrip('s').title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectcobject': for eobj in self._cbase: try: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, eobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectcobjects': for cobj in self._cbase: try: for eobj in cobj: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(cobj._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, cobj._nested), interface=cobj._intf, pattern=cobj._pattern, id_header=cobj._id_header, columns=cobj._columns): try: self._run_callback(self, eobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectempty': for empty in []: yield empty def _run_callback(self, cobj, eobj): if self._intf._callback is not None: self._intf._callback(cobj, eobj) def first(self): """ Returns the first element of the collection. """ for eobj in self: return eobj fetchone = first def __getitem__(self, k): """ Use itertools.islice() to support indexed access and slicing. """ if isinstance(k, slice): return islice(self, k.start, k.stop, k.step) else: return next(islice(self, k, k+1)) def get(self, *args): """ Returns every element. .. warning:: If a collection needs to issue thousands of queries it may be better to access the resources within a `for-loop`. Parameters ---------- args: strings - Specify the information to return for the elements within ID, label and Object. - Any combination of ID, label and obj is valid, if more than one is given, a list of tuple is returned instead of a list. """ if not args: return [unquote(uri_last(eobj._uri)) for eobj in self] else: entries = [] for eobj in self: entry = () for arg in args: if arg == 'id': self._id_header = 'ID' entry += (unquote(uri_last(eobj._uri)),) elif arg == 'label': self._id_header = 'label' entry += (unquote(uri_last(eobj._uri)),) else: entry += (eobj,) entries.append(entry) if len(args) != 1: return entries else: return [e[0] for e in entries] fetchall = get def __nonzero__(self): try: self.__iter__().next() except StopIteration: return False else: return True def tag(self, name): """ Tag the collection. """ tag = self._intf.manage.tags.get(name) if not tag.exists(): tag.create() tag.reference_many([eobj._uri for eobj in self]) return tag def untag(self, name): """ Remove the tag from the collection. """ tag = self._intf.manage.tags.get(name) tag.dereference_many([eobj._uri for eobj in self]) if not tag.references().get(): tag.delete() def where(self, constraints=None, template=None, query=None): """ Only the element objects whose subject that are matching the constraints will be returned. It means that it is not possible to use this method on an element that is not linked to a subject, such as a project. Examples -------- The ``where`` clause should be on the first select: >>> for experiment in interface.select('//experiments' ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print experiment Do **NOT** do this: >>> for experiment in interface.select('//experiments'): for assessor in experiment.assessors( ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print assessor Or this: >>> for project in interface.select('//projects' ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print project See Also -------- :func:`search.Search` """ if isinstance(constraints, (str, unicode)): constraints = rpn_contraints(constraints) elif isinstance(template, (tuple)): tmp_bundle = self._intf.manage.search.get_template( template[0], True) tmp_bundle = tmp_bundle % template[1] constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(query, (str, unicode)): tmp_bundle = self._intf.manage.search.get(query, 'xml') constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(constraints, list): pass else: raise ProgrammingError('One in [contraints, template and ' 'query] parameters must be correctly ' 'set.' ) # _columns = [ # 'xnat:subjectData/PROJECT', # 'xnat:subjectData/SUBJECT_ID', # ] + ['%s/ID' %qtype for qtype in _queried_types] # bundle = build_search_document( # 'xnat:imageSessionData', _columns, constraints) # content = self._intf._exec( # "%s/search?format=json" % self._intf._entry, # 'POST', bundle) # if content.startswith(''): # raise Exception(content.split('

')[1].split('

')[0]) # results = JsonTable(json.loads(content)['ResultSet']['Result']) # return results results = query_with( interface=self._intf, join_field='xnat:subjectData/SUBJECT_ID', common_field='SUBJECT_ID', return_values=['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID'], _filter=constraints ) searchpop = ['%s/projects/' % self._intf._get_entry_point() + '%(project)s/subjects/%(subject_id)s' % res for res in results ] cobj = self while cobj: first = cobj.first() if not first: break if uri_nextlast(first._uri) == 'subjects': break else: cobj = getattr(cobj, '_cbase') backup_header = cobj._id_header if cobj._pattern != '*': cobj._id_header = 'ID' poi = set(searchpop).intersection([eobj._uri for eobj in cobj]) else: poi = searchpop cobj._cbase = list(poi) cobj._ctype = 'cobjecteuris' cobj._nested = None cobj._id_header = backup_header return self # specialized classes @add_metaclass(ElementType) class Project(EObject): def __init__(self, uri, interface): """ Parameters ---------- uri: string The file resource URI interface: Interface Object """ EObject.__init__(self, uri, interface) # self.pipelines = Pipelines(self.id(), self._intf) def __repr__(self): interface = self._intf # Check if project exists if self.exists(): project_id = self.id() data = interface.select('xnat:projectData').all().data data = [e for e in data if e['id'] == project_id][0] # Collecting project details name = data['name'] n_subjects = len(list(self.subjects())) # Creating the project url url = interface._server + self._uri + '?format=html' # Listing experiments exp = [] for e in ['mr', 'ct', 'pet', 'ut']: field = 'proj_%s_count' % e if data[field]: item = '{f} {e} experiment{s}' final_s = {True: 's', False: ''}[int(data[field]) > 1] item = item.format(f=data[field], e=e.upper(), s=final_s) exp.append(item) owners = [e.strip(' ') for e in data['project_owners'].split('
')] # Creating the output string to be returned output = '<{cl} Object> {id} `{label}` ({access}) {n_subjects}'\ ' subject{s} {exp} (owner: {owner}) (created on {insert_date}'\ ') {url}' output = output.format(cl=self.__class__.__name__, id=project_id, label=name, s={True: 's', False: ''}[n_subjects > 1], n_subjects=n_subjects, owner='/'.join(owners), insert_date=data['insert_date'], access=data['project_access'], url=url, exp=' '.join(exp)) return output else: return '<%s Object> %s' % (self.__class__.__name__, self._urn) def prearchive_code(self): """ Gets project prearchive code. """ return int(self._intf._exec(join_uri(self._uri, 'prearchive_code'))) def set_prearchive_code(self, code): """ Sets project prearchive code. Parameters ---------- code: 0 to 4 """ self._intf._exec(join_uri(self._uri, 'prearchive_code', code), 'PUT') def quarantine_code(self): """ Gets project quarantine code. """ return int(self._intf._exec(join_uri(self._uri, 'quarantine_code'))) def set_quarantine_code(self, code): """ Sets project quarantine code. Parameters ---------- code: 0 to 1 """ self._intf._exec(join_uri(self._uri, 'quarantine_code', code), 'PUT') def current_arc(self): """ Gets project current archive folder on the server. """ return self._intf._exec(join_uri(self._uri, 'current_arc')) def set_subfolder_in_current_arc(self, subfolder): """ Changes project current archive subfolder on the server. """ current_arc = self._intf._exec(join_uri(self._uri, 'current_arc')) self._intf._exec(join_uri(self._uri, 'current_arc', current_arc, subfolder), 'PUT') def accessibility(self): """ Gets project accessibility. """ return self._intf._exec(join_uri(self._uri, 'accessibility'), 'GET') def set_accessibility(self, accessibility='protected'): """ Sets project accessibility. .. note:: Write access is given or not by the user level for a specific project. Parameters ---------- accessibility: public | protected | private Sets the project accessibility: - public: the project is visible and provides read access for anyone. - protected: the project is visible by anyone but the data is accessible for allowed users only. - private: the project is visible by allowed users only. """ return self._intf._exec(join_uri(self._uri, 'accessibility', accessibility), 'PUT') def users(self): """ Gets all registered users for this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).get('login', always_list=True) def owners(self): """ Gets owners of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Owners' ).get('login', always_list=True) def members(self): """ Gets members of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Members' ).get('login', always_list=True) def collaborators(self): """ Gets collaborator of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Collaborators' ).get('login', always_list=True) def user_role(self, login): """ Gets the user level of the user for this project. Parameters ---------- login: string A user of the project. Returns ------- string : owner | member | collaborator """ j = JsonTable(self._intf._get_json(join_uri(self._uri, 'users'))) return ''.join(j.where(login=login)['displayname']).lower().rstrip('s') def add_user(self, login, role='member'): """ Adds a user to the project. The user must already exist on the server. Parameters ---------- login: string Valid username for the XNAT database. role: owner | member | collaborator The user level for this project: - owner: read and write access, as well as administrative privileges such as adding and removing users. - member: read access and can create new resources but not remove them. - collaborator: read access only. """ self._intf._exec(join_uri(self._uri, 'users', role.lstrip('s').title() + 's', login ), 'PUT') def remove_user(self, login): """ Removes a user from the project. Parameters ---------- login: string Valid username for the XNAT database. """ self._intf._exec(join_uri(self._uri, 'users', self.user_role(login).title() + 's', login ), 'DELETE') def datatype(self): return 'xnat:projectData' def experiments(self, id_filter='*'): datapath = '%s/projects/%s/experiments' dp = datapath % (self._intf._get_entry_point(), self.id()) return Experiments(dp, self._intf, id_filter) def experiment(self, ID): datapath = '%s/projects/%s/experiments/%s' dp = datapath % (self._intf._get_entry_point(), self.id(), ID) tmp = Experiment(dp, self._intf) if tmp.id() == ID: return tmp else: # if id id not mach given id (which may have been a label # re-select with the ID of the matching experiment. return Experiment(datapath % ( self._intf._get_entry_point(), self.id(), tmp.id()), self._intf ) def last_modified(self): """ Gets the last modified dates for all the project subjects. If any element related to a subject changes, experiment, variable, scan, image etc... the date will be changed. """ uri = '%s/subjects?columns=last_modified' % self._uri return dict(JsonTable(self._intf._get_json(uri), order_by=['ID', 'last_modified'] ).select(['ID', 'last_modified'] ).items() ) def add_custom_variables(self, custom_variables, allow_data_deletion=False): """Adds a custom variable to a specified group Parameters ---------- custom_variables: a dictionary allow_data_deletion : a boolean Examples -------- >>> variables = {'Subjects' : {'newgroup' : {'foo' : 'string', 'bar': 'int'}}} >>> project.add_custom_variables(variables) """ tree = lxml.etree.fromstring(self.get()) update = False for protocol, value in custom_variables.items(): try: protocol_element = tree.xpath( "//xnat:studyProtocol[@name='%s']" % protocol, namespaces=tree.nsmap).pop() except IndexError: raise ValueError( 'Protocol %s not in current schema' % protocol ) try: definitions_element = protocol_element.xpath( 'xnat:definitions', namespaces=tree.nsmap).pop() except IndexError: update = True definitions_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'], 'definitions'), nsmap=tree.nsmap ) protocol_element.append(definitions_element) for group, fields in value.items(): try: group_element = definitions_element.xpath( "xnat:definition[@ID='%s']" % group, namespaces=tree.nsmap).pop() fields_element = group_element.xpath( "xnat:fields", namespaces=tree.nsmap).pop() except IndexError: update = True group_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'], 'definition'), nsmap=tree.nsmap ) group_element.set('ID', group) group_element.set( 'data-type', protocol_element.get('data-type')) group_element.set('description', '') group_element.set('project-specific', '1') definitions_element.append(group_element) fields_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'], 'fields'), nsmap=tree.nsmap ) group_element.append(fields_element) for field, datatype in fields.items(): try: field_element = fields_element.xpath( "xnat:field[@name='%s']" % field, namespaces=tree.nsmap).pop() except IndexError: field_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'], 'field'), nsmap=tree.nsmap) field_element.set('name', field) field_element.set('datatype', datatype) field_element.set('type', 'custom') field_element.set('required', '0') field_element.set( 'xmlPath', "xnat:%s/fields/field[name=%s]/field" % ( protocol_element.get( 'data-type').split(':')[-1], field) ) fields_element.append(field_element) update = True if update: body, content_type = httputil.file_message( lxml.etree.tostring(tree).decode('utf-8'), 'text/xml', 'cust.xml', 'cust.xml' ) uri = self._uri if allow_data_deletion: uri = self._uri + '?allowDataDeletion=true' self._intf._exec(uri, method='PUT', body=str(body), headers={'content-type': content_type}) def get_custom_variables(self): """Retrieves custom variables as a dictionary It has the format {studyProtocol: { setname : {field: type, ...}}} """ tree = lxml.etree.fromstring(self.get()) nsmap = tree.nsmap custom_variables = {} for studyprotocols in tree.xpath('//xnat:studyProtocol', namespaces=nsmap): protocol_name = studyprotocols.get('name') custom_variables[protocol_name] = {} for definition in studyprotocols.xpath(('xnat:definitions' '/xnat:definition'), namespaces=nsmap): definition_id = definition.get('ID') custom_variables[protocol_name][definition_id] = {} for field in definition.xpath('xnat:fields/xnat:field', namespaces=nsmap): field_name = field.get('name') if field.get('type') == 'custom': custom_variables[protocol_name][definition_id][ field_name] = field.get('datatype') return custom_variables def aliases(self): """Returns the aliases for this project. Returns ------- List of aliases """ uri = '/data/projects' options = {'columns': 'alias', 'format': 'csv'} data = self._intf.get(uri, params=options).text from .jsonutil import csv_to_json data = csv_to_json(data) # parse the results return [item['alias'] for item in data if item['alias'] and item['ID'] == self._urn] def description(self): """Returns the description for this project. Returns ------- Description (string) of the project. """ return self.attrs.get('description') @add_metaclass(ElementType) class Subject(EObject): def datatype(self): return 'xnat:subjectData' def __repr__(self): interface = self._intf # Check if subject exists if self.exists(): subject_id = self.id() columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', 'xnat:subjectData/HANDEDNESS_TEXT', 'xnat:subjectData/SES', 'xnat:subjectData/ADD_IDS', 'xnat:subjectData/RACE', 'xnat:subjectData/ETHNICITY', 'xnat:subjectData/SUBJECT_LABEL'] dt = 'xnat:subjectData' data = interface.select(dt, columns=columns).all().data interface._subjectData = data data = [e for e in data if e['subject_id'] == subject_id][0] # Collecting subject details url = interface._server + self._uri + '?format=html' project_id = data['project'] age = self.attrs.get('age') gender = data['gender_text'] handedness = data['handedness_text'] label = data['subject_label'] n_expes = len(list(self.experiments())) ag = '' if [age, gender, handedness] != ['', '', '']: ag = [] if age != '': ag.append('Age: %s' % age) if gender != '': ag.append('Gender: %s' % gender) if handedness != '': ag.append('Handedness: %s' % handedness) ag = '(%s)' % ' - '.join(ag) # Creating the output string to be returned output = '<{cl} Object> {id} `{label}` (project: {project}) {ag}'\ ' {n_expes} experiment{final_s} {url}' output = output.format(cl=self.__class__.__name__, label=label, id=subject_id, project=project_id, url=url, ag=ag, n_expes=n_expes, final_s={True: 's', False: ''}[n_expes > 1]) return output else: return '<%s Object> %s' % (self.__class__.__name__, unquote(uri_last(self._uri)) ) def shares(self, id_filter='*'): """ Returns the projects sharing this subject. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this subject with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove subject from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') @add_metaclass(ElementType) class Experiment(EObject): def __init__(self, cbase, interface): items = cbase.split('/') e = [] if 'subjects' not in items \ and 'projects' in items and 'experiments' in items: ID = uri_last(cbase) e = interface.array.experiments(experiment_id=ID).data if len(e) == 1: subject_id = e[0]['subject_ID'] project_id = e[0]['project'] cbase = '%s/projects/%s/subjects/%s/experiments/%s' cbase = cbase % (interface._get_entry_point(), project_id, subject_id, ID) return super(Experiment, self).__init__(cbase, interface) return super(Experiment, self).__init__(cbase, interface) def __repr__(self): intf = self._intf # Check if experiment exists if self.exists(): eid = self.id() e = intf.array.experiments(experiment_id=eid).data[0] filter = [('{}/{}'.format(e['xsiType'], 'ID'), '=', eid)] data = intf.select(e['xsiType']).where(filter).data[0] # Collecting experiment details project_id = data['project'] label = self.label() subject_id = data['subject_id'] e = intf.array.experiments(experiment_id=eid, columns=['subject_label']).data[0] subject_label = e['subject_label'] insert_date = data['insert_date'] n_res = len(list(self.resources())) n_scans = len(list(self.scans())) url = intf._server + self._uri + '?format=html' # Creating the output string output = '<{cl} Object> {id} `{label}` (subject: {subject_id} '\ '`{subject_label}`) (project: {project}) {n_scans} '\ 'scan{final_s1} {n_res} resource{final_s2} (created on '\ '{insert_date}) {url}' fs = {True: 's', False: ''} output = output.format(cl=self.__class__.__name__, id=eid, label=label, subject_id=subject_id, subject_label=subject_label, project=project_id, url=url, n_res=n_res, insert_date=insert_date, n_scans=n_scans, final_s1=fs[n_scans > 1], final_s2=fs[n_res > 1]) return output else: return '<%s Object> %s' % (self.__class__.__name__, unquote(uri_last(self._uri))) def shares(self, id_filter='*'): """ Returns the projects sharing this experiment. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this experiment with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove experiment from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') def trigger_pipelines(self): """ Triggers the AutoRun pipeline. """ self._intf._exec(self._uri + '?triggerPipelines=true', 'PUT') def fix_scan_types(self): """ Populate empty scan TYPE attributes based on how similar scans were populated. """ self._intf._exec(self._uri + '?fixScanTypes=true', 'PUT') def pull_data_from_headers(self): """ Pull DICOM header values into the session. """ self._intf._exec(self._uri + '?pullDataFromHeaders=true', 'PUT') def trigger(self, pipelines=True, fix_types=True, scan_headers=True): """ Run several triggers in a single call. Parameters ---------- pipelines: boolean Same as trigger_pipelines. fix_types: boolean Same as fix_scan_types. scan_headers: boolean Same as pull_data_from headers. """ if not all([not pipelines, not fix_types, not scan_headers]): options = [] if pipelines: options.append('triggerPipelines=true') if fix_types: options.append('fixScanTypes=true') if scan_headers: options.append('pullDataFromHeaders=true') options = '?' + '&'.join(options) self._intf._exec(self._uri + options, 'PUT', body=[]) @add_metaclass(ElementType) class Assessor(EObject): def __init__(self, uri, interface): EObject.__init__(self, uri, interface) self.provenance = Provenance(self) def shares(self, id_filter='*'): """ Returns the projects sharing this assessor. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this assessor with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove assessor from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') def set_param(self, key, value): self.attrs.set('%s/parameters/addParam[name=%s]/addField' % (self.datatype(), key), value ) def get_param(self, key): return self.xpath( "//xnat:addParam[@name='%s']/child::text()" % key)[-1] def get_params(self): return self.xpath("//xnat:addParam/child::text()")[1::2] def params(self): return self.xpath('//xnat:addParam/attribute::*') @add_metaclass(ElementType) class Reconstruction(EObject): def __init__(self, uri, interface): EObject.__init__(self, uri, interface) self.provenance = Provenance(self) def datatype(self): return (super(Reconstruction, self).datatype() or 'xnat:reconstructedImageData' ) @add_metaclass(ElementType) class Scan(EObject): def __repr__(self): interface = self._intf # Check if scan exists if self.exists(): scan_id = self.id() # Collect scan details attrs = ['ID', 'type', 'frames', 'quality'] base_url = uri_parent(self._uri) scans = self._intf._get_json('{}?columns={}'.format(base_url, ','.join(attrs))) scan_info = [r for r in scans if r['ID'] == scan_id][0] url = interface._server + self._uri + '?format=html' # Creating the output string output = '<{cl} Object> {id} (`{type}` {n_frames} frames) {quality} {url}' output = output.format(cl=self.__class__.__name__, id=scan_id, type=scan_info['type'], n_frames=scan_info['frames'], quality=scan_info['quality'], url=url) return output else: return '<%s Object> %s' % (self.__class__.__name__, unquote(uri_last(self._uri)) ) def set_param(self, key, value): self.attrs.set('%s/parameters/addParam[name=%s]/addField' % (self.datatype(), key), value ) def get_param(self, key): return self.xpath( "//xnat:addParam[@name='%s']/child::text()" % key)[-1] def get_params(self): return self.xpath("//xnat:addParam/child::text()")[1::2] def params(self): return self.xpath('//xnat:addParam/attribute::*') @add_metaclass(ElementType) class Resource(EObject): def __repr__(self): def sizeof_fmt(num, suffix='B'): for unit in ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z']: if abs(num) < 1024.0: return "%3.2f %s%s" % (num, unit, suffix) num /= 1024.0 return "%.2f %s%s" % (num, 'Y', suffix) # Check if resource exists if self.exists(): resource_id = self.id() base_url = uri_parent(self._uri) resources = self._intf._get_json(base_url) res_info = [r for r in resources if r['xnat_abstractresource_id'] == resource_id][0] fs = sizeof_fmt(float(res_info['file_size'])) # Creating the output string output = '<{cl} Object> {id} `{label}` ({fc} files {fs})' output = output.format(label=self.label(), cl=self.__class__.__name__, id=resource_id, fc=res_info['file_count'], fs=fs) return output else: return '<%s Object> %s' % (self.__class__.__name__, unquote(uri_last(self._uri))) def get(self, dest_dir, extract=False): """ Downloads all the files within a resource. ..warning:: Currently XNAT adds parent folders in the zip file that is downloaded to avoid name clashes if several resources are downloaded in the same folder. In order to be able to download the data uploaded previously with the same structure, pyxnat extracts the zip file, removes the extra paths and if necessary re-zips it. Careful, it may take time, and there is the problem of name clashes. Parameters ---------- dest_dir: string Destination directory for the resource data. if dest_dir is None, then the user's Downloads directory is used as the default download location. extract: boolean If True, the downloaded zip file is extracted. If False, not extracted. Returns ------- If extract is False, the zip file path. If extract is True, the list of file paths previously in the zip. """ zip_location = op.join(dest_dir, uri_last(self._uri) + '.zip') with open(zip_location, 'wb') as f: response = self._intf.get(join_uri(self._uri, 'files') + '?format=zip', stream=True) try: count = 0 for chunk in response.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) count += 1 if count % 10 == 0: # flush the buffer every once in a while. f.flush() f.flush() # and one last flush. except Exception as e: sys.stderr.write(e) finally: response.close() if DEBUG: print(zip_location) fzip = zipfile.ZipFile(zip_location, 'r') fzip.extractall(path=dest_dir) fzip.close() members = [] fzip_namelist = [str(Path(item)) for item in fzip.namelist()] for member in fzip_namelist: old_path = op.join(dest_dir, member) if DEBUG: print(member) print(member.split('files', 1)) new_path = op.join( dest_dir, uri_last(self._uri), member.split('files', 1)[1].split(os.sep, 1)[1] ) if not op.exists(op.dirname(new_path)): os.makedirs(op.dirname(new_path)) shutil.move(old_path, new_path) members.append(new_path) # TODO: cache.delete(...) for extracted in fzip_namelist: pth = op.join(dest_dir, extracted.split(os.sep, 1)[0]) if op.isdir(pth): shutil.rmtree(pth) os.remove(zip_location) if not extract: fzip = zipfile.ZipFile(zip_location, 'w') arcprefix = op.commonprefix(members).rpartition(os.sep)[0] arcroot = '/%s' % op.split(arcprefix.rstrip(os.sep))[1] for member in members: opj = op.join(arcroot, member.split(arcprefix)[1]) fzip.write(member, opj) fzip.close() unzippedTree = op.join(dest_dir, uri_last(self._uri)) if op.exists(unzippedTree): if op.isdir(unzippedTree): shutil.rmtree(op.join(dest_dir, uri_last(self._uri))) else: os.remove(unzippedTree) return zip_location if op.exists(zip_location) else members def put(self, sources, overwrite=False, extract=True, **datatypes): """ Insert a list of files in a single resource element. This method takes all the files an creates a zip with them which will be the element to be uploaded and then extracted on the server. If the files have a common prefix directory, that directory name will be used. If not, then "files" will be used as the zip name. If avaiable, compression will be used on the zip file. Parameters ---------- sources: List of paths of files to upload. overwrite: boolean If True, overwrite the files that already exist under the given id. If False, do not overwrite (Default) extract: boolean If True, the uploaded zip file is extracted. (Default) If False, the file is not extracted. """ zip_location = tempfile.mkdtemp(suffix='pyxnat') # get the largest common directory. arcprefix, _, _ = op.commonprefix(sources).rpartition(op.sep) # get just the name of the largest common directory. zip_name = op.split(arcprefix.rstrip(op.sep))[1] arcroot = '/%s' % zip_name if not zip_name: # if no common prefix, then use "files" as the zip file name. # inside, each file will be directly under the zip root. zip_name = "files" zip_name = op.join(zip_location, zip_name + ".zip") fzip = None try: # use compression if avaiable. fzip = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) except RuntimeError: print("Zip compression not supported for uploading files.") fzip = zipfile.ZipFile(zip_name, 'w') for src in sources: fzip.write(src, op.join(arcroot, src.split(arcprefix)[1])) fzip.close() self.put_zip(zip_name, overwrite=overwrite, extract=extract, **datatypes) os.remove(zip_name) os.rmdir(zip_location) def put_zip(self, zip_location, overwrite=False, extract=True, **datatypes): """ Uploads a zip or tgz file an then extracts it on the server. After the compressed file is extracted the individual files are accessible separately, or as a whole using get_zip. Parameters ---------- zip_location: Path to zip file for upload. overwrite: boolean If True, overwrite the files that already exist under the given id. If False, do not overwrite (Default) extract: boolean If True, the uploaded zip file is extracted. (Default) If False, the file is not extracted. """ if not self.exists(): self.create(**datatypes) if extract: do_extract = '?extract=true' else: do_extract = '' self.file(op.split(zip_location)[1] + do_extract ).put(zip_location, overwrite=overwrite, **datatypes) def put_dir(self, src_dir, overwrite=False, extract=True, **datatypes): """ Finds recursively all the files in a folder and uploads them using `insert`. Uses put_zip internally. Parameters ---------- src_dir: Path to directory to upload. overwrite: boolean If True, overwrite the files that already exist under the given id. If False, do not overwrite (Default) extract: boolean If True, the uploaded zip file is extracted. (Default) If False, the file is not extracted. """ self.put(find_files(src_dir), overwrite=overwrite, extract=extract, **datatypes) batch_insert = put zip_insert = put_zip dir_insert = put_dir def datatype(self): return (super(Resource, self).datatype() or 'xnat:abstractResource' ) def attributes(self): """ Files attributes include: - URI - Name - Size in bytes - path (relative to the parent resource) - tags - format - content Returns ------- dict : a dictionary with the resource attributes """ return self._getcells(['URI', 'Name', 'Size', 'path', 'tags', 'format', 'content']) class In_Resource(Resource): def parent(self): uri = uri_grandparent(self._uri) Klass = globals()[uri.split('/')[-3].title().rsplit('s', 1)[0]] return Klass(uri_parent(uri), self._intf) @add_metaclass(ElementType) class Out_Resource(Resource): def parent(self): uri = uri_grandparent(self._uri) Klass = globals()[uri.split('/')[-3].title().rsplit('s', 1)[0]] return Klass(uri_parent(uri), self._intf) @add_metaclass(ElementType) class File(EObject): """ EObject for files stored in XNAT. """ def __init__(self, uri, interface): """ Parameters ---------- uri: string The file resource URI interface: Interface Object """ EObject.__init__(self, uri, interface) self._urn = file_path(uri) self._absuri = None def __repr__(self): return '<%s Object> %s' % (self.__class__.__name__, self._urn) def attributes(self): """ Files attributes include: - URI - Name - Size in bytes - path (relative to the parent resource) - file_tags - file_format - file_content Returns ------- dict : a dictionary with the file attributes """ return self._getcells(['URI', 'Name', 'Size', 'path', 'file_tags', 'file_format', 'file_content']) def get(self, dest=None): """ Downloads the file. Parameters ---------- dest: string | None - If dest is None, then the user's Downloads directory is used as the default download location. - Else the file is downloaded at the requested location. Path should include the file name. eg: /path/to/file.txt Returns ------- string : the file location. """ if not self._absuri: self._absuri = self._getcell('URI') if self._absuri is None: raise DataError('Cannot get file: does not exists') if not dest: dest = op.join(op.expanduser("~"), 'Downloads', self.id()) if not ensure_dir_exists(op.dirname(dest)): if DEBUG: print("File.get: failed to create dir") raise DataError('Cannot create dir for file: %s' % (dest)) if DEBUG: print(("get_file:", dest)) with open(dest, 'wb') as f: response = self._intf.get(self._uri, stream=True) try: count = 0 for chunk in response.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) count += 1 if count % 10 == 0: # flush the buffer every once in a while. f.flush() f.flush() # and one last flush. except Exception as e: sys.stderr.write(e) finally: response.close() return dest def get_copy(self, dest=None): """ Downloads the file to the cache directory but creates a copy at the specified location. Parameters ---------- dest: string | None - file path for the copy - if None a copy is created at a default location based on the file URI on the server Returns ------- string : the copy location. """ return self.get(dest) def put(self, src, format='U', content='U', tags='U', overwrite=False, **datatypes): """ Uploads a file to XNAT. Parameters ---------- src: string Location of the local file to upload or the actual content to upload. format: string Optional parameter to specify the file format. Defaults to 'U'. content: string Optional parameter to specify the file content. Defaults to 'U'. tags: string Optional parameter to specify tags for the file. Defaults to 'U'. overwrite: boolean Optional parameter to specify if the file should be overwritten. Defaults to False. """ # First make sure parents and grandparents exist. # URI is in the form of data/.../something/files/me so # guri = data/.../something guri = uri_grandparent(self._uri) if not self._intf.select(guri).exists(): self._intf.select(guri).insert(**datatypes) resource_id = self._intf.select(guri).id() isFile = False # Cleanup the src and make sure it exists. try: if op.exists(src): isFile = True # path = src # name = op.basename(path).split('?')[0] # else: # path = self._uri.split('/')[-1] # name = path except Exception: pass # FIXME # path = self._uri.split('/')[-1] # name = path self._absuri = unquote( re.sub('resources/.*?/', 'resources/%s/' % resource_id, self._uri) ) query_args = { 'format': format, 'content': content, 'tags': tags, 'overwrite': 'true' if overwrite else 'false', 'inbody': 'true' } if 'params' in datatypes: query_args.update(datatypes['params']) # Pass on params such as event_reason if '?' in self._absuri: k, v = self._absuri.split('?')[1].split('=') query_args[k] = v self._absuri = self._absuri.split('?')[0] if DEBUG: print(('INSERT FILE', op.exists(src))) print("URI is: " + self._absuri) response = None if isFile: # If src was a file, use inbody streaming to send the file with open(src, 'rb') as f: response = self._intf.post(self._absuri, params=query_args, data=f) else: # If it wasn't a file we can just dump the src as data directly. response = self._intf.post(self._absuri, params=query_args, data=src) # default error handling. if (response is not None and not response.ok) or \ is_xnat_error(response.content): if DEBUG: print(response.keys()) print(response.get("status")) msg = '''pyxnat.file.put failure: URI: {response.url} status code: {response.status_code} headers: {response.headers} content: {response.content} '''.format(response=response) catch_error(response.content, msg) insert = put create = put def delete(self): """ Deletes the file on the server. """ if not self._absuri: self._absuri = self._getcell('URI') if self._absuri is None: raise DataError('Cannot delete file: does not exists') return self._intf._exec(self._absuri, 'DELETE') def size(self): """ Gets the file size. """ return self._getcell('Size') def labels(self): """ Gets the file labels. """ return self._getcell('file_tags') def format(self): """ Gets the file format. """ return self._getcell('file_format') def content(self): """ Gets the file content description. """ return self._getcell('file_content') def last_modified(self): """ Gets the file last-modified date. """ if not self._absuri: self._absuri = self._getcell('URI') if self._absuri is None: raise DataError('Cannot get file: does not exists') info = self._intf._get_head(self._absuri) return info['last-modified'] @add_metaclass(ElementType) class In_File(File): pass @add_metaclass(ElementType) class Out_File(File): pass @add_metaclass(CollectionType) class Projects(CObject): pass @add_metaclass(CollectionType) class Subjects(CObject): def sharing(self, projects=[]): return Subjects([eobj for eobj in self if set(projects).issubset(eobj.shares().get())], self._intf) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) @add_metaclass(CollectionType) class Experiments(CObject): def sharing(self, projects=[]): return Experiments([eobj for eobj in self if set(projects).issubset(eobj.shares().get())], self._intf) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) @add_metaclass(CollectionType) class Assessors(CObject): def sharing(self, projects=[]): return Assessors([eobj for eobj in self if set(projects).issubset(eobj.shares().get()) ], self._intf ) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) def download(self, dest_dir, type="ALL", name=None, extract=False, safe=False, removeZip=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe, removeZip) @add_metaclass(CollectionType) class Reconstructions(CObject): def download(self, dest_dir, type="ALL", name=None, extract=False, safe=False, removeZip=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe, removeZip) @add_metaclass(CollectionType) class Scans(CObject): def download(self, dest_dir, type="ALL", name=None, extract=False, safe=False, removeZip=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe, removeZip) @add_metaclass(CollectionType) class Resources(CObject): pass @add_metaclass(CollectionType) class In_Resources(Resources): pass @add_metaclass(CollectionType) class Out_Resources(Resources): pass @add_metaclass(CollectionType) class Files(CObject): pass @add_metaclass(CollectionType) class In_Files(Files): pass @add_metaclass(CollectionType) class Out_Files(Files): pass # Utility functions for downloading and extracting zip archives def _datatypes_from_query(query): datatypes = [] for constraint in query: if isinstance(constraint, list): datatypes.extend(_datatypes_from_query(constraint)) elif isinstance(constraint, tuple): datatypes.append(constraint[0].split('/')[0]) return datatypes def query_with(interface, join_field, common_field, return_values, _filter): _stm = (join_field.split('/')[0], return_values) _cls = rewrite_query(interface, join_field, common_field, _filter) return interface.select(*_stm).where(_cls) def rewrite_query(interface, join_field, common_field, _filter): _new_filter = [] for _f in _filter: if isinstance(_f, list): _new_filter.append(rewrite_query( interface, join_field, common_field, _f)) elif isinstance(_f, tuple): _datatype = _f[0].split('/')[0] _res = interface.select( _datatype, ['%s/%s' % (_datatype, common_field)] ).where([_f, 'AND']) _new_f = [(join_field, '=', '%s' % sid) for sid in _res['subject_id'] ] _new_f.append('OR') _new_filter.append(_new_f) elif isinstance(_f, (str, unicode)): _new_filter.append(_f) else: raise Exception('Invalid filter') return _new_filter pyxnat-1.4/pyxnat/core/schema.py000066400000000000000000000121071374563466300170100ustar00rootroot00000000000000from six import string_types # REST collection resources tree resources_tree = { 'projects': ['subjects', 'resources'], 'subjects': ['experiments', 'resources'], 'experiments': ['assessors', 'reconstructions', 'scans', 'resources'], 'assessors': ['resources', 'in_resources', 'out_resources'], 'reconstructions': ['in_resources', 'out_resources'], 'scans': ['resources'], 'resources': ['files'], 'files': [], 'in_resources': ['files'], 'in_files': [], 'out_resources': ['files'], 'out_files': [], } prearc_tree = {'projects': ['scans'], 'scans': ['resources'], 'resources': ['files'] } # REST resources that are not natively supported extra_resources_tree = {'projects': ['assessors', 'scans', 'reconstructions'], 'subjects': ['assessors', 'scans', 'reconstructions'], } # REST translation table rest_translation = {'in_resources': 'in/resources', 'in_files': 'in/files', 'out_resources': 'out/resources', 'out_files': 'out/files', 'in_resource': 'in/resource', 'in_file': 'in/file', 'out_resource': 'out/resource', 'out_file': 'out/file', } # REST json format json = {'projects': ['ID', 'ID'], 'subjects': ['ID', 'label'], 'experiments': ['ID', 'label'], 'assessors': ['ID', 'label'], 'reconstructions': ['ID', 'label'], 'scans': ['ID', 'ID'], 'resources': ['xnat_abstractresource_id', 'label'], 'out_resources': ['xnat_abstractresource_id', 'label'], 'in_resources': ['xnat_abstractresource_id', 'label'], 'files': ['path', 'path']} resources_singular = [key.rsplit('s', 1)[0] for key in resources_tree.keys()] resources_plural = resources_tree.keys() resources_types = resources_singular + list(resources_plural) default_datatypes = {'projects': 'xnat:projectData', 'subjects': 'xnat:subjectData', 'experiments': 'xnat:mrSessionData', 'assessors': 'xnat:mrAssessorData', 'reconstructions': 'xnat:reconstructedImageData', 'scans': 'xnat:mrScanData', 'resources': None, 'in_resources': None, 'out_resources': None, } def datatype_attributes(root, datatype): def _iterchildren(node, pathsofar): elements = [] for child in node.iterchildren(): if isinstance(child.tag, string_types) \ and child.tag.split('}')[1] == 'element': elements.append('%s/%s' % (pathsofar, child.get('name'))) elements.extend(_iterchildren(child, '%s/%s' % (pathsofar, child.get('name')))) elif isinstance(child.tag, string_types) and \ child.tag.split('}')[1] == 'attribute': elements.append('%s/%s' % (pathsofar, child.get('name'))) elif isinstance(child.tag, string_types) \ and child.tag.split('}')[1] == 'extension': ct_xpath = "/xs:schema/xs:complexType[@name='%s']" % \ child.get('base').split(':')[1] rt = node.getroottree() for complex_type in rt.xpath(ct_xpath, namespaces=child.nsmap): same = False for ancestor in child.iterancestors(): if ancestor.get('name') == \ child.get('base').split(':')[1]: same = True break if not same: elements.extend(_iterchildren(complex_type, pathsofar) ) elements.extend(_iterchildren(child, pathsofar)) else: elements.extend(_iterchildren(child, pathsofar)) return elements ct_xpath = "/xs:schema/xs:complexType[@name='%s']" % \ datatype.split(':')[1] attributes = [] for complex_type in root.xpath(ct_xpath, namespaces=root.nsmap): for child in complex_type.iterchildren(): attributes.extend(_iterchildren(child, datatype)) return attributes def datatypes(root): nsmap = get_nsmap(root) return [element.get('type') for element in root.xpath('/xs:schema/xs:element', namespaces=nsmap)] def get_nsmap(node): nsmap = node.nsmap none_ns = node.nsmap.get(None) if none_ns is None: nsmap[none_ns.rsplit('/', 1)[1]] = none_ns del nsmap[None] return nsmap def class_name(self): """ Return the name of this class without qualification. eg. If the class name is "x.y.class" return only "class" """ return self.__class__.__name__.split('.')[-1] pyxnat-1.4/pyxnat/core/search.py000066400000000000000000000626551374563466300170320ustar00rootroot00000000000000import csv import difflib try: from StringIO import StringIO except ImportError: from io import StringIO try: unicode import sys reload(sys) # Reload does the trick! sys.setdefaultencoding('UTF8') except NameError: unicode = str from six import string_types from lxml import etree from .jsonutil import JsonTable, get_column, get_where, get_selection from .errors import is_xnat_error, catch_error from .errors import ProgrammingError, NotSupportedError from .errors import DataError, DatabaseError search_nsmap = {'xdat': 'http://nrg.wustl.edu/security', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} special_ops = {'*': '%', } def build_search_document(root_element_name, columns, criteria_set, brief_description='', long_description='', allowed_users=[]): root_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'bundle'), nsmap=search_nsmap ) root_node.set('ID', "@%s" % root_element_name) root_node.set('brief-description', brief_description) root_node.set('description', long_description) root_node.set('allow-diff-columns', "0") root_node.set('secure', "false") root_element_name_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'root_element_name'), nsmap=search_nsmap ) root_element_name_node.text = root_element_name root_node.append(root_element_name_node) for i, column in enumerate(columns): element_name, field_ID = column.split('/', 1) search_field_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'search_field'), nsmap=search_nsmap ) element_name_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'element_name'), nsmap=search_nsmap ) element_name_node.text = element_name field_ID_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'field_ID'), nsmap=search_nsmap ) field_ID_node.text = field_ID sequence_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'sequence'), nsmap=search_nsmap ) sequence_node.text = str(i) type_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'type'), nsmap=search_nsmap ) type_node.text = 'string' header_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'header'), nsmap=search_nsmap ) header_node.text = column search_field_node.extend([element_name_node, field_ID_node, sequence_node, type_node, header_node ]) root_node.append(search_field_node) search_where_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'search_where'), nsmap=search_nsmap ) root_node.append(build_criteria_set(search_where_node, criteria_set)) if allowed_users != []: allowed_users_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'allowed_user'), nsmap=search_nsmap ) for allowed_user in allowed_users: login_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'login'), nsmap=search_nsmap ) login_node.text = allowed_user allowed_users_node.append(login_node) root_node.append(allowed_users_node) return etree.tostring(root_node.getroottree()) def build_criteria_set(container_node, criteria_set): for criteria in criteria_set: if isinstance(criteria, string_types): container_node.set('method', criteria) if isinstance(criteria, (list)): sub_container_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'child_set'), nsmap=search_nsmap ) container_node.append( build_criteria_set(sub_container_node, criteria)) if isinstance(criteria, (tuple)): if len(criteria) != 3: raise ProgrammingError('%s should be a 3-element tuple' % str(criteria)) constraint_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'criteria'), nsmap=search_nsmap ) constraint_node.set('override_value_formatting', '0') schema_field_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'schema_field' ), nsmap=search_nsmap ) schema_field_node.text = criteria[0] comparison_type_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'comparison_type' ), nsmap=search_nsmap ) comparison_type_node.text = special_ops.get(criteria[1], criteria[1] ) value_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'value'), nsmap=search_nsmap ) value_node.text = criteria[2].replace('*', special_ops['*']) constraint_node.extend([ schema_field_node, comparison_type_node, value_node]) container_node.append(constraint_node) return container_node def query_from_xml(document): query = {} root = etree.fromstring(document) _nsmap = root.nsmap query['description'] = root.get('description', default="") query['row'] = root.xpath('xdat:root_element_name', namespaces=root.nsmap)[0].text query['columns'] = [] for node in root.xpath('xdat:search_field', namespaces=_nsmap): en = node.xpath('xdat:element_name', namespaces=root.nsmap)[0].text fid = node.xpath('xdat:field_ID', namespaces=root.nsmap)[0].text query['columns'].append('%s/%s' % (en, fid)) query['users'] = [ node.text for node in root.xpath('xdat:allowed_user/xdat:login', namespaces=root.nsmap ) ] try: search_where = root.xpath('xdat:search_where', namespaces=root.nsmap)[0] query['constraints'] = query_from_criteria_set(search_where) except Exception: query['constraints'] = [('%s/ID' % query['row'], 'LIKE', '%'), 'AND'] return query def query_from_criteria_set(criteria_set): query = [] query.append(criteria_set.get('method')) _nsmap = criteria_set.nsmap for criteria in criteria_set.xpath('xdat:criteria', namespaces=_nsmap): _f = criteria.xpath('xdat:schema_field', namespaces=_nsmap)[0] _o = criteria.xpath('xdat:comparison_type', namespaces=_nsmap)[0] _v = criteria.xpath('xdat:value', namespaces=_nsmap)[0] constraint = (_f.text, _o.text, _v.text) query.insert(0, constraint) for child_set in criteria_set.xpath('xdat:child_set', namespaces=_nsmap): query.insert(0, query_from_criteria_set(child_set)) return query def rpn_contraints(rpn_exp): left = [] right = [] triple = [] for i, t in enumerate(rpn_exp.split()): if t in ['AND', 'OR']: if 'AND' in right or 'OR' in right and left == []: try: operator = right.pop(right.index('AND')) except Exception: operator = right.pop(right.index('OR')) left = [right[0]] left.append(right[1:] + [t]) left.append(operator) right = [] elif right != []: right.append(t) if left != []: left.append(right) else: left = right[:] right = [] elif right == [] and left != []: left = [left] left.append(t) right = left[:] left = [] else: raise ProgrammingError('in expression %s' % rpn_exp) else: triple.append(t) if len(triple) == 3: right.append(tuple(triple)) triple = [] return left if left != [] else right # --------------------------------------------------------------- class SearchManager(object): """ Search interface. Handles operations to save and get back searches on the server. Examples -------- >>> row = 'xnat:subjectData' >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID' ] >>> criteria = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '*'), 'AND' ] >>> interface.manage.search.save('mysearch', row, columns, criteria, sharing='public', description='my first search' ) """ def __init__(self, interface): self._intf = interface def _save_search(self, row, columns, constraints, name, desc, sharing): self._intf._get_entry_point() name = name.replace(' ', '_') if sharing == 'private': users = [self._intf._user] elif sharing == 'public': users = [] elif isinstance(sharing, list): users = sharing else: raise NotSupportedError('Share mode %s not valid' % sharing) self._intf._exec( '%s/search/saved/%s?inbody=true' % (self._intf._entry, name), method='PUT', body=build_search_document(row, columns, constraints, name, desc.replace('%', '%%'), users ) ) def save(self, name, row, columns, constraints, sharing='private', description=''): """ Saves a query on the XNAT server. Parameters ---------- name: string Name of the query displayed on the Web Interface and used to get back the results. row: string Datatype from `Interface.inspect.datatypes()`. Usually ``xnat:subjectData`` columns: list List of data fields from `Interface.inspect.datatypes('*', '*')` constraints: list See also: `Search.where()` sharing: string | list Define by whom the query is visible. If sharing is a string it may be either ``private`` or ``public``. Otherwise a list of valid logins for the XNAT server from `Interface.users()`. See Also -------- :func:`Search.where` """ self._save_search(row, columns, constraints, name, description, sharing) def saved(self, with_description=False): """ Returns the names of accessible saved search on the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) if with_description: return [(ld['brief_description'], ld['description'].replace('%%', '%')) for ld in get_selection(jdata, ['brief_description', 'description' ] ) if not ld['brief_description'].startswith('template_')] else: return [name for name in get_column(jdata, 'brief_description') if not name.startswith('template_')] def get(self, name, out_format='results'): """ Returns the results of the query saved on the XNAT server or the query itself to know what it does. Parameters ---------- name: string Name of the saved search. An exception is raised if the name does not exist. out_format: string Can take the following values: - results to download the results of the search - xml to download the XML document defining the search - query to get the pyxnat representation of the search """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description=name)[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) if out_format in ['xml', 'query']: bundle = self._intf._exec( '%s/search/saved/%s' % (self._intf._entry, search_id ), 'GET') if out_format == 'xml': return bundle else: return query_from_xml(bundle) content = self._intf._exec( '%s/search/saved/%s/results?format=csv' % (self._intf._entry, search_id), 'GET') results = csv.reader(StringIO(content.decode('utf-8')), delimiter=',', quotechar='"') headers = next(results) return JsonTable([dict(zip(headers, res)) for res in results ], headers ) def delete(self, name): """ Removes the search from the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description=name)[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) self._intf._exec('%s/search/saved/%s' % (self._intf._entry, search_id ), 'DELETE') def save_template(self, name, row=None, columns=[], constraints=[], sharing='private', description=''): """ Define and save a search template. Same as the save method, but the values in the constraints are used as keywords for value replacement when using the template. Parameters ---------- name: string Name under which the template is save in XNAT. A template is prepended to the name so that it appear clearly as a template on the web interface. row: string Datatype from `Interface.inspect.datatypes()`. Usually ``xnat:subjectData`` columns: list List of data fields from `Interface.inspect.datatypes('*', '*')` constraints: list See also: `Search.where()`, values are keywords for the template sharing: string | list Define by whom the query is visible. If sharing is a string it may be either ``private`` or ``public``. Otherwise a list of valid logins for the XNAT server from `Interface.users()`. """ def _make_template(query): query_template = [] for constraint in query: if isinstance(constraint, tuple): query_template.append((constraint[0], constraint[1], '%%(%s)s' % constraint[2]) ) elif isinstance(constraint, (unicode, str)): query_template.append(constraint) elif isinstance(constraint, list): query_template.append(_make_template(constraint)) else: raise ProgrammingError('Unrecognized token ' 'in query: %s' % constraint ) return query_template self._save_search( row, columns, _make_template(constraints), 'template_%s' % name, description, sharing ) def saved_templates(self, with_description=False): """ Returns the names of accessible saved search templates on the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) if with_description: return [ (ld['brief_description'].split('template_')[1], ld['description'].replace('%%', '%') ) for ld in get_selection(jdata, ['brief_description', 'description' ] ) if ld['brief_description'].startswith('template_') ] else: return [name.split('template_')[1] for name in get_column(jdata, 'brief_description') if name.startswith('template_')] def use_template(self, name, values): """ Performs a search query using a previously saved template. Parameters ---------- name: string Name of the template. values: dict Values to put in the template, get the valid keys using the get_template method. Examples -------- >>> interface.manage.search.use_template(name, {'subject_id':'ID', 'age':'32' }) """ self._intf._get_entry_point() bundle = self.get_template(name, True) % values # have to remove search_id information before re-posting it _query = query_from_xml(bundle) bundle = build_search_document(_query['row'], _query['columns'], _query['constraints'] ) content = self._intf._exec( "%s/search?format=csv" % self._intf._entry, 'POST', bundle) results = csv.reader(StringIO(content), delimiter=',', quotechar='"') headers = results.next() return JsonTable([dict(zip(headers, res)) for res in results ], headers ) def get_template(self, name, as_xml=False): """ Get a saved template, either as an xml document, or as a pyxnat representation, with the keys to be used in the template between the parentheses in %()s. Parameters ---------- name: str Name under which the template is saved as_xml: boolean If True returns an XML document, else return a list of constraints. Defaults to False. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description='template_%s' % name )[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) bundle = self._intf._exec( '%s/search/saved/%s' % (self._intf._entry, search_id ), 'GET') if as_xml: return bundle else: _query = query_from_xml(bundle) return (_query['row'], _query['columns'], _query['constraints'], _query['description']) def delete_template(self, name): """ Deletes a search template. """ self.delete('template_%s' % name) def eval_rpn_exp(self, rpnexp): return rpn_contraints(rpnexp) class Search(object): """ Define constraints to make a complex search on the database. This :class:`Search` is available at different places throughout the API: >>> interface.select(DATA_SELECTION).where(QUERY) >>> interface.manage.search.save('name', TABLE_DEFINITION, QUERY) Examples -------- >>> query = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '%'), ('xnat:projectData/ID', '=', 'my_project'), [('xnat:subjectData/AGE', '>', '14'), 'AND' ], 'OR' ] """ def __init__(self, row, columns, interface): """ Configure the result table. Parameters ---------- row: string The returned table will have one line for every matching occurence of this type. e.g. xnat:subjectData --> table with one line per matching subject columns: list The returned table will have all the given columns. """ self._row = row self._columns = columns self._intf = interface def where(self, constraints=None, template=None, query=None): """ Triggers the search. Parameters ---------- contraints: list A query is an unordered list that contains - 1 or more constraints - 0 or more sub-queries (lists as this one) - 1 comparison method between the constraints ('AND' or 'OR') A constraint is an ordered tuple that contains - 1 valid searchable_type/searchable_field - 1 operator among '=', '<', '>', '<=', '>=', 'LIKE' Returns ------- results: JsonTable object An table-like object containing the results. It is basically a list of dictionaries that has additional helper methods. """ self._intf._get_entry_point() if isinstance(constraints, (str, unicode)): constraints = rpn_contraints(constraints) elif isinstance(template, (tuple)): tmp_bundle = self._intf.manage.search.get_template( template[0], True) tmp_bundle = tmp_bundle % template[1] constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(query, (str, unicode)): tmp_bundle = self._intf.manage.search.get(query, 'xml') constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(constraints, list): pass else: raise ProgrammingError('One of contraints, template and query' 'parameters must be correctly set.') bundle = build_search_document(self._row, self._columns, constraints) content = self._intf._exec( "%s/search?format=csv" % self._intf._entry, 'POST', bundle) if is_xnat_error(content): catch_error(content) results = csv.reader(StringIO(content.decode('utf-8')), delimiter=',', quotechar='"') headers = next(results) headers_of_interest = [] for column in self._columns: try: headers_of_interest.append( difflib.get_close_matches( column.split(self._row + '/')[0].lower() or column.split(self._row + '/')[1].lower(), headers)[0] ) except IndexError: headers_of_interest.append('unknown') if len(self._columns) != len(headers_of_interest): raise DataError('unvalid response headers') return JsonTable([dict(zip(headers, res)) for res in results], headers_of_interest).select(headers_of_interest) def all(self): return self.where([(self._row + '/ID', 'LIKE', '%'), 'AND']) pyxnat-1.4/pyxnat/core/select.py000066400000000000000000000263751374563466300170430ustar00rootroot00000000000000import re from . import schema from .search import Search from .resources import CObject, Project, Projects, Experiment, Experiments # imports used implicitly from .uriutil import inv_translate_uri # from .uriutil import uri_last from .errors import ProgrammingError DEBUG = False def is_type_level(element): return element.strip('/') in schema.resources_types and \ not is_expand_level(element) def is_singular_type_level(element): return element.strip('/') in schema.resources_singular and \ not is_expand_level(element) def is_expand_level(element): return element.startswith('//') and \ element.strip('/') in schema.resources_types def is_id_level(element): return element is not None and \ element.strip('/') not in schema.resources_types def is_wildid_level(element): return element is not None and \ element.strip('/') not in schema.resources_types and \ ('?' in element or '*' in element) def expand_level(element, fullpath): def find_paths(element, path=[]): resources_dict = schema.resources_tree element = element.strip('/') paths = [] if path == []: path = [element] init_path = path[:] for key in resources_dict.keys(): path = init_path[:] if element in resources_dict[key]: path.append(key) look_again = find_paths(key, path) if look_again != []: paths.extend(look_again) else: path.reverse() paths.append('/' + '/'.join(path)) return paths absolute_paths = find_paths(element) els = re.findall('/{1,2}.*?(?=/{1,2}|$)', fullpath) index = els.index(element) if index == 0: return absolute_paths else: for i in range(1, 4): if is_type_level(els[index - i]) or\ is_expand_level(els[index - i]): parent_level = els[index - i] break if parent_level.strip('/') in schema.resources_singular: parent_level += 's' return [abspath.split(parent_level)[1] for abspath in absolute_paths if parent_level in abspath] def mtransform(paths): tpaths = [] for path in paths: els = re.findall('/{1,2}.*?(?=/{1,2}|$)', path) tels = [] ignore_path = False for i, curr_el in enumerate(els): if i + 1 < len(els): next_el = els[i + 1] else: next_el = None if is_type_level(curr_el): if not is_id_level(next_el): if not is_singular_type_level(curr_el): tels.append(curr_el) tels.append('/*') else: tels.append(curr_el + 's') tels.append('/*') else: if not is_singular_type_level(curr_el): if not is_wildid_level(next_el): tels.append(curr_el.rstrip('s')) else: tels.append(curr_el) else: if not is_wildid_level(next_el): tels.append(curr_el) else: tels.append(curr_el + 's') elif is_expand_level(curr_el): exp_paths = [''.join(els[:i] + [rel_path] + els[i + 1:]) for rel_path in expand_level(curr_el, path) ] tpaths.extend(mtransform(exp_paths)) ignore_path = True break elif is_id_level(curr_el): tels.append(curr_el) else: raise ProgrammingError('in %s' % path) if not ignore_path: tpaths.append(''.join(tels)) return tpaths def group_paths(paths): groups = {} for path in paths: resources = [el for el in re.findall('/{1,2}.*?(?=/{1,2}|$)', path) if el.strip('/') in schema.resources_types and el.strip('/') not in ['files', 'file'] ] if len(resources) == 1: groups.setdefault(resources[0], set()).add(path) continue for alt_path in paths: if alt_path.endswith(path): alt_rsc = \ [el for el in re.findall('/{1,2}.*?(?=/{1,2}|$)', alt_path ) if el.strip('/') in schema.resources_types and el.strip('/') not in ['files', 'file'] ] if alt_rsc[-1].strip('/') in \ ['files', 'file', 'resources', 'resource'] + \ list(schema.rest_translation.keys()): groups.setdefault(alt_rsc[-2] + alt_rsc[-1], set() ).add(alt_path) else: groups.setdefault(alt_rsc[-1], set()).add(alt_path) return groups def compute(path): if not re.match('/project(s)?|//.+', path): path = '/' + path path = inv_translate_uri(path) try: groups = group_paths(mtransform([path])) except Exception: raise ProgrammingError('in %s' % path) best = [] for name in groups: lightest = (0, None) for path in groups[name]: score = len(path.split('/')) if lightest == (0, None) or lightest[0] > score: lightest = (score, path) best.append(lightest[1]) return best class Select(object): """ Data selection interface. Callable object that indicates the data to be returned to the user. Examples -------- Select with a path: >>> interface.select('/projects/myproj/subjects').get() Select with a datatype: >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID' ] >>> criteria = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '*'), 'AND' ] >>> interface.select('xnat:subjectData', columns ).where(criteria) """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Main interface reference. """ self._intf = interface def project(self, ID): """ Access a particular project. Parameters ---------- ID: string ID of the project. """ self._intf._get_entry_point() return globals()['Project']( '%s/projects/%s' % (self._intf._entry, ID), self._intf) def projects(self, id_filter='*'): """ Returns the list of all visible projects for the server. Parameters ---------- id_filter: string Name pattern to filter the returned projects. """ self._intf._get_entry_point() return globals()['Projects']( '%s/projects' % self._intf._entry, self._intf, id_filter) def experiment(self, ID): """ Access a particular experiment. Parameters ---------- ID: string XNAT ID of experiment (NOT LABEL). """ self._intf._get_entry_point() return globals()['Experiment']( '%s/experiments/%s' % (self._intf._entry, ID), self._intf) def experiments(self, id_filter='*'): """ Returns the list of all visible experiments for the server. Parameters ---------- id_filter: string Name pattern to filter the returned experiments (MUST BE XNAT ID's not labels). """ self._intf._get_entry_point() return globals()['Experiments']( '%s/experiments' % self._intf._entry, self._intf, id_filter) def tag(self, name): self._intf._get_entry_point() return self._intf.manage.tags.get(name).references() def tags(self): self._intf._get_entry_point() return self._intf.manage.tags() def __repr__(self): return '' def __call__(self, datatype_or_path, columns=[]): """ Select clause to specify what type of data is to be returned. Parameters ---------- datatype_or_path: string Can either be a resource path or a datatype: - when a path, REST resources are returned, the `columns` argument is useless. - when a datatype, a search Object is returned, the `columns` argument has to be specified. columns: list List of fieldtypes e.g. xnat:subjectData/SUBJECT_ID Datatype and columns are used to specify the search table that has to be returned. Use the method `where` on the `Search` object to trigger a search on the database. """ self._intf._get_entry_point() if datatype_or_path.startswith('/tag'): if len(datatype_or_path.split('/')) == 3: return self.tag(datatype_or_path.split('/')[-1]) else: return self.tags() if datatype_or_path in ['/', '//', self._intf._entry]: return self if datatype_or_path.startswith(self._intf._entry): datatype_or_path = datatype_or_path.split( self._intf._entry, 1)[1] if datatype_or_path.startswith('/'): return_list = [] try: for path in compute(datatype_or_path): if DEBUG: print('path: %s' % path) pairs = zip(path.split('/')[1::2], path.split('/')[2::2]) # # in case a level id has a / - allowed for files only # if len(path.split('/')[1:]) % 2 == 1 \ # and uri_last(path) not in schema.resources_types: # pairs[-1] = (pairs[-1][0], uri_last(path)) obj = self for resource, identifier in pairs: if isinstance(obj, list): obj = [getattr(sobj, resource)(identifier) for sobj in obj] else: obj = getattr(obj, resource)(identifier) return_list.append(obj) if len(return_list) == 1: return return_list[0] else: return CObject(return_list, self._intf) except Exception as e: if DEBUG: print(e) raise ProgrammingError('in %s' % datatype_or_path) else: if columns == []: columns = self._intf.inspect.datatypes(datatype_or_path) return Search(datatype_or_path, columns, self._intf) pyxnat-1.4/pyxnat/core/tags.py000066400000000000000000000066651374563466300165220ustar00rootroot00000000000000import os import tempfile from .jsonutil import JsonTable, csv_to_json from .resources import CObject class Tags(object): """ Database tags sub-interface. It is meant to be an attribute of the main Interface class. """ def __init__(self, interface): self._intf = interface self._meta_project = None def __call__(self): self._init() return self._meta_project.subject(self._intf._user ).resource('tags').files().get() def _init(self): if self._meta_project is None: self._meta_project = \ self._intf.select.project('metabase_%s' % self._intf._user) if self._meta_project.accessibility() != 'private': self._meta_project.set_accessibility('private') if not self._meta_project.exists(): self._meta_project.create() self._meta_project.set_accessibility('private') def new(self, name): return self.get(name).create() def delete(self, name): self.get(name).delete() def get(self, name): return Tag(name, self._intf) def share(self, other_user): if self._intf.select.project('metabase_%s' % other_user).exists(): self._meta_project.subject(self._intf._user ).share('metabase_%s' % other_user) class Tag(object): def __init__(self, name, interface): self._name = name self._intf = interface self._intf.manage.tags._init() self._file = self._intf.manage.tags._meta_project.subject( self._intf._user).resource('tags').file(name) def __repr__(self): return ' %s' % self._name def _read(self): fd = open(self._file.get(), 'rb') jtag = JsonTable(csv_to_json(fd.read())) fd.close() return jtag def create(self): if not self.exists(): jtag = JsonTable([]) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) return self def delete(self): if self.exists(): self._file.delete() def exists(self): return self._file.exists() def dereference(self, uri): jtag = self._read() tmp = tempfile.mkstemp()[1] jtag.where_not(URI=uri).dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def dereference_many(self, uris=[]): jtag = self._read() for uri in uris: jtag = jtag.where_not(URI=uri) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def reference(self, uri): uri = self._intf.select(uri)._uri jtag = self._read() if uri not in jtag.get('URI', always_list=True): jtag.data.append({'URI': uri}) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def reference_many(self, uris=[]): jtag = self._read() for uri in uris: jtag.data.append({'URI': uri}) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def references(self, show_uris=False): jtag = self._read() uris = jtag.get('URI', always_list=True) if not show_uris: return CObject(uris, self._intf) return uris pyxnat-1.4/pyxnat/core/uriutil.py000066400000000000000000000100211374563466300172360ustar00rootroot00000000000000from .schema import rest_translation # from .schema import resources_types def translate_uri(uri): segs = uri.split('/') for key in rest_translation.keys(): if key in segs[-2:]: uri = uri.replace(key, rest_translation[key]) return uri def inv_translate_uri(uri): inv_table = dict(zip(rest_translation.values(), rest_translation.keys())) for key in inv_table.keys(): uri = uri.replace('/%s' % key, '/%s' % inv_table[key]) return uri def join_uri(uri, *segments): part1 = [seg.lstrip('/') for seg in segments] return '/'.join(uri.split('/') + part1).rstrip('/') def uri_last(uri): # return uri.split(uri_parent(uri))[1].strip('/') return uri.split('/')[-1] def uri_nextlast(uri): # return uri_last(uri.split(uri_last(uri))[0].strip('/')) # support files in a hierarchy if '/files/' in uri: return 'files' return uri.split('/')[-2] def uri_parent(uri): # parent = uri # if not os.path.split(uri)[1] in resources_types: # while os.path.split(parent)[1] not in resources_types: # parent = os.path.split(parent)[0] # return parent # support files in a hierarchy by stripping all but one level files_index = uri.find('/files/') if files_index >= 0: uri = uri[:7+files_index] return uri_split(uri)[0] def uri_grandparent(uri): return uri_parent(uri_parent(uri)) def uri_split(uri): return uri.rsplit('/', 1) def uri_segment(uri, start=None, end=None): if start is None and end is None: return uri elif start is None: return '/'+'/'.join(uri.split('/')[:end]) elif end is None: return '/'+'/'.join(uri.split('/')[start:]) else: return '/'+'/'.join(uri.split('/')[start:end]) def uri_shape(uri): import re kwid_map = dict(zip(uri.split('/')[1::2], uri.split('/')[2::2])) shapes = {} for kw in kwid_map: seps = kwid_map[kw] for char in re.findall('[a-zA-Z0-9]', seps): seps = seps.replace(char, '') chunks = [] p = '|'.join(seps) s = re.split(p, kwid_map[kw]) if p != '' else kwid_map[kw] for chunk in s: try: float(chunk) chunk = '*' except Exception: pass chunks.append(chunk) shapes[kw] = '?'.join(chunks) return make_uri(shapes) def make_uri(_dict): uri = '' kws = ['projects', 'subjects', 'experiments', 'assessors', 'reconstructions', 'scans', 'resources', 'in_resources', 'out_resources', 'files', 'in_files', 'out_files'] for kw in kws: if kw in _dict.keys(): uri += '/%s/%s' % (kw, _dict.get(kw)) return uri def check_entry(func): def inner(*args, **kwargs): args[0]._intf._get_entry_point() return func(*args, **kwargs) return inner def extract_uri(uri): """ Destructure the given REST uri into project,subject and experiment. Returns None if any one of project,subject or experiment is unspecified in the URI and a (project,subject,experiment) triple otherwise. """ # elements in URLs are always separated by /, regardless of client split = uri.split('/') # a well qualified uri has a project subject, and experiment name # so when split the following items should be present: # ['', 'data', 'projects', 'project-name', 'subjects', 'subject-name', # 'experiments', 'experiment-name', 'scans'] # Based on the above comment if there aren't 9 items in the split list the # uri isn't well qualified if (len(split) != 9): return None project = split[3] subject = split[5] experiment = split[7] return (project, subject, experiment) def file_path(uri): """return the relative path of the file in the given URI for uri = '/.../files/a/b/c', return 'a/b/c' raises ValueError (through .index()) if '/files/' is not in the URI """ return uri[7+uri.index('/files/'):] pyxnat-1.4/pyxnat/core/users.py000066400000000000000000000045701374563466300167160ustar00rootroot00000000000000from .jsonutil import JsonTable class Users(object): """ Database user management interface. It is used to retrieve information on users registered on a server. .. note:: At the moment user creation and deletion is not supported through the REST API but it will be at some point. Examples -------- >>> interface.manage.users() ['list_of_users'] >>> interface.manage.users.firstname('nosetests') 'nose' See Also -------- :func:`Project.users` :func:`Project.add_user` :func:`Project.remove_user` """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Main interface reference. """ self._intf = interface def __call__(self): """ Returns the list of all registered users on the server. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).get('login', always_list=True) def firstname(self, login): """ Returns the firstname of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['firstname'] def lastname(self, login): """ Returns the lastname of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['lastname'] def id(self, login): """ Returns the id of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['xdat_user_id'] def email(self, login): """ Returns the email of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['email'] def resources(self): """ Returns the resources of the user. """ self._intf._get_entry_point() print(self._intf._get_json( '%s/user/cache/resources' % self._intf._entry)) pyxnat-1.4/pyxnat/core/xpass.py000066400000000000000000000037261374563466300167150ustar00rootroot00000000000000import os from functools import partial # default path to xnat pass file def path(): return os.getenv('USERPROFILE') or os.getenv('HOME') + "/.xnatPass" # str -> {'host': ..., 'u': ..., 'p': ..., 'port': ...} | None def read_xnat_pass(f): if os.path.exists(f) and os.path.isfile(f): infile = open(f) return parse_xnat_pass(infile.readlines()) else: # raise IOError('XNAT Pass file :' + f + " does not exist") return None # [str] -> {'host': ..., 'u': ..., 'p': ..., 'port':...} | None def parse_xnat_pass(lines): empty = {'host': None, 'u': None, 'p': None} line = find_plus_line(lines) u = ('u', partial(find_token, '@'), True) host = ('host', partial(find_token, '='), True) p = ('p', partial(lambda x: (x, x)), True) def update_state(x, k, state): state[k] = x return state if line is None: return None else: return chain([u, host, p], line, empty, update_state) # [(str, str -> str, bool)] -> # str -> # dict # dict -> dict # dict | None def chain(ops, initEnv, initState, update_statef): env = initEnv state = initState for op in ops: (k, _op, mandatory) = op tmp = _op(env) if tmp is None: if mandatory: return None else: (v, rest) = tmp env = rest state = update_statef(v, k, state) return state # [str] -> str | None def find_plus_line(lines): plusLines = list(filter(lambda x: x.startswith('+'), lines)) if not plusLines: return None else: return ''.join(plusLines[0])[1:] # char -> str -> (str,str) | None def find_token(tok, line): splitString = list(map(lambda x: x.strip(), line.split(tok))) print([line, tok, splitString]) if splitString is None or len(splitString) == 0 or len(splitString) == 1 \ or splitString[0] == '': return None else: return (splitString[0], splitString[1]) pyxnat-1.4/pyxnat/core/xpath_store.py000066400000000000000000000114141374563466300201100ustar00rootroot00000000000000import re from lxml import etree from .jsonutil import JsonTable def get_subject_id(location): f = open(location, 'rb') content = f.read() f.close() subject = re.findall(' 0: return tmp[1] return None def subjects(self): """ Returns all the subject ids. """ return self.__call__('//xnat:Subject/attribute::ID') def keys(self): """ Returns attribute keys at the subject level. """ return self.element_keys('xnat:Subject') def values(self, key): """ Returns the values for all subjects for a specific attribute. """ return self.element_values('xnat:Subject', key) def attrs(self): """ Returns the attributes of all subjects. """ return self.element_attrs('xnat:Subject') def elements(self): """ Returns the element names for all subjects elements. .. note:: in xpath terms, this function is returning all the names of the subjects descendant nodes. """ elements = set() for element in self.__call__('//xnat:Subject/descendant::*'): for ns in element.nsmap: if element.nsmap[ns] in element.tag: n = element.tag.replace('{%s}' % element.nsmap[ns], '%s:' % ns) elements.add(n) return list(elements) def element_attrs(self, name): """ Returns the attributes of this specific element. """ attrs = [] for element in self.__call__('//%s' % name): attrs.append(element.attrib) return attrs def element_keys(self, name): """ Returns the attribute keys of this specific element. """ keys = set() for element in self.__call__('//%s' % name): for element_key in element.keys(): keys.add(element_key) return list(keys) def element_values(self, name, key): """ Returns the attribute values of this specific element. """ values = set() for subject in self.__call__('//%s' % name): values.add(subject.get(key)) return list(values) def element_text(self, name): """ Returns the text values of this specific element. """ return list(set(self.__call__('//%s/child::text()' % name))) pyxnat-1.4/pyxnat/examples/000077500000000000000000000000001374563466300160635ustar00rootroot00000000000000pyxnat-1.4/pyxnat/examples/central_example.py000066400000000000000000000034031374563466300216000ustar00rootroot00000000000000import os.path as op from subprocess import Popen import multiprocessing as mp import pyxnat URL = 'https://central.xnat.org' # central URL BET = 'fsl4.1-bet2' # BET executable path central = pyxnat.Interface(URL, anonymous=True) # connection object def bet(in_img, in_hdr): # Python wrapper on FSL BET, essentially a system call in_image = in_img.get() # download .img in_hdr.get() # download .hdr path, name = op.split(in_image) in_image = op.join(path, name.rsplit('.')[0]) out_image = op.join(path, name.rsplit('.')[0] + '_brain') print('==> %s' % in_image[-120:]) Popen('%s %s %s' % (BET, in_image, out_image), shell=True).communicate() return out_image def notify(message): # message to notify the end of a BET process print('<== %s' % message[-120:]) pool = mp.Pool(processes=mp.cpu_count() * 2) # pool of concurrent workers images = {} query = ('/projects/CENTRAL_OASIS_CS/subjects/*' '/experiments/*_MR1/scans/mpr-1*/resources/*/files/*') filter_ = [('xnat:mrSessionData/AGE', '>', '80'), 'AND'] for f in central.select(query).where(filter_): label = f.label() # images are stored in pairs of files (.img, .hdr) in this project if label.endswith('.img'): images.setdefault(label.split('.')[0], []).append(f) if f.label().endswith('.hdr'): images.setdefault(label.split('.')[0], []).append(f) # download and process both occur in parallel within the workers for name in images.keys(): if len(images[name]) == 2: # if .img and .hdr XNAT refs are ready img, hdr = images.pop(name) # get references pool.apply_async(bet, (img, hdr), callback=notify) # start worker pool.close() pool.join() pyxnat-1.4/pyxnat/examples/examples.py000066400000000000000000000016071374563466300202570ustar00rootroot00000000000000import os from subprocess import Popen from multiprocessing import Pool import pyxnat url = 'https://imagen.cea.fr/imagen_database' login = '' password = '' interface = pyxnat.Interface(url, login, password) def bet(in_image): path, name = os.path.split(in_image) in_image = os.path.join(path, name.rsplit('.')[0]) out_image = os.path.join(path, name.rsplit('.')[0] + '_brain') print('==> %s' % in_image[-120:]) Popen('bet2 %s %s -f 0.5 -g 0 ' % (in_image, out_image), shell=True).communicate() return out_image def notify(message): print('<== %s' % message[-120:]) pool = Pool(processes=8) uri = '//experiments/*SessionA*/assessors/*ADNI*/out/resources/files' iu = interface.select(uri) for mprage in iu.where([('psytool:tci_parentData/TCI051', '=', '1'), 'AND']): pool.apply_async(bet, (mprage.get(),), callback=notify) pool.close() pool.join() pyxnat-1.4/pyxnat/tests/000077500000000000000000000000001374563466300154075ustar00rootroot00000000000000pyxnat-1.4/pyxnat/tests/0_setup_dock_xnat_test.py000066400000000000000000000027331374563466300224360ustar00rootroot00000000000000 def test_setup_docker_xnat(): import os import pyxnat x = pyxnat.Interface(config='.xnat.cfg') cmd = 'curl --cookie-jar /tmp/cookie --header "Content-Type: application/x-www-form-urlencoded" '\ '--request POST '\ '--data "username={user}&password={password}&login=&XNAT_CSRF=" '\ 'http://localhost/login'.format(user=x._user, password=x._pwd) print(cmd) os.system(cmd) cmd = 'curl --cookie /tmp/cookie --header "Content-Type: application/json" '\ '--request POST '\ '--data \'%s\' '\ 'http://localhost/xapi/siteConfig' cmd2 = cmd % '{"siteId": "XNAT", "siteUrl": "http://localhost", "adminEmail": "fake@fake.fake"}' print(cmd2) os.system(cmd2) cmd2 = cmd % '{"archivePath":"/data/xnat/archive","prearchivePath":"/data/xnat/prearchive","cachePath":"/data/xnat/cache","buildPath":"/data/xnat/build","ftpPath":"/data/xnat/ftp","pipelinePath":"/data/xnat/pipeline","inboxPath":"/data/xnat/inbox"}' print(cmd2) os.system(cmd2) cmd2 = cmd % '{"requireLogin":true,"userRegistration":false,"enableCsrfToken":true}' print(cmd2) os.system(cmd2) cmd2 = cmd % '{"initialized":true}' print(cmd2) os.system(cmd2) p = x.select.project('nosetests') p.create() for i in range(3, 10): p = x.select.project('nosetests%s' % i) p.create() uri = '/data/projects/nosetests' options = {'alias': 'nosetests2'} data = x.put(uri, params=options).text pyxnat-1.4/pyxnat/tests/__init__.py000066400000000000000000000012371374563466300175230ustar00rootroot00000000000000from functools import wraps from nose import SkipTest from nose.plugins.attrib import attr import os def skip_if_no_network(func=None): """Skip test completely in NONETWORK settings If not used as a decorator, and just a function, could be used at the module level """ def check_and_raise(): if os.environ.get('PYXNAT_SKIP_NETWORK_TESTS'): raise SkipTest("Skipping since no network settings") if func: @wraps(func) @attr('skip_if_no_network') def newfunc(*args, **kwargs): check_and_raise() return func(*args, **kwargs) return newfunc else: check_and_raise() pyxnat-1.4/pyxnat/tests/array_test.py000066400000000000000000000051651374563466300201450ustar00rootroot00000000000000import unittest import os.path as op from pyxnat import Interface from . import skip_if_no_network import logging as log log.basicConfig(level=log.INFO) class ArrayTests(unittest.TestCase): ''' Resource-related XNAT connectivity test cases ''' def setUp(self): fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') self._intf = Interface(config=fp) @skip_if_no_network def test_array_experiments(self): ''' Get a list of experiments from a given subject which has multiple types of experiments (i.e. MRSessions and PETSessions) and assert it gathers them all. ''' e = self._intf.array.experiments(subject_id='CENTRAL_S06242').data self.assertGreaterEqual(len(e), 3) @skip_if_no_network def test_array_mrsessions(self): ''' From a given subject which has multiple types of experiments, get a list of MRI sessions and assert its length matches the list of experiments of type 'xnat:mrSessionData' ''' mris = self._intf.array.mrsessions(subject_id='CENTRAL_S06242').data e = self._intf.array.experiments(subject_id='CENTRAL_S06242', experiment_type='xnat:mrSessionData') exps = e.data self.assertListEqual(mris, exps) @skip_if_no_network def test_array_scans(self): ''' Get a list of scans from a given experiment which has multiple types of scans (i.e. PETScans and CTScans) and assert it gathers them all. ''' s = self._intf.array.scans(experiment_id='CENTRAL_E72012').data self.assertEqual(len(s), 16) @skip_if_no_network def test_array_mrscans(self): ''' Get a list of MRI scans from a given experiment which has multiple scans mixed (i.e. MRScans and MRSpectroscopies, aka OtherDicomScans) and assert its length matches the list of scans filtered by type 'xnat:mrScanData' ''' mris = self._intf.array.mrscans(experiment_id='CENTRAL_E72012').data exps = self._intf.array.scans(experiment_id='CENTRAL_E72012', scan_type='xnat:mrScanData').data self.assertListEqual([i['xnat:mrscandata/id'] for i in mris], [i['xnat:mrscandata/id'] for i in exps]) @skip_if_no_network def test_search_experiments(self): et = 'xnat:subjectData' e = self._intf.array.search_experiments(project_id='nosetests5', experiment_type=et) res = e.data self.assertGreaterEqual(len(res), 1) pyxnat-1.4/pyxnat/tests/attributes_test.py000066400000000000000000000067311374563466300212150ustar00rootroot00000000000000import os.path as op from uuid import uuid1 import time from . import skip_if_no_network from pyxnat import Interface from pyxnat.core import interfaces _modulepath = op.dirname(op.abspath(__file__)) fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) interfaces.STUBBORN = True sid = uuid1().hex eid = uuid1().hex subject = central.select.project('nosetests5').subject(sid) experiment = subject.experiment(eid) @skip_if_no_network def test_01_fancy_resource_create(): field_data = {'experiment': 'xnat:mrSessionData', 'ID': 'TEST_%s' % eid, 'xnat:mrSessionData/age': '42', 'xnat:subjectData/investigator/lastname': 'doe', 'xnat:subjectData/investigator/firstname': 'john', 'xnat:subjectData/ID': 'TEST_%s' % sid, } experiment.create(**field_data) assert subject.exists() assert experiment.exists() globals()['subject'] = experiment.parent() globals()['experiment'] = experiment @skip_if_no_network def test_02_attr_get(): assert experiment.attrs.get('xnat:mrSessionData/age') == '42.0' @skip_if_no_network def test_03_attr_mget(): time.sleep(5) fields = ['xnat:subjectData/investigator/firstname', 'xnat:subjectData/investigator/lastname' ] assert subject.attrs.mget(fields) == ['john', 'doe'] @skip_if_no_network def test_04_attr_set(): experiment.attrs.set('xnat:mrSessionData/age', '26') assert experiment.attrs.get('xnat:mrSessionData/age') == '26.0' # def test_attr_mset(): # subject = central.select.project('nosetests').subject(sid) # time.sleep(5) # field_data = {'xnat:subjectData/investigator/firstname':'angus', # 'xnat:subjectData/investigator/lastname':'young', # } # # subject.attrs.mset(field_data) # returned = subject.attrs.mget(field_data.keys()) # # assert set(returned) == \ # set(field_data.values()), # '''set: %s returned: %s ''' %(field_data.values(), returned) @skip_if_no_network def test_05_cleanup(): subject.delete() assert not subject.exists() @skip_if_no_network def test_06_list_project_attrs(): project_attributes = ['xnat:projectData/name', 'xnat:projectData/type', 'xnat:projectData/description', 'xnat:projectData/keywords', 'xnat:projectData/aliases', 'xnat:projectData/aliases/alias', 'xnat:projectData/aliases/alias/None', 'xnat:projectData/publications', 'xnat:projectData/publications/publication', 'xnat:projectData/resources', 'xnat:projectData/resources/resource', 'xnat:projectData/studyProtocol', 'xnat:projectData/PI', 'xnat:projectData/investigators', 'xnat:projectData/investigators/investigator', 'xnat:projectData/fields', 'xnat:projectData/fields/field', 'xnat:projectData/fields/field/None'] p = central.select.project('nosetests') assert(p.attrs() == []) central.manage.schemas.add('xapi/schemas/xnat') p = central.select.project('nosetests') assert (p.attrs() == project_attributes) pyxnat-1.4/pyxnat/tests/central.cfg000066400000000000000000000001201374563466300175110ustar00rootroot00000000000000{"password": "nose", "user": "nosetests", "server": "https://central.xnat.org"} pyxnat-1.4/pyxnat/tests/custom_variables_test.py000066400000000000000000000021361374563466300223640ustar00rootroot00000000000000import os from uuid import uuid1 from pyxnat import Interface import os.path as op from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) project = central.select.project('nosetests5') variables = {'Subjects': {'newgroup': {'foo': 'string', 'bar': 'int'}}} sid = uuid1().hex eid = uuid1().hex cid = uuid1().hex if not os.environ.get('PYXNAT_SKIP_NETWORK_TESTS'): sc = project.subject(sid).experiment(eid).scan(cid) scan = sc.insert(use_label=True) @skip_if_no_network def test_01_set_param(): scan.set_param('foo', 'foostring') scan.set_param('bar', '1') assert scan.params() == ['foo', 'bar'] @skip_if_no_network def test_02_get_params(): assert scan.get_params() == ['foostring', '1'] @skip_if_no_network def test_03_params_cleanup(): project.subject(sid).delete() assert not project.subject(sid).exists() @skip_if_no_network def test_04_add_custom_variables(): project.add_custom_variables(variables) @skip_if_no_network def test_05_get_custom_variables(): project.get_custom_variables() pyxnat-1.4/pyxnat/tests/downloadutils_test.py000066400000000000000000000007741374563466300217200ustar00rootroot00000000000000from pyxnat import Interface from pyxnat.core import downloadutils as du import os.path as op from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_download(): s = central.select.project('CENTRAL_OASIS_LONG').subject('OAS2_0001') e = s.experiment('CENTRAL_E00090') du.download(dest_dir='/tmp', instance=e.scans(), extract=True, removeZip=True) pyxnat-1.4/pyxnat/tests/experiments_tests.py000066400000000000000000000007231374563466300215500ustar00rootroot00000000000000import os.path as op from pyxnat import Interface from . import skip_if_no_network _modulepath = op.dirname(op.abspath(__file__)) fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_global_experiment_listing(): assert central.array.experiments(project_id='CENTRAL_OASIS_CS', experiment_type='xnat:mrSessionData', ) pyxnat-1.4/pyxnat/tests/graphdata_test.py000066400000000000000000000010241374563466300207500ustar00rootroot00000000000000from pyxnat.core.help import GraphData, PaintGraph, SchemasInspector from pyxnat import Interface from . import skip_if_no_network import os.path as op fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_graphdata(): g = GraphData(central) g.architecture() g.datatypes() g.rest_resource('projects') @skip_if_no_network def test_schemasinspector(): si = SchemasInspector(central) si() def test_paintgraph(): PaintGraph(central) pyxnat-1.4/pyxnat/tests/hello_again.txt000066400000000000000000000000151374563466300204060ustar00rootroot00000000000000Hello again! pyxnat-1.4/pyxnat/tests/hello_dir.zip000066400000000000000000000013641374563466300201000ustar00rootroot00000000000000PK [sLD hello_dir/UT  ÙûRQÙûRux öPK esLDhello_dir/hello_dir2/UT ÙûRQÙûRux öPK esLD¥ Šø (hello_dir/hello_dir2/hello_xnat_dir2.txtUT ÙûRÙûRux öHello XNAT! PK NsLD¥ Šø hello_dir/hello_xnat_dir.txtUT óØûRÙûRux öHello XNAT! PK [sLD íAhello_dir/UT ÙûRux öPK esLDíADhello_dir/hello_dir2/UTÙûRux öPK esLD¥ Šø (¤“hello_dir/hello_dir2/hello_xnat_dir2.txtUTÙûRux öPK NsLD¥ Šø ¤hello_dir/hello_xnat_dir.txtUTóØûRux öPK{cpyxnat-1.4/pyxnat/tests/hello_xnat.txt000066400000000000000000000000141374563466300203000ustar00rootroot00000000000000Hello XNAT! pyxnat-1.4/pyxnat/tests/inspector_test.py000066400000000000000000000004641374563466300210320ustar00rootroot00000000000000from pyxnat import Interface import os.path as op fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) def test_inspector_structure(): from pyxnat.core import Inspector i = Inspector(central) i.set_autolearn() print(i.datatypes()) i.structure() pyxnat-1.4/pyxnat/tests/interfaces_test.py000066400000000000000000000034711374563466300211500ustar00rootroot00000000000000import os.path as op from pyxnat import Interface from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) central_anon = Interface('https://central.xnat.org', anonymous=True) def test_simple_object_listing(): assert isinstance(central.select.projects().get(), list) def test_simple_path_listing(): assert isinstance(central.select('/projects').get(), list) def test_nested_object_listing(): assert isinstance(central.select.projects('*OASIS*').subjects().get(), list) def test_nested_path_listing(): assert isinstance(central.select('/projects/*OASIS*/subjects').get(), list) @skip_if_no_network def test_search_access(): constraints = [('xnat:subjectData/PROJECT', '=', 'CENTRAL_OASIS_CS'), 'AND'] for subject in central.select('//subjects').where(constraints): assert '/projects/CENTRAL_OASIS_CS' in subject._uri def test_connection_with_explicit_parameters(): import json cfg = json.load(open(fp)) Interface(server=cfg['server'], user=cfg['user'], password=cfg['password']) def test_anonymous_access(): projects = central_anon.select.projects().get() assert isinstance(projects, list) assert list @skip_if_no_network def test_close_jsession(): config_file = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') with Interface(config=config_file) as central: assert central.select.project('nosetests').exists() def test_save_config(): central.save_config('/tmp/.xnat.cfg') @skip_if_no_network def test_version(): v = central.version() assert(v['version'] == '1.7.5.2-SNAPSHOT') def test_login_using_explicit_credentials(): Interface(server='http://server/', user='user', password='password') pyxnat-1.4/pyxnat/tests/jsonutil_test.py000066400000000000000000000025501374563466300206710ustar00rootroot00000000000000import os.path as op import tempfile from pyxnat import jsonutil _csv_example = op.join(op.dirname(op.abspath(__file__)), 'results.csv') _list_of_dirs = jsonutil.csv_to_json(open(_csv_example, 'r').read()) jtable = jsonutil.JsonTable(_list_of_dirs) # coverage_tests def test_dump_methods(): jtable.__repr__() jtable.dumps_csv() jtable.dumps_json() jtable.dump_csv(tempfile.mkstemp()[1]) jtable.dump_json(tempfile.mkstemp()[1]) jtable.where(psytool_audit_parentdata_audit9='0', psytool_audit_parentdata_audit2='0', psytool_audit_parentdata_audit1='2', psytool_audit_parentdata_audit10='2') jtable.where('5154') jtable.where_not('5154') assert True # unit_tests def test_get_item_str_value(): jtable.items() assert jtable['subject_label'] == jtable.get('subject_label') def test_get_item_int_value(): assert jtable.data[0] == jtable[0].data[0] def test_get_item_list_value(): headers = set(jtable[['projects', 'subjectid']].headers()) assert headers == set(['projects', 'subjectid']) def test_join(): index = list(jtable.headers()).index('subjectid') a = jtable.select(list(jtable.headers())[:index+1]) b = jtable.select(list(jtable.headers())[index:]) c = a.join('subjectid', b) assert len(list(jtable.headers())) == len(list(c.headers())) pyxnat-1.4/pyxnat/tests/manage_test.py000066400000000000000000000014241374563466300202510ustar00rootroot00000000000000import os.path as op from pyxnat import Interface from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) notified = [] def notify(cobj, eobj): notified.append(eobj) def test_register_callback(): local_notified = [] central.manage.register_callback(notify) for element in central.select('/projects'): local_notified.append(element) assert notified == local_notified def test_unregister_callback(): central.manage.unregister_callback() assert central._callback is None @skip_if_no_network def test_add_schema(): assert(len(central.manage.schemas()) == 0) central.manage.schemas.add(url='/xapi/schemas/xnat') assert(list(central.manage.schemas()) == ['xnat']) pyxnat-1.4/pyxnat/tests/pathutil_test.py000066400000000000000000000001671374563466300206560ustar00rootroot00000000000000def test_pathutil_find_files(): from pyxnat.core import pathutil res = pathutil.find_files('.') print(res) pyxnat-1.4/pyxnat/tests/pipelines_test.py000066400000000000000000000004311374563466300210060ustar00rootroot00000000000000import os.path as op from pyxnat import Interface fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) def test_pipelines_get(): from pyxnat.core import pipelines p = pipelines.Pipelines('nosetests5', central) print(p.get()) pyxnat-1.4/pyxnat/tests/prearchive_test.py000066400000000000000000000010441374563466300211470ustar00rootroot00000000000000from pyxnat import Interface import os.path as op from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_prearchive_get(): from pyxnat.core import manage pa = manage.PreArchive(central) pa.get() @skip_if_no_network def test_prearchive_status(): triple = ['SAFMD', '20170602_161757472', '_4'] from pyxnat.core import manage pa = manage.PreArchive(central) assert(pa.status(triple) == 'READY') pa.get_uri(triple) pyxnat-1.4/pyxnat/tests/project_manager_tests.py000066400000000000000000000003441374563466300223440ustar00rootroot00000000000000from pyxnat import manage from pyxnat import Interface import os.path as op x = Interface(config=op.join(op.dirname(op.abspath(__file__)), 'central.cfg')) def test_project_manager(): manage.ProjectManager('nosetests', x) pyxnat-1.4/pyxnat/tests/provenance_test.py000066400000000000000000000021121374563466300211540ustar00rootroot00000000000000from uuid import uuid1 from . import skip_if_no_network from pyxnat import Interface import os.path as op fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) project = central.select.project('nosetests5') prov = { 'program': 'young', 'timestamp': '2011-03-01T12:01:01.897987', 'user': 'angus', 'machine': 'war', 'platform': 'linux', } sid = uuid1().hex eid = uuid1().hex aid = uuid1().hex @skip_if_no_network def test_provenance(): assessor = project.subject(sid).experiment(eid).assessor( aid).insert(use_label=True) assert assessor.exists() assessor.provenance.set(prov) _prov = assessor.provenance.get()[0] assert prov['program'] == _prov['program'], \ "Subject: %s Study: %s Prov: %s" % (sid, eid, aid) # def test_del_provenance(): # assessor.provenance.delete() # print assessor.provenance.get() # assert assessor.provenance.get()[0] == [] @skip_if_no_network def test_provenance_cleanup(): project.subject(sid).delete() assert not project.subject(sid).exists() pyxnat-1.4/pyxnat/tests/repr_tests.py000066400000000000000000000110231374563466300201500ustar00rootroot00000000000000from pyxnat import Interface import os.path as op from . import skip_if_no_network _modulepath = op.dirname(op.abspath(__file__)) fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') print(fp) central = Interface(config=fp) proj_1 = central.select.project('surfmask_smpl2') subj_1 = proj_1.subject('CENTRAL05_S01120') exp_1 = subj_1.experiment('CENTRAL05_E02681') scan_1 = exp_1.scan('11') resource_1 = exp_1.resource('obscure_algorithm_output') proj_2 = central.select.project('NFB') subj_2 = proj_2.subject('BOA') exp_2 = subj_2.experiment('GHJ') scan_2 = exp_2.scan('JKL') resource_2 = scan_2.resource('IOP') @skip_if_no_network def test_project_exists(): if proj_1.exists(): assert isinstance(proj_1, object) assert str(proj_1) != ' NFB' @skip_if_no_network def test_project_not_exists(): if not proj_2.exists(): assert isinstance(proj_2, object) assert str(proj_2) == ' NFB' @skip_if_no_network def test_info_project(): assert isinstance(proj_1, object) expected_output = ' surfmask_smpl2 `Surface masking '\ 'samples 2` (private) 1 subject 1 MR experiment (owner: nosetests) '\ '(created on 2020-10-22 15:23:39.458) https://central.xnat.org/data/'\ 'projects/surfmask_smpl2?format=html' assert list(sorted(str(proj_1))) == list(sorted(expected_output)) @skip_if_no_network def test_subject_exists(): if subj_1.exists(): assert isinstance(subj_1, object) assert str(subj_1) != ' BOA' @skip_if_no_network def test_subject_not_exists(): if not subj_2.exists(): assert isinstance(subj_2, object) assert str(subj_2) == ' BOA' @skip_if_no_network def test_info_subject(): assert isinstance(subj_1, object) expected_output = ' CENTRAL05_S01120 `001` (project: '\ 'surfmask_smpl2) (Gender: U) 1 experiment https://central.xnat.org/'\ 'data/projects/surfmask_smpl2/subjects/CENTRAL05_S01120?format=html' assert list(sorted(str(subj_1))) == list(sorted(expected_output)) @skip_if_no_network def test_experiment_exists(): if exp_1.exists(): assert isinstance(exp_1, object) assert str(exp_1) != ' GHJ' @skip_if_no_network def test_experiment_not_exists(): if not exp_2.exists(): assert isinstance(exp_2, object) assert str(exp_2) == ' GHJ' @skip_if_no_network def test_info_experiment(): assert isinstance(exp_1, object) expected_output = ' CENTRAL05_E02681 `001_obscured` (subject: '\ 'CENTRAL05_S01120 `001`) (project: surfmask_smpl2) 4 scans 1 resource '\ '(created on 2020-10-22 15:24:30.139) https://central.xnat.org/'\ 'data/projects/surfmask_smpl2/subjects/CENTRAL05_S01120/experiments/'\ 'CENTRAL05_E02681?format=html' assert list(sorted(str(exp_1))) == list(sorted(expected_output)) @skip_if_no_network def test_scan_exists(): if scan_1.exists(): assert isinstance(scan_1, object) assert str(scan_1) != ' JKL' @skip_if_no_network def test_scan_not_exists(): if not scan_2.exists(): assert isinstance(scan_2, object) assert str(scan_2) == ' JKL' @skip_if_no_network def test_info_scan(): assert isinstance(scan_1, object) expected_output = ' 11 (`SPGR` 175 frames) '\ 'https://central.xnat.org/data/projects/surfmask_smpl2/subjects/'\ 'CENTRAL05_S01120/experiments/CENTRAL05_E02681/scans/11?format=html' assert list(sorted(str(scan_1))) == list(sorted(expected_output)) @skip_if_no_network def test_resource_exists(): if resource_1.exists(): assert isinstance(resource_1, object) assert str(resource_1) != ' IOP' @skip_if_no_network def test_resource_not_exists(): if not resource_2.exists(): assert isinstance(resource_2, object) assert str(resource_2) == ' IOP' @skip_if_no_network def test_info_resource(): assert isinstance(resource_1, object) expected_output = ' 123361501 '\ '`obscure_algorithm_output` (66 files 2.06 GB)' assert list(sorted(str(resource_1))) == list(sorted(expected_output)) @skip_if_no_network def test_create_delete_create(): p = central.select.project('nosetests5') from uuid import uuid1 sid = uuid1().hex s = p.subject(sid) s.create() assert(s.exists()) s.delete() s.create() s.delete() assert(not s.exists()) pyxnat-1.4/pyxnat/tests/resources_test.py000066400000000000000000000266601374563466300210440ustar00rootroot00000000000000import tempfile from uuid import uuid1 from six import string_types import os.path as op import os from pyxnat import Interface from . import skip_if_no_network from nose import SkipTest from pyxnat.core import interfaces _modulepath = op.dirname(op.abspath(__file__)) central = Interface(config=op.join(op.dirname(op.abspath(__file__)), 'central.cfg')) interfaces.STUBBORN = True _id_set1 = { 'sid': uuid1().hex, 'eid': uuid1().hex, 'aid': uuid1().hex, 'cid': uuid1().hex, 'rid': uuid1().hex, } _id_set2 = { 'sid': uuid1().hex, 'eid': uuid1().hex, 'aid': uuid1().hex, 'cid': uuid1().hex, 'rid': uuid1().hex, } subj_1 = central.select.project('nosetests5').subject(_id_set1['sid']) expe_1 = subj_1.experiment(_id_set1['eid']) asse_1 = expe_1.assessor(_id_set1['aid']) scan_1 = expe_1.scan(_id_set1['cid']) reco_1 = expe_1.reconstruction(_id_set1['rid']) @skip_if_no_network def test_01_subject_create(): assert not subj_1.exists() subj_1.create() assert subj_1.exists() @skip_if_no_network def test_02_experiment_create(): assert not expe_1.exists() expe_1.create() assert expe_1.exists() expe_1.trigger(fix_types=True, pipelines=True, scan_headers=False) @skip_if_no_network def test_03_assessor_create(): assert not asse_1.exists() asse_1.create() assert asse_1.exists() @skip_if_no_network def test_04_scan_create(): assert not scan_1.exists() scan_1.create() assert scan_1.exists() @skip_if_no_network def test_05_reconstruction_create(): assert not reco_1.exists() reco_1.create() assert reco_1.exists() # def test_provenance(): # reco_1.provenance.set({'program':'nosetests'}) # assert reco_1.provenance.get()[0]['program'] == 'nosetests' @skip_if_no_network def test_06_multi_create(): asse_2 = central.select('/projects/nosetests5/subjects/%(sid)s' '/experiments/%(eid)s' '/assessors/%(aid)s' % _id_set2) expe_2 = central.select('/projects/nosetests5/subjects/%(sid)s' '/experiments/%(eid)s' % _id_set2) assert not asse_2.exists() asse_2.create(experiments='xnat:petSessionData', assessors='xnat:petAssessorData') assert asse_2.exists() assert asse_2.datatype() == 'xnat:petAssessorData' assert expe_2.datatype() == 'xnat:petSessionData' scan_2 = central.select('/projects/nosetests5/subjects/%(sid)s' '/experiments/%(eid)s/scans/%(cid)s' % _id_set2 ).create() assert scan_2.datatype() == 'xnat:mrScanData' # def test_share_subject(): # assert not central.select('/projects/nosetests2' # '/subjects/%(sid)s' % _id_set1 # ).exists() # subj_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s'%_id_set1 # ).exists() # assert set(subj_1.shares().get()) == set(['nosetests', 'nosetests2']) # def test_share_experiment(): # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # expe_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # assert set(expe_1.shares().get()) == set(['nosetests', 'nosetests2']) # def test_share_assessor(): # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # asse_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # assert set(asse_1.shares().get()) == set(['nosetests', 'nosetests2']) # def test_unshare_assessor(): # asse_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # assert asse_1.shares().get() == ['nosetests'] # def test_unshare_experiment(): # expe_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # assert expe_1.shares().get() == ['nosetests'] # def test_unshare_subject(): # subj_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s'%_id_set1 # ).exists() # assert subj_1.shares().get() == ['nosetests'] @skip_if_no_network def test_07_put_file(): local_path = op.join(_modulepath, 'hello_xnat.txt') f = subj_1.resource('test').file('hello.txt') subj_1.resource('test').file('hello.txt').put(local_path) subj_1.resource('test').put([local_path]) assert f.exists() assert int(f.size()) == os.stat(local_path).st_size @skip_if_no_network def test_08_get_file(): fh = subj_1.resource('test').file('hello.txt') fpath = fh.get() assert op.exists(fpath) print(['toto3', open(fpath, 'rb').read()]) try: assert open(fpath, 'rb').read() == bytes('Hello XNAT!%s' % os.linesep, encoding='utf8') except TypeError: pass custom = op.join(tempfile.gettempdir(), uuid1().hex) fh.get(custom) assert op.exists(custom), "fpath: %s custom: %s" % (fpath, custom) os.remove(custom) os.remove(fpath) @skip_if_no_network def test_09_put_dir_file(): local_path = op.join(_modulepath, 'hello_again.txt') subj_1.resource('test').file('dir/hello.txt').put(local_path) assert subj_1.resource('test').file('dir/hello.txt').exists() assert int(subj_1.resource('test').file('dir/hello.txt').size()) == \ os.stat(local_path).st_size @skip_if_no_network def test_10_get_dir_file(): fh = subj_1.resource('test').file('dir/hello.txt') fpath = fh.get() assert op.exists(fpath) try: assert open(fpath, 'rb').read() == bytes('Hello again!%s' % os.linesep, encoding='utf8') except TypeError: pass custom = op.join(tempfile.gettempdir(), uuid1().hex) fh.get(custom) assert op.exists(custom), "fpath: %s custom: %s" % (fpath, custom) os.remove(custom) os.remove(fpath) @skip_if_no_network def test_11_get_copy_file(): fpath = op.join(tempfile.gettempdir(), uuid1().hex) fpath = subj_1.resource('test').file('hello.txt').get_copy(fpath) assert op.exists(fpath) fd = open(fpath, 'rb') try: assert fd.read() == bytes('Hello XNAT!%s' % os.linesep, encoding='utf8') except TypeError: pass fd.close() os.remove(fpath) @skip_if_no_network def test_12_file_last_modified(): f = subj_1.resource('test').file('hello.txt') assert isinstance(f.last_modified(), string_types) assert len(f.last_modified()) > 0 f.delete() assert(not f.exists()) r = subj_1.resource('test') r.delete() assert(not r.exists()) @skip_if_no_network def test_13_last_modified(): sid = subj_1.id() t1 = central.select('/project/nosetests5').last_modified()[sid] subj_1.attrs.set('age', '26') assert subj_1.attrs.get('age') == '26' t2 = central.select('/project/nosetests5').last_modified()[sid] assert t1 != t2 @skip_if_no_network def test_14_getitem_key(): projects = central.select.projects() assert projects.first().id() == projects[0].id() piter = projects.__iter__() next(piter) assert next(piter).id() == projects[1].id() @skip_if_no_network def test_15_getitem_slice(): projects = central.select.projects() assert projects.first().id() == next(projects[:1]).id() piter = projects.__iter__() next(piter) next(piter) next(piter) for pobj in projects[3:6]: assert next(piter).id() == pobj.id() def test_subject1_parent(): project = central.select.project('nosetests5') assert subj_1.parent()._uri == project._uri def test_project_parent(): project = central.select.project('nosetests5') assert not project.parent() @skip_if_no_network def test_16_subject1_delete(): assert subj_1.exists() subj_1.delete() assert not subj_1.exists() @skip_if_no_network def test_17_subject2_delete(): subj_2 = central.select('/projects/nosetests5/subjects/%(sid)s' % _id_set2) assert subj_2.exists() subj_2.delete() assert not subj_2.exists() @skip_if_no_network def test_18_project_configuration(): project = central.select('/project/nosetests5') version = central.version() from pyxnat.core.errors import DatabaseError try: assert project.quarantine_code() == 0 assert project.prearchive_code() == 4, project.prearchive_code() except DatabaseError: if version['version'] == '1.7.5.2-SNAPSHOT': msg = 'Version 1.7.5.2-SNAPSHOT gives trouble on some machines. \ Skipping it' raise SkipTest(msg) if version['version'] != '1.7.5.2-SNAPSHOT': try: assert project.current_arc() == b'arc001' except DatabaseError: msg = 'Check if current_arc is supported in XNAT version %s.'\ % version['version'] print(msg) assert 'nosetests' in project.users() assert 'nosetests' in project.owners() assert project.user_role('nosetests') == 'owner' @skip_if_no_network def test_19_put_zip(): local_path = op.join(_modulepath, 'hello_dir.zip') assert op.exists(local_path) # Upload and confirm proper extraction r1 = subj_1.resource('test_zip_extract') r1.put_zip(local_path, extract=True) assert r1.exists() assert r1.file('hello_dir/hello_xnat_dir.txt').exists() assert r1.file('hello_dir/hello_dir2/hello_xnat_dir2.txt').exists() # Upload and confirm not extracted r2 = subj_1.resource('test_zip_no_extract') r2.put_zip(local_path, extract=False) assert r2.exists() assert r2.file('hello_dir.zip').exists() @skip_if_no_network def test_20_get_zip(): r = subj_1.resource('test_zip_extract') local_dir = op.join(_modulepath, 'test_zip_download'+r.id()) file_list = ['test_zip_extract/hello_dir', 'test_zip_extract/hello_dir/hello_xnat_dir.txt', 'test_zip_extract/hello_dir/hello_dir2', 'test_zip_extract/hello_dir/hello_dir2/hello_xnat_dir2.txt'] file_list = [op.join(local_dir, e) for e in file_list] if not op.exists(local_dir): os.mkdir(local_dir) r.get(local_dir, extract=True) for f in file_list: assert op.exists(f) r.get(local_dir, extract=False) assert op.isfile(op.join(local_dir, 'test_zip_extract.zip')) @skip_if_no_network def test_21_project_aliases(): project = central.select('/project/nosetests5') assert project.aliases() == ['nosetests52'] @skip_if_no_network def test_22_project(): project = central.select.project('nosetests5') project.datatype() project.experiments() project.experiment('nose') @skip_if_no_network def test_22_project_description(): project = central.select.project('nosetests5') desc = project.description() assert(desc == 'nosetests') pyxnat-1.4/pyxnat/tests/results.csv000066400000000000000000010462771374563466300176460ustar00rootroot00000000000000"subject_label","subjectid","insert_date","projects","project","mr_count","psytool_audit_parentdata_iteration","psytool_audit_parentdata_language","psytool_audit_parentdata_user_code_ident","psytool_audit_parentdata_completed","psytool_audit_parentdata_age_for_test","psytool_audit_parentdata_processed_age_for_test","psytool_audit_parentdata_qr_flag","psytool_audit_parentdata_qr_comment","psytool_audit_parentdata_valid","psytool_audit_parentdata_audit1","psytool_audit_parentdata_audit2","psytool_audit_parentdata_audit3","psytool_audit_parentdata_audit4","psytool_audit_parentdata_audit5","psytool_audit_parentdata_audit6","psytool_audit_parentdata_audit7","psytool_audit_parentdata_audit8","psytool_audit_parentdata_audit9","psytool_audit_parentdata_audit10","quarantine_status" "000000029814","NOSE_000000029814",2009-06-08 09:13:28.0,",","NOSE",2,1,"en","P",1,5462,5462,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000354464","NOSE_000000354464",2009-10-06 09:32:09.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000886880","NOSE_000000886880",2010-02-09 07:03:53.0,",","NOSE",2,1,"fr","P",1,5078,5078,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000298603","NOSE_000000298603",2009-05-11 17:33:10.0,",","NOSE",2,2,"de","P",1,5651,5651,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000333153","NOSE_000000333153",2010-04-12 07:04:19.0,",","NOSE",2,1,"fr","P",1,5262,5262,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000399670","NOSE_000000399670",2009-05-12 09:33:59.0,",","NOSE",2,1,"en","P",1,5195,5195,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000576275","NOSE_000000576275",2009-05-12 10:04:58.0,",","NOSE",2,1,"de","P",1,5287,5287,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000106062","NOSE_000000106062",2009-12-04 16:42:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000160957","NOSE_000000160957",2009-04-29 19:21:28.0,",","NOSE",2,1,"en","P",1,5289,5289,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000803045","NOSE_000000803045",2010-07-01 07:04:55.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000174454","NOSE_000000174454",2009-12-04 16:51:50.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000655126","NOSE_000000655126",2010-04-18 07:04:46.0,",","NOSE",2,1,"de","P",1,5250,5250,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000048641","NOSE_000000048641",2010-07-25 07:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000843073","NOSE_000000843073",2009-05-12 10:21:54.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000610454","NOSE_000000610454",2009-04-29 19:33:41.0,",","NOSE",2,1,"fr","P",1,5158,5158,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000744604","NOSE_000000744604",2010-05-09 07:05:35.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000216788","NOSE_000000216788",2009-09-21 20:04:36.0,",","NOSE",2,1,"de","P",1,5537,5537,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000486036","NOSE_000000486036",2009-05-12 10:38:53.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000562039","NOSE_000000562039",2009-04-29 19:39:33.0,",","NOSE",2,1,"fr","P",1,5132,5132,"Good",,"1",4,1,2,0,0,0,1,0,0,0,"active" "000000563902","NOSE_000000563902",2009-05-12 10:55:56.0,",","NOSE",2,1,"de","P",1,5136,5136,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000843668","NOSE_000000843668",2010-07-08 12:42:58.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,1,0,0,0,0,0,"active" "000000826737","NOSE_000000826737",2009-08-21 20:56:26.0,",","NOSE",2,1,"de","P",1,5153,5153,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000779499","NOSE_000000779499",2010-02-02 07:03:13.0,",","NOSE",2,1,"en","P",1,5231,5231,"Good",,,2,1,1,0,0,0,0,1,0,0,"active" "000000078092","NOSE_000000078092",2009-08-19 13:51:02.0,",","NOSE",2,2,"de","P",1,5446,5446,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000429127","NOSE_000000429127",2009-04-29 19:39:13.0,",","NOSE",2,1,"en","P",1,5368,5368,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000575214","NOSE_000000575214",2009-05-12 11:13:12.0,",","NOSE",2,1,"de","P",1,5461,5461,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000478758","NOSE_000000478758",2009-06-29 09:32:52.0,",","NOSE",2,1,"de","P",1,5091,5091,"Good",,,4,1,3,1,0,0,3,2,0,4,"active" "000000646157","NOSE_000000646157",2009-04-29 19:24:29.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000171560","NOSE_000000171560",2009-08-19 14:06:06.0,",","NOSE",2,1,"en","P",1,5358,5358,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000890315","NOSE_000000890315",2009-06-29 09:56:12.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000170048","NOSE_000000170048",2009-10-17 20:05:31.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000359816","NOSE_000000359816",2009-04-29 19:21:22.0,",","NOSE",2,1,"en","P",1,5378,5378,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000806880","NOSE_000000806880",2009-12-04 17:02:11.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000354188","NOSE_000000354188",2010-07-08 12:39:51.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000753588","NOSE_000000753588",2009-04-29 19:37:00.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000785864","NOSE_000000785864",2009-05-12 11:56:24.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000119365","NOSE_000000119365",2009-04-29 19:38:38.0,",","NOSE",2,1,"de","P",1,4968,4968,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000762347","NOSE_000000762347",2009-04-29 19:32:17.0,",","NOSE",2,1,"en","P",1,5279,5279,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000644656","NOSE_000000644656",2009-07-06 11:26:08.0,",","NOSE",2,1,"en","P",1,5198,5198,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000030933","NOSE_000000030933",2010-04-13 07:04:47.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,,4,2,1,0,0,0,0,0,0,4,"active" "000000063222","NOSE_000000063222",2009-04-29 19:31:54.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000332313","NOSE_000000332313",2009-12-22 20:03:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000366483","NOSE_000000366483",2010-07-08 12:23:18.0,",","NOSE",2,1,"fr","P",1,4936,4936,"Good",,,4,1,1,1,0,0,4,0,0,4,"active" "000000463366","NOSE_000000463366",2009-04-29 19:40:56.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000056900","NOSE_000000056900",2009-05-12 12:37:58.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000792247","NOSE_000000792247",2009-05-12 12:46:17.0,",","NOSE",2,1,"de","P",1,5305,5305,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000900867","NOSE_000000900867",2009-04-29 19:42:35.0,",","NOSE",2,1,"en","P",1,5478,5478,"Good",,"1",4,2,3,0,0,0,0,1,2,2,"active" "000000401166","NOSE_000000401166",2010-02-17 07:04:17.0,",","NOSE",2,1,"fr","P",1,5243,5243,"Good",,,3,0,1,0,0,0,0,0,0,4,"active" "000000708788","NOSE_000000708788",2009-05-12 13:03:13.0,",","NOSE",2,1,"de","P",1,5174,5174,"Good",,,3,0,1,0,0,0,0,0,2,0,"active" "000000588484","NOSE_000000588484",2009-12-04 17:02:51.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,1,0,0,"active" "000000616167","NOSE_000000616167",2009-08-22 20:50:08.0,",","NOSE",2,1,"en","P",1,5046,5046,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000285191","NOSE_000000285191",2009-04-29 19:41:23.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",1,0,0,0,0,0,0,1,0,0,"active" "000000802574","NOSE_000000802574",2009-05-12 13:12:15.0,",","NOSE",2,1,"fr","P",1,5426,5426,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000775625","NOSE_000000775625",2009-05-12 13:21:01.0,",","NOSE",2,1,"de","P",1,5518,5166,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000267413","NOSE_000000267413",2009-12-06 20:07:24.0,",","NOSE",2,1,"fr","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000390611","NOSE_000000390611",2009-08-19 14:17:06.0,",","NOSE",2,1,"fr","P",1,5354,5354,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000607675","NOSE_000000607675",2009-07-31 19:18:22.0,",","NOSE",2,2,"en","P",1,5039,5423,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000577026","NOSE_000000577026",2009-08-19 14:32:18.0,",","NOSE",2,1,"en","P",1,5280,5280,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000399146","NOSE_000000399146",2009-05-12 13:29:26.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,"1",2,1,2,0,0,0,0,1,0,0,"active" "000000248724","NOSE_000000248724",2009-05-12 13:38:49.0,",","NOSE",2,1,"en","P",1,4861,5245,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000486049","NOSE_000000486049",2010-02-05 10:08:07.0,",","NOSE",2,1,"fr","P",1,5326,5326,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000373511","NOSE_000000373511",2009-12-04 16:43:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000345910","NOSE_000000345910",2010-07-08 12:42:32.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000765058","NOSE_000000765058",2009-12-04 17:03:30.0,",","NOSE",,1,"en","P",1,,,,,,2,3,2,0,0,0,1,1,0,0,"active" "000000442124","NOSE_000000442124",2009-06-08 09:38:24.0,",","NOSE",2,1,"de","P",1,5263,5263,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000497540","NOSE_000000497540",2010-03-28 07:04:39.0,",","NOSE",2,1,"en","P",1,5469,5469,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000849035","NOSE_000000849035",2009-06-08 10:03:22.0,",","NOSE",2,1,"en","P",1,5720,5720,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000880325","NOSE_000000880325",2009-10-26 20:05:37.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000910758","NOSE_000000910758",2009-06-08 10:29:32.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000414898","NOSE_000000414898",2009-08-19 14:37:29.0,",","NOSE",2,1,"de","P",1,5316,5316,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000041910","NOSE_000000041910",2009-05-12 13:45:16.0,",","NOSE",2,1,"de","P",1,4957,4957,"Good",,"1",3,2,2,0,0,0,0,0,0,0,"active" "000000740285","NOSE_000000740285",2009-08-19 14:42:33.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,4,"active" "000000837725","NOSE_000000837725",2009-04-29 19:19:08.0,",","NOSE",,1,"en","P",1,5283,5283,,,"9",4,1,2,0,1,0,1,0,0,4,"active" "000000595866","NOSE_000000595866",2009-12-04 16:52:41.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000889251","NOSE_000000889251",2010-04-12 07:04:43.0,",","NOSE",2,1,"de","P",1,5442,5442,"Good",,,2,0,2,0,0,0,0,0,0,0,"active" "000000898482","NOSE_000000898482",2009-04-29 19:37:42.0,",","NOSE",2,1,"fr","P",1,5182,5182,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000690862","NOSE_000000690862",2010-02-28 07:03:50.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000897915","NOSE_000000897915",2009-12-04 17:01:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000574607","NOSE_000000574607",2009-04-29 19:19:32.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000467174","NOSE_000000467174",2010-07-08 12:44:08.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000249353","NOSE_000000249353",2009-10-28 21:18:24.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000315519","NOSE_000000315519",2009-10-16 20:33:59.0,",","NOSE",2,1,"de","P",1,5296,5296,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000626089","NOSE_000000626089",2009-05-12 14:10:37.0,",","NOSE",2,1,"en","P",1,5047,5047,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000792620","NOSE_000000792620",2009-12-04 16:46:40.0,",","NOSE",2,1,"en","P",1,5032,5032,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000677457","NOSE_000000677457",2009-10-25 20:05:40.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000492122","NOSE_000000492122",2009-04-29 19:25:20.0,",","NOSE",2,1,"None","P",1,5284,5313,"Good",,"1",2,1,1,1,0,0,1,0,0,0,"active" "000000243752","NOSE_000000243752",2009-05-12 14:24:10.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000960346","NOSE_000000960346",2009-08-19 14:57:28.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000346722","NOSE_000000346722",2009-04-29 19:31:22.0,",","NOSE",2,1,"en","P",1,5224,5224,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000051759","NOSE_000000051759",2009-04-29 19:26:07.0,",","NOSE",2,2,"de","P",1,5122,5143,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000922602","NOSE_000000922602",2009-05-12 14:46:59.0,",","NOSE",2,1,"de","P",1,5422,5432,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000450827","NOSE_000000450827",2009-05-12 14:54:37.0,",","NOSE",2,1,"de","P",1,5336,5336,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000428075","NOSE_000000428075",2009-04-29 19:29:00.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000759337","NOSE_000000759337",2009-12-04 16:46:30.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000788628","NOSE_000000788628",2009-04-29 19:21:25.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",3,2,3,1,1,0,0,1,0,0,"active" "000000203660","NOSE_000000203660",2010-02-14 07:10:40.0,",","NOSE",2,1,"de","P",1,5140,5140,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781162","NOSE_000000781162",2010-04-19 07:04:58.0,",","NOSE",2,1,"fr","P",1,5318,5318,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000262475","NOSE_000000262475",2009-04-29 19:39:30.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",4,1,2,0,1,0,1,0,0,0,"active" "000000089691","NOSE_000000089691",2009-05-12 15:23:02.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000422831","NOSE_000000422831",2009-05-12 15:32:28.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",1,0,2,0,0,0,0,0,0,0,"active" "000000235412","NOSE_000000235412",2009-11-16 10:49:45.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000474670","NOSE_000000474670",2009-05-12 15:40:52.0,",","NOSE",2,1,"de","P",1,4935,4935,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000191362","NOSE_000000191362",2009-12-04 16:46:53.0,",","NOSE",2,1,"en","P",1,5024,5024,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000978124","NOSE_000000978124",2009-05-12 15:49:57.0,",","NOSE",2,1,"de","P",1,5304,5305,"Good",,"1",1,0,0,0,0,0,0,0,2,0,"active" "000000377254","NOSE_000000377254",2009-04-29 19:33:36.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000391457","NOSE_000000391457",2010-06-21 12:19:51.0,",","NOSE",,2,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000278388","NOSE_000000278388",2010-07-08 12:43:23.0,",","NOSE",,1,"en","P",1,,,,,,2,3,3,0,0,0,1,1,0,0,"active" "000000706153","NOSE_000000706153",2009-04-29 19:32:00.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000328926","NOSE_000000328926",2009-12-04 17:02:19.0,",","NOSE",2,1,"en","P",1,5360,5360,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000563029","NOSE_000000563029",2009-08-19 15:02:40.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000341590","NOSE_000000341590",2010-07-08 12:39:20.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000299640","NOSE_000000299640",2009-05-12 16:13:29.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000446901","NOSE_000000446901",2009-04-29 19:33:33.0,",","NOSE",2,,,,,,,"Missing","

difficult with ...

",,,,,,,,,,,,"active" "000000687228","NOSE_000000687228",2010-02-25 07:05:51.0,",","NOSE",2,1,"de","P",1,5300,5300,"Good",,,4,0,2,1,0,0,1,0,0,0,"active" "000000625609","NOSE_000000625609",2010-01-18 07:03:23.0,",","NOSE",2,1,"de","P",1,5077,5077,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000876010","NOSE_000000876010",2010-07-08 12:43:47.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000129763","NOSE_000000129763",2009-05-12 16:22:18.0,",","NOSE",2,1,"de","P",1,5293,5293,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000760316","NOSE_000000760316",2009-04-29 19:33:44.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,"1",3,1,3,0,0,0,2,1,2,0,"active" "000000444158","NOSE_000000444158",2009-08-19 15:17:44.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000343406","NOSE_000000343406",2009-07-31 19:18:39.0,",","NOSE",2,1,"en","P",1,4708,5092,"Good",,,4,2,4,0,0,0,0,0,0,0,"active" "000000709385","NOSE_000000709385",2009-04-29 19:31:30.0,",","NOSE",2,1,"en","P",1,5756,5756,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000240485","NOSE_000000240485",2009-08-24 20:59:38.0,",","NOSE",2,1,"de","P",1,5148,5148,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000418634","NOSE_000000418634",2009-05-12 16:50:22.0,",","NOSE",2,1,"en","P",1,5258,5258,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000008869","NOSE_000000008869",2010-07-08 12:23:38.0,",","NOSE",2,1,"en","P",1,108,108,"Doubtful","

grandmother was...

",,1,1,0,0,2,0,0,0,0,0,"active" "000000197309","NOSE_000000197309",2010-06-21 12:08:44.0,",","NOSE",,1,"en","P",1,5140,5140,,,,2,1,2,0,0,0,0,0,0,0,"active" "000000594973","NOSE_000000594973",2009-04-29 19:42:41.0,",","NOSE",2,1,"fr","P",1,5129,5129,"Good",,"1",4,1,1,0,0,0,2,0,0,0,"active" "000000576892","NOSE_000000576892",2010-04-18 07:05:01.0,",","NOSE",2,1,"en","P",1,5592,5592,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000659517","NOSE_000000659517",2009-10-06 10:10:50.0,",","NOSE",2,1,"de","P",1,5152,5152,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000339161","NOSE_000000339161",2009-05-12 17:00:09.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,"1",3,1,1,0,0,0,1,0,0,0,"active" "000000663674","NOSE_000000663674",2009-11-27 10:20:41.0,",","NOSE",2,1,"en","P",1,5137,5137,"Good",,,2,1,1,0,1,0,1,1,0,0,"active" "000000096360","NOSE_000000096360",2010-01-29 07:03:32.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000797489","NOSE_000000797489",2010-07-08 12:36:54.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,1,0,0,0,"active" "000000918395","NOSE_000000918395",2009-05-12 17:10:04.0,",","NOSE",2,1,"de","P",1,5364,5364,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000532641","NOSE_000000532641",2009-04-29 19:39:42.0,",","NOSE",2,1,"en","P",1,5146,5146,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000445319","NOSE_000000445319",2009-05-12 17:29:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000366125","NOSE_000000366125",2009-12-21 20:03:32.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,1,1,0,0,0,0,1,0,0,"active" "000000576876","NOSE_000000576876",2009-05-12 17:38:29.0,",","NOSE",,1,"en","P",1,,,,,,4,0,3,0,0,0,0,0,0,0,"active" "000000511502","NOSE_000000511502",2010-07-08 12:39:28.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000150117","NOSE_000000150117",2009-10-12 20:05:34.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000255310","NOSE_000000255310",2009-05-12 17:38:53.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,"1",1,4,1,0,0,1,1,1,0,4,"active" "000000157779","NOSE_000000157779",2009-12-04 16:43:11.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000302723","NOSE_000000302723",2009-04-29 19:37:18.0,",","NOSE",2,1,"en","P",1,5303,5303,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000549199","NOSE_000000549199",2009-07-31 19:18:55.0,",","NOSE",2,1,"de","P",1,5054,5054,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000305718","NOSE_000000305718",2009-05-12 17:59:23.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000065337","NOSE_000000065337",2009-12-04 16:58:57.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014087","NOSE_000000014087",2009-12-04 16:54:19.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000470078","NOSE_000000470078",2009-07-31 19:50:02.0,",","NOSE",2,1,"de","P",1,5489,5489,"Good",,,4,0,2,0,0,0,1,0,0,0,"active" "000000703855","NOSE_000000703855",2009-08-19 15:20:10.0,",","NOSE",2,1,"de","P",1,5396,5396,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000461373","NOSE_000000461373",2009-12-04 17:03:40.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,1,0,0,"active" "000000538355","NOSE_000000538355",2009-12-04 17:03:51.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000209425","NOSE_000000209425",2009-04-29 19:28:08.0,",","NOSE",2,1,"en","P",1,5357,5357,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000875128","NOSE_000000875128",2009-04-29 19:34:56.0,",","NOSE",2,1,"de","P",1,5039,5039,"Good",,"1",3,1,2,1,0,0,0,1,2,0,"active" "000000047378","NOSE_000000047378",2009-10-05 20:11:48.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000195017","NOSE_000000195017",2009-05-12 18:25:39.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000878181","NOSE_000000878181",2009-04-29 19:26:26.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000770681","NOSE_000000770681",2009-11-04 14:36:56.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,4,1,2,0,1,0,1,0,0,4,"active" "000000379976","NOSE_000000379976",2009-06-08 10:57:53.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,,4,1,2,0,1,0,0,0,0,4,"active" "000000038962","NOSE_000000038962",2009-05-12 18:41:58.0,",","NOSE",2,1,"de","P",1,5380,5380,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000843072","NOSE_000000843072",2009-05-12 18:52:30.0,",","NOSE",2,1,"en","P",1,5342,5342,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000369564","NOSE_000000369564",2010-04-29 11:36:00.0,",","NOSE",2,2,"en","P",1,5276,5276,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000207330","NOSE_000000207330",2009-05-12 19:03:05.0,",","NOSE",2,1,"de","P",1,5552,5200,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000785410","NOSE_000000785410",2010-05-18 07:06:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000015646","NOSE_000000015646",2009-04-29 19:41:12.0,",","NOSE",2,1,"en","P",1,5214,5214,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000042474","NOSE_000000042474",2009-05-12 19:23:35.0,",","NOSE",2,1,"en","P",1,5065,5065,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000073046","NOSE_000000073046",2010-05-24 07:04:21.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,,3,0,0,0,1,0,1,0,0,0,"active" "000000253730","NOSE_000000253730",2009-05-12 19:33:55.0,",","NOSE",2,1,"de","P",1,5018,5018,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000968050","NOSE_000000968050",2009-04-29 19:41:37.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,"1",4,1,3,0,0,0,0,0,0,0,"active" "000000901216","NOSE_000000901216",2009-12-04 16:45:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000957890","NOSE_000000957890",2009-05-12 19:53:12.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000374628","NOSE_000000374628",2009-04-29 19:19:24.0,",","NOSE",2,1,"fr","P",1,5605,5605,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000706149","NOSE_000000706149",2009-07-31 19:19:11.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000479652","NOSE_000000479652",2009-07-03 09:42:00.0,",","NOSE",2,1,"de","P",1,5326,5326,"Good",,,3,0,1,1,0,1,1,1,0,2,"active" "000000017505","NOSE_000000017505",2009-04-29 19:28:05.0,",","NOSE",2,1,"en","P",1,5235,5235,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000157743","NOSE_000000157743",2009-12-04 16:47:15.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000304676","NOSE_000000304676",2009-06-08 11:25:21.0,",","NOSE",2,1,"de","P",1,4985,4985,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000366383","NOSE_000000366383",2009-04-29 19:38:58.0,",","NOSE",2,2,"fr","P",1,5481,5481,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000028126","NOSE_000000028126",2009-05-12 20:35:39.0,",","NOSE",2,1,"de","P",1,5463,5474,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000734470","NOSE_000000734470",2009-11-10 20:24:37.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,,3,1,1,1,0,0,1,0,0,2,"active" "000000912863","NOSE_000000912863",2009-04-29 19:33:21.0,",","NOSE",2,1,"de","P",1,5170,5170,"Good",,"1",4,0,3,0,0,0,2,0,0,0,"active" "000000688910","NOSE_000000688910",2009-08-19 15:34:46.0,",","NOSE",2,1,"fr","P",1,5185,5185,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000207623","NOSE_000000207623",2009-12-04 17:02:37.0,",","NOSE",,1,"en","P",1,,,,,,3,2,2,0,1,0,0,1,0,0,"active" "000000635320","NOSE_000000635320",2009-10-16 05:17:38.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000686948","NOSE_000000686948",2009-06-29 11:45:39.0,",","NOSE",2,1,"de","P",1,5399,5399,"Good",,,4,1,4,4,0,0,3,0,0,0,"active" "000000607093","NOSE_000000607093",2010-02-01 07:04:30.0,",","NOSE",2,1,"en","P",1,5371,5371,"Good",,,3,0,3,0,0,0,0,0,0,0,"active" "000000258714","NOSE_000000258714",2009-07-15 14:46:34.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000974337","NOSE_000000974337",2010-07-20 07:17:19.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000038743","NOSE_000000038743",2009-04-29 19:41:55.0,",","NOSE",2,1,"en","P",1,4971,4971,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000495480","NOSE_000000495480",2009-10-30 03:16:09.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000087383","NOSE_000000087383",2009-06-29 12:10:35.0,",","NOSE",2,1,"de","P",1,5532,5532,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000409997","NOSE_000000409997",2009-04-29 19:30:09.0,",","NOSE",2,2,"en","P",1,5238,5238,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000123036","NOSE_000000123036",2009-04-29 19:23:58.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,"1",2,2,1,0,0,0,0,0,0,0,"active" "000000758575","NOSE_000000758575",2010-02-27 07:04:22.0,",","NOSE",2,1,"en","P",1,5272,5272,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000144162","NOSE_000000144162",2009-04-29 19:24:53.0,",","NOSE",2,1,"de","P",1,5064,5064,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000976421","NOSE_000000976421",2009-12-07 15:27:12.0,",","NOSE",2,1,"en","P",1,5135,5135,"Good",,,3,1,3,0,0,0,0,1,0,0,"active" "000000031156","NOSE_000000031156",2009-04-29 19:38:47.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,"1",3,0,0,0,0,0,1,0,2,2,"active" "000000510428","NOSE_000000510428",2009-07-31 19:19:58.0,",","NOSE",2,1,"de","P",1,5473,5473,"Good",,,2,2,2,0,0,0,0,0,0,0,"active" "000000519777","NOSE_000000519777",2009-07-31 19:20:14.0,",","NOSE",2,1,"en","P",1,5483,5483,"Good",,,1,3,2,0,0,0,0,0,0,0,"active" "000000996071","NOSE_000000996071",2009-05-12 21:49:32.0,",","NOSE",,1,"en","P",1,,,,,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000717843","NOSE_000000717843",2010-07-13 07:10:59.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000746382","NOSE_000000746382",2009-05-12 21:49:52.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000973100","NOSE_000000973100",2009-12-04 16:50:26.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000934362","NOSE_000000934362",2009-04-29 19:38:31.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,"1",3,2,3,0,0,0,1,2,0,0,"active" "000000573943","NOSE_000000573943",2009-09-25 21:13:47.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000833964","NOSE_000000833964",2010-02-05 10:08:21.0,",","NOSE",2,1,"fr","P",1,5316,5316,"Good",,,2,0,1,0,1,0,0,0,0,0,"active" "000000374831","NOSE_000000374831",2010-02-26 07:06:14.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000205311","NOSE_000000205311",2009-08-19 15:45:15.0,",","NOSE",2,1,"de","P",1,5466,5466,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000985162","NOSE_000000985162",2009-05-12 21:58:45.0,",","NOSE",2,1,"fr","P",1,5558,5558,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000534395","NOSE_000000534395",2010-07-16 07:06:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000535290","NOSE_000000535290",2009-04-29 19:19:18.0,",","NOSE",2,1,"de","P",1,5235,5235,"Good",,"1",2,3,2,0,0,0,0,1,0,0,"active" "000000171694","NOSE_000000171694",2009-04-29 19:37:15.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000796497","NOSE_000000796497",2009-06-29 12:30:54.0,",","NOSE",2,1,"de","P",1,5392,5392,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000552758","NOSE_000000552758",2010-07-27 07:10:54.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000908566","NOSE_000000908566",2009-05-12 22:28:13.0,",","NOSE",2,1,"de","P",1,5273,5273,"Good",,"1",3,0,0,0,0,0,1,0,0,0,"active" "000000050847","NOSE_000000050847",2009-06-08 11:26:12.0,",","NOSE",2,1,"en","P",1,5225,5225,"Good",,"1",3,0,1,0,0,0,0,1,2,0,"active" "000000455783","NOSE_000000455783",2010-07-09 07:05:20.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000130909","NOSE_000000130909",2009-07-31 19:20:30.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781027","NOSE_000000781027",2009-05-12 22:39:23.0,",","NOSE",2,1,"en","P",1,5140,5140,"Good",,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000258343","NOSE_000000258343",2009-06-03 10:45:28.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000376072","NOSE_000000376072",2009-04-29 19:24:44.0,",","NOSE",2,1,"en","P",1,5056,5056,"Good",,"1",4,1,2,1,1,1,1,0,0,2,"active" "000000199274","NOSE_000000199274",2009-12-04 16:41:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000541987","NOSE_000000541987",2009-05-12 22:54:22.0,",","NOSE",2,1,"de","P",1,5363,5363,"Good",,"1",4,1,1,2,0,0,1,1,0,0,"active" "000000312297","NOSE_000000312297",2009-04-29 19:40:38.0,",","NOSE",2,1,"en","P",1,5415,5415,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000835571","NOSE_000000835571",2009-04-29 19:33:04.0,",","NOSE",2,1,"de","P",1,5345,5345,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000428664","NOSE_000000428664",2009-12-04 16:46:38.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000237579","NOSE_000000237579",2010-06-01 07:08:31.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000540068","NOSE_000000540068",2010-07-25 07:06:20.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000680267","NOSE_000000680267",2009-06-29 12:31:03.0,",","NOSE",2,1,"de","P",1,5602,5602,"Good",,,4,1,1,1,2,0,0,0,2,2,"active" "000000912219","NOSE_000000912219",2010-01-08 20:03:24.0,",","NOSE",2,1,"fr","P",1,5112,5112,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000330471","NOSE_000000330471",2009-05-12 23:27:01.0,",","NOSE",2,1,"de","P",1,5299,5299,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000125822","NOSE_000000125822",2009-10-08 20:05:16.0,",","NOSE",2,1,"de","P",1,5227,5227,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000202038","NOSE_000000202038",2009-04-29 19:30:56.0,",","NOSE",2,1,"en","P",1,5409,5409,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000322625","NOSE_000000322625",2009-12-04 17:03:25.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000376910","NOSE_000000376910",2009-05-12 23:46:43.0,",","NOSE",,1,"en","P",1,5139,5139,,,"9",2,0,0,0,0,0,0,4,0,0,"active" "000000016997","NOSE_000000016997",2009-04-29 19:39:18.0,",","NOSE",2,1,"en","P",1,5326,5326,"Good",,"1",3,2,2,1,0,0,1,0,0,0,"active" "000000705490","NOSE_000000705490",2009-04-29 19:36:05.0,",","NOSE",2,1,"en","P",1,5289,5291,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000115320","NOSE_000000115320",2009-07-15 14:49:32.0,",","NOSE",2,1,"de","P",1,5409,5409,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000841954","NOSE_000000841954",2010-02-28 07:07:01.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000747283","NOSE_000000747283",2009-05-13 00:20:47.0,",","NOSE",2,1,"fr","P",1,5387,5387,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000092399","NOSE_000000092399",2009-06-29 12:31:12.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,,1,0,0,0,0,0,0,1,0,0,"active" "000000814010","NOSE_000000814010",2009-05-13 00:32:15.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,4,0,1,2,0,0,2,0,0,2,"active" "000000563053","NOSE_000000563053",2009-08-19 15:55:41.0,",","NOSE",2,1,"en","P",1,5464,5464,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000135240","NOSE_000000135240",2009-05-13 00:32:37.0,",","NOSE",2,1,"de","P",1,5191,5192,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000458419","NOSE_000000458419",2009-07-31 19:21:01.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000274636","NOSE_000000274636",2010-03-18 07:10:03.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000904324","NOSE_000000904324",2010-04-08 07:04:16.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000466053","NOSE_000000466053",2010-07-22 07:05:46.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000057916","NOSE_000000057916",2009-08-19 16:11:18.0,",","NOSE",2,1,"de","P",1,5472,5472,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000972541","NOSE_000000972541",2010-07-16 07:07:44.0,",","NOSE",,1,"de","P",1,,,,,,2,2,3,0,0,0,0,0,0,4,"active" "000000167678","NOSE_000000167678",2009-04-29 19:32:32.0,",","NOSE",2,1,"de","P",1,4929,4929,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000958693","NOSE_000000958693",2009-12-30 20:03:35.0,",","NOSE",2,1,"de","P",1,5146,5146,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000913882","NOSE_000000913882",2009-10-22 14:58:11.0,",","NOSE",2,1,"en","P",1,5194,5194,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000624403","NOSE_000000624403",2010-04-19 07:04:43.0,",","NOSE",2,1,"fr","P",1,4976,4976,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000762218","NOSE_000000762218",2009-04-29 19:29:41.0,",","NOSE",2,1,"de","P",1,5141,5141,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000930565","NOSE_000000930565",2009-05-13 01:04:26.0,",","NOSE",2,1,"de","P",1,5332,5332,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000591390","NOSE_000000591390",2010-02-15 10:30:46.0,",","NOSE",2,1,"en","P",1,5234,5234,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000505194","NOSE_000000505194",2009-04-29 19:39:39.0,",","NOSE",2,1,"de","P",1,5416,5416,"Doubtful",,"1",4,1,1,1,0,0,1,1,0,0,"active" "000000391404","NOSE_000000391404",2009-12-04 16:50:24.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000023370","NOSE_000000023370",2009-05-13 01:18:42.0,",","NOSE",2,1,"de","P",1,5350,5350,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000065434","NOSE_000000065434",2009-04-29 19:28:11.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000158833","NOSE_000000158833",2009-05-13 01:41:03.0,",","NOSE",2,1,"de","P",1,5208,5208,"Good",,"9",4,0,1,0,0,0,1,0,0,0,"active" "000000093504","NOSE_000000093504",2010-07-13 07:05:01.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000844227","NOSE_000000844227",2009-04-29 19:36:00.0,",","NOSE",2,1,"de","P",1,4930,4930,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000196192","NOSE_000000196192",2009-05-13 02:03:50.0,",","NOSE",2,1,"de","P",1,5416,5416,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000669357","NOSE_000000669357",2010-01-16 07:03:36.0,",","NOSE",2,1,"fr","P",1,5188,5188,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000423149","NOSE_000000423149",2009-04-29 19:27:30.0,",","NOSE",2,1,"fr","P",1,5424,5424,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000930226","NOSE_000000930226",2010-04-29 11:36:23.0,",","NOSE",2,1,"fr","P",1,4968,4968,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000584960","NOSE_000000584960",2009-12-04 16:56:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000448684","NOSE_000000448684",2009-05-13 02:27:19.0,",","NOSE",2,1,"en","P",1,4886,5270,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000530782","NOSE_000000530782",2009-11-22 20:06:39.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,,2,2,2,0,0,0,0,0,0,0,"active" "000000514720","NOSE_000000514720",2010-05-10 07:04:44.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000681578","NOSE_000000681578",2009-12-04 17:01:18.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,0,0,3,0,0,0,"active" "000000781909","NOSE_000000781909",2009-05-13 02:37:51.0,",","NOSE",2,1,"de","P",1,5496,5496,"Good",,"1",3,0,0,0,0,0,1,0,0,0,"active" "000000541833","NOSE_000000541833",2009-05-13 02:50:29.0,",","NOSE",2,1,"de","P",1,5192,5192,"Good",,"1",3,1,2,2,1,0,1,1,2,2,"active" "000000710743","NOSE_000000710743",2009-04-29 19:36:49.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000083155","NOSE_000000083155",2009-04-29 19:32:29.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,3,0,0,0,"active" "000000729447","NOSE_000000729447",2009-11-22 20:06:52.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,4,1,0,0,0,0,0,0,0,0,"active" "000000126397","NOSE_000000126397",2009-12-04 16:59:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000990530","NOSE_000000990530",2009-09-29 20:35:06.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000528620","NOSE_000000528620",2010-07-08 12:46:18.0,",","NOSE",,1,"fr","P",1,5606,5606,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000294234","NOSE_000000294234",2009-04-29 19:36:23.0,",","NOSE",2,1,"en","P",1,5279,5279,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000386494","NOSE_000000386494",2010-04-29 11:36:15.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,2,0,"active" "000000406804","NOSE_000000406804",2010-05-04 07:04:33.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000188052","NOSE_000000188052",2010-07-08 12:43:10.0,",","NOSE",2,1,"en","P",1,5124,5124,"Good",,,2,1,2,0,0,0,0,0,0,0,"active" "000000295637","NOSE_000000295637",2010-03-24 07:03:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,2,2,"active" "000000349868","NOSE_000000349868",2010-04-18 07:07:50.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000196277","NOSE_000000196277",2009-12-04 16:40:38.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000978638","NOSE_000000978638",2009-06-08 12:09:02.0,",","NOSE",2,1,"de","P",1,5143,5143,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000147232","NOSE_000000147232",2009-05-13 03:41:04.0,",","NOSE",2,1,"en","P",1,5178,5178,"Good",,"9",3,3,3,0,1,0,0,0,0,0,"active" "000000980406","NOSE_000000980406",2009-12-04 16:51:54.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000342462","NOSE_000000342462",2009-04-29 19:33:09.0,",","NOSE",2,1,"de","P",1,5200,5200,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000349257","NOSE_000000349257",2010-02-05 10:07:44.0,",","NOSE",2,1,"en","P",1,5190,5190,"Good",,,4,1,3,0,1,0,0,0,0,0,"active" "000000358973","NOSE_000000358973",2010-05-28 07:04:47.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,2,0,"active" "000000333060","NOSE_000000333060",2010-07-21 07:06:18.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000516697","NOSE_000000516697",2009-12-04 16:46:45.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000896449","NOSE_000000896449",2009-07-31 19:21:19.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000139146","NOSE_000000139146",2009-04-29 19:35:28.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",3,1,1,1,0,0,1,1,0,2,"active" "000000473038","NOSE_000000473038",2010-03-02 07:05:05.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000361131","NOSE_000000361131",2009-11-04 14:57:52.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000515807","NOSE_000000515807",2009-11-04 15:37:49.0,",","NOSE",2,1,"de","P",1,5134,5134,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000889723","NOSE_000000889723",2010-07-08 12:37:14.0,",","NOSE",,1,"de","P",1,,,,,,4,2,2,0,0,0,0,0,0,0,"active" "000000515515","NOSE_000000515515",2009-12-04 17:02:03.0,",","NOSE",2,1,"en","P",1,5089,5089,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000562750","NOSE_000000562750",2010-02-23 07:05:59.0,",","NOSE",2,1,"de","P",1,5102,5102,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000230683","NOSE_000000230683",2009-04-29 19:28:33.0,",","NOSE",2,1,"en","P",1,5379,5379,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000921836","NOSE_000000921836",2010-04-29 11:59:27.0,",","NOSE",2,1,"en","P",1,5177,5177,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000421396","NOSE_000000421396",2009-06-08 12:36:18.0,",","NOSE",2,1,"en","P",1,5498,5498,"Good",,"1",3,1,1,1,0,0,0,1,0,0,"active" "000000588942","NOSE_000000588942",2009-07-15 14:52:49.0,",","NOSE",2,1,"en","P",1,5474,5474,"Good",,,3,3,3,0,0,0,0,0,0,0,"active" "000000911747","NOSE_000000911747",2009-04-29 19:40:28.0,",","NOSE",2,1,"de","P",1,5158,5158,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000715041","NOSE_000000715041",2009-11-21 20:06:46.0,",","NOSE",2,1,"de","P",1,5222,5222,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000113404","NOSE_000000113404",2009-06-08 13:04:10.0,",","NOSE",2,1,"en","P",1,5254,5254,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000729089","NOSE_000000729089",2010-06-05 07:06:46.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000514890","NOSE_000000514890",2009-06-08 13:25:55.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000435527","NOSE_000000435527",2009-05-13 04:46:34.0,",","NOSE",2,1,"de","P",1,5336,5336,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000819692","NOSE_000000819692",2009-05-13 04:58:11.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",3,0,1,1,1,0,1,0,0,0,"active" "000000733195","NOSE_000000733195",2009-04-29 19:34:43.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000196853","NOSE_000000196853",2009-11-17 20:07:57.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000196270","NOSE_000000196270",2009-04-29 19:42:44.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",3,1,2,0,3,0,3,2,0,0,"active" "000000040569","NOSE_000000040569",2010-03-04 07:04:00.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000573347","NOSE_000000573347",2009-09-30 13:41:39.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000102613","NOSE_000000102613",2009-04-29 19:27:21.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000686999","NOSE_000000686999",2009-04-29 19:38:04.0,",","NOSE",2,1,"en","P",1,5337,5337,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000493439","NOSE_000000493439",2010-05-01 07:21:33.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000206480","NOSE_000000206480",2009-04-29 19:41:15.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000332939","NOSE_000000332939",2009-04-29 19:41:34.0,",","NOSE",2,1,"en","P",1,5391,5391,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000020224","NOSE_000000020224",2009-06-29 12:42:00.0,",","NOSE",2,1,"en","P",1,5277,5277,"Good",,,4,2,2,0,0,0,0,0,0,0,"active" "000000964418","NOSE_000000964418",2009-04-29 19:33:30.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",4,0,2,0,0,0,0,0,2,0,"active" "000000777912","NOSE_000000777912",2009-04-29 19:34:49.0,",","NOSE",2,1,"en","P",1,5334,5334,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000065879","NOSE_000000065879",2009-07-31 19:21:50.0,",","NOSE",2,1,"de","P",1,5189,5189,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000422179","NOSE_000000422179",2009-09-08 21:08:33.0,",","NOSE",2,1,"de","P",1,5460,5460,"Good",,,4,0,2,0,0,0,0,1,0,0,"active" "000000953281","NOSE_000000953281",2010-05-26 07:04:51.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,,4,0,1,0,0,0,1,1,0,0,"active" "000000224754","NOSE_000000224754",2009-05-13 06:52:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000423131","NOSE_000000423131",2009-06-29 13:09:22.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,2,0,1,0,0,0,1,1,0,0,"active" "000000727629","NOSE_000000727629",2009-11-04 02:04:22.0,",","NOSE",2,1,"fr","P",1,5637,5637,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000552834","NOSE_000000552834",2010-02-08 09:14:47.0,",","NOSE",,1,"fr","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000085337","NOSE_000000085337",2009-05-13 07:05:01.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000376679","NOSE_000000376679",2009-11-04 02:51:18.0,",","NOSE",2,1,"fr","P",1,5117,5117,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000317510","NOSE_000000317510",2010-02-15 10:30:34.0,",","NOSE",1,1,"en","P",1,5138,5138,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000425872","NOSE_000000425872",2009-05-13 07:20:37.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000379940","NOSE_000000379940",2009-05-13 07:36:29.0,",","NOSE",2,1,"fr","P",1,5237,5237,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000075449","NOSE_000000075449",2009-04-29 19:31:44.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000474746","NOSE_000000474746",2009-07-31 19:22:07.0,",","NOSE",2,1,"fr","P",1,4992,4992,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000172967","NOSE_000000172967",2009-04-29 19:28:55.0,",","NOSE",2,1,"de","P",1,5289,5289,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000638824","NOSE_000000638824",2009-12-04 17:03:27.0,",","NOSE",,1,"en","P",1,,,,,,2,2,3,2,1,0,1,2,0,2,"active" "000000214685","NOSE_000000214685",2009-05-13 08:25:47.0,",","NOSE",,1,"en","P",1,5283,5283,,,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000935973","NOSE_000000935973",2009-12-04 17:03:33.0,",","NOSE",,1,"en","P",1,,,,,,3,4,3,0,1,0,0,2,0,0,"active" "000000771634","NOSE_000000771634",2009-09-30 13:54:03.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000532672","NOSE_000000532672",2009-08-06 13:37:52.0,",","NOSE",2,1,"en","P",1,5270,5270,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000223076","NOSE_000000223076",2010-03-27 07:03:59.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,1,0,1,1,0,0,0,"active" "000000642844","NOSE_000000642844",2009-05-13 08:42:22.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018855","NOSE_000000018855",2010-04-30 07:05:21.0,",","NOSE",,1,"de","P",1,,,,,,4,1,3,0,0,0,1,0,0,0,"active" "000000113404","NOSE_000000113404",2010-04-22 07:07:19.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000244445","NOSE_000000244445",2010-05-29 07:05:54.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,2,"active" "000000610352","NOSE_000000610352",2009-04-29 19:29:52.0,",","NOSE",2,1,"en","P",1,5454,5454,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000432763","NOSE_000000432763",2009-06-08 13:53:03.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,"1",4,1,2,1,0,0,0,1,0,0,"active" "000000292040","NOSE_000000292040",2009-04-29 19:38:28.0,",","NOSE",2,1,"de","P",1,5029,5029,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000862568","NOSE_000000862568",2009-04-29 19:29:57.0,",","NOSE",2,2,"de","P",1,5426,5436,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000417397","NOSE_000000417397",2009-04-29 19:42:15.0,",","NOSE",2,1,"de","P",1,5271,5271,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000679405","NOSE_000000679405",2009-05-13 09:44:09.0,",","NOSE",2,1,"en","P",1,5463,5463,"Good",,"1",4,1,1,0,0,0,0,1,0,0,"active" "000000054345","NOSE_000000054345",2009-04-29 19:40:09.0,",","NOSE",2,1,"en","P",1,5251,5251,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000249343","NOSE_000000249343",2009-12-04 17:04:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000262865","NOSE_000000262865",2010-03-31 07:04:17.0,",","NOSE",,1,"de","P",1,,,,,,3,1,2,0,0,0,3,1,0,4,"active" "000000967977","NOSE_000000967977",2010-07-08 13:44:32.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000835248","NOSE_000000835248",2009-11-23 10:15:29.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000018292","NOSE_000000018292",2010-03-11 07:04:36.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000181351","NOSE_000000181351",2009-04-29 19:25:29.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000000564","NOSE_000000000564",2009-12-04 17:00:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000749834","NOSE_000000749834",2010-04-16 07:07:38.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000789926","NOSE_000000789926",2010-01-24 07:03:49.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000264811","NOSE_000000264811",2009-11-10 20:41:59.0,",","NOSE",2,1,"en","P",1,5158,5158,"Good",,,3,1,0,0,0,0,1,1,0,0,"active" "000000889305","NOSE_000000889305",2009-12-04 17:02:46.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000257181","NOSE_000000257181",2009-05-13 10:17:31.0,",","NOSE",2,1,"de","P",1,5535,5535,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000596208","NOSE_000000596208",2010-07-08 12:51:51.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000138185","NOSE_000000138185",2009-06-29 13:38:40.0,",","NOSE",2,1,"en","P",1,5329,5329,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000986828","NOSE_000000986828",2009-12-04 16:46:27.0,",","NOSE",2,1,"en","P",1,5449,5449,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000848356","NOSE_000000848356",2009-08-31 13:51:07.0,",","NOSE",2,1,"en","P",1,5477,5477,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000242443","NOSE_000000242443",2009-05-13 10:31:18.0,",","NOSE",2,1,"de","P",1,5408,5408,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000308442","NOSE_000000308442",2010-07-21 07:09:01.0,",","NOSE",,1,"de","P",1,,,,,,2,1,2,0,0,0,0,0,0,0,"active" "000000039903","NOSE_000000039903",2009-04-29 19:27:38.0,",","NOSE",2,1,"de","P",1,5064,5064,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000614249","NOSE_000000614249",2009-04-29 19:20:58.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000895509","NOSE_000000895509",2010-07-11 07:05:44.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,2,0,"active" "000000124208","NOSE_000000124208",2009-10-22 15:16:07.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,2,0,0,4,"active" "000000347184","NOSE_000000347184",2009-05-13 11:12:28.0,",","NOSE",2,1,"de","P",1,5530,5530,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000584859","NOSE_000000584859",2009-08-31 14:02:56.0,",","NOSE",2,1,"en","P",1,5242,5242,"Good",,,2,3,3,0,0,0,0,0,0,0,"active" "000000728262","NOSE_000000728262",2009-08-06 12:18:17.0,",","NOSE",2,,,,,,,"Missing","

incomplete beca...

",,,,,,,,,,,,"active" "000000562977","NOSE_000000562977",2010-04-22 07:04:39.0,",","NOSE",,1,"en","P",1,-89,-89,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000246872","NOSE_000000246872",2009-06-08 14:21:58.0,",","NOSE",2,1,"en","P",1,4800,5184,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000971090","NOSE_000000971090",2009-05-13 11:28:40.0,",","NOSE",2,1,"de","P",1,5378,5378,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000236935","NOSE_000000236935",2009-04-29 19:24:23.0,",","NOSE",2,1,"de","P",1,5104,5104,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000903205","NOSE_000000903205",2009-08-19 16:34:56.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good","

needs to be car...

",,4,0,2,0,0,0,0,0,0,2,"active" "000000255143","NOSE_000000255143",2009-06-12 19:11:29.0,",","NOSE",2,1,"en","P",1,5268,5268,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000527504","NOSE_000000527504",2009-05-13 12:14:20.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,"1",3,0,2,0,0,0,0,0,0,0,"active" "000000603036","NOSE_000000603036",2009-08-19 16:49:39.0,",","NOSE",2,1,"de","P",1,5295,5295,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000452621","NOSE_000000452621",2009-07-06 11:56:52.0,",","NOSE",2,1,"en","P",1,4710,5094,"Good",,,4,0,1,1,1,0,1,0,2,0,"active" "000000050078","NOSE_000000050078",2009-10-10 20:11:16.0,",","NOSE",2,1,"de","P",1,5429,5429,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000048418","NOSE_000000048418",2009-09-12 20:05:13.0,",","NOSE",2,1,"en","P",1,5180,5180,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000065094","NOSE_000000065094",2009-12-04 16:53:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000947230","NOSE_000000947230",2009-04-29 19:29:47.0,",","NOSE",2,1,"de","P",1,5015,5015,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000459391","NOSE_000000459391",2009-04-29 19:19:13.0,",","NOSE",2,1,"fr","P",1,5415,5415,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000150707","NOSE_000000150707",2009-05-13 13:56:54.0,",","NOSE",2,1,"de","P",1,5453,5453,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000790134","NOSE_000000790134",2009-11-24 15:40:57.0,",","NOSE",2,1,"en","P",1,5239,5239,"Good",,,4,0,1,1,1,0,1,1,2,0,"active" "000000780427","NOSE_000000780427",2010-07-16 07:05:22.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000419233","NOSE_000000419233",2009-11-29 20:06:55.0,",","NOSE",2,1,"en","P",1,5186,5186,"Good",,,4,0,1,1,1,0,0,0,0,0,"active" "000000040558","NOSE_000000040558",2009-12-04 17:00:59.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000046034","NOSE_000000046034",2009-05-13 14:29:00.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000469173","NOSE_000000469173",2010-04-15 07:06:08.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000789855","NOSE_000000789855",2010-05-05 07:04:24.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000074682","NOSE_000000074682",2010-07-08 13:51:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000009446","NOSE_000000009446",2009-05-13 14:39:27.0,",","NOSE",2,1,"de","P",1,5071,5071,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000549153","NOSE_000000549153",2010-01-21 07:03:48.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000687689","NOSE_000000687689",2010-03-14 07:04:35.0,",","NOSE",2,1,"de","P",1,5276,5276,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000131675","NOSE_000000131675",2009-11-04 14:59:52.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000350636","NOSE_000000350636",2009-11-04 15:00:08.0,",","NOSE",,1,"fr","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000985209","NOSE_000000985209",2009-11-04 15:00:26.0,",","NOSE",2,1,"fr","P",1,5290,5290,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000736672","NOSE_000000736672",2009-04-29 19:25:12.0,",","NOSE",2,1,"en","P",1,5239,5239,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000098988","NOSE_000000098988",2010-04-29 11:52:42.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,2,0,2,0,"active" "000000266545","NOSE_000000266545",2010-07-14 07:06:50.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000741119","NOSE_000000741119",2010-02-22 07:03:54.0,",","NOSE",2,1,"fr","P",1,5517,5517,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000162049","NOSE_000000162049",2009-05-13 15:00:44.0,",","NOSE",2,1,"de","P",1,5518,5518,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000601410","NOSE_000000601410",2010-03-29 07:03:58.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000016955","NOSE_000000016955",2010-02-23 07:04:05.0,",","NOSE",2,1,"en","P",1,5235,5235,"Good",,,4,1,3,2,0,0,0,0,0,0,"active" "000000000297","NOSE_000000000297",2009-04-29 19:29:33.0,",","NOSE",3,1,"en","P",1,5215,5215,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000256089","NOSE_000000256089",2009-04-29 19:29:30.0,",","NOSE",2,1,"en","P",1,5368,5368,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000917649","NOSE_000000917649",2009-07-31 19:22:40.0,",","NOSE",2,1,"en","P",1,4927,5311,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000085997","NOSE_000000085997",2009-04-29 19:32:46.0,",","NOSE",2,1,"de","P",1,5007,5007,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000670826","NOSE_000000670826",2009-12-04 16:40:10.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000599364","NOSE_000000599364",2009-09-29 20:54:06.0,",","NOSE",2,1,"fr","P",1,5062,5062,"Good",,,1,1,1,0,0,0,0,0,4,0,"active" "000000801792","NOSE_000000801792",2009-05-13 15:43:03.0,",","NOSE",2,1,"de","P",1,5195,5195,"Good",,"9",3,2,3,2,2,0,2,1,2,2,"active" "000000021826","NOSE_000000021826",2009-05-13 15:54:38.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000171462","NOSE_000000171462",2009-05-13 16:07:27.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000977480","NOSE_000000977480",2009-12-04 16:57:01.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000000825","NOSE_000000000825",2010-02-11 07:03:51.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000931899","NOSE_000000931899",2009-07-31 19:53:19.0,",","NOSE",2,1,"de","P",1,5538,5538,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000565845","NOSE_000000565845",2009-05-13 16:19:22.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,"1",4,2,1,0,0,0,0,0,2,0,"active" "000000921954","NOSE_000000921954",2009-04-29 19:33:18.0,",","NOSE",2,1,"de","P",1,5221,5221,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000826934","NOSE_000000826934",2009-04-29 19:30:41.0,",","NOSE",2,2,"en","P",1,5489,5489,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000032795","NOSE_000000032795",2009-08-19 17:00:38.0,",","NOSE",2,1,"de","P",1,5329,5329,"Good","

The Subject nee...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000534042","NOSE_000000534042",2009-12-04 16:53:47.0,",","NOSE",,1,"de","P",1,,,,,,2,1,0,0,0,0,0,0,0,0,"active" "000000531629","NOSE_000000531629",2009-04-29 19:24:26.0,",","NOSE",2,1,"de","P",1,5569,5569,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000491377","NOSE_000000491377",2009-04-29 19:30:38.0,",","NOSE",2,1,"en","P",1,5243,5304,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000427102","NOSE_000000427102",2009-09-13 20:04:36.0,",","NOSE",2,1,"en","P",1,5367,5367,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000783635","NOSE_000000783635",2009-05-13 17:15:00.0,",","NOSE",2,1,"de","P",1,4984,4984,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000902605","NOSE_000000902605",2009-04-29 19:28:27.0,",","NOSE",2,1,"de","P",1,5508,5508,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000198965","NOSE_000000198965",2009-05-13 17:36:52.0,",","NOSE",2,1,"en","P",1,5303,5303,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000000368","NOSE_000000000368",2009-06-12 19:39:02.0,",","NOSE",2,1,"de","P",1,5279,5279,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000984063","NOSE_000000984063",2009-05-13 17:47:57.0,",","NOSE",2,1,"en","P",1,5046,5046,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000719480","NOSE_000000719480",2009-07-06 12:25:03.0,",","NOSE",2,1,"de","P",1,5304,5304,"Missing",,,1,0,0,0,0,0,0,0,0,0,"active" "000000886379","NOSE_000000886379",2009-05-13 18:00:45.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",4,1,1,0,0,0,0,1,0,2,"active" "000000357222","NOSE_000000357222",2010-05-09 07:05:09.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000496466","NOSE_000000496466",2009-04-29 19:34:37.0,",","NOSE",2,1,"en","P",1,5468,5468,"Good",,"1",4,0,1,0,1,0,1,1,0,4,"active" "000000240360","NOSE_000000240360",2010-02-21 07:04:40.0,",","NOSE",2,1,"de","P",1,5231,5231,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000034618","NOSE_000000034618",2009-09-09 23:11:15.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,0,0,1,1,0,0,"active" "000000838113","NOSE_000000838113",2010-05-09 07:04:47.0,",","NOSE",2,1,"fr","P",1,5211,5211,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000118316","NOSE_000000118316",2009-06-08 14:50:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000821690","NOSE_000000821690",2009-04-29 19:38:33.0,",","NOSE",2,1,"en","P",1,5290,5290,"Good",,"1",4,0,1,0,0,0,1,0,0,0,"active" "000000771514","NOSE_000000771514",2009-05-13 18:38:58.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000442910","NOSE_000000442910",2009-04-29 19:37:45.0,",","NOSE",2,1,"de","P",1,5029,5029,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000281650","NOSE_000000281650",2009-05-13 19:05:19.0,",","NOSE",2,1,"de","P",1,5034,5034,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000058700","NOSE_000000058700",2009-05-13 19:18:07.0,",","NOSE",2,1,"en","P",1,5252,5252,"Good",,"1",4,0,2,0,0,0,1,0,0,0,"active" "000000005386","NOSE_000000005386",2009-05-13 19:27:50.0,",","NOSE",2,1,"en","P",1,5438,5438,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000181774","NOSE_000000181774",2009-11-06 20:37:34.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000124063","NOSE_000000124063",2009-04-29 19:39:45.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000996936","NOSE_000000996936",2010-07-14 07:05:47.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000596256","NOSE_000000596256",2009-04-29 19:42:27.0,",","NOSE",2,1,"en","P",1,5109,5109,"Good",,"1",4,0,2,1,0,0,0,0,0,0,"active" "000000920901","NOSE_000000920901",2009-12-04 16:48:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000777515","NOSE_000000777515",2009-11-04 15:06:25.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000899162","NOSE_000000899162",2009-09-06 20:42:45.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000066842","NOSE_000000066842",2009-06-30 09:54:12.0,",","NOSE",2,1,"de","P",1,5429,5429,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000517016","NOSE_000000517016",2009-04-29 19:30:47.0,",","NOSE",2,1,"de","P",1,5156,5156,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000470020","NOSE_000000470020",2009-04-29 19:20:52.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000853304","NOSE_000000853304",2009-04-29 19:32:11.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000810457","NOSE_000000810457",2009-07-31 19:53:46.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000447513","NOSE_000000447513",2010-02-19 07:03:41.0,",","NOSE",,1,"fr","P",1,,,,,,4,1,2,0,1,0,0,0,0,0,"active" "000000937781","NOSE_000000937781",2009-05-13 20:46:03.0,",","NOSE",,1,"de","P",1,,,,,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000605715","NOSE_000000605715",2009-05-13 20:59:54.0,",","NOSE",2,,,,,,,"Missing","

Parent had to l...

",,,,,,,,,,,,"active" "000000415464","NOSE_000000415464",2010-03-11 07:18:21.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000115871","NOSE_000000115871",2009-06-08 15:16:56.0,",","NOSE",2,1,"en","P",1,5387,5387,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000604658","NOSE_000000604658",2010-07-08 12:40:58.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000437993","NOSE_000000437993",2009-04-29 19:28:46.0,",","NOSE",2,1,"de","P",1,5188,5188,"Doubtful","

data was rated ...

","0",1,0,1,0,0,0,0,0,0,2,"active" "000000751445","NOSE_000000751445",2009-04-29 19:29:55.0,",","NOSE",2,1,"de","P",1,4815,4815,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000974731","NOSE_000000974731",2009-07-31 19:54:00.0,",","NOSE",2,1,"en","P",1,5365,5365,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000897451","NOSE_000000897451",2009-05-13 21:39:22.0,",","NOSE",2,1,"de","P",1,5272,5272,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000734565","NOSE_000000734565",2009-05-13 21:52:25.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",3,0,1,0,0,0,0,1,0,0,"active" "000000850762","NOSE_000000850762",2009-11-24 15:41:06.0,",","NOSE",2,1,"fr","P",1,5148,5148,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000484721","NOSE_000000484721",2009-12-04 16:52:33.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000741640","NOSE_000000741640",2010-04-14 07:05:06.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000056239","NOSE_000000056239",2009-05-13 22:05:45.0,",","NOSE",2,1,"de","P",1,5134,5134,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000717843","NOSE_000000717843",2009-05-13 22:19:13.0,",","NOSE",2,1,"de","P",1,5445,5445,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000404624","NOSE_000000404624",2009-05-13 22:31:17.0,",","NOSE",,1,"de","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000759429","NOSE_000000759429",2009-05-13 22:45:22.0,",","NOSE",2,1,"en","P",1,5385,5385,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000844706","NOSE_000000844706",2010-05-25 07:04:58.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000164605","NOSE_000000164605",2009-12-04 16:51:23.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000814390","NOSE_000000814390",2010-07-08 12:38:11.0,",","NOSE",,1,"fr","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000015547","NOSE_000000015547",2009-08-31 14:17:03.0,",","NOSE",2,1,"en","P",1,129,129,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000131519","NOSE_000000131519",2009-12-04 17:02:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000599967","NOSE_000000599967",2009-08-19 17:31:31.0,",","NOSE",2,1,"de","P",1,5195,5195,"Good",,,4,0,0,0,0,0,0,0,2,0,"active" "000000510567","NOSE_000000510567",2009-08-19 17:46:59.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000580795","NOSE_000000580795",2009-05-13 22:58:47.0,",","NOSE",2,1,"en","P",1,5301,5301,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000615660","NOSE_000000615660",2009-05-13 23:12:16.0,",","NOSE",2,1,"de","P",1,5268,5268,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000706553","NOSE_000000706553",2009-05-13 23:25:48.0,",","NOSE",2,1,"de","P",1,5415,5415,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000356518","NOSE_000000356518",2009-07-31 19:23:00.0,",","NOSE",2,2,"en","P",1,5176,5176,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000563112","NOSE_000000563112",2009-06-08 20:45:41.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000462215","NOSE_000000462215",2009-10-17 20:14:06.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000574435","NOSE_000000574435",2010-05-18 07:04:39.0,",","NOSE",2,1,"en","P",1,5124,5124,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000400585","NOSE_000000400585",2010-03-06 07:04:21.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000120416","NOSE_000000120416",2010-03-26 07:04:23.0,",","NOSE",2,1,"fr","P",1,5365,5365,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000519870","NOSE_000000519870",2009-05-13 23:39:12.0,",","NOSE",2,1,"fr","P",1,5518,5518,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000238565","NOSE_000000238565",2010-06-21 12:10:46.0,",","NOSE",,1,"en","P",1,5244,5244,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000288955","NOSE_000000288955",2009-05-13 23:52:32.0,",","NOSE",2,1,"de","P",1,5219,5219,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000661785","NOSE_000000661785",2009-05-14 00:02:51.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000523737","NOSE_000000523737",2009-04-29 19:38:01.0,",","NOSE",2,1,"en","P",1,5199,5199,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000507386","NOSE_000000507386",2009-08-31 14:31:10.0,",","NOSE",,1,"en","P",1,5319,5319,,,,4,1,1,0,0,0,2,0,0,0,"active" "000000423366","NOSE_000000423366",2010-04-08 07:04:20.0,",","NOSE",2,1,"fr","P",1,5095,5095,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000733184","NOSE_000000733184",2009-10-09 20:19:34.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000884889","NOSE_000000884889",2010-06-21 13:19:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000197748","NOSE_000000197748",2010-07-13 07:05:18.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000348377","NOSE_000000348377",2009-07-31 19:23:17.0,",","NOSE",2,1,"en","P",1,5438,5438,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000733379","NOSE_000000733379",2009-05-14 00:32:12.0,",","NOSE",2,1,"de","P",1,5347,5347,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000651678","NOSE_000000651678",2009-08-20 05:58:32.0,",","NOSE",2,1,"de","P",1,5201,5201,"Good",,,3,0,0,0,0,0,3,0,0,2,"active" "000000681160","NOSE_000000681160",2010-04-16 07:04:27.0,",","NOSE",2,1,"en","P",1,-5,-5,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000739287","NOSE_000000739287",2010-05-31 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000838585","NOSE_000000838585",2009-12-04 16:46:59.0,",","NOSE",2,1,"en","P",1,5092,5092,"Good",,,4,1,0,0,0,0,0,0,0,0,"active" "000000756282","NOSE_000000756282",2009-11-08 00:07:45.0,",","NOSE",2,1,"en","P",1,5118,5118,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000461785","NOSE_000000461785",2009-05-14 00:41:00.0,",","NOSE",2,1,"fr","P",1,5364,5364,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000571279","NOSE_000000571279",2009-05-14 00:54:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000980347","NOSE_000000980347",2009-04-29 19:26:01.0,",","NOSE",2,1,"fr","P",1,5187,5187,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000153072","NOSE_000000153072",2009-05-14 01:22:48.0,",","NOSE",,3,"en","P",1,5194,5447,,,"9",3,1,1,0,0,0,0,0,0,0,"active" "000000455317","NOSE_000000455317",2009-12-04 16:53:31.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000668308","NOSE_000000668308",2009-04-29 19:39:21.0,",","NOSE",2,1,"de","P",1,5041,5041,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000057360","NOSE_000000057360",2009-05-14 01:40:16.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",4,2,3,2,2,1,2,1,2,2,"active" "000000877952","NOSE_000000877952",2009-09-18 14:47:08.0,",","NOSE",2,1,"de","P",1,5326,5326,"Good",,,1,0,2,0,0,0,0,0,0,0,"active" "000000759987","NOSE_000000759987",2009-05-14 01:55:05.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000939090","NOSE_000000939090",2010-07-08 12:46:24.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000152839","NOSE_000000152839",2010-02-01 07:03:20.0,",","NOSE",2,1,"en","P",1,5192,5192,"Good",,,4,0,1,0,0,0,0,0,2,0,"active" "000000570001","NOSE_000000570001",2009-04-29 19:39:53.0,",","NOSE",2,1,"de","P",1,5280,5280,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000509497","NOSE_000000509497",2009-04-29 19:34:19.0,",","NOSE",1,1,"en","P",1,5308,5308,"Good",,"9",3,3,3,2,1,0,3,2,2,2,"active" "000000074860","NOSE_000000074860",2009-10-22 15:32:21.0,",","NOSE",2,1,"en","P",1,5115,5115,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000603127","NOSE_000000603127",2009-04-29 19:31:05.0,",","NOSE",2,1,"de","P",1,5040,5040,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000295033","NOSE_000000295033",2009-12-04 16:52:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000988370","NOSE_000000988370",2009-04-29 19:36:43.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",3,2,3,0,0,0,1,2,0,0,"active" "000000522869","NOSE_000000522869",2009-05-14 03:06:40.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000662841","NOSE_000000662841",2009-05-14 03:20:31.0,",","NOSE",2,1,"de","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000048375","NOSE_000000048375",2010-03-18 07:04:04.0,",","NOSE",2,1,"fr","P",1,5124,5124,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000800815","NOSE_000000800815",2009-05-14 03:34:34.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000931568","NOSE_000000931568",2009-09-08 21:16:37.0,",","NOSE",2,1,"de","P",1,5278,5278,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000366371","NOSE_000000366371",2009-05-14 03:49:00.0,",","NOSE",2,1,"de","P",1,5478,5478,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000270318","NOSE_000000270318",2009-12-04 17:02:32.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000320389","NOSE_000000320389",2010-04-19 07:05:03.0,",","NOSE",2,1,"en","P",1,5146,5146,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000956673","NOSE_000000956673",2009-12-04 17:03:35.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000841336","NOSE_000000841336",2010-07-08 12:42:42.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000845281","NOSE_000000845281",2009-12-04 17:01:28.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000428305","NOSE_000000428305",2009-10-17 04:56:27.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000259127","NOSE_000000259127",2009-05-14 04:04:49.0,",","NOSE",2,,,,,,,"Missing","

parents didn't ...

",,,,,,,,,,,,"active" "000000007630","NOSE_000000007630",2009-07-31 19:23:35.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000876848","NOSE_000000876848",2009-04-29 19:35:04.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000511399","NOSE_000000511399",2009-10-09 21:15:19.0,",","NOSE",2,1,"de","P",1,5236,5236,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000105249","NOSE_000000105249",2009-04-29 19:35:48.0,",","NOSE",2,1,"en","P",1,5348,5348,"Good",,"1",3,3,3,0,0,0,0,0,0,0,"active" "000000311379","NOSE_000000311379",2010-07-21 07:05:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000448905","NOSE_000000448905",2009-05-14 04:46:10.0,",","NOSE",2,1,"de","P",1,5284,5284,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000906117","NOSE_000000906117",2009-05-14 05:00:44.0,",","NOSE",2,1,"de","P",1,4646,4646,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000887827","NOSE_000000887827",2009-10-14 10:13:29.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000147016","NOSE_000000147016",2009-11-07 21:05:13.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000775830","NOSE_000000775830",2009-12-04 16:53:52.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000055047","NOSE_000000055047",2009-12-04 16:53:02.0,",","NOSE",,1,"de","P",1,,,,,,2,2,2,0,0,0,0,0,0,0,"active" "000000986828","NOSE_000000986828",2009-04-29 19:23:25.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000801312","NOSE_000000801312",2009-04-29 19:39:07.0,",","NOSE",2,1,"fr","P",1,5337,5337,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000732187","NOSE_000000732187",2009-04-29 19:28:49.0,",","NOSE",2,1,"de","P",1,4879,4879,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000304296","NOSE_000000304296",2010-01-19 07:03:59.0,",","NOSE",2,1,"fr","P",1,5149,5149,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000706007","NOSE_000000706007",2010-05-26 07:04:32.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000106857","NOSE_000000106857",2009-04-29 19:29:19.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000400632","NOSE_000000400632",2010-01-19 17:07:10.0,",","NOSE",2,1,"de","P",1,5512,5512,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000159624","NOSE_000000159624",2009-10-06 10:45:04.0,",","NOSE",2,1,"fr","P",1,5098,5098,"Good",,,3,1,1,1,0,0,0,0,0,0,"active" "000000102306","NOSE_000000102306",2009-09-09 23:10:49.0,",","NOSE",2,1,"de","P",1,5452,5452,"Good",,,4,0,1,0,0,0,1,0,0,0,"active" "000000416067","NOSE_000000416067",2009-04-29 19:41:46.0,",","NOSE",2,1,"en","P",1,5473,5473,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000570453","NOSE_000000570453",2010-07-08 13:49:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,2,2,"active" "000000619466","NOSE_000000619466",2010-05-23 07:04:14.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000803167","NOSE_000000803167",2009-09-01 11:18:33.0,",","NOSE",2,1,"fr","P",1,5200,5200,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000205740","NOSE_000000205740",2010-03-18 07:04:47.0,",","NOSE",2,1,"fr","P",1,5356,5356,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000224092","NOSE_000000224092",2009-11-08 20:42:31.0,",","NOSE",2,1,"en","P",1,5432,5432,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000081411","NOSE_000000081411",2010-02-24 07:03:48.0,",","NOSE",2,1,"fr","P",1,5348,5348,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000896281","NOSE_000000896281",2009-09-11 09:47:05.0,",","NOSE",2,1,"en","P",1,5383,5383,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000771899","NOSE_000000771899",2010-06-10 07:05:34.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000026941","NOSE_000000026941",2009-12-17 10:16:43.0,",","NOSE",2,1,"fr","P",1,5265,5265,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000710234","NOSE_000000710234",2009-06-08 15:45:54.0,",","NOSE",2,1,"de","P",1,4822,4822,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000856091","NOSE_000000856091",2010-07-08 12:45:21.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,1,0,0,4,"active" "000000960715","NOSE_000000960715",2009-06-29 14:07:38.0,",","NOSE",2,1,"en","P",1,4920,5304,"Good",,,3,0,0,0,0,0,0,0,0,2,"active" "000000536841","NOSE_000000536841",2009-10-13 16:12:54.0,",","NOSE",2,1,"de","P",1,5216,5216,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000038931","NOSE_000000038931",2009-11-27 10:18:08.0,",","NOSE",2,1,"de","P",1,5132,5132,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000920665","NOSE_000000920665",2010-03-17 07:07:42.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,2,"active" "000000657997","NOSE_000000657997",2009-04-29 19:27:19.0,",","NOSE",2,1,"de","P",1,5390,5390,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000056304","NOSE_000000056304",2009-04-29 19:31:19.0,",","NOSE",2,1,"en","P",1,5192,5192,"Good",,"1",4,1,3,0,0,0,0,1,0,4,"active" "000000727681","NOSE_000000727681",2009-06-08 16:14:25.0,",","NOSE",2,1,"de","P",1,4972,4972,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000427538","NOSE_000000427538",2010-07-18 07:05:28.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000550632","NOSE_000000550632",2009-04-29 19:41:40.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",3,2,2,1,0,0,1,1,0,0,"active" "000000209826","NOSE_000000209826",2009-07-31 19:55:05.0,",","NOSE",2,1,"fr","P",1,5055,5055,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000067372","NOSE_000000067372",2009-12-04 16:54:00.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000337728","NOSE_000000337728",2009-04-29 19:39:50.0,",","NOSE",2,1,"en","P",1,5077,5077,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000109637","NOSE_000000109637",2010-07-08 12:47:08.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000219804","NOSE_000000219804",2009-08-20 20:41:29.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000223460","NOSE_000000223460",2009-05-14 07:21:18.0,",","NOSE",2,1,"de","P",1,5319,5319,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000428069","NOSE_000000428069",2010-03-02 07:04:01.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000469339","NOSE_000000469339",2010-04-13 07:04:28.0,",","NOSE",2,1,"fr","P",1,5458,5458,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000025169","NOSE_000000025169",2009-04-29 19:32:03.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000486433","NOSE_000000486433",2009-04-29 19:30:18.0,",","NOSE",2,1,"en","P",1,5273,5273,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000329460","NOSE_000000329460",2009-12-04 16:53:23.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,2,0,0,0,"active" "000000620201","NOSE_000000620201",2009-05-14 08:03:33.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,"9",2,1,1,0,1,0,0,0,0,0,"active" "000000622210","NOSE_000000622210",2009-04-29 19:35:39.0,",","NOSE",2,1,"en","P",1,5294,5294,"Good",,"1",1,2,0,0,0,0,0,0,0,0,"active" "000000540037","NOSE_000000540037",2009-04-29 19:23:55.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000204653","NOSE_000000204653",2009-04-29 19:39:01.0,",","NOSE",2,1,"de","P",1,5159,5159,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000327531","NOSE_000000327531",2009-06-08 16:42:34.0,",","NOSE",2,1,"de","P",1,5437,5437,"Good",,,3,0,1,1,0,0,0,1,0,0,"active" "000000028516","NOSE_000000028516",2009-04-29 19:36:17.0,",","NOSE",2,1,"en","P",1,5245,5245,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000635425","NOSE_000000635425",2009-07-06 12:34:06.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000943858","NOSE_000000943858",2009-07-31 19:23:53.0,",","NOSE",2,1,"fr","P",1,5517,5517,"Good",,,4,0,0,0,0,0,1,0,0,4,"active" "000000481880","NOSE_000000481880",2009-09-14 20:09:38.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,1,0,0,0,0,0,"active" "000000278194","NOSE_000000278194",2009-05-14 09:12:10.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000143372","NOSE_000000143372",2010-07-08 12:41:13.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000999510","NOSE_000000999510",2009-04-29 19:34:16.0,",","NOSE",2,1,"de","P",1,5018,5018,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000038965","NOSE_000000038965",2009-06-08 17:06:37.0,",","NOSE",2,1,"de","P",1,5012,5012,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000596301","NOSE_000000596301",2009-12-04 16:22:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000309959","NOSE_000000309959",2009-12-04 16:53:33.0,",","NOSE",,2,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000303933","NOSE_000000303933",2010-05-03 07:04:23.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000657498","NOSE_000000657498",2009-12-04 16:46:22.0,",","NOSE",2,1,"en","P",1,5184,5184,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000149558","NOSE_000000149558",2009-04-29 19:31:11.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000368036","NOSE_000000368036",2009-09-27 20:41:34.0,",","NOSE",2,1,"fr","P",1,5384,5384,"Good",,,3,0,0,0,0,0,1,0,0,2,"active" "000000416958","NOSE_000000416958",2009-05-14 09:57:41.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000084181","NOSE_000000084181",2009-05-14 10:11:45.0,",","NOSE",2,1,"de","P",1,5425,5429,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000725730","NOSE_000000725730",2010-07-27 07:04:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000226805","NOSE_000000226805",2009-05-14 10:24:08.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000309886","NOSE_000000309886",2009-04-29 19:33:12.0,",","NOSE",2,1,"en","P",1,5117,5117,"Good",,"1",4,1,2,3,1,0,2,2,0,0,"active" "000000952082","NOSE_000000952082",2009-05-14 10:52:56.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000606373","NOSE_000000606373",2009-05-14 10:53:21.0,",","NOSE",2,1,"de","P",1,5270,5270,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000126852","NOSE_000000126852",2010-02-18 07:04:04.0,",","NOSE",2,1,"fr","P",1,5202,5202,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000673114","NOSE_000000673114",2009-05-14 11:08:22.0,",","NOSE",2,1,"de","P",1,5216,5223,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000656642","NOSE_000000656642",2009-12-04 17:02:24.0,",","NOSE",2,1,"en","P",1,5361,5361,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000334312","NOSE_000000334312",2010-03-06 07:03:57.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000030383","NOSE_000000030383",2009-04-29 19:42:09.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000720770","NOSE_000000720770",2009-10-02 20:17:46.0,",","NOSE",,3,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000176309","NOSE_000000176309",2010-03-17 07:07:49.0,",","NOSE",2,1,"de","P",1,5209,5209,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000563125","NOSE_000000563125",2009-10-22 22:39:38.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000744049","NOSE_000000744049",2009-05-15 15:13:44.0,",","NOSE",2,1,"de","P",1,5380,5384,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000003626","NOSE_000000003626",2009-12-04 17:12:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000427922","NOSE_000000427922",2009-04-29 19:42:38.0,",","NOSE",2,1,"en","P",1,5427,5427,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000489040","NOSE_000000489040",2009-04-29 19:24:12.0,",","NOSE",2,1,"de","P",1,5147,5147,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000027766","NOSE_000000027766",2010-01-23 07:08:39.0,",","NOSE",2,1,"en","P",1,5196,5196,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000510782","NOSE_000000510782",2009-09-30 14:22:17.0,",","NOSE",2,1,"de","P",1,5242,5242,"Good",,,2,0,1,0,0,0,1,0,0,0,"active" "000000202936","NOSE_000000202936",2009-05-15 15:14:20.0,",","NOSE",2,1,"de","P",1,5341,5341,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000492732","NOSE_000000492732",2010-03-23 07:04:18.0,",","NOSE",2,1,"fr","P",1,5290,5290,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000703988","NOSE_000000703988",2009-11-21 20:07:17.0,",","NOSE",2,1,"fr","P",1,5179,5179,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000356189","NOSE_000000356189",2009-06-08 17:08:35.0,",","NOSE",2,1,"en","P",1,4698,5082,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000676721","NOSE_000000676721",2009-06-08 17:35:40.0,",","NOSE",2,1,"de","P",1,5541,5541,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000336403","NOSE_000000336403",2009-11-04 15:35:55.0,",","NOSE",2,1,"en","P",1,5363,5363,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000365851","NOSE_000000365851",2009-11-16 10:49:38.0,",","NOSE",,1,"de","P",1,,,,,,2,3,3,0,0,0,0,0,4,0,"active" "000000740719","NOSE_000000740719",2009-12-04 16:41:03.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000820878","NOSE_000000820878",2009-05-15 15:14:33.0,",","NOSE",2,1,"en","P",1,5450,5450,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000354825","NOSE_000000354825",2009-04-29 19:32:40.0,",","NOSE",2,1,"de","P",1,5414,5414,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000907309","NOSE_000000907309",2009-05-15 15:14:56.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000205857","NOSE_000000205857",2010-03-31 07:04:24.0,",","NOSE",2,1,"de","P",1,5395,5395,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000197065","NOSE_000000197065",2009-11-04 16:05:01.0,",","NOSE",2,1,"fr","P",1,5197,5197,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000797750","NOSE_000000797750",2009-11-23 10:15:37.0,",","NOSE",2,1,"en","P",1,5184,5184,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000991841","NOSE_000000991841",2009-04-29 19:34:40.0,",","NOSE",2,1,"en","P",1,5098,5098,"Good",,"1",4,1,1,1,0,0,1,1,0,4,"active" "000000565928","NOSE_000000565928",2009-04-29 19:23:49.0,",","NOSE",2,1,"de","P",1,5165,5165,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000609210","NOSE_000000609210",2009-06-08 17:54:23.0,",","NOSE",2,1,"fr","P",1,5436,5436,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000049211","NOSE_000000049211",2009-05-15 15:15:24.0,",","NOSE",1,1,"en","P",1,5193,5193,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000026015","NOSE_000000026015",2009-05-15 15:15:37.0,",","NOSE",2,2,"fr","P",1,5314,5314,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000523141","NOSE_000000523141",2009-12-04 16:47:12.0,",","NOSE",2,1,"en","P",1,5404,5404,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000476330","NOSE_000000476330",2009-07-31 19:24:30.0,",","NOSE",2,1,"fr","P",1,4945,4945,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000786751","NOSE_000000786751",2009-12-04 16:56:29.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000365092","NOSE_000000365092",2010-03-24 07:04:07.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,4,0,0,4,0,0,4,0,0,0,"active" "000000299153","NOSE_000000299153",2009-05-15 15:15:49.0,",","NOSE",2,1,"de","P",1,5288,5288,"Good",,,4,1,2,0,1,0,0,0,0,0,"active" "000000974139","NOSE_000000974139",2009-06-08 18:03:22.0,",","NOSE",2,1,"en","P",1,5064,5064,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000541984","NOSE_000000541984",2009-05-15 15:16:01.0,",","NOSE",2,1,"de","P",1,5468,5468,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000226195","NOSE_000000226195",2009-08-19 18:03:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000076819","NOSE_000000076819",2009-11-04 15:40:11.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000929561","NOSE_000000929561",2010-03-10 07:05:11.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000257070","NOSE_000000257070",2010-06-10 07:05:22.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000720987","NOSE_000000720987",2009-05-15 15:16:14.0,",","NOSE",2,,,,,,,"Missing",,,,,,,,,,,,,"active" "000000536106","NOSE_000000536106",2010-03-13 07:05:22.0,",","NOSE",2,1,"en","P",1,5484,5484,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000113643","NOSE_000000113643",2009-05-15 15:16:23.0,",","NOSE",2,1,"de","P",1,5239,5239,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000209243","NOSE_000000209243",2009-04-29 19:38:44.0,",","NOSE",2,1,"de","P",1,5082,5082,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000433804","NOSE_000000433804",2009-11-28 20:07:36.0,",","NOSE",2,1,"fr","P",1,5403,5403,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000139109","NOSE_000000139109",2009-10-22 22:46:25.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000000981","NOSE_000000000981",2009-12-04 16:47:20.0,",","NOSE",2,1,"en","P",1,5173,5173,"Good",,,3,1,1,0,0,0,0,0,2,0,"active" "000000424769","NOSE_000000424769",2009-04-29 19:25:23.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000369413","NOSE_000000369413",2009-11-26 20:19:36.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000427982","NOSE_000000427982",2009-05-15 15:16:58.0,",","NOSE",2,1,"en","P",1,5298,5298,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000189282","NOSE_000000189282",2010-07-26 07:04:57.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000431455","NOSE_000000431455",2010-04-10 07:04:15.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000437304","NOSE_000000437304",2009-10-16 21:17:38.0,",","NOSE",2,1,"de","P",1,5234,5234,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000415407","NOSE_000000415407",2009-05-15 15:17:10.0,",","NOSE",2,1,"en","P",1,5038,5038,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000294580","NOSE_000000294580",2009-06-08 18:30:15.0,",","NOSE",2,1,"de","P",1,5353,5353,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000980704","NOSE_000000980704",2010-06-30 07:05:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000661804","NOSE_000000661804",2009-07-31 19:55:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000760117","NOSE_000000760117",2009-04-29 19:30:59.0,",","NOSE",2,2,"en","P",1,5751,5751,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000736214","NOSE_000000736214",2009-04-29 19:41:58.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",4,1,1,2,0,0,0,1,0,0,"active" "000000797483","NOSE_000000797483",2009-05-15 15:17:45.0,",","NOSE",2,1,"en","P",1,5317,5317,"Good",,"1",3,1,2,0,0,0,1,0,0,0,"active" "000000863899","NOSE_000000863899",2010-03-26 07:04:06.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000676662","NOSE_000000676662",2009-06-08 18:57:44.0,",","NOSE",2,1,"de","P",1,5380,5380,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000304980","NOSE_000000304980",2009-08-24 20:40:28.0,",","NOSE",2,1,"fr","P",1,5103,5103,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000511085","NOSE_000000511085",2009-07-31 19:24:48.0,",","NOSE",2,2,"de","P",1,5144,5144,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000440625","NOSE_000000440625",2009-06-12 19:44:52.0,",","NOSE",2,1,"de","P",1,5191,5191,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000169931","NOSE_000000169931",2009-11-30 20:06:44.0,",","NOSE",2,1,"de","P",1,5141,5141,"Good",,,3,0,2,0,0,0,0,0,0,4,"active" "000000210314","NOSE_000000210314",2009-04-29 19:36:51.0,",","NOSE",2,2,"fr","P",1,5330,5330,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000920693","NOSE_000000920693",2009-06-08 21:44:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000578597","NOSE_000000578597",2009-12-04 16:47:10.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,,4,1,0,0,0,0,1,0,0,0,"active" "000000298424","NOSE_000000298424",2009-12-03 20:10:04.0,",","NOSE",2,1,"fr","P",1,4980,4980,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000611006","NOSE_000000611006",2010-05-05 07:06:04.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000465818","NOSE_000000465818",2010-07-22 07:05:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000518034","NOSE_000000518034",2010-06-10 07:07:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000770890","NOSE_000000770890",2009-10-10 20:28:57.0,",","NOSE",2,1,"en","P",1,5471,5471,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000919704","NOSE_000000919704",2009-09-11 10:02:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000259062","NOSE_000000259062",2009-07-31 19:56:15.0,",","NOSE",2,1,"de","P",1,5191,5191,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000164658","NOSE_000000164658",2010-06-06 07:05:30.0,",","NOSE",2,1,"en","P",1,5093,5093,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000199681","NOSE_000000199681",2009-06-08 22:11:08.0,",","NOSE",2,1,"en","P",1,5337,5337,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000280118","NOSE_000000280118",2009-12-04 16:41:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000112151","NOSE_000000112151",2010-07-21 07:06:35.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000989754","NOSE_000000989754",2009-05-15 15:18:08.0,",","NOSE",2,1,"de","P",1,5203,5203,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000896391","NOSE_000000896391",2009-10-01 21:45:05.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,4,0,3,1,0,0,1,1,0,0,"active" "000000846195","NOSE_000000846195",2009-04-29 19:26:32.0,",","NOSE",2,1,"de","P",1,5231,5231,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000811021","NOSE_000000811021",2009-04-29 19:42:12.0,",","NOSE",2,1,"fr","P",1,5699,5699,"Good",,"1",2,1,1,1,0,0,0,0,0,0,"active" "000000182892","NOSE_000000182892",2010-03-10 07:07:14.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000019977","NOSE_000000019977",2009-04-29 19:27:49.0,",","NOSE",2,1,"fr","P",1,5585,5585,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000700671","NOSE_000000700671",2009-05-15 15:18:54.0,",","NOSE",2,1,"de","P",1,5393,5393,"Good",,"9",4,0,1,0,0,0,0,0,0,0,"active" "000000552842","NOSE_000000552842",2009-04-29 19:31:36.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000257146","NOSE_000000257146",2009-07-31 18:59:27.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000235399","NOSE_000000235399",2009-12-04 16:53:36.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000542817","NOSE_000000542817",2009-07-15 15:17:08.0,",","NOSE",2,1,"fr","P",1,5219,5219,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000335973","NOSE_000000335973",2009-04-29 19:42:24.0,",","NOSE",2,1,"fr","P",1,5459,5459,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000254244","NOSE_000000254244",2009-05-15 15:19:29.0,",","NOSE",2,1,"en","P",1,5382,5382,"Doubtful","

wrong code used...

","1",0,-1,0,0,0,0,0,0,0,0,"active" "000000825869","NOSE_000000825869",2009-12-03 20:07:32.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000852830","NOSE_000000852830",2009-04-29 19:26:21.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000902317","NOSE_000000902317",2010-01-16 07:03:40.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000852280","NOSE_000000852280",2009-12-04 16:53:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000143059","NOSE_000000143059",2009-06-08 22:37:06.0,",","NOSE",2,1,"en","P",1,5300,5300,"Good",,"1",1,4,1,0,0,0,0,0,0,0,"active" "000000034059","NOSE_000000034059",2010-05-08 07:05:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,1,0,0,"active" "000000383722","NOSE_000000383722",2009-07-06 12:34:54.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,,4,0,1,0,0,0,0,0,2,0,"active" "000000453276","NOSE_000000453276",2009-05-15 15:19:49.0,",","NOSE",2,1,"de","P",1,5546,5327,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000051166","NOSE_000000051166",2010-04-20 07:05:41.0,",","NOSE",2,1,"fr","P",1,5109,5109,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000556292","NOSE_000000556292",2009-04-29 19:23:39.0,",","NOSE",2,1,"fr","P",1,5623,5623,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000843649","NOSE_000000843649",2009-05-15 15:20:13.0,",","NOSE",2,1,"de","P",1,5330,5330,"Good",,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000598632","NOSE_000000598632",2009-05-15 15:20:26.0,",","NOSE",2,1,"de","P",1,5243,5243,"Good",,"1",3,0,1,0,0,1,0,0,0,0,"active" "000000517167","NOSE_000000517167",2009-10-25 20:16:11.0,",","NOSE",,1,"en","P",1,,,,,,3,2,3,0,0,0,0,0,0,0,"active" "000000539042","NOSE_000000539042",2009-04-29 19:39:59.0,",","NOSE",2,1,"en","P",1,5456,5456,"Good",,"1",3,0,1,0,0,0,0,1,0,0,"active" "000000217321","NOSE_000000217321",2009-04-29 19:25:07.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000870725","NOSE_000000870725",2010-06-01 07:06:17.0,",","NOSE",2,1,"fr","P",1,4988,4988,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000907308","NOSE_000000907308",2009-06-29 15:41:30.0,",","NOSE",2,1,"de","P",1,5378,5378,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000332258","NOSE_000000332258",2009-05-15 15:21:00.0,",","NOSE",2,1,"de","P",1,5324,5331,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000087584","NOSE_000000087584",2009-05-15 15:21:13.0,",","NOSE",2,1,"de","P",1,5453,5453,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000091721","NOSE_000000091721",2009-12-30 20:03:30.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000142684","NOSE_000000142684",2009-08-21 21:12:17.0,",","NOSE",2,1,"fr","P",1,5491,5491,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000706781","NOSE_000000706781",2010-07-24 07:07:12.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000681644","NOSE_000000681644",2009-05-18 10:22:52.0,",","NOSE",2,1,"de","P",1,5180,5180,"Good",,"1",3,0,0,1,1,0,1,0,0,2,"active" "000000140146","NOSE_000000140146",2009-04-29 19:34:04.0,",","NOSE",2,1,"en","P",1,5205,5205,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000215314","NOSE_000000215314",2009-05-18 10:32:30.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000759560","NOSE_000000759560",2010-05-02 07:05:54.0,",","NOSE",2,1,"en","P",1,5160,5160,"Good",,,1,2,1,0,0,0,0,0,2,0,"active" "000000666893","NOSE_000000666893",2009-04-29 19:25:31.0,",","NOSE",2,1,"de","P",1,5389,5389,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000705802","NOSE_000000705802",2009-04-29 19:32:43.0,",","NOSE",2,1,"fr","P",1,5447,5447,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000420911","NOSE_000000420911",2010-01-23 07:08:52.0,",","NOSE",2,1,"fr","P",1,4918,4918,"Good",,,2,1,1,0,0,0,1,0,0,2,"active" "000000487930","NOSE_000000487930",2009-05-18 10:32:31.0,",","NOSE",2,1,"en","P",1,5315,5315,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000857462","NOSE_000000857462",2009-04-29 19:31:57.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000068720","NOSE_000000068720",2009-04-29 19:28:16.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000136384","NOSE_000000136384",2009-12-04 16:47:18.0,",","NOSE",2,1,"en","P",1,5225,5225,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000797705","NOSE_000000797705",2009-05-18 14:16:52.0,",","NOSE",2,1,"fr","P",1,5432,5432,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000305146","NOSE_000000305146",2009-05-18 10:32:33.0,",","NOSE",2,1,"fr","P",1,5255,5255,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000403276","NOSE_000000403276",2010-02-28 07:04:22.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000020924","NOSE_000000020924",2010-03-20 07:07:17.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000608618","NOSE_000000608618",2009-12-04 16:53:50.0,",","NOSE",,1,"de","P",1,,,,,,4,2,4,0,0,0,3,1,0,4,"active" "000000848814","NOSE_000000848814",2009-04-29 19:36:32.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000591191","NOSE_000000591191",2009-05-18 10:32:34.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000768202","NOSE_000000768202",2009-12-04 17:03:56.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000599061","NOSE_000000599061",2009-04-29 19:40:17.0,",","NOSE",2,1,"en","P",1,5318,5318,"Good",,"1",3,2,1,1,1,0,0,0,0,0,"active" "000000969551","NOSE_000000969551",2009-07-02 09:47:58.0,",","NOSE",2,1,"fr","P",1,5502,5502,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000436091","NOSE_000000436091",2009-04-29 19:33:56.0,",","NOSE",2,1,"en","P",1,5401,5401,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000426556","NOSE_000000426556",2009-12-04 17:01:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000411736","NOSE_000000411736",2009-04-29 19:41:31.0,",","NOSE",2,1,"fr","P",1,5119,5119,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000577283","NOSE_000000577283",2009-04-29 19:32:14.0,",","NOSE",2,1,"de","P",1,5160,5160,"Good",,"1",2,1,2,0,0,0,0,0,0,0,"active" "000000535021","NOSE_000000535021",2009-05-18 14:42:51.0,",","NOSE",2,1,"de","P",1,5193,5193,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000510768","NOSE_000000510768",2009-09-23 20:15:15.0,",","NOSE",2,1,"de","P",1,5161,5161,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000109919","NOSE_000000109919",2009-04-29 19:25:37.0,",","NOSE",2,1,"fr","P",1,5523,5523,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000161911","NOSE_000000161911",2009-04-29 19:26:18.0,",","NOSE",2,1,"en","P",1,5256,5256,"Good",,"1",4,2,3,0,0,0,0,0,0,4,"active" "000000243381","NOSE_000000243381",2009-04-29 19:41:09.0,",","NOSE",2,1,"de","P",1,5154,5154,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000416308","NOSE_000000416308",2009-10-04 20:32:34.0,",","NOSE",2,1,"en","P",1,5160,5164,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000148116","NOSE_000000148116",2009-08-19 18:39:05.0,",","NOSE",2,1,"de","P",1,5345,5345,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000461646","NOSE_000000461646",2009-10-25 21:03:50.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000785451","NOSE_000000785451",2010-04-08 07:04:09.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000472657","NOSE_000000472657",2009-10-01 20:07:50.0,",","NOSE",2,1,"en","P",1,5325,5325,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000810194","NOSE_000000810194",2009-12-04 17:03:38.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000581557","NOSE_000000581557",2010-04-11 07:32:39.0,",","NOSE",2,1,"de","P",1,5300,5300,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000788907","NOSE_000000788907",2010-01-28 07:03:23.0,",","NOSE",2,1,"de","P",1,5511,5511,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000105711","NOSE_000000105711",2009-07-15 15:21:15.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,,4,0,1,0,0,0,0,0,0,4,"active" "000000176651","NOSE_000000176651",2009-08-29 05:20:00.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000076409","NOSE_000000076409",2010-07-21 07:14:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000129748","NOSE_000000129748",2009-07-31 19:02:53.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000545473","NOSE_000000545473",2010-07-08 12:48:36.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000331932","NOSE_000000331932",2009-12-04 16:52:04.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000784572","NOSE_000000784572",2009-06-29 15:56:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000733427","NOSE_000000733427",2009-05-18 10:32:36.0,",","NOSE",2,1,"fr","P",1,5097,5097,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000021310","NOSE_000000021310",2009-06-08 23:09:22.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,,3,3,3,0,0,0,0,0,0,0,"active" "000000037823","NOSE_000000037823",2009-12-04 16:43:09.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000059066","NOSE_000000059066",2010-02-17 07:03:39.0,",","NOSE",2,1,"en","P",1,5262,5262,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000853164","NOSE_000000853164",2009-12-04 17:10:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000573517","NOSE_000000573517",2010-04-29 11:52:55.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,,1,4,1,0,0,0,0,0,0,2,"active" "000000941549","NOSE_000000941549",2009-05-18 10:32:37.0,",","NOSE",2,1,"de","P",1,5321,5323,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000884684","NOSE_000000884684",2009-06-08 23:37:15.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000243355","NOSE_000000243355",2009-04-29 19:37:03.0,",","NOSE",2,1,"en","P",1,5240,5240,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000428249","NOSE_000000428249",2009-04-29 19:26:43.0,",","NOSE",2,1,"fr","P",1,5216,5216,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000559717","NOSE_000000559717",2009-11-04 15:40:52.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000982129","NOSE_000000982129",2009-08-19 18:54:00.0,",","NOSE",2,1,"en","P",1,5340,5340,"Good",,,3,1,1,0,1,0,1,0,0,0,"active" "000000641013","NOSE_000000641013",2010-05-27 07:05:38.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,0,0,0,1,0,0,2,"active" "000000663818","NOSE_000000663818",2009-12-04 17:03:48.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,3,1,0,1,1,0,0,"active" "000000688037","NOSE_000000688037",2009-12-04 17:03:01.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000917421","NOSE_000000917421",2010-02-23 07:03:51.0,",","NOSE",2,1,"fr","P",1,5270,5270,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000117046","NOSE_000000117046",2009-04-29 19:33:59.0,",","NOSE",2,1,"en","P",1,5323,5323,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000800089","NOSE_000000800089",2009-07-31 19:03:34.0,",","NOSE",2,1,"en","P",1,4957,5341,"Good",,,4,0,0,0,1,0,1,0,0,0,"active" "000000202506","NOSE_000000202506",2009-05-18 10:32:39.0,",","NOSE",2,1,"fr","P",1,5169,5169,"Good",,"1",3,0,1,0,1,0,0,0,0,0,"active" "000000435062","NOSE_000000435062",2009-09-11 10:12:18.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000959634","NOSE_000000959634",2009-04-29 19:26:51.0,",","NOSE",2,1,"de","P",1,5035,5035,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000725052","NOSE_000000725052",2009-06-09 00:04:45.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",3,1,1,0,0,0,0,0,0,2,"active" "000000672480","NOSE_000000672480",2009-08-19 19:09:26.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000826982","NOSE_000000826982",2010-07-08 12:37:30.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000135907","NOSE_000000135907",2009-10-14 09:45:56.0,",","NOSE",2,1,"de","P",1,5499,5499,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000412003","NOSE_000000412003",2009-06-09 00:29:32.0,",","NOSE",2,1,"en","P",1,5190,5190,"At home",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000074649","NOSE_000000074649",2009-04-29 19:31:27.0,",","NOSE",2,1,"en","P",1,5102,5102,"Good",,"1",4,1,1,0,1,0,1,1,0,0,"active" "000000843459","NOSE_000000843459",2009-04-29 19:23:36.0,",","NOSE",2,1,"de","P",1,5348,5348,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000820270","NOSE_000000820270",2009-05-18 10:32:40.0,",","NOSE",2,1,"en","P",1,5092,5092,"Good",,"9",2,1,0,0,0,0,0,0,0,0,"active" "000000970985","NOSE_000000970985",2010-04-07 07:04:10.0,",","NOSE",,1,"de","P",1,5324,5324,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000493414","NOSE_000000493414",2009-07-31 19:25:34.0,",","NOSE",2,1,"de","P",1,5142,5142,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000300618","NOSE_000000300618",2009-05-18 10:32:41.0,",","NOSE",2,1,"de","P",1,5471,5261,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000651031","NOSE_000000651031",2009-10-18 20:15:25.0,",","NOSE",2,1,"de","P",1,5184,5184,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000133599","NOSE_000000133599",2009-05-18 10:32:43.0,",","NOSE",2,1,"fr","P",1,5312,5312,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000352137","NOSE_000000352137",2009-12-04 16:51:57.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000526812","NOSE_000000526812",2009-04-29 19:27:16.0,",","NOSE",2,1,"en","P",1,5345,5345,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000440850","NOSE_000000440850",2009-11-04 15:41:34.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000881902","NOSE_000000881902",2009-05-18 14:16:51.0,",","NOSE",2,1,"fr","P",1,5369,5369,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000245231","NOSE_000000245231",2010-07-27 07:10:59.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000500173","NOSE_000000500173",2009-12-14 12:53:14.0,",","NOSE",2,1,"en","P",1,5444,5444,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000161291","NOSE_000000161291",2009-07-31 19:03:57.0,",","NOSE",2,1,"de","P",1,-7,-7,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000258190","NOSE_000000258190",2009-12-04 17:03:53.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000059047","NOSE_000000059047",2009-08-31 14:59:59.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000012067","NOSE_000000012067",2009-04-29 19:39:24.0,",","NOSE",2,1,"en","P",1,5130,5130,"Good",,"1",1,1,0,0,0,0,0,0,2,0,"active" "000000783884","NOSE_000000783884",2010-06-05 07:05:20.0,",","NOSE",2,1,"en","P",1,5589,5589,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000908422","NOSE_000000908422",2009-05-18 10:32:44.0,",","NOSE",2,1,"de","P",1,5169,5189,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000321210","NOSE_000000321210",2009-06-09 01:24:23.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000801075","NOSE_000000801075",2009-04-29 19:37:39.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,"1",4,1,0,0,0,0,0,0,0,0,"active" "000000814596","NOSE_000000814596",2009-10-22 22:31:46.0,",","NOSE",2,1,"fr","P",1,5529,5529,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000262887","NOSE_000000262887",2009-05-18 10:32:46.0,",","NOSE",2,1,"fr","P",1,5188,5188,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000654571","NOSE_000000654571",2009-04-29 19:32:37.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000578333","NOSE_000000578333",2010-04-18 07:04:42.0,",","NOSE",2,1,"en","P",1,5479,5479,"Good",,,3,2,3,0,0,0,0,0,0,0,"active" "000000389139","NOSE_000000389139",2010-04-22 07:04:32.0,",","NOSE",2,1,"en","P",1,5196,5196,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000968486","NOSE_000000968486",2009-05-18 10:32:47.0,",","NOSE",2,1,"de","P",1,4991,4993,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000342468","NOSE_000000342468",2009-11-04 15:42:14.0,",","NOSE",2,1,"de","P",1,5348,5348,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000275515","NOSE_000000275515",2009-06-09 01:50:39.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,,4,0,3,3,3,0,3,2,0,4,"active" "000000009790","NOSE_000000009790",2009-11-04 15:36:02.0,",","NOSE",2,1,"en","P",1,5180,5180,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000289413","NOSE_000000289413",2009-06-09 02:16:48.0,",","NOSE",2,1,"en","P",1,5283,5283,"Good",,"1",4,1,2,0,0,0,0,0,0,0,"active" "000000641530","NOSE_000000641530",2009-04-29 19:35:54.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000080027","NOSE_000000080027",2009-07-31 19:41:13.0,",","NOSE",2,1,"de","P",1,5062,5062,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000785869","NOSE_000000785869",2009-06-09 02:43:37.0,",","NOSE",2,1,"de","P",1,5468,5468,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000942309","NOSE_000000942309",2009-11-16 10:49:49.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000232646","NOSE_000000232646",2009-04-29 19:30:44.0,",","NOSE",2,1,"de","P",1,5485,5485,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000814044","NOSE_000000814044",2009-04-29 19:26:04.0,",","NOSE",2,1,"en","P",1,5027,5027,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000586551","NOSE_000000586551",2009-05-18 10:32:48.0,",","NOSE",,1,"de","P",1,,,,,"9",2,1,3,3,4,3,3,0,0,0,"active" "000000993537","NOSE_000000993537",2010-02-15 07:03:29.0,",","NOSE",2,1,"de","P",1,5441,5441,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000743047","NOSE_000000743047",2009-12-04 17:02:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014905","NOSE_000000014905",2009-12-04 17:01:45.0,",","NOSE",2,1,"en","P",1,5094,5094,"Good",,,4,1,3,0,0,0,0,0,0,0,"active" "000000402477","NOSE_000000402477",2009-12-04 17:03:17.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000113294","NOSE_000000113294",2009-04-29 19:31:41.0,",","NOSE",2,1,"fr","P",1,5316,5316,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000000475","NOSE_000000000475",2010-06-21 12:30:51.0,",","NOSE",2,1,"en","P",1,5128,5128,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000129891","NOSE_000000129891",2009-06-09 03:06:52.0,",","NOSE",2,1,"en","P",1,4750,5134,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000443933","NOSE_000000443933",2009-04-29 19:20:55.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000067897","NOSE_000000067897",2009-10-14 10:13:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000138990","NOSE_000000138990",2009-09-01 10:33:58.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000512737","NOSE_000000512737",2009-04-29 19:30:32.0,",","NOSE",2,1,"de","P",1,5475,5475,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000479711","NOSE_000000479711",2009-04-29 19:19:29.0,",","NOSE",2,1,"en","P",1,5147,5147,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000988781","NOSE_000000988781",2009-08-20 06:00:24.0,",","NOSE",1,1,"en","P",1,5445,5445,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000009380","NOSE_000000009380",2010-07-21 07:05:27.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000999625","NOSE_000000999625",2009-06-09 03:34:33.0,",","NOSE",2,1,"de","P",1,5225,5225,"Good","

Due to language...

",,1,0,0,0,0,0,0,0,0,0,"active" "000000775080","NOSE_000000775080",2009-05-18 10:32:50.0,",","NOSE",2,1,"en","P",1,5274,5274,"Good",,"9",2,0,1,2,1,0,3,1,0,0,"active" "000000806119","NOSE_000000806119",2009-05-18 10:32:51.0,",","NOSE",2,1,"de","P",1,4940,4940,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000121887","NOSE_000000121887",2009-07-15 15:26:49.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000892214","NOSE_000000892214",2009-11-05 09:44:33.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000335680","NOSE_000000335680",2009-10-17 20:50:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000181864","NOSE_000000181864",2009-10-10 20:47:03.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000736546","NOSE_000000736546",2010-04-17 07:32:55.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000483749","NOSE_000000483749",2009-05-18 10:56:02.0,",","NOSE",2,,,,,,,"Missing","

Parent had to l...

",,,,,,,,,,,,"active" "000000326452","NOSE_000000326452",2009-07-31 19:04:41.0,",","NOSE",2,1,"fr","P",1,5587,5587,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000447729","NOSE_000000447729",2009-04-29 19:40:45.0,",","NOSE",2,1,"fr","P",1,5237,5237,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000281961","NOSE_000000281961",2009-06-29 16:26:01.0,",","NOSE",2,1,"de","P",1,5572,5572,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000959697","NOSE_000000959697",2009-08-31 15:07:18.0,",","NOSE",2,1,"de","P",1,5500,5500,"Good",,,2,1,2,0,0,0,0,0,0,0,"active" "000000309300","NOSE_000000309300",2009-07-02 09:49:13.0,",","NOSE",2,1,"fr","P",1,5362,5362,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000672728","NOSE_000000672728",2009-05-18 10:32:53.0,",","NOSE",2,1,"de","P",1,5193,5198,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000509349","NOSE_000000509349",2009-07-31 19:05:23.0,",","NOSE",2,1,"de","P",1,5452,5452,"Good",,,3,1,3,0,0,0,0,0,0,0,"active" "000000462875","NOSE_000000462875",2009-05-18 10:56:07.0,",","NOSE",2,1,"de","P",1,5649,5649,"Good",,"9",3,0,0,0,0,0,1,0,0,0,"active" "000000989196","NOSE_000000989196",2010-06-21 12:10:02.0,",","NOSE",,1,"en","P",1,5154,5154,,,,3,0,2,0,0,0,1,0,0,0,"active" "000000078832","NOSE_000000078832",2009-08-21 21:17:10.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,1,0,0,1,0,0,0,"active" "000000181144","NOSE_000000181144",2009-12-04 17:04:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000633251","NOSE_000000633251",2009-08-19 19:29:59.0,",","NOSE",2,1,"en","P",1,5036,5420,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000089666","NOSE_000000089666",2009-05-18 14:16:53.0,",","NOSE",2,1,"de","P",1,5169,5169,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000505818","NOSE_000000505818",2009-12-04 16:53:38.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000232928","NOSE_000000232928",2009-04-29 19:40:35.0,",","NOSE",2,1,"en","P",1,5283,5283,"Good",,"1",1,2,2,0,0,0,0,0,0,0,"active" "000000786287","NOSE_000000786287",2010-07-14 07:20:21.0,",","NOSE",,1,"de","P",1,5283,5283,,,,4,1,3,0,0,0,0,0,0,0,"active" "000000171032","NOSE_000000171032",2009-08-20 06:00:51.0,",","NOSE",2,1,"de","P",1,4872,4872,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000166494","NOSE_000000166494",2009-07-31 19:05:51.0,",","NOSE",2,1,"de","P",1,5318,5318,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000348034","NOSE_000000348034",2009-05-18 14:16:55.0,",","NOSE",2,1,"fr","P",1,5423,5423,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000695877","NOSE_000000695877",2009-04-29 19:37:13.0,",","NOSE",2,1,"fr","P",1,5439,5439,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000257406","NOSE_000000257406",2009-05-18 10:32:54.0,",","NOSE",2,1,"fr","P",1,5413,5413,"Good",,,4,0,0,0,0,0,4,0,0,0,"active" "000000386299","NOSE_000000386299",2010-07-08 12:49:48.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000897189","NOSE_000000897189",2010-06-17 07:04:59.0,",","NOSE",2,1,"fr","P",1,5269,5269,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000272766","NOSE_000000272766",2009-12-04 16:52:52.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000391651","NOSE_000000391651",2009-08-19 19:45:17.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000524159","NOSE_000000524159",2010-07-08 13:42:49.0,",","NOSE",1,1,"en","P",1,5211,5211,"Good","

drink craving o...

",,3,2,2,0,0,0,1,1,0,0,"active" "000000119593","NOSE_000000119593",2009-04-29 19:35:07.0,",","NOSE",2,1,"de","P",1,5207,5207,"Doubtful",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000295806","NOSE_000000295806",2009-12-04 17:01:01.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,2,0,2,2,0,0,"active" "000000086983","NOSE_000000086983",2009-12-04 17:02:43.0,",","NOSE",,1,"en","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000270659","NOSE_000000270659",2009-04-29 19:40:05.0,",","NOSE",2,1,"en","P",1,5047,5047,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000221399","NOSE_000000221399",2009-10-13 15:32:36.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000377022","NOSE_000000377022",2009-12-04 16:25:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000082063","NOSE_000000082063",2009-05-18 10:32:56.0,",","NOSE",2,1,"de","P",1,5719,5353,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000689513","NOSE_000000689513",2009-04-29 19:37:33.0,",","NOSE",2,1,"de","P",1,5118,5118,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000738517","NOSE_000000738517",2010-07-08 12:24:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000675752","NOSE_000000675752",2010-04-18 07:05:05.0,",","NOSE",,1,"de","P",1,5352,5352,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000656766","NOSE_000000656766",2009-11-22 20:06:45.0,",","NOSE",2,1,"en","P",1,5173,5173,"Good",,,4,0,1,1,1,0,1,0,0,2,"active" "000000380913","NOSE_000000380913",2009-06-09 03:40:57.0,",","NOSE",2,1,"en","P",1,4670,5054,"Good",,"1",4,0,1,1,1,1,1,0,0,0,"active" "000000278489","NOSE_000000278489",2010-03-26 07:04:12.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000972531","NOSE_000000972531",2010-01-14 11:51:13.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,,3,2,3,0,0,0,0,1,0,2,"active" "000000745063","NOSE_000000745063",2009-05-18 10:32:57.0,",","NOSE",2,1,"de","P",1,5353,5363,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000106125","NOSE_000000106125",2009-12-04 16:53:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000935618","NOSE_000000935618",2009-04-29 19:32:35.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000510272","NOSE_000000510272",2010-06-09 07:05:33.0,",","NOSE",,1,"de","P",1,,,,,,4,1,2,0,0,0,2,3,0,4,"active" "000000347499","NOSE_000000347499",2009-04-29 19:36:11.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000583142","NOSE_000000583142",2009-10-11 20:05:33.0,",","NOSE",2,1,"de","P",1,5450,5450,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000611484","NOSE_000000611484",2009-10-04 20:41:26.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000532202","NOSE_000000532202",2009-05-18 10:32:58.0,",","NOSE",2,1,"en","P",1,5105,5105,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000111692","NOSE_000000111692",2009-08-19 20:03:14.0,",","NOSE",2,1,"de","P",1,5441,5441,"Good",,,4,0,2,0,0,1,1,0,0,0,"active" "000000145651","NOSE_000000145651",2010-07-18 07:05:56.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000136409","NOSE_000000136409",2009-12-14 12:53:01.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,4,1,3,0,0,0,0,0,0,0,"active" "000000711829","NOSE_000000711829",2009-12-02 09:52:53.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000709215","NOSE_000000709215",2010-04-20 07:05:00.0,",","NOSE",2,1,"fr","P",1,4938,4938,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000540585","NOSE_000000540585",2009-04-29 19:42:21.0,",","NOSE",2,1,"fr","P",1,5458,5458,"Good",,"1",4,0,0,3,1,1,3,1,0,0,"active" "000000491206","NOSE_000000491206",2010-01-22 07:04:08.0,",","NOSE",2,1,"en","P",1,5157,5157,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000010322","NOSE_000000010322",2009-08-19 20:13:47.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000281202","NOSE_000000281202",2009-04-29 19:34:59.0,",","NOSE",2,1,"en","P",1,5084,5084,"Good",,"1",4,1,3,0,0,0,1,1,0,0,"active" "000000689676","NOSE_000000689676",2009-08-19 20:29:13.0,",","NOSE",2,1,"de","P",1,5407,5407,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000337029","NOSE_000000337029",2010-01-03 20:03:31.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000479341","NOSE_000000479341",2009-12-04 17:01:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000084743","NOSE_000000084743",2009-04-29 19:31:33.0,",","NOSE",2,1,"de","P",1,5340,5340,"Good",,"1",4,0,1,0,0,0,1,0,4,0,"active" "000000483513","NOSE_000000483513",2009-04-29 19:25:09.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",3,0,0,0,0,1,0,0,0,0,"active" "000000629369","NOSE_000000629369",2009-10-22 22:40:18.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000265044","NOSE_000000265044",2009-05-18 10:33:00.0,",","NOSE",2,1,"fr","P",1,5149,5149,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000707560","NOSE_000000707560",2010-04-11 07:09:03.0,",","NOSE",2,1,"fr","P",1,5086,5086,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000277421","NOSE_000000277421",2009-11-04 15:42:59.0,",","NOSE",2,1,"de","P",1,5162,5162,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000982695","NOSE_000000982695",2010-03-30 07:04:10.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000229742","NOSE_000000229742",2009-12-04 16:44:37.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000556488","NOSE_000000556488",2009-06-03 10:45:09.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,"1",4,0,1,0,0,0,1,1,0,0,"active" "000000309294","NOSE_000000309294",2010-01-14 11:53:06.0,",","NOSE",2,1,"de","P",1,5227,5227,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000232248","NOSE_000000232248",2010-06-21 12:18:21.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,0,0,0,0,2,0,0,"active" "000000250211","NOSE_000000250211",2010-03-03 07:04:37.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000552408","NOSE_000000552408",2009-12-04 16:51:28.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,1,0,0,0,"active" "000000174585","NOSE_000000174585",2009-11-12 10:01:10.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good",,,2,2,1,0,0,0,0,0,0,0,"active" "000000843977","NOSE_000000843977",2009-04-29 19:27:51.0,",","NOSE",2,1,"en","P",1,5227,5227,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000513900","NOSE_000000513900",2009-06-09 04:06:04.0,",","NOSE",2,2,"de","P",1,5131,5131,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000117198","NOSE_000000117198",2010-03-23 07:04:58.0,",","NOSE",2,2,"en","P",1,5355,5355,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000396866","NOSE_000000396866",2009-12-04 16:52:47.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000223789","NOSE_000000223789",2010-07-03 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000197189","NOSE_000000197189",2010-06-21 12:12:48.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,2,2,"active" "000000931032","NOSE_000000931032",2009-04-29 19:39:10.0,",","NOSE",2,1,"fr","P",1,5234,5234,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000514812","NOSE_000000514812",2009-12-04 16:48:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000153043","NOSE_000000153043",2009-05-18 10:33:01.0,",","NOSE",2,1,"en","P",1,5443,5443,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000965536","NOSE_000000965536",2009-04-29 19:35:45.0,",","NOSE",2,1,"en","P",1,5312,5312,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000524904","NOSE_000000524904",2010-03-01 07:03:44.0,",","NOSE",2,1,"en","P",1,5125,5125,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000938408","NOSE_000000938408",2009-06-09 04:33:42.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000701344","NOSE_000000701344",2009-06-09 05:01:04.0,",","NOSE",2,1,"en","P",1,5270,5270,"Good",,,3,0,1,0,0,0,0,0,2,0,"active" "000000444748","NOSE_000000444748",2009-04-29 19:38:25.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,"1",4,2,2,0,0,0,0,0,0,0,"active" "000000296316","NOSE_000000296316",2009-11-16 11:16:29.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000072207","NOSE_000000072207",2009-12-08 09:52:08.0,",","NOSE",2,1,"en","P",1,5165,5165,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000896138","NOSE_000000896138",2010-02-01 07:03:37.0,",","NOSE",2,1,"de","P",1,4817,4817,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000413303","NOSE_000000413303",2010-02-23 07:04:19.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000762585","NOSE_000000762585",2010-07-18 07:12:00.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000744347","NOSE_000000744347",2010-05-10 07:04:49.0,",","NOSE",2,1,"en","P",1,5411,5411,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000177959","NOSE_000000177959",2009-04-29 19:25:51.0,",","NOSE",2,1,"en","P",1,5328,5328,"Good",,"1",3,1,2,0,0,0,0,0,0,2,"active" "000000141936","NOSE_000000141936",2010-03-02 07:03:47.0,",","NOSE",2,1,"de","P",1,5237,5237,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000897866","NOSE_000000897866",2009-04-29 19:36:26.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,"1",3,4,3,0,0,0,0,1,0,0,"active" "000000897700","NOSE_000000897700",2010-03-05 07:04:17.0,",","NOSE",,1,"de","P",1,5469,5469,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000193933","NOSE_000000193933",2009-12-04 17:02:00.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000817712","NOSE_000000817712",2010-01-31 07:03:40.0,",","NOSE",2,1,"en","P",1,5247,5247,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000359626","NOSE_000000359626",2010-07-15 07:05:21.0,",","NOSE",,1,"en","P",1,,,,,,1,0,2,0,0,0,0,0,0,0,"active" "000000029000","NOSE_000000029000",2009-05-18 10:33:03.0,",","NOSE",2,1,"fr","P",1,5210,5210,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000850524","NOSE_000000850524",2009-09-22 23:08:13.0,",","NOSE",2,1,"de","P",1,5381,5381,"Good",,,2,0,0,0,0,0,0,0,2,0,"active" "000000518106","NOSE_000000518106",2009-04-29 19:36:08.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,"9",3,0,1,0,0,0,0,0,0,0,"active" "000000045204","NOSE_000000045204",2010-03-14 07:04:15.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000366867","NOSE_000000366867",2009-04-29 19:30:29.0,",","NOSE",2,1,"en","P",1,5158,5158,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000694051","NOSE_000000694051",2010-06-21 12:11:50.0,",","NOSE",2,1,"en","P",1,5119,5119,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000593721","NOSE_000000593721",2009-08-19 20:29:22.0,",","NOSE",2,1,"en","P",1,5351,5351,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000538838","NOSE_000000538838",2009-05-18 10:33:04.0,",","NOSE",2,1,"de","P",1,5450,5450,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000121154","NOSE_000000121154",2010-04-21 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000674988","NOSE_000000674988",2010-02-08 09:14:30.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000114562","NOSE_000000114562",2009-06-09 05:19:12.0,",","NOSE",2,1,"en","P",1,5069,5069,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000558692","NOSE_000000558692",2010-02-15 10:30:58.0,",","NOSE",2,1,"en","P",1,5138,5138,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000996959","NOSE_000000996959",2009-04-29 19:36:34.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000726649","NOSE_000000726649",2010-06-16 07:05:11.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,1,0,0,0,0,"active" "000000014697","NOSE_000000014697",2009-12-04 16:40:48.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000488719","NOSE_000000488719",2009-07-31 19:06:32.0,",","NOSE",2,1,"fr","P",1,5282,5282,"Good",,,1,1,2,0,0,0,0,0,0,0,"active" "000000241071","NOSE_000000241071",2010-06-02 07:05:07.0,",","NOSE",2,2,"en","P",1,5519,5519,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000669887","NOSE_000000669887",2009-04-29 19:34:13.0,",","NOSE",2,1,"en","P",1,5276,5276,"Good",,"1",3,0,1,0,0,0,0,0,2,0,"active" "000000939705","NOSE_000000939705",2009-06-29 16:28:42.0,",","NOSE",2,1,"fr","P",1,5103,5103,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000500755","NOSE_000000500755",2009-05-18 10:33:05.0,",","NOSE",2,1,"de","P",1,5000,5000,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000293149","NOSE_000000293149",2009-11-24 15:40:51.0,",","NOSE",2,1,"de","P",1,5419,5419,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000896283","NOSE_000000896283",2009-12-04 16:53:25.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000176749","NOSE_000000176749",2009-04-29 19:36:58.0,",","NOSE",2,1,"en","P",1,5027,5027,"Good",,"1",3,2,3,0,1,0,0,1,0,0,"active" "000000492327","NOSE_000000492327",2009-12-04 16:40:31.0,",","NOSE",2,1,"de","P",1,5112,5112,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000794436","NOSE_000000794436",2010-05-30 07:04:39.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000619195","NOSE_000000619195",2009-07-01 10:02:18.0,",","NOSE",2,1,"de","P",1,5372,5372,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000059100","NOSE_000000059100",2009-08-19 20:44:40.0,",","NOSE",2,1,"fr","P",1,5243,5243,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000461957","NOSE_000000461957",2009-06-29 16:56:17.0,",","NOSE",2,1,"en","P",1,5198,5198,"Good",,,3,0,2,0,0,0,1,0,0,0,"active" "000000781893","NOSE_000000781893",2010-05-13 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000391185","NOSE_000000391185",2009-04-29 19:36:46.0,",","NOSE",2,2,"en","P",1,5262,5500,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000183057","NOSE_000000183057",2009-06-29 17:25:32.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000120071","NOSE_000000120071",2009-07-02 09:50:45.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000292187","NOSE_000000292187",2009-12-01 20:06:49.0,",","NOSE",2,1,"en","P",1,5415,5415,"Good",,,3,1,1,1,0,0,0,0,0,4,"active" "000000589855","NOSE_000000589855",2009-12-04 16:52:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000808259","NOSE_000000808259",2009-05-18 10:33:07.0,",","NOSE",2,1,"de","P",1,5655,5434,"Good",,"9",1,1,1,0,0,0,0,0,0,0,"active" "000000526252","NOSE_000000526252",2009-06-09 05:45:39.0,",","NOSE",2,1,"de","P",1,5362,5362,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000102677","NOSE_000000102677",2009-05-18 10:33:08.0,",","NOSE",2,1,"en","P",1,5440,5440,"Good",,"9",3,2,2,0,1,0,2,1,0,0,"active" "000000530845","NOSE_000000530845",2009-12-04 16:58:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000078555","NOSE_000000078555",2009-05-18 10:33:10.0,",","NOSE",2,1,"de","P",1,5283,5283,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000585361","NOSE_000000585361",2009-04-29 19:36:29.0,",","NOSE",2,1,"de","P",1,5085,5085,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000937122","NOSE_000000937122",2009-05-18 10:33:11.0,",","NOSE",2,1,"en","P",1,5024,5024,"Good",,,3,0,1,0,0,0,1,1,0,0,"active" "000000338498","NOSE_000000338498",2009-05-18 10:33:13.0,",","NOSE",2,1,"de","P",1,5498,5146,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000698661","NOSE_000000698661",2010-01-16 07:05:06.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000076175","NOSE_000000076175",2009-05-18 10:33:14.0,",","NOSE",2,1,"de","P",1,5608,5256,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000977362","NOSE_000000977362",2009-04-29 19:38:19.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000278687","NOSE_000000278687",2009-05-18 10:33:15.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000167406","NOSE_000000167406",2009-04-29 19:25:56.0,",","NOSE",2,1,"en","P",1,5028,5028,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000252934","NOSE_000000252934",2009-06-09 06:12:22.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,"1",4,0,0,1,1,0,1,0,0,0,"active" "000000351972","NOSE_000000351972",2010-02-14 07:03:33.0,",","NOSE",,1,"de","P",1,,,,,,4,0,3,0,0,0,4,0,2,2,"active" "000000016885","NOSE_000000016885",2009-11-26 20:19:49.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000136575","NOSE_000000136575",2009-05-18 10:33:17.0,",","NOSE",2,1,"en","P",1,5345,5345,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000644076","NOSE_000000644076",2010-07-08 12:39:13.0,",","NOSE",2,1,"fr","P",1,5156,5156,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000768190","NOSE_000000768190",2009-04-29 19:35:16.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000941646","NOSE_000000941646",2009-05-18 10:56:06.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000841924","NOSE_000000841924",2009-05-18 10:56:55.0,",","NOSE",2,1,"de","P",1,5168,5170,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000957059","NOSE_000000957059",2009-05-18 10:33:18.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000283546","NOSE_000000283546",2010-03-30 07:04:55.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000872710","NOSE_000000872710",2010-04-29 11:35:53.0,",","NOSE",2,1,"en","P",1,5154,5154,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000698722","NOSE_000000698722",2009-05-18 10:33:20.0,",","NOSE",2,1,"de","P",1,5333,5333,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000553249","NOSE_000000553249",2009-05-18 10:33:21.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,"1",1,3,1,1,0,1,1,1,2,2,"active" "000000088750","NOSE_000000088750",2009-12-04 17:01:23.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,1,1,0,0,"active" "000000695858","NOSE_000000695858",2009-12-04 16:53:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000337501","NOSE_000000337501",2009-04-29 19:36:20.0,",","NOSE",2,1,"en","P",1,5471,5471,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000270525","NOSE_000000270525",2009-05-18 10:33:22.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,"9",4,0,0,0,0,0,0,0,0,0,"active" "000000759374","NOSE_000000759374",2009-12-04 17:03:20.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000683396","NOSE_000000683396",2009-04-29 19:38:52.0,",","NOSE",2,1,"de","P",1,5142,5142,"Good",,"1",2,0,0,0,0,0,0,0,2,0,"active" "000000726008","NOSE_000000726008",2010-02-26 07:03:46.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000309028","NOSE_000000309028",2009-04-29 19:24:09.0,",","NOSE",2,1,"en","P",1,5245,5245,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000211076","NOSE_000000211076",2009-05-18 10:33:24.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000245639","NOSE_000000245639",2009-04-29 19:19:10.0,",","NOSE",,1,"en","P",1,5198,5198,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000967938","NOSE_000000967938",2009-07-07 09:59:46.0,",","NOSE",2,1,"de","P",1,5209,5209,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000378915","NOSE_000000378915",2009-12-04 16:47:23.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000704638","NOSE_000000704638",2009-08-19 20:59:37.0,",","NOSE",2,1,"en","P",1,4967,5351,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000701902","NOSE_000000701902",2010-07-08 12:42:01.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000217056","NOSE_000000217056",2010-05-15 07:05:06.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000429504","NOSE_000000429504",2010-02-15 10:30:06.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,,2,2,1,1,0,0,0,0,0,0,"active" "000000490594","NOSE_000000490594",2010-07-11 07:05:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000576648","NOSE_000000576648",2009-12-04 16:51:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000204539","NOSE_000000204539",2009-08-19 21:14:48.0,",","NOSE",2,1,"en","P",1,5360,5360,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000215654","NOSE_000000215654",2009-06-03 10:45:00.0,",","NOSE",2,1,"en","P",1,5208,5208,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000270187","NOSE_000000270187",2009-12-04 17:02:54.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000187084","NOSE_000000187084",2009-12-04 16:49:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000978351","NOSE_000000978351",2010-04-01 07:05:50.0,",","NOSE",2,1,"de","P",1,5267,5267,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000697505","NOSE_000000697505",2009-04-29 19:39:16.0,",","NOSE",2,2,"de","P",1,5507,5933,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000535474","NOSE_000000535474",2009-06-09 06:56:19.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000534137","NOSE_000000534137",2009-04-29 19:26:12.0,",","NOSE",2,1,"en","P",1,5242,5242,"Good",,"1",4,1,0,0,0,0,0,0,0,0,"active" "000000065115","NOSE_000000065115",2009-12-04 17:01:55.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,1,0,0,"active" "000000013340","NOSE_000000013340",2009-05-18 10:33:25.0,",","NOSE",2,1,"fr","P",1,5414,5414,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000273740","NOSE_000000273740",2009-04-29 19:16:20.0,",","NOSE",2,1,"en","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000946077","NOSE_000000946077",2009-04-29 19:35:42.0,",","NOSE",2,1,"fr","P",1,5212,5212,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000369583","NOSE_000000369583",2009-04-29 19:35:51.0,",","NOSE",2,1,"en","P",1,5422,5422,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000794499","NOSE_000000794499",2009-07-06 13:22:26.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000330965","NOSE_000000330965",2010-04-17 07:05:19.0,",","NOSE",2,1,"en","P",1,5262,5262,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000951742","NOSE_000000951742",2009-06-09 07:01:06.0,",","NOSE",2,1,"de","P",1,5002,5002,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000086635","NOSE_000000086635",2009-05-18 10:33:26.0,",","NOSE",2,1,"de","P",1,5158,5158,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000170846","NOSE_000000170846",2009-11-04 15:43:40.0,",","NOSE",2,1,"en","P",1,5258,5258,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000754762","NOSE_000000754762",2009-05-18 10:33:28.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000102524","NOSE_000000102524",2009-04-29 19:30:12.0,",","NOSE",2,1,"de","P",1,5089,5089,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000700814","NOSE_000000700814",2010-06-28 07:04:56.0,",","NOSE",2,1,"fr","P",1,5443,5443,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000941730","NOSE_000000941730",2009-04-29 19:41:02.0,",","NOSE",2,1,"en","P",1,5409,5409,"Good",,"1",2,2,2,0,1,0,1,1,0,0,"active" "000000035923","NOSE_000000035923",2009-07-31 19:07:00.0,",","NOSE",1,1,"en","P",1,5027,5411,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000919361","NOSE_000000919361",2009-11-18 12:27:48.0,",","NOSE",2,1,"de","P",1,5418,5418,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000972759","NOSE_000000972759",2009-06-09 07:27:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000855711","NOSE_000000855711",2009-05-18 10:33:29.0,",","NOSE",2,1,"de","P",1,5172,5172,"Good",,"1",4,1,2,0,0,0,0,0,0,2,"active" "000000183588","NOSE_000000183588",2010-07-08 12:45:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000315365","NOSE_000000315365",2009-08-19 21:29:54.0,",","NOSE",2,1,"de","P",1,5180,5180,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000548576","NOSE_000000548576",2010-03-17 07:04:16.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000865077","NOSE_000000865077",2009-12-04 16:51:01.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,0,0,1,1,0,0,0,"active" "000000089717","NOSE_000000089717",2009-12-04 17:02:26.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000124238","NOSE_000000124238",2009-12-09 20:07:06.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000275300","NOSE_000000275300",2009-05-18 10:56:03.0,",","NOSE",2,1,"de","P",1,5655,5655,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000692350","NOSE_000000692350",2009-04-29 19:30:03.0,",","NOSE",2,1,"en","P",1,5382,5382,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000503064","NOSE_000000503064",2010-06-27 07:04:48.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000245506","NOSE_000000245506",2010-01-25 07:03:16.0,",","NOSE",2,1,"de","P",1,5226,5226,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000132628","NOSE_000000132628",2009-12-04 16:25:38.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000302329","NOSE_000000302329",2009-06-09 07:51:09.0,",","NOSE",2,1,"en","P",1,4952,5336,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000992664","NOSE_000000992664",2010-03-28 07:03:58.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000806367","NOSE_000000806367",2009-05-18 10:33:31.0,",","NOSE",2,1,"fr","P",1,5494,5494,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000155006","NOSE_000000155006",2009-04-29 19:25:01.0,",","NOSE",2,1,"en","P",1,5484,5484,"Good",,"9",3,0,0,0,0,0,1,0,0,0,"active" "000000503670","NOSE_000000503670",2009-09-30 15:26:29.0,",","NOSE",2,1,"en","P",1,4988,4988,"Good",,,4,1,3,0,0,0,1,0,0,0,"active" "000000290626","NOSE_000000290626",2010-03-12 07:03:57.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000294544","NOSE_000000294544",2010-02-27 07:03:54.0,",","NOSE",2,1,"en","P",1,5276,5276,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000883116","NOSE_000000883116",2009-04-29 19:34:07.0,",","NOSE",2,1,"en","P",1,5478,5478,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000122624","NOSE_000000122624",2010-06-01 07:05:33.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000561318","NOSE_000000561318",2009-05-18 10:33:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000975214","NOSE_000000975214",2009-04-29 19:37:36.0,",","NOSE",2,1,"en","P",1,5170,5170,"Good",,"1",4,0,1,1,1,0,1,1,0,0,"active" "000000884189","NOSE_000000884189",2009-04-29 19:38:16.0,",","NOSE",2,1,"de","P",1,5144,5144,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000390295","NOSE_000000390295",2009-07-31 19:07:23.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000642221","NOSE_000000642221",2009-05-18 10:33:33.0,",","NOSE",2,1,"de","P",1,5123,5123,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000006720","NOSE_000000006720",2009-05-18 10:33:35.0,",","NOSE",2,1,"de","P",1,5807,5450,"Good",,"1",2,3,3,0,0,0,1,1,0,0,"active" "000000808426","NOSE_000000808426",2009-05-18 14:17:05.0,",","NOSE",2,1,"en","P",1,5210,5210,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000474621","NOSE_000000474621",2009-04-29 19:32:08.0,",","NOSE",,1,"de","P",1,,,,,"9",3,1,3,1,2,0,2,1,0,2,"active" "000000658517","NOSE_000000658517",2009-06-29 18:12:56.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000995377","NOSE_000000995377",2009-04-29 19:32:14.0,",","NOSE",2,1,"en","P",1,5230,5230,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000447072","NOSE_000000447072",2009-08-19 21:42:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000416407","NOSE_000000416407",2009-12-04 16:52:54.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000119447","NOSE_000000119447",2010-05-26 07:06:44.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,2,"active" "000000476689","NOSE_000000476689",2009-12-04 16:46:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000097289","NOSE_000000097289",2009-04-29 19:33:19.0,",","NOSE",2,1,"de","P",1,4987,4987,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000888438","NOSE_000000888438",2009-04-29 19:29:36.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000923441","NOSE_000000923441",2010-03-18 07:08:00.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000425720","NOSE_000000425720",2009-04-29 19:35:20.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,"9",3,0,1,0,0,0,1,0,0,0,"active" "000000316454","NOSE_000000316454",2009-11-27 10:18:47.0,",","NOSE",2,1,"de","P",1,5259,5259,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000874903","NOSE_000000874903",2009-10-03 20:25:27.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000739373","NOSE_000000739373",2009-07-31 19:07:44.0,",","NOSE",2,1,"de","P",1,5253,5253,"Good",,,4,1,1,0,0,0,1,0,0,0,"active" "000000042282","NOSE_000000042282",2009-12-04 17:01:15.0,",","NOSE",,1,"en","P",1,,,,,,4,4,1,0,1,0,4,4,2,2,"active" "000000875019","NOSE_000000875019",2009-09-20 20:14:49.0,",","NOSE",2,1,"fr","P",1,5291,5291,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000984883","NOSE_000000984883",2010-07-08 12:40:27.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000200445","NOSE_000000200445",2009-04-29 19:36:25.0,",","NOSE",2,1,"fr","P",1,5481,5481,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000574304","NOSE_000000574304",2009-04-29 19:37:29.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000226321","NOSE_000000226321",2010-01-12 20:03:33.0,",","NOSE",2,1,"de","P",1,5421,5421,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000088640","NOSE_000000088640",2009-12-04 16:52:02.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000017103","NOSE_000000017103",2009-08-19 21:48:17.0,",","NOSE",2,1,"de","P",1,5418,5418,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000874563","NOSE_000000874563",2009-04-29 19:37:56.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000346343","NOSE_000000346343",2009-04-29 19:38:13.0,",","NOSE",2,1,"de","P",1,5048,5048,"Good",,"9",2,2,2,0,0,0,1,0,0,0,"active" "000000670072","NOSE_000000670072",2009-06-29 18:42:54.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000796062","NOSE_000000796062",2010-05-26 07:04:43.0,",","NOSE",2,2,"fr","P",1,5087,5087,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000122027","NOSE_000000122027",2009-04-29 19:28:38.0,",","NOSE",2,1,"de","P",1,4980,4980,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000375065","NOSE_000000375065",2009-04-29 19:41:48.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000049767","NOSE_000000049767",2009-04-29 19:33:24.0,",","NOSE",2,1,"en","P",1,5106,5106,"Good",,"1",4,2,2,2,0,0,1,0,0,4,"active" "000000567876","NOSE_000000567876",2009-12-04 17:00:06.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,2,0,"active" "000000588941","NOSE_000000588941",2009-11-20 14:06:42.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,,3,0,1,0,1,0,0,0,0,0,"active" "000000394741","NOSE_000000394741",2009-12-04 17:02:13.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000731022","NOSE_000000731022",2009-04-29 19:43:50.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,"1",3,0,1,0,0,0,0,0,2,0,"active" "000000597631","NOSE_000000597631",2009-07-06 13:51:19.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000055372","NOSE_000000055372",2009-04-29 19:24:17.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000983232","NOSE_000000983232",2009-09-25 00:03:15.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000965348","NOSE_000000965348",2009-04-29 19:45:51.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000446657","NOSE_000000446657",2010-05-19 07:05:14.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000466652","NOSE_000000466652",2009-08-19 22:03:50.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000364118","NOSE_000000364118",2009-04-29 19:40:42.0,",","NOSE",2,1,"en","P",1,5468,5468,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000470665","NOSE_000000470665",2010-04-29 11:53:28.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000528241","NOSE_000000528241",2010-04-08 07:08:56.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,,3,0,0,1,0,0,0,0,0,0,"active" "000000877464","NOSE_000000877464",2009-05-18 14:17:06.0,",","NOSE",2,1,"fr","P",1,5409,5409,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000346052","NOSE_000000346052",2009-04-29 19:29:14.0,",","NOSE",2,1,"de","P",1,5094,5094,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000761019","NOSE_000000761019",2009-09-27 01:10:14.0,",","NOSE",2,1,"de","P",1,5536,5536,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000725927","NOSE_000000725927",2009-04-29 19:48:39.0,",","NOSE",2,2,"en","P",1,5268,5268,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000012240","NOSE_000000012240",2009-06-03 10:42:35.0,",","NOSE",2,1,"en","P",1,5238,5238,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000235649","NOSE_000000235649",2009-11-10 20:58:21.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,1,1,0,0,"active" "000000045035","NOSE_000000045035",2010-06-08 07:06:42.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000765361","NOSE_000000765361",2010-01-30 07:03:24.0,",","NOSE",2,1,"en","P",1,5243,5243,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000764361","NOSE_000000764361",2009-04-29 19:49:41.0,",","NOSE",2,1,"de","P",1,5297,5297,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000051800","NOSE_000000051800",2009-09-04 04:49:04.0,",","NOSE",2,1,"de","P",1,5091,5091,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000965909","NOSE_000000965909",2009-04-29 19:24:20.0,",","NOSE",2,1,"de","P",1,5260,5260,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000546346","NOSE_000000546346",2009-04-29 19:26:35.0,",","NOSE",2,1,"en","P",1,5160,5160,"Good",,"1",3,1,0,1,1,0,1,1,0,2,"active" "000000076382","NOSE_000000076382",2009-04-29 19:26:45.0,",","NOSE",2,1,"en","P",1,5117,5117,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000376616","NOSE_000000376616",2009-12-04 17:01:13.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000005298","NOSE_000000005298",2009-04-29 19:54:00.0,",","NOSE",2,1,"de","P",1,5369,5369,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000250779","NOSE_000000250779",2010-07-13 07:06:21.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000653950","NOSE_000000653950",2010-06-21 12:04:02.0,",","NOSE",2,1,"en","P",1,5212,5212,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000751885","NOSE_000000751885",2009-04-29 19:55:06.0,",","NOSE",2,1,"de","P",1,5665,5665,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000671300","NOSE_000000671300",2009-04-29 19:56:12.0,",","NOSE",2,1,"en","P",1,5210,5210,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000447155","NOSE_000000447155",2009-04-29 19:40:52.0,",","NOSE",2,1,"fr","P",1,5624,5624,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000426804","NOSE_000000426804",2009-12-04 17:03:14.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000394349","NOSE_000000394349",2009-04-29 19:37:06.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000704694","NOSE_000000704694",2009-04-29 19:59:20.0,",","NOSE",2,1,"de","P",1,5580,5228,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000271697","NOSE_000000271697",2009-04-29 20:00:28.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000485794","NOSE_000000485794",2009-04-29 19:36:03.0,",","NOSE",2,1,"en","P",1,5331,5331,"At home",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000500158","NOSE_000000500158",2009-04-29 20:02:38.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000501791","NOSE_000000501791",2009-04-29 20:03:44.0,",","NOSE",2,1,"fr","P",1,4985,4985,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000252092","NOSE_000000252092",2009-11-29 20:06:42.0,",","NOSE",2,1,"en","P",1,5080,5080,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000954723","NOSE_000000954723",2009-10-26 20:43:51.0,",","NOSE",2,1,"fr","P",1,5412,5412,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000600124","NOSE_000000600124",2009-07-31 19:08:06.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000755699","NOSE_000000755699",2009-04-29 20:04:46.0,",","NOSE",2,1,"de","P",1,5549,5192,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000680763","NOSE_000000680763",2009-04-29 19:23:45.0,",","NOSE",2,1,"de","P",1,5356,5356,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000306854","NOSE_000000306854",2010-01-29 07:03:48.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000250445","NOSE_000000250445",2009-04-29 19:34:30.0,",","NOSE",2,1,"en","P",1,5439,5439,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000935121","NOSE_000000935121",2009-08-20 06:03:22.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000445437","NOSE_000000445437",2010-04-29 11:59:20.0,",","NOSE",,1,"de","P",1,1540,1540,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000710008","NOSE_000000710008",2009-08-19 22:19:26.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000728027","NOSE_000000728027",2009-04-29 19:26:54.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000206563","NOSE_000000206563",2009-04-29 20:08:14.0,",","NOSE",2,1,"de","P",1,4964,4964,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000812959","NOSE_000000812959",2010-02-15 10:30:29.0,",","NOSE",2,1,"en","P",1,5217,5217,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000060589","NOSE_000000060589",2009-09-05 22:41:17.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000848133","NOSE_000000848133",2009-11-18 12:28:22.0,",","NOSE",2,1,"de","P",1,5364,5364,"Good",,,2,1,2,1,0,0,0,0,0,0,"active" "000000797467","NOSE_000000797467",2009-07-31 19:08:22.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000428101","NOSE_000000428101",2010-02-09 07:06:10.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,,3,2,3,0,0,0,0,0,0,0,"active" "000000187223","NOSE_000000187223",2009-04-29 19:31:48.0,",","NOSE",2,1,"de","P",1,5248,5248,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000410419","NOSE_000000410419",2009-09-18 14:24:42.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000649709","NOSE_000000649709",2009-12-04 16:53:12.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000383991","NOSE_000000383991",2009-04-29 19:40:49.0,",","NOSE",2,1,"fr","P",1,5146,5146,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000115829","NOSE_000000115829",2009-04-29 20:11:36.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000439004","NOSE_000000439004",2009-04-29 20:11:57.0,",","NOSE",2,1,"de","P",1,5485,5498,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000472167","NOSE_000000472167",2009-12-04 16:52:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000863006","NOSE_000000863006",2009-04-29 20:13:03.0,",","NOSE",2,1,"de","P",1,5382,5382,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000736809","NOSE_000000736809",2009-04-29 20:14:08.0,",","NOSE",2,1,"en","P",1,5077,5077,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000947325","NOSE_000000947325",2009-04-29 20:15:12.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000109451","NOSE_000000109451",2009-04-29 19:25:40.0,",","NOSE",2,1,"de","P",1,4944,4944,"Good",,"1",2,1,2,0,0,0,0,0,0,0,"active" "000000583946","NOSE_000000583946",2009-12-04 16:53:18.0,",","NOSE",,1,"de","P",1,,,,,,4,1,4,0,0,0,1,0,0,4,"active" "000000990934","NOSE_000000990934",2009-04-29 19:24:58.0,",","NOSE",2,1,"fr","P",1,5189,5189,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000589967","NOSE_000000589967",2009-12-04 16:40:55.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,,2,1,2,1,0,0,0,0,0,0,"active" "000000934671","NOSE_000000934671",2009-04-29 20:18:02.0,",","NOSE",2,1,"de","P",1,5125,5126,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000710505","NOSE_000000710505",2010-02-14 07:10:10.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000942448","NOSE_000000942448",2010-06-11 07:05:17.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000316586","NOSE_000000316586",2009-06-09 08:51:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000526379","NOSE_000000526379",2009-04-29 19:35:57.0,",","NOSE",2,1,"en","P",1,5322,5322,"Good",,"1",4,1,1,0,0,0,1,0,0,0,"active" "000000727958","NOSE_000000727958",2010-04-16 07:05:10.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,1,0,0,0,"active" "000000669877","NOSE_000000669877",2009-04-29 20:20:18.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,"1",1,2,1,1,0,0,3,1,0,0,"active" "000000894157","NOSE_000000894157",2010-01-23 07:13:35.0,",","NOSE",2,1,"de","P",1,5124,5124,"Good",,,2,0,0,0,0,0,2,0,0,0,"active" "000000538990","NOSE_000000538990",2010-06-10 07:05:29.0,",","NOSE",2,1,"fr","P",1,5184,5184,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000660436","NOSE_000000660436",2009-11-04 15:44:03.0,",","NOSE",2,1,"fr","P",1,5174,5174,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000355022","NOSE_000000355022",2010-03-16 07:05:23.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000691591","NOSE_000000691591",2009-04-29 19:31:51.0,",","NOSE",2,1,"en","P",1,5104,5104,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000095190","NOSE_000000095190",2009-10-06 09:50:07.0,",","NOSE",2,1,"en","P",1,5118,5118,"Good",,,3,2,3,1,1,0,1,1,0,4,"active" "000000746816","NOSE_000000746816",2010-05-19 07:04:46.0,",","NOSE",2,1,"fr","P",1,5573,5573,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000985561","NOSE_000000985561",2009-04-29 20:22:35.0,",","NOSE",2,1,"de","P",1,4847,4847,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000992920","NOSE_000000992920",2009-09-30 15:51:34.0,",","NOSE",2,,,,,,,"Missing","

Test could not ...

",,,,,,,,,,,,"active" "000000488140","NOSE_000000488140",2009-06-09 10:22:46.0,",","NOSE",2,1,"en","P",1,5251,5251,"Good",,"1",4,1,2,2,1,0,2,2,0,4,"active" "000000703690","NOSE_000000703690",2009-08-20 06:04:00.0,",","NOSE",2,1,"de","P",1,5506,5506,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000505343","NOSE_000000505343",2009-06-12 20:37:01.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000823475","NOSE_000000823475",2009-04-29 20:23:45.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,1,0,0,1,1,0,0,"active" "000000523337","NOSE_000000523337",2009-04-29 19:41:29.0,",","NOSE",2,1,"en","P",1,5333,5333,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000260858","NOSE_000000260858",2009-04-29 20:26:11.0,",","NOSE",2,1,"de","P",1,5012,5012,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000048209","NOSE_000000048209",2010-04-14 07:04:33.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000880160","NOSE_000000880160",2009-09-29 22:42:04.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000417328","NOSE_000000417328",2009-04-29 20:27:11.0,",","NOSE",2,1,"de","P",1,5673,5452,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000410724","NOSE_000000410724",2009-04-29 20:28:19.0,",","NOSE",2,1,"fr","P",1,5200,5200,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000960611","NOSE_000000960611",2009-12-04 16:42:08.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000974777","NOSE_000000974777",2009-04-29 19:35:36.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000243964","NOSE_000000243964",2009-04-29 20:30:40.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000871045","NOSE_000000871045",2009-04-29 19:28:44.0,",","NOSE",2,1,"de","P",1,5160,5160,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000549249","NOSE_000000549249",2009-04-29 20:32:58.0,",","NOSE",2,1,"de","P",1,5109,5109,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000412042","NOSE_000000412042",2009-08-19 22:42:50.0,",","NOSE",2,1,"de","P",1,5343,5343,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000370078","NOSE_000000370078",2009-10-17 00:07:49.0,",","NOSE",2,1,"de","P",1,5261,5261,"Good",,,3,1,3,0,0,0,0,0,0,0,"active" "000000411433","NOSE_000000411433",2010-07-08 12:39:41.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000492938","NOSE_000000492938",2009-04-29 20:33:18.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000862534","NOSE_000000862534",2010-05-23 07:04:43.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000659590","NOSE_000000659590",2010-02-16 07:04:08.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000283504","NOSE_000000283504",2009-08-06 13:26:20.0,",","NOSE",2,1,"en","P",1,5103,5103,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000958625","NOSE_000000958625",2009-04-29 19:35:10.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018083","NOSE_000000018083",2009-04-29 19:32:58.0,",","NOSE",2,1,"de","P",1,5010,5010,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000372455","NOSE_000000372455",2009-04-29 19:30:50.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000191130","NOSE_000000191130",2009-04-29 19:37:30.0,",","NOSE",2,1,"en","P",1,5255,5255,"Good",,"1",3,2,1,0,0,0,1,4,0,4,"active" "000000197051","NOSE_000000197051",2009-07-15 15:49:08.0,",","NOSE",2,1,"de","P",1,5379,5379,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000164752","NOSE_000000164752",2009-09-21 23:07:41.0,",","NOSE",2,1,"fr","P",1,5291,5291,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000703567","NOSE_000000703567",2009-09-25 07:09:32.0,",","NOSE",2,1,"fr","P",1,5105,5105,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000130145","NOSE_000000130145",2010-07-08 12:37:41.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000570045","NOSE_000000570045",2010-02-22 07:04:59.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000235257","NOSE_000000235257",2009-04-29 19:21:01.0,",","NOSE",2,1,"en","P",1,5154,5154,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000078434","NOSE_000000078434",2009-04-29 20:40:05.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000442258","NOSE_000000442258",2009-12-01 20:06:46.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,,3,1,1,1,0,0,1,0,0,0,"active" "000000058468","NOSE_000000058468",2010-06-21 12:49:04.0,",","NOSE",,1,"en","P",1,5122,5122,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000785394","NOSE_000000785394",2009-09-08 23:59:34.0,",","NOSE",2,1,"de","P",1,5197,5197,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000734236","NOSE_000000734236",2010-06-07 07:06:09.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000816976","NOSE_000000816976",2009-12-04 17:01:21.0,",","NOSE",,1,"en","P",1,,,,,,1,1,0,2,0,0,0,0,0,0,"active" "000000927771","NOSE_000000927771",2009-12-01 20:06:43.0,",","NOSE",2,1,"en","P",1,5350,5350,"Good",,,1,2,0,0,0,0,0,0,0,0,"active" "000000795763","NOSE_000000795763",2009-12-28 20:03:31.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000512947","NOSE_000000512947",2009-04-29 20:41:16.0,",","NOSE",2,1,"de","P",1,5363,5363,"Good",,"9",4,0,1,0,0,0,0,0,0,2,"active" "000000799627","NOSE_000000799627",2009-06-12 21:29:32.0,",","NOSE",2,1,"fr","P",1,5032,5032,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000922855","NOSE_000000922855",2009-12-04 16:54:03.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000163588","NOSE_000000163588",2009-04-29 19:33:06.0,",","NOSE",2,1,"de","P",1,5279,5279,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000613122","NOSE_000000613122",2009-04-29 20:43:36.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000691682","NOSE_000000691682",2009-12-04 16:40:45.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,,2,0,2,0,0,0,0,0,0,0,"active" "000000984195","NOSE_000000984195",2009-04-29 19:41:43.0,",","NOSE",2,1,"fr","P",1,5207,5207,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000495808","NOSE_000000495808",2009-04-29 19:24:40.0,",","NOSE",2,1,"en","P",1,5422,5422,"Good","

ticked ^ wrong ...

","1",1,1,1,0,0,0,0,0,0,0,"active" "000000796435","NOSE_000000796435",2010-02-26 07:03:41.0,",","NOSE",2,1,"de","P",1,5534,5534,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000645112","NOSE_000000645112",2010-06-01 07:07:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000425503","NOSE_000000425503",2009-08-06 14:04:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000422113","NOSE_000000422113",2009-04-29 20:47:10.0,",","NOSE",2,1,"en","P",1,5177,5177,"Good","

sister found ou...

","0",1,2,1,0,0,0,0,1,0,0,"active" "000000808618","NOSE_000000808618",2009-12-03 20:07:29.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000599336","NOSE_000000599336",2009-04-29 19:36:55.0,",","NOSE",2,1,"fr","P",1,5123,5123,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000032130","NOSE_000000032130",2009-06-03 10:45:20.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,"1",3,2,2,0,1,0,1,0,0,0,"active" "000000111088","NOSE_000000111088",2009-04-29 20:48:52.0,",","NOSE",2,1,"de","P",1,5620,5268,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000215650","NOSE_000000215650",2009-11-10 21:12:12.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000882773","NOSE_000000882773",2010-07-08 12:41:47.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,1,0,0,0,0,0,0,"active" "000000070393","NOSE_000000070393",2009-04-29 19:23:42.0,",","NOSE",2,1,"de","P",1,5067,5067,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000655639","NOSE_000000655639",2009-12-04 16:57:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000001219","NOSE_000000001219",2010-07-27 07:05:53.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000410794","NOSE_000000410794",2009-06-12 22:25:21.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000667008","NOSE_000000667008",2009-12-04 17:08:28.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000368361","NOSE_000000368361",2009-07-01 10:49:13.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000777629","NOSE_000000777629",2009-04-29 20:51:21.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000980906","NOSE_000000980906",2009-04-29 20:52:30.0,",","NOSE",2,1,"de","P",1,5422,5422,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000636312","NOSE_000000636312",2009-10-17 00:34:52.0,",","NOSE",2,1,"de","P",1,5257,5257,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000498628","NOSE_000000498628",2010-04-16 07:09:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000643280","NOSE_000000643280",2010-02-22 07:03:50.0,",","NOSE",2,1,"en","P",1,5248,5248,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000919813","NOSE_000000919813",2010-07-08 12:37:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000464528","NOSE_000000464528",2009-09-06 21:02:13.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,,1,3,1,0,0,0,0,0,0,0,"active" "000000157957","NOSE_000000157957",2009-04-29 20:53:34.0,",","NOSE",2,1,"en","P",1,5383,5383,"Good",,"1",4,0,0,0,0,0,1,1,0,0,"active" "000000516231","NOSE_000000516231",2009-12-04 16:52:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000637537","NOSE_000000637537",2009-10-18 20:29:24.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000304151","NOSE_000000304151",2009-12-04 16:49:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000594850","NOSE_000000594850",2010-03-01 07:03:54.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,,4,1,1,1,0,0,0,3,0,0,"active" "000000301249","NOSE_000000301249",2009-04-29 20:53:54.0,",","NOSE",,1,"en","P",1,,,,,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000116300","NOSE_000000116300",2009-07-15 15:51:50.0,",","NOSE",2,1,"de","P",1,5099,5099,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000780046","NOSE_000000780046",2009-04-29 20:55:07.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000911793","NOSE_000000911793",2009-04-29 20:55:31.0,",","NOSE",2,1,"fr","P",1,5323,5323,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000683947","NOSE_000000683947",2009-04-29 19:38:10.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,"1",3,1,1,0,0,0,0,1,0,0,"active" "000000647990","NOSE_000000647990",2009-09-02 23:49:50.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000929235","NOSE_000000929235",2009-12-04 16:55:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000004017","NOSE_000000004017",2009-06-03 10:44:52.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000147629","NOSE_000000147629",2009-04-29 19:34:35.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000066509","NOSE_000000066509",2009-04-29 19:25:34.0,",","NOSE",2,1,"en","P",1,5233,5233,"Good",,"1",3,2,2,0,0,0,1,0,0,0,"active" "000000503700","NOSE_000000503700",2009-04-29 19:30:26.0,",","NOSE",2,1,"en","P",1,5423,5423,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000387014","NOSE_000000387014",2009-12-04 17:02:08.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000295121","NOSE_000000295121",2009-04-29 21:01:42.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000331379","NOSE_000000331379",2009-12-04 16:46:12.0,",","NOSE",2,1,"en","P",1,4718,5102,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000735365","NOSE_000000735365",2009-12-04 16:46:14.0,",","NOSE",2,1,"en","P",1,5067,5067,"Good",,,4,1,2,1,0,0,1,1,0,0,"active" "000000296154","NOSE_000000296154",2009-11-16 11:16:58.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000983254","NOSE_000000983254",2009-04-29 21:01:46.0,",","NOSE",2,1,"de","P",1,5732,5380,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000122365","NOSE_000000122365",2009-09-17 10:07:59.0,",","NOSE",2,1,"en","P",1,5372,5372,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000180679","NOSE_000000180679",2009-07-15 15:52:57.0,",","NOSE",2,1,"de","P",1,5272,5272,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000848117","NOSE_000000848117",2010-05-20 07:05:54.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000094581","NOSE_000000094581",2009-04-29 21:03:00.0,",","NOSE",2,1,"de","P",1,5792,5426,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000935461","NOSE_000000935461",2009-12-04 17:02:34.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000819313","NOSE_000000819313",2009-04-29 19:24:03.0,",","NOSE",2,1,"de","P",1,5235,5235,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000719755","NOSE_000000719755",2009-12-04 16:50:46.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000230637","NOSE_000000230637",2009-04-29 19:27:46.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000306935","NOSE_000000306935",2010-05-16 07:05:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000344282","NOSE_000000344282",2009-09-18 14:47:37.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000534184","NOSE_000000534184",2009-04-29 19:26:37.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000859284","NOSE_000000859284",2009-04-29 21:07:54.0,",","NOSE",,1,"en","P",1,,,,,"9",3,1,1,0,0,0,0,1,0,0,"active" "000000247745","NOSE_000000247745",2009-04-29 21:08:56.0,",","NOSE",2,1,"en","P",1,5257,5257,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000089418","NOSE_000000089418",2009-04-29 19:34:46.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000658593","NOSE_000000658593",2009-04-29 21:11:20.0,",","NOSE",,1,"en","P",1,5330,5331,,,"9",4,1,3,2,0,0,3,1,2,2,"active" "000000337970","NOSE_000000337970",2010-02-08 09:14:06.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000940202","NOSE_000000940202",2010-03-16 07:15:42.0,",","NOSE",2,1,"de","P",1,5108,5108,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000215766","NOSE_000000215766",2009-04-29 19:24:34.0,",","NOSE",2,1,"de","P",1,5080,5080,"Next visit",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000728784","NOSE_000000728784",2009-04-29 19:34:01.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000920365","NOSE_000000920365",2009-04-29 19:29:11.0,",","NOSE",2,1,"en","P",1,5317,5317,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000084939","NOSE_000000084939",2010-07-14 07:15:13.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,1,0,0,0,"active" "000000118145","NOSE_000000118145",2010-07-08 12:52:40.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000021641","NOSE_000000021641",2009-04-29 21:16:13.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000041936","NOSE_000000041936",2009-04-29 21:17:30.0,",","NOSE",2,1,"de","P",1,5383,5383,"Good",,"9",2,2,2,0,0,0,0,0,0,0,"active" "000000742556","NOSE_000000742556",2009-04-29 21:18:50.0,",","NOSE",2,1,"en","P",1,5141,5141,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000282199","NOSE_000000282199",2009-08-19 23:11:36.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000963726","NOSE_000000963726",2009-10-22 16:22:28.0,",","NOSE",2,1,"en","P",1,5267,5267,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000602014","NOSE_000000602014",2009-04-29 21:20:11.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,"1",4,2,4,0,0,0,3,0,0,4,"active" "000000165018","NOSE_000000165018",2009-04-29 21:21:27.0,",","NOSE",2,1,"de","P",1,5178,5178,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000626736","NOSE_000000626736",2010-07-08 12:24:16.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000578820","NOSE_000000578820",2009-04-29 19:29:16.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000409499","NOSE_000000409499",2010-01-25 07:03:58.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000194410","NOSE_000000194410",2009-09-20 20:14:54.0,",","NOSE",2,1,"en","P",1,5111,5495,"Good",,,3,1,1,0,0,0,1,1,0,0,"active" "000000628886","NOSE_000000628886",2009-04-29 21:23:26.0,",","NOSE",2,1,"en","P",1,5232,5232,"Good",,"1",2,2,1,0,0,0,0,0,0,0,"active" "000000302447","NOSE_000000302447",2009-04-29 21:23:48.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000970880","NOSE_000000970880",2009-12-20 20:03:19.0,",","NOSE",2,1,"fr","P",1,5177,5177,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000196685","NOSE_000000196685",2009-07-06 14:06:22.0,",","NOSE",2,1,"en","P",1,5412,5412,"Good",,,4,1,3,0,0,0,0,1,0,0,"active" "000000728887","NOSE_000000728887",2009-04-29 21:25:06.0,",","NOSE",2,1,"en","P",1,5269,5269,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000542662","NOSE_000000542662",2009-07-31 19:09:16.0,",","NOSE",2,1,"de","P",1,5466,5466,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000600809","NOSE_000000600809",2009-07-31 19:09:32.0,",","NOSE",2,1,"en","P",1,5311,5311,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000063996","NOSE_000000063996",2009-04-29 21:26:17.0,",","NOSE",2,1,"de","P",1,5572,5572,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000002539","NOSE_000000002539",2009-04-29 21:27:30.0,",","NOSE",2,1,"de","P",1,5073,5073,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000326363","NOSE_000000326363",2010-07-08 12:39:59.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000285723","NOSE_000000285723",2009-04-29 19:35:13.0,",","NOSE",2,1,"en","P",1,5178,5178,"Good",,"1",4,1,1,0,0,0,0,0,0,4,"active" "000000792849","NOSE_000000792849",2009-11-04 15:44:44.0,",","NOSE",2,1,"en","P",1,5447,5447,"Good",,,3,1,1,0,0,0,0,1,0,2,"active" "000000454794","NOSE_000000454794",2010-03-21 07:04:00.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000420900","NOSE_000000420900",2009-10-17 00:37:42.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000583975","NOSE_000000583975",2009-04-29 21:29:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000016908","NOSE_000000016908",2009-09-23 20:14:51.0,",","NOSE",2,1,"de","P",1,5387,5387,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000637993","NOSE_000000637993",2009-04-29 21:29:09.0,",","NOSE",2,1,"de","P",1,5826,5474,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000764935","NOSE_000000764935",2010-06-21 12:22:59.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000724881","NOSE_000000724881",2009-05-18 14:16:56.0,",","NOSE",2,1,"en","P",1,4703,5087,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000057534","NOSE_000000057534",2009-04-29 21:30:29.0,",","NOSE",2,1,"de","P",1,5387,5387,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000809420","NOSE_000000809420",2010-04-09 07:04:41.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000159176","NOSE_000000159176",2009-11-04 15:45:05.0,",","NOSE",2,1,"fr","P",1,5143,5143,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000118994","NOSE_000000118994",2010-01-19 07:03:43.0,",","NOSE",2,1,"en","P",1,5152,5152,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000058490","NOSE_000000058490",2009-07-31 19:09:53.0,",","NOSE",2,1,"en","P",1,4854,5238,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000828658","NOSE_000000828658",2009-08-19 23:35:23.0,",","NOSE",2,2,"en","P",1,5145,5145,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000794132","NOSE_000000794132",2009-09-27 00:04:21.0,",","NOSE",2,1,"fr","P",1,5645,5645,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000080185","NOSE_000000080185",2009-04-29 21:31:49.0,",","NOSE",2,1,"de","P",1,5110,5110,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000997120","NOSE_000000997120",2009-08-19 23:52:02.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,2,0,0,0,1,0,0,0,0,0,"active" "000000216955","NOSE_000000216955",2009-04-29 19:31:16.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000982261","NOSE_000000982261",2009-04-29 19:24:47.0,",","NOSE",3,1,"en","P",1,5269,5269,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000110479","NOSE_000000110479",2009-08-20 00:07:10.0,",","NOSE",2,1,"en","P",1,5364,5364,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000220604","NOSE_000000220604",2009-04-29 19:42:03.0,",","NOSE",2,1,"en","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000468005","NOSE_000000468005",2009-12-04 10:23:49.0,",","NOSE",2,1,"en","P",1,5532,5532,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000627628","NOSE_000000627628",2009-11-05 10:00:46.0,",","NOSE",2,1,"fr","P",1,5111,5111,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000414062","NOSE_000000414062",2010-07-22 07:13:56.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000864704","NOSE_000000864704",2009-12-04 16:53:44.0,",","NOSE",,1,"de","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000678195","NOSE_000000678195",2010-04-11 07:31:45.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000114515","NOSE_000000114515",2009-12-04 17:02:06.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000237432","NOSE_000000237432",2009-04-29 21:36:48.0,",","NOSE",2,1,"de","P",1,4987,4987,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000296273","NOSE_000000296273",2009-12-04 16:53:41.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,1,0,0,0,"active" "000000015991","NOSE_000000015991",2009-08-20 00:22:34.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000107821","NOSE_000000107821",2009-04-29 21:38:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000294282","NOSE_000000294282",2009-04-29 19:23:30.0,",","NOSE",2,1,"de","P",1,5176,5176,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000252044","NOSE_000000252044",2009-12-04 16:52:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000843877","NOSE_000000843877",2009-10-22 16:25:33.0,",","NOSE",2,1,"en","P",1,-20,-20,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000815764","NOSE_000000815764",2010-04-01 07:03:56.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,,4,1,2,2,0,0,1,1,0,0,"active" "000000412581","NOSE_000000412581",2009-04-29 19:25:04.0,",","NOSE",2,1,"de","P",1,4774,4774,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000307769","NOSE_000000307769",2010-04-04 07:03:58.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000199436","NOSE_000000199436",2009-04-29 19:29:08.0,",","NOSE",2,1,"de","P",1,5302,5302,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000633012","NOSE_000000633012",2009-10-09 20:54:37.0,",","NOSE",1,1,"en","P",1,5496,5496,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000704063","NOSE_000000704063",2010-07-24 07:06:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000325790","NOSE_000000325790",2009-04-29 21:43:02.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000213834","NOSE_000000213834",2009-07-08 10:01:09.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000834745","NOSE_000000834745",2010-07-08 12:47:17.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,2,"active" "000000809519","NOSE_000000809519",2009-09-15 20:04:39.0,",","NOSE",2,1,"de","P",1,5314,5314,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000097780","NOSE_000000097780",2009-04-29 21:44:15.0,",","NOSE",1,1,"en","P",1,5469,5469,"Good",,"9",3,1,1,0,1,0,0,0,0,0,"active" "000000148214","NOSE_000000148214",2009-04-29 19:37:59.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",4,0,2,0,0,0,1,1,0,4,"active" "000000604818","NOSE_000000604818",2009-04-29 19:40:02.0,",","NOSE",2,1,"en","P",1,5423,5423,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000088630","NOSE_000000088630",2009-06-13 00:18:14.0,",","NOSE",2,1,"de","P",1,5135,5135,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000552826","NOSE_000000552826",2009-04-29 21:47:59.0,",","NOSE",2,1,"en","P",1,5286,5286,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000903615","NOSE_000000903615",2009-04-29 19:33:15.0,",","NOSE",2,1,"fr","P",1,5722,5722,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000970411","NOSE_000000970411",2009-04-29 19:25:59.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000701794","NOSE_000000701794",2009-07-31 19:10:13.0,",","NOSE",2,1,"en","P",1,5201,5201,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000626253","NOSE_000000626253",2009-06-13 00:45:49.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000720401","NOSE_000000720401",2009-08-20 00:34:57.0,",","NOSE",2,1,"de","P",1,5323,5323,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000053401","NOSE_000000053401",2010-07-18 07:05:34.0,",","NOSE",,1,"en","P",1,,,,,,1,4,1,0,0,0,0,0,0,0,"active" "000000978923","NOSE_000000978923",2009-04-29 19:28:22.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000734029","NOSE_000000734029",2009-12-04 16:24:37.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000078302","NOSE_000000078302",2009-04-29 21:53:01.0,",","NOSE",2,1,"en","P",1,5452,5452,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000411129","NOSE_000000411129",2010-02-23 07:03:41.0,",","NOSE",2,1,"de","P",1,5244,5246,"Good",,,2,0,0,0,0,0,0,0,2,0,"active" "000000600438","NOSE_000000600438",2010-07-08 12:24:29.0,",","NOSE",,2,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000019393","NOSE_000000019393",2010-04-16 07:05:45.0,",","NOSE",2,1,"fr","P",1,5465,5465,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000850748","NOSE_000000850748",2009-07-31 19:28:48.0,",","NOSE",2,1,"de","P",1,5409,5409,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000407098","NOSE_000000407098",2009-05-18 14:16:58.0,",","NOSE",2,1,"de","P",1,5454,5454,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000470040","NOSE_000000470040",2009-04-29 19:24:06.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000000159","NOSE_000000000159",2009-04-29 21:55:31.0,",","NOSE",2,1,"de","P",1,5255,5255,"Good",,"1",2,3,2,0,0,0,0,0,0,0,"active" "000000941671","NOSE_000000941671",2009-05-18 14:16:59.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000736098","NOSE_000000736098",2009-12-04 17:07:55.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000025486","NOSE_000000025486",2009-04-29 19:26:59.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,"1",4,2,1,0,0,0,0,0,0,0,"active" "000000195153","NOSE_000000195153",2010-02-17 07:04:06.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000322216","NOSE_000000322216",2009-04-29 19:34:53.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000354697","NOSE_000000354697",2009-11-27 10:18:13.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000354742","NOSE_000000354742",2010-06-21 12:09:28.0,",","NOSE",,1,"en","P",1,5143,5143,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000972606","NOSE_000000972606",2009-09-17 10:08:13.0,",","NOSE",2,1,"de","P",1,5355,5355,"Doubtful","

The mother had ...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000777805","NOSE_000000777805",2009-04-29 19:31:13.0,",","NOSE",2,1,"de","P",1,5218,5218,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000542640","NOSE_000000542640",2010-03-30 07:04:25.0,",","NOSE",2,1,"en","P",1,5195,5195,"Good",,,3,0,3,0,0,0,0,1,0,0,"active" "000000544089","NOSE_000000544089",2009-10-22 16:36:26.0,",","NOSE",2,1,"de","P",1,5207,5207,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000358791","NOSE_000000358791",2010-04-12 07:08:50.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000097187","NOSE_000000097187",2010-04-30 07:04:59.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000307567","NOSE_000000307567",2009-04-29 22:00:34.0,",","NOSE",,1,"en","P",1,,,,,"9",4,1,3,0,0,0,0,0,0,0,"active" "000000387005","NOSE_000000387005",2009-04-29 19:24:31.0,",","NOSE",2,1,"en","P",1,5442,5442,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000719786","NOSE_000000719786",2009-04-29 19:32:08.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000418754","NOSE_000000418754",2009-10-19 20:31:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000183044","NOSE_000000183044",2009-09-09 22:19:13.0,",","NOSE",2,1,"de","P",1,-21,-21,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000123947","NOSE_000000123947",2009-12-04 17:01:04.0,",","NOSE",2,1,"en","P",1,5219,5219,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000719499","NOSE_000000719499",2009-06-13 01:36:49.0,",","NOSE",2,1,"en","P",1,5074,5074,"Good",,,4,1,1,0,0,0,0,0,0,4,"active" "000000360233","NOSE_000000360233",2009-04-29 22:04:25.0,",","NOSE",2,1,"en","P",1,5067,5067,"Good",,"1",3,1,2,1,1,0,1,1,0,0,"active" "000000625140","NOSE_000000625140",2010-02-15 07:03:36.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000059128","NOSE_000000059128",2009-08-20 01:13:52.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000450042","NOSE_000000450042",2009-12-14 12:53:09.0,",","NOSE",2,1,"de","P",1,5488,5488,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000153918","NOSE_000000153918",2010-02-16 07:06:33.0,",","NOSE",2,1,"de","P",1,5118,5118,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000362940","NOSE_000000362940",2009-12-04 16:46:25.0,",","NOSE",2,2,"en","P",1,5444,5444,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000599788","NOSE_000000599788",2009-07-31 19:10:36.0,",","NOSE",2,1,"fr","P",1,5054,5054,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000900804","NOSE_000000900804",2010-04-29 11:56:52.0,",","NOSE",,1,"en","P",1,,,,,,1,4,1,1,1,1,1,1,2,4,"active" "000000450286","NOSE_000000450286",2009-06-13 02:19:33.0,",","NOSE",2,1,"de","P",1,5564,5564,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000910786","NOSE_000000910786",2009-04-29 19:25:53.0,",","NOSE",2,1,"de","P",1,5240,5240,"Good",,"1",4,0,0,0,0,0,0,0,2,0,"active" "000000492008","NOSE_000000492008",2009-04-29 19:29:06.0,",","NOSE",2,1,"en","P",1,5387,5387,"Good",,"1",2,1,1,0,0,0,1,1,0,0,"active" "000000894732","NOSE_000000894732",2009-04-29 19:19:21.0,",","NOSE",2,1,"de","P",1,5264,5264,"Good",,"1",4,0,0,0,0,0,2,0,0,4,"active" "000000686546","NOSE_000000686546",2009-04-29 22:08:23.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000296614","NOSE_000000296614",2009-04-29 22:09:13.0,",","NOSE",2,1,"de","P",1,5451,5451,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000757042","NOSE_000000757042",2009-06-13 02:46:20.0,",","NOSE",2,1,"de","P",1,5343,5343,"Good",,,1,1,1,0,0,0,0,0,2,2,"active" "000000343168","NOSE_000000343168",2009-11-04 15:45:46.0,",","NOSE",2,1,"fr","P",1,5370,5370,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000497349","NOSE_000000497349",2009-11-18 12:28:18.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000056574","NOSE_000000056574",2009-04-29 19:28:35.0,",","NOSE",2,1,"en","P",1,5286,5286,"Good",,"1",2,1,2,1,0,0,2,1,0,4,"active" "000000424162","NOSE_000000424162",2009-11-27 10:18:28.0,",","NOSE",2,1,"en","P",1,5139,5139,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000366464","NOSE_000000366464",2009-04-29 22:11:50.0,",","NOSE",2,1,"en","P",1,5285,5285,"Good",,"1",4,1,3,1,1,0,1,1,0,0,"active" "000000312469","NOSE_000000312469",2009-07-31 19:10:53.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000036348","NOSE_000000036348",2009-12-04 16:53:55.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,1,0,0,0,"active" "000000178651","NOSE_000000178651",2009-05-18 14:17:03.0,",","NOSE",2,1,"en","P",1,5090,5090,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000172016","NOSE_000000172016",2009-07-15 16:03:44.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000692528","NOSE_000000692528",2009-12-04 17:01:42.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000169428","NOSE_000000169428",2009-09-18 14:48:07.0,",","NOSE",2,1,"de","P",1,5253,5253,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000981307","NOSE_000000981307",2009-10-25 20:31:14.0,",","NOSE",2,1,"de","P",1,5174,5174,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000925630","NOSE_000000925630",2009-11-16 11:16:55.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000720717","NOSE_000000720717",2009-12-04 17:04:10.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000481217","NOSE_000000481217",2009-04-29 22:13:07.0,",","NOSE",2,1,"de","P",1,5060,5060,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000390401","NOSE_000000390401",2010-07-01 07:05:19.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000943982","NOSE_000000943982",2009-09-02 23:18:47.0,",","NOSE",2,1,"en","P",1,5561,5473,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000459072","NOSE_000000459072",2009-04-29 22:14:25.0,",","NOSE",2,1,"de","P",1,5536,5536,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000287303","NOSE_000000287303",2009-07-31 19:11:11.0,",","NOSE",2,1,"de","P",1,5330,5330,"Doubtful","

Each item had t...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000241315","NOSE_000000241315",2009-07-31 19:11:29.0,",","NOSE",2,1,"de","P",1,5233,5233,"Good",,,4,0,1,0,0,0,0,0,0,2,"active" "000000851928","NOSE_000000851928",2010-07-13 07:06:52.0,",","NOSE",2,1,"fr","P",1,5065,5065,"Good",,,4,0,0,4,0,0,2,0,0,4,"active" "000000478152","NOSE_000000478152",2010-06-21 12:15:17.0,",","NOSE",2,1,"en","P",1,5233,5233,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000703905","NOSE_000000703905",2009-06-13 03:16:22.0,",","NOSE",2,1,"de","P",1,5120,5120,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000007505","NOSE_000000007505",2009-06-13 03:17:00.0,",","NOSE",2,1,"de","P",1,5260,5260,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000988562","NOSE_000000988562",2009-04-29 22:15:45.0,",","NOSE",2,1,"de","P",1,5062,5062,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000774996","NOSE_000000774996",2009-04-29 22:16:10.0,",","NOSE",2,1,"de","P",1,5518,5518,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000262483","NOSE_000000262483",2009-10-16 00:51:03.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000196161","NOSE_000000196161",2009-06-13 03:45:11.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000706541","NOSE_000000706541",2009-04-29 19:38:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000685614","NOSE_000000685614",2009-12-10 20:07:19.0,",","NOSE",2,1,"fr","P",1,5336,5336,"Good",,,4,0,1,0,1,0,0,0,0,0,"active" "000000671478","NOSE_000000671478",2009-10-16 00:55:32.0,",","NOSE",,1,"en","P",1,,,,,,2,2,3,2,0,0,2,1,0,0,"active" "000000935910","NOSE_000000935910",2010-01-21 07:06:34.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000764129","NOSE_000000764129",2009-12-04 16:46:19.0,",","NOSE",2,1,"en","P",1,5376,5376,"Doubtful","

'During institu...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000050398","NOSE_000000050398",2009-04-29 19:38:50.0,",","NOSE",2,1,"de","P",1,4909,4909,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000522437","NOSE_000000522437",2009-08-20 01:28:57.0,",","NOSE",2,1,"de","P",1,5037,5037,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000162336","NOSE_000000162336",2009-06-29 20:02:44.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000346066","NOSE_000000346066",2009-04-29 19:31:02.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000822015","NOSE_000000822015",2009-06-13 04:09:47.0,",","NOSE",2,1,"fr","P",1,5381,5381,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000419481","NOSE_000000419481",2010-02-03 07:04:51.0,",","NOSE",2,1,"de","P",1,5268,5268,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000114089","NOSE_000000114089",2009-04-29 22:21:00.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000244233","NOSE_000000244233",2009-05-18 14:17:00.0,",","NOSE",2,1,"en","P",1,4864,5248,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000164905","NOSE_000000164905",2009-04-29 19:35:02.0,",","NOSE",2,1,"en","P",1,5130,5130,"Good",,"1",1,1,2,0,0,0,0,0,0,0,"active" "000000780950","NOSE_000000780950",2009-04-29 19:28:41.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000049277","NOSE_000000049277",2009-12-04 17:12:23.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000696005","NOSE_000000696005",2009-07-07 10:28:30.0,",","NOSE",2,1,"de","P",1,5420,5420,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000482569","NOSE_000000482569",2010-02-08 09:14:19.0,",","NOSE",2,1,"fr","P",1,5166,5166,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000126297","NOSE_000000126297",2009-04-29 19:32:20.0,",","NOSE",2,1,"en","P",1,5288,5288,"Good",,"1",3,1,1,0,0,0,0,1,0,2,"active" "000000356420","NOSE_000000356420",2009-12-04 16:54:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000746717","NOSE_000000746717",2009-04-29 22:25:12.0,",","NOSE",2,1,"de","P",1,5283,5283,"Good",,"1",3,0,0,0,0,0,2,0,0,0,"active" "000000603350","NOSE_000000603350",2010-07-08 12:23:11.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000947214","NOSE_000000947214",2009-10-25 20:46:10.0,",","NOSE",2,1,"en","P",1,5393,5393,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000322099","NOSE_000000322099",2009-04-29 22:26:31.0,",","NOSE",2,1,"de","P",1,5558,5558,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000753912","NOSE_000000753912",2009-10-24 20:16:58.0,",","NOSE",2,1,"de","P",1,5374,5374,"Good",,,4,0,0,0,0,0,4,0,0,4,"active" "000000000937","NOSE_000000000937",2010-02-03 07:05:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000049940","NOSE_000000049940",2009-12-04 16:46:43.0,",","NOSE",2,1,"en","P",1,5045,5045,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000339273","NOSE_000000339273",2009-04-29 22:27:51.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,1,1,0,0,"active" "000000505663","NOSE_000000505663",2009-04-29 22:29:08.0,",","NOSE",2,1,"de","P",1,5250,5250,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000333472","NOSE_000000333472",2009-04-29 19:25:42.0,",","NOSE",2,1,"de","P",1,5411,5411,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000922072","NOSE_000000922072",2009-06-13 05:10:12.0,",","NOSE",2,1,"en","P",1,4697,5081,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000177517","NOSE_000000177517",2009-04-29 22:31:51.0,",","NOSE",2,1,"en","P",1,5473,5473,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000523702","NOSE_000000523702",2009-04-29 19:27:24.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000796379","NOSE_000000796379",2009-04-29 19:26:15.0,",","NOSE",2,1,"fr","P",1,5267,5267,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000219929","NOSE_000000219929",2009-12-04 16:46:48.0,",","NOSE",2,1,"en","P",1,5358,5358,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000737550","NOSE_000000737550",2010-06-21 13:06:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000801601","NOSE_000000801601",2009-07-31 19:12:09.0,",","NOSE",2,1,"de","P",1,5197,5197,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000337248","NOSE_000000337248",2009-04-29 22:35:42.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000663855","NOSE_000000663855",2009-04-29 19:27:57.0,",","NOSE",2,1,"en","P",1,5389,5389,"Good",,"1",4,0,1,0,1,0,1,1,0,0,"active" "000000682972","NOSE_000000682972",2009-04-29 19:27:13.0,",","NOSE",2,1,"en","P",1,5376,5376,"Good",,"1",1,2,1,0,0,0,0,1,0,0,"active" "000000299755","NOSE_000000299755",2010-03-31 07:05:23.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000963365","NOSE_000000963365",2010-04-02 07:05:13.0,",","NOSE",,1,"de","P",1,,,,,,3,2,3,1,1,0,3,1,0,4,"active" "000000817387","NOSE_000000817387",2009-10-07 22:36:08.0,",","NOSE",,1,"en","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000017410","NOSE_000000017410",2009-07-31 19:12:27.0,",","NOSE",2,1,"de","P",1,5342,5342,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000985750","NOSE_000000985750",2009-05-18 14:17:02.0,",","NOSE",2,1,"fr","P",1,5489,5489,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000433488","NOSE_000000433488",2009-06-29 20:32:24.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000841822","NOSE_000000841822",2009-11-25 11:34:36.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000035411","NOSE_000000035411",2010-07-19 07:05:56.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000407318","NOSE_000000407318",2009-06-13 05:48:20.0,",","NOSE",2,1,"de","P",1,4878,4878,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000788500","NOSE_000000788500",2009-04-29 19:36:37.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000520700","NOSE_000000520700",2009-04-29 22:40:57.0,",","NOSE",2,1,"en","P",1,4981,4981,"Good",,"1",4,3,3,0,0,0,1,1,4,0,"active" "000000093633","NOSE_000000093633",2010-04-16 07:04:37.0,",","NOSE",,1,"en","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000007296","NOSE_000000007296",2009-12-02 09:54:53.0,",","NOSE",2,1,"de","P",1,5220,5220,"Good",,,3,1,2,0,0,0,1,0,0,0,"active" "000000311692","NOSE_000000311692",2009-04-29 22:42:17.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000249270","NOSE_000000249270",2010-04-14 07:06:43.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000000887","NOSE_000000000887",2009-04-29 22:43:39.0,",","NOSE",2,1,"fr","P",1,5165,5165,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000019770","NOSE_000000019770",2009-04-29 19:32:55.0,",","NOSE",2,1,"en","P",1,5259,5259,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000519016","NOSE_000000519016",2009-07-03 10:32:05.0,",","NOSE",,1,"en","P",1,,,,,,1,3,1,0,0,0,0,0,0,0,"active" "000000063217","NOSE_000000063217",2009-04-29 19:38:41.0,",","NOSE",3,1,"en","P",1,5334,5334,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000157718","NOSE_000000157718",2009-12-03 20:07:19.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000289050","NOSE_000000289050",2009-10-10 20:58:26.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000304162","NOSE_000000304162",2010-04-21 07:08:04.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000148930","NOSE_000000148930",2010-05-18 07:05:45.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,4,2,3,0,0,0,1,1,0,2,"active" "000000722318","NOSE_000000722318",2009-04-29 22:47:40.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,"1",3,1,0,1,3,2,3,0,0,2,"active" "000000174022","NOSE_000000174022",2009-09-26 02:56:26.0,",","NOSE",2,1,"de","P",1,5529,5529,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000659900","NOSE_000000659900",2009-04-29 19:27:08.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,"1",3,0,2,0,0,0,3,0,0,0,"active" "000000118218","NOSE_000000118218",2009-05-18 10:56:04.0,",","NOSE",2,1,"de","P",1,5022,5022,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000617021","NOSE_000000617021",2009-06-29 21:01:53.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000497899","NOSE_000000497899",2009-04-29 22:50:15.0,",","NOSE",2,1,"en","P",1,5186,5186,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000762284","NOSE_000000762284",2009-12-04 17:03:09.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,,4,3,4,1,1,0,3,1,0,4,"active" "000000426118","NOSE_000000426118",2009-07-31 19:12:47.0,",","NOSE",2,1,"en","P",1,4863,5247,"Good",,,4,0,0,0,0,0,3,0,0,0,"active" "000000404320","NOSE_000000404320",2010-07-08 12:49:03.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000541127","NOSE_000000541127",2009-12-04 16:40:58.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000994145","NOSE_000000994145",2010-03-09 07:11:08.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000392683","NOSE_000000392683",2009-07-31 19:13:02.0,",","NOSE",2,1,"de","P",1,5192,5192,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000758922","NOSE_000000758922",2009-12-04 16:52:23.0,",","NOSE",,1,"de","P",1,,,,,,3,1,0,0,0,0,0,0,0,2,"active" "000000374112","NOSE_000000374112",2009-04-29 19:30:23.0,",","NOSE",2,1,"en","P",1,5274,5274,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000379159","NOSE_000000379159",2009-06-13 06:44:03.0,",","NOSE",2,1,"fr","P",1,4912,4912,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000108200","NOSE_000000108200",2009-08-20 01:34:50.0,",","NOSE",2,1,"de","P",1,5472,5472,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000604692","NOSE_000000604692",2009-06-13 07:12:42.0,",","NOSE",2,1,"en","P",1,5591,5591,"Good",,"9",4,1,3,0,0,0,1,0,0,0,"active" "000000340039","NOSE_000000340039",2009-04-29 19:40:20.0,",","NOSE",2,1,"en","P",1,5416,5416,"Good",,"1",4,0,1,0,0,0,0,0,0,4,"active" "000000704818","NOSE_000000704818",2010-04-13 07:04:51.0,",","NOSE",2,1,"fr","P",1,5330,5330,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000495696","NOSE_000000495696",2009-04-29 19:35:25.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000914163","NOSE_000000914163",2009-04-29 22:54:56.0,",","NOSE",2,1,"fr","P",1,5171,5171,"Good",,"9",4,0,1,0,0,0,0,0,0,0,"active" "000000668330","NOSE_000000668330",2010-02-24 07:05:41.0,",","NOSE",2,1,"de","P",1,5110,5110,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000600080","NOSE_000000600080",2009-07-08 10:23:15.0,",","NOSE",2,1,"de","P",1,5392,5392,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000916108","NOSE_000000916108",2009-12-04 16:44:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000879169","NOSE_000000879169",2009-06-29 21:32:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000733917","NOSE_000000733917",2009-04-29 19:41:49.0,",","NOSE",2,1,"en","P",1,5322,5322,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000425510","NOSE_000000425510",2009-04-29 22:57:40.0,",","NOSE",,1,"en","P",1,5166,5166,,,"9",1,3,2,0,0,0,0,0,0,0,"active" "000000750587","NOSE_000000750587",2010-03-20 07:06:48.0,",","NOSE",2,1,"de","P",1,5116,5116,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000921274","NOSE_000000921274",2009-04-29 22:59:02.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000098092","NOSE_000000098092",2009-07-15 16:10:56.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000946183","NOSE_000000946183",2009-04-29 19:26:57.0,",","NOSE",1,1,"en","P",1,5134,5134,"Good",,"9",3,2,0,0,0,0,0,0,0,0,"active" "000000321815","NOSE_000000321815",2009-04-29 23:01:11.0,",","NOSE",,1,"de","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000699179","NOSE_000000699179",2009-12-04 16:46:32.0,",","NOSE",,1,"en","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000646987","NOSE_000000646987",2010-05-08 07:31:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000838382","NOSE_000000838382",2009-12-04 16:51:45.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000770335","NOSE_000000770335",2010-02-03 07:03:22.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000177414","NOSE_000000177414",2009-04-29 19:28:14.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,"1",3,2,3,0,0,0,1,0,0,0,"active" "000000221701","NOSE_000000221701",2009-04-29 19:37:24.0,",","NOSE",2,1,"fr","P",1,5350,5350,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000868865","NOSE_000000868865",2009-04-29 23:05:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000668558","NOSE_000000668558",2009-04-29 19:29:03.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good","

daughter were t...

","1",0,-1,0,0,0,0,0,0,0,0,"active" "000000233772","NOSE_000000233772",2009-04-29 23:07:29.0,",","NOSE",2,1,"de","P",1,5385,5385,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000297559","NOSE_000000297559",2010-07-08 13:01:32.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000262618","NOSE_000000262618",2009-11-04 15:36:11.0,",","NOSE",2,1,"en","P",1,5193,5193,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000169367","NOSE_000000169367",2009-08-20 06:07:08.0,",","NOSE",2,1,"de","P",1,5321,5321,"Good",,,4,1,1,2,0,0,4,0,0,0,"active" "000000806923","NOSE_000000806923",2009-04-29 19:27:40.0,",","NOSE",2,1,"de","P",1,5494,5494,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000004121","NOSE_000000004121",2009-06-29 21:57:05.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000186171","NOSE_000000186171",2010-03-02 07:04:22.0,",","NOSE",2,1,"fr","P",1,5300,5300,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000188105","NOSE_000000188105",2010-01-14 11:51:02.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,,3,1,3,1,0,0,1,1,0,0,"active" "000000989889","NOSE_000000989889",2009-04-29 19:42:49.0,",","NOSE",2,1,"en","P",1,5096,5096,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000496878","NOSE_000000496878",2009-06-29 22:25:35.0,",","NOSE",2,1,"de","P",1,5481,5481,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000667204","NOSE_000000667204",2009-12-04 17:12:42.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000060890","NOSE_000000060890",2009-04-29 23:11:35.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000019392","NOSE_000000019392",2009-04-29 19:35:31.0,",","NOSE",2,1,"en","P",1,5395,5395,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000898901","NOSE_000000898901",2010-06-21 12:11:29.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000818587","NOSE_000000818587",2009-04-29 23:14:24.0,",","NOSE",2,1,"de","P",1,5491,5491,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000270211","NOSE_000000270211",2009-12-04 16:46:35.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,1,0,1,0,2,0,"active" "000000589914","NOSE_000000589914",2010-06-30 07:05:12.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000934851","NOSE_000000934851",2009-07-15 16:12:50.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000873242","NOSE_000000873242",2009-08-20 02:05:56.0,",","NOSE",2,1,"en","P",1,5405,5405,"Good",,,2,3,2,0,0,0,0,1,0,0,"active" "000000423852","NOSE_000000423852",2009-04-29 19:33:38.0,",","NOSE",2,2,"de","P",1,5457,5490,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000944752","NOSE_000000944752",2009-04-29 23:16:46.0,",","NOSE",2,1,"de","P",1,5430,5430,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000267921","NOSE_000000267921",2009-04-29 19:27:02.0,",","NOSE",2,1,"en","P",1,5321,5321,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000046625","NOSE_000000046625",2009-04-29 23:19:26.0,",","NOSE",2,1,"fr","P",1,5168,5168,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000906010","NOSE_000000906010",2010-05-14 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,1,0,0,0,0,0,"active" "000000852153","NOSE_000000852153",2009-04-29 19:39:27.0,",","NOSE",2,1,"fr","P",1,5106,5106,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000636651","NOSE_000000636651",2010-04-14 07:04:20.0,",","NOSE",2,1,"fr","P",1,5151,5151,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000496795","NOSE_000000496795",2009-04-29 23:22:12.0,",","NOSE",,1,"en","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000398823","NOSE_000000398823",2009-07-07 10:28:53.0,",","NOSE",2,1,"en","P",1,4811,5195,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000831084","NOSE_000000831084",2009-04-29 19:27:43.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000450306","NOSE_000000450306",2009-10-13 15:50:15.0,",","NOSE",2,1,"de","P",1,5120,5120,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000982686","NOSE_000000982686",2009-11-17 20:07:47.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000157889","NOSE_000000157889",2010-06-21 12:14:40.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000308617","NOSE_000000308617",2009-09-02 23:46:22.0,",","NOSE",2,1,"fr","P",1,5258,5258,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000406252","NOSE_000000406252",2010-01-27 07:03:24.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000583428","NOSE_000000583428",2009-04-29 19:31:24.0,",","NOSE",2,1,"fr","P",1,5514,5514,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000488221","NOSE_000000488221",2009-11-16 11:16:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000444152","NOSE_000000444152",2009-04-29 19:42:47.0,",","NOSE",2,1,"fr","P",1,5350,5350,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000970117","NOSE_000000970117",2009-04-29 19:28:30.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,"1",3,1,2,0,0,0,2,0,0,2,"active" "000000406577","NOSE_000000406577",2009-04-29 19:33:50.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000938690","NOSE_000000938690",2009-04-29 19:42:18.0,",","NOSE",2,1,"en","P",1,5211,5211,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000510980","NOSE_000000510980",2010-06-21 12:07:19.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000975859","NOSE_000000975859",2009-04-29 23:30:42.0,",","NOSE",2,1,"de","P",1,5236,5236,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000531522","NOSE_000000531522",2009-04-29 19:38:55.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000497958","NOSE_000000497958",2009-04-29 19:19:16.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000717221","NOSE_000000717221",2009-04-29 23:33:48.0,",","NOSE",2,2,"de","P",1,5476,5476,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000254965","NOSE_000000254965",2010-07-11 07:05:30.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,0,0,0,0,0,0,0,"active" "000000530540","NOSE_000000530540",2009-12-03 20:11:20.0,",","NOSE",2,1,"de","P",1,5230,5230,"Good",,,2,1,0,0,0,0,1,0,0,0,"active" "000000526151","NOSE_000000526151",2009-07-31 19:13:43.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,2,0,1,0,0,0,2,0,0,0,"active" "000000558080","NOSE_000000558080",2009-12-04 16:52:17.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000529342","NOSE_000000529342",2009-12-04 16:55:44.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000258176","NOSE_000000258176",2009-04-29 23:35:11.0,",","NOSE",2,1,"en","P",1,5361,5361,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000233587","NOSE_000000233587",2009-07-16 14:49:19.0,",","NOSE",2,1,"en","P",1,5380,5380,"Good",,,2,0,0,0,0,0,1,0,0,0,"active" "000000429141","NOSE_000000429141",2009-06-13 07:14:11.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000048694","NOSE_000000048694",2010-04-11 07:32:15.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000440736","NOSE_000000440736",2009-08-20 02:20:59.0,",","NOSE",2,1,"de","P",1,5179,5179,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000650863","NOSE_000000650863",2009-12-04 16:40:42.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000472513","NOSE_000000472513",2010-05-07 07:04:58.0,",","NOSE",2,1,"en","P",1,5125,5125,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000140141","NOSE_000000140141",2009-04-29 19:36:14.0,",","NOSE",2,,,,,,,"Missing","

language proble...

",,,,,,,,,,,,"active" "000000992288","NOSE_000000992288",2010-01-23 07:08:29.0,",","NOSE",2,1,"en","P",1,5230,5230,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000613928","NOSE_000000613928",2009-04-29 23:37:27.0,",","NOSE",2,1,"de","P",1,5352,5352,"Good",,"9",3,0,1,0,0,0,0,0,0,0,"active" "000000886775","NOSE_000000886775",2009-04-29 19:29:22.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000250058","NOSE_000000250058",2009-12-04 16:52:36.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000887725","NOSE_000000887725",2009-04-29 19:41:06.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000439726","NOSE_000000439726",2009-04-29 19:33:53.0,",","NOSE",2,1,"en","P",1,5363,5363,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000580541","NOSE_000000580541",2010-05-09 07:04:41.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000638755","NOSE_000000638755",2009-04-29 23:42:48.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000907260","NOSE_000000907260",2009-04-29 19:30:35.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000688873","NOSE_000000688873",2009-04-29 19:40:24.0,",","NOSE",1,,,,,,,"Missing","

subject wanted ...

",,,,,,,,,,,,"active" "000000114725","NOSE_000000114725",2009-04-29 23:45:31.0,",","NOSE",2,1,"fr","P",1,5331,5331,"Good",,"1",4,2,1,0,0,0,0,0,0,0,"active" "000000301598","NOSE_000000301598",2009-08-20 02:36:03.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,2,0,"active" "000000591700","NOSE_000000591700",2009-10-22 20:11:38.0,",","NOSE",2,1,"de","P",1,5335,5335,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000305304","NOSE_000000305304",2009-07-31 19:14:18.0,",","NOSE",2,1,"de","P",1,5388,5388,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000979095","NOSE_000000979095",2009-12-04 16:50:12.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000940998","NOSE_000000940998",2009-06-29 22:59:48.0,",","NOSE",2,1,"en","P",1,5252,5252,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000469674","NOSE_000000469674",2009-06-30 10:18:20.0,",","NOSE",2,1,"de","P",1,5430,5430,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000266205","NOSE_000000266205",2010-06-16 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000210163","NOSE_000000210163",2009-04-29 23:46:53.0,",","NOSE",2,1,"de","P",1,5843,5477,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000901020","NOSE_000000901020",2010-01-25 07:03:12.0,",","NOSE",2,1,"en","P",1,5169,5169,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000793849","NOSE_000000793849",2009-04-29 23:48:16.0,",","NOSE",2,1,"de","P",1,5285,5285,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000549489","NOSE_000000549489",2010-04-12 07:04:51.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,,2,2,1,0,1,0,3,1,0,0,"active" "000000323276","NOSE_000000323276",2010-05-13 07:04:49.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000728305","NOSE_000000728305",2009-06-29 23:27:51.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000138113","NOSE_000000138113",2009-04-29 23:48:53.0,",","NOSE",2,1,"de","P",1,5370,5370,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000621897","NOSE_000000621897",2009-04-29 19:35:19.0,",","NOSE",2,1,"de","P",1,5225,5225,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018441","NOSE_000000018441",2010-07-08 12:41:36.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000603471","NOSE_000000603471",2009-04-29 19:24:56.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000370479","NOSE_000000370479",2009-04-29 19:41:17.0,",","NOSE",2,1,"en","P",1,5255,5255,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000912451","NOSE_000000912451",2010-05-02 07:04:33.0,",","NOSE",2,1,"fr","P",1,5109,5109,"Good",,,3,0,2,0,0,0,1,0,0,0,"active" "000000991963","NOSE_000000991963",2010-04-29 11:41:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000616384","NOSE_000000616384",2009-08-20 02:51:58.0,",","NOSE",2,1,"en","P",1,5336,5336,"Good",,,4,1,1,0,0,0,0,0,0,2,"active" "000000151328","NOSE_000000151328",2009-04-29 23:54:13.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000093768","NOSE_000000093768",2009-04-29 23:54:41.0,",","NOSE",2,1,"de","P",1,4952,4952,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000561240","NOSE_000000561240",2010-06-16 07:05:00.0,",","NOSE",,1,"de","P",1,,,,,,3,2,3,1,0,0,1,1,0,4,"active" "000000892213","NOSE_000000892213",2010-06-09 07:05:38.0,",","NOSE",2,1,"fr","P",1,4996,4996,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000011436","NOSE_000000011436",2009-04-29 19:41:52.0,",","NOSE",2,1,"en","P",1,5287,5287,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000055985","NOSE_000000055985",2009-07-31 19:14:46.0,",","NOSE",2,1,"fr","P",1,5387,5387,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000942158","NOSE_000000942158",2009-04-29 19:32:49.0,",","NOSE",2,1,"de","P",1,4926,4926,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000190981","NOSE_000000190981",2009-04-29 19:27:54.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000550247","NOSE_000000550247",2010-01-25 07:03:47.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000175768","NOSE_000000175768",2009-04-29 23:59:59.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,2,"active" "000000556219","NOSE_000000556219",2009-04-29 19:23:02.0,",","NOSE",2,1,"en","P",1,5321,5321,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000323687","NOSE_000000323687",2010-04-04 07:04:09.0,",","NOSE",2,1,"fr","P",1,5270,5270,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000365933","NOSE_000000365933",2010-07-15 07:05:15.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000438443","NOSE_000000438443",2009-04-30 00:02:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000720576","NOSE_000000720576",2009-04-30 00:02:54.0,",","NOSE",2,1,"en","P",1,5075,5075,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000937446","NOSE_000000937446",2010-04-14 07:04:12.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000211674","NOSE_000000211674",2009-08-20 03:05:15.0,",","NOSE",,1,"en","P",1,5377,5377,,,,2,1,0,0,0,0,0,0,0,0,"active" "000000803905","NOSE_000000803905",2009-11-24 15:40:46.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000740529","NOSE_000000740529",2009-12-03 20:07:06.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000216056","NOSE_000000216056",2009-04-29 19:31:08.0,",","NOSE",2,1,"en","P",1,5367,5367,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000737666","NOSE_000000737666",2009-04-29 19:24:01.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,"1",3,1,2,0,0,0,1,0,0,0,"active" "000000439238","NOSE_000000439238",2009-12-04 16:52:12.0,",","NOSE",,1,"de","P",1,,,,,,3,1,2,0,0,0,0,0,0,0,"active" "000000354175","NOSE_000000354175",2009-12-04 16:49:23.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000038161","NOSE_000000038161",2009-04-29 19:29:38.0,",","NOSE",2,1,"en","P",1,5437,5437,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000042302","NOSE_000000042302",2010-07-08 12:24:53.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000487579","NOSE_000000487579",2010-07-01 07:05:24.0,",","NOSE",2,1,"fr","P",1,5093,5093,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000900322","NOSE_000000900322",2009-06-29 23:37:59.0,",","NOSE",2,1,"en","P",1,5517,5517,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000167192","NOSE_000000167192",2009-04-29 19:36:40.0,",","NOSE",2,1,"en","P",1,5069,5069,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000604286","NOSE_000000604286",2009-04-30 00:09:35.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,"1",3,0,3,0,0,0,0,1,0,0,"active" "000000754303","NOSE_000000754303",2010-03-22 07:04:54.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000605765","NOSE_000000605765",2009-10-24 20:13:18.0,",","NOSE",2,1,"en","P",1,5144,5144,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000400333","NOSE_000000400333",2009-06-13 07:30:08.0,",","NOSE",2,1,"en","P",1,5339,5339,"Good",,,3,1,1,0,1,0,0,0,0,0,"active" "000000160554","NOSE_000000160554",2009-04-30 00:10:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000074412","NOSE_000000074412",2010-02-25 07:03:37.0,",","NOSE",2,1,"fr","P",1,5523,5523,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000508233","NOSE_000000508233",2009-10-02 20:15:35.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000398729","NOSE_000000398729",2009-09-02 23:46:26.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000176423","NOSE_000000176423",2009-12-04 16:46:57.0,",","NOSE",2,1,"en","P",1,5214,5214,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000297469","NOSE_000000297469",2009-04-30 00:11:05.0,",","NOSE",2,1,"de","P",1,5659,5659,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000324133","NOSE_000000324133",2009-04-30 00:12:18.0,",","NOSE",2,1,"de","P",1,5521,5521,"Good",,"1",4,0,1,0,0,0,3,0,0,2,"active" "000000152160","NOSE_000000152160",2009-07-16 14:55:45.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000585409","NOSE_000000585409",2009-07-31 19:32:19.0,",","NOSE",2,1,"fr","P",1,5214,5214,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000483926","NOSE_000000483926",2009-12-04 16:50:09.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000569601","NOSE_000000569601",2009-04-29 19:29:49.0,",","NOSE",2,1,"en","P",1,5226,5226,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000823004","NOSE_000000823004",2009-12-04 16:48:33.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000203207","NOSE_000000203207",2010-03-04 07:04:05.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,,3,2,2,0,0,0,0,0,0,0,"active" "000000937329","NOSE_000000937329",2009-11-04 15:32:58.0,",","NOSE",2,1,"fr","P",1,5370,5370,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000813292","NOSE_000000813292",2009-06-13 08:00:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000766368","NOSE_000000766368",2010-02-02 07:04:09.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000688594","NOSE_000000688594",2009-10-04 21:19:05.0,",","NOSE",2,1,"de","P",1,5335,5335,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000683262","NOSE_000000683262",2010-01-30 07:03:28.0,",","NOSE",2,1,"de","P",1,5165,5165,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000804925","NOSE_000000804925",2009-12-04 17:03:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000902805","NOSE_000000902805",2009-12-04 17:00:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000672183","NOSE_000000672183",2009-07-16 14:56:30.0,",","NOSE",2,1,"de","P",1,5290,5290,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000348339","NOSE_000000348339",2009-09-09 00:00:09.0,",","NOSE",2,1,"de","P",1,5478,5478,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000768368","NOSE_000000768368",2010-07-08 12:41:04.0,",","NOSE",,2,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000226396","NOSE_000000226396",2009-06-13 08:00:31.0,",","NOSE",2,1,"de","P",1,5535,5535,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000538285","NOSE_000000538285",2010-06-04 07:07:32.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,1,0,0,0,"active" "000000819585","NOSE_000000819585",2009-07-16 14:59:18.0,",","NOSE",2,1,"fr","P",1,5515,5515,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000958705","NOSE_000000958705",2009-09-09 22:32:02.0,",","NOSE",2,1,"de","P",1,5146,5146,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000787092","NOSE_000000787092",2009-07-15 16:19:36.0,",","NOSE",2,1,"en","P",1,4758,5142,"Good",,,2,2,1,0,0,0,0,0,0,0,"active" "000000224956","NOSE_000000224956",2009-06-30 00:00:07.0,",","NOSE",2,1,"de","P",1,5379,5379,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000391954","NOSE_000000391954",2009-04-29 19:23:33.0,",","NOSE",2,1,"de","P",1,5330,5330,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000232374","NOSE_000000232374",2009-06-13 08:27:42.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000810745","NOSE_000000810745",2009-10-01 21:08:07.0,",","NOSE",2,1,"en","P",1,5315,5315,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000020880","NOSE_000000020880",2009-04-29 19:28:00.0,",","NOSE",2,1,"en","P",1,5212,5212,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000178799","NOSE_000000178799",2009-11-30 20:06:39.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000517883","NOSE_000000517883",2009-04-30 00:17:41.0,",","NOSE",2,1,"de","P",1,5571,5571,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000542741","NOSE_000000542741",2010-07-08 13:47:38.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000671234","NOSE_000000671234",2009-12-04 16:51:19.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,1,0,0,0,0,0,"active" "000000460041","NOSE_000000460041",2009-11-04 15:33:05.0,",","NOSE",2,1,"fr","P",1,5409,5409,"Good",,,2,1,1,0,1,0,0,0,0,0,"active" "000000834443","NOSE_000000834443",2009-04-29 19:40:32.0,",","NOSE",2,1,"de","P",1,5273,5273,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000005732","NOSE_000000005732",2009-12-03 20:11:25.0,",","NOSE",2,1,"en","P",1,5257,5257,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000971601","NOSE_000000971601",2010-05-18 07:04:53.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000394329","NOSE_000000394329",2009-04-30 00:20:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000964374","NOSE_000000964374",2009-11-16 10:51:10.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000281068","NOSE_000000281068",2009-04-29 19:28:52.0,",","NOSE",2,1,"en","P",1,5145,5145,"Doubtful","

parent was drin...

","1",4,1,3,0,0,0,1,1,0,4,"active" "000000533977","NOSE_000000533977",2009-12-04 16:52:44.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000622058","NOSE_000000622058",2009-04-29 19:39:04.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000758003","NOSE_000000758003",2009-12-04 17:00:52.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014929","NOSE_000000014929",2009-04-29 19:37:21.0,",","NOSE",2,1,"en","P",1,5268,5268,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000710206","NOSE_000000710206",2009-10-22 22:43:05.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000507449","NOSE_000000507449",2009-10-11 20:35:12.0,",","NOSE",2,1,"de","P",1,5093,5093,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000684131","NOSE_000000684131",2009-04-29 19:24:37.0,",","NOSE",2,1,"en","P",1,5486,5486,"Good",,"1",2,2,1,0,0,0,0,1,0,0,"active" "000000894549","NOSE_000000894549",2009-04-29 19:28:24.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",4,1,2,0,0,0,0,1,0,0,"active" "000000839688","NOSE_000000839688",2009-04-29 19:39:56.0,",","NOSE",2,1,"en","P",1,5170,5170,"Doubtful","

she thought tha...

","0",0,-1,0,0,0,0,0,0,0,0,"active" "000000455469","NOSE_000000455469",2009-05-18 10:32:26.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000931155","NOSE_000000931155",2010-05-16 07:05:25.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000107777","NOSE_000000107777",2009-04-29 19:24:15.0,",","NOSE",2,1,"en","P",1,5265,5265,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000741664","NOSE_000000741664",2009-04-30 00:31:03.0,",","NOSE",2,1,"de","P",1,5524,5524,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000564808","NOSE_000000564808",2010-01-15 07:03:41.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000791642","NOSE_000000791642",2009-04-29 19:19:27.0,",","NOSE",2,1,"de","P",1,5210,5210,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000784701","NOSE_000000784701",2009-04-29 19:25:26.0,",","NOSE",2,1,"de","P",1,5096,5096,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000174683","NOSE_000000174683",2009-04-29 19:41:20.0,",","NOSE",2,1,"en","P",1,5113,5113,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000580272","NOSE_000000580272",2009-04-30 00:36:27.0,",","NOSE",2,1,"de","P",1,5159,5159,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000158868","NOSE_000000158868",2010-05-07 07:04:46.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000013478","NOSE_000000013478",2010-06-26 07:04:53.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000557495","NOSE_000000557495",2009-06-13 08:43:02.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",1,2,1,0,0,0,0,0,0,2,"active" "000000657533","NOSE_000000657533",2009-07-03 10:45:38.0,",","NOSE",2,1,"de","P",1,5176,5176,"Good",,,2,0,1,0,0,0,0,0,2,0,"active" "000000467955","NOSE_000000467955",2009-08-20 03:20:46.0,",","NOSE",2,1,"de","P",1,5216,5216,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000040728","NOSE_000000040728",2009-12-04 17:01:32.0,",","NOSE",2,1,"en","P",1,5439,5439,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000919689","NOSE_000000919689",2009-09-09 20:55:22.0,",","NOSE",2,1,"fr","P",1,5454,5454,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000772255","NOSE_000000772255",2009-04-30 00:37:51.0,",","NOSE",2,,,,,,,"Missing",,,,,,,,,,,,,"active" "000000677559","NOSE_000000677559",2009-12-04 17:02:59.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000134261","NOSE_000000134261",2009-04-29 19:39:47.0,",","NOSE",2,2,"de","P",1,5416,5416,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000606179","NOSE_000000606179",2009-11-04 15:33:24.0,",","NOSE",2,1,"de","P",1,5443,5443,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000236515","NOSE_000000236515",2010-04-29 11:53:46.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000892341","NOSE_000000892341",2009-04-29 19:32:26.0,",","NOSE",2,1,"de","P",1,5154,5154,"Good",,"1",2,0,0,0,0,0,0,0,0,2,"active" "000000494690","NOSE_000000494690",2009-04-30 00:41:50.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,0,0,0,"active" "000000890791","NOSE_000000890791",2009-12-04 17:01:53.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000410375","NOSE_000000410375",2009-12-04 17:03:22.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000743984","NOSE_000000743984",2010-07-18 07:14:38.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000031708","NOSE_000000031708",2009-08-21 21:49:16.0,",","NOSE",2,1,"fr","P",1,5136,5136,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000340643","NOSE_000000340643",2009-04-29 19:37:27.0,",","NOSE",2,1,"en","P",1,5323,5323,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000720939","NOSE_000000720939",2009-04-30 00:43:25.0,",","NOSE",2,1,"de","P",1,5586,5586,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000376659","NOSE_000000376659",2010-03-30 07:07:24.0,",","NOSE",2,1,"de","P",1,5172,5172,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000087611","NOSE_000000087611",2009-07-31 19:15:49.0,",","NOSE",2,1,"de","P",1,5486,5486,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000347529","NOSE_000000347529",2009-06-13 08:59:50.0,",","NOSE",2,1,"de","P",1,5428,5428,"Doubtful","

Due to language...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000607021","NOSE_000000607021",2009-04-29 19:32:23.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000936086","NOSE_000000936086",2009-04-30 00:46:01.0,",","NOSE",2,1,"de","P",1,5289,5289,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000800867","NOSE_000000800867",2009-06-30 00:35:37.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000088237","NOSE_000000088237",2009-04-29 19:35:22.0,",","NOSE",2,1,"en","P",1,5369,5369,"Good",,"1",2,2,2,0,0,0,0,0,0,0,"active" "000000654340","NOSE_000000654340",2009-04-29 19:39:36.0,",","NOSE",2,2,"de","P",1,5251,5282,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000730431","NOSE_000000730431",2009-11-29 20:06:45.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000466806","NOSE_000000466806",2009-04-30 00:53:51.0,",","NOSE",2,1,"fr","P",1,5474,5474,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000846844","NOSE_000000846844",2009-09-14 20:17:51.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000462378","NOSE_000000462378",2010-06-03 07:05:21.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000966071","NOSE_000000966071",2009-09-08 22:37:01.0,",","NOSE",2,1,"de","P",1,5485,5485,"Good",,,4,2,3,3,2,3,4,2,2,4,"active" "000000446834","NOSE_000000446834",2010-04-30 07:04:39.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000631407","NOSE_000000631407",2009-12-04 16:38:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000336504","NOSE_000000336504",2009-08-20 03:31:03.0,",","NOSE",,1,"en","P",1,5159,5159,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000850815","NOSE_000000850815",2009-04-30 00:57:46.0,",","NOSE",,1,"en","P",1,5301,5301,,,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000374017","NOSE_000000374017",2009-10-17 21:08:31.0,",","NOSE",2,1,"en","P",1,5236,5236,"Good","

Completed by gu...

",,4,1,1,0,1,0,0,0,2,0,"active" "000000379789","NOSE_000000379789",2009-12-01 20:07:19.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000620454","NOSE_000000620454",2009-06-13 09:28:30.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000262718","NOSE_000000262718",2009-12-04 17:02:29.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000382156","NOSE_000000382156",2009-06-13 09:56:37.0,",","NOSE",2,1,"fr","P",1,5287,5287,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000503926","NOSE_000000503926",2010-06-05 07:06:59.0,",","NOSE",,1,"en","P",1,,,,,,2,3,1,0,1,0,0,1,2,0,"active" "000000596908","NOSE_000000596908",2009-04-30 01:04:29.0,",","NOSE",2,1,"fr","P",1,5098,5098,"Good",,"1",3,0,1,0,1,0,1,1,0,2,"active" "000000263501","NOSE_000000263501",2009-11-04 15:33:40.0,",","NOSE",2,1,"en","P",1,5026,5410,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000888918","NOSE_000000888918",2009-04-29 19:29:44.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,"1",3,2,2,0,0,0,0,0,0,4,"active" "000000320676","NOSE_000000320676",2009-04-30 01:11:40.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000144012","NOSE_000000144012",2010-06-21 07:05:03.0,",","NOSE",,1,"en","P",1,,,,,,2,2,1,0,0,0,1,1,0,0,"active" "000000981977","NOSE_000000981977",2009-04-29 19:27:10.0,",","NOSE",2,1,"en","P",1,5359,5359,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000761928","NOSE_000000761928",2009-04-30 01:26:00.0,",","NOSE",2,1,"de","P",1,5527,5527,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000706894","NOSE_000000706894",2009-04-30 01:34:09.0,",","NOSE",2,1,"de","P",1,5850,5484,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000985794","NOSE_000000985794",2009-08-20 03:46:36.0,",","NOSE",2,1,"de","P",1,5203,5203,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000947536","NOSE_000000947536",2010-01-05 15:14:44.0,",","NOSE",2,1,"fr","P",1,5383,5383,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000782112","NOSE_000000782112",2009-10-03 20:56:32.0,",","NOSE",2,1,"de","P",1,5315,5315,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000793800","NOSE_000000793800",2009-07-31 19:33:08.0,",","NOSE",2,1,"en","P",1,5454,5454,"Good",,,2,2,1,0,0,0,0,0,2,0,"active" "000000498415","NOSE_000000498415",2009-10-12 20:40:50.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000595391","NOSE_000000595391",2009-04-29 19:37:47.0,",","NOSE",2,1,"de","P",1,5331,5331,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000345837","NOSE_000000345837",2010-04-20 07:06:04.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000245805","NOSE_000000245805",2009-04-29 19:25:45.0,",","NOSE",2,1,"fr","P",1,5687,5687,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000565526","NOSE_000000565526",2009-04-29 19:42:06.0,",","NOSE",2,1,"de","P",1,5416,5419,"Good",,"1",3,1,1,0,0,0,1,1,0,0,"active" "000000589466","NOSE_000000589466",2009-08-31 15:54:59.0,",","NOSE",2,1,"de","P",1,5410,5410,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000972266","NOSE_000000972266",2009-12-04 17:01:40.0,",","NOSE",1,1,"en","P",1,5212,5212,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000416345","NOSE_000000416345",2010-07-08 13:44:00.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000462924","NOSE_000000462924",2009-05-18 10:32:27.0,",","NOSE",2,1,"de","P",1,4884,4884,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000490045","NOSE_000000490045",2009-04-29 19:23:28.0,",","NOSE",2,1,"de","P",1,5383,5383,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000084633","NOSE_000000084633",2009-09-02 23:46:30.0,",","NOSE",2,1,"en","P",1,5241,5241,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000287039","NOSE_000000287039",2009-12-04 16:47:02.0,",","NOSE",2,1,"en","P",1,5048,5055,"Good",,,4,1,1,0,0,0,3,0,0,0,"active" "000000535518","NOSE_000000535518",2010-07-08 12:44:25.0,",","NOSE",2,1,"fr","P",1,5208,5208,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000701430","NOSE_000000701430",2009-06-13 10:03:30.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000202173","NOSE_000000202173",2009-06-03 10:45:22.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000840863","NOSE_000000840863",2009-12-04 16:45:46.0,",","NOSE",2,1,"en","P",1,5065,5065,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000523261","NOSE_000000523261",2009-04-30 02:11:12.0,",","NOSE",2,1,"de","P",1,5459,5459,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000809806","NOSE_000000809806",2009-04-30 02:19:55.0,",","NOSE",2,1,"de","P",1,5305,5305,"Good",,"1",2,1,0,0,1,0,1,0,0,0,"active" "000000514864","NOSE_000000514864",2009-04-30 02:27:44.0,",","NOSE",2,1,"de","P",1,5602,5250,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000683868","NOSE_000000683868",2010-02-05 10:14:14.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000536913","NOSE_000000536913",2009-12-04 17:03:46.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000063160","NOSE_000000063160",2009-12-22 20:03:17.0,",","NOSE",,1,"fr","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000465447","NOSE_000000465447",2009-12-04 17:03:12.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000968235","NOSE_000000968235",2009-04-29 19:42:32.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000938507","NOSE_000000938507",2009-04-29 19:27:35.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000573086","NOSE_000000573086",2009-04-30 02:54:14.0,",","NOSE",2,1,"en","P",1,5014,5014,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000396968","NOSE_000000396968",2010-06-02 07:05:28.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000931489","NOSE_000000931489",2009-10-22 22:43:43.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000830446","NOSE_000000830446",2009-11-22 20:07:59.0,",","NOSE",2,1,"en","P",1,5036,5036,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000482980","NOSE_000000482980",2009-04-30 03:02:54.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000820606","NOSE_000000820606",2009-11-04 15:33:58.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000986669","NOSE_000000986669",2009-04-30 03:12:04.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000100739","NOSE_000000100739",2009-04-29 19:37:53.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,"1",4,0,1,0,1,0,0,0,0,0,"active" "000000450559","NOSE_000000450559",2009-04-30 03:30:11.0,",","NOSE",2,1,"fr","P",1,5096,5096,"Good",,"1",4,1,1,0,0,0,0,0,0,2,"active" "000000200530","NOSE_000000200530",2009-04-30 03:38:51.0,",","NOSE",2,1,"de","P",1,5777,5425,"Good",,"1",1,2,1,0,0,0,0,0,0,0,"active" "000000329772","NOSE_000000329772",2010-06-03 07:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000636740","NOSE_000000636740",2010-07-09 07:21:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000742825","NOSE_000000742825",2009-04-30 03:48:00.0,",","NOSE",1,1,"fr","P",1,5280,5280,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000921165","NOSE_000000921165",2010-03-13 07:05:37.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000602673","NOSE_000000602673",2009-04-30 03:56:53.0,",","NOSE",2,1,"de","P",1,5391,5391,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000400354","NOSE_000000400354",2009-10-16 05:16:21.0,",","NOSE",2,1,"de","P",1,5088,5088,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000013218","NOSE_000000013218",2009-12-04 16:40:53.0,",","NOSE",2,1,"de","P",1,5177,5177,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781265","NOSE_000000781265",2009-12-04 17:02:56.0,",","NOSE",,1,"en","P",1,,,,,,3,1,3,0,0,0,0,0,0,0,"active" "000000389392","NOSE_000000389392",2010-04-19 07:07:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000007487","NOSE_000000007487",2009-06-13 11:02:40.0,",","NOSE",2,1,"de","P",1,5281,5281,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000908763","NOSE_000000908763",2009-08-06 13:31:34.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000751132","NOSE_000000751132",2009-10-23 20:31:50.0,",","NOSE",2,1,"en","P",1,5437,5437,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000653799","NOSE_000000653799",2009-04-30 04:06:25.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000905669","NOSE_000000905669",2009-04-30 04:15:40.0,",","NOSE",2,1,"fr","P",1,5441,5441,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000758036","NOSE_000000758036",2009-12-04 17:03:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000745026","NOSE_000000745026",2009-07-16 14:57:46.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000088859","NOSE_000000088859",2009-07-07 11:02:50.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000021716","NOSE_000000021716",2009-04-30 04:23:02.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000853302","NOSE_000000853302",2009-06-30 01:02:00.0,",","NOSE",2,1,"de","P",1,5292,5292,"Good",,,4,0,1,0,0,0,1,0,0,4,"active" "000000940171","NOSE_000000940171",2009-06-13 11:30:26.0,",","NOSE",,1,"de","P",1,5014,5014,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000300678","NOSE_000000300678",2010-02-11 07:04:26.0,",","NOSE",2,1,"de","P",1,5306,5306,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000726489","NOSE_000000726489",2010-01-28 07:03:35.0,",","NOSE",2,1,"de","P",1,5467,5467,"Good","

commanding the ...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000633751","NOSE_000000633751",2009-12-04 16:53:28.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,2,0,0,0,"active" "000000648697","NOSE_000000648697",2009-07-07 11:31:52.0,",","NOSE",2,1,"de","P",1,5312,5312,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000878794","NOSE_000000878794",2010-07-10 07:08:21.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000506754","NOSE_000000506754",2009-04-29 19:34:27.0,",","NOSE",2,1,"de","P",1,5419,5419,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000913951","NOSE_000000913951",2009-06-30 01:30:31.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,,4,0,1,1,1,0,0,1,0,0,"active" "000000598188","NOSE_000000598188",2009-07-31 19:16:10.0,",","NOSE",2,1,"de","P",1,5381,5381,"Good",,,4,0,1,0,0,1,1,2,0,0,"active" "000000017250","NOSE_000000017250",2009-04-29 19:28:03.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000728885","NOSE_000000728885",2009-12-04 16:52:20.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000701368","NOSE_000000701368",2009-08-20 04:19:45.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good","

English was not...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000648110","NOSE_000000648110",2009-04-29 19:28:19.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",4,2,3,1,0,0,0,1,2,2,"active" "000000546943","NOSE_000000546943",2010-04-09 07:04:25.0,",","NOSE",,1,"en","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000368546","NOSE_000000368546",2009-09-04 23:45:14.0,",","NOSE",,1,"en","P",1,5171,5171,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000751380","NOSE_000000751380",2009-04-29 19:42:01.0,",","NOSE",2,1,"en","P",1,5103,5103,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000167380","NOSE_000000167380",2009-06-13 11:59:10.0,",","NOSE",2,1,"en","P",1,5073,5073,"Good",,"1",4,0,1,0,1,0,1,1,0,0,"active" "000000737050","NOSE_000000737050",2009-07-31 19:16:29.0,",","NOSE",2,1,"de","P",1,5436,5436,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000201507","NOSE_000000201507",2010-03-17 07:04:44.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000567118","NOSE_000000567118",2009-04-30 05:04:00.0,",","NOSE",2,1,"de","P",1,5163,5163,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000277045","NOSE_000000277045",2009-07-31 19:34:21.0,",","NOSE",2,1,"de","P",1,5437,5437,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000118418","NOSE_000000118418",2009-04-29 19:38:22.0,",","NOSE",2,1,"en","P",1,5453,5453,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000444180","NOSE_000000444180",2009-12-04 17:01:35.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000812127","NOSE_000000812127",2010-06-21 12:04:07.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,,1,1,4,0,0,3,1,3,0,4,"active" "000000642016","NOSE_000000642016",2010-07-08 12:38:24.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000461435","NOSE_000000461435",2010-05-29 07:05:45.0,",","NOSE",,1,"de","P",1,5133,5133,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000998461","NOSE_000000998461",2009-04-29 19:16:17.0,",","NOSE",2,2,"de","P",1,5221,5221,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000321190","NOSE_000000321190",2009-12-07 15:26:54.0,",","NOSE",2,1,"fr","P",1,5128,5128,"Good",,,4,1,1,1,1,0,1,0,0,0,"active" "000000335684","NOSE_000000335684",2009-04-29 19:41:26.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000075536","NOSE_000000075536",2009-12-04 17:02:40.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000310145","NOSE_000000310145",2010-07-15 07:05:46.0,",","NOSE",2,1,"fr","P",1,5003,5003,"Good",,,4,1,1,1,1,1,1,1,4,4,"active" "000000880014","NOSE_000000880014",2009-04-29 19:26:40.0,",","NOSE",2,1,"fr","P",1,5087,5087,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000478875","NOSE_000000478875",2009-12-04 16:40:50.0,",","NOSE",2,1,"de","P",1,5319,5319,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000529052","NOSE_000000529052",2009-08-20 20:41:37.0,",","NOSE",2,1,"de","P",1,4990,4990,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000615719","NOSE_000000615719",2009-08-20 20:41:25.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000534096","NOSE_000000534096",2009-06-13 12:28:07.0,",","NOSE",2,1,"fr","P",1,5309,5309,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000291773","NOSE_000000291773",2009-11-28 20:06:51.0,",","NOSE",,2,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000460609","NOSE_000000460609",2009-07-07 11:32:47.0,",","NOSE",2,1,"en","P",1,4825,5209,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000354852","NOSE_000000354852",2009-09-06 00:09:15.0,",","NOSE",2,1,"de","P",1,5432,5432,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000534499","NOSE_000000534499",2009-12-04 16:52:09.0,",","NOSE",,2,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000516575","NOSE_000000516575",2009-12-04 17:08:41.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000241664","NOSE_000000241664",2009-08-20 04:32:19.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000825920","NOSE_000000825920",2009-06-30 01:31:31.0,",","NOSE",2,1,"fr","P",1,5124,5124,"Good",,,4,2,1,0,0,0,0,0,0,0,"active" "000000739925","NOSE_000000739925",2009-10-14 10:00:42.0,",","NOSE",2,1,"en","P",1,5201,5202,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000019168","NOSE_000000019168",2009-10-22 21:58:06.0,",","NOSE",2,1,"en","P",1,5152,5536,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000387826","NOSE_000000387826",2009-12-04 16:47:07.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000686297","NOSE_000000686297",2009-11-04 15:34:05.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000679066","NOSE_000000679066",2010-04-19 07:04:55.0,",","NOSE",2,1,"fr","P",1,5231,5231,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000641375","NOSE_000000641375",2009-12-04 16:43:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000667411","NOSE_000000667411",2009-04-29 19:33:27.0,",","NOSE",2,1,"en","P",1,5476,5476,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000050453","NOSE_000000050453",2009-07-31 19:16:51.0,",","NOSE",2,1,"de","P",1,5285,5285,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000813321","NOSE_000000813321",2009-06-30 01:47:04.0,",","NOSE",2,1,"de","P",1,5510,5510,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000298927","NOSE_000000298927",2010-06-12 07:05:54.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000304185","NOSE_000000304185",2010-03-23 07:06:37.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000137904","NOSE_000000137904",2009-09-12 20:22:18.0,",","NOSE",2,1,"de","P",1,5347,5347,"Good",,,3,0,1,0,0,0,2,0,0,0,"active" "000000882003","NOSE_000000882003",2009-04-29 19:26:23.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000210812","NOSE_000000210812",2009-04-30 06:04:24.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018949","NOSE_000000018949",2010-04-20 07:04:43.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000369113","NOSE_000000369113",2009-06-03 10:44:08.0,",","NOSE",2,2,"en","P",1,5386,5386,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000447675","NOSE_000000447675",2009-04-29 19:30:15.0,",","NOSE",2,1,"en","P",1,5391,5391,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000680149","NOSE_000000680149",2009-06-13 13:24:30.0,",","NOSE",2,1,"de","P",1,4934,4934,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000089995","NOSE_000000089995",2009-04-29 19:29:28.0,",","NOSE",2,1,"de","P",1,4913,4913,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000955685","NOSE_000000955685",2009-05-18 10:32:29.0,",","NOSE",2,1,"en","P",1,5138,5138,"Good",,"1",3,0,1,0,1,0,1,1,0,0,"active" "000000242124","NOSE_000000242124",2009-12-04 16:52:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000131865","NOSE_000000131865",2009-04-29 19:34:25.0,",","NOSE",2,1,"fr","P",1,5280,5280,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000441942","NOSE_000000441942",2009-04-29 19:26:29.0,",","NOSE",2,2,"de","P",1,5415,5464,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000822322","NOSE_000000822322",2009-04-30 06:49:42.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,"1",3,0,1,0,0,0,1,0,0,2,"active" "000000880498","NOSE_000000880498",2009-04-29 19:37:09.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000107442","NOSE_000000107442",2009-09-19 20:20:22.0,",","NOSE",2,1,"fr","P",1,5244,5244,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000806721","NOSE_000000806721",2009-04-29 19:27:27.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000306433","NOSE_000000306433",2009-12-04 16:46:01.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000984651","NOSE_000000984651",2009-04-29 19:32:52.0,",","NOSE",2,1,"en","P",1,5104,5104,"Good",,"1",3,1,1,0,1,0,1,1,4,0,"active" "000000469556","NOSE_000000469556",2009-12-04 16:47:05.0,",","NOSE",2,1,"en","P",1,5219,5219,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000999690","NOSE_000000999690",2009-12-04 16:53:20.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000507203","NOSE_000000507203",2009-04-29 19:33:47.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",1,0,1,0,1,0,1,0,0,0,"active" "000000056273","NOSE_000000056273",2009-07-31 19:17:10.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,2,0,"active" "000000760648","NOSE_000000760648",2009-06-30 02:12:42.0,",","NOSE",2,1,"fr","P",1,5180,5180,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000491355","NOSE_000000491355",2009-12-04 17:01:47.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000583673","NOSE_000000583673",2009-04-29 19:19:35.0,",","NOSE",2,1,"de","P",1,5324,5324,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000621030","NOSE_000000621030",2010-06-30 07:04:52.0,",","NOSE",2,1,"en","P",1,5404,5404,"Good",,,3,0,1,0,0,0,0,1,0,0,"active" "000000918368","NOSE_000000918368",2010-05-31 07:05:14.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000166767","NOSE_000000166767",2009-04-29 19:23:52.0,",","NOSE",2,1,"en","P",1,5288,5288,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000653807","NOSE_000000653807",2009-12-04 16:54:08.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000561983","NOSE_000000561983",2010-05-23 07:04:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000680867","NOSE_000000680867",2010-03-08 07:04:01.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,,4,2,3,0,0,0,0,1,0,0,"active" "000000092149","NOSE_000000092149",2010-03-28 07:04:24.0,",","NOSE",2,1,"fr","P",1,5263,5263,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000632048","NOSE_000000632048",2010-07-08 12:43:29.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000243571","NOSE_000000243571",2009-10-11 20:35:37.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000144749","NOSE_000000144749",2009-12-04 17:04:13.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000837481","NOSE_000000837481",2009-04-30 07:55:10.0,",","NOSE",2,1,"de","P",1,5318,5318,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000322347","NOSE_000000322347",2010-03-17 07:04:21.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000942393","NOSE_000000942393",2009-12-04 16:52:25.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,1,0,0,1,0,0,4,"active" "000000907892","NOSE_000000907892",2009-08-20 04:47:47.0,",","NOSE",1,1,"en","P",1,5363,5363,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000233177","NOSE_000000233177",2009-12-04 17:03:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000661315","NOSE_000000661315",2009-08-20 06:09:27.0,",","NOSE",2,1,"de","P",1,5071,5071,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000855012","NOSE_000000855012",2009-04-29 19:33:01.0,",","NOSE",2,1,"en","P",1,5394,5394,"Good",,"1",4,0,2,0,0,0,1,0,0,0,"active" "000000188483","NOSE_000000188483",2009-04-29 19:27:05.0,",","NOSE",2,1,"en","P",1,5353,5353,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000852364","NOSE_000000852364",2009-04-30 08:23:20.0,",","NOSE",2,1,"en","P",1,5119,5119,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000651771","NOSE_000000651771",2009-08-20 04:57:34.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000201693","NOSE_000000201693",2009-06-13 13:54:26.0,",","NOSE",2,2,"fr","P",1,5561,5561,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000650347","NOSE_000000650347",2009-04-30 08:23:42.0,",","NOSE",2,1,"fr","P",1,5227,5227,"Good",,"1",4,0,1,0,0,0,0,1,0,0,"active" "000000232920","NOSE_000000232920",2009-08-20 05:12:33.0,",","NOSE",2,1,"de","P",1,5497,5497,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000827003","NOSE_000000827003",2010-07-08 13:01:16.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,1,0,0,3,0,0,4,"active" "000000170915","NOSE_000000170915",2009-04-29 19:30:53.0,",","NOSE",2,1,"en","P",1,5336,5336,"Good",,"1",3,1,0,0,1,0,0,0,0,0,"active" "000000284789","NOSE_000000284789",2009-06-13 14:23:34.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000259295","NOSE_000000259295",2009-04-29 19:35:34.0,",","NOSE",2,1,"en","P",1,5379,5379,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000062661","NOSE_000000062661",2009-11-04 15:34:23.0,",","NOSE",2,1,"fr","P",1,5579,5579,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000785511","NOSE_000000785511",2010-04-16 07:05:14.0,",","NOSE",2,1,"fr","P",1,5335,5335,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000066718","NOSE_000000066718",2009-04-29 19:40:59.0,",","NOSE",2,1,"en","P",1,5348,5348,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000259654","NOSE_000000259654",2010-07-14 07:19:43.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000803815","NOSE_000000803815",2009-04-29 19:19:42.0,",","NOSE",2,1,"de","P",1,5288,5288,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000614784","NOSE_000000614784",2009-11-04 15:34:41.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000266291","NOSE_000000266291",2009-04-29 19:37:50.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000198965","NOSE_000000198965",2009-06-13 14:50:59.0,",","NOSE",2,1,"de","P",1,5389,5389,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000691123","NOSE_000000691123",2009-09-17 10:11:04.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000372966","NOSE_000000372966",2009-04-29 19:30:00.0,",","NOSE",2,1,"en","P",1,5327,5327,"Good",,"1",4,1,2,0,1,0,1,0,0,2,"active" "000000741844","NOSE_000000741844",2010-02-05 10:08:40.0,",","NOSE",2,1,"de","P",1,5410,5410,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000828232","NOSE_000000828232",2009-07-31 19:17:31.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000157998","NOSE_000000157998",2009-08-20 09:15:05.0,",","NOSE",2,1,"de","P",1,5201,5201,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000003586","NOSE_000000003586",2009-10-06 10:18:55.0,",","NOSE",2,1,"de","P",1,5168,5168,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000447163","NOSE_000000447163",2009-04-30 09:28:02.0,",","NOSE",2,1,"fr","P",1,5169,5169,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000345690","NOSE_000000345690",2009-12-04 16:56:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000885929","NOSE_000000885929",2010-07-08 12:38:38.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000940994","NOSE_000000940994",2010-01-13 11:40:36.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000811368","NOSE_000000811368",2009-12-04 17:01:37.0,",","NOSE",,1,"en","P",1,,,,,,2,2,2,0,0,0,0,0,0,0,"active" "000000239596","NOSE_000000239596",2010-01-15 07:03:37.0,",","NOSE",2,1,"fr","P",1,5048,5048,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000593697","NOSE_000000593697",2009-12-04 17:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000369862","NOSE_000000369862",2009-10-17 02:43:18.0,",","NOSE",2,1,"en","P",1,5406,5406,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000849072","NOSE_000000849072",2009-04-29 19:24:50.0,",","NOSE",2,1,"en","P",1,5228,5228,"Good",,"1",4,3,2,0,0,0,0,0,0,0,"active" "000000921318","NOSE_000000921318",2009-11-21 20:06:43.0,",","NOSE",2,1,"fr","P",1,,,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000202556","NOSE_000000202556",2009-04-30 09:55:48.0,",","NOSE",2,1,"fr","P",1,5413,5413,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000565730","NOSE_000000565730",2009-11-04 15:35:00.0,",","NOSE",2,1,"en","P",1,5215,5215,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000390587","NOSE_000000390587",2009-10-03 21:13:37.0,",","NOSE",2,1,"en","P",1,5224,5224,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000931504","NOSE_000000931504",2009-04-29 19:29:25.0,",","NOSE",2,1,"en","P",1,5312,5312,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000022598","NOSE_000000022598",2010-03-02 07:09:36.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,,4,0,1,1,1,0,2,1,0,4,"active" "000000501033","NOSE_000000501033",2009-04-30 10:26:31.0,",","NOSE",3,1,"de","P",1,5362,5367,"Good",,"1",3,0,1,0,0,0,0,0,0,2,"active" "000000141270","NOSE_000000141270",2009-04-29 19:19:05.0,",","NOSE",2,1,"de","P",1,5488,5488,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000524289","NOSE_000000524289",2009-08-20 05:27:46.0,",","NOSE",2,1,"en","P",1,5372,5372,"Good",,,2,2,1,0,0,0,0,0,2,0,"active" "000000147235","NOSE_000000147235",2009-12-04 16:41:00.0,",","NOSE",2,1,"de","P",1,5186,5186,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000197552","NOSE_000000197552",2009-04-30 10:55:34.0,",","NOSE",2,1,"de","P",1,5301,5301,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000310143","NOSE_000000310143",2009-04-29 19:27:32.0,",","NOSE",2,1,"de","P",1,5386,5386,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000597142","NOSE_000000597142",2009-04-30 11:32:48.0,",","NOSE",2,1,"en","P",1,5329,5329,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000370689","NOSE_000000370689",2010-04-08 07:04:48.0,",","NOSE",2,1,"fr","P",1,5590,5590,"Good",,,3,0,1,0,0,0,1,0,0,2,"active" "000000365936","NOSE_000000365936",2009-07-31 19:17:49.0,",","NOSE",2,1,"fr","P",1,5740,5740,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000361818","NOSE_000000361818",2010-06-30 07:05:41.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000340544","NOSE_000000340544",2009-12-04 16:46:51.0,",","NOSE",2,1,"en","P",1,5034,5034,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000898518","NOSE_000000898518",2010-06-23 07:38:19.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000552797","NOSE_000000552797",2009-08-20 05:40:34.0,",","NOSE",2,1,"de","P",1,5412,5412,"Good",,,4,0,1,0,0,0,1,1,0,0,"active" "000000403977","NOSE_000000403977",2010-02-15 10:30:12.0,",","NOSE",2,1,"en","P",1,5141,5141,"Good",,,4,0,1,0,0,0,1,0,0,0,"active" "000000329823","NOSE_000000329823",2009-07-31 19:18:07.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000617315","NOSE_000000617315",2009-04-30 11:45:27.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000481630","NOSE_000000481630",2009-04-30 11:57:05.0,",","NOSE",2,1,"de","P",1,5406,5406,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000064158","NOSE_000000064158",2009-04-29 19:34:22.0,",","NOSE",2,1,"fr","P",1,5094,5094,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000310626","NOSE_000000310626",2009-06-13 15:19:20.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000451549","NOSE_000000451549",2009-12-04 16:52:28.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000985310","NOSE_000000985310",2009-12-04 16:48:57.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000588989","NOSE_000000588989",2009-06-13 15:40:16.0,",","NOSE",2,1,"en","P",1,5386,5386,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000787771","NOSE_000000787771",2009-04-30 12:18:50.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000202391","NOSE_000000202391",2009-12-03 20:07:25.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000817376","NOSE_000000817376",2010-03-03 07:03:53.0,",","NOSE",2,1,"en","P",1,5026,5026,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000268854","NOSE_000000268854",2009-04-29 19:34:10.0,",","NOSE",1,1,"fr","P",1,5563,5563,"Good",,"9",3,0,2,0,0,0,0,0,0,0,"active" "000000876084","NOSE_000000876084",2009-04-29 19:26:10.0,",","NOSE",2,1,"de","P",1,5522,5522,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000110194","NOSE_000000110194",2009-04-29 19:30:06.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000558786","NOSE_000000558786",2009-07-15 16:35:06.0,",","NOSE",2,1,"fr","P",1,5130,5130,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000791137","NOSE_000000791137",2009-11-16 10:50:09.0,",","NOSE",,1,"en","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000607495","NOSE_000000607495",2010-04-29 11:42:55.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000494734","NOSE_000000494734",2009-04-29 19:26:48.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000025301","NOSE_000000025301",2009-12-04 16:42:10.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000824072","NOSE_000000824072",2009-12-22 20:03:21.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000823590","NOSE_000000823590",2009-11-04 15:35:14.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000778119","NOSE_000000778119",2009-04-29 19:25:48.0,",","NOSE",2,1,"fr","P",1,5334,5334,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000413899","NOSE_000000413899",2009-04-30 13:32:24.0,",","NOSE",2,1,"en","P",1,5016,5016,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000080285","NOSE_000000080285",2010-03-26 07:04:33.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000949521","NOSE_000000949521",2009-04-30 13:48:47.0,",","NOSE",2,1,"de","P",1,5303,5303,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000432990","NOSE_000000432990",2009-09-08 23:36:34.0,",","NOSE",2,1,"de","P",1,5399,5399,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000395390","NOSE_000000395390",2009-04-30 14:05:12.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,"1",4,1,2,0,0,0,3,1,0,0,"active" "000000012604","NOSE_000000012604",2009-04-30 14:21:27.0,",","NOSE",2,1,"de","P",1,5366,5366,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000375389","NOSE_000000375389",2009-08-20 06:10:05.0,",","NOSE",2,1,"de","P",1,5413,5413,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000395629","NOSE_000000395629",2009-06-30 02:43:05.0,",","NOSE",2,1,"de","P",1,5448,5448,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000425624","NOSE_000000425624",2009-10-22 22:08:37.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000013398","NOSE_000000013398",2009-12-04 17:02:48.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000804429","NOSE_000000804429",2009-04-30 14:37:52.0,",","NOSE",2,1,"de","P",1,5321,5321,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000252290","NOSE_000000252290",2009-12-05 20:07:10.0,",","NOSE",2,1,"fr","P",1,5130,5130,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000789326","NOSE_000000789326",2009-04-29 19:28:57.0,",","NOSE",2,1,"fr","P",1,5313,5313,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000221793","NOSE_000000221793",2010-07-10 07:05:27.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000882535","NOSE_000000882535",2009-04-29 19:31:39.0,",","NOSE",2,1,"en","P",1,5355,5355,"Good",,"1",4,1,2,1,1,0,1,1,2,0,"active" "000000688393","NOSE_000000688393",2009-12-04 16:53:10.0,",","NOSE",,1,"de","P",1,,,,,,4,1,2,1,0,0,2,2,0,4,"active" "000000357426","NOSE_000000357426",2009-04-29 19:32:06.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,"1",3,0,2,0,0,0,0,0,0,0,"active" "000000249743","NOSE_000000249743",2009-11-27 10:18:33.0,",","NOSE",2,1,"en","P",1,5318,5318,"Good",,,2,2,3,0,0,0,0,1,0,0,"active" "000000774663","NOSE_000000774663",2009-04-30 15:40:24.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000113197","NOSE_000000113197",2009-04-29 19:40:13.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000943842","NOSE_000000943842",2009-10-22 22:45:00.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000148464","NOSE_000000148464",2009-12-04 16:52:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000983720","NOSE_000000983720",2009-04-30 16:03:17.0,",","NOSE",2,,,,,,,"Missing","

Not completed o...

",,,,,,,,,,,,"active" "000000836229","NOSE_000000836229",2010-07-08 13:55:14.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000886243","NOSE_000000886243",2010-05-19 07:05:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000465021","NOSE_000000465021",2009-04-29 19:42:29.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",4,1,2,0,0,0,0,0,0,0,"active" pyxnat-1.4/pyxnat/tests/scans_tests.py000066400000000000000000000007671374563466300203240ustar00rootroot00000000000000from pyxnat import Interface import os.path as op from . import skip_if_no_network _modulepath = op.dirname(op.abspath(__file__)) fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_global_scan_listing(): assert central.array.scans(project_id='CENTRAL_OASIS_CS', experiment_type='xnat:mrSessionData', scan_type='xnat:mrScanData' ) pyxnat-1.4/pyxnat/tests/search_test.py000066400000000000000000000055371374563466300202770ustar00rootroot00000000000000from uuid import uuid1 from pyxnat import Interface from pyxnat import jsonutil import os.path as op fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) search_name = uuid1().hex search_template_name = uuid1().hex def test_datatypes(): assert 'xnat:subjectData' in central.inspect.datatypes() def test_datafields(): assert 'xnat:subjectData/DOB' in \ central.inspect.datatypes('xnat:subjectData') assert 'xnat:subjectData/DOB' in \ central.inspect.datatypes('xnat:subjectData', '*') def test_fieldvalues(): assert len(central.inspect.field_values('xnat:subjectData/SUBJECT_ID') ) != 0 def test_inspect_resources(): assert 'OAS1_0440_MR1' in \ central.inspect.experiment_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS') assert 'OAS1_0286_MR1_FSEG' in \ central.inspect.assessor_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS') assert 'mpr-1' in \ central.inspect.scan_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS') # just coverage assert isinstance(central.inspect.experiment_types(), list) assert isinstance(central.inspect.assessor_types(), list) assert isinstance(central.inspect.scan_types(), list) assert isinstance(central.inspect.reconstruction_types(), list) assert isinstance(central.inspect.project_values(), list) assert isinstance(central.inspect.subject_values(), list) def test_search(): results = central.select( 'xnat:mrSessionData', central.inspect.datatypes('xnat:mrSessionData') ).where([('xnat:mrSessionData/SCANNER', 'LIKE', '*GE*'), 'AND']) assert isinstance(results, jsonutil.JsonTable) def test_save_search(): central.manage.search.save( search_name, 'xnat:mrSessionData', central.inspect.datatypes('xnat:mrSessionData'), [('xnat:mrSessionData/SCANNER', 'LIKE', '*GE*'), 'AND']) assert search_name in central.manage.search.saved() def test_get_search(): results = central.manage.search.get(search_name) assert isinstance(results, jsonutil.JsonTable) def test_delete_search(): central.manage.search.delete(search_name) assert search_name not in central.manage.search.saved() def test_save_search_template(): central.manage.search.save_template( search_template_name, 'xnat:mrSessionData', central.inspect.datatypes('xnat:mrSessionData'), [('xnat:mrSessionData/SCANNER', 'LIKE', '*GE*'), 'AND'] ) assert search_template_name in central.manage.search.saved_templates() def test_delete_search_template(): central.manage.search.delete_template(search_template_name) assert search_template_name not in \ central.manage.search.saved_templates() pyxnat-1.4/pyxnat/tests/select_test.py000066400000000000000000000061771374563466300203120ustar00rootroot00000000000000from pyxnat import select def test_switch_to_singular(): assert select.compute('/projects/nosetests') == ['/project/nosetests'] def test_switch_to_plural(): assert select.compute('/project') == ['/projects/*'] def test_complete_stars_plural(): assert select.compute('/projects/subjects/experiments') == \ ['/projects/*/subjects/*/experiments/*'] def test_complete_stars_singular(): assert select.compute('/project/subject/experiment') == \ ['/projects/*/subjects/*/experiments/*'] def test_simple_root_expand(): assert select.compute('//experiments') == \ ['/projects/*/subjects/*/experiments/*'] def test_simple_level_expand(): assert select.compute('/projects/IMAGEN//experiments') == \ ['/project/IMAGEN/subjects/*/experiments/*'] def test_leaf_level_expand(): assert set(select.compute('//files')) == \ set(['/projects/*/subjects/*/experiments/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/scans/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/*', '/projects/*/subjects/*/resources/*/files/*', '/projects/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/*']) def test_double_level_expand(): assert set(select.compute('//experiments//files')) == \ set(['/projects/*/subjects/*/experiments/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/scans/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/*']) def test_compute_all(): assert set(select.compute('/projects/nosetests//experiments/*Session*//files/myfile.txt')) == \ set(['/project/nosetests/subjects/*/experiments/*Session*/resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/reconstructions/*/in_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/scans/*/resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/out_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/in_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/reconstructions/*/out_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/resources/*/file/myfile.txt']) pyxnat-1.4/pyxnat/tests/sess.xml000066400000000000000000000022531374563466300171100ustar00rootroot00000000000000 2014-12-09 14:23:50 Centre Medic Diagnostic Alomar GEMSGEMS /data/xnat/prearchive1/nosetests/20170218_212344921/1432768 10001 10001 1991-04-30 3.0 pyxnat-1.4/pyxnat/tests/sessionmirror_test.py000066400000000000000000000030461374563466300217410ustar00rootroot00000000000000import sys import os.path as op import pyxnat from . import skip_if_no_network _modulepath = op.dirname(op.abspath(pyxnat.__file__)) dd = op.join(op.split(_modulepath)[0], 'bin') sys.path.append(dd) dest_project = 'testing_new' @skip_if_no_network def test_001_sessionmirror(): from sessionmirror import create_parser, main parser = create_parser() cfg = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = pyxnat.Interface(config=cfg) e = 'CENTRAL_E74609' args = ['--h1', cfg, '--h2', cfg, '-e', e, '-p', dest_project] args = parser.parse_args(args) main(args) central.array.experiments(experiment_id=e, columns=['subject_label']).data[0] @skip_if_no_network def test_002_deletesubject(): print('DELETING') cfg = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = pyxnat.Interface(config=cfg) e = 'CENTRAL_E74609' e0 = central.array.experiments(experiment_id=e, columns=['subject_label', 'label']).data[0] subject_label = e0['subject_label'] experiment_label = e0['label'] e1 = central.array.experiments(project_id=dest_project, subject_label=subject_label, experiment_label=experiment_label, columns=['subject_id']).data[0] p = central.select.project(dest_project) e2 = p.subject(e1['subject_ID']).experiment(e1['ID']) assert(e2.exists()) e2.delete() assert(not e2.exists()) pyxnat-1.4/pyxnat/tests/test_resource_functions.py000066400000000000000000000005501374563466300227370ustar00rootroot00000000000000import os.path as op from pyxnat import Interface fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) def test_ashs_volumes(): r = central.select.experiment('CENTRAL02_E01603').resource('ASHS') hv = r.volumes() v = hv.query('region=="CA1" & side=="left"')['volume'].tolist()[0] assert(v == 1287.675) pyxnat-1.4/pyxnat/tests/uriutil_test.py000066400000000000000000000033031374563466300205140ustar00rootroot00000000000000from pyxnat import uriutil def test_translate_uri(): assert uriutil.translate_uri('/assessors/out_resources/files') == \ '/assessors/out/resources/files' assert uriutil.translate_uri('/assessors/out_resource/files') == \ '/assessors/out/resource/files' assert uriutil.translate_uri('/assessors/in_resources/files') == \ '/assessors/in/resources/files' assert uriutil.translate_uri('/assessors/in_resource/files') == \ '/assessors/in/resource/files' def test_inv_translate_uri(): assert uriutil.inv_translate_uri('/assessors/out/resources/files') == \ '/assessors/out_resources/files' assert uriutil.inv_translate_uri('/assessors/out/resource/files') == \ '/assessors/out_resource/files' assert uriutil.inv_translate_uri('/assessors/in/resources/files') == \ '/assessors/in_resources/files' assert uriutil.inv_translate_uri('/assessors/in/resource/files') == \ '/assessors/in_resource/files' def test_join_uri(): uri = uriutil.join_uri('/projects', 'project_id', 'subjects', 'subject_id') assert uri == '/projects/project_id/subjects/subject_id' def test_uri_last(): assert uriutil.uri_last('/projects/1/subjects/2') == '2' def test_uri_nextlast(): assert uriutil.uri_nextlast('/projects/1/subjects/2') == 'subjects' def test_uri_parent(): uri = uriutil.uri_parent('/projects/1/subjects/2') assert uri == '/projects/1/subjects' def test_uri_grandparent(): uri = uriutil.uri_grandparent('/projects/1/subjects/2') assert uri == '/projects/1' def test_uri_split(): uri = uriutil.uri_split('/projects/1/subjects/2') assert uri == ['/projects/1/subjects', '2'] pyxnat-1.4/pyxnat/tests/user_and_project_management_test.py000066400000000000000000000071711374563466300245500ustar00rootroot00000000000000from pyxnat import Interface from requests.exceptions import ConnectionError import os.path as op from nose import SkipTest from functools import wraps from nose.plugins.attrib import attr fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') def docker_available(func=None): '''Skip test completely if no Docker-based XNAT instance available ''' def check_and_raise(): x = Interface(config='.xnat.cfg') try: x.head('') list(x.select.projects()) print('Docker instance found.') except (ConnectionError, KeyError): print('Skipping it.') raise SkipTest('Docker-based XNAT instance unavailable') if func: @wraps(func) @attr('network') @attr('docker_available') def newfunc(*args, **kwargs): check_and_raise() return func(*args, **kwargs) return newfunc else: check_and_raise() @docker_available def test_users(): x = Interface(config='.xnat.cfg') assert isinstance(x.manage.users(), list) @docker_available def test_user_firstname(): x = Interface(config='.xnat.cfg') assert x.manage.users.firstname('admin') == 'Admin' @docker_available def test_user_lastname(): x = Interface(config='.xnat.cfg') assert x.manage.users.lastname('admin') == 'Admin' @docker_available def test_user_email(): x = Interface(config='.xnat.cfg') assert x.manage.users.email('admin') == \ 'fake@fake.fake' @docker_available def test_user_id(): x = Interface(config='.xnat.cfg') assert x.manage.users.id('admin') == '1' @docker_available def test_add_remove_user(): x = Interface(config='.xnat.cfg') x.select.project('nosetests5').remove_user('admin') x.select.project('nosetests5').add_user('admin', 'collaborator') assert 'admin' in x.select.project('nosetests5').collaborators() x.select.project('nosetests5').remove_user('admin') assert 'admin' not in x.select.project('nosetests5').collaborators() x.select.project('nosetests5').add_user('admin', 'owner') @docker_available def test_project_accessibility(): x = Interface(config='.xnat.cfg') print(x.select.project('nosetests5').accessibility()) assert x.select.project('nosetests5').accessibility() in \ [b'public', b'protected', b'private'] x.select.project('nosetests5').set_accessibility('private') assert x.select.project('nosetests5').accessibility() == b'private' x.select.project('nosetests5').set_accessibility('protected') assert x.select.project('nosetests5').accessibility() == b'protected' @docker_available def test_create_xml(): x = Interface(config='.xnat.cfg') _modulepath = op.dirname(op.abspath(__file__)) p = x.select.project('nosetests') s = p.subject('10001') e = s.experiment('10001_MR') fp = op.join(_modulepath, 'sess.xml') assert(op.isfile(fp)) e.create(xml=fp) xml = e.get().decode() assert('Alomar' in xml) def test_project_users(): x = Interface(config=fp) assert isinstance(x.select.project('nosetests5').users(), list) def test_project_owners(): x = Interface(config=fp) assert isinstance(x.select.project('nosetests5').owners(), list) def test_project_members(): x = Interface(config=fp) assert isinstance(x.select.project('nosetests5').members(), list) def test_project_collaborators(): x = Interface(config=fp) assert isinstance(x.select.project('nosetests5').collaborators(), list) def test_project_user_role(): x = Interface(config=fp) assert x.select.project('nosetests5').user_role('nosetests') == 'owner' pyxnat-1.4/pyxnat/tests/xpass_test.py000066400000000000000000000026211374563466300201570ustar00rootroot00000000000000from pyxnat import xpass def test_find_plus_line(): print("Testing find_plus_line") test = ['hello', '+hello world', ''] assert(xpass.find_plus_line(test) == 'hello world') test2 = ['', 'hello world'] assert(xpass.find_plus_line(test2) is None) test3 = [] assert(xpass.find_plus_line(test3) is None) def test_find_token(): print("Testing find_token") str = "hello,world" assert(xpass.find_token(',', str) == ('hello', 'world')) assert(xpass.find_token(' ', str) is None) def test_parse_xnat_pass(): print("Testing parse_xnat_pass") nothingLine = "" line = "+user@localhost:8080/xnat=password" lineWithSpaces = "+user@localhost:8080/xnat=password " lineWithoutPlus = "user@localhost:8080/xnat=password" lineWithoutUser = "+@localhost:8080/xnat=password" lineWithoutHost = "+user=password" lineWithoutPass = "+user@localhost:8080/xnat" xp = xpass.parse_xnat_pass([nothingLine, line]) assert(xp == {'p': 'password', 'host': 'localhost:8080/xnat', 'u': 'user'}) xp = xpass.parse_xnat_pass([lineWithSpaces]) assert(xp == {'p': 'password', 'host': 'localhost:8080/xnat', 'u': 'user'}) assert(xpass.parse_xnat_pass([lineWithoutPlus]) is None) assert(xpass.parse_xnat_pass([lineWithoutUser]) is None) assert(xpass.parse_xnat_pass([lineWithoutHost]) is None) assert(xpass.parse_xnat_pass([lineWithoutPass]) is None) pyxnat-1.4/pyxnat/tests/xpath_test.py000066400000000000000000000017261374563466300201520ustar00rootroot00000000000000import os.path as op from pyxnat import Interface from . import skip_if_no_network fp = op.join(op.dirname(op.abspath(__file__)), 'central.cfg') central = Interface(config=fp) @skip_if_no_network def test_001_xpath_checkout(): central.xpath.checkout(subjects=['OAS1_0001', 'OAS1_0002']) assert 'OAS1_0001' in central.xpath.subjects() and \ 'OAS1_0002' in central.xpath.subjects() @skip_if_no_network def test_elements(): assert 'fs:region' in central.xpath.elements() @skip_if_no_network def test_keys(): assert 'ID' in central.xpath.keys() @skip_if_no_network def test_values(): assert 'OAS1_0002' in central.xpath.values('ID') @skip_if_no_network def test_element_attrs(): assert isinstance(central.xpath.element_attrs('fs:region'), list) assert set(['SegId', 'hemisphere', 'name']).issubset( central.xpath.element_keys('fs:region')) assert 'Left-Putamen' in \ central.xpath.element_values('fs:region', 'name') pyxnat-1.4/pyxnat/version.py000066400000000000000000000000201374563466300162740ustar00rootroot00000000000000VERSION = '1.4' pyxnat-1.4/requirements-dev.txt000066400000000000000000000002431374563466300167610ustar00rootroot00000000000000lxml>=4.3.2 requests>=2.20 pathlib>=1.0.1 six>=1.15 future>=0.16 # testing nose>=1.2.1 coverage>=3.6 coveralls # extras networkx>=2.2 matplotlib>=2.2 pandas>=0.24 pyxnat-1.4/requirements.txt000066400000000000000000000001011374563466300161760ustar00rootroot00000000000000lxml>=4.3.2 requests>=2.20 pathlib>=1.0.1 six>=1.15 future>=0.16 pyxnat-1.4/setup.cfg000066400000000000000000000002411374563466300145400ustar00rootroot00000000000000[nosetests] verbosity = 2 detailed-errors = 1 with-coverage = 0 cover-package = pyxnat # pdb = 1 # pdb-failures = 1 # with-doctest = 0 # doctest-extension = rst pyxnat-1.4/setup.py000077500000000000000000000044161374563466300144440ustar00rootroot00000000000000#!/usr/bin/env python import setuptools import os.path as op def get_version(): try: import re import os.path as op fp = op.join(op.dirname(__file__), 'pyxnat', 'version.py') s = re.search(r'{}\s*=\s*[\'"]([^\'"]*)[\'"]'.format('VERSION'), open(fp).read()) return s.group(1) except Exception: raise RuntimeError("No version found") this_directory = op.abspath(op.dirname(__file__)) with open(op.join(this_directory, 'README.rst')) as f: long_description = f.read() setuptools.setup(name='pyxnat', version=get_version(), summary='XNAT in Python', author='Yannick Schwartz', author_email='yannick.schwartz@cea.fr', url='http://packages.python.org/pyxnat/', packages=setuptools.find_packages(exclude=('doc*', 'tests')), description='XNAT in Python', long_description=long_description, long_description_content_type='text/x-rst', license='BSD', classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', 'Intended Audience :: Education', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Topic :: Scientific/Engineering', 'Topic :: Utilities', 'Topic :: Internet :: WWW/HTTP', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 2.7', ], platforms='any', scripts=['bin/sessionmirror.py'], install_requires=['lxml>=4.3', 'requests>=2.20', 'pathlib>=1.0', 'six>=1.15', 'future>=0.16'], package_data={'pyxnat': ['README.rst'], }, )