pydicom-0.9.7/000755 000765 000024 00000000000 11726534607 013453 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/000755 000765 000024 00000000000 11726534607 014546 5ustar00darcystaff000000 000000 pydicom-0.9.7/distribute_setup.py000644 000765 000024 00000035665 11726534363 017441 0ustar00darcystaff000000 000000 #!python """Bootstrap distribute installation If you want to use setuptools in your package's setup.py, just include this file in the same directory with it, and add this to the top of your setup.py:: from distribute_setup import use_setuptools use_setuptools() If you want to require a specific version of setuptools, set a download mirror, or use an alternate download directory, you can do so by supplying the appropriate options to ``use_setuptools()``. This file can also be run as a script to install or upgrade setuptools. """ import os import sys import time import fnmatch import tempfile import tarfile from distutils import log try: from site import USER_SITE except ImportError: USER_SITE = None try: import subprocess def _python_cmd(*args): args = (sys.executable,) + args return subprocess.call(args) == 0 except ImportError: # will be used for python 2.3 def _python_cmd(*args): args = (sys.executable,) + args # quoting arguments if windows if sys.platform == 'win32': def quote(arg): if ' ' in arg: return '"%s"' % arg return arg args = [quote(arg) for arg in args] return os.spawnl(os.P_WAIT, sys.executable, *args) == 0 DEFAULT_VERSION = "0.6.10" DEFAULT_URL = "http://pypi.python.org/packages/source/d/distribute/" SETUPTOOLS_FAKED_VERSION = "0.6c11" SETUPTOOLS_PKG_INFO = """\ Metadata-Version: 1.0 Name: setuptools Version: %s Summary: xxxx Home-page: xxx Author: xxx Author-email: xxx License: xxx Description: xxx """ % SETUPTOOLS_FAKED_VERSION def _install(tarball): # extracting the tarball tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) tar = tarfile.open(tarball) _extractall(tar) tar.close() # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) # installing log.warn('Installing Distribute') if not _python_cmd('setup.py', 'install'): log.warn('Something went wrong during the installation.') log.warn('See the error message above.') finally: os.chdir(old_wd) def _build_egg(egg, tarball, to_dir): # extracting the tarball tmpdir = tempfile.mkdtemp() log.warn('Extracting in %s', tmpdir) old_wd = os.getcwd() try: os.chdir(tmpdir) tar = tarfile.open(tarball) _extractall(tar) tar.close() # going in the directory subdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) os.chdir(subdir) log.warn('Now working in %s', subdir) # building an egg log.warn('Building a Distribute egg in %s', to_dir) _python_cmd('setup.py', '-q', 'bdist_egg', '--dist-dir', to_dir) finally: os.chdir(old_wd) # returning the result log.warn(egg) if not os.path.exists(egg): raise IOError('Could not build the egg.') def _do_download(version, download_base, to_dir, download_delay): egg = os.path.join(to_dir, 'distribute-%s-py%d.%d.egg' % (version, sys.version_info[0], sys.version_info[1])) if not os.path.exists(egg): tarball = download_setuptools(version, download_base, to_dir, download_delay) _build_egg(egg, tarball, to_dir) sys.path.insert(0, egg) import setuptools setuptools.bootstrap_install_from = egg def use_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, download_delay=15, no_fake=True): # making sure we use the absolute path to_dir = os.path.abspath(to_dir) was_imported = 'pkg_resources' in sys.modules or \ 'setuptools' in sys.modules try: try: import pkg_resources if not hasattr(pkg_resources, '_distribute'): if not no_fake: _fake_setuptools() raise ImportError except ImportError: return _do_download(version, download_base, to_dir, download_delay) try: pkg_resources.require("distribute>="+version) return except pkg_resources.VersionConflict: e = sys.exc_info()[1] if was_imported: sys.stderr.write( "The required version of distribute (>=%s) is not available,\n" "and can't be installed while this script is running. Please\n" "install a more recent version first, using\n" "'easy_install -U distribute'." "\n\n(Currently using %r)\n" % (version, e.args[0])) sys.exit(2) else: del pkg_resources, sys.modules['pkg_resources'] # reload ok return _do_download(version, download_base, to_dir, download_delay) except pkg_resources.DistributionNotFound: return _do_download(version, download_base, to_dir, download_delay) finally: if not no_fake: _create_fake_setuptools_pkg_info(to_dir) def download_setuptools(version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, delay=15): """Download distribute from a specified location and return its filename `version` should be a valid distribute version number that is available as an egg for download under the `download_base` URL (which should end with a '/'). `to_dir` is the directory where the egg will be downloaded. `delay` is the number of seconds to pause before an actual download attempt. """ # making sure we use the absolute path to_dir = os.path.abspath(to_dir) try: from urllib.request import urlopen except ImportError: from urllib2 import urlopen tgz_name = "distribute-%s.tar.gz" % version url = download_base + tgz_name saveto = os.path.join(to_dir, tgz_name) src = dst = None if not os.path.exists(saveto): # Avoid repeated downloads try: log.warn("Downloading %s", url) src = urlopen(url) # Read/write all in one block, so we don't create a corrupt file # if the download is interrupted. data = src.read() dst = open(saveto, "wb") dst.write(data) finally: if src: src.close() if dst: dst.close() return os.path.realpath(saveto) def _patch_file(path, content): """Will backup the file then patch it""" existing_content = open(path).read() if existing_content == content: # already patched log.warn('Already patched.') return False log.warn('Patching...') _rename_path(path) f = open(path, 'w') try: f.write(content) finally: f.close() return True def _same_content(path, content): return open(path).read() == content def _no_sandbox(function): def __no_sandbox(*args, **kw): try: from setuptools.sandbox import DirectorySandbox def violation(*args): pass DirectorySandbox._old = DirectorySandbox._violation DirectorySandbox._violation = violation patched = True except ImportError: patched = False try: return function(*args, **kw) finally: if patched: DirectorySandbox._violation = DirectorySandbox._old del DirectorySandbox._old return __no_sandbox @_no_sandbox def _rename_path(path): new_name = path + '.OLD.%s' % time.time() log.warn('Renaming %s into %s', path, new_name) os.rename(path, new_name) return new_name def _remove_flat_installation(placeholder): if not os.path.isdir(placeholder): log.warn('Unkown installation at %s', placeholder) return False found = False for file in os.listdir(placeholder): if fnmatch.fnmatch(file, 'setuptools*.egg-info'): found = True break if not found: log.warn('Could not locate setuptools*.egg-info') return log.warn('Removing elements out of the way...') pkg_info = os.path.join(placeholder, file) if os.path.isdir(pkg_info): patched = _patch_egg_dir(pkg_info) else: patched = _patch_file(pkg_info, SETUPTOOLS_PKG_INFO) if not patched: log.warn('%s already patched.', pkg_info) return False # now let's move the files out of the way for element in ('setuptools', 'pkg_resources.py', 'site.py'): element = os.path.join(placeholder, element) if os.path.exists(element): _rename_path(element) else: log.warn('Could not find the %s element of the ' 'Setuptools distribution', element) return True def _after_install(dist): log.warn('After install bootstrap.') placeholder = dist.get_command_obj('install').install_purelib _create_fake_setuptools_pkg_info(placeholder) @_no_sandbox def _create_fake_setuptools_pkg_info(placeholder): if not placeholder or not os.path.exists(placeholder): log.warn('Could not find the install location') return pyver = '%s.%s' % (sys.version_info[0], sys.version_info[1]) setuptools_file = 'setuptools-%s-py%s.egg-info' % \ (SETUPTOOLS_FAKED_VERSION, pyver) pkg_info = os.path.join(placeholder, setuptools_file) if os.path.exists(pkg_info): log.warn('%s already exists', pkg_info) return log.warn('Creating %s', pkg_info) f = open(pkg_info, 'w') try: f.write(SETUPTOOLS_PKG_INFO) finally: f.close() pth_file = os.path.join(placeholder, 'setuptools.pth') log.warn('Creating %s', pth_file) f = open(pth_file, 'w') try: f.write(os.path.join(os.curdir, setuptools_file)) finally: f.close() def _patch_egg_dir(path): # let's check if it's already patched pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') if os.path.exists(pkg_info): if _same_content(pkg_info, SETUPTOOLS_PKG_INFO): log.warn('%s already patched.', pkg_info) return False _rename_path(path) os.mkdir(path) os.mkdir(os.path.join(path, 'EGG-INFO')) pkg_info = os.path.join(path, 'EGG-INFO', 'PKG-INFO') f = open(pkg_info, 'w') try: f.write(SETUPTOOLS_PKG_INFO) finally: f.close() return True def _before_install(): log.warn('Before install bootstrap.') _fake_setuptools() def _under_prefix(location): if 'install' not in sys.argv: return True args = sys.argv[sys.argv.index('install')+1:] for index, arg in enumerate(args): for option in ('--root', '--prefix'): if arg.startswith('%s=' % option): top_dir = arg.split('root=')[-1] return location.startswith(top_dir) elif arg == option: if len(args) > index: top_dir = args[index+1] return location.startswith(top_dir) elif option == '--user' and USER_SITE is not None: return location.startswith(USER_SITE) return True def _fake_setuptools(): log.warn('Scanning installed packages') try: import pkg_resources except ImportError: # we're cool log.warn('Setuptools or Distribute does not seem to be installed.') return ws = pkg_resources.working_set try: setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools', replacement=False)) except TypeError: # old distribute API setuptools_dist = ws.find(pkg_resources.Requirement.parse('setuptools')) if setuptools_dist is None: log.warn('No setuptools distribution found') return # detecting if it was already faked setuptools_location = setuptools_dist.location log.warn('Setuptools installation detected at %s', setuptools_location) # if --root or --preix was provided, and if # setuptools is not located in them, we don't patch it if not _under_prefix(setuptools_location): log.warn('Not patching, --root or --prefix is installing Distribute' ' in another location') return # let's see if its an egg if not setuptools_location.endswith('.egg'): log.warn('Non-egg installation') res = _remove_flat_installation(setuptools_location) if not res: return else: log.warn('Egg installation') pkg_info = os.path.join(setuptools_location, 'EGG-INFO', 'PKG-INFO') if (os.path.exists(pkg_info) and _same_content(pkg_info, SETUPTOOLS_PKG_INFO)): log.warn('Already patched.') return log.warn('Patching...') # let's create a fake egg replacing setuptools one res = _patch_egg_dir(setuptools_location) if not res: return log.warn('Patched done.') _relaunch() def _relaunch(): log.warn('Relaunching...') # we have to relaunch the process args = [sys.executable] + sys.argv sys.exit(subprocess.call(args)) def _extractall(self, path=".", members=None): """Extract all members from the archive to the current working directory and set owner, modification time and permissions on directories afterwards. `path' specifies a different directory to extract to. `members' is optional and must be a subset of the list returned by getmembers(). """ import copy import operator from tarfile import ExtractError directories = [] if members is None: members = self for tarinfo in members: if tarinfo.isdir(): # Extract directories with a safe mode. directories.append(tarinfo) tarinfo = copy.copy(tarinfo) tarinfo.mode = 448 # decimal for oct 0700 self.extract(tarinfo, path) # Reverse sort directories. if sys.version_info < (2, 4): def sorter(dir1, dir2): return cmp(dir1.name, dir2.name) directories.sort(sorter) directories.reverse() else: directories.sort(key=operator.attrgetter('name'), reverse=True) # Set correct owner, mtime and filemode on directories. for tarinfo in directories: dirpath = os.path.join(path, tarinfo.name) try: self.chown(tarinfo, dirpath) self.utime(tarinfo, dirpath) self.chmod(tarinfo, dirpath) except ExtractError: e = sys.exc_info()[1] if self.errorlevel > 1: raise else: self._dbg(1, "tarfile: %s" % e) def main(argv, version=DEFAULT_VERSION): """Install or upgrade setuptools and EasyInstall""" tarball = download_setuptools() _install(tarball) if __name__ == '__main__': main(sys.argv[1:]) pydicom-0.9.7/MANIFEST.in000644 000765 000024 00000000251 11726534363 015206 0ustar00darcystaff000000 000000 include dicom/testfiles/* include dicom/testcharsetfiles/* include dicom/test/all.bat include dicom/test/shell_all include dicom/doc/* include distribute_setup.py pydicom-0.9.7/PKG-INFO000644 000765 000024 00000003504 11726534607 014552 0ustar00darcystaff000000 000000 Metadata-Version: 1.0 Name: pydicom Version: 0.9.7 Summary: Pure python package for DICOM medical file reading and writing Home-page: http://pydicom.googlecode.com Author: Darcy Mason Author-email: darcymason@gmail.com License: MIT license Description: pydicom is a pure python package for parsing DICOM files. DICOM is a standard (http://medical.nema.org) for communicating medical images and related information such as reports and radiotherapy objects. pydicom makes it easy to read these complex files into natural pythonic structures for easy manipulation. Modified datasets can be written again to DICOM format files. See the `Getting Started `_ wiki page for installation and basic information, and the `Pydicom User Guide `_ page for an overview of how to use the pydicom library. Keywords: dicom python medical imaging Platform: UNKNOWN Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Healthcare Industry Classifier: Intended Audience :: Science/Research Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Operating System :: OS Independent Classifier: Topic :: Scientific/Engineering :: Medical Science Apps. Classifier: Topic :: Scientific/Engineering :: Physics Classifier: Topic :: Software Development :: Libraries pydicom-0.9.7/pydicom.egg-info/000755 000765 000024 00000000000 11726534607 016611 5ustar00darcystaff000000 000000 pydicom-0.9.7/setup.cfg000644 000765 000024 00000000073 11726534607 015274 0ustar00darcystaff000000 000000 [egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 pydicom-0.9.7/setup.py000644 000765 000024 00000004355 11726534364 015174 0ustar00darcystaff000000 000000 #!/usr/bin/env python from distribute_setup import use_setuptools use_setuptools() from setuptools import setup, find_packages import os import os.path import sys setup(name="pydicom", packages = find_packages(), include_package_data = True, version="0.9.7", package_data = {'dicom': ['testfiles/*.dcm']}, zip_safe = False, # want users to be able to see included examples,tests description="Pure python package for DICOM medical file reading and writing", author="Darcy Mason", author_email="darcymason@gmail.com", url="http://pydicom.googlecode.com", license = "MIT license", keywords = "dicom python medical imaging", classifiers = [ "License :: OSI Approved :: MIT License", "Intended Audience :: Developers", "Intended Audience :: Healthcare Industry", "Intended Audience :: Science/Research", "Development Status :: 4 - Beta", "Programming Language :: Python", "Programming Language :: Python :: 2.4", "Programming Language :: Python :: 2.5", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Operating System :: OS Independent", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Scientific/Engineering :: Physics", "Topic :: Software Development :: Libraries", ], long_description = """ pydicom is a pure python package for parsing DICOM files. DICOM is a standard (http://medical.nema.org) for communicating medical images and related information such as reports and radiotherapy objects. pydicom makes it easy to read these complex files into natural pythonic structures for easy manipulation. Modified datasets can be written again to DICOM format files. See the `Getting Started `_ wiki page for installation and basic information, and the `Pydicom User Guide `_ page for an overview of how to use the pydicom library. """, test_loader = "dicom.test.run_tests:MyTestLoader", test_suite = "dummy_string" ) pydicom-0.9.7/pydicom.egg-info/dependency_links.txt000644 000765 000024 00000000001 11726534607 022657 0ustar00darcystaff000000 000000 pydicom-0.9.7/pydicom.egg-info/not-zip-safe000644 000765 000024 00000000001 11726534607 021037 0ustar00darcystaff000000 000000 pydicom-0.9.7/pydicom.egg-info/PKG-INFO000644 000765 000024 00000003504 11726534607 017710 0ustar00darcystaff000000 000000 Metadata-Version: 1.0 Name: pydicom Version: 0.9.7 Summary: Pure python package for DICOM medical file reading and writing Home-page: http://pydicom.googlecode.com Author: Darcy Mason Author-email: darcymason@gmail.com License: MIT license Description: pydicom is a pure python package for parsing DICOM files. DICOM is a standard (http://medical.nema.org) for communicating medical images and related information such as reports and radiotherapy objects. pydicom makes it easy to read these complex files into natural pythonic structures for easy manipulation. Modified datasets can be written again to DICOM format files. See the `Getting Started `_ wiki page for installation and basic information, and the `Pydicom User Guide `_ page for an overview of how to use the pydicom library. Keywords: dicom python medical imaging Platform: UNKNOWN Classifier: License :: OSI Approved :: MIT License Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Healthcare Industry Classifier: Intended Audience :: Science/Research Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Operating System :: OS Independent Classifier: Topic :: Scientific/Engineering :: Medical Science Apps. Classifier: Topic :: Scientific/Engineering :: Physics Classifier: Topic :: Software Development :: Libraries pydicom-0.9.7/pydicom.egg-info/SOURCES.txt000644 000765 000024 00000005412 11726534607 020477 0ustar00darcystaff000000 000000 MANIFEST.in distribute_setup.py setup.py dicom/UID.py dicom/_UID_dict.py dicom/__init__.py dicom/_dicom_dict.py dicom/_private_dict.py dicom/attribute.py dicom/charset.py dicom/config.py dicom/datadict.py dicom/dataelem.py dicom/dataset.py dicom/encaps.py dicom/filebase.py dicom/filereader.py dicom/fileutil.py dicom/filewriter.py dicom/misc.py dicom/multival.py dicom/sequence.py dicom/tag.py dicom/valuerep.py dicom/values.py dicom/contrib/__init__.py dicom/contrib/dicom_dao.py dicom/contrib/imViewer_Simple.py dicom/contrib/pydicom_PIL.py dicom/contrib/pydicom_Tkinter.py dicom/contrib/pydicom_series.py dicom/doc/index.html dicom/examples/DicomDiff.py dicom/examples/DicomInfo.py dicom/examples/ListBeams.py dicom/examples/__init__.py dicom/examples/anonymize.py dicom/examples/dicomtree.py dicom/examples/myprint.py dicom/examples/show_charset_name.py dicom/examples/write_new.py dicom/test/__init__.py dicom/test/_write_stds.py dicom/test/all.bat dicom/test/run_tests.py dicom/test/shell_all dicom/test/test_UID.py dicom/test/test_charset.py dicom/test/test_dataelem.py dicom/test/test_dataset.py dicom/test/test_dictionary.py dicom/test/test_filereader.py dicom/test/test_filewriter.py dicom/test/test_multival.py dicom/test/test_rawread.py dicom/test/test_sequence.py dicom/test/test_tag.py dicom/test/test_valuerep.py dicom/test/version_dep.py dicom/test/warncheck.py dicom/test/performance/__init__.py dicom/test/performance/time_test.py dicom/testcharsetfiles/FileInfo.txt dicom/testcharsetfiles/charlist.py dicom/testcharsetfiles/chrArab.dcm dicom/testcharsetfiles/chrFren.dcm dicom/testcharsetfiles/chrFrenMulti.dcm dicom/testcharsetfiles/chrGerm.dcm dicom/testcharsetfiles/chrGreek.dcm dicom/testcharsetfiles/chrH31.dcm dicom/testcharsetfiles/chrH32.dcm dicom/testcharsetfiles/chrHbrw.dcm dicom/testcharsetfiles/chrI2.dcm dicom/testcharsetfiles/chrJapMulti.dcm dicom/testcharsetfiles/chrKoreanMulti.dcm dicom/testcharsetfiles/chrRuss.dcm dicom/testcharsetfiles/chrX1.dcm dicom/testcharsetfiles/chrX2.dcm dicom/testfiles/CT_small.dcm dicom/testfiles/ExplVR_BigEnd.dcm dicom/testfiles/JPEG-LL.dcm dicom/testfiles/JPEG-lossy.dcm dicom/testfiles/JPEG2000.dcm dicom/testfiles/MR_small.dcm dicom/testfiles/README.txt dicom/testfiles/image_dfl.dcm dicom/testfiles/no_meta_group_length.dcm dicom/testfiles/priv_SQ.dcm dicom/testfiles/reportsi.dcm dicom/testfiles/rtdose.dcm dicom/testfiles/rtplan.dcm dicom/testfiles/rtplan.dump dicom/testfiles/rtplan_truncated.dcm dicom/testfiles/rtstruct.dcm dicom/testfiles/rtstruct.dump dicom/testfiles/test-SR.dcm dicom/testfiles/zipMR.gz dicom/util/__init__.py dicom/util/dump.py dicom/util/hexutil.py dicom/util/namedtup.py pydicom.egg-info/PKG-INFO pydicom.egg-info/SOURCES.txt pydicom.egg-info/dependency_links.txt pydicom.egg-info/not-zip-safe pydicom.egg-info/top_level.txtpydicom-0.9.7/pydicom.egg-info/top_level.txt000644 000765 000024 00000000006 11726534607 021337 0ustar00darcystaff000000 000000 dicom pydicom-0.9.7/dicom/__init__.py000644 000765 000024 00000004700 11726534363 016657 0ustar00darcystaff000000 000000 # __init__.py for Dicom package """pydicom package -- easily handle DICOM files. See Quick Start below. Copyright (c) 2008-2012 Darcy Mason This file is part of pydicom, released under a modified MIT license. See the file license.txt included with this distribution, also available at http://pydicom.googlecode.com ----------- Quick Start ----------- 1. A simple program to read a dicom file, modify a value, and write to a new file:: import dicom dataset = dicom.read_file("file1.dcm") dataset.PatientName = 'anonymous' dataset.save_as("file2.dcm") 2. See the files in the examples directory that came with this package for more examples, including some interactive sessions. 3. Learn the methods of the Dataset class; that is the one you will work with most directly. 4. Questions/comments etc can be directed to the pydicom google group at http://groups.google.com/group/pydicom """ # Set up logging system for the whole package. # In each module, set logger=logging.getLogger('pydicom') and the same instance will be used by all # At command line, turn on debugging for all pydicom functions with: # import dicom # dicom.debug() # Turn off debugging with # dicom.debug(False) import logging def debug(debug_on=True): """Turn debugging of DICOM file reading and writing on or off. When debugging is on, file location and details about the elements read at that location are logged to the 'pydicom' logger using python's logging module. :param debug_on: True (default) to turn on debugging, False to turn off. """ global logger, debugging if debug_on: logger.setLevel(logging.DEBUG) debugging = True else: logger.setLevel(logging.WARNING) debugging = False logger = logging.getLogger('pydicom') handler = logging.StreamHandler() # formatter = logging.Formatter("%(asctime)s %(levelname)s: %(message)s", "%Y-%m-%d %H:%M") #'%(asctime)s %(levelname)s %(message)s' formatter = logging.Formatter("%(message)s") handler.setFormatter(formatter) logger.addHandler(handler) debug(False) # force level=WARNING, in case logging default is set differently (issue 102) # For convenience, import the read_file and write_file functions (most used) into the "dicom" namespace. from filereader import read_file, ReadFile # latter one for backwards compatibility; remove later from filewriter import write_file, WriteFile # ditto __version__ = "0.9.7" __version_info__ = (0,9,7) pydicom-0.9.7/dicom/_dicom_dict.py000644 000765 000024 00001133021 11726534363 017355 0ustar00darcystaff000000 000000 # _dicom_dict.py """DICOM data dictionary auto-generated by csv2dict2011.py""" DicomDictionary = { 0x00020000: ('UL', '1', "File Meta Information Group Length", '', 'FileMetaInformationGroupLength'), 0x00020001: ('OB', '1', "File Meta Information Version", '', 'FileMetaInformationVersion'), 0x00020002: ('UI', '1', "Media Storage SOP Class UID", '', 'MediaStorageSOPClassUID'), 0x00020003: ('UI', '1', "Media Storage SOP Instance UID", '', 'MediaStorageSOPInstanceUID'), 0x00020010: ('UI', '1', "Transfer Syntax UID", '', 'TransferSyntaxUID'), 0x00020012: ('UI', '1', "Implementation Class UID", '', 'ImplementationClassUID'), 0x00020013: ('SH', '1', "Implementation Version Name", '', 'ImplementationVersionName'), 0x00020016: ('AE', '1', "Source Application Entity Title", '', 'SourceApplicationEntityTitle'), 0x00020100: ('UI', '1', "Private Information Creator UID", '', 'PrivateInformationCreatorUID'), 0x00020102: ('OB', '1', "Private Information", '', 'PrivateInformation'), 0x00041130: ('CS', '1', "File-set ID", '', 'FileSetID'), 0x00041141: ('CS', '1-8', "File-set Descriptor File ID", '', 'FileSetDescriptorFileID'), 0x00041142: ('CS', '1', "Specific Character Set of File-set Descriptor File", '', 'SpecificCharacterSetOfFileSetDescriptorFile'), 0x00041200: ('UL', '1', "Offset of the First Directory Record of the Root Directory Entity", '', 'OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity'), 0x00041202: ('UL', '1', "Offset of the Last Directory Record of the Root Directory Entity", '', 'OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity'), 0x00041212: ('US', '1', "File-set Consistency Flag", '', 'FileSetConsistencyFlag'), 0x00041220: ('SQ', '1', "Directory Record Sequence", '', 'DirectoryRecordSequence'), 0x00041400: ('UL', '1', "Offset of the Next Directory Record", '', 'OffsetOfTheNextDirectoryRecord'), 0x00041410: ('US', '1', "Record In-use Flag", '', 'RecordInUseFlag'), 0x00041420: ('UL', '1', "Offset of Referenced Lower-Level Directory Entity", '', 'OffsetOfReferencedLowerLevelDirectoryEntity'), 0x00041430: ('CS', '1', "Directory Record Type", '', 'DirectoryRecordType'), 0x00041432: ('UI', '1', "Private Record UID", '', 'PrivateRecordUID'), 0x00041500: ('CS', '1-8', "Referenced File ID", '', 'ReferencedFileID'), 0x00041504: ('UL', '1', "MRDR Directory Record Offset", 'Retired', 'MRDRDirectoryRecordOffset'), 0x00041510: ('UI', '1', "Referenced SOP Class UID in File", '', 'ReferencedSOPClassUIDInFile'), 0x00041511: ('UI', '1', "Referenced SOP Instance UID in File", '', 'ReferencedSOPInstanceUIDInFile'), 0x00041512: ('UI', '1', "Referenced Transfer Syntax UID in File", '', 'ReferencedTransferSyntaxUIDInFile'), 0x0004151A: ('UI', '1-n', "Referenced Related General SOP Class UID in File", '', 'ReferencedRelatedGeneralSOPClassUIDInFile'), 0x00041600: ('UL', '1', "Number of References", 'Retired', 'NumberOfReferences'), 0x00080001: ('UL', '1', "Length to End", 'Retired', 'LengthToEnd'), 0x00080005: ('CS', '1-n', "Specific Character Set", '', 'SpecificCharacterSet'), 0x00080006: ('SQ', '1', "Language Code Sequence", '', 'LanguageCodeSequence'), 0x00080008: ('CS', '2-n', "Image Type", '', 'ImageType'), 0x00080010: ('SH', '1', "Recognition Code", 'Retired', 'RecognitionCode'), 0x00080012: ('DA', '1', "Instance Creation Date", '', 'InstanceCreationDate'), 0x00080013: ('TM', '1', "Instance Creation Time", '', 'InstanceCreationTime'), 0x00080014: ('UI', '1', "Instance Creator UID", '', 'InstanceCreatorUID'), 0x00080016: ('UI', '1', "SOP Class UID", '', 'SOPClassUID'), 0x00080018: ('UI', '1', "SOP Instance UID", '', 'SOPInstanceUID'), 0x0008001A: ('UI', '1-n', "Related General SOP Class UID", '', 'RelatedGeneralSOPClassUID'), 0x0008001B: ('UI', '1', "Original Specialized SOP Class UID", '', 'OriginalSpecializedSOPClassUID'), 0x00080020: ('DA', '1', "Study Date", '', 'StudyDate'), 0x00080021: ('DA', '1', "Series Date", '', 'SeriesDate'), 0x00080022: ('DA', '1', "Acquisition Date", '', 'AcquisitionDate'), 0x00080023: ('DA', '1', "Content Date", '', 'ContentDate'), 0x00080024: ('DA', '1', "Overlay Date", 'Retired', 'OverlayDate'), 0x00080025: ('DA', '1', "Curve Date", 'Retired', 'CurveDate'), 0x0008002A: ('DT', '1', "Acquisition DateTime", '', 'AcquisitionDateTime'), 0x00080030: ('TM', '1', "Study Time", '', 'StudyTime'), 0x00080031: ('TM', '1', "Series Time", '', 'SeriesTime'), 0x00080032: ('TM', '1', "Acquisition Time", '', 'AcquisitionTime'), 0x00080033: ('TM', '1', "Content Time", '', 'ContentTime'), 0x00080034: ('TM', '1', "Overlay Time", 'Retired', 'OverlayTime'), 0x00080035: ('TM', '1', "Curve Time", 'Retired', 'CurveTime'), 0x00080040: ('US', '1', "Data Set Type", 'Retired', 'DataSetType'), 0x00080041: ('LO', '1', "Data Set Subtype", 'Retired', 'DataSetSubtype'), 0x00080042: ('CS', '1', "Nuclear Medicine Series Type", 'Retired', 'NuclearMedicineSeriesType'), 0x00080050: ('SH', '1', "Accession Number", '', 'AccessionNumber'), 0x00080051: ('SQ', '1', "Issuer of Accession Number Sequence", '', 'IssuerOfAccessionNumberSequence'), 0x00080052: ('CS', '1', "Query/Retrieve Level", '', 'QueryRetrieveLevel'), 0x00080054: ('AE', '1-n', "Retrieve AE Title", '', 'RetrieveAETitle'), 0x00080056: ('CS', '1', "Instance Availability", '', 'InstanceAvailability'), 0x00080058: ('UI', '1-n', "Failed SOP Instance UID List", '', 'FailedSOPInstanceUIDList'), 0x00080060: ('CS', '1', "Modality", '', 'Modality'), 0x00080061: ('CS', '1-n', "Modalities in Study", '', 'ModalitiesInStudy'), 0x00080062: ('UI', '1-n', "SOP Classes in Study", '', 'SOPClassesInStudy'), 0x00080064: ('CS', '1', "Conversion Type", '', 'ConversionType'), 0x00080068: ('CS', '1', "Presentation Intent Type", '', 'PresentationIntentType'), 0x00080070: ('LO', '1', "Manufacturer", '', 'Manufacturer'), 0x00080080: ('LO', '1', "Institution Name", '', 'InstitutionName'), 0x00080081: ('ST', '1', "Institution Address", '', 'InstitutionAddress'), 0x00080082: ('SQ', '1', "Institution Code Sequence", '', 'InstitutionCodeSequence'), 0x00080090: ('PN', '1', "Referring Physician's Name", '', 'ReferringPhysicianName'), 0x00080092: ('ST', '1', "Referring Physician's Address", '', 'ReferringPhysicianAddress'), 0x00080094: ('SH', '1-n', "Referring Physician's Telephone Numbers", '', 'ReferringPhysicianTelephoneNumbers'), 0x00080096: ('SQ', '1', "Referring Physician Identification Sequence", '', 'ReferringPhysicianIdentificationSequence'), 0x00080100: ('SH', '1', "Code Value", '', 'CodeValue'), 0x00080102: ('SH', '1', "Coding Scheme Designator", '', 'CodingSchemeDesignator'), 0x00080103: ('SH', '1', "Coding Scheme Version", '', 'CodingSchemeVersion'), 0x00080104: ('LO', '1', "Code Meaning", '', 'CodeMeaning'), 0x00080105: ('CS', '1', "Mapping Resource", '', 'MappingResource'), 0x00080106: ('DT', '1', "Context Group Version", '', 'ContextGroupVersion'), 0x00080107: ('DT', '1', "Context Group Local Version", '', 'ContextGroupLocalVersion'), 0x0008010B: ('CS', '1', "Context Group Extension Flag", '', 'ContextGroupExtensionFlag'), 0x0008010C: ('UI', '1', "Coding Scheme UID", '', 'CodingSchemeUID'), 0x0008010D: ('UI', '1', "Context Group Extension Creator UID", '', 'ContextGroupExtensionCreatorUID'), 0x0008010F: ('CS', '1', "Context Identifier", '', 'ContextIdentifier'), 0x00080110: ('SQ', '1', "Coding Scheme Identification Sequence", '', 'CodingSchemeIdentificationSequence'), 0x00080112: ('LO', '1', "Coding Scheme Registry", '', 'CodingSchemeRegistry'), 0x00080114: ('ST', '1', "Coding Scheme External ID", '', 'CodingSchemeExternalID'), 0x00080115: ('ST', '1', "Coding Scheme Name", '', 'CodingSchemeName'), 0x00080116: ('ST', '1', "Coding Scheme Responsible Organization", '', 'CodingSchemeResponsibleOrganization'), 0x00080117: ('UI', '1', "Context UID", '', 'ContextUID'), 0x00080201: ('SH', '1', "Timezone Offset From UTC", '', 'TimezoneOffsetFromUTC'), 0x00081000: ('AE', '1', "Network ID", 'Retired', 'NetworkID'), 0x00081010: ('SH', '1', "Station Name", '', 'StationName'), 0x00081030: ('LO', '1', "Study Description", '', 'StudyDescription'), 0x00081032: ('SQ', '1', "Procedure Code Sequence", '', 'ProcedureCodeSequence'), 0x0008103E: ('LO', '1', "Series Description", '', 'SeriesDescription'), 0x0008103F: ('SQ', '1', "Series Description Code Sequence", '', 'SeriesDescriptionCodeSequence'), 0x00081040: ('LO', '1', "Institutional Department Name", '', 'InstitutionalDepartmentName'), 0x00081048: ('PN', '1-n', "Physician(s) of Record", '', 'PhysiciansOfRecord'), 0x00081049: ('SQ', '1', "Physician(s) of Record Identification Sequence", '', 'PhysiciansOfRecordIdentificationSequence'), 0x00081050: ('PN', '1-n', "Performing Physician's Name", '', 'PerformingPhysicianName'), 0x00081052: ('SQ', '1', "Performing Physician Identification Sequence", '', 'PerformingPhysicianIdentificationSequence'), 0x00081060: ('PN', '1-n', "Name of Physician(s) Reading Study", '', 'NameOfPhysiciansReadingStudy'), 0x00081062: ('SQ', '1', "Physician(s) Reading Study Identification Sequence", '', 'PhysiciansReadingStudyIdentificationSequence'), 0x00081070: ('PN', '1-n', "Operators' Name", '', 'OperatorsName'), 0x00081072: ('SQ', '1', "Operator Identification Sequence", '', 'OperatorIdentificationSequence'), 0x00081080: ('LO', '1-n', "Admitting Diagnoses Description", '', 'AdmittingDiagnosesDescription'), 0x00081084: ('SQ', '1', "Admitting Diagnoses Code Sequence", '', 'AdmittingDiagnosesCodeSequence'), 0x00081090: ('LO', '1', "Manufacturer's Model Name", '', 'ManufacturerModelName'), 0x00081100: ('SQ', '1', "Referenced Results Sequence", 'Retired', 'ReferencedResultsSequence'), 0x00081110: ('SQ', '1', "Referenced Study Sequence", '', 'ReferencedStudySequence'), 0x00081111: ('SQ', '1', "Referenced Performed Procedure Step Sequence", '', 'ReferencedPerformedProcedureStepSequence'), 0x00081115: ('SQ', '1', "Referenced Series Sequence", '', 'ReferencedSeriesSequence'), 0x00081120: ('SQ', '1', "Referenced Patient Sequence", '', 'ReferencedPatientSequence'), 0x00081125: ('SQ', '1', "Referenced Visit Sequence", '', 'ReferencedVisitSequence'), 0x00081130: ('SQ', '1', "Referenced Overlay Sequence", 'Retired', 'ReferencedOverlaySequence'), 0x00081134: ('SQ', '1', "Referenced Stereometric Instance Sequence", '', 'ReferencedStereometricInstanceSequence'), 0x0008113A: ('SQ', '1', "Referenced Waveform Sequence", '', 'ReferencedWaveformSequence'), 0x00081140: ('SQ', '1', "Referenced Image Sequence", '', 'ReferencedImageSequence'), 0x00081145: ('SQ', '1', "Referenced Curve Sequence", 'Retired', 'ReferencedCurveSequence'), 0x0008114A: ('SQ', '1', "Referenced Instance Sequence", '', 'ReferencedInstanceSequence'), 0x0008114B: ('SQ', '1', "Referenced Real World Value Mapping Instance Sequence", '', 'ReferencedRealWorldValueMappingInstanceSequence'), 0x00081150: ('UI', '1', "Referenced SOP Class UID", '', 'ReferencedSOPClassUID'), 0x00081155: ('UI', '1', "Referenced SOP Instance UID", '', 'ReferencedSOPInstanceUID'), 0x0008115A: ('UI', '1-n', "SOP Classes Supported", '', 'SOPClassesSupported'), 0x00081160: ('IS', '1-n', "Referenced Frame Number", '', 'ReferencedFrameNumber'), 0x00081161: ('UL', '1-n', "Simple Frame List", '', 'SimpleFrameList'), 0x00081162: ('UL', '3-3n', "Calculated Frame List", '', 'CalculatedFrameList'), 0x00081163: ('FD', '2', "Time Range", '', 'TimeRange'), 0x00081164: ('SQ', '1', "Frame Extraction Sequence", '', 'FrameExtractionSequence'), 0x00081167: ('UI', '1', "Multi-Frame Source SOP Instance UID", '', 'MultiFrameSourceSOPInstanceUID'), 0x00081195: ('UI', '1', "Transaction UID", '', 'TransactionUID'), 0x00081197: ('US', '1', "Failure Reason", '', 'FailureReason'), 0x00081198: ('SQ', '1', "Failed SOP Sequence", '', 'FailedSOPSequence'), 0x00081199: ('SQ', '1', "Referenced SOP Sequence", '', 'ReferencedSOPSequence'), 0x00081200: ('SQ', '1', "Studies Containing Other Referenced Instances Sequence", '', 'StudiesContainingOtherReferencedInstancesSequence'), 0x00081250: ('SQ', '1', "Related Series Sequence", '', 'RelatedSeriesSequence'), 0x00082110: ('CS', '1', "Lossy Image Compression (Retired)", 'Retired', 'LossyImageCompressionRetired'), 0x00082111: ('ST', '1', "Derivation Description", '', 'DerivationDescription'), 0x00082112: ('SQ', '1', "Source Image Sequence", '', 'SourceImageSequence'), 0x00082120: ('SH', '1', "Stage Name", '', 'StageName'), 0x00082122: ('IS', '1', "Stage Number", '', 'StageNumber'), 0x00082124: ('IS', '1', "Number of Stages", '', 'NumberOfStages'), 0x00082127: ('SH', '1', "View Name", '', 'ViewName'), 0x00082128: ('IS', '1', "View Number", '', 'ViewNumber'), 0x00082129: ('IS', '1', "Number of Event Timers", '', 'NumberOfEventTimers'), 0x0008212A: ('IS', '1', "Number of Views in Stage", '', 'NumberOfViewsInStage'), 0x00082130: ('DS', '1-n', "Event Elapsed Time(s)", '', 'EventElapsedTimes'), 0x00082132: ('LO', '1-n', "Event Timer Name(s)", '', 'EventTimerNames'), 0x00082133: ('SQ', '1', "Event Timer Sequence", '', 'EventTimerSequence'), 0x00082134: ('FD', '1', "Event Time Offset", '', 'EventTimeOffset'), 0x00082135: ('SQ', '1', "Event Code Sequence", '', 'EventCodeSequence'), 0x00082142: ('IS', '1', "Start Trim", '', 'StartTrim'), 0x00082143: ('IS', '1', "Stop Trim", '', 'StopTrim'), 0x00082144: ('IS', '1', "Recommended Display Frame Rate", '', 'RecommendedDisplayFrameRate'), 0x00082200: ('CS', '1', "Transducer Position", 'Retired', 'TransducerPosition'), 0x00082204: ('CS', '1', "Transducer Orientation", 'Retired', 'TransducerOrientation'), 0x00082208: ('CS', '1', "Anatomic Structure", 'Retired', 'AnatomicStructure'), 0x00082218: ('SQ', '1', "Anatomic Region Sequence", '', 'AnatomicRegionSequence'), 0x00082220: ('SQ', '1', "Anatomic Region Modifier Sequence", '', 'AnatomicRegionModifierSequence'), 0x00082228: ('SQ', '1', "Primary Anatomic Structure Sequence", '', 'PrimaryAnatomicStructureSequence'), 0x00082229: ('SQ', '1', "Anatomic Structure, Space or Region Sequence", '', 'AnatomicStructureSpaceOrRegionSequence'), 0x00082230: ('SQ', '1', "Primary Anatomic Structure Modifier Sequence", '', 'PrimaryAnatomicStructureModifierSequence'), 0x00082240: ('SQ', '1', "Transducer Position Sequence", 'Retired', 'TransducerPositionSequence'), 0x00082242: ('SQ', '1', "Transducer Position Modifier Sequence", 'Retired', 'TransducerPositionModifierSequence'), 0x00082244: ('SQ', '1', "Transducer Orientation Sequence", 'Retired', 'TransducerOrientationSequence'), 0x00082246: ('SQ', '1', "Transducer Orientation Modifier Sequence", 'Retired', 'TransducerOrientationModifierSequence'), 0x00082251: ('SQ', '1', "Anatomic Structure Space Or Region Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionCodeSequenceTrial'), 0x00082253: ('SQ', '1', "Anatomic Portal Of Entrance Code Sequence (Trial)", 'Retired', 'AnatomicPortalOfEntranceCodeSequenceTrial'), 0x00082255: ('SQ', '1', "Anatomic Approach Direction Code Sequence (Trial)", 'Retired', 'AnatomicApproachDirectionCodeSequenceTrial'), 0x00082256: ('ST', '1', "Anatomic Perspective Description (Trial)", 'Retired', 'AnatomicPerspectiveDescriptionTrial'), 0x00082257: ('SQ', '1', "Anatomic Perspective Code Sequence (Trial)", 'Retired', 'AnatomicPerspectiveCodeSequenceTrial'), 0x00082258: ('ST', '1', "Anatomic Location Of Examining Instrument Description (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentDescriptionTrial'), 0x00082259: ('SQ', '1', "Anatomic Location Of Examining Instrument Code Sequence (Trial)", 'Retired', 'AnatomicLocationOfExaminingInstrumentCodeSequenceTrial'), 0x0008225A: ('SQ', '1', "Anatomic Structure Space Or Region Modifier Code Sequence (Trial)", 'Retired', 'AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial'), 0x0008225C: ('SQ', '1', "OnAxis Background Anatomic Structure Code Sequence (Trial)", 'Retired', 'OnAxisBackgroundAnatomicStructureCodeSequenceTrial'), 0x00083001: ('SQ', '1', "Alternate Representation Sequence", '', 'AlternateRepresentationSequence'), 0x00083010: ('UI', '1', "Irradiation Event UID", '', 'IrradiationEventUID'), 0x00084000: ('LT', '1', "Identifying Comments", 'Retired', 'IdentifyingComments'), 0x00089007: ('CS', '4', "Frame Type", '', 'FrameType'), 0x00089092: ('SQ', '1', "Referenced Image Evidence Sequence", '', 'ReferencedImageEvidenceSequence'), 0x00089121: ('SQ', '1', "Referenced Raw Data Sequence", '', 'ReferencedRawDataSequence'), 0x00089123: ('UI', '1', "Creator-Version UID", '', 'CreatorVersionUID'), 0x00089124: ('SQ', '1', "Derivation Image Sequence", '', 'DerivationImageSequence'), 0x00089154: ('SQ', '1', "Source Image Evidence Sequence", '', 'SourceImageEvidenceSequence'), 0x00089205: ('CS', '1', "Pixel Presentation", '', 'PixelPresentation'), 0x00089206: ('CS', '1', "Volumetric Properties", '', 'VolumetricProperties'), 0x00089207: ('CS', '1', "Volume Based Calculation Technique", '', 'VolumeBasedCalculationTechnique'), 0x00089208: ('CS', '1', "Complex Image Component", '', 'ComplexImageComponent'), 0x00089209: ('CS', '1', "Acquisition Contrast", '', 'AcquisitionContrast'), 0x00089215: ('SQ', '1', "Derivation Code Sequence", '', 'DerivationCodeSequence'), 0x00089237: ('SQ', '1', "Referenced Presentation State Sequence", '', 'ReferencedPresentationStateSequence'), 0x00089410: ('SQ', '1', "Referenced Other Plane Sequence", '', 'ReferencedOtherPlaneSequence'), 0x00089458: ('SQ', '1', "Frame Display Sequence", '', 'FrameDisplaySequence'), 0x00089459: ('FL', '1', "Recommended Display Frame Rate in Float", '', 'RecommendedDisplayFrameRateInFloat'), 0x00089460: ('CS', '1', "Skip Frame Range Flag", '', 'SkipFrameRangeFlag'), 0x00100010: ('PN', '1', "Patient's Name", '', 'PatientName'), 0x00100020: ('LO', '1', "Patient ID", '', 'PatientID'), 0x00100021: ('LO', '1', "Issuer of Patient ID", '', 'IssuerOfPatientID'), 0x00100022: ('CS', '1', "Type of Patient ID", '', 'TypeOfPatientID'), 0x00100024: ('SQ', '1', "Issuer of Patient ID Qualifiers Sequence", '', 'IssuerOfPatientIDQualifiersSequence'), 0x00100030: ('DA', '1', "Patient's Birth Date", '', 'PatientBirthDate'), 0x00100032: ('TM', '1', "Patient's Birth Time", '', 'PatientBirthTime'), 0x00100040: ('CS', '1', "Patient's Sex", '', 'PatientSex'), 0x00100050: ('SQ', '1', "Patient's Insurance Plan Code Sequence", '', 'PatientInsurancePlanCodeSequence'), 0x00100101: ('SQ', '1', "Patient's Primary Language Code Sequence", '', 'PatientPrimaryLanguageCodeSequence'), 0x00100102: ('SQ', '1', "Patient's Primary Language Modifier Code Sequence", '', 'PatientPrimaryLanguageModifierCodeSequence'), 0x00101000: ('LO', '1-n', "Other Patient IDs", '', 'OtherPatientIDs'), 0x00101001: ('PN', '1-n', "Other Patient Names", '', 'OtherPatientNames'), 0x00101002: ('SQ', '1', "Other Patient IDs Sequence", '', 'OtherPatientIDsSequence'), 0x00101005: ('PN', '1', "Patient's Birth Name", '', 'PatientBirthName'), 0x00101010: ('AS', '1', "Patient's Age", '', 'PatientAge'), 0x00101020: ('DS', '1', "Patient's Size", '', 'PatientSize'), 0x00101021: ('SQ', '1', "Patient'Size Code Sequence", '', 'PatientSizeCodeSequence'), 0x00101030: ('DS', '1', "Patient's Weight", '', 'PatientWeight'), 0x00101040: ('LO', '1', "Patient's Address", '', 'PatientAddress'), 0x00101050: ('LO', '1-n', "Insurance Plan Identification", 'Retired', 'InsurancePlanIdentification'), 0x00101060: ('PN', '1', "Patient's Mother's Birth Name", '', 'PatientMotherBirthName'), 0x00101080: ('LO', '1', "Military Rank", '', 'MilitaryRank'), 0x00101081: ('LO', '1', "Branch of Service", '', 'BranchOfService'), 0x00101090: ('LO', '1', "Medical Record Locator", '', 'MedicalRecordLocator'), 0x00102000: ('LO', '1-n', "Medical Alerts", '', 'MedicalAlerts'), 0x00102110: ('LO', '1-n', "Allergies", '', 'Allergies'), 0x00102150: ('LO', '1', "Country of Residence", '', 'CountryOfResidence'), 0x00102152: ('LO', '1', "Region of Residence", '', 'RegionOfResidence'), 0x00102154: ('SH', '1-n', "Patient's Telephone Numbers", '', 'PatientTelephoneNumbers'), 0x00102160: ('SH', '1', "Ethnic Group", '', 'EthnicGroup'), 0x00102180: ('SH', '1', "Occupation", '', 'Occupation'), 0x001021A0: ('CS', '1', "Smoking Status", '', 'SmokingStatus'), 0x001021B0: ('LT', '1', "Additional Patient History", '', 'AdditionalPatientHistory'), 0x001021C0: ('US', '1', "Pregnancy Status", '', 'PregnancyStatus'), 0x001021D0: ('DA', '1', "Last Menstrual Date", '', 'LastMenstrualDate'), 0x001021F0: ('LO', '1', "Patient's Religious Preference", '', 'PatientReligiousPreference'), 0x00102201: ('LO', '1', "Patient Species Description", '', 'PatientSpeciesDescription'), 0x00102202: ('SQ', '1', "Patient Species Code Sequence", '', 'PatientSpeciesCodeSequence'), 0x00102203: ('CS', '1', "Patient's Sex Neutered", '', 'PatientSexNeutered'), 0x00102210: ('CS', '1', "Anatomical Orientation Type", '', 'AnatomicalOrientationType'), 0x00102292: ('LO', '1', "Patient Breed Description", '', 'PatientBreedDescription'), 0x00102293: ('SQ', '1', "Patient Breed Code Sequence", '', 'PatientBreedCodeSequence'), 0x00102294: ('SQ', '1', "Breed Registration Sequence", '', 'BreedRegistrationSequence'), 0x00102295: ('LO', '1', "Breed Registration Number", '', 'BreedRegistrationNumber'), 0x00102296: ('SQ', '1', "Breed Registry Code Sequence", '', 'BreedRegistryCodeSequence'), 0x00102297: ('PN', '1', "Responsible Person", '', 'ResponsiblePerson'), 0x00102298: ('CS', '1', "Responsible Person Role", '', 'ResponsiblePersonRole'), 0x00102299: ('LO', '1', "Responsible Organization", '', 'ResponsibleOrganization'), 0x00104000: ('LT', '1', "Patient Comments", '', 'PatientComments'), 0x00109431: ('FL', '1', "Examined Body Thickness", '', 'ExaminedBodyThickness'), 0x00120010: ('LO', '1', "Clinical Trial Sponsor Name", '', 'ClinicalTrialSponsorName'), 0x00120020: ('LO', '1', "Clinical Trial Protocol ID", '', 'ClinicalTrialProtocolID'), 0x00120021: ('LO', '1', "Clinical Trial Protocol Name", '', 'ClinicalTrialProtocolName'), 0x00120030: ('LO', '1', "Clinical Trial Site ID", '', 'ClinicalTrialSiteID'), 0x00120031: ('LO', '1', "Clinical Trial Site Name", '', 'ClinicalTrialSiteName'), 0x00120040: ('LO', '1', "Clinical Trial Subject ID", '', 'ClinicalTrialSubjectID'), 0x00120042: ('LO', '1', "Clinical Trial Subject Reading ID", '', 'ClinicalTrialSubjectReadingID'), 0x00120050: ('LO', '1', "Clinical Trial Time Point ID", '', 'ClinicalTrialTimePointID'), 0x00120051: ('ST', '1', "Clinical Trial Time Point Description", '', 'ClinicalTrialTimePointDescription'), 0x00120060: ('LO', '1', "Clinical Trial Coordinating Center Name", '', 'ClinicalTrialCoordinatingCenterName'), 0x00120062: ('CS', '1', "Patient Identity Removed", '', 'PatientIdentityRemoved'), 0x00120063: ('LO', '1-n', "De-identification Method", '', 'DeidentificationMethod'), 0x00120064: ('SQ', '1', "De-identification Method Code Sequence", '', 'DeidentificationMethodCodeSequence'), 0x00120071: ('LO', '1', "Clinical Trial Series ID", '', 'ClinicalTrialSeriesID'), 0x00120072: ('LO', '1', "Clinical Trial Series Description", '', 'ClinicalTrialSeriesDescription'), 0x00120081: ('LO', '1', "Clinical Trial Protocol Ethics Committee Name", '', 'ClinicalTrialProtocolEthicsCommitteeName'), 0x00120082: ('LO', '1', "Clinical Trial Protocol Ethics Committee Approval Number", '', 'ClinicalTrialProtocolEthicsCommitteeApprovalNumber'), 0x00120083: ('SQ', '1', "Consent for Clinical Trial Use Sequence", '', 'ConsentForClinicalTrialUseSequence'), 0x00120084: ('CS', '1', "Distribution Type", '', 'DistributionType'), 0x00120085: ('CS', '1', "Consent for Distribution Flag", '', 'ConsentForDistributionFlag'), 0x00140023: ('ST', '1-n', "CAD File Format", '', 'CADFileFormat'), 0x00140024: ('ST', '1-n', "Component Reference System", '', 'ComponentReferenceSystem'), 0x00140025: ('ST', '1-n', "Component Manufacturing Procedure", '', 'ComponentManufacturingProcedure'), 0x00140028: ('ST', '1-n', "Component Manufacturer", '', 'ComponentManufacturer'), 0x00140030: ('DS', '1-n', "Material Thickness", '', 'MaterialThickness'), 0x00140032: ('DS', '1-n', "Material Pipe Diameter", '', 'MaterialPipeDiameter'), 0x00140034: ('DS', '1-n', "Material Isolation Diameter", '', 'MaterialIsolationDiameter'), 0x00140042: ('ST', '1-n', "Material Grade", '', 'MaterialGrade'), 0x00140044: ('ST', '1-n', "Material Properties File ID", '', 'MaterialPropertiesFileID'), 0x00140045: ('ST', '1-n', "Material Properties File Format", '', 'MaterialPropertiesFileFormat'), 0x00140046: ('LT', '1', "Material Notes", '', 'MaterialNotes'), 0x00140050: ('CS', '1', "Component Shape", '', 'ComponentShape'), 0x00140052: ('CS', '1', "Curvature Type", '', 'CurvatureType'), 0x00140054: ('DS', '1', "Outer Diameter", '', 'OuterDiameter'), 0x00140056: ('DS', '1', "Inner Diameter", '', 'InnerDiameter'), 0x00141010: ('ST', '1', "Actual Environmental Conditions", '', 'ActualEnvironmentalConditions'), 0x00141020: ('DA', '1', "Expiry Date", '', 'ExpiryDate'), 0x00141040: ('ST', '1', "Environmental Conditions", '', 'EnvironmentalConditions'), 0x00142002: ('SQ', '1', "Evaluator Sequence", '', 'EvaluatorSequence'), 0x00142004: ('IS', '1', "Evaluator Number", '', 'EvaluatorNumber'), 0x00142006: ('PN', '1', "Evaluator Name", '', 'EvaluatorName'), 0x00142008: ('IS', '1', "Evaluation Attempt", '', 'EvaluationAttempt'), 0x00142012: ('SQ', '1', "Indication Sequence", '', 'IndicationSequence'), 0x00142014: ('IS', '1', "Indication Number", '', 'IndicationNumber'), 0x00142016: ('SH', '1', "Indication Label", '', 'IndicationLabel'), 0x00142018: ('ST', '1', "Indication Description", '', 'IndicationDescription'), 0x0014201A: ('CS', '1-n', "Indication Type", '', 'IndicationType'), 0x0014201C: ('CS', '1', "Indication Disposition", '', 'IndicationDisposition'), 0x0014201E: ('SQ', '1', "Indication ROI Sequence", '', 'IndicationROISequence'), 0x00142030: ('SQ', '1', "Indication Physical Property Sequence", '', 'IndicationPhysicalPropertySequence'), 0x00142032: ('SH', '1', "Property Label", '', 'PropertyLabel'), 0x00142202: ('IS', '1', "Coordinate System Number of Axes", '', 'CoordinateSystemNumberOfAxes'), 0x00142204: ('SQ', '1', "Coordinate System Axes Sequence", '', 'CoordinateSystemAxesSequence'), 0x00142206: ('ST', '1', "Coordinate System Axis Description", '', 'CoordinateSystemAxisDescription'), 0x00142208: ('CS', '1', "Coordinate System Data Set Mapping", '', 'CoordinateSystemDataSetMapping'), 0x0014220A: ('IS', '1', "Coordinate System Axis Number", '', 'CoordinateSystemAxisNumber'), 0x0014220C: ('CS', '1', "Coordinate System Axis Type", '', 'CoordinateSystemAxisType'), 0x0014220E: ('CS', '1', "Coordinate System Axis Units", '', 'CoordinateSystemAxisUnits'), 0x00142210: ('OB', '1', "Coordinate System Axis Values", '', 'CoordinateSystemAxisValues'), 0x00142220: ('SQ', '1', "Coordinate System Transform Sequence", '', 'CoordinateSystemTransformSequence'), 0x00142222: ('ST', '1', "Transform Description", '', 'TransformDescription'), 0x00142224: ('IS', '1', "Transform Number of Axes", '', 'TransformNumberOfAxes'), 0x00142226: ('IS', '1-n', "Transform Order of Axes", '', 'TransformOrderOfAxes'), 0x00142228: ('CS', '1', "Transformed Axis Units", '', 'TransformedAxisUnits'), 0x0014222A: ('DS', '1-n', "Coordinate System Transform Rotation and Scale Matrix", '', 'CoordinateSystemTransformRotationAndScaleMatrix'), 0x0014222C: ('DS', '1-n', "Coordinate System Transform Translation Matrix", '', 'CoordinateSystemTransformTranslationMatrix'), 0x00143011: ('DS', '1', "Internal Detector Frame Time", '', 'InternalDetectorFrameTime'), 0x00143012: ('DS', '1', "Number of Frames Integrated", '', 'NumberOfFramesIntegrated'), 0x00143020: ('SQ', '1', "Detector Temperature Sequence", '', 'DetectorTemperatureSequence'), 0x00143022: ('DS', '1', "Sensor Name", '', 'SensorName'), 0x00143024: ('DS', '1', "Horizontal Offset of Sensor", '', 'HorizontalOffsetOfSensor'), 0x00143026: ('DS', '1', "Vertical Offset of Sensor", '', 'VerticalOffsetOfSensor'), 0x00143028: ('DS', '1', "Sensor Temperature", '', 'SensorTemperature'), 0x00143040: ('SQ', '1', "Dark Current Sequence", '', 'DarkCurrentSequence'), 0x00143050: ('OB or OW', '1', "Dark Current Counts", '', 'DarkCurrentCounts'), 0x00143060: ('SQ', '1', "Gain Correction Reference Sequence", '', 'GainCorrectionReferenceSequence'), 0x00143070: ('OB or OW', '1', "Air Counts", '', 'AirCounts'), 0x00143071: ('DS', '1', "KV Used in Gain Calibration", '', 'KVUsedInGainCalibration'), 0x00143072: ('DS', '1', "MA Used in Gain Calibration", '', 'MAUsedInGainCalibration'), 0x00143073: ('DS', '1', "Number of Frames Used for Integration", '', 'NumberOfFramesUsedForIntegration'), 0x00143074: ('LO', '1', "Filter Material Used in Gain Calibration", '', 'FilterMaterialUsedInGainCalibration'), 0x00143075: ('DS', '1', "Filter Thickness Used in Gain Calibration", '', 'FilterThicknessUsedInGainCalibration'), 0x00143076: ('DA', '1', "Date of Gain Calibration", '', 'DateOfGainCalibration'), 0x00143077: ('TM', '1', "Time of Gain Calibration", '', 'TimeOfGainCalibration'), 0x00143080: ('OB', '1', "Bad Pixel Image", '', 'BadPixelImage'), 0x00143099: ('LT', '1', "Calibration Notes", '', 'CalibrationNotes'), 0x00144002: ('SQ', '1', "Pulser Equipment Sequence", '', 'PulserEquipmentSequence'), 0x00144004: ('CS', '1', "Pulser Type", '', 'PulserType'), 0x00144006: ('LT', '1', "Pulser Notes", '', 'PulserNotes'), 0x00144008: ('SQ', '1', "Receiver Equipment Sequence", '', 'ReceiverEquipmentSequence'), 0x0014400A: ('CS', '1', "Amplifier Type", '', 'AmplifierType'), 0x0014400C: ('LT', '1', "Receiver Notes", '', 'ReceiverNotes'), 0x0014400E: ('SQ', '1', "Pre-Amplifier Equipment Sequence", '', 'PreAmplifierEquipmentSequence'), 0x0014400F: ('LT', '1', "Pre-Amplifier Notes", '', 'PreAmplifierNotes'), 0x00144010: ('SQ', '1', "Transmit Transducer Sequence", '', 'TransmitTransducerSequence'), 0x00144011: ('SQ', '1', "Receive Transducer Sequence", '', 'ReceiveTransducerSequence'), 0x00144012: ('US', '1', "Number of Elements", '', 'NumberOfElements'), 0x00144013: ('CS', '1', "Element Shape", '', 'ElementShape'), 0x00144014: ('DS', '1', "Element Dimension A", '', 'ElementDimensionA'), 0x00144015: ('DS', '1', "Element Dimension B", '', 'ElementDimensionB'), 0x00144016: ('DS', '1', "Element Pitch", '', 'ElementPitch'), 0x00144017: ('DS', '1', "Measured Beam Dimension A", '', 'MeasuredBeamDimensionA'), 0x00144018: ('DS', '1', "Measured Beam Dimension B", '', 'MeasuredBeamDimensionB'), 0x00144019: ('DS', '1', "Location of Measured Beam Diameter", '', 'LocationOfMeasuredBeamDiameter'), 0x0014401A: ('DS', '1', "Nominal Frequency", '', 'NominalFrequency'), 0x0014401B: ('DS', '1', "Measured Center Frequency", '', 'MeasuredCenterFrequency'), 0x0014401C: ('DS', '1', "Measured Bandwidth", '', 'MeasuredBandwidth'), 0x00144020: ('SQ', '1', "Pulser Settings Sequence", '', 'PulserSettingsSequence'), 0x00144022: ('DS', '1', "Pulse Width", '', 'PulseWidth'), 0x00144024: ('DS', '1', "Excitation Frequency", '', 'ExcitationFrequency'), 0x00144026: ('CS', '1', "Modulation Type", '', 'ModulationType'), 0x00144028: ('DS', '1', "Damping", '', 'Damping'), 0x00144030: ('SQ', '1', "Receiver Settings Sequence", '', 'ReceiverSettingsSequence'), 0x00144031: ('DS', '1', "Acquired Soundpath Length", '', 'AcquiredSoundpathLength'), 0x00144032: ('CS', '1', "Acquisition Compression Type", '', 'AcquisitionCompressionType'), 0x00144033: ('IS', '1', "Acquisition Sample Size", '', 'AcquisitionSampleSize'), 0x00144034: ('DS', '1', "Rectifier Smoothing", '', 'RectifierSmoothing'), 0x00144035: ('SQ', '1', "DAC Sequence", '', 'DACSequence'), 0x00144036: ('CS', '1', "DAC Type", '', 'DACType'), 0x00144038: ('DS', '1-n', "DAC Gain Points", '', 'DACGainPoints'), 0x0014403A: ('DS', '1-n', "DAC Time Points", '', 'DACTimePoints'), 0x0014403C: ('DS', '1-n', "DAC Amplitude", '', 'DACAmplitude'), 0x00144040: ('SQ', '1', "Pre-Amplifier Settings Sequence", '', 'PreAmplifierSettingsSequence'), 0x00144050: ('SQ', '1', "Transmit Transducer Settings Sequence", '', 'TransmitTransducerSettingsSequence'), 0x00144051: ('SQ', '1', "Receive Transducer Settings Sequence", '', 'ReceiveTransducerSettingsSequence'), 0x00144052: ('DS', '1', "Incident Angle", '', 'IncidentAngle'), 0x00144054: ('ST', '1', "Coupling Technique", '', 'CouplingTechnique'), 0x00144056: ('ST', '1', "Coupling Medium", '', 'CouplingMedium'), 0x00144057: ('DS', '1', "Coupling Velocity", '', 'CouplingVelocity'), 0x00144058: ('DS', '1', "Crystal Center Location X", '', 'CrystalCenterLocationX'), 0x00144059: ('DS', '1', "Crystal Center Location Z", '', 'CrystalCenterLocationZ'), 0x0014405A: ('DS', '1', "Sound Path Length", '', 'SoundPathLength'), 0x0014405C: ('ST', '1', "Delay Law Identifier", '', 'DelayLawIdentifier'), 0x00144060: ('SQ', '1', "Gate Settings Sequence", '', 'GateSettingsSequence'), 0x00144062: ('DS', '1', "Gate Threshold", '', 'GateThreshold'), 0x00144064: ('DS', '1', "Velocity of Sound", '', 'VelocityOfSound'), 0x00144070: ('SQ', '1', "Calibration Settings Sequence", '', 'CalibrationSettingsSequence'), 0x00144072: ('ST', '1', "Calibration Procedure", '', 'CalibrationProcedure'), 0x00144074: ('SH', '1', "Procedure Version", '', 'ProcedureVersion'), 0x00144076: ('DA', '1', "Procedure Creation Date", '', 'ProcedureCreationDate'), 0x00144078: ('DA', '1', "Procedure Expiration Date", '', 'ProcedureExpirationDate'), 0x0014407A: ('DA', '1', "Procedure Last Modified Date", '', 'ProcedureLastModifiedDate'), 0x0014407C: ('TM', '1-n', "Calibration Time", '', 'CalibrationTime'), 0x0014407E: ('DA', '1-n', "Calibration Date", '', 'CalibrationDate'), 0x00145002: ('IS', '1', "LINAC Energy", '', 'LINACEnergy'), 0x00145004: ('IS', '1', "LINAC Output", '', 'LINACOutput'), 0x00180010: ('LO', '1', "Contrast/Bolus Agent", '', 'ContrastBolusAgent'), 0x00180012: ('SQ', '1', "Contrast/Bolus Agent Sequence", '', 'ContrastBolusAgentSequence'), 0x00180014: ('SQ', '1', "Contrast/Bolus Administration Route Sequence", '', 'ContrastBolusAdministrationRouteSequence'), 0x00180015: ('CS', '1', "Body Part Examined", '', 'BodyPartExamined'), 0x00180020: ('CS', '1-n', "Scanning Sequence", '', 'ScanningSequence'), 0x00180021: ('CS', '1-n', "Sequence Variant", '', 'SequenceVariant'), 0x00180022: ('CS', '1-n', "Scan Options", '', 'ScanOptions'), 0x00180023: ('CS', '1', "MR Acquisition Type", '', 'MRAcquisitionType'), 0x00180024: ('SH', '1', "Sequence Name", '', 'SequenceName'), 0x00180025: ('CS', '1', "Angio Flag", '', 'AngioFlag'), 0x00180026: ('SQ', '1', "Intervention Drug Information Sequence", '', 'InterventionDrugInformationSequence'), 0x00180027: ('TM', '1', "Intervention Drug Stop Time", '', 'InterventionDrugStopTime'), 0x00180028: ('DS', '1', "Intervention Drug Dose", '', 'InterventionDrugDose'), 0x00180029: ('SQ', '1', "Intervention Drug Code Sequence", '', 'InterventionDrugCodeSequence'), 0x0018002A: ('SQ', '1', "Additional Drug Sequence", '', 'AdditionalDrugSequence'), 0x00180030: ('LO', '1-n', "Radionuclide", 'Retired', 'Radionuclide'), 0x00180031: ('LO', '1', "Radiopharmaceutical", '', 'Radiopharmaceutical'), 0x00180032: ('DS', '1', "Energy Window Centerline", 'Retired', 'EnergyWindowCenterline'), 0x00180033: ('DS', '1-n', "Energy Window Total Width", 'Retired', 'EnergyWindowTotalWidth'), 0x00180034: ('LO', '1', "Intervention Drug Name", '', 'InterventionDrugName'), 0x00180035: ('TM', '1', "Intervention Drug Start Time", '', 'InterventionDrugStartTime'), 0x00180036: ('SQ', '1', "Intervention Sequence", '', 'InterventionSequence'), 0x00180037: ('CS', '1', "Therapy Type", 'Retired', 'TherapyType'), 0x00180038: ('CS', '1', "Intervention Status", '', 'InterventionStatus'), 0x00180039: ('CS', '1', "Therapy Description", 'Retired', 'TherapyDescription'), 0x0018003A: ('ST', '1', "Intervention Description", '', 'InterventionDescription'), 0x00180040: ('IS', '1', "Cine Rate", '', 'CineRate'), 0x00180042: ('CS', '1', "Initial Cine Run State", '', 'InitialCineRunState'), 0x00180050: ('DS', '1', "Slice Thickness", '', 'SliceThickness'), 0x00180060: ('DS', '1', "KVP", '', 'KVP'), 0x00180070: ('IS', '1', "Counts Accumulated", '', 'CountsAccumulated'), 0x00180071: ('CS', '1', "Acquisition Termination Condition", '', 'AcquisitionTerminationCondition'), 0x00180072: ('DS', '1', "Effective Duration", '', 'EffectiveDuration'), 0x00180073: ('CS', '1', "Acquisition Start Condition", '', 'AcquisitionStartCondition'), 0x00180074: ('IS', '1', "Acquisition Start Condition Data", '', 'AcquisitionStartConditionData'), 0x00180075: ('IS', '1', "Acquisition Termination Condition Data", '', 'AcquisitionTerminationConditionData'), 0x00180080: ('DS', '1', "Repetition Time", '', 'RepetitionTime'), 0x00180081: ('DS', '1', "Echo Time", '', 'EchoTime'), 0x00180082: ('DS', '1', "Inversion Time", '', 'InversionTime'), 0x00180083: ('DS', '1', "Number of Averages", '', 'NumberOfAverages'), 0x00180084: ('DS', '1', "Imaging Frequency", '', 'ImagingFrequency'), 0x00180085: ('SH', '1', "Imaged Nucleus", '', 'ImagedNucleus'), 0x00180086: ('IS', '1-n', "Echo Number(s)", '', 'EchoNumbers'), 0x00180087: ('DS', '1', "Magnetic Field Strength", '', 'MagneticFieldStrength'), 0x00180088: ('DS', '1', "Spacing Between Slices", '', 'SpacingBetweenSlices'), 0x00180089: ('IS', '1', "Number of Phase Encoding Steps", '', 'NumberOfPhaseEncodingSteps'), 0x00180090: ('DS', '1', "Data Collection Diameter", '', 'DataCollectionDiameter'), 0x00180091: ('IS', '1', "Echo Train Length", '', 'EchoTrainLength'), 0x00180093: ('DS', '1', "Percent Sampling", '', 'PercentSampling'), 0x00180094: ('DS', '1', "Percent Phase Field of View", '', 'PercentPhaseFieldOfView'), 0x00180095: ('DS', '1', "Pixel Bandwidth", '', 'PixelBandwidth'), 0x00181000: ('LO', '1', "Device Serial Number", '', 'DeviceSerialNumber'), 0x00181002: ('UI', '1', "Device UID", '', 'DeviceUID'), 0x00181003: ('LO', '1', "Device ID", '', 'DeviceID'), 0x00181004: ('LO', '1', "Plate ID", '', 'PlateID'), 0x00181005: ('LO', '1', "Generator ID", '', 'GeneratorID'), 0x00181006: ('LO', '1', "Grid ID", '', 'GridID'), 0x00181007: ('LO', '1', "Cassette ID", '', 'CassetteID'), 0x00181008: ('LO', '1', "Gantry ID", '', 'GantryID'), 0x00181010: ('LO', '1', "Secondary Capture Device ID", '', 'SecondaryCaptureDeviceID'), 0x00181011: ('LO', '1', "Hardcopy Creation Device ID", 'Retired', 'HardcopyCreationDeviceID'), 0x00181012: ('DA', '1', "Date of Secondary Capture", '', 'DateOfSecondaryCapture'), 0x00181014: ('TM', '1', "Time of Secondary Capture", '', 'TimeOfSecondaryCapture'), 0x00181016: ('LO', '1', "Secondary Capture Device Manufacturer", '', 'SecondaryCaptureDeviceManufacturer'), 0x00181017: ('LO', '1', "Hardcopy Device Manufacturer", 'Retired', 'HardcopyDeviceManufacturer'), 0x00181018: ('LO', '1', "Secondary Capture Device Manufacturer's Model Name", '', 'SecondaryCaptureDeviceManufacturerModelName'), 0x00181019: ('LO', '1-n', "Secondary Capture Device Software Versions", '', 'SecondaryCaptureDeviceSoftwareVersions'), 0x0018101A: ('LO', '1-n', "Hardcopy Device Software Version", 'Retired', 'HardcopyDeviceSoftwareVersion'), 0x0018101B: ('LO', '1', "Hardcopy Device Manufacturer's Model Name", 'Retired', 'HardcopyDeviceManufacturerModelName'), 0x00181020: ('LO', '1-n', "Software Version(s)", '', 'SoftwareVersions'), 0x00181022: ('SH', '1', "Video Image Format Acquired", '', 'VideoImageFormatAcquired'), 0x00181023: ('LO', '1', "Digital Image Format Acquired", '', 'DigitalImageFormatAcquired'), 0x00181030: ('LO', '1', "Protocol Name", '', 'ProtocolName'), 0x00181040: ('LO', '1', "Contrast/Bolus Route", '', 'ContrastBolusRoute'), 0x00181041: ('DS', '1', "Contrast/Bolus Volume", '', 'ContrastBolusVolume'), 0x00181042: ('TM', '1', "Contrast/Bolus Start Time", '', 'ContrastBolusStartTime'), 0x00181043: ('TM', '1', "Contrast/Bolus Stop Time", '', 'ContrastBolusStopTime'), 0x00181044: ('DS', '1', "Contrast/Bolus Total Dose", '', 'ContrastBolusTotalDose'), 0x00181045: ('IS', '1', "Syringe Counts", '', 'SyringeCounts'), 0x00181046: ('DS', '1-n', "Contrast Flow Rate", '', 'ContrastFlowRate'), 0x00181047: ('DS', '1-n', "Contrast Flow Duration", '', 'ContrastFlowDuration'), 0x00181048: ('CS', '1', "Contrast/Bolus Ingredient", '', 'ContrastBolusIngredient'), 0x00181049: ('DS', '1', "Contrast/Bolus Ingredient Concentration", '', 'ContrastBolusIngredientConcentration'), 0x00181050: ('DS', '1', "Spatial Resolution", '', 'SpatialResolution'), 0x00181060: ('DS', '1', "Trigger Time", '', 'TriggerTime'), 0x00181061: ('LO', '1', "Trigger Source or Type", '', 'TriggerSourceOrType'), 0x00181062: ('IS', '1', "Nominal Interval", '', 'NominalInterval'), 0x00181063: ('DS', '1', "Frame Time", '', 'FrameTime'), 0x00181064: ('LO', '1', "Cardiac Framing Type", '', 'CardiacFramingType'), 0x00181065: ('DS', '1-n', "Frame Time Vector", '', 'FrameTimeVector'), 0x00181066: ('DS', '1', "Frame Delay", '', 'FrameDelay'), 0x00181067: ('DS', '1', "Image Trigger Delay", '', 'ImageTriggerDelay'), 0x00181068: ('DS', '1', "Multiplex Group Time Offset", '', 'MultiplexGroupTimeOffset'), 0x00181069: ('DS', '1', "Trigger Time Offset", '', 'TriggerTimeOffset'), 0x0018106A: ('CS', '1', "Synchronization Trigger", '', 'SynchronizationTrigger'), 0x0018106C: ('US', '2', "Synchronization Channel", '', 'SynchronizationChannel'), 0x0018106E: ('UL', '1', "Trigger Sample Position", '', 'TriggerSamplePosition'), 0x00181070: ('LO', '1', "Radiopharmaceutical Route", '', 'RadiopharmaceuticalRoute'), 0x00181071: ('DS', '1', "Radiopharmaceutical Volume", '', 'RadiopharmaceuticalVolume'), 0x00181072: ('TM', '1', "Radiopharmaceutical Start Time", '', 'RadiopharmaceuticalStartTime'), 0x00181073: ('TM', '1', "Radiopharmaceutical Stop Time", '', 'RadiopharmaceuticalStopTime'), 0x00181074: ('DS', '1', "Radionuclide Total Dose", '', 'RadionuclideTotalDose'), 0x00181075: ('DS', '1', "Radionuclide Half Life", '', 'RadionuclideHalfLife'), 0x00181076: ('DS', '1', "Radionuclide Positron Fraction", '', 'RadionuclidePositronFraction'), 0x00181077: ('DS', '1', "Radiopharmaceutical Specific Activity", '', 'RadiopharmaceuticalSpecificActivity'), 0x00181078: ('DT', '1', "Radiopharmaceutical Start DateTime", '', 'RadiopharmaceuticalStartDateTime'), 0x00181079: ('DT', '1', "Radiopharmaceutical Stop DateTime", '', 'RadiopharmaceuticalStopDateTime'), 0x00181080: ('CS', '1', "Beat Rejection Flag", '', 'BeatRejectionFlag'), 0x00181081: ('IS', '1', "Low R-R Value", '', 'LowRRValue'), 0x00181082: ('IS', '1', "High R-R Value", '', 'HighRRValue'), 0x00181083: ('IS', '1', "Intervals Acquired", '', 'IntervalsAcquired'), 0x00181084: ('IS', '1', "Intervals Rejected", '', 'IntervalsRejected'), 0x00181085: ('LO', '1', "PVC Rejection", '', 'PVCRejection'), 0x00181086: ('IS', '1', "Skip Beats", '', 'SkipBeats'), 0x00181088: ('IS', '1', "Heart Rate", '', 'HeartRate'), 0x00181090: ('IS', '1', "Cardiac Number of Images", '', 'CardiacNumberOfImages'), 0x00181094: ('IS', '1', "Trigger Window", '', 'TriggerWindow'), 0x00181100: ('DS', '1', "Reconstruction Diameter", '', 'ReconstructionDiameter'), 0x00181110: ('DS', '1', "Distance Source to Detector", '', 'DistanceSourceToDetector'), 0x00181111: ('DS', '1', "Distance Source to Patient", '', 'DistanceSourceToPatient'), 0x00181114: ('DS', '1', "Estimated Radiographic Magnification Factor", '', 'EstimatedRadiographicMagnificationFactor'), 0x00181120: ('DS', '1', "Gantry/Detector Tilt", '', 'GantryDetectorTilt'), 0x00181121: ('DS', '1', "Gantry/Detector Slew", '', 'GantryDetectorSlew'), 0x00181130: ('DS', '1', "Table Height", '', 'TableHeight'), 0x00181131: ('DS', '1', "Table Traverse", '', 'TableTraverse'), 0x00181134: ('CS', '1', "Table Motion", '', 'TableMotion'), 0x00181135: ('DS', '1-n', "Table Vertical Increment", '', 'TableVerticalIncrement'), 0x00181136: ('DS', '1-n', "Table Lateral Increment", '', 'TableLateralIncrement'), 0x00181137: ('DS', '1-n', "Table Longitudinal Increment", '', 'TableLongitudinalIncrement'), 0x00181138: ('DS', '1', "Table Angle", '', 'TableAngle'), 0x0018113A: ('CS', '1', "Table Type", '', 'TableType'), 0x00181140: ('CS', '1', "Rotation Direction", '', 'RotationDirection'), 0x00181141: ('DS', '1', "Angular Position", 'Retired', 'AngularPosition'), 0x00181142: ('DS', '1-n', "Radial Position", '', 'RadialPosition'), 0x00181143: ('DS', '1', "Scan Arc", '', 'ScanArc'), 0x00181144: ('DS', '1', "Angular Step", '', 'AngularStep'), 0x00181145: ('DS', '1', "Center of Rotation Offset", '', 'CenterOfRotationOffset'), 0x00181146: ('DS', '1-n', "Rotation Offset", 'Retired', 'RotationOffset'), 0x00181147: ('CS', '1', "Field of View Shape", '', 'FieldOfViewShape'), 0x00181149: ('IS', '1-2', "Field of View Dimension(s)", '', 'FieldOfViewDimensions'), 0x00181150: ('IS', '1', "Exposure Time", '', 'ExposureTime'), 0x00181151: ('IS', '1', "X-Ray Tube Current", '', 'XRayTubeCurrent'), 0x00181152: ('IS', '1', "Exposure", '', 'Exposure'), 0x00181153: ('IS', '1', "Exposure in uAs", '', 'ExposureInuAs'), 0x00181154: ('DS', '1', "Average Pulse Width", '', 'AveragePulseWidth'), 0x00181155: ('CS', '1', "Radiation Setting", '', 'RadiationSetting'), 0x00181156: ('CS', '1', "Rectification Type", '', 'RectificationType'), 0x0018115A: ('CS', '1', "Radiation Mode", '', 'RadiationMode'), 0x0018115E: ('DS', '1', "Image and Fluoroscopy Area Dose Product", '', 'ImageAndFluoroscopyAreaDoseProduct'), 0x00181160: ('SH', '1', "Filter Type", '', 'FilterType'), 0x00181161: ('LO', '1-n', "Type of Filters", '', 'TypeOfFilters'), 0x00181162: ('DS', '1', "Intensifier Size", '', 'IntensifierSize'), 0x00181164: ('DS', '2', "Imager Pixel Spacing", '', 'ImagerPixelSpacing'), 0x00181166: ('CS', '1-n', "Grid", '', 'Grid'), 0x00181170: ('IS', '1', "Generator Power", '', 'GeneratorPower'), 0x00181180: ('SH', '1', "Collimator/grid Name", '', 'CollimatorGridName'), 0x00181181: ('CS', '1', "Collimator Type", '', 'CollimatorType'), 0x00181182: ('IS', '1-2', "Focal Distance", '', 'FocalDistance'), 0x00181183: ('DS', '1-2', "X Focus Center", '', 'XFocusCenter'), 0x00181184: ('DS', '1-2', "Y Focus Center", '', 'YFocusCenter'), 0x00181190: ('DS', '1-n', "Focal Spot(s)", '', 'FocalSpots'), 0x00181191: ('CS', '1', "Anode Target Material", '', 'AnodeTargetMaterial'), 0x001811A0: ('DS', '1', "Body Part Thickness", '', 'BodyPartThickness'), 0x001811A2: ('DS', '1', "Compression Force", '', 'CompressionForce'), 0x00181200: ('DA', '1-n', "Date of Last Calibration", '', 'DateOfLastCalibration'), 0x00181201: ('TM', '1-n', "Time of Last Calibration", '', 'TimeOfLastCalibration'), 0x00181210: ('SH', '1-n', "Convolution Kernel", '', 'ConvolutionKernel'), 0x00181240: ('IS', '1-n', "Upper/Lower Pixel Values", 'Retired', 'UpperLowerPixelValues'), 0x00181242: ('IS', '1', "Actual Frame Duration", '', 'ActualFrameDuration'), 0x00181243: ('IS', '1', "Count Rate", '', 'CountRate'), 0x00181244: ('US', '1', "Preferred Playback Sequencing", '', 'PreferredPlaybackSequencing'), 0x00181250: ('SH', '1', "Receive Coil Name", '', 'ReceiveCoilName'), 0x00181251: ('SH', '1', "Transmit Coil Name", '', 'TransmitCoilName'), 0x00181260: ('SH', '1', "Plate Type", '', 'PlateType'), 0x00181261: ('LO', '1', "Phosphor Type", '', 'PhosphorType'), 0x00181300: ('DS', '1', "Scan Velocity", '', 'ScanVelocity'), 0x00181301: ('CS', '1-n', "Whole Body Technique", '', 'WholeBodyTechnique'), 0x00181302: ('IS', '1', "Scan Length", '', 'ScanLength'), 0x00181310: ('US', '4', "Acquisition Matrix", '', 'AcquisitionMatrix'), 0x00181312: ('CS', '1', "In-plane Phase Encoding Direction", '', 'InPlanePhaseEncodingDirection'), 0x00181314: ('DS', '1', "Flip Angle", '', 'FlipAngle'), 0x00181315: ('CS', '1', "Variable Flip Angle Flag", '', 'VariableFlipAngleFlag'), 0x00181316: ('DS', '1', "SAR", '', 'SAR'), 0x00181318: ('DS', '1', "dB/dt", '', 'dBdt'), 0x00181400: ('LO', '1', "Acquisition Device Processing Description", '', 'AcquisitionDeviceProcessingDescription'), 0x00181401: ('LO', '1', "Acquisition Device Processing Code", '', 'AcquisitionDeviceProcessingCode'), 0x00181402: ('CS', '1', "Cassette Orientation", '', 'CassetteOrientation'), 0x00181403: ('CS', '1', "Cassette Size", '', 'CassetteSize'), 0x00181404: ('US', '1', "Exposures on Plate", '', 'ExposuresOnPlate'), 0x00181405: ('IS', '1', "Relative X-Ray Exposure", '', 'RelativeXRayExposure'), 0x00181411: ('DS', '1', "Exposure Index", '', 'ExposureIndex'), 0x00181412: ('DS', '1', "Target Exposure Index", '', 'TargetExposureIndex'), 0x00181413: ('DS', '1', "Deviation Index", '', 'DeviationIndex'), 0x00181450: ('DS', '1', "Column Angulation", '', 'ColumnAngulation'), 0x00181460: ('DS', '1', "Tomo Layer Height", '', 'TomoLayerHeight'), 0x00181470: ('DS', '1', "Tomo Angle", '', 'TomoAngle'), 0x00181480: ('DS', '1', "Tomo Time", '', 'TomoTime'), 0x00181490: ('CS', '1', "Tomo Type", '', 'TomoType'), 0x00181491: ('CS', '1', "Tomo Class", '', 'TomoClass'), 0x00181495: ('IS', '1', "Number of Tomosynthesis Source Images", '', 'NumberOfTomosynthesisSourceImages'), 0x00181500: ('CS', '1', "Positioner Motion", '', 'PositionerMotion'), 0x00181508: ('CS', '1', "Positioner Type", '', 'PositionerType'), 0x00181510: ('DS', '1', "Positioner Primary Angle", '', 'PositionerPrimaryAngle'), 0x00181511: ('DS', '1', "Positioner Secondary Angle", '', 'PositionerSecondaryAngle'), 0x00181520: ('DS', '1-n', "Positioner Primary Angle Increment", '', 'PositionerPrimaryAngleIncrement'), 0x00181521: ('DS', '1-n', "Positioner Secondary Angle Increment", '', 'PositionerSecondaryAngleIncrement'), 0x00181530: ('DS', '1', "Detector Primary Angle", '', 'DetectorPrimaryAngle'), 0x00181531: ('DS', '1', "Detector Secondary Angle", '', 'DetectorSecondaryAngle'), 0x00181600: ('CS', '1-3', "Shutter Shape", '', 'ShutterShape'), 0x00181602: ('IS', '1', "Shutter Left Vertical Edge", '', 'ShutterLeftVerticalEdge'), 0x00181604: ('IS', '1', "Shutter Right Vertical Edge", '', 'ShutterRightVerticalEdge'), 0x00181606: ('IS', '1', "Shutter Upper Horizontal Edge", '', 'ShutterUpperHorizontalEdge'), 0x00181608: ('IS', '1', "Shutter Lower Horizontal Edge", '', 'ShutterLowerHorizontalEdge'), 0x00181610: ('IS', '2', "Center of Circular Shutter", '', 'CenterOfCircularShutter'), 0x00181612: ('IS', '1', "Radius of Circular Shutter", '', 'RadiusOfCircularShutter'), 0x00181620: ('IS', '2-2n', "Vertices of the Polygonal Shutter", '', 'VerticesOfThePolygonalShutter'), 0x00181622: ('US', '1', "Shutter Presentation Value", '', 'ShutterPresentationValue'), 0x00181623: ('US', '1', "Shutter Overlay Group", '', 'ShutterOverlayGroup'), 0x00181624: ('US', '3', "Shutter Presentation Color CIELab Value", '', 'ShutterPresentationColorCIELabValue'), 0x00181700: ('CS', '1-3', "Collimator Shape", '', 'CollimatorShape'), 0x00181702: ('IS', '1', "Collimator Left Vertical Edge", '', 'CollimatorLeftVerticalEdge'), 0x00181704: ('IS', '1', "Collimator Right Vertical Edge", '', 'CollimatorRightVerticalEdge'), 0x00181706: ('IS', '1', "Collimator Upper Horizontal Edge", '', 'CollimatorUpperHorizontalEdge'), 0x00181708: ('IS', '1', "Collimator Lower Horizontal Edge", '', 'CollimatorLowerHorizontalEdge'), 0x00181710: ('IS', '2', "Center of Circular Collimator", '', 'CenterOfCircularCollimator'), 0x00181712: ('IS', '1', "Radius of Circular Collimator", '', 'RadiusOfCircularCollimator'), 0x00181720: ('IS', '2-2n', "Vertices of the Polygonal Collimator", '', 'VerticesOfThePolygonalCollimator'), 0x00181800: ('CS', '1', "Acquisition Time Synchronized", '', 'AcquisitionTimeSynchronized'), 0x00181801: ('SH', '1', "Time Source", '', 'TimeSource'), 0x00181802: ('CS', '1', "Time Distribution Protocol", '', 'TimeDistributionProtocol'), 0x00181803: ('LO', '1', "NTP Source Address", '', 'NTPSourceAddress'), 0x00182001: ('IS', '1-n', "Page Number Vector", '', 'PageNumberVector'), 0x00182002: ('SH', '1-n', "Frame Label Vector", '', 'FrameLabelVector'), 0x00182003: ('DS', '1-n', "Frame Primary Angle Vector", '', 'FramePrimaryAngleVector'), 0x00182004: ('DS', '1-n', "Frame Secondary Angle Vector", '', 'FrameSecondaryAngleVector'), 0x00182005: ('DS', '1-n', "Slice Location Vector", '', 'SliceLocationVector'), 0x00182006: ('SH', '1-n', "Display Window Label Vector", '', 'DisplayWindowLabelVector'), 0x00182010: ('DS', '2', "Nominal Scanned Pixel Spacing", '', 'NominalScannedPixelSpacing'), 0x00182020: ('CS', '1', "Digitizing Device Transport Direction", '', 'DigitizingDeviceTransportDirection'), 0x00182030: ('DS', '1', "Rotation of Scanned Film", '', 'RotationOfScannedFilm'), 0x00183100: ('CS', '1', "IVUS Acquisition", '', 'IVUSAcquisition'), 0x00183101: ('DS', '1', "IVUS Pullback Rate", '', 'IVUSPullbackRate'), 0x00183102: ('DS', '1', "IVUS Gated Rate", '', 'IVUSGatedRate'), 0x00183103: ('IS', '1', "IVUS Pullback Start Frame Number", '', 'IVUSPullbackStartFrameNumber'), 0x00183104: ('IS', '1', "IVUS Pullback Stop Frame Number", '', 'IVUSPullbackStopFrameNumber'), 0x00183105: ('IS', '1-n', "Lesion Number", '', 'LesionNumber'), 0x00184000: ('LT', '1', "Acquisition Comments", 'Retired', 'AcquisitionComments'), 0x00185000: ('SH', '1-n', "Output Power", '', 'OutputPower'), 0x00185010: ('LO', '1-n', "Transducer Data", '', 'TransducerData'), 0x00185012: ('DS', '1', "Focus Depth", '', 'FocusDepth'), 0x00185020: ('LO', '1', "Processing Function", '', 'ProcessingFunction'), 0x00185021: ('LO', '1', "Postprocessing Function", 'Retired', 'PostprocessingFunction'), 0x00185022: ('DS', '1', "Mechanical Index", '', 'MechanicalIndex'), 0x00185024: ('DS', '1', "Bone Thermal Index", '', 'BoneThermalIndex'), 0x00185026: ('DS', '1', "Cranial Thermal Index", '', 'CranialThermalIndex'), 0x00185027: ('DS', '1', "Soft Tissue Thermal Index", '', 'SoftTissueThermalIndex'), 0x00185028: ('DS', '1', "Soft Tissue-focus Thermal Index", '', 'SoftTissueFocusThermalIndex'), 0x00185029: ('DS', '1', "Soft Tissue-surface Thermal Index", '', 'SoftTissueSurfaceThermalIndex'), 0x00185030: ('DS', '1', "Dynamic Range", 'Retired', 'DynamicRange'), 0x00185040: ('DS', '1', "Total Gain", 'Retired', 'TotalGain'), 0x00185050: ('IS', '1', "Depth of Scan Field", '', 'DepthOfScanField'), 0x00185100: ('CS', '1', "Patient Position", '', 'PatientPosition'), 0x00185101: ('CS', '1', "View Position", '', 'ViewPosition'), 0x00185104: ('SQ', '1', "Projection Eponymous Name Code Sequence", '', 'ProjectionEponymousNameCodeSequence'), 0x00185210: ('DS', '6', "Image Transformation Matrix", 'Retired', 'ImageTransformationMatrix'), 0x00185212: ('DS', '3', "Image Translation Vector", 'Retired', 'ImageTranslationVector'), 0x00186000: ('DS', '1', "Sensitivity", '', 'Sensitivity'), 0x00186011: ('SQ', '1', "Sequence of Ultrasound Regions", '', 'SequenceOfUltrasoundRegions'), 0x00186012: ('US', '1', "Region Spatial Format", '', 'RegionSpatialFormat'), 0x00186014: ('US', '1', "Region Data Type", '', 'RegionDataType'), 0x00186016: ('UL', '1', "Region Flags", '', 'RegionFlags'), 0x00186018: ('UL', '1', "Region Location Min X0", '', 'RegionLocationMinX0'), 0x0018601A: ('UL', '1', "Region Location Min Y0", '', 'RegionLocationMinY0'), 0x0018601C: ('UL', '1', "Region Location Max X1", '', 'RegionLocationMaxX1'), 0x0018601E: ('UL', '1', "Region Location Max Y1", '', 'RegionLocationMaxY1'), 0x00186020: ('SL', '1', "Reference Pixel X0", '', 'ReferencePixelX0'), 0x00186022: ('SL', '1', "Reference Pixel Y0", '', 'ReferencePixelY0'), 0x00186024: ('US', '1', "Physical Units X Direction", '', 'PhysicalUnitsXDirection'), 0x00186026: ('US', '1', "Physical Units Y Direction", '', 'PhysicalUnitsYDirection'), 0x00186028: ('FD', '1', "Reference Pixel Physical Value X", '', 'ReferencePixelPhysicalValueX'), 0x0018602A: ('FD', '1', "Reference Pixel Physical Value Y", '', 'ReferencePixelPhysicalValueY'), 0x0018602C: ('FD', '1', "Physical Delta X", '', 'PhysicalDeltaX'), 0x0018602E: ('FD', '1', "Physical Delta Y", '', 'PhysicalDeltaY'), 0x00186030: ('UL', '1', "Transducer Frequency", '', 'TransducerFrequency'), 0x00186031: ('CS', '1', "Transducer Type", '', 'TransducerType'), 0x00186032: ('UL', '1', "Pulse Repetition Frequency", '', 'PulseRepetitionFrequency'), 0x00186034: ('FD', '1', "Doppler Correction Angle", '', 'DopplerCorrectionAngle'), 0x00186036: ('FD', '1', "Steering Angle", '', 'SteeringAngle'), 0x00186038: ('UL', '1', "Doppler Sample Volume X Position (Retired)", 'Retired', 'DopplerSampleVolumeXPositionRetired'), 0x00186039: ('SL', '1', "Doppler Sample Volume X Position", '', 'DopplerSampleVolumeXPosition'), 0x0018603A: ('UL', '1', "Doppler Sample Volume Y Position (Retired)", 'Retired', 'DopplerSampleVolumeYPositionRetired'), 0x0018603B: ('SL', '1', "Doppler Sample Volume Y Position", '', 'DopplerSampleVolumeYPosition'), 0x0018603C: ('UL', '1', "TM-Line Position X0 (Retired)", 'Retired', 'TMLinePositionX0Retired'), 0x0018603D: ('SL', '1', "TM-Line Position X0", '', 'TMLinePositionX0'), 0x0018603E: ('UL', '1', "TM-Line Position Y0 (Retired)", 'Retired', 'TMLinePositionY0Retired'), 0x0018603F: ('SL', '1', "TM-Line Position Y0", '', 'TMLinePositionY0'), 0x00186040: ('UL', '1', "TM-Line Position X1 (Retired)", 'Retired', 'TMLinePositionX1Retired'), 0x00186041: ('SL', '1', "TM-Line Position X1", '', 'TMLinePositionX1'), 0x00186042: ('UL', '1', "TM-Line Position Y1 (Retired)", 'Retired', 'TMLinePositionY1Retired'), 0x00186043: ('SL', '1', "TM-Line Position Y1", '', 'TMLinePositionY1'), 0x00186044: ('US', '1', "Pixel Component Organization", '', 'PixelComponentOrganization'), 0x00186046: ('UL', '1', "Pixel Component Mask", '', 'PixelComponentMask'), 0x00186048: ('UL', '1', "Pixel Component Range Start", '', 'PixelComponentRangeStart'), 0x0018604A: ('UL', '1', "Pixel Component Range Stop", '', 'PixelComponentRangeStop'), 0x0018604C: ('US', '1', "Pixel Component Physical Units", '', 'PixelComponentPhysicalUnits'), 0x0018604E: ('US', '1', "Pixel Component Data Type", '', 'PixelComponentDataType'), 0x00186050: ('UL', '1', "Number of Table Break Points", '', 'NumberOfTableBreakPoints'), 0x00186052: ('UL', '1-n', "Table of X Break Points", '', 'TableOfXBreakPoints'), 0x00186054: ('FD', '1-n', "Table of Y Break Points", '', 'TableOfYBreakPoints'), 0x00186056: ('UL', '1', "Number of Table Entries", '', 'NumberOfTableEntries'), 0x00186058: ('UL', '1-n', "Table of Pixel Values", '', 'TableOfPixelValues'), 0x0018605A: ('FL', '1-n', "Table of Parameter Values", '', 'TableOfParameterValues'), 0x00186060: ('FL', '1-n', "R Wave Time Vector", '', 'RWaveTimeVector'), 0x00187000: ('CS', '1', "Detector Conditions Nominal Flag", '', 'DetectorConditionsNominalFlag'), 0x00187001: ('DS', '1', "Detector Temperature", '', 'DetectorTemperature'), 0x00187004: ('CS', '1', "Detector Type", '', 'DetectorType'), 0x00187005: ('CS', '1', "Detector Configuration", '', 'DetectorConfiguration'), 0x00187006: ('LT', '1', "Detector Description", '', 'DetectorDescription'), 0x00187008: ('LT', '1', "Detector Mode", '', 'DetectorMode'), 0x0018700A: ('SH', '1', "Detector ID", '', 'DetectorID'), 0x0018700C: ('DA', '1', "Date of Last Detector Calibration", '', 'DateOfLastDetectorCalibration'), 0x0018700E: ('TM', '1', "Time of Last Detector Calibration", '', 'TimeOfLastDetectorCalibration'), 0x00187010: ('IS', '1', "Exposures on Detector Since Last Calibration", '', 'ExposuresOnDetectorSinceLastCalibration'), 0x00187011: ('IS', '1', "Exposures on Detector Since Manufactured", '', 'ExposuresOnDetectorSinceManufactured'), 0x00187012: ('DS', '1', "Detector Time Since Last Exposure", '', 'DetectorTimeSinceLastExposure'), 0x00187014: ('DS', '1', "Detector Active Time", '', 'DetectorActiveTime'), 0x00187016: ('DS', '1', "Detector Activation Offset From Exposure", '', 'DetectorActivationOffsetFromExposure'), 0x0018701A: ('DS', '2', "Detector Binning", '', 'DetectorBinning'), 0x00187020: ('DS', '2', "Detector Element Physical Size", '', 'DetectorElementPhysicalSize'), 0x00187022: ('DS', '2', "Detector Element Spacing", '', 'DetectorElementSpacing'), 0x00187024: ('CS', '1', "Detector Active Shape", '', 'DetectorActiveShape'), 0x00187026: ('DS', '1-2', "Detector Active Dimension(s)", '', 'DetectorActiveDimensions'), 0x00187028: ('DS', '2', "Detector Active Origin", '', 'DetectorActiveOrigin'), 0x0018702A: ('LO', '1', "Detector Manufacturer Name", '', 'DetectorManufacturerName'), 0x0018702B: ('LO', '1', "Detector Manufacturer's Model Name", '', 'DetectorManufacturerModelName'), 0x00187030: ('DS', '2', "Field of View Origin", '', 'FieldOfViewOrigin'), 0x00187032: ('DS', '1', "Field of View Rotation", '', 'FieldOfViewRotation'), 0x00187034: ('CS', '1', "Field of View Horizontal Flip", '', 'FieldOfViewHorizontalFlip'), 0x00187036: ('FL', '2', "Pixel Data Area Origin Relative To FOV", '', 'PixelDataAreaOriginRelativeToFOV'), 0x00187038: ('FL', '1', "Pixel Data Area Rotation Angle Relative To FOV", '', 'PixelDataAreaRotationAngleRelativeToFOV'), 0x00187040: ('LT', '1', "Grid Absorbing Material", '', 'GridAbsorbingMaterial'), 0x00187041: ('LT', '1', "Grid Spacing Material", '', 'GridSpacingMaterial'), 0x00187042: ('DS', '1', "Grid Thickness", '', 'GridThickness'), 0x00187044: ('DS', '1', "Grid Pitch", '', 'GridPitch'), 0x00187046: ('IS', '2', "Grid Aspect Ratio", '', 'GridAspectRatio'), 0x00187048: ('DS', '1', "Grid Period", '', 'GridPeriod'), 0x0018704C: ('DS', '1', "Grid Focal Distance", '', 'GridFocalDistance'), 0x00187050: ('CS', '1-n', "Filter Material", '', 'FilterMaterial'), 0x00187052: ('DS', '1-n', "Filter Thickness Minimum", '', 'FilterThicknessMinimum'), 0x00187054: ('DS', '1-n', "Filter Thickness Maximum", '', 'FilterThicknessMaximum'), 0x00187056: ('FL', '1-n', "Filter Beam Path Length Minimum", '', 'FilterBeamPathLengthMinimum'), 0x00187058: ('FL', '1-n', "Filter Beam Path Length Maximum", '', 'FilterBeamPathLengthMaximum'), 0x00187060: ('CS', '1', "Exposure Control Mode", '', 'ExposureControlMode'), 0x00187062: ('LT', '1', "Exposure Control Mode Description", '', 'ExposureControlModeDescription'), 0x00187064: ('CS', '1', "Exposure Status", '', 'ExposureStatus'), 0x00187065: ('DS', '1', "Phototimer Setting", '', 'PhototimerSetting'), 0x00188150: ('DS', '1', "Exposure Time in uS", '', 'ExposureTimeInuS'), 0x00188151: ('DS', '1', "X-Ray Tube Current in uA", '', 'XRayTubeCurrentInuA'), 0x00189004: ('CS', '1', "Content Qualification", '', 'ContentQualification'), 0x00189005: ('SH', '1', "Pulse Sequence Name", '', 'PulseSequenceName'), 0x00189006: ('SQ', '1', "MR Imaging Modifier Sequence", '', 'MRImagingModifierSequence'), 0x00189008: ('CS', '1', "Echo Pulse Sequence", '', 'EchoPulseSequence'), 0x00189009: ('CS', '1', "Inversion Recovery", '', 'InversionRecovery'), 0x00189010: ('CS', '1', "Flow Compensation", '', 'FlowCompensation'), 0x00189011: ('CS', '1', "Multiple Spin Echo", '', 'MultipleSpinEcho'), 0x00189012: ('CS', '1', "Multi-planar Excitation", '', 'MultiPlanarExcitation'), 0x00189014: ('CS', '1', "Phase Contrast", '', 'PhaseContrast'), 0x00189015: ('CS', '1', "Time of Flight Contrast", '', 'TimeOfFlightContrast'), 0x00189016: ('CS', '1', "Spoiling", '', 'Spoiling'), 0x00189017: ('CS', '1', "Steady State Pulse Sequence", '', 'SteadyStatePulseSequence'), 0x00189018: ('CS', '1', "Echo Planar Pulse Sequence", '', 'EchoPlanarPulseSequence'), 0x00189019: ('FD', '1', "Tag Angle First Axis", '', 'TagAngleFirstAxis'), 0x00189020: ('CS', '1', "Magnetization Transfer", '', 'MagnetizationTransfer'), 0x00189021: ('CS', '1', "T2 Preparation", '', 'T2Preparation'), 0x00189022: ('CS', '1', "Blood Signal Nulling", '', 'BloodSignalNulling'), 0x00189024: ('CS', '1', "Saturation Recovery", '', 'SaturationRecovery'), 0x00189025: ('CS', '1', "Spectrally Selected Suppression", '', 'SpectrallySelectedSuppression'), 0x00189026: ('CS', '1', "Spectrally Selected Excitation", '', 'SpectrallySelectedExcitation'), 0x00189027: ('CS', '1', "Spatial Pre-saturation", '', 'SpatialPresaturation'), 0x00189028: ('CS', '1', "Tagging", '', 'Tagging'), 0x00189029: ('CS', '1', "Oversampling Phase", '', 'OversamplingPhase'), 0x00189030: ('FD', '1', "Tag Spacing First Dimension", '', 'TagSpacingFirstDimension'), 0x00189032: ('CS', '1', "Geometry of k-Space Traversal", '', 'GeometryOfKSpaceTraversal'), 0x00189033: ('CS', '1', "Segmented k-Space Traversal", '', 'SegmentedKSpaceTraversal'), 0x00189034: ('CS', '1', "Rectilinear Phase Encode Reordering", '', 'RectilinearPhaseEncodeReordering'), 0x00189035: ('FD', '1', "Tag Thickness", '', 'TagThickness'), 0x00189036: ('CS', '1', "Partial Fourier Direction", '', 'PartialFourierDirection'), 0x00189037: ('CS', '1', "Cardiac Synchronization Technique", '', 'CardiacSynchronizationTechnique'), 0x00189041: ('LO', '1', "Receive Coil Manufacturer Name", '', 'ReceiveCoilManufacturerName'), 0x00189042: ('SQ', '1', "MR Receive Coil Sequence", '', 'MRReceiveCoilSequence'), 0x00189043: ('CS', '1', "Receive Coil Type", '', 'ReceiveCoilType'), 0x00189044: ('CS', '1', "Quadrature Receive Coil", '', 'QuadratureReceiveCoil'), 0x00189045: ('SQ', '1', "Multi-Coil Definition Sequence", '', 'MultiCoilDefinitionSequence'), 0x00189046: ('LO', '1', "Multi-Coil Configuration", '', 'MultiCoilConfiguration'), 0x00189047: ('SH', '1', "Multi-Coil Element Name", '', 'MultiCoilElementName'), 0x00189048: ('CS', '1', "Multi-Coil Element Used", '', 'MultiCoilElementUsed'), 0x00189049: ('SQ', '1', "MR Transmit Coil Sequence", '', 'MRTransmitCoilSequence'), 0x00189050: ('LO', '1', "Transmit Coil Manufacturer Name", '', 'TransmitCoilManufacturerName'), 0x00189051: ('CS', '1', "Transmit Coil Type", '', 'TransmitCoilType'), 0x00189052: ('FD', '1-2', "Spectral Width", '', 'SpectralWidth'), 0x00189053: ('FD', '1-2', "Chemical Shift Reference", '', 'ChemicalShiftReference'), 0x00189054: ('CS', '1', "Volume Localization Technique", '', 'VolumeLocalizationTechnique'), 0x00189058: ('US', '1', "MR Acquisition Frequency Encoding Steps", '', 'MRAcquisitionFrequencyEncodingSteps'), 0x00189059: ('CS', '1', "De-coupling", '', 'Decoupling'), 0x00189060: ('CS', '1-2', "De-coupled Nucleus", '', 'DecoupledNucleus'), 0x00189061: ('FD', '1-2', "De-coupling Frequency", '', 'DecouplingFrequency'), 0x00189062: ('CS', '1', "De-coupling Method", '', 'DecouplingMethod'), 0x00189063: ('FD', '1-2', "De-coupling Chemical Shift Reference", '', 'DecouplingChemicalShiftReference'), 0x00189064: ('CS', '1', "k-space Filtering", '', 'KSpaceFiltering'), 0x00189065: ('CS', '1-2', "Time Domain Filtering", '', 'TimeDomainFiltering'), 0x00189066: ('US', '1-2', "Number of Zero Fills", '', 'NumberOfZeroFills'), 0x00189067: ('CS', '1', "Baseline Correction", '', 'BaselineCorrection'), 0x00189069: ('FD', '1', "Parallel Reduction Factor In-plane", '', 'ParallelReductionFactorInPlane'), 0x00189070: ('FD', '1', "Cardiac R-R Interval Specified", '', 'CardiacRRIntervalSpecified'), 0x00189073: ('FD', '1', "Acquisition Duration", '', 'AcquisitionDuration'), 0x00189074: ('DT', '1', "Frame Acquisition DateTime", '', 'FrameAcquisitionDateTime'), 0x00189075: ('CS', '1', "Diffusion Directionality", '', 'DiffusionDirectionality'), 0x00189076: ('SQ', '1', "Diffusion Gradient Direction Sequence", '', 'DiffusionGradientDirectionSequence'), 0x00189077: ('CS', '1', "Parallel Acquisition", '', 'ParallelAcquisition'), 0x00189078: ('CS', '1', "Parallel Acquisition Technique", '', 'ParallelAcquisitionTechnique'), 0x00189079: ('FD', '1-n', "Inversion Times", '', 'InversionTimes'), 0x00189080: ('ST', '1', "Metabolite Map Description", '', 'MetaboliteMapDescription'), 0x00189081: ('CS', '1', "Partial Fourier", '', 'PartialFourier'), 0x00189082: ('FD', '1', "Effective Echo Time", '', 'EffectiveEchoTime'), 0x00189083: ('SQ', '1', "Metabolite Map Code Sequence", '', 'MetaboliteMapCodeSequence'), 0x00189084: ('SQ', '1', "Chemical Shift Sequence", '', 'ChemicalShiftSequence'), 0x00189085: ('CS', '1', "Cardiac Signal Source", '', 'CardiacSignalSource'), 0x00189087: ('FD', '1', "Diffusion b-value", '', 'DiffusionBValue'), 0x00189089: ('FD', '3', "Diffusion Gradient Orientation", '', 'DiffusionGradientOrientation'), 0x00189090: ('FD', '3', "Velocity Encoding Direction", '', 'VelocityEncodingDirection'), 0x00189091: ('FD', '1', "Velocity Encoding Minimum Value", '', 'VelocityEncodingMinimumValue'), 0x00189092: ('SQ', '1', "Velocity Encoding Acquisition Sequence", '', 'VelocityEncodingAcquisitionSequence'), 0x00189093: ('US', '1', "Number of k-Space Trajectories", '', 'NumberOfKSpaceTrajectories'), 0x00189094: ('CS', '1', "Coverage of k-Space", '', 'CoverageOfKSpace'), 0x00189095: ('UL', '1', "Spectroscopy Acquisition Phase Rows", '', 'SpectroscopyAcquisitionPhaseRows'), 0x00189096: ('FD', '1', "Parallel Reduction Factor In-plane (Retired)", 'Retired', 'ParallelReductionFactorInPlaneRetired'), 0x00189098: ('FD', '1-2', "Transmitter Frequency", '', 'TransmitterFrequency'), 0x00189100: ('CS', '1-2', "Resonant Nucleus", '', 'ResonantNucleus'), 0x00189101: ('CS', '1', "Frequency Correction", '', 'FrequencyCorrection'), 0x00189103: ('SQ', '1', "MR Spectroscopy FOV/Geometry Sequence", '', 'MRSpectroscopyFOVGeometrySequence'), 0x00189104: ('FD', '1', "Slab Thickness", '', 'SlabThickness'), 0x00189105: ('FD', '3', "Slab Orientation", '', 'SlabOrientation'), 0x00189106: ('FD', '3', "Mid Slab Position", '', 'MidSlabPosition'), 0x00189107: ('SQ', '1', "MR Spatial Saturation Sequence", '', 'MRSpatialSaturationSequence'), 0x00189112: ('SQ', '1', "MR Timing and Related Parameters Sequence", '', 'MRTimingAndRelatedParametersSequence'), 0x00189114: ('SQ', '1', "MR Echo Sequence", '', 'MREchoSequence'), 0x00189115: ('SQ', '1', "MR Modifier Sequence", '', 'MRModifierSequence'), 0x00189117: ('SQ', '1', "MR Diffusion Sequence", '', 'MRDiffusionSequence'), 0x00189118: ('SQ', '1', "Cardiac Synchronization", '', 'CardiacSynchronization'), 0x00189119: ('SQ', '1', "MR Averages Sequence", '', 'MRAveragesSequence'), 0x00189125: ('SQ', '1', "MR FOV/Geometry Sequence", '', 'MRFOVGeometrySequence'), 0x00189126: ('SQ', '1', "Volume Localization Sequence", '', 'VolumeLocalizationSequence'), 0x00189127: ('UL', '1', "Spectroscopy Acquisition Data Columns", '', 'SpectroscopyAcquisitionDataColumns'), 0x00189147: ('CS', '1', "Diffusion Anisotropy Type", '', 'DiffusionAnisotropyType'), 0x00189151: ('DT', '1', "Frame Reference DateTime", '', 'FrameReferenceDateTime'), 0x00189152: ('SQ', '1', "MR Metabolite Map Sequence", '', 'MRMetaboliteMapSequence'), 0x00189155: ('FD', '1', "Parallel Reduction Factor out-of-plane", '', 'ParallelReductionFactorOutOfPlane'), 0x00189159: ('UL', '1', "Spectroscopy Acquisition Out-of-plane Phase Steps", '', 'SpectroscopyAcquisitionOutOfPlanePhaseSteps'), 0x00189166: ('CS', '1', "Bulk Motion Status", 'Retired', 'BulkMotionStatus'), 0x00189168: ('FD', '1', "Parallel Reduction Factor Second In-plane", '', 'ParallelReductionFactorSecondInPlane'), 0x00189169: ('CS', '1', "Cardiac Beat Rejection Technique", '', 'CardiacBeatRejectionTechnique'), 0x00189170: ('CS', '1', "Respiratory Motion Compensation Technique", '', 'RespiratoryMotionCompensationTechnique'), 0x00189171: ('CS', '1', "Respiratory Signal Source", '', 'RespiratorySignalSource'), 0x00189172: ('CS', '1', "Bulk Motion Compensation Technique", '', 'BulkMotionCompensationTechnique'), 0x00189173: ('CS', '1', "Bulk Motion Signal Source", '', 'BulkMotionSignalSource'), 0x00189174: ('CS', '1', "Applicable Safety Standard Agency", '', 'ApplicableSafetyStandardAgency'), 0x00189175: ('LO', '1', "Applicable Safety Standard Description", '', 'ApplicableSafetyStandardDescription'), 0x00189176: ('SQ', '1', "Operating Mode Sequence", '', 'OperatingModeSequence'), 0x00189177: ('CS', '1', "Operating Mode Type", '', 'OperatingModeType'), 0x00189178: ('CS', '1', "Operating Mode", '', 'OperatingMode'), 0x00189179: ('CS', '1', "Specific Absorption Rate Definition", '', 'SpecificAbsorptionRateDefinition'), 0x00189180: ('CS', '1', "Gradient Output Type", '', 'GradientOutputType'), 0x00189181: ('FD', '1', "Specific Absorption Rate Value", '', 'SpecificAbsorptionRateValue'), 0x00189182: ('FD', '1', "Gradient Output", '', 'GradientOutput'), 0x00189183: ('CS', '1', "Flow Compensation Direction", '', 'FlowCompensationDirection'), 0x00189184: ('FD', '1', "Tagging Delay", '', 'TaggingDelay'), 0x00189185: ('ST', '1', "Respiratory Motion Compensation Technique Description", '', 'RespiratoryMotionCompensationTechniqueDescription'), 0x00189186: ('SH', '1', "Respiratory Signal Source ID", '', 'RespiratorySignalSourceID'), 0x00189195: ('FD', '1', "Chemical Shift Minimum Integration Limit in Hz", 'Retired', 'ChemicalShiftMinimumIntegrationLimitInHz'), 0x00189196: ('FD', '1', "Chemical Shift Maximum Integration Limit in Hz", 'Retired', 'ChemicalShiftMaximumIntegrationLimitInHz'), 0x00189197: ('SQ', '1', "MR Velocity Encoding Sequence", '', 'MRVelocityEncodingSequence'), 0x00189198: ('CS', '1', "First Order Phase Correction", '', 'FirstOrderPhaseCorrection'), 0x00189199: ('CS', '1', "Water Referenced Phase Correction", '', 'WaterReferencedPhaseCorrection'), 0x00189200: ('CS', '1', "MR Spectroscopy Acquisition Type", '', 'MRSpectroscopyAcquisitionType'), 0x00189214: ('CS', '1', "Respiratory Cycle Position", '', 'RespiratoryCyclePosition'), 0x00189217: ('FD', '1', "Velocity Encoding Maximum Value", '', 'VelocityEncodingMaximumValue'), 0x00189218: ('FD', '1', "Tag Spacing Second Dimension", '', 'TagSpacingSecondDimension'), 0x00189219: ('SS', '1', "Tag Angle Second Axis", '', 'TagAngleSecondAxis'), 0x00189220: ('FD', '1', "Frame Acquisition Duration", '', 'FrameAcquisitionDuration'), 0x00189226: ('SQ', '1', "MR Image Frame Type Sequence", '', 'MRImageFrameTypeSequence'), 0x00189227: ('SQ', '1', "MR Spectroscopy Frame Type Sequence", '', 'MRSpectroscopyFrameTypeSequence'), 0x00189231: ('US', '1', "MR Acquisition Phase Encoding Steps in-plane", '', 'MRAcquisitionPhaseEncodingStepsInPlane'), 0x00189232: ('US', '1', "MR Acquisition Phase Encoding Steps out-of-plane", '', 'MRAcquisitionPhaseEncodingStepsOutOfPlane'), 0x00189234: ('UL', '1', "Spectroscopy Acquisition Phase Columns", '', 'SpectroscopyAcquisitionPhaseColumns'), 0x00189236: ('CS', '1', "Cardiac Cycle Position", '', 'CardiacCyclePosition'), 0x00189239: ('SQ', '1', "Specific Absorption Rate Sequence", '', 'SpecificAbsorptionRateSequence'), 0x00189240: ('US', '1', "RF Echo Train Length", '', 'RFEchoTrainLength'), 0x00189241: ('US', '1', "Gradient Echo Train Length", '', 'GradientEchoTrainLength'), 0x00189250: ('CS', '1', "Arterial Spin Labeling Contrast", '', 'ArterialSpinLabelingContrast'), 0x00189251: ('SQ', '1', "MR Arterial Spin Labeling Sequence", '', 'MRArterialSpinLabeling'), 0x00189252: ('LO', '1', "ASL Technique Description", '', 'ASLTechniqueDescription'), 0x00189253: ('US', '1', "ASL Slab Number", '', 'ASLSlabNumber'), 0x00189254: ('FD', '1', "ASL Slab Thickness", '', 'ASLSlabThickness'), 0x00189255: ('FD', '3', "ASL Slab Orientation", '', 'ASLSlabOrientation'), 0x00189256: ('FD', '3', "ASL Mid Slab Position", '', 'ASLMidSlabPosition'), 0x00189257: ('CS', '1', "ASL Context", '', 'ASLContext'), 0x00189258: ('UL', '1', "ASL Pulse Train Duration", '', 'ASLPulseTrainDuration'), 0x00189259: ('CS', '1', "ASL Crusher Flag", '', 'ASLCrusherFlag'), 0x0018925A: ('FD', '1', "ASL Crusher Flow", '', 'ASLCrusherFlow'), 0x0018925B: ('LO', '1', "ASL Crusher Description", '', 'ASLCrusherDescription'), 0x0018925C: ('CS', '1', "ASL Bolus Cut-off Flag", '', 'ASLBolusCutoffFlag'), 0x0018925D: ('SQ', '1', "ASL Bolus Cut-off Timing Sequence", '', 'ASLBolusCutoffTimingSequence'), 0x0018925E: ('LO', '1', "ASL Bolus Cut-off Technique", '', 'ASLBolusCutoffTechnique'), 0x0018925F: ('UL', '1', "ASL Bolus Cut-off Delay Time", '', 'ASLBolusCutoffDelayTime'), 0x00189260: ('SQ', '1', "ASL Slab Sequence", '', 'ASLSlabSequence'), 0x00189295: ('FD', '1', "Chemical Shift Minimum Integration Limit in ppm", '', 'ChemicalShiftMinimumIntegrationLimitInppm'), 0x00189296: ('FD', '1', "Chemical Shift Maximum Integration Limit in ppm", '', 'ChemicalShiftMaximumIntegrationLimitInppm'), 0x00189301: ('SQ', '1', "CT Acquisition Type Sequence", '', 'CTAcquisitionTypeSequence'), 0x00189302: ('CS', '1', "Acquisition Type", '', 'AcquisitionType'), 0x00189303: ('FD', '1', "Tube Angle", '', 'TubeAngle'), 0x00189304: ('SQ', '1', "CT Acquisition Details Sequence", '', 'CTAcquisitionDetailsSequence'), 0x00189305: ('FD', '1', "Revolution Time", '', 'RevolutionTime'), 0x00189306: ('FD', '1', "Single Collimation Width", '', 'SingleCollimationWidth'), 0x00189307: ('FD', '1', "Total Collimation Width", '', 'TotalCollimationWidth'), 0x00189308: ('SQ', '1', "CT Table Dynamics Sequence", '', 'CTTableDynamicsSequence'), 0x00189309: ('FD', '1', "Table Speed", '', 'TableSpeed'), 0x00189310: ('FD', '1', "Table Feed per Rotation", '', 'TableFeedPerRotation'), 0x00189311: ('FD', '1', "Spiral Pitch Factor", '', 'SpiralPitchFactor'), 0x00189312: ('SQ', '1', "CT Geometry Sequence", '', 'CTGeometrySequence'), 0x00189313: ('FD', '3', "Data Collection Center (Patient)", '', 'DataCollectionCenterPatient'), 0x00189314: ('SQ', '1', "CT Reconstruction Sequence", '', 'CTReconstructionSequence'), 0x00189315: ('CS', '1', "Reconstruction Algorithm", '', 'ReconstructionAlgorithm'), 0x00189316: ('CS', '1', "Convolution Kernel Group", '', 'ConvolutionKernelGroup'), 0x00189317: ('FD', '2', "Reconstruction Field of View", '', 'ReconstructionFieldOfView'), 0x00189318: ('FD', '3', "Reconstruction Target Center (Patient)", '', 'ReconstructionTargetCenterPatient'), 0x00189319: ('FD', '1', "Reconstruction Angle", '', 'ReconstructionAngle'), 0x00189320: ('SH', '1', "Image Filter", '', 'ImageFilter'), 0x00189321: ('SQ', '1', "CT Exposure Sequence", '', 'CTExposureSequence'), 0x00189322: ('FD', '2', "Reconstruction Pixel Spacing", '', 'ReconstructionPixelSpacing'), 0x00189323: ('CS', '1', "Exposure Modulation Type", '', 'ExposureModulationType'), 0x00189324: ('FD', '1', "Estimated Dose Saving", '', 'EstimatedDoseSaving'), 0x00189325: ('SQ', '1', "CT X-Ray Details Sequence", '', 'CTXRayDetailsSequence'), 0x00189326: ('SQ', '1', "CT Position Sequence", '', 'CTPositionSequence'), 0x00189327: ('FD', '1', "Table Position", '', 'TablePosition'), 0x00189328: ('FD', '1', "Exposure Time in ms", '', 'ExposureTimeInms'), 0x00189329: ('SQ', '1', "CT Image Frame Type Sequence", '', 'CTImageFrameTypeSequence'), 0x00189330: ('FD', '1', "X-Ray Tube Current in mA", '', 'XRayTubeCurrentInmA'), 0x00189332: ('FD', '1', "Exposure in mAs", '', 'ExposureInmAs'), 0x00189333: ('CS', '1', "Constant Volume Flag", '', 'ConstantVolumeFlag'), 0x00189334: ('CS', '1', "Fluoroscopy Flag", '', 'FluoroscopyFlag'), 0x00189335: ('FD', '1', "Distance Source to Data Collection Center", '', 'DistanceSourceToDataCollectionCenter'), 0x00189337: ('US', '1', "Contrast/Bolus Agent Number", '', 'ContrastBolusAgentNumber'), 0x00189338: ('SQ', '1', "Contrast/Bolus Ingredient Code Sequence", '', 'ContrastBolusIngredientCodeSequence'), 0x00189340: ('SQ', '1', "Contrast Administration Profile Sequence", '', 'ContrastAdministrationProfileSequence'), 0x00189341: ('SQ', '1', "Contrast/Bolus Usage Sequence", '', 'ContrastBolusUsageSequence'), 0x00189342: ('CS', '1', "Contrast/Bolus Agent Administered", '', 'ContrastBolusAgentAdministered'), 0x00189343: ('CS', '1', "Contrast/Bolus Agent Detected", '', 'ContrastBolusAgentDetected'), 0x00189344: ('CS', '1', "Contrast/Bolus Agent Phase", '', 'ContrastBolusAgentPhase'), 0x00189345: ('FD', '1', "CTDIvol", '', 'CTDIvol'), 0x00189346: ('SQ', '1', "CTDI Phantom Type Code Sequence", '', 'CTDIPhantomTypeCodeSequence'), 0x00189351: ('FL', '1', "Calcium Scoring Mass Factor Patient", '', 'CalciumScoringMassFactorPatient'), 0x00189352: ('FL', '3', "Calcium Scoring Mass Factor Device", '', 'CalciumScoringMassFactorDevice'), 0x00189353: ('FL', '1', "Energy Weighting Factor", '', 'EnergyWeightingFactor'), 0x00189360: ('SQ', '1', "CT Additional X-Ray Source Sequence", '', 'CTAdditionalXRaySourceSequence'), 0x00189401: ('SQ', '1', "Projection Pixel Calibration Sequence", '', 'ProjectionPixelCalibrationSequence'), 0x00189402: ('FL', '1', "Distance Source to Isocenter", '', 'DistanceSourceToIsocenter'), 0x00189403: ('FL', '1', "Distance Object to Table Top", '', 'DistanceObjectToTableTop'), 0x00189404: ('FL', '2', "Object Pixel Spacing in Center of Beam", '', 'ObjectPixelSpacingInCenterOfBeam'), 0x00189405: ('SQ', '1', "Positioner Position Sequence", '', 'PositionerPositionSequence'), 0x00189406: ('SQ', '1', "Table Position Sequence", '', 'TablePositionSequence'), 0x00189407: ('SQ', '1', "Collimator Shape Sequence", '', 'CollimatorShapeSequence'), 0x00189410: ('CS', '1', "Planes in Acquisition", '', 'PlanesInAcquisition'), 0x00189412: ('SQ', '1', "XA/XRF Frame Characteristics Sequence", '', 'XAXRFFrameCharacteristicsSequence'), 0x00189417: ('SQ', '1', "Frame Acquisition Sequence", '', 'FrameAcquisitionSequence'), 0x00189420: ('CS', '1', "X-Ray Receptor Type", '', 'XRayReceptorType'), 0x00189423: ('LO', '1', "Acquisition Protocol Name", '', 'AcquisitionProtocolName'), 0x00189424: ('LT', '1', "Acquisition Protocol Description", '', 'AcquisitionProtocolDescription'), 0x00189425: ('CS', '1', "Contrast/Bolus Ingredient Opaque", '', 'ContrastBolusIngredientOpaque'), 0x00189426: ('FL', '1', "Distance Receptor Plane to Detector Housing", '', 'DistanceReceptorPlaneToDetectorHousing'), 0x00189427: ('CS', '1', "Intensifier Active Shape", '', 'IntensifierActiveShape'), 0x00189428: ('FL', '1-2', "Intensifier Active Dimension(s)", '', 'IntensifierActiveDimensions'), 0x00189429: ('FL', '2', "Physical Detector Size", '', 'PhysicalDetectorSize'), 0x00189430: ('FL', '2', "Position of Isocenter Projection", '', 'PositionOfIsocenterProjection'), 0x00189432: ('SQ', '1', "Field of View Sequence", '', 'FieldOfViewSequence'), 0x00189433: ('LO', '1', "Field of View Description", '', 'FieldOfViewDescription'), 0x00189434: ('SQ', '1', "Exposure Control Sensing Regions Sequence", '', 'ExposureControlSensingRegionsSequence'), 0x00189435: ('CS', '1', "Exposure Control Sensing Region Shape", '', 'ExposureControlSensingRegionShape'), 0x00189436: ('SS', '1', "Exposure Control Sensing Region Left Vertical Edge", '', 'ExposureControlSensingRegionLeftVerticalEdge'), 0x00189437: ('SS', '1', "Exposure Control Sensing Region Right Vertical Edge", '', 'ExposureControlSensingRegionRightVerticalEdge'), 0x00189438: ('SS', '1', "Exposure Control Sensing Region Upper Horizontal Edge", '', 'ExposureControlSensingRegionUpperHorizontalEdge'), 0x00189439: ('SS', '1', "Exposure Control Sensing Region Lower Horizontal Edge", '', 'ExposureControlSensingRegionLowerHorizontalEdge'), 0x00189440: ('SS', '2', "Center of Circular Exposure Control Sensing Region", '', 'CenterOfCircularExposureControlSensingRegion'), 0x00189441: ('US', '1', "Radius of Circular Exposure Control Sensing Region", '', 'RadiusOfCircularExposureControlSensingRegion'), 0x00189442: ('SS', '2-n', "Vertices of the Polygonal Exposure Control Sensing Region", '', 'VerticesOfThePolygonalExposureControlSensingRegion'), 0x00189445: ('OB', '1', "Retired-blank", 'Retired', ''), 0x00189447: ('FL', '1', "Column Angulation (Patient)", '', 'ColumnAngulationPatient'), 0x00189449: ('FL', '1', "Beam Angle", '', 'BeamAngle'), 0x00189451: ('SQ', '1', "Frame Detector Parameters Sequence", '', 'FrameDetectorParametersSequence'), 0x00189452: ('FL', '1', "Calculated Anatomy Thickness", '', 'CalculatedAnatomyThickness'), 0x00189455: ('SQ', '1', "Calibration Sequence", '', 'CalibrationSequence'), 0x00189456: ('SQ', '1', "Object Thickness Sequence", '', 'ObjectThicknessSequence'), 0x00189457: ('CS', '1', "Plane Identification", '', 'PlaneIdentification'), 0x00189461: ('FL', '1-2', "Field of View Dimension(s) in Float", '', 'FieldOfViewDimensionsInFloat'), 0x00189462: ('SQ', '1', "Isocenter Reference System Sequence", '', 'IsocenterReferenceSystemSequence'), 0x00189463: ('FL', '1', "Positioner Isocenter Primary Angle", '', 'PositionerIsocenterPrimaryAngle'), 0x00189464: ('FL', '1', "Positioner Isocenter Secondary Angle", '', 'PositionerIsocenterSecondaryAngle'), 0x00189465: ('FL', '1', "Positioner Isocenter Detector Rotation Angle", '', 'PositionerIsocenterDetectorRotationAngle'), 0x00189466: ('FL', '1', "Table X Position to Isocenter", '', 'TableXPositionToIsocenter'), 0x00189467: ('FL', '1', "Table Y Position to Isocenter", '', 'TableYPositionToIsocenter'), 0x00189468: ('FL', '1', "Table Z Position to Isocenter", '', 'TableZPositionToIsocenter'), 0x00189469: ('FL', '1', "Table Horizontal Rotation Angle", '', 'TableHorizontalRotationAngle'), 0x00189470: ('FL', '1', "Table Head Tilt Angle", '', 'TableHeadTiltAngle'), 0x00189471: ('FL', '1', "Table Cradle Tilt Angle", '', 'TableCradleTiltAngle'), 0x00189472: ('SQ', '1', "Frame Display Shutter Sequence", '', 'FrameDisplayShutterSequence'), 0x00189473: ('FL', '1', "Acquired Image Area Dose Product", '', 'AcquiredImageAreaDoseProduct'), 0x00189474: ('CS', '1', "C-arm Positioner Tabletop Relationship", '', 'CArmPositionerTabletopRelationship'), 0x00189476: ('SQ', '1', "X-Ray Geometry Sequence", '', 'XRayGeometrySequence'), 0x00189477: ('SQ', '1', "Irradiation Event Identification Sequence", '', 'IrradiationEventIdentificationSequence'), 0x00189504: ('SQ', '1', "X-Ray 3D Frame Type Sequence", '', 'XRay3DFrameTypeSequence'), 0x00189506: ('SQ', '1', "Contributing Sources Sequence", '', 'ContributingSourcesSequence'), 0x00189507: ('SQ', '1', "X-Ray 3D Acquisition Sequence", '', 'XRay3DAcquisitionSequence'), 0x00189508: ('FL', '1', "Primary Positioner Scan Arc", '', 'PrimaryPositionerScanArc'), 0x00189509: ('FL', '1', "Secondary Positioner Scan Arc", '', 'SecondaryPositionerScanArc'), 0x00189510: ('FL', '1', "Primary Positioner Scan Start Angle", '', 'PrimaryPositionerScanStartAngle'), 0x00189511: ('FL', '1', "Secondary Positioner Scan Start Angle", '', 'SecondaryPositionerScanStartAngle'), 0x00189514: ('FL', '1', "Primary Positioner Increment", '', 'PrimaryPositionerIncrement'), 0x00189515: ('FL', '1', "Secondary Positioner Increment", '', 'SecondaryPositionerIncrement'), 0x00189516: ('DT', '1', "Start Acquisition DateTime", '', 'StartAcquisitionDateTime'), 0x00189517: ('DT', '1', "End Acquisition DateTime", '', 'EndAcquisitionDateTime'), 0x00189524: ('LO', '1', "Application Name", '', 'ApplicationName'), 0x00189525: ('LO', '1', "Application Version", '', 'ApplicationVersion'), 0x00189526: ('LO', '1', "Application Manufacturer", '', 'ApplicationManufacturer'), 0x00189527: ('CS', '1', "Algorithm Type", '', 'AlgorithmType'), 0x00189528: ('LO', '1', "Algorithm Description", '', 'AlgorithmDescription'), 0x00189530: ('SQ', '1', "X-Ray 3D Reconstruction Sequence", '', 'XRay3DReconstructionSequence'), 0x00189531: ('LO', '1', "Reconstruction Description", '', 'ReconstructionDescription'), 0x00189538: ('SQ', '1', "Per Projection Acquisition Sequence", '', 'PerProjectionAcquisitionSequence'), 0x00189601: ('SQ', '1', "Diffusion b-matrix Sequence", '', 'DiffusionBMatrixSequence'), 0x00189602: ('FD', '1', "Diffusion b-value XX", '', 'DiffusionBValueXX'), 0x00189603: ('FD', '1', "Diffusion b-value XY", '', 'DiffusionBValueXY'), 0x00189604: ('FD', '1', "Diffusion b-value XZ", '', 'DiffusionBValueXZ'), 0x00189605: ('FD', '1', "Diffusion b-value YY", '', 'DiffusionBValueYY'), 0x00189606: ('FD', '1', "Diffusion b-value YZ", '', 'DiffusionBValueYZ'), 0x00189607: ('FD', '1', "Diffusion b-value ZZ", '', 'DiffusionBValueZZ'), 0x00189701: ('DT', '1', "Decay Correction DateTime", '', 'DecayCorrectionDateTime'), 0x00189715: ('FD', '1', "Start Density Threshold", '', 'StartDensityThreshold'), 0x00189716: ('FD', '1', "Start Relative Density Difference Threshold", '', 'StartRelativeDensityDifferenceThreshold'), 0x00189717: ('FD', '1', "Start Cardiac Trigger Count Threshold", '', 'StartCardiacTriggerCountThreshold'), 0x00189718: ('FD', '1', "Start Respiratory Trigger Count Threshold", '', 'StartRespiratoryTriggerCountThreshold'), 0x00189719: ('FD', '1', "Termination Counts Threshold", '', 'TerminationCountsThreshold'), 0x00189720: ('FD', '1', "Termination Density Threshold", '', 'TerminationDensityThreshold'), 0x00189721: ('FD', '1', "Termination Relative Density Threshold", '', 'TerminationRelativeDensityThreshold'), 0x00189722: ('FD', '1', "Termination Time Threshold", '', 'TerminationTimeThreshold'), 0x00189723: ('FD', '1', "Termination Cardiac Trigger Count Threshold", '', 'TerminationCardiacTriggerCountThreshold'), 0x00189724: ('FD', '1', "Termination Respiratory Trigger Count Threshold", '', 'TerminationRespiratoryTriggerCountThreshold'), 0x00189725: ('CS', '1', "Detector Geometry", '', 'DetectorGeometry'), 0x00189726: ('FD', '1', "Transverse Detector Separation", '', 'TransverseDetectorSeparation'), 0x00189727: ('FD', '1', "Axial Detector Dimension", '', 'AxialDetectorDimension'), 0x00189729: ('US', '1', "Radiopharmaceutical Agent Number", '', 'RadiopharmaceuticalAgentNumber'), 0x00189732: ('SQ', '1', "PET Frame Acquisition Sequence", '', 'PETFrameAcquisitionSequence'), 0x00189733: ('SQ', '1', "PET Detector Motion Details Sequence", '', 'PETDetectorMotionDetailsSequence'), 0x00189734: ('SQ', '1', "PET Table Dynamics Sequence", '', 'PETTableDynamicsSequence'), 0x00189735: ('SQ', '1', "PET Position Sequence", '', 'PETPositionSequence'), 0x00189736: ('SQ', '1', "PET Frame Correction Factors Sequence", '', 'PETFrameCorrectionFactorsSequence'), 0x00189737: ('SQ', '1', "Radiopharmaceutical Usage Sequence", '', 'RadiopharmaceuticalUsageSequence'), 0x00189738: ('CS', '1', "Attenuation Correction Source", '', 'AttenuationCorrectionSource'), 0x00189739: ('US', '1', "Number of Iterations", '', 'NumberOfIterations'), 0x00189740: ('US', '1', "Number of Subsets", '', 'NumberOfSubsets'), 0x00189749: ('SQ', '1', "PET Reconstruction Sequence", '', 'PETReconstructionSequence'), 0x00189751: ('SQ', '1', "PET Frame Type Sequence", '', 'PETFrameTypeSequence'), 0x00189755: ('CS', '1', "Time of Flight Information Used", '', 'TimeOfFlightInformationUsed'), 0x00189756: ('CS', '1', "Reconstruction Type", '', 'ReconstructionType'), 0x00189758: ('CS', '1', "Decay Corrected", '', 'DecayCorrected'), 0x00189759: ('CS', '1', "Attenuation Corrected", '', 'AttenuationCorrected'), 0x00189760: ('CS', '1', "Scatter Corrected", '', 'ScatterCorrected'), 0x00189761: ('CS', '1', "Dead Time Corrected", '', 'DeadTimeCorrected'), 0x00189762: ('CS', '1', "Gantry Motion Corrected", '', 'GantryMotionCorrected'), 0x00189763: ('CS', '1', "Patient Motion Corrected", '', 'PatientMotionCorrected'), 0x00189764: ('CS', '1', "Count Loss Normalization Corrected", '', 'CountLossNormalizationCorrected'), 0x00189765: ('CS', '1', "Randoms Corrected", '', 'RandomsCorrected'), 0x00189766: ('CS', '1', "Non-uniform Radial Sampling Corrected", '', 'NonUniformRadialSamplingCorrected'), 0x00189767: ('CS', '1', "Sensitivity Calibrated", '', 'SensitivityCalibrated'), 0x00189768: ('CS', '1', "Detector Normalization Correction", '', 'DetectorNormalizationCorrection'), 0x00189769: ('CS', '1', "Iterative Reconstruction Method", '', 'IterativeReconstructionMethod'), 0x00189770: ('CS', '1', "Attenuation Correction Temporal Relationship", '', 'AttenuationCorrectionTemporalRelationship'), 0x00189771: ('SQ', '1', "Patient Physiological State Sequence", '', 'PatientPhysiologicalStateSequence'), 0x00189772: ('SQ', '1', "Patient Physiological State Code Sequence", '', 'PatientPhysiologicalStateCodeSequence'), 0x00189801: ('FD', '1-n', "Depth(s) of Focus", '', 'DepthsOfFocus'), 0x00189803: ('SQ', '1', "Excluded Intervals Sequence", '', 'ExcludedIntervalsSequence'), 0x00189804: ('DT', '1', "Exclusion Start Datetime", '', 'ExclusionStartDatetime'), 0x00189805: ('FD', '1', "Exclusion Duration", '', 'ExclusionDuration'), 0x00189806: ('SQ', '1', "US Image Description Sequence", '', 'USImageDescriptionSequence'), 0x00189807: ('SQ', '1', "Image Data Type Sequence", '', 'ImageDataTypeSequence'), 0x00189808: ('CS', '1', "Data Type", '', 'DataType'), 0x00189809: ('SQ', '1', "Transducer Scan Pattern Code Sequence", '', 'TransducerScanPatternCodeSequence'), 0x0018980B: ('CS', '1', "Aliased Data Type", '', 'AliasedDataType'), 0x0018980C: ('CS', '1', "Position Measuring Device Used", '', 'PositionMeasuringDeviceUsed'), 0x0018980D: ('SQ', '1', "Transducer Geometry Code Sequence", '', 'TransducerGeometryCodeSequence'), 0x0018980E: ('SQ', '1', "Transducer Beam Steering Code Sequence", '', 'TransducerBeamSteeringCodeSequence'), 0x0018980F: ('SQ', '1', "Transducer Application Code Sequence", '', 'TransducerApplicationCodeSequence'), 0x0018A001: ('SQ', '1', "Contributing Equipment Sequence", '', 'ContributingEquipmentSequence'), 0x0018A002: ('DT', '1', "Contribution Date Time", '', 'ContributionDateTime'), 0x0018A003: ('ST', '1', "Contribution Description", '', 'ContributionDescription'), 0x0020000D: ('UI', '1', "Study Instance UID", '', 'StudyInstanceUID'), 0x0020000E: ('UI', '1', "Series Instance UID", '', 'SeriesInstanceUID'), 0x00200010: ('SH', '1', "Study ID", '', 'StudyID'), 0x00200011: ('IS', '1', "Series Number", '', 'SeriesNumber'), 0x00200012: ('IS', '1', "Acquisition Number", '', 'AcquisitionNumber'), 0x00200013: ('IS', '1', "Instance Number", '', 'InstanceNumber'), 0x00200014: ('IS', '1', "Isotope Number", 'Retired', 'IsotopeNumber'), 0x00200015: ('IS', '1', "Phase Number", 'Retired', 'PhaseNumber'), 0x00200016: ('IS', '1', "Interval Number", 'Retired', 'IntervalNumber'), 0x00200017: ('IS', '1', "Time Slot Number", 'Retired', 'TimeSlotNumber'), 0x00200018: ('IS', '1', "Angle Number", 'Retired', 'AngleNumber'), 0x00200019: ('IS', '1', "Item Number", '', 'ItemNumber'), 0x00200020: ('CS', '2', "Patient Orientation", '', 'PatientOrientation'), 0x00200022: ('IS', '1', "Overlay Number", 'Retired', 'OverlayNumber'), 0x00200024: ('IS', '1', "Curve Number", 'Retired', 'CurveNumber'), 0x00200026: ('IS', '1', "LUT Number", 'Retired', 'LUTNumber'), 0x00200030: ('DS', '3', "Image Position", 'Retired', 'ImagePosition'), 0x00200032: ('DS', '3', "Image Position (Patient)", '', 'ImagePositionPatient'), 0x00200035: ('DS', '6', "Image Orientation", 'Retired', 'ImageOrientation'), 0x00200037: ('DS', '6', "Image Orientation (Patient)", '', 'ImageOrientationPatient'), 0x00200050: ('DS', '1', "Location", 'Retired', 'Location'), 0x00200052: ('UI', '1', "Frame of Reference UID", '', 'FrameOfReferenceUID'), 0x00200060: ('CS', '1', "Laterality", '', 'Laterality'), 0x00200062: ('CS', '1', "Image Laterality", '', 'ImageLaterality'), 0x00200070: ('LO', '1', "Image Geometry Type", 'Retired', 'ImageGeometryType'), 0x00200080: ('CS', '1-n', "Masking Image", 'Retired', 'MaskingImage'), 0x002000AA: ('IS', '1', "Report Number", 'Retired', 'ReportNumber'), 0x00200100: ('IS', '1', "Temporal Position Identifier", '', 'TemporalPositionIdentifier'), 0x00200105: ('IS', '1', "Number of Temporal Positions", '', 'NumberOfTemporalPositions'), 0x00200110: ('DS', '1', "Temporal Resolution", '', 'TemporalResolution'), 0x00200200: ('UI', '1', "Synchronization Frame of Reference UID", '', 'SynchronizationFrameOfReferenceUID'), 0x00200242: ('UI', '1', "SOP Instance UID of Concatenation Source", '', 'SOPInstanceUIDOfConcatenationSource'), 0x00201000: ('IS', '1', "Series in Study", 'Retired', 'SeriesInStudy'), 0x00201001: ('IS', '1', "Acquisitions in Series", 'Retired', 'AcquisitionsInSeries'), 0x00201002: ('IS', '1', "Images in Acquisition", '', 'ImagesInAcquisition'), 0x00201003: ('IS', '1', "Images in Series", 'Retired', 'ImagesInSeries'), 0x00201004: ('IS', '1', "Acquisitions in Study", 'Retired', 'AcquisitionsInStudy'), 0x00201005: ('IS', '1', "Images in Study", 'Retired', 'ImagesInStudy'), 0x00201020: ('LO', '1-n', "Reference", 'Retired', 'Reference'), 0x00201040: ('LO', '1', "Position Reference Indicator", '', 'PositionReferenceIndicator'), 0x00201041: ('DS', '1', "Slice Location", '', 'SliceLocation'), 0x00201070: ('IS', '1-n', "Other Study Numbers", 'Retired', 'OtherStudyNumbers'), 0x00201200: ('IS', '1', "Number of Patient Related Studies", '', 'NumberOfPatientRelatedStudies'), 0x00201202: ('IS', '1', "Number of Patient Related Series", '', 'NumberOfPatientRelatedSeries'), 0x00201204: ('IS', '1', "Number of Patient Related Instances", '', 'NumberOfPatientRelatedInstances'), 0x00201206: ('IS', '1', "Number of Study Related Series", '', 'NumberOfStudyRelatedSeries'), 0x00201208: ('IS', '1', "Number of Study Related Instances", '', 'NumberOfStudyRelatedInstances'), 0x00201209: ('IS', '1', "Number of Series Related Instances", '', 'NumberOfSeriesRelatedInstances'), 0x00203401: ('CS', '1', "Modifying Device ID", 'Retired', 'ModifyingDeviceID'), 0x00203402: ('CS', '1', "Modified Image ID", 'Retired', 'ModifiedImageID'), 0x00203403: ('DA', '1', "Modified Image Date", 'Retired', 'ModifiedImageDate'), 0x00203404: ('LO', '1', "Modifying Device Manufacturer", 'Retired', 'ModifyingDeviceManufacturer'), 0x00203405: ('TM', '1', "Modified Image Time", 'Retired', 'ModifiedImageTime'), 0x00203406: ('LO', '1', "Modified Image Description", 'Retired', 'ModifiedImageDescription'), 0x00204000: ('LT', '1', "Image Comments", '', 'ImageComments'), 0x00205000: ('AT', '1-n', "Original Image Identification", 'Retired', 'OriginalImageIdentification'), 0x00205002: ('LO', '1-n', "Original Image Identification Nomenclature", 'Retired', 'OriginalImageIdentificationNomenclature'), 0x00209056: ('SH', '1', "Stack ID", '', 'StackID'), 0x00209057: ('UL', '1', "In-Stack Position Number", '', 'InStackPositionNumber'), 0x00209071: ('SQ', '1', "Frame Anatomy Sequence", '', 'FrameAnatomySequence'), 0x00209072: ('CS', '1', "Frame Laterality", '', 'FrameLaterality'), 0x00209111: ('SQ', '1', "Frame Content Sequence", '', 'FrameContentSequence'), 0x00209113: ('SQ', '1', "Plane Position Sequence", '', 'PlanePositionSequence'), 0x00209116: ('SQ', '1', "Plane Orientation Sequence", '', 'PlaneOrientationSequence'), 0x00209128: ('UL', '1', "Temporal Position Index", '', 'TemporalPositionIndex'), 0x00209153: ('FD', '1', "Nominal Cardiac Trigger Delay Time", '', 'NominalCardiacTriggerDelayTime'), 0x00209154: ('FL', '1', "Nominal Cardiac Trigger Time Prior To R-Peak", '', 'NominalCardiacTriggerTimePriorToRPeak'), 0x00209155: ('FL', '1', "Actual Cardiac Trigger Time Prior To R-Peak", '', 'ActualCardiacTriggerTimePriorToRPeak'), 0x00209156: ('US', '1', "Frame Acquisition Number", '', 'FrameAcquisitionNumber'), 0x00209157: ('UL', '1-n', "Dimension Index Values", '', 'DimensionIndexValues'), 0x00209158: ('LT', '1', "Frame Comments", '', 'FrameComments'), 0x00209161: ('UI', '1', "Concatenation UID", '', 'ConcatenationUID'), 0x00209162: ('US', '1', "In-concatenation Number", '', 'InConcatenationNumber'), 0x00209163: ('US', '1', "In-concatenation Total Number", '', 'InConcatenationTotalNumber'), 0x00209164: ('UI', '1', "Dimension Organization UID", '', 'DimensionOrganizationUID'), 0x00209165: ('AT', '1', "Dimension Index Pointer", '', 'DimensionIndexPointer'), 0x00209167: ('AT', '1', "Functional Group Pointer", '', 'FunctionalGroupPointer'), 0x00209213: ('LO', '1', "Dimension Index Private Creator", '', 'DimensionIndexPrivateCreator'), 0x00209221: ('SQ', '1', "Dimension Organization Sequence", '', 'DimensionOrganizationSequence'), 0x00209222: ('SQ', '1', "Dimension Index Sequence", '', 'DimensionIndexSequence'), 0x00209228: ('UL', '1', "Concatenation Frame Offset Number", '', 'ConcatenationFrameOffsetNumber'), 0x00209238: ('LO', '1', "Functional Group Private Creator", '', 'FunctionalGroupPrivateCreator'), 0x00209241: ('FL', '1', "Nominal Percentage of Cardiac Phase", '', 'NominalPercentageOfCardiacPhase'), 0x00209245: ('FL', '1', "Nominal Percentage of Respiratory Phase", '', 'NominalPercentageOfRespiratoryPhase'), 0x00209246: ('FL', '1', "Starting Respiratory Amplitude", '', 'StartingRespiratoryAmplitude'), 0x00209247: ('CS', '1', "Starting Respiratory Phase", '', 'StartingRespiratoryPhase'), 0x00209248: ('FL', '1', "Ending Respiratory Amplitude", '', 'EndingRespiratoryAmplitude'), 0x00209249: ('CS', '1', "Ending Respiratory Phase", '', 'EndingRespiratoryPhase'), 0x00209250: ('CS', '1', "Respiratory Trigger Type", '', 'RespiratoryTriggerType'), 0x00209251: ('FD', '1', "R-R Interval Time Nominal", '', 'RRIntervalTimeNominal'), 0x00209252: ('FD', '1', "Actual Cardiac Trigger Delay Time", '', 'ActualCardiacTriggerDelayTime'), 0x00209253: ('SQ', '1', "Respiratory Synchronization Sequence", '', 'RespiratorySynchronizationSequence'), 0x00209254: ('FD', '1', "Respiratory Interval Time", '', 'RespiratoryIntervalTime'), 0x00209255: ('FD', '1', "Nominal Respiratory Trigger Delay Time", '', 'NominalRespiratoryTriggerDelayTime'), 0x00209256: ('FD', '1', "Respiratory Trigger Delay Threshold", '', 'RespiratoryTriggerDelayThreshold'), 0x00209257: ('FD', '1', "Actual Respiratory Trigger Delay Time", '', 'ActualRespiratoryTriggerDelayTime'), 0x00209301: ('FD', '3', "Image Position (Volume)", '', 'ImagePositionVolume'), 0x00209302: ('FD', '6', "Image Orientation (Volume)", '', 'ImageOrientationVolume'), 0x00209307: ('CS', '1', "Ultrasound Acquisition Geometry", '', 'UltrasoundAcquisitionGeometry'), 0x00209308: ('FD', '3', "Apex Position", '', 'ApexPosition'), 0x00209309: ('FD', '16', "Volume to Transducer Mapping Matrix", '', 'VolumeToTransducerMappingMatrix'), 0x0020930A: ('FD', '16', "Volume to Table Mapping Matrix", '', 'VolumeToTableMappingMatrix'), 0x0020930C: ('CS', '1', "Patient Frame of Reference Source", '', 'PatientFrameOfReferenceSource'), 0x0020930D: ('FD', '1', "Temporal Position Time Offset", '', 'TemporalPositionTimeOffset'), 0x0020930E: ('SQ', '1', "Plane Position (Volume) Sequence", '', 'PlanePositionVolumeSequence'), 0x0020930F: ('SQ', '1', "Plane Orientation (Volume) Sequence", '', 'PlaneOrientationVolumeSequence'), 0x00209310: ('SQ', '1', "Temporal Position Sequence", '', 'TemporalPositionSequence'), 0x00209311: ('CS', '1', "Dimension Organization Type", '', 'DimensionOrganizationType'), 0x00209312: ('UI', '1', "Volume Frame of Reference UID", '', 'VolumeFrameOfReferenceUID'), 0x00209313: ('UI', '1', "Table Frame of Reference UID", '', 'TableFrameOfReferenceUID'), 0x00209421: ('LO', '1', "Dimension Description Label", '', 'DimensionDescriptionLabel'), 0x00209450: ('SQ', '1', "Patient Orientation in Frame Sequence", '', 'PatientOrientationInFrameSequence'), 0x00209453: ('LO', '1', "Frame Label", '', 'FrameLabel'), 0x00209518: ('US', '1-n', "Acquisition Index", '', 'AcquisitionIndex'), 0x00209529: ('SQ', '1', "Contributing SOP Instances Reference Sequence", '', 'ContributingSOPInstancesReferenceSequence'), 0x00209536: ('US', '1', "Reconstruction Index", '', 'ReconstructionIndex'), 0x00220001: ('US', '1', "Light Path Filter Pass-Through Wavelength", '', 'LightPathFilterPassThroughWavelength'), 0x00220002: ('US', '2', "Light Path Filter Pass Band", '', 'LightPathFilterPassBand'), 0x00220003: ('US', '1', "Image Path Filter Pass-Through Wavelength", '', 'ImagePathFilterPassThroughWavelength'), 0x00220004: ('US', '2', "Image Path Filter Pass Band", '', 'ImagePathFilterPassBand'), 0x00220005: ('CS', '1', "Patient Eye Movement Commanded", '', 'PatientEyeMovementCommanded'), 0x00220006: ('SQ', '1', "Patient Eye Movement Command Code Sequence", '', 'PatientEyeMovementCommandCodeSequence'), 0x00220007: ('FL', '1', "Spherical Lens Power", '', 'SphericalLensPower'), 0x00220008: ('FL', '1', "Cylinder Lens Power", '', 'CylinderLensPower'), 0x00220009: ('FL', '1', "Cylinder Axis", '', 'CylinderAxis'), 0x0022000A: ('FL', '1', "Emmetropic Magnification", '', 'EmmetropicMagnification'), 0x0022000B: ('FL', '1', "Intra Ocular Pressure", '', 'IntraOcularPressure'), 0x0022000C: ('FL', '1', "Horizontal Field of View", '', 'HorizontalFieldOfView'), 0x0022000D: ('CS', '1', "Pupil Dilated", '', 'PupilDilated'), 0x0022000E: ('FL', '1', "Degree of Dilation", '', 'DegreeOfDilation'), 0x00220010: ('FL', '1', "Stereo Baseline Angle", '', 'StereoBaselineAngle'), 0x00220011: ('FL', '1', "Stereo Baseline Displacement", '', 'StereoBaselineDisplacement'), 0x00220012: ('FL', '1', "Stereo Horizontal Pixel Offset", '', 'StereoHorizontalPixelOffset'), 0x00220013: ('FL', '1', "Stereo Vertical Pixel Offset", '', 'StereoVerticalPixelOffset'), 0x00220014: ('FL', '1', "Stereo Rotation", '', 'StereoRotation'), 0x00220015: ('SQ', '1', "Acquisition Device Type Code Sequence", '', 'AcquisitionDeviceTypeCodeSequence'), 0x00220016: ('SQ', '1', "Illumination Type Code Sequence", '', 'IlluminationTypeCodeSequence'), 0x00220017: ('SQ', '1', "Light Path Filter Type Stack Code Sequence", '', 'LightPathFilterTypeStackCodeSequence'), 0x00220018: ('SQ', '1', "Image Path Filter Type Stack Code Sequence", '', 'ImagePathFilterTypeStackCodeSequence'), 0x00220019: ('SQ', '1', "Lenses Code Sequence", '', 'LensesCodeSequence'), 0x0022001A: ('SQ', '1', "Channel Description Code Sequence", '', 'ChannelDescriptionCodeSequence'), 0x0022001B: ('SQ', '1', "Refractive State Sequence", '', 'RefractiveStateSequence'), 0x0022001C: ('SQ', '1', "Mydriatic Agent Code Sequence", '', 'MydriaticAgentCodeSequence'), 0x0022001D: ('SQ', '1', "Relative Image Position Code Sequence", '', 'RelativeImagePositionCodeSequence'), 0x0022001E: ('FL', '1', "Camera Angle of View", '', 'CameraAngleOfView'), 0x00220020: ('SQ', '1', "Stereo Pairs Sequence", '', 'StereoPairsSequence'), 0x00220021: ('SQ', '1', "Left Image Sequence", '', 'LeftImageSequence'), 0x00220022: ('SQ', '1', "Right Image Sequence", '', 'RightImageSequence'), 0x00220030: ('FL', '1', "Axial Length of the Eye", '', 'AxialLengthOfTheEye'), 0x00220031: ('SQ', '1', "Ophthalmic Frame Location Sequence", '', 'OphthalmicFrameLocationSequence'), 0x00220032: ('FL', '2-2n', "Reference Coordinates", '', 'ReferenceCoordinates'), 0x00220035: ('FL', '1', "Depth Spatial Resolution", '', 'DepthSpatialResolution'), 0x00220036: ('FL', '1', "Maximum Depth Distortion", '', 'MaximumDepthDistortion'), 0x00220037: ('FL', '1', "Along-scan Spatial Resolution", '', 'AlongScanSpatialResolution'), 0x00220038: ('FL', '1', "Maximum Along-scan Distortion", '', 'MaximumAlongScanDistortion'), 0x00220039: ('CS', '1', "Ophthalmic Image Orientation", '', 'OphthalmicImageOrientation'), 0x00220041: ('FL', '1', "Depth of Transverse Image", '', 'DepthOfTransverseImage'), 0x00220042: ('SQ', '1', "Mydriatic Agent Concentration Units Sequence", '', 'MydriaticAgentConcentrationUnitsSequence'), 0x00220048: ('FL', '1', "Across-scan Spatial Resolution", '', 'AcrossScanSpatialResolution'), 0x00220049: ('FL', '1', "Maximum Across-scan Distortion", '', 'MaximumAcrossScanDistortion'), 0x0022004E: ('DS', '1', "Mydriatic Agent Concentration", '', 'MydriaticAgentConcentration'), 0x00220055: ('FL', '1', "Illumination Wave Length", '', 'IlluminationWaveLength'), 0x00220056: ('FL', '1', "Illumination Power", '', 'IlluminationPower'), 0x00220057: ('FL', '1', "Illumination Bandwidth", '', 'IlluminationBandwidth'), 0x00220058: ('SQ', '1', "Mydriatic Agent Sequence", '', 'MydriaticAgentSequence'), 0x00221007: ('SQ', '1', "Ophthalmic Axial Measurements Right Eye Sequence", '', 'OphthalmicAxialMeasurementsRightEyeSequence'), 0x00221008: ('SQ', '1', "Ophthalmic Axial Measurements Left Eye Sequence", '', 'OphthalmicAxialMeasurementsLeftEyeSequence'), 0x00221010: ('CS', '1', "Ophthalmic Axial Length Measurements Type", '', 'OphthalmicAxialLengthMeasurementsType'), 0x00221019: ('FL', '1', "Ophthalmic Axial Length", '', 'OphthalmicAxialLength'), 0x00221024: ('SQ', '1', "Lens Status Code Sequence", '', 'LensStatusCodeSequence'), 0x00221025: ('SQ', '1', "Vitreous Status Code Sequence", '', 'VitreousStatusCodeSequence'), 0x00221028: ('SQ', '1', "IOL Formula Code Sequence", '', 'IOLFormulaCodeSequence'), 0x00221029: ('LO', '1', "IOL Formula Detail", '', 'IOLFormulaDetail'), 0x00221033: ('FL', '1', "Keratometer Index", '', 'KeratometerIndex'), 0x00221035: ('SQ', '1', "Source of Ophthalmic Axial Length Code Sequence", '', 'SourceOfOphthalmicAxialLengthCodeSequence'), 0x00221037: ('FL', '1', "Target Refraction", '', 'TargetRefraction'), 0x00221039: ('CS', '1', "Refractive Procedure Occurred", '', 'RefractiveProcedureOccurred'), 0x00221040: ('SQ', '1', "Refractive Surgery Type Code Sequence", '', 'RefractiveSurgeryTypeCodeSequence'), 0x00221044: ('SQ', '1', "Ophthalmic Ultrasound Axial Measurements Type Code Sequence", '', 'OphthalmicUltrasoundAxialMeasurementsTypeCodeSequence'), 0x00221050: ('SQ', '1', "Ophthalmic Axial Length Measurements Sequence", '', 'OphthalmicAxialLengthMeasurementsSequence'), 0x00221053: ('FL', '1', "IOL Power", '', 'IOLPower'), 0x00221054: ('FL', '1', "Predicted Refractive Error", '', 'PredictedRefractiveError'), 0x00221059: ('FL', '1', "Ophthalmic Axial Length Velocity", '', 'OphthalmicAxialLengthVelocity'), 0x00221065: ('LO', '1', "Lens Status Description", '', 'LensStatusDescription'), 0x00221066: ('LO', '1', "Vitreous Status Description", '', 'VitreousStatusDescription'), 0x00221090: ('SQ', '1', "IOL Power Sequence", '', 'IOLPowerSequence'), 0x00221092: ('SQ', '1', "Lens Constant Sequence", '', 'LensConstantSequence'), 0x00221093: ('LO', '1', "IOL Manufacturer", '', 'IOLManufacturer'), 0x00221094: ('LO', '1', "Lens Constant Description", '', 'LensConstantDescription'), 0x00221096: ('SQ', '1', "Keratometry Measurement Type Code Sequence", '', 'KeratometryMeasurementTypeCodeSequence'), 0x00221100: ('SQ', '1', "Referenced Ophthalmic Axial Measurements Sequence", '', 'ReferencedOphthalmicAxialMeasurementsSequence'), 0x00221101: ('SQ', '1', "Ophthalmic Axial Length Measurements Segment Name Code Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence'), 0x00221103: ('SQ', '1', "Refractive Error Before Refractive Surgery Code Sequence", '', 'RefractiveErrorBeforeRefractiveSurgeryCodeSequence'), 0x00221121: ('FL', '1', "IOL Power For Exact Emmetropia", '', 'IOLPowerForExactEmmetropia'), 0x00221122: ('FL', '1', "IOL Power For Exact Target Refraction", '', 'IOLPowerForExactTargetRefraction'), 0x00221125: ('SQ', '1', "Anterior Chamber Depth Definition Code Sequence", '', 'AnteriorChamberDepthDefinitionCodeSequence'), 0x00221130: ('FL', '1', "Lens Thickness", '', 'LensThickness'), 0x00221131: ('FL', '1', "Anterior Chamber Depth", '', 'AnteriorChamberDepth'), 0x00221132: ('SQ', '1', "Source of Lens Thickness Data Code Sequence", '', 'SourceOfLensThicknessDataCodeSequence'), 0x00221133: ('SQ', '1', "Source of Anterior Chamber Depth Data Code Sequence", '', 'SourceOfAnteriorChamberDepthDataCodeSequence'), 0x00221135: ('SQ', '1', "Source of Refractive Error Data Code Sequence", '', 'SourceOfRefractiveErrorDataCodeSequence'), 0x00221140: ('CS', '1', "Ophthalmic Axial Length Measurement Modified", '', 'OphthalmicAxialLengthMeasurementModified'), 0x00221150: ('SQ', '1', "Ophthalmic Axial Length Data Source Code Sequence", '', 'OphthalmicAxialLengthDataSourceCodeSequence'), 0x00221153: ('SQ', '1', "Ophthalmic Axial Length Acquisition Method Code Sequence", '', 'OphthalmicAxialLengthAcquisitionMethodCodeSequence'), 0x00221155: ('FL', '1', "Signal to Noise Ratio", '', 'SignalToNoiseRatio'), 0x00221159: ('LO', '1', "Ophthalmic Axial Length Data Source Description", '', 'OphthalmicAxialLengthDataSourceDescription'), 0x00221210: ('SQ', '1', "Ophthalmic Axial Length Measurements Total Length Sequence", '', 'OphthalmicAxialLengthMeasurementsTotalLengthSequence'), 0x00221211: ('SQ', '1', "Ophthalmic Axial Length Measurements Segmental Length Sequence", '', 'OphthalmicAxialLengthMeasurementsSegmentalLengthSequence'), 0x00221212: ('SQ', '1', "Ophthalmic Axial Length Measurements Length Summation Sequence", '', 'OphthalmicAxialLengthMeasurementsLengthSummationSequence'), 0x00221220: ('SQ', '1', "Ultrasound Ophthalmic Axial Length Measurements Sequence", '', 'UltrasoundOphthalmicAxialLengthMeasurementsSequence'), 0x00221225: ('SQ', '1', "Optical Ophthalmic Axial Length Measurements Sequence", '', 'OpticalOphthalmicAxialLengthMeasurementsSequence'), 0x00221230: ('SQ', '1', "Ultrasound Selected Ophthalmic Axial Length Sequence", '', 'UltrasoundSelectedOphthalmicAxialLengthSequence'), 0x00221250: ('SQ', '1', "Ophthalmic Axial Length Selection Method Code Sequence", '', 'OphthalmicAxialLengthSelectionMethodCodeSequence'), 0x00221255: ('SQ', '1', "Optical Selected Ophthalmic Axial Length Sequence", '', 'OpticalSelectedOphthalmicAxialLengthSequence'), 0x00221257: ('SQ', '1', "Selected Segmental Ophthalmic Axial Length Sequence", '', 'SelectedSegmentalOphthalmicAxialLengthSequence'), 0x00221260: ('SQ', '1', "Selected Total Ophthalmic Axial Length Sequence", '', 'SelectedTotalOphthalmicAxialLengthSequence'), 0x00221262: ('SQ', '1', "Ophthalmic Axial Length Quality Metric Sequence", '', 'OphthalmicAxialLengthQualityMetricSequence'), 0x00221273: ('LO', '1', "Ophthalmic Axial Length Quality Metric Type Description", '', 'OphthalmicAxialLengthQualityMetricTypeDescription'), 0x00221300: ('SQ', '1', "Intraocular Lens Calculations Right Eye Sequence", '', 'IntraocularLensCalculationsRightEyeSequence'), 0x00221310: ('SQ', '1', "Intraocular Lens Calculations Left Eye Sequence", '', 'IntraocularLensCalculationsLeftEyeSequence'), 0x00221330: ('SQ', '1', "Referenced Ophthalmic Axial Length Measurement QC ImageSequence", '', 'ReferencedOphthalmicAxialLengthMeasurementQCImage'), 0x00240010: ('FL', '1', "Visual Field Horizontal Extent", '', 'VisualFieldHorizontalExtent'), 0x00240011: ('FL', '1', "Visual Field Vertical Extent", '', 'VisualFieldVerticalExtent'), 0x00240012: ('CS', '1', "Visual Field Shape", '', 'VisualFieldShape'), 0x00240016: ('SQ', '1', "Screening Test Mode Code Sequence", '', 'ScreeningTestModeCodeSequence'), 0x00240018: ('FL', '1', "Maximum Stimulus Luminance", '', 'MaximumStimulusLuminance'), 0x00240020: ('FL', '1', "Background Luminance", '', 'BackgroundLuminance'), 0x00240021: ('SQ', '1', "Stimulus Color Code Sequence", '', 'StimulusColorCodeSequence'), 0x00240024: ('SQ', '1', "Background Illumination Color Code Sequence", '', 'BackgroundIlluminationColorCodeSequence'), 0x00240025: ('FL', '1', "Stimulus Area", '', 'StimulusArea'), 0x00240028: ('FL', '1', "Stimulus Presentation Time", '', 'StimulusPresentationTime'), 0x00240032: ('SQ', '1', "Fixation Sequence", '', 'FixationSequence'), 0x00240033: ('SQ', '1', "Fixation Monitoring Code Sequence", '', 'FixationMonitoringCodeSequence'), 0x00240034: ('SQ', '1', "Visual Field Catch Trial Sequence", '', 'VisualFieldCatchTrialSequence'), 0x00240035: ('US', '1', "Fixation Checked Quantity", '', 'FixationCheckedQuantity'), 0x00240036: ('US', '1', "Patient Not Properly Fixated Quantity", '', 'PatientNotProperlyFixatedQuantity'), 0x00240037: ('CS', '1', "Presented Stimuli Data Flag", '', 'PresentedDataFlag'), 0x00240038: ('US', '1', "Number of Visual Stimuli", '', 'NumberOfVisualStimuli'), 0x00240039: ('CS', '1', "Excessive Fixation Losses Data Flag", '', 'ExcessiveFixationLossesDataFlag'), 0x00240040: ('CS', '1', "Excessive Fixation Losses", '', 'ExcessiveFixationLosses'), 0x00240042: ('US', '1', "Stimuli Retesting", '', 'StimuliRetesting'), 0x00240044: ('LT', '1', "Comments on Patient's Performance of Visual Field", '', 'CommentsOnPatientPerformanceOfVisualField'), 0x00240045: ('CS', '1', "False Negatives Estimate Flag", '', 'FalseNegativesEstimateFlag'), 0x00240046: ('FL', '1', "False Negatives Estimate", '', 'FalseNegativesEstimate'), 0x00240048: ('US', '1', "Negative Catch Trials", '', 'NegativeCatchTrials'), 0x00240050: ('US', '1', "False Negatives", '', 'FalseNegatives'), 0x00240051: ('CS', '1', "Excessive False Negatives Data Flag", '', 'ExcessiveFalseNegativesDataFlag'), 0x00240052: ('CS', '1', "Excessive False Negatives", '', 'ExcessiveFalseNegatives'), 0x00240053: ('CS', '1', "False Positives Estimate Flag", '', 'FalsePositivesEstimateFlag'), 0x00240054: ('FL', '1', "False Positives Estimate", '', 'FalsePositivesEstimate'), 0x00240055: ('CS', '1', "Catch Trials Data Flag", '', 'CatchTrialsDataFlag'), 0x00240056: ('US', '1', "Positive Catch Trials", '', 'PositiveCatchTrials'), 0x00240057: ('CS', '1', "Test Point Normals Data Flag", '', 'TestPointNormalsDataFlag'), 0x00240058: ('SQ', '1', "Test Point Normals Sequence", '', 'TestPointNormalsSequence'), 0x00240059: ('CS', '1', "Global Deviation Probability Normals Flag", '', 'GlobalDeviationProbabilityNormalsFlag'), 0x00240060: ('US', '1', "False Positives", '', 'FalsePositives'), 0x00240061: ('CS', '1', "Excessive False Positives Data Flag", '', 'ExcessiveFalsePositivesDataFlag'), 0x00240062: ('CS', '1', "Excessive False Positives", '', 'ExcessiveFalsePositives'), 0x00240063: ('CS', '1', "Visual Field Test Normals Flag", '', 'VisualFieldTestNormalsFlag'), 0x00240064: ('SQ', '1', "Results Normals Sequence", '', 'ResultsNormalsSequence'), 0x00240065: ('SQ', '1', "Age Corrected Sensitivity Deviation Algorithm Sequence", '', 'AgeCorrectedSensitivityDeviationAlgorithmSequence'), 0x00240066: ('FL', '1', "Global Deviation From Normal", '', 'GlobalDeviationFromNormal'), 0x00240067: ('SQ', '1', "Generalized Defect Sensitivity Deviation Algorithm Sequence", '', 'GeneralizedDefectSensitivityDeviationAlgorithmSequence'), 0x00240068: ('FL', '1', "Localized Deviation from Normal", '', 'LocalizedDeviationfromNormal'), 0x00240069: ('LO', '1', "Patient Reliability Indicator", '', 'PatientReliabilityIndicator'), 0x00240070: ('FL', '1', "Visual Field Mean Sensitivity", '', 'VisualFieldMeanSensitivity'), 0x00240071: ('FL', '1', "Global Deviation Probability", '', 'GlobalDeviationProbability'), 0x00240072: ('CS', '1', "Local Deviation Probability Normals Flag", '', 'LocalDeviationProbabilityNormalsFlag'), 0x00240073: ('FL', '1', "Localized Deviation Probability", '', 'LocalizedDeviationProbability'), 0x00240074: ('CS', '1', "Short Term Fluctuation Calculated", '', 'ShortTermFluctuationCalculated'), 0x00240075: ('FL', '1', "Short Term Fluctuation", '', 'ShortTermFluctuation'), 0x00240076: ('CS', '1', "Short Term Fluctuation Probability Calculated", '', 'ShortTermFluctuationProbabilityCalculated'), 0x00240077: ('FL', '1', "Short Term Fluctuation Probability", '', 'ShortTermFluctuationProbability'), 0x00240078: ('CS', '1', "Corrected Localized Deviation From Normal Calculated", '', 'CorrectedLocalizedDeviationFromNormalCalculated'), 0x00240079: ('FL', '1', "Corrected Localized Deviation From Normal", '', 'CorrectedLocalizedDeviationFromNormal'), 0x00240080: ('CS', '1', "Corrected Localized Deviation From Normal Probability Calculated", '', 'CorrectedLocalizedDeviationFromNormalProbabilityCalculated'), 0x00240081: ('FL', '1', "Corrected Localized Deviation From Normal Probability", '', 'CorrectedLocalizedDeviationFromNormalProbability'), 0x00240083: ('SQ', '1', "Global Deviation Sequence", '', 'GlobalDeviation'), 0x00240085: ('SQ', '1', "Localized Deviation Sequence", '', 'LocalizedDeviation'), 0x00240086: ('CS', '1', "Foveal Sensitivity Measured", '', 'FovealSensitivityMeasured'), 0x00240087: ('FL', '1', "Foveal Sensitivity", '', 'FovealSensitivity'), 0x00240088: ('FL', '1', "Visual Field Test Duration", '', 'VisualFieldTestDuration'), 0x00240089: ('SQ', '1', "Visual Field Test Point Sequence", '', 'VisualFieldTestPointSequence'), 0x00240090: ('FL', '1', "Visual Field Test Point X-Coordinate", '', 'VisualFieldTestPointXCoordinate'), 0x00240091: ('FL', '1', "Visual Field Test Point Y-Coordinate", '', 'VisualFieldTestPointYCoordinate'), 0x00240092: ('FL', '1', "Age Corrected Sensitivity Deviation Value", '', 'AgeCorrectedSensitivityDeviationValue'), 0x00240093: ('CS', '1', "Stimulus Results", '', 'StimulusResults'), 0x00240094: ('FL', '1', "Sensitivity Value", '', 'SensitivityValue'), 0x00240095: ('CS', '1', "Retest Stimulus Seen", '', 'RetestStimulusSeen'), 0x00240096: ('FL', '1', "Retest Sensitivity Value", '', 'RetestSensitivityValue'), 0x00240097: ('SQ', '1', "Visual Field Test Point Normals Sequence", '', 'VisualFieldTestPointNormalsSequence'), 0x00240098: ('FL', '1', "Quantified Defect", '', 'QuantifiedDefect'), 0x00240100: ('FL', '1', "Age Corrected Sensitivity Deviation Probability Value", '', 'AgeCorrectedSensitivityDeviationProbabilityValue'), 0x00240102: ('CS', '1', "Generalized Defect Corrected Sensitivity Deviation Flag", '', 'GeneralizedDefectCorrectedSensitivityDeviationFlag'), 0x00240103: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationValue'), 0x00240104: ('FL', '1', "Generalized Defect Corrected Sensitivity Deviation Probability Value", '', 'GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue'), 0x00240105: ('FL', '1', "Minimum Sensitivity Value", '', 'MinimumSensitivityValue'), 0x00240106: ('CS', '1', "Blind Spot Localized", '', 'BlindSpotLocalized'), 0x00240107: ('FL', '1', "Blind Spot X-Coordinate", '', 'BlindSpotXCoordinate'), 0x00240108: ('FL', '1', "Blind Spot Y-Coordinate", '', 'BlindSpotYCoordinate'), 0x00240110: ('SQ', '1', "Visual Acuity Measurement Sequence", '', 'VisualAcuityMeasurementSequence'), 0x00240112: ('SQ', '1', "Refractive Parameters Used on Patient Sequence", '', 'RefractiveParametersUsedOnPatientSequence'), 0x00240113: ('CS', '1', "Measurement Laterality", '', 'MeasurementLaterality'), 0x00240114: ('SQ', '1', "Ophthalmic Patient Clinical Information Left Eye Sequence", '', 'OphthalmicPatientClinicalInformationLeftEyeSequence'), 0x00240115: ('SQ', '1', "Ophthalmic Patient Clinical Information Right Eye Sequence", '', 'OphthalmicPatientClinicalInformationRightEyeSequence'), 0x00240117: ('CS', '1', "Foveal Point Normative Data Flag", '', 'FovealPointNormativeDataFlag'), 0x00240118: ('FL', '1', "Foveal Point Probability Value", '', 'FovealPointProbabilityValue'), 0x00240120: ('CS', '1', "Screening Baseline Measured", '', 'ScreeningBaselineMeasured'), 0x00240122: ('SQ', '1', "Screening Baseline Measured Sequence", '', 'ScreeningBaselineMeasuredSequence'), 0x00240124: ('CS', '1', "Screening Baseline Type", '', 'ScreeningBaselineType'), 0x00240126: ('FL', '1', "Screening Baseline Value", '', 'ScreeningBaselineValue'), 0x00240202: ('LO', '1', "Algorithm Source", '', 'AlgorithmSource'), 0x00240306: ('LO', '1', "Data Set Name", '', 'DataSetName'), 0x00240307: ('LO', '1', "Data Set Version", '', 'DataSetVersion'), 0x00240308: ('LO', '1', "Data Set Source", '', 'DataSetSource'), 0x00240309: ('LO', '1', "Data Set Description", '', 'DataSetDescription'), 0x00240317: ('SQ', '1', "Visual Field Test Reliability Global Index Sequence", '', 'VisualFieldTestReliabilityGlobalIndexSequence'), 0x00240320: ('SQ', '1', "Visual Field Global Results Index Sequence", '', 'VisualFieldGlobalResultsIndexSequence'), 0x00240325: ('SQ', '1', "Data Observation Sequence", '', 'DataObservationSequence'), 0x00240338: ('CS', '1', "Index Normals Flag", '', 'IndexNormalsFlag'), 0x00240341: ('FL', '1', "Index Probability", '', 'IndexProbability'), 0x00240344: ('SQ', '1', "Index Probability Sequence", '', 'IndexProbabilitySequence'), 0x00280002: ('US', '1', "Samples per Pixel", '', 'SamplesPerPixel'), 0x00280003: ('US', '1', "Samples per Pixel Used", '', 'SamplesPerPixelUsed'), 0x00280004: ('CS', '1', "Photometric Interpretation", '', 'PhotometricInterpretation'), 0x00280005: ('US', '1', "Image Dimensions", 'Retired', 'ImageDimensions'), 0x00280006: ('US', '1', "Planar Configuration", '', 'PlanarConfiguration'), 0x00280008: ('IS', '1', "Number of Frames", '', 'NumberOfFrames'), 0x00280009: ('AT', '1-n', "Frame Increment Pointer", '', 'FrameIncrementPointer'), 0x0028000A: ('AT', '1-n', "Frame Dimension Pointer", '', 'FrameDimensionPointer'), 0x00280010: ('US', '1', "Rows", '', 'Rows'), 0x00280011: ('US', '1', "Columns", '', 'Columns'), 0x00280012: ('US', '1', "Planes", 'Retired', 'Planes'), 0x00280014: ('US', '1', "Ultrasound Color Data Present", '', 'UltrasoundColorDataPresent'), 0x00280020: ('OB', '1', "Retired-blank", 'Retired', ''), 0x00280030: ('DS', '2', "Pixel Spacing", '', 'PixelSpacing'), 0x00280031: ('DS', '2', "Zoom Factor", '', 'ZoomFactor'), 0x00280032: ('DS', '2', "Zoom Center", '', 'ZoomCenter'), 0x00280034: ('IS', '2', "Pixel Aspect Ratio", '', 'PixelAspectRatio'), 0x00280040: ('CS', '1', "Image Format", 'Retired', 'ImageFormat'), 0x00280050: ('LO', '1-n', "Manipulated Image", 'Retired', 'ManipulatedImage'), 0x00280051: ('CS', '1-n', "Corrected Image", '', 'CorrectedImage'), 0x0028005F: ('LO', '1', "Compression Recognition Code", 'Retired', 'CompressionRecognitionCode'), 0x00280060: ('CS', '1', "Compression Code", 'Retired', 'CompressionCode'), 0x00280061: ('SH', '1', "Compression Originator", 'Retired', 'CompressionOriginator'), 0x00280062: ('LO', '1', "Compression Label", 'Retired', 'CompressionLabel'), 0x00280063: ('SH', '1', "Compression Description", 'Retired', 'CompressionDescription'), 0x00280065: ('CS', '1-n', "Compression Sequence", 'Retired', 'CompressionSequence'), 0x00280066: ('AT', '1-n', "Compression Step Pointers", 'Retired', 'CompressionStepPointers'), 0x00280068: ('US', '1', "Repeat Interval", 'Retired', 'RepeatInterval'), 0x00280069: ('US', '1', "Bits Grouped", 'Retired', 'BitsGrouped'), 0x00280070: ('US', '1-n', "Perimeter Table", 'Retired', 'PerimeterTable'), 0x00280071: ('US or SS', '1', "Perimeter Value", 'Retired', 'PerimeterValue'), 0x00280080: ('US', '1', "Predictor Rows", 'Retired', 'PredictorRows'), 0x00280081: ('US', '1', "Predictor Columns", 'Retired', 'PredictorColumns'), 0x00280082: ('US', '1-n', "Predictor Constants", 'Retired', 'PredictorConstants'), 0x00280090: ('CS', '1', "Blocked Pixels", 'Retired', 'BlockedPixels'), 0x00280091: ('US', '1', "Block Rows", 'Retired', 'BlockRows'), 0x00280092: ('US', '1', "Block Columns", 'Retired', 'BlockColumns'), 0x00280093: ('US', '1', "Row Overlap", 'Retired', 'RowOverlap'), 0x00280094: ('US', '1', "Column Overlap", 'Retired', 'ColumnOverlap'), 0x00280100: ('US', '1', "Bits Allocated", '', 'BitsAllocated'), 0x00280101: ('US', '1', "Bits Stored", '', 'BitsStored'), 0x00280102: ('US', '1', "High Bit", '', 'HighBit'), 0x00280103: ('US', '1', "Pixel Representation", '', 'PixelRepresentation'), 0x00280104: ('US or SS', '1', "Smallest Valid Pixel Value", 'Retired', 'SmallestValidPixelValue'), 0x00280105: ('US or SS', '1', "Largest Valid Pixel Value", 'Retired', 'LargestValidPixelValue'), 0x00280106: ('US or SS', '1', "Smallest Image Pixel Value", '', 'SmallestImagePixelValue'), 0x00280107: ('US or SS', '1', "Largest Image Pixel Value", '', 'LargestImagePixelValue'), 0x00280108: ('US or SS', '1', "Smallest Pixel Value in Series", '', 'SmallestPixelValueInSeries'), 0x00280109: ('US or SS', '1', "Largest Pixel Value in Series", '', 'LargestPixelValueInSeries'), 0x00280110: ('US or SS', '1', "Smallest Image Pixel Value in Plane", 'Retired', 'SmallestImagePixelValueInPlane'), 0x00280111: ('US or SS', '1', "Largest Image Pixel Value in Plane", 'Retired', 'LargestImagePixelValueInPlane'), 0x00280120: ('US or SS', '1', "Pixel Padding Value", '', 'PixelPaddingValue'), 0x00280121: ('US or SS', '1', "Pixel Padding Range Limit", '', 'PixelPaddingRangeLimit'), 0x00280200: ('US', '1', "Image Location", 'Retired', 'ImageLocation'), 0x00280300: ('CS', '1', "Quality Control Image", '', 'QualityControlImage'), 0x00280301: ('CS', '1', "Burned In Annotation", '', 'BurnedInAnnotation'), 0x00280302: ('CS', '1', "Recognizable Visual Features", '', 'RecognizableVisualFeatures'), 0x00280303: ('CS', '1', "Longitudinal Temporal Information Modified", '', 'LongitudinalTemporalInformationModified'), 0x00280400: ('LO', '1', "Transform Label", 'Retired', 'TransformLabel'), 0x00280401: ('LO', '1', "Transform Version Number", 'Retired', 'TransformVersionNumber'), 0x00280402: ('US', '1', "Number of Transform Steps", 'Retired', 'NumberOfTransformSteps'), 0x00280403: ('LO', '1-n', "Sequence of Compressed Data", 'Retired', 'SequenceOfCompressedData'), 0x00280404: ('AT', '1-n', "Details of Coefficients", 'Retired', 'DetailsOfCoefficients'), 0x00280700: ('LO', '1', "DCT Label", 'Retired', 'DCTLabel'), 0x00280701: ('CS', '1-n', "Data Block Description", 'Retired', 'DataBlockDescription'), 0x00280702: ('AT', '1-n', "Data Block", 'Retired', 'DataBlock'), 0x00280710: ('US', '1', "Normalization Factor Format", 'Retired', 'NormalizationFactorFormat'), 0x00280720: ('US', '1', "Zonal Map Number Format", 'Retired', 'ZonalMapNumberFormat'), 0x00280721: ('AT', '1-n', "Zonal Map Location", 'Retired', 'ZonalMapLocation'), 0x00280722: ('US', '1', "Zonal Map Format", 'Retired', 'ZonalMapFormat'), 0x00280730: ('US', '1', "Adaptive Map Format", 'Retired', 'AdaptiveMapFormat'), 0x00280740: ('US', '1', "Code Number Format", 'Retired', 'CodeNumberFormat'), 0x00280A02: ('CS', '1', "Pixel Spacing Calibration Type", '', 'PixelSpacingCalibrationType'), 0x00280A04: ('LO', '1', "Pixel Spacing Calibration Description", '', 'PixelSpacingCalibrationDescription'), 0x00281040: ('CS', '1', "Pixel Intensity Relationship", '', 'PixelIntensityRelationship'), 0x00281041: ('SS', '1', "Pixel Intensity Relationship Sign", '', 'PixelIntensityRelationshipSign'), 0x00281050: ('DS', '1-n', "Window Center", '', 'WindowCenter'), 0x00281051: ('DS', '1-n', "Window Width", '', 'WindowWidth'), 0x00281052: ('DS', '1', "Rescale Intercept", '', 'RescaleIntercept'), 0x00281053: ('DS', '1', "Rescale Slope", '', 'RescaleSlope'), 0x00281054: ('LO', '1', "Rescale Type", '', 'RescaleType'), 0x00281055: ('LO', '1-n', "Window Center & Width Explanation", '', 'WindowCenterWidthExplanation'), 0x00281056: ('CS', '1', "VOI LUT Function", '', 'VOILUTFunction'), 0x00281080: ('CS', '1', "Gray Scale", 'Retired', 'GrayScale'), 0x00281090: ('CS', '1', "Recommended Viewing Mode", '', 'RecommendedViewingMode'), 0x00281100: ('US or SS', '3', "Gray Lookup Table Descriptor", 'Retired', 'GrayLookupTableDescriptor'), 0x00281101: ('US or SS', '3', "Red Palette Color Lookup Table Descriptor", '', 'RedPaletteColorLookupTableDescriptor'), 0x00281102: ('US or SS', '3', "Green Palette Color Lookup Table Descriptor", '', 'GreenPaletteColorLookupTableDescriptor'), 0x00281103: ('US or SS', '3', "Blue Palette Color Lookup Table Descriptor", '', 'BluePaletteColorLookupTableDescriptor'), 0x00281104: ('US', '3', "Alpha Palette Color Lookup Table Descriptor", '', 'AlphaPaletteColorLookupTableDescriptor'), 0x00281111: ('US or SS', '4', "Large Red Palette Color Lookup Table Descriptor", 'Retired', 'LargeRedPaletteColorLookupTableDescriptor'), 0x00281112: ('US or SS', '4', "Large Green Palette Color Lookup Table Descriptor", 'Retired', 'LargeGreenPaletteColorLookupTableDescriptor'), 0x00281113: ('US or SS', '4', "Large Blue Palette Color Lookup Table Descriptor", 'Retired', 'LargeBluePaletteColorLookupTableDescriptor'), 0x00281199: ('UI', '1', "Palette Color Lookup Table UID", '', 'PaletteColorLookupTableUID'), 0x00281200: ('US or SS or OW', '1-n 1', "Gray Lookup Table Data", 'Retired', 'GrayLookupTableData'), 0x00281201: ('OW', '1', "Red Palette Color Lookup Table Data", '', 'RedPaletteColorLookupTableData'), 0x00281202: ('OW', '1', "Green Palette Color Lookup Table Data", '', 'GreenPaletteColorLookupTableData'), 0x00281203: ('OW', '1', "Blue Palette Color Lookup Table Data", '', 'BluePaletteColorLookupTableData'), 0x00281204: ('OW', '1', "Alpha Palette Color Lookup Table Data", '', 'AlphaPaletteColorLookupTableData'), 0x00281211: ('OW', '1', "Large Red Palette Color Lookup Table Data", 'Retired', 'LargeRedPaletteColorLookupTableData'), 0x00281212: ('OW', '1', "Large Green Palette Color Lookup Table Data", 'Retired', 'LargeGreenPaletteColorLookupTableData'), 0x00281213: ('OW', '1', "Large Blue Palette Color Lookup Table Data", 'Retired', 'LargeBluePaletteColorLookupTableData'), 0x00281214: ('UI', '1', "Large Palette Color Lookup Table UID", 'Retired', 'LargePaletteColorLookupTableUID'), 0x00281221: ('OW', '1', "Segmented Red Palette Color Lookup Table Data", '', 'SegmentedRedPaletteColorLookupTableData'), 0x00281222: ('OW', '1', "Segmented Green Palette Color Lookup Table Data", '', 'SegmentedGreenPaletteColorLookupTableData'), 0x00281223: ('OW', '1', "Segmented Blue Palette Color Lookup Table Data", '', 'SegmentedBluePaletteColorLookupTableData'), 0x00281300: ('CS', '1', "Breast Implant Present", '', 'BreastImplantPresent'), 0x00281350: ('CS', '1', "Partial View", '', 'PartialView'), 0x00281351: ('ST', '1', "Partial View Description", '', 'PartialViewDescription'), 0x00281352: ('SQ', '1', "Partial View Code Sequence", '', 'PartialViewCodeSequence'), 0x0028135A: ('CS', '1', "Spatial Locations Preserved", '', 'SpatialLocationsPreserved'), 0x00281401: ('SQ', '1', "Data Frame Assignment Sequence", '', 'DataFrameAssignmentSequence'), 0x00281402: ('CS', '1', "Data Path Assignment", '', 'DataPathAssignment'), 0x00281403: ('US', '1', "Bits Mapped to Color Lookup Table", '', 'BitsMappedToColorLookupTable'), 0x00281404: ('SQ', '1', "Blending LUT 1 Sequence", '', 'BlendingLUT1Sequence'), 0x00281405: ('CS', '1', "Blending LUT 1 Transfer Function", '', 'BlendingLUT1TransferFunction'), 0x00281406: ('FD', '1', "Blending Weight Constant", '', 'BlendingWeightConstant'), 0x00281407: ('US', '3', "Blending Lookup Table Descriptor", '', 'BlendingLookupTableDescriptor'), 0x00281408: ('OW', '1', "Blending Lookup Table Data", '', 'BlendingLookupTableData'), 0x0028140B: ('SQ', '1', "Enhanced Palette Color Lookup Table Sequence", '', 'EnhancedPaletteColorLookupTableSequence'), 0x0028140C: ('SQ', '1', "Blending LUT 2 Sequence", '', 'BlendingLUT2Sequence'), 0x0028140D: ('CS', '1', "Blending LUT 2 Transfer Function", '', 'BlendingLUT2TransferFunction'), 0x0028140E: ('CS', '1', "Data Path ID", '', 'DataPathID'), 0x0028140F: ('CS', '1', "RGB LUT Transfer Function", '', 'RGBLUTTransferFunction'), 0x00281410: ('CS', '1', "Alpha LUT Transfer Function", '', 'AlphaLUTTransferFunction'), 0x00282000: ('OB', '1', "ICC Profile", '', 'ICCProfile'), 0x00282110: ('CS', '1', "Lossy Image Compression", '', 'LossyImageCompression'), 0x00282112: ('DS', '1-n', "Lossy Image Compression Ratio", '', 'LossyImageCompressionRatio'), 0x00282114: ('CS', '1-n', "Lossy Image Compression Method", '', 'LossyImageCompressionMethod'), 0x00283000: ('SQ', '1', "Modality LUT Sequence", '', 'ModalityLUTSequence'), 0x00283002: ('US or SS', '3', "LUT Descriptor", '', 'LUTDescriptor'), 0x00283003: ('LO', '1', "LUT Explanation", '', 'LUTExplanation'), 0x00283004: ('LO', '1', "Modality LUT Type", '', 'ModalityLUTType'), 0x00283006: ('US or OW', '1-n 1', "LUT Data", '', 'LUTData'), 0x00283010: ('SQ', '1', "VOI LUT Sequence", '', 'VOILUTSequence'), 0x00283110: ('SQ', '1', "Softcopy VOI LUT Sequence", '', 'SoftcopyVOILUTSequence'), 0x00284000: ('LT', '1', "Image Presentation Comments", 'Retired', 'ImagePresentationComments'), 0x00285000: ('SQ', '1', "Bi-Plane Acquisition Sequence", 'Retired', 'BiPlaneAcquisitionSequence'), 0x00286010: ('US', '1', "Representative Frame Number", '', 'RepresentativeFrameNumber'), 0x00286020: ('US', '1-n', "Frame Numbers of Interest (FOI)", '', 'FrameNumbersOfInterest'), 0x00286022: ('LO', '1-n', "Frame of Interest Description", '', 'FrameOfInterestDescription'), 0x00286023: ('CS', '1-n', "Frame of Interest Type", '', 'FrameOfInterestType'), 0x00286030: ('US', '1-n', "Mask Pointer(s)", 'Retired', 'MaskPointers'), 0x00286040: ('US', '1-n', "R Wave Pointer", '', 'RWavePointer'), 0x00286100: ('SQ', '1', "Mask Subtraction Sequence", '', 'MaskSubtractionSequence'), 0x00286101: ('CS', '1', "Mask Operation", '', 'MaskOperation'), 0x00286102: ('US', '2-2n', "Applicable Frame Range", '', 'ApplicableFrameRange'), 0x00286110: ('US', '1-n', "Mask Frame Numbers", '', 'MaskFrameNumbers'), 0x00286112: ('US', '1', "Contrast Frame Averaging", '', 'ContrastFrameAveraging'), 0x00286114: ('FL', '2', "Mask Sub-pixel Shift", '', 'MaskSubPixelShift'), 0x00286120: ('SS', '1', "TID Offset", '', 'TIDOffset'), 0x00286190: ('ST', '1', "Mask Operation Explanation", '', 'MaskOperationExplanation'), 0x00287FE0: ('UT', '1', "Pixel Data Provider URL", '', 'PixelDataProviderURL'), 0x00289001: ('UL', '1', "Data Point Rows", '', 'DataPointRows'), 0x00289002: ('UL', '1', "Data Point Columns", '', 'DataPointColumns'), 0x00289003: ('CS', '1', "Signal Domain Columns", '', 'SignalDomainColumns'), 0x00289099: ('US', '1', "Largest Monochrome Pixel Value", 'Retired', 'LargestMonochromePixelValue'), 0x00289108: ('CS', '1', "Data Representation", '', 'DataRepresentation'), 0x00289110: ('SQ', '1', "Pixel Measures Sequence", '', 'PixelMeasuresSequence'), 0x00289132: ('SQ', '1', "Frame VOI LUT Sequence", '', 'FrameVOILUTSequence'), 0x00289145: ('SQ', '1', "Pixel Value Transformation Sequence", '', 'PixelValueTransformationSequence'), 0x00289235: ('CS', '1', "Signal Domain Rows", '', 'SignalDomainRows'), 0x00289411: ('FL', '1', "Display Filter Percentage", '', 'DisplayFilterPercentage'), 0x00289415: ('SQ', '1', "Frame Pixel Shift Sequence", '', 'FramePixelShiftSequence'), 0x00289416: ('US', '1', "Subtraction Item ID", '', 'SubtractionItemID'), 0x00289422: ('SQ', '1', "Pixel Intensity Relationship LUT Sequence", '', 'PixelIntensityRelationshipLUTSequence'), 0x00289443: ('SQ', '1', "Frame Pixel Data Properties Sequence", '', 'FramePixelDataPropertiesSequence'), 0x00289444: ('CS', '1', "Geometrical Properties", '', 'GeometricalProperties'), 0x00289445: ('FL', '1', "Geometric Maximum Distortion", '', 'GeometricMaximumDistortion'), 0x00289446: ('CS', '1-n', "Image Processing Applied", '', 'ImageProcessingApplied'), 0x00289454: ('CS', '1', "Mask Selection Mode", '', 'MaskSelectionMode'), 0x00289474: ('CS', '1', "LUT Function", '', 'LUTFunction'), 0x00289478: ('FL', '1', "Mask Visibility Percentage", '', 'MaskVisibilityPercentage'), 0x00289501: ('SQ', '1', "Pixel Shift Sequence", '', 'PixelShiftSequence'), 0x00289502: ('SQ', '1', "Region Pixel Shift Sequence", '', 'RegionPixelShiftSequence'), 0x00289503: ('SS', '2-2n', "Vertices of the Region", '', 'VerticesOfTheRegion'), 0x00289505: ('SQ', '1', "Multi-frame Presentation Sequence", '', 'MultiFramePresentationSequence'), 0x00289506: ('US', '2-2n', "Pixel Shift Frame Range", '', 'PixelShiftFrameRange'), 0x00289507: ('US', '2-2n', "LUT Frame Range", '', 'LUTFrameRange'), 0x00289520: ('DS', '16', "Image to Equipment Mapping Matrix", '', 'ImageToEquipmentMappingMatrix'), 0x00289537: ('CS', '1', "Equipment Coordinate System Identification", '', 'EquipmentCoordinateSystemIdentification'), 0x0032000A: ('CS', '1', "Study Status ID", 'Retired', 'StudyStatusID'), 0x0032000C: ('CS', '1', "Study Priority ID", 'Retired', 'StudyPriorityID'), 0x00320012: ('LO', '1', "Study ID Issuer", 'Retired', 'StudyIDIssuer'), 0x00320032: ('DA', '1', "Study Verified Date", 'Retired', 'StudyVerifiedDate'), 0x00320033: ('TM', '1', "Study Verified Time", 'Retired', 'StudyVerifiedTime'), 0x00320034: ('DA', '1', "Study Read Date", 'Retired', 'StudyReadDate'), 0x00320035: ('TM', '1', "Study Read Time", 'Retired', 'StudyReadTime'), 0x00321000: ('DA', '1', "Scheduled Study Start Date", 'Retired', 'ScheduledStudyStartDate'), 0x00321001: ('TM', '1', "Scheduled Study Start Time", 'Retired', 'ScheduledStudyStartTime'), 0x00321010: ('DA', '1', "Scheduled Study Stop Date", 'Retired', 'ScheduledStudyStopDate'), 0x00321011: ('TM', '1', "Scheduled Study Stop Time", 'Retired', 'ScheduledStudyStopTime'), 0x00321020: ('LO', '1', "Scheduled Study Location", 'Retired', 'ScheduledStudyLocation'), 0x00321021: ('AE', '1-n', "Scheduled Study Location AE Title", 'Retired', 'ScheduledStudyLocationAETitle'), 0x00321030: ('LO', '1', "Reason for Study", 'Retired', 'ReasonForStudy'), 0x00321031: ('SQ', '1', "Requesting Physician Identification Sequence", '', 'RequestingPhysicianIdentificationSequence'), 0x00321032: ('PN', '1', "Requesting Physician", '', 'RequestingPhysician'), 0x00321033: ('LO', '1', "Requesting Service", '', 'RequestingService'), 0x00321034: ('SQ', '1', "Requesting Service Code Sequence", '', 'RequestingServiceCodeSequence'), 0x00321040: ('DA', '1', "Study Arrival Date", 'Retired', 'StudyArrivalDate'), 0x00321041: ('TM', '1', "Study Arrival Time", 'Retired', 'StudyArrivalTime'), 0x00321050: ('DA', '1', "Study Completion Date", 'Retired', 'StudyCompletionDate'), 0x00321051: ('TM', '1', "Study Completion Time", 'Retired', 'StudyCompletionTime'), 0x00321055: ('CS', '1', "Study Component Status ID", 'Retired', 'StudyComponentStatusID'), 0x00321060: ('LO', '1', "Requested Procedure Description", '', 'RequestedProcedureDescription'), 0x00321064: ('SQ', '1', "Requested Procedure Code Sequence", '', 'RequestedProcedureCodeSequence'), 0x00321070: ('LO', '1', "Requested Contrast Agent", '', 'RequestedContrastAgent'), 0x00324000: ('LT', '1', "Study Comments", 'Retired', 'StudyComments'), 0x00380004: ('SQ', '1', "Referenced Patient Alias Sequence", '', 'ReferencedPatientAliasSequence'), 0x00380008: ('CS', '1', "Visit Status ID", '', 'VisitStatusID'), 0x00380010: ('LO', '1', "Admission ID", '', 'AdmissionID'), 0x00380011: ('LO', '1', "Issuer of Admission ID", 'Retired', 'IssuerOfAdmissionID'), 0x00380014: ('SQ', '1', "Issuer of Admission ID Sequence", '', 'IssuerOfAdmissionIDSequence'), 0x00380016: ('LO', '1', "Route of Admissions", '', 'RouteOfAdmissions'), 0x0038001A: ('DA', '1', "Scheduled Admission Date", 'Retired', 'ScheduledAdmissionDate'), 0x0038001B: ('TM', '1', "Scheduled Admission Time", 'Retired', 'ScheduledAdmissionTime'), 0x0038001C: ('DA', '1', "Scheduled Discharge Date", 'Retired', 'ScheduledDischargeDate'), 0x0038001D: ('TM', '1', "Scheduled Discharge Time", 'Retired', 'ScheduledDischargeTime'), 0x0038001E: ('LO', '1', "Scheduled Patient Institution Residence", 'Retired', 'ScheduledPatientInstitutionResidence'), 0x00380020: ('DA', '1', "Admitting Date", '', 'AdmittingDate'), 0x00380021: ('TM', '1', "Admitting Time", '', 'AdmittingTime'), 0x00380030: ('DA', '1', "Discharge Date", 'Retired', 'DischargeDate'), 0x00380032: ('TM', '1', "Discharge Time", 'Retired', 'DischargeTime'), 0x00380040: ('LO', '1', "Discharge Diagnosis Description", 'Retired', 'DischargeDiagnosisDescription'), 0x00380044: ('SQ', '1', "Discharge Diagnosis Code Sequence", 'Retired', 'DischargeDiagnosisCodeSequence'), 0x00380050: ('LO', '1', "Special Needs", '', 'SpecialNeeds'), 0x00380060: ('LO', '1', "Service Episode ID", '', 'ServiceEpisodeID'), 0x00380061: ('LO', '1', "Issuer of Service Episode ID", 'Retired', 'IssuerOfServiceEpisodeID'), 0x00380062: ('LO', '1', "Service Episode Description", '', 'ServiceEpisodeDescription'), 0x00380064: ('SQ', '1', "Issuer of Service Episode ID Sequence", '', 'IssuerOfServiceEpisodeIDSequence'), 0x00380100: ('SQ', '1', "Pertinent Documents Sequence", '', 'PertinentDocumentsSequence'), 0x00380300: ('LO', '1', "Current Patient Location", '', 'CurrentPatientLocation'), 0x00380400: ('LO', '1', "Patient's Institution Residence", '', 'PatientInstitutionResidence'), 0x00380500: ('LO', '1', "Patient State", '', 'PatientState'), 0x00380502: ('SQ', '1', "Patient Clinical Trial Participation Sequence", '', 'PatientClinicalTrialParticipationSequence'), 0x00384000: ('LT', '1', "Visit Comments", '', 'VisitComments'), 0x003A0004: ('CS', '1', "Waveform Originality", '', 'WaveformOriginality'), 0x003A0005: ('US', '1', "Number of Waveform Channels", '', 'NumberOfWaveformChannels'), 0x003A0010: ('UL', '1', "Number of Waveform Samples", '', 'NumberOfWaveformSamples'), 0x003A001A: ('DS', '1', "Sampling Frequency", '', 'SamplingFrequency'), 0x003A0020: ('SH', '1', "Multiplex Group Label", '', 'MultiplexGroupLabel'), 0x003A0200: ('SQ', '1', "Channel Definition Sequence", '', 'ChannelDefinitionSequence'), 0x003A0202: ('IS', '1', "Waveform Channel Number", '', 'WaveformChannelNumber'), 0x003A0203: ('SH', '1', "Channel Label", '', 'ChannelLabel'), 0x003A0205: ('CS', '1-n', "Channel Status", '', 'ChannelStatus'), 0x003A0208: ('SQ', '1', "Channel Source Sequence", '', 'ChannelSourceSequence'), 0x003A0209: ('SQ', '1', "Channel Source Modifiers Sequence", '', 'ChannelSourceModifiersSequence'), 0x003A020A: ('SQ', '1', "Source Waveform Sequence", '', 'SourceWaveformSequence'), 0x003A020C: ('LO', '1', "Channel Derivation Description", '', 'ChannelDerivationDescription'), 0x003A0210: ('DS', '1', "Channel Sensitivity", '', 'ChannelSensitivity'), 0x003A0211: ('SQ', '1', "Channel Sensitivity Units Sequence", '', 'ChannelSensitivityUnitsSequence'), 0x003A0212: ('DS', '1', "Channel Sensitivity Correction Factor", '', 'ChannelSensitivityCorrectionFactor'), 0x003A0213: ('DS', '1', "Channel Baseline", '', 'ChannelBaseline'), 0x003A0214: ('DS', '1', "Channel Time Skew", '', 'ChannelTimeSkew'), 0x003A0215: ('DS', '1', "Channel Sample Skew", '', 'ChannelSampleSkew'), 0x003A0218: ('DS', '1', "Channel Offset", '', 'ChannelOffset'), 0x003A021A: ('US', '1', "Waveform Bits Stored", '', 'WaveformBitsStored'), 0x003A0220: ('DS', '1', "Filter Low Frequency", '', 'FilterLowFrequency'), 0x003A0221: ('DS', '1', "Filter High Frequency", '', 'FilterHighFrequency'), 0x003A0222: ('DS', '1', "Notch Filter Frequency", '', 'NotchFilterFrequency'), 0x003A0223: ('DS', '1', "Notch Filter Bandwidth", '', 'NotchFilterBandwidth'), 0x003A0230: ('FL', '1', "Waveform Data Display Scale", '', 'WaveformDataDisplayScale'), 0x003A0231: ('US', '3', "Waveform Display Background CIELab Value", '', 'WaveformDisplayBackgroundCIELabValue'), 0x003A0240: ('SQ', '1', "Waveform Presentation Group Sequence", '', 'WaveformPresentationGroupSequence'), 0x003A0241: ('US', '1', "Presentation Group Number", '', 'PresentationGroupNumber'), 0x003A0242: ('SQ', '1', "Channel Display Sequence", '', 'ChannelDisplaySequence'), 0x003A0244: ('US', '3', "Channel Recommended Display CIELab Value", '', 'ChannelRecommendedDisplayCIELabValue'), 0x003A0245: ('FL', '1', "Channel Position", '', 'ChannelPosition'), 0x003A0246: ('CS', '1', "Display Shading Flag", '', 'DisplayShadingFlag'), 0x003A0247: ('FL', '1', "Fractional Channel Display Scale", '', 'FractionalChannelDisplayScale'), 0x003A0248: ('FL', '1', "Absolute Channel Display Scale", '', 'AbsoluteChannelDisplayScale'), 0x003A0300: ('SQ', '1', "Multiplexed Audio Channels Description Code Sequence", '', 'MultiplexedAudioChannelsDescriptionCodeSequence'), 0x003A0301: ('IS', '1', "Channel Identification Code", '', 'ChannelIdentificationCode'), 0x003A0302: ('CS', '1', "Channel Mode", '', 'ChannelMode'), 0x00400001: ('AE', '1-n', "Scheduled Station AE Title", '', 'ScheduledStationAETitle'), 0x00400002: ('DA', '1', "Scheduled Procedure Step Start Date", '', 'ScheduledProcedureStepStartDate'), 0x00400003: ('TM', '1', "Scheduled Procedure Step Start Time", '', 'ScheduledProcedureStepStartTime'), 0x00400004: ('DA', '1', "Scheduled Procedure Step End Date", '', 'ScheduledProcedureStepEndDate'), 0x00400005: ('TM', '1', "Scheduled Procedure Step End Time", '', 'ScheduledProcedureStepEndTime'), 0x00400006: ('PN', '1', "Scheduled Performing Physician's Name", '', 'ScheduledPerformingPhysicianName'), 0x00400007: ('LO', '1', "Scheduled Procedure Step Description", '', 'ScheduledProcedureStepDescription'), 0x00400008: ('SQ', '1', "Scheduled Protocol Code Sequence", '', 'ScheduledProtocolCodeSequence'), 0x00400009: ('SH', '1', "Scheduled Procedure Step ID", '', 'ScheduledProcedureStepID'), 0x0040000A: ('SQ', '1', "Stage Code Sequence", '', 'StageCodeSequence'), 0x0040000B: ('SQ', '1', "Scheduled Performing Physician Identification Sequence", '', 'ScheduledPerformingPhysicianIdentificationSequence'), 0x00400010: ('SH', '1-n', "Scheduled Station Name", '', 'ScheduledStationName'), 0x00400011: ('SH', '1', "Scheduled Procedure Step Location", '', 'ScheduledProcedureStepLocation'), 0x00400012: ('LO', '1', "Pre-Medication", '', 'PreMedication'), 0x00400020: ('CS', '1', "Scheduled Procedure Step Status", '', 'ScheduledProcedureStepStatus'), 0x00400026: ('SQ', '1', "Order Placer Identifier Sequence", '', 'OrderPlacerIdentifierSequence'), 0x00400027: ('SQ', '1', "Order Filler Identifier Sequence", '', 'OrderFillerIdentifierSequence'), 0x00400031: ('UT', '1', "Local Namespace Entity ID", '', 'LocalNamespaceEntityID'), 0x00400032: ('UT', '1', "Universal Entity ID", '', 'UniversalEntityID'), 0x00400033: ('CS', '1', "Universal Entity ID Type", '', 'UniversalEntityIDType'), 0x00400035: ('CS', '1', "Identifier Type Code", '', 'IdentifierTypeCode'), 0x00400036: ('SQ', '1', "Assigning Facility Sequence", '', 'AssigningFacilitySequence'), 0x00400039: ('SQ', '1', "Assigning Jurisdiction Code Sequence", '', 'AssigningJurisdictionCodeSequence'), 0x0040003A: ('SQ', '1', "Assigning Agency or Department Code Sequence", '', 'AssigningAgencyOrDepartmentCodeSequence'), 0x00400100: ('SQ', '1', "Scheduled Procedure Step Sequence", '', 'ScheduledProcedureStepSequence'), 0x00400220: ('SQ', '1', "Referenced Non-Image Composite SOP Instance Sequence", '', 'ReferencedNonImageCompositeSOPInstanceSequence'), 0x00400241: ('AE', '1', "Performed Station AE Title", '', 'PerformedStationAETitle'), 0x00400242: ('SH', '1', "Performed Station Name", '', 'PerformedStationName'), 0x00400243: ('SH', '1', "Performed Location", '', 'PerformedLocation'), 0x00400244: ('DA', '1', "Performed Procedure Step Start Date", '', 'PerformedProcedureStepStartDate'), 0x00400245: ('TM', '1', "Performed Procedure Step Start Time", '', 'PerformedProcedureStepStartTime'), 0x00400250: ('DA', '1', "Performed Procedure Step End Date", '', 'PerformedProcedureStepEndDate'), 0x00400251: ('TM', '1', "Performed Procedure Step End Time", '', 'PerformedProcedureStepEndTime'), 0x00400252: ('CS', '1', "Performed Procedure Step Status", '', 'PerformedProcedureStepStatus'), 0x00400253: ('SH', '1', "Performed Procedure Step ID", '', 'PerformedProcedureStepID'), 0x00400254: ('LO', '1', "Performed Procedure Step Description", '', 'PerformedProcedureStepDescription'), 0x00400255: ('LO', '1', "Performed Procedure Type Description", '', 'PerformedProcedureTypeDescription'), 0x00400260: ('SQ', '1', "Performed Protocol Code Sequence", '', 'PerformedProtocolCodeSequence'), 0x00400261: ('CS', '1', "Performed Protocol Type", '', 'PerformedProtocolType'), 0x00400270: ('SQ', '1', "Scheduled Step Attributes Sequence", '', 'ScheduledStepAttributesSequence'), 0x00400275: ('SQ', '1', "Request Attributes Sequence", '', 'RequestAttributesSequence'), 0x00400280: ('ST', '1', "Comments on the Performed Procedure Step", '', 'CommentsOnThePerformedProcedureStep'), 0x00400281: ('SQ', '1', "Performed Procedure Step Discontinuation Reason Code Sequence", '', 'PerformedProcedureStepDiscontinuationReasonCodeSequence'), 0x00400293: ('SQ', '1', "Quantity Sequence", '', 'QuantitySequence'), 0x00400294: ('DS', '1', "Quantity", '', 'Quantity'), 0x00400295: ('SQ', '1', "Measuring Units Sequence", '', 'MeasuringUnitsSequence'), 0x00400296: ('SQ', '1', "Billing Item Sequence", '', 'BillingItemSequence'), 0x00400300: ('US', '1', "Total Time of Fluoroscopy", '', 'TotalTimeOfFluoroscopy'), 0x00400301: ('US', '1', "Total Number of Exposures", '', 'TotalNumberOfExposures'), 0x00400302: ('US', '1', "Entrance Dose", '', 'EntranceDose'), 0x00400303: ('US', '1-2', "Exposed Area", '', 'ExposedArea'), 0x00400306: ('DS', '1', "Distance Source to Entrance", '', 'DistanceSourceToEntrance'), 0x00400307: ('DS', '1', "Distance Source to Support", 'Retired', 'DistanceSourceToSupport'), 0x0040030E: ('SQ', '1', "Exposure Dose Sequence", '', 'ExposureDoseSequence'), 0x00400310: ('ST', '1', "Comments on Radiation Dose", '', 'CommentsOnRadiationDose'), 0x00400312: ('DS', '1', "X-Ray Output", '', 'XRayOutput'), 0x00400314: ('DS', '1', "Half Value Layer", '', 'HalfValueLayer'), 0x00400316: ('DS', '1', "Organ Dose", '', 'OrganDose'), 0x00400318: ('CS', '1', "Organ Exposed", '', 'OrganExposed'), 0x00400320: ('SQ', '1', "Billing Procedure Step Sequence", '', 'BillingProcedureStepSequence'), 0x00400321: ('SQ', '1', "Film Consumption Sequence", '', 'FilmConsumptionSequence'), 0x00400324: ('SQ', '1', "Billing Supplies and Devices Sequence", '', 'BillingSuppliesAndDevicesSequence'), 0x00400330: ('SQ', '1', "Referenced Procedure Step Sequence", 'Retired', 'ReferencedProcedureStepSequence'), 0x00400340: ('SQ', '1', "Performed Series Sequence", '', 'PerformedSeriesSequence'), 0x00400400: ('LT', '1', "Comments on the Scheduled Procedure Step", '', 'CommentsOnTheScheduledProcedureStep'), 0x00400440: ('SQ', '1', "Protocol Context Sequence", '', 'ProtocolContextSequence'), 0x00400441: ('SQ', '1', "Content Item Modifier Sequence", '', 'ContentItemModifierSequence'), 0x00400500: ('SQ', '1', "Scheduled Specimen Sequence", '', 'ScheduledSpecimenSequence'), 0x0040050A: ('LO', '1', "Specimen Accession Number", 'Retired', 'SpecimenAccessionNumber'), 0x00400512: ('LO', '1', "Container Identifier", '', 'ContainerIdentifier'), 0x00400513: ('SQ', '1', "Issuer of the Container Identifier Sequence", '', 'IssuerOfTheContainerIdentifierSequence'), 0x00400515: ('SQ', '1', "Alternate Container Identifier Sequence", '', 'AlternateContainerIdentifierSequence'), 0x00400518: ('SQ', '1', "Container Type Sequence", '', 'ContainerTypeCodeSequence'), 0x0040051A: ('LO', '1', "Container Description", '', 'ContainerDescription'), 0x00400520: ('SQ', '1', "Container Component Sequence", '', 'ContainerComponentSequence'), 0x00400550: ('SQ', '1', "Specimen Sequence", 'Retired', 'SpecimenSequence'), 0x00400551: ('LO', '1', "Specimen Identifier", '', 'SpecimenIdentifier'), 0x00400552: ('SQ', '1', "Specimen Description Sequence (Trial)", 'Retired', 'SpecimenDescriptionSequenceTrial'), 0x00400553: ('ST', '1', "Specimen Description (Trial)", 'Retired', 'SpecimenDescriptionTrial'), 0x00400554: ('UI', '1', "Specimen UID", '', 'SpecimenUID'), 0x00400555: ('SQ', '1', "Acquisition Context Sequence", '', 'AcquisitionContextSequence'), 0x00400556: ('ST', '1', "Acquisition Context Description", '', 'AcquisitionContextDescription'), 0x0040059A: ('SQ', '1', "Specimen Type Code Sequence", '', 'SpecimenTypeCodeSequence'), 0x00400560: ('SQ', '1', "Specimen Description Sequence", '', 'SpecimenDescriptionSequence'), 0x00400562: ('SQ', '1', "Issuer of the Specimen Identifier Sequence", '', 'IssuerOfTheSpecimenIdentifierSequence'), 0x00400600: ('LO', '1', "Specimen Short Description", '', 'SpecimenShortDescription'), 0x00400602: ('UT', '1', "Specimen Detailed Description", '', 'SpecimenDetailedDescription'), 0x00400610: ('SQ', '1', "Specimen Preparation Sequence", '', 'SpecimenPreparationSequence'), 0x00400612: ('SQ', '1', "Specimen Preparation Step Content Item Sequence", '', 'SpecimenPreparationStepContentItemSequence'), 0x00400620: ('SQ', '1', "Specimen Localization Content Item Sequence", '', 'SpecimenLocalizationContentItemSequence'), 0x004006FA: ('LO', '1', "Slide Identifier", 'Retired', 'SlideIdentifier'), 0x0040071A: ('SQ', '1', "Image Center Point Coordinates Sequence", '', 'ImageCenterPointCoordinatesSequence'), 0x0040072A: ('DS', '1', "X Offset in Slide Coordinate System", '', 'XOffsetInSlideCoordinateSystem'), 0x0040073A: ('DS', '1', "Y Offset in Slide Coordinate System", '', 'YOffsetInSlideCoordinateSystem'), 0x0040074A: ('DS', '1', "Z Offset in Slide Coordinate System", '', 'ZOffsetInSlideCoordinateSystem'), 0x004008D8: ('SQ', '1', "Pixel Spacing Sequence", 'Retired', 'PixelSpacingSequence'), 0x004008DA: ('SQ', '1', "Coordinate System Axis Code Sequence", 'Retired', 'CoordinateSystemAxisCodeSequence'), 0x004008EA: ('SQ', '1', "Measurement Units Code Sequence", '', 'MeasurementUnitsCodeSequence'), 0x004009F8: ('SQ', '1', "Vital Stain Code Sequence (Trial)", 'Retired', 'VitalStainCodeSequenceTrial'), 0x00401001: ('SH', '1', "Requested Procedure ID", '', 'RequestedProcedureID'), 0x00401002: ('LO', '1', "Reason for the Requested Procedure", '', 'ReasonForTheRequestedProcedure'), 0x00401003: ('SH', '1', "Requested Procedure Priority", '', 'RequestedProcedurePriority'), 0x00401004: ('LO', '1', "Patient Transport Arrangements", '', 'PatientTransportArrangements'), 0x00401005: ('LO', '1', "Requested Procedure Location", '', 'RequestedProcedureLocation'), 0x00401006: ('SH', '1', "Placer Order Number / Procedure", 'Retired', 'PlacerOrderNumberProcedure'), 0x00401007: ('SH', '1', "Filler Order Number / Procedure", 'Retired', 'FillerOrderNumberProcedure'), 0x00401008: ('LO', '1', "Confidentiality Code", '', 'ConfidentialityCode'), 0x00401009: ('SH', '1', "Reporting Priority", '', 'ReportingPriority'), 0x0040100A: ('SQ', '1', "Reason for Requested Procedure Code Sequence", '', 'ReasonForRequestedProcedureCodeSequence'), 0x00401010: ('PN', '1-n', "Names of Intended Recipients of Results", '', 'NamesOfIntendedRecipientsOfResults'), 0x00401011: ('SQ', '1', "Intended Recipients of Results Identification Sequence", '', 'IntendedRecipientsOfResultsIdentificationSequence'), 0x00401012: ('SQ', '1', "Reason For Performed Procedure Code Sequence", '', 'ReasonForPerformedProcedureCodeSequence'), 0x00401060: ('LO', '1', "Requested Procedure Description (Trial)", 'Retired', 'RequestedProcedureDescriptionTrial'), 0x00401101: ('SQ', '1', "Person Identification Code Sequence", '', 'PersonIdentificationCodeSequence'), 0x00401102: ('ST', '1', "Person's Address", '', 'PersonAddress'), 0x00401103: ('LO', '1-n', "Person's Telephone Numbers", '', 'PersonTelephoneNumbers'), 0x00401400: ('LT', '1', "Requested Procedure Comments", '', 'RequestedProcedureComments'), 0x00402001: ('LO', '1', "Reason for the Imaging Service Request", 'Retired', 'ReasonForTheImagingServiceRequest'), 0x00402004: ('DA', '1', "Issue Date of Imaging Service Request", '', 'IssueDateOfImagingServiceRequest'), 0x00402005: ('TM', '1', "Issue Time of Imaging Service Request", '', 'IssueTimeOfImagingServiceRequest'), 0x00402006: ('SH', '1', "Placer Order Number / Imaging Service Request (Retired)", 'Retired', 'PlacerOrderNumberImagingServiceRequestRetired'), 0x00402007: ('SH', '1', "Filler Order Number / Imaging Service Request (Retired)", 'Retired', 'FillerOrderNumberImagingServiceRequestRetired'), 0x00402008: ('PN', '1', "Order Entered By", '', 'OrderEnteredBy'), 0x00402009: ('SH', '1', "Order Enterer's Location", '', 'OrderEntererLocation'), 0x00402010: ('SH', '1', "Order Callback Phone Number", '', 'OrderCallbackPhoneNumber'), 0x00402016: ('LO', '1', "Placer Order Number / Imaging Service Request", '', 'PlacerOrderNumberImagingServiceRequest'), 0x00402017: ('LO', '1', "Filler Order Number / Imaging Service Request", '', 'FillerOrderNumberImagingServiceRequest'), 0x00402400: ('LT', '1', "Imaging Service Request Comments", '', 'ImagingServiceRequestComments'), 0x00403001: ('LO', '1', "Confidentiality Constraint on Patient Data Description", '', 'ConfidentialityConstraintOnPatientDataDescription'), 0x00404001: ('CS', '1', "General Purpose Scheduled Procedure Step Status", '', 'GeneralPurposeScheduledProcedureStepStatus'), 0x00404002: ('CS', '1', "General Purpose Performed Procedure Step Status", '', 'GeneralPurposePerformedProcedureStepStatus'), 0x00404003: ('CS', '1', "General Purpose Scheduled Procedure Step Priority", '', 'GeneralPurposeScheduledProcedureStepPriority'), 0x00404004: ('SQ', '1', "Scheduled Processing Applications Code Sequence", '', 'ScheduledProcessingApplicationsCodeSequence'), 0x00404005: ('DT', '1', "Scheduled Procedure Step Start DateTime", '', 'ScheduledProcedureStepStartDateTime'), 0x00404006: ('CS', '1', "Multiple Copies Flag", '', 'MultipleCopiesFlag'), 0x00404007: ('SQ', '1', "Performed Processing Applications Code Sequence", '', 'PerformedProcessingApplicationsCodeSequence'), 0x00404009: ('SQ', '1', "Human Performer Code Sequence", '', 'HumanPerformerCodeSequence'), 0x00404010: ('DT', '1', "Scheduled Procedure Step Modification Date Time", '', 'ScheduledProcedureStepModificationDateTime'), 0x00404011: ('DT', '1', "Expected Completion Date Time", '', 'ExpectedCompletionDateTime'), 0x00404015: ('SQ', '1', "Resulting General Purpose Performed Procedure Steps Sequence", '', 'ResultingGeneralPurposePerformedProcedureStepsSequence'), 0x00404016: ('SQ', '1', "Referenced General Purpose Scheduled Procedure Step Sequence", '', 'ReferencedGeneralPurposeScheduledProcedureStepSequence'), 0x00404018: ('SQ', '1', "Scheduled Workitem Code Sequence", '', 'ScheduledWorkitemCodeSequence'), 0x00404019: ('SQ', '1', "Performed Workitem Code Sequence", '', 'PerformedWorkitemCodeSequence'), 0x00404020: ('CS', '1', "Input Availability Flag", '', 'InputAvailabilityFlag'), 0x00404021: ('SQ', '1', "Input Information Sequence", '', 'InputInformationSequence'), 0x00404022: ('SQ', '1', "Relevant Information Sequence", '', 'RelevantInformationSequence'), 0x00404023: ('UI', '1', "Referenced General Purpose Scheduled Procedure Step Transaction UID", '', 'ReferencedGeneralPurposeScheduledProcedureStepTransactionUID'), 0x00404025: ('SQ', '1', "Scheduled Station Name Code Sequence", '', 'ScheduledStationNameCodeSequence'), 0x00404026: ('SQ', '1', "Scheduled Station Class Code Sequence", '', 'ScheduledStationClassCodeSequence'), 0x00404027: ('SQ', '1', "Scheduled Station Geographic Location Code Sequence", '', 'ScheduledStationGeographicLocationCodeSequence'), 0x00404028: ('SQ', '1', "Performed Station Name Code Sequence", '', 'PerformedStationNameCodeSequence'), 0x00404029: ('SQ', '1', "Performed Station Class Code Sequence", '', 'PerformedStationClassCodeSequence'), 0x00404030: ('SQ', '1', "Performed Station Geographic Location Code Sequence", '', 'PerformedStationGeographicLocationCodeSequence'), 0x00404031: ('SQ', '1', "Requested Subsequent Workitem Code Sequence", '', 'RequestedSubsequentWorkitemCodeSequence'), 0x00404032: ('SQ', '1', "Non-DICOM Output Code Sequence", '', 'NonDICOMOutputCodeSequence'), 0x00404033: ('SQ', '1', "Output Information Sequence", '', 'OutputInformationSequence'), 0x00404034: ('SQ', '1', "Scheduled Human Performers Sequence", '', 'ScheduledHumanPerformersSequence'), 0x00404035: ('SQ', '1', "Actual Human Performers Sequence", '', 'ActualHumanPerformersSequence'), 0x00404036: ('LO', '1', "Human Performer's Organization", '', 'HumanPerformerOrganization'), 0x00404037: ('PN', '1', "Human Performer's Name", '', 'HumanPerformerName'), 0x00404040: ('CS', '1', "Raw Data Handling", '', 'RawDataHandling'), 0x00404041: ('CS', '1', "Input Readiness State", '', 'InputReadinessState'), 0x00404050: ('DT', '1', "Performed Procedure Step Start DateTime", '', 'PerformedProcedureStepStartDateTime'), 0x00404051: ('DT', '1', "Performed Procedure Step End DateTime", '', 'PerformedProcedureStepEndDateTime'), 0x00404052: ('DT', '1', "Procedure Step Cancellation DateTime", '', 'ProcedureStepCancellationDateTime'), 0x00408302: ('DS', '1', "Entrance Dose in mGy", '', 'EntranceDoseInmGy'), 0x00409094: ('SQ', '1', "Referenced Image Real World Value Mapping Sequence", '', 'ReferencedImageRealWorldValueMappingSequence'), 0x00409096: ('SQ', '1', "Real World Value Mapping Sequence", '', 'RealWorldValueMappingSequence'), 0x00409098: ('SQ', '1', "Pixel Value Mapping Code Sequence", '', 'PixelValueMappingCodeSequence'), 0x00409210: ('SH', '1', "LUT Label", '', 'LUTLabel'), 0x00409211: ('US or SS', '1', "Real World Value Last Value Mapped", '', 'RealWorldValueLastValueMapped'), 0x00409212: ('FD', '1-n', "Real World Value LUT Data", '', 'RealWorldValueLUTData'), 0x00409216: ('US or SS', '1', "Real World Value First Value Mapped", '', 'RealWorldValueFirstValueMapped'), 0x00409224: ('FD', '1', "Real World Value Intercept", '', 'RealWorldValueIntercept'), 0x00409225: ('FD', '1', "Real World Value Slope", '', 'RealWorldValueSlope'), 0x0040A007: ('CS', '1', "Findings Flag (Trial)", 'Retired', 'FindingsFlagTrial'), 0x0040A010: ('CS', '1', "Relationship Type", '', 'RelationshipType'), 0x0040A020: ('SQ', '1', "Findings Sequence (Trial)", 'Retired', 'FindingsSequenceTrial'), 0x0040A021: ('UI', '1', "Findings Group UID (Trial)", 'Retired', 'FindingsGroupUIDTrial'), 0x0040A022: ('UI', '1', "Referenced Findings Group UID (Trial)", 'Retired', 'ReferencedFindingsGroupUIDTrial'), 0x0040A023: ('DA', '1', "Findings Group Recording Date (Trial)", 'Retired', 'FindingsGroupRecordingDateTrial'), 0x0040A024: ('TM', '1', "Findings Group Recording Time (Trial)", 'Retired', 'FindingsGroupRecordingTimeTrial'), 0x0040A026: ('SQ', '1', "Findings Source Category Code Sequence (Trial)", 'Retired', 'FindingsSourceCategoryCodeSequenceTrial'), 0x0040A027: ('LO', '1', "Verifying Organization", '', 'VerifyingOrganization'), 0x0040A028: ('SQ', '1', "Documenting Organization Identifier Code Sequence (Trial)", 'Retired', 'DocumentingOrganizationIdentifierCodeSequenceTrial'), 0x0040A030: ('DT', '1', "Verification Date Time", '', 'VerificationDateTime'), 0x0040A032: ('DT', '1', "Observation Date Time", '', 'ObservationDateTime'), 0x0040A040: ('CS', '1', "Value Type", '', 'ValueType'), 0x0040A043: ('SQ', '1', "Concept Name Code Sequence", '', 'ConceptNameCodeSequence'), 0x0040A047: ('LO', '1', "Measurement Precision Description (Trial)", 'Retired', 'MeasurementPrecisionDescriptionTrial'), 0x0040A050: ('CS', '1', "Continuity Of Content", '', 'ContinuityOfContent'), 0x0040A057: ('CS', '1-n', "Urgency or Priority Alerts (Trial)", 'Retired', 'UrgencyOrPriorityAlertsTrial'), 0x0040A060: ('LO', '1', "Sequencing Indicator (Trial)", 'Retired', 'SequencingIndicatorTrial'), 0x0040A066: ('SQ', '1', "Document Identifier Code Sequence (Trial)", 'Retired', 'DocumentIdentifierCodeSequenceTrial'), 0x0040A067: ('PN', '1', "Document Author (Trial)", 'Retired', 'DocumentAuthorTrial'), 0x0040A068: ('SQ', '1', "Document Author Identifier Code Sequence (Trial)", 'Retired', 'DocumentAuthorIdentifierCodeSequenceTrial'), 0x0040A070: ('SQ', '1', "Identifier Code Sequence (Trial)", 'Retired', 'IdentifierCodeSequenceTrial'), 0x0040A073: ('SQ', '1', "Verifying Observer Sequence", '', 'VerifyingObserverSequence'), 0x0040A074: ('OB', '1', "Object Binary Identifier (Trial)", 'Retired', 'ObjectBinaryIdentifierTrial'), 0x0040A075: ('PN', '1', "Verifying Observer Name", '', 'VerifyingObserverName'), 0x0040A076: ('SQ', '1', "Documenting Observer Identifier Code Sequence (Trial)", 'Retired', 'DocumentingObserverIdentifierCodeSequenceTrial'), 0x0040A078: ('SQ', '1', "Author Observer Sequence", '', 'AuthorObserverSequence'), 0x0040A07A: ('SQ', '1', "Participant Sequence", '', 'ParticipantSequence'), 0x0040A07C: ('SQ', '1', "Custodial Organization Sequence", '', 'CustodialOrganizationSequence'), 0x0040A080: ('CS', '1', "Participation Type", '', 'ParticipationType'), 0x0040A082: ('DT', '1', "Participation DateTime", '', 'ParticipationDateTime'), 0x0040A084: ('CS', '1', "Observer Type", '', 'ObserverType'), 0x0040A085: ('SQ', '1', "Procedure Identifier Code Sequence (Trial)", 'Retired', 'ProcedureIdentifierCodeSequenceTrial'), 0x0040A088: ('SQ', '1', "Verifying Observer Identification Code Sequence", '', 'VerifyingObserverIdentificationCodeSequence'), 0x0040A089: ('OB', '1', "Object Directory Binary Identifier (Trial)", 'Retired', 'ObjectDirectoryBinaryIdentifierTrial'), 0x0040A090: ('SQ', '1', "Equivalent CDA Document Sequence", 'Retired', 'EquivalentCDADocumentSequence'), 0x0040A0B0: ('US', '2-2n', "Referenced Waveform Channels", '', 'ReferencedWaveformChannels'), 0x0040A110: ('DA', '1', "Date of Document or Verbal Transaction (Trial)", 'Retired', 'DateOfDocumentOrVerbalTransactionTrial'), 0x0040A112: ('TM', '1', "Time of Document Creation or Verbal Transaction (Trial)", 'Retired', 'TimeOfDocumentCreationOrVerbalTransactionTrial'), 0x0040A120: ('DT', '1', "DateTime", '', 'DateTime'), 0x0040A121: ('DA', '1', "Date", '', 'Date'), 0x0040A122: ('TM', '1', "Time", '', 'Time'), 0x0040A123: ('PN', '1', "Person Name", '', 'PersonName'), 0x0040A124: ('UI', '1', "UID", '', 'UID'), 0x0040A125: ('CS', '2', "Report Status ID (Trial)", 'Retired', 'ReportStatusIDTrial'), 0x0040A130: ('CS', '1', "Temporal Range Type", '', 'TemporalRangeType'), 0x0040A132: ('UL', '1-n', "Referenced Sample Positions", '', 'ReferencedSamplePositions'), 0x0040A136: ('US', '1-n', "Referenced Frame Numbers", '', 'ReferencedFrameNumbers'), 0x0040A138: ('DS', '1-n', "Referenced Time Offsets", '', 'ReferencedTimeOffsets'), 0x0040A13A: ('DT', '1-n', "Referenced DateTime", '', 'ReferencedDateTime'), 0x0040A160: ('UT', '1', "Text Value", '', 'TextValue'), 0x0040A167: ('SQ', '1', "Observation Category Code Sequence (Trial)", 'Retired', 'ObservationCategoryCodeSequenceTrial'), 0x0040A168: ('SQ', '1', "Concept Code Sequence", '', 'ConceptCodeSequence'), 0x0040A16A: ('ST', '1', "Bibliographic Citation (Trial)", 'Retired', 'BibliographicCitationTrial'), 0x0040A170: ('SQ', '1', "Purpose of Reference Code Sequence", '', 'PurposeOfReferenceCodeSequence'), 0x0040A171: ('UI', '1', "Observation UID (Trial)", 'Retired', 'ObservationUIDTrial'), 0x0040A172: ('UI', '1', "Referenced Observation UID (Trial)", 'Retired', 'ReferencedObservationUIDTrial'), 0x0040A173: ('CS', '1', "Referenced Observation Class (Trial)", 'Retired', 'ReferencedObservationClassTrial'), 0x0040A174: ('CS', '1', "Referenced Object Observation Class (Trial)", 'Retired', 'ReferencedObjectObservationClassTrial'), 0x0040A180: ('US', '1', "Annotation Group Number", '', 'AnnotationGroupNumber'), 0x0040A192: ('DA', '1', "Observation Date (Trial)", 'Retired', 'ObservationDateTrial'), 0x0040A193: ('TM', '1', "Observation Time (Trial)", 'Retired', 'ObservationTimeTrial'), 0x0040A194: ('CS', '1', "Measurement Automation (Trial)", 'Retired', 'MeasurementAutomationTrial'), 0x0040A195: ('SQ', '1', "Modifier Code Sequence", '', 'ModifierCodeSequence'), 0x0040A224: ('ST', '1', "Identification Description (Trial)", 'Retired', 'IdentificationDescriptionTrial'), 0x0040A290: ('CS', '1', "Coordinates Set Geometric Type (Trial)", 'Retired', 'CoordinatesSetGeometricTypeTrial'), 0x0040A296: ('SQ', '1', "Algorithm Code Sequence (Trial)", 'Retired', 'AlgorithmCodeSequenceTrial'), 0x0040A297: ('ST', '1', "Algorithm Description (Trial)", 'Retired', 'AlgorithmDescriptionTrial'), 0x0040A29A: ('SL', '2-2n', "Pixel Coordinates Set (Trial)", 'Retired', 'PixelCoordinatesSetTrial'), 0x0040A300: ('SQ', '1', "Measured Value Sequence", '', 'MeasuredValueSequence'), 0x0040A301: ('SQ', '1', "Numeric Value Qualifier Code Sequence", '', 'NumericValueQualifierCodeSequence'), 0x0040A307: ('PN', '1', "Current Observer (Trial)", 'Retired', 'CurrentObserverTrial'), 0x0040A30A: ('DS', '1-n', "Numeric Value", '', 'NumericValue'), 0x0040A313: ('SQ', '1', "Referenced Accession Sequence (Trial)", 'Retired', 'ReferencedAccessionSequenceTrial'), 0x0040A33A: ('ST', '1', "Report Status Comment (Trial)", 'Retired', 'ReportStatusCommentTrial'), 0x0040A340: ('SQ', '1', "Procedure Context Sequence (Trial)", 'Retired', 'ProcedureContextSequenceTrial'), 0x0040A352: ('PN', '1', "Verbal Source (Trial)", 'Retired', 'VerbalSourceTrial'), 0x0040A353: ('ST', '1', "Address (Trial)", 'Retired', 'AddressTrial'), 0x0040A354: ('LO', '1', "Telephone Number (Trial)", 'Retired', 'TelephoneNumberTrial'), 0x0040A358: ('SQ', '1', "Verbal Source Identifier Code Sequence (Trial)", 'Retired', 'VerbalSourceIdentifierCodeSequenceTrial'), 0x0040A360: ('SQ', '1', "Predecessor Documents Sequence", '', 'PredecessorDocumentsSequence'), 0x0040A370: ('SQ', '1', "Referenced Request Sequence", '', 'ReferencedRequestSequence'), 0x0040A372: ('SQ', '1', "Performed Procedure Code Sequence", '', 'PerformedProcedureCodeSequence'), 0x0040A375: ('SQ', '1', "Current Requested Procedure Evidence Sequence", '', 'CurrentRequestedProcedureEvidenceSequence'), 0x0040A380: ('SQ', '1', "Report Detail Sequence (Trial)", 'Retired', 'ReportDetailSequenceTrial'), 0x0040A385: ('SQ', '1', "Pertinent Other Evidence Sequence", '', 'PertinentOtherEvidenceSequence'), 0x0040A390: ('SQ', '1', "HL7 Structured Document Reference Sequence", '', 'HL7StructuredDocumentReferenceSequence'), 0x0040A402: ('UI', '1', "Observation Subject UID (Trial)", 'Retired', 'ObservationSubjectUIDTrial'), 0x0040A403: ('CS', '1', "Observation Subject Class (Trial)", 'Retired', 'ObservationSubjectClassTrial'), 0x0040A404: ('SQ', '1', "Observation Subject Type Code Sequence (Trial)", 'Retired', 'ObservationSubjectTypeCodeSequenceTrial'), 0x0040A491: ('CS', '1', "Completion Flag", '', 'CompletionFlag'), 0x0040A492: ('LO', '1', "Completion Flag Description", '', 'CompletionFlagDescription'), 0x0040A493: ('CS', '1', "Verification Flag", '', 'VerificationFlag'), 0x0040A494: ('CS', '1', "Archive Requested", '', 'ArchiveRequested'), 0x0040A496: ('CS', '1', "Preliminary Flag", '', 'PreliminaryFlag'), 0x0040A504: ('SQ', '1', "Content Template Sequence", '', 'ContentTemplateSequence'), 0x0040A525: ('SQ', '1', "Identical Documents Sequence", '', 'IdenticalDocumentsSequence'), 0x0040A600: ('CS', '1', "Observation Subject Context Flag (Trial)", 'Retired', 'ObservationSubjectContextFlagTrial'), 0x0040A601: ('CS', '1', "Observer Context Flag (Trial)", 'Retired', 'ObserverContextFlagTrial'), 0x0040A603: ('CS', '1', "Procedure Context Flag (Trial)", 'Retired', 'ProcedureContextFlagTrial'), 0x0040A730: ('SQ', '1', "Content Sequence", '', 'ContentSequence'), 0x0040A731: ('SQ', '1', "Relationship Sequence (Trial)", 'Retired', 'RelationshipSequenceTrial'), 0x0040A732: ('SQ', '1', "Relationship Type Code Sequence (Trial)", 'Retired', 'RelationshipTypeCodeSequenceTrial'), 0x0040A744: ('SQ', '1', "Language Code Sequence (Trial)", 'Retired', 'LanguageCodeSequenceTrial'), 0x0040A992: ('ST', '1', "Uniform Resource Locator (Trial)", 'Retired', 'UniformResourceLocatorTrial'), 0x0040B020: ('SQ', '1', "Waveform Annotation Sequence", '', 'WaveformAnnotationSequence'), 0x0040DB00: ('CS', '1', "Template Identifier", '', 'TemplateIdentifier'), 0x0040DB06: ('DT', '1', "Template Version", 'Retired', 'TemplateVersion'), 0x0040DB07: ('DT', '1', "Template Local Version", 'Retired', 'TemplateLocalVersion'), 0x0040DB0B: ('CS', '1', "Template Extension Flag", 'Retired', 'TemplateExtensionFlag'), 0x0040DB0C: ('UI', '1', "Template Extension Organization UID", 'Retired', 'TemplateExtensionOrganizationUID'), 0x0040DB0D: ('UI', '1', "Template Extension Creator UID", 'Retired', 'TemplateExtensionCreatorUID'), 0x0040DB73: ('UL', '1-n', "Referenced Content Item Identifier", '', 'ReferencedContentItemIdentifier'), 0x0040E001: ('ST', '1', "HL7 Instance Identifier", '', 'HL7InstanceIdentifier'), 0x0040E004: ('DT', '1', "HL7 Document Effective Time", '', 'HL7DocumentEffectiveTime'), 0x0040E006: ('SQ', '1', "HL7 Document Type Code Sequence", '', 'HL7DocumentTypeCodeSequence'), 0x0040E008: ('SQ', '1', "Document Class Code Sequence", '', 'DocumentClassCodeSequence'), 0x0040E010: ('UT', '1', "Retrieve URI", '', 'RetrieveURI'), 0x0040E011: ('UI', '1', "Retrieve Location UID", '', 'RetrieveLocationUID'), 0xE020: ('CS', '1', "Type of Instances", '', 'TypeOfInstances'), 0xE021: ('SQ', '1', "DICOM Retrieval Sequence", '', 'DICOMRetrievalSequence'), 0xE022: ('SQ', '1', "DICOM Media Retrieval Sequence", '', 'DICOMMediaRetrievalSequence'), 0xE023: ('SQ', '1', "WADO Retrieval Sequence", '', 'WADORetrievalSequence'), 0xE024: ('SQ', '1', "XDS Retrieval Sequence", '', 'XDSRetrievalSequence'), 0xE030: ('UI', '1', "Repository Unique ID", '', 'RepositoryUniqueID'), 0xE031: ('UI', '1', "Home Community ID", '', 'HomeCommunityID'), 0x00420010: ('ST', '1', "Document Title", '', 'DocumentTitle'), 0x00420011: ('OB', '1', "Encapsulated Document", '', 'EncapsulatedDocument'), 0x00420012: ('LO', '1', "MIME Type of Encapsulated Document", '', 'MIMETypeOfEncapsulatedDocument'), 0x00420013: ('SQ', '1', "Source Instance Sequence", '', 'SourceInstanceSequence'), 0x00420014: ('LO', '1-n', "List of MIME Types", '', 'ListOfMIMETypes'), 0x00440001: ('ST', '1', "Product Package Identifier", '', 'ProductPackageIdentifier'), 0x00440002: ('CS', '1', "Substance Administration Approval", '', 'SubstanceAdministrationApproval'), 0x00440003: ('LT', '1', "Approval Status Further Description", '', 'ApprovalStatusFurtherDescription'), 0x00440004: ('DT', '1', "Approval Status DateTime", '', 'ApprovalStatusDateTime'), 0x00440007: ('SQ', '1', "Product Type Code Sequence", '', 'ProductTypeCodeSequence'), 0x00440008: ('LO', '1-n', "Product Name", '', 'ProductName'), 0x00440009: ('LT', '1', "Product Description", '', 'ProductDescription'), 0x0044000A: ('LO', '1', "Product Lot Identifier", '', 'ProductLotIdentifier'), 0x0044000B: ('DT', '1', "Product Expiration DateTime", '', 'ProductExpirationDateTime'), 0x00440010: ('DT', '1', "Substance Administration DateTime", '', 'SubstanceAdministrationDateTime'), 0x00440011: ('LO', '1', "Substance Administration Notes", '', 'SubstanceAdministrationNotes'), 0x00440012: ('LO', '1', "Substance Administration Device ID", '', 'SubstanceAdministrationDeviceID'), 0x00440013: ('SQ', '1', "Product Parameter Sequence", '', 'ProductParameterSequence'), 0x00440019: ('SQ', '1', "Substance Administration Parameter Sequence", '', 'SubstanceAdministrationParameterSequence'), 0x00460012: ('LO', '1', "Lens Description", '', 'LensDescription'), 0x00460014: ('SQ', '1', "Right Lens Sequence", '', 'RightLensSequence'), 0x00460015: ('SQ', '1', "Left Lens Sequence", '', 'LeftLensSequence'), 0x00460016: ('SQ', '1', "Unspecified Laterality Lens Sequence", '', 'UnspecifiedLateralityLensSequence'), 0x00460018: ('SQ', '1', "Cylinder Sequence", '', 'CylinderSequence'), 0x00460028: ('SQ', '1', "Prism Sequence", '', 'PrismSequence'), 0x00460030: ('FD', '1', "Horizontal Prism Power", '', 'HorizontalPrismPower'), 0x00460032: ('CS', '1', "Horizontal Prism Base", '', 'HorizontalPrismBase'), 0x00460034: ('FD', '1', "Vertical Prism Power", '', 'VerticalPrismPower'), 0x00460036: ('CS', '1', "Vertical Prism Base", '', 'VerticalPrismBase'), 0x00460038: ('CS', '1', "Lens Segment Type", '', 'LensSegmentType'), 0x00460040: ('FD', '1', "Optical Transmittance", '', 'OpticalTransmittance'), 0x00460042: ('FD', '1', "Channel Width", '', 'ChannelWidth'), 0x00460044: ('FD', '1', "Pupil Size", '', 'PupilSize'), 0x00460046: ('FD', '1', "Corneal Size", '', 'CornealSize'), 0x00460050: ('SQ', '1', "Autorefraction Right Eye Sequence", '', 'AutorefractionRightEyeSequence'), 0x00460052: ('SQ', '1', "Autorefraction Left Eye Sequence", '', 'AutorefractionLeftEyeSequence'), 0x00460060: ('FD', '1', "Distance Pupillary Distance", '', 'DistancePupillaryDistance'), 0x00460062: ('FD', '1', "Near Pupillary Distance", '', 'NearPupillaryDistance'), 0x00460063: ('FD', '1', "Intermediate Pupillary Distance", '', 'IntermediatePupillaryDistance'), 0x00460064: ('FD', '1', "Other Pupillary Distance", '', 'OtherPupillaryDistance'), 0x00460070: ('SQ', '1', "Keratometry Right Eye Sequence", '', 'KeratometryRightEyeSequence'), 0x00460071: ('SQ', '1', "Keratometry Left Eye Sequence", '', 'KeratometryLeftEyeSequence'), 0x00460074: ('SQ', '1', "Steep Keratometric Axis Sequence", '', 'SteepKeratometricAxisSequence'), 0x00460075: ('FD', '1', "Radius of Curvature", '', 'RadiusOfCurvature'), 0x00460076: ('FD', '1', "Keratometric Power", '', 'KeratometricPower'), 0x00460077: ('FD', '1', "Keratometric Axis", '', 'KeratometricAxis'), 0x00460080: ('SQ', '1', "Flat Keratometric Axis Sequence", '', 'FlatKeratometricAxisSequence'), 0x00460092: ('CS', '1', "Background Color", '', 'BackgroundColor'), 0x00460094: ('CS', '1', "Optotype", '', 'Optotype'), 0x00460095: ('CS', '1', "Optotype Presentation", '', 'OptotypePresentation'), 0x00460097: ('SQ', '1', "Subjective Refraction Right Eye Sequence", '', 'SubjectiveRefractionRightEyeSequence'), 0x00460098: ('SQ', '1', "Subjective Refraction Left Eye Sequence", '', 'SubjectiveRefractionLeftEyeSequence'), 0x00460100: ('SQ', '1', "Add Near Sequence", '', 'AddNearSequence'), 0x00460101: ('SQ', '1', "Add Intermediate Sequence", '', 'AddIntermediateSequence'), 0x00460102: ('SQ', '1', "Add Other Sequence", '', 'AddOtherSequence'), 0x00460104: ('FD', '1', "Add Power", '', 'AddPower'), 0x00460106: ('FD', '1', "Viewing Distance", '', 'ViewingDistance'), 0x00460121: ('SQ', '1', "Visual Acuity Type Code Sequence", '', 'VisualAcuityTypeCodeSequence'), 0x00460122: ('SQ', '1', "Visual Acuity Right Eye Sequence", '', 'VisualAcuityRightEyeSequence'), 0x00460123: ('SQ', '1', "Visual Acuity Left Eye Sequence", '', 'VisualAcuityLeftEyeSequence'), 0x00460124: ('SQ', '1', "Visual Acuity Both Eyes Open Sequence", '', 'VisualAcuityBothEyesOpenSequence'), 0x00460125: ('CS', '1', "Viewing Distance Type", '', 'ViewingDistanceType'), 0x00460135: ('SS', '2', "Visual Acuity Modifiers", '', 'VisualAcuityModifiers'), 0x00460137: ('FD', '1', "Decimal Visual Acuity", '', 'DecimalVisualAcuity'), 0x00460139: ('LO', '1', "Optotype Detailed Definition", '', 'OptotypeDetailedDefinition'), 0x00460145: ('SQ', '1', "Referenced Refractive Measurements Sequence", '', 'ReferencedRefractiveMeasurementsSequence'), 0x00460146: ('FD', '1', "Sphere Power", '', 'SpherePower'), 0x00460147: ('FD', '1', "Cylinder Power", '', 'CylinderPower'), 0x00480001: ('FL', '1', "Imaged Volume Width", '', 'ImagedVolumeWidth'), 0x00480002: ('FL', '1', "Imaged Volume Height", '', 'ImagedVolumeHeight'), 0x00480003: ('FL', '1', "Imaged Volume Depth", '', 'ImagedVolumeDepth'), 0x00480006: ('UL', '1', "Total Pixel Matrix Columns", '', 'TotalPixelMatrixColumns'), 0x00480007: ('UL', '1', "Total Pixel Matrix Rows", '', 'TotalPixelMatrixRows'), 0x00480008: ('SQ', '1', "Total Pixel Matrix Origin Sequence", '', 'TotalPixelMatrixOriginSequence'), 0x00480010: ('CS', '1', "Specimen Label in Image", '', 'SpecimenLabelInImage'), 0x00480011: ('CS', '1', "Focus Method", '', 'FocusMethod'), 0x00480012: ('CS', '1', "Extended Depth of Field", '', 'ExtendedDepthOfField'), 0x00480013: ('US', '1', "Number of Focal Planes", '', 'NumberOfFocalPlanes'), 0x00480014: ('FL', '1', "Distance Between Focal Planes", '', 'DistanceBetweenFocalPlanes'), 0x00480015: ('US', '3', "Recommended Absent Pixel CIELab Value", '', 'RecommendedAbsentPixelCIELabValue'), 0x00480100: ('SQ', '1', "Illuminator Type Code Sequence", '', 'IlluminatorTypeCodeSequence'), 0x00480102: ('DS', '6', "Image Orientation (Slide)", '', 'ImageOrientationSlide'), 0x00480105: ('SQ', '1', "Optical Path Sequence", '', 'OpticalPathSequence'), 0x00480106: ('SH', '1', "Optical Path Identifier", '', 'OpticalPathIdentifier'), 0x00480107: ('ST', '1', "Optical Path Description", '', 'OpticalPathDescription'), 0x00480108: ('SQ', '1', "Illumination Color Code Sequence", '', 'IlluminationColorCodeSequence'), 0x00480110: ('SQ', '1', "Specimen Reference Sequence", '', 'SpecimenReferenceSequence'), 0x00480111: ('DS', '1', "Condenser Lens Power", '', 'CondenserLensPower'), 0x00480112: ('DS', '1', "Objective Lens Power", '', 'ObjectiveLensPower'), 0x00480113: ('DS', '1', "Objective Lens Numerical Aperture", '', 'ObjectiveLensNumericalAperture'), 0x00480120: ('SQ', '1', "Palette Color Lookup Table Sequence", '', 'PaletteColorLookupTableSequence'), 0x00480200: ('SQ', '1', "Referenced Image Navigation Sequence", '', 'ReferencedImageNavigationSequence'), 0x00480201: ('US', '2', "Top Left Hand Corner of Localizer Area", '', 'TopLeftHandCornerOfLocalizerArea'), 0x00480202: ('US', '2', "Bottom Right Hand Corner of Localizer Area", '', 'BottomRightHandCornerOfLocalizerArea'), 0x00480207: ('SQ', '1', "Optical Path Identification Sequence", '', 'OpticalPathIdentificationSequence'), 0x0048021A: ('SQ', '1', "Plane Position (Slide) Sequence", '', 'PlanePositionSlideSequence'), 0x0048021E: ('SL', '1', "Row Position In Total Image Pixel Matrix", '', 'RowPositionInTotalImagePixelMatrix'), 0x0048021F: ('SL', '1', "Column Position In Total Image Pixel Matrix", '', 'ColumnPositionInTotalImagePixelMatrix'), 0x00480301: ('CS', '1', "Pixel Origin Interpretation", '', 'PixelOriginInterpretation'), 0x00500004: ('CS', '1', "Calibration Image", '', 'CalibrationImage'), 0x00500010: ('SQ', '1', "Device Sequence", '', 'DeviceSequence'), 0x00500012: ('SQ', '1', "Container Component Type Code Sequence", '', 'ContainerComponentTypeCodeSequence'), 0x00500013: ('FD', '1', "Container Component Thickness", '', 'ContainerComponentThickness'), 0x00500014: ('DS', '1', "Device Length", '', 'DeviceLength'), 0x00500015: ('FD', '1', "Container Component Width", '', 'ContainerComponentWidth'), 0x00500016: ('DS', '1', "Device Diameter", '', 'DeviceDiameter'), 0x00500017: ('CS', '1', "Device Diameter Units", '', 'DeviceDiameterUnits'), 0x00500018: ('DS', '1', "Device Volume", '', 'DeviceVolume'), 0x00500019: ('DS', '1', "Inter-Marker Distance", '', 'InterMarkerDistance'), 0x0050001A: ('CS', '1', "Container Component Material", '', 'ContainerComponentMaterial'), 0x0050001B: ('LO', '1', "Container Component ID", '', 'ContainerComponentID'), 0x0050001C: ('FD', '1', "Container Component Length", '', 'ContainerComponentLength'), 0x0050001D: ('FD', '1', "Container Component Diameter", '', 'ContainerComponentDiameter'), 0x0050001E: ('LO', '1', "Container Component Description", '', 'ContainerComponentDescription'), 0x00500020: ('LO', '1', "Device Description", '', 'DeviceDescription'), 0x00520001: ('FL', '1', "Contrast/Bolus Ingredient Percent by Volume", '', 'ContrastBolusIngredientPercentByVolume'), 0x00520002: ('FD', '1', "OCT Focal Distance", '', 'OCTFocalDistance'), 0x00520003: ('FD', '1', "Beam Spot Size", '', 'BeamSpotSize'), 0x00520004: ('FD', '1', "Effective Refractive Index", '', 'EffectiveRefractiveIndex'), 0x00520006: ('CS', '1', "OCT Acquisition Domain", '', 'OCTAcquisitionDomain'), 0x00520007: ('FD', '1', "OCT Optical Center Wavelength", '', 'OCTOpticalCenterWavelength'), 0x00520008: ('FD', '1', "Axial Resolution", '', 'AxialResolution'), 0x00520009: ('FD', '1', "Ranging Depth", '', 'RangingDepth'), 0x00520011: ('FD', '1', "A-line Rate", '', 'ALineRate'), 0x00520012: ('US', '1', "A-lines Per Frame", '', 'ALinesPerFrame'), 0x00520013: ('FD', '1', "Catheter Rotational Rate", '', 'CatheterRotationalRate'), 0x00520014: ('FD', '1', "A-line Pixel Spacing", '', 'ALinePixelSpacing'), 0x00520016: ('SQ', '1', "Mode of Percutaneous Access Sequence", '', 'ModeOfPercutaneousAccessSequence'), 0x00520025: ('SQ', '1', "Intravascular OCT Frame Type Sequence", '', 'IntravascularOCTFrameTypeSequence'), 0x00520026: ('CS', '1', "OCT Z Offset Applied", '', 'OCTZOffsetApplied'), 0x00520027: ('SQ', '1', "Intravascular Frame Content Sequence", '', 'IntravascularFrameContentSequence'), 0x00520028: ('FD', '1', "Intravascular Longitudinal Distance", '', 'IntravascularLongitudinalDistance'), 0x00520029: ('SQ', '1', "Intravascular OCT Frame Content Sequence", '', 'IntravascularOCTFrameContentSequence'), 0x00520030: ('SS', '1', "OCT Z Offset Correction", '', 'OCTZOffsetCorrection'), 0x00520031: ('CS', '1', "Catheter Direction of Rotation", '', 'CatheterDirectionOfRotation'), 0x00520033: ('FD', '1', "Seam Line Location", '', 'SeamLineLocation'), 0x00520034: ('FD', '1', "First A-line Location", '', 'FirstALineLocation'), 0x00520036: ('US', '1', "Seam Line Index", '', 'SeamLineIndex'), 0x00520038: ('US', '1', "Number of Padded A-lines", '', 'NumberOfPaddedAlines'), 0x00520039: ('CS', '1', "Interpolation Type", '', 'InterpolationType'), 0x0052003A: ('CS', '1', "Refractive Index Applied", '', 'RefractiveIndexApplied'), 0x00540010: ('US', '1-n', "Energy Window Vector", '', 'EnergyWindowVector'), 0x00540011: ('US', '1', "Number of Energy Windows", '', 'NumberOfEnergyWindows'), 0x00540012: ('SQ', '1', "Energy Window Information Sequence", '', 'EnergyWindowInformationSequence'), 0x00540013: ('SQ', '1', "Energy Window Range Sequence", '', 'EnergyWindowRangeSequence'), 0x00540014: ('DS', '1', "Energy Window Lower Limit", '', 'EnergyWindowLowerLimit'), 0x00540015: ('DS', '1', "Energy Window Upper Limit", '', 'EnergyWindowUpperLimit'), 0x00540016: ('SQ', '1', "Radiopharmaceutical Information Sequence", '', 'RadiopharmaceuticalInformationSequence'), 0x00540017: ('IS', '1', "Residual Syringe Counts", '', 'ResidualSyringeCounts'), 0x00540018: ('SH', '1', "Energy Window Name", '', 'EnergyWindowName'), 0x00540020: ('US', '1-n', "Detector Vector", '', 'DetectorVector'), 0x00540021: ('US', '1', "Number of Detectors", '', 'NumberOfDetectors'), 0x00540022: ('SQ', '1', "Detector Information Sequence", '', 'DetectorInformationSequence'), 0x00540030: ('US', '1-n', "Phase Vector", '', 'PhaseVector'), 0x00540031: ('US', '1', "Number of Phases", '', 'NumberOfPhases'), 0x00540032: ('SQ', '1', "Phase Information Sequence", '', 'PhaseInformationSequence'), 0x00540033: ('US', '1', "Number of Frames in Phase", '', 'NumberOfFramesInPhase'), 0x00540036: ('IS', '1', "Phase Delay", '', 'PhaseDelay'), 0x00540038: ('IS', '1', "Pause Between Frames", '', 'PauseBetweenFrames'), 0x00540039: ('CS', '1', "Phase Description", '', 'PhaseDescription'), 0x00540050: ('US', '1-n', "Rotation Vector", '', 'RotationVector'), 0x00540051: ('US', '1', "Number of Rotations", '', 'NumberOfRotations'), 0x00540052: ('SQ', '1', "Rotation Information Sequence", '', 'RotationInformationSequence'), 0x00540053: ('US', '1', "Number of Frames in Rotation", '', 'NumberOfFramesInRotation'), 0x00540060: ('US', '1-n', "R-R Interval Vector", '', 'RRIntervalVector'), 0x00540061: ('US', '1', "Number of R-R Intervals", '', 'NumberOfRRIntervals'), 0x00540062: ('SQ', '1', "Gated Information Sequence", '', 'GatedInformationSequence'), 0x00540063: ('SQ', '1', "Data Information Sequence", '', 'DataInformationSequence'), 0x00540070: ('US', '1-n', "Time Slot Vector", '', 'TimeSlotVector'), 0x00540071: ('US', '1', "Number of Time Slots", '', 'NumberOfTimeSlots'), 0x00540072: ('SQ', '1', "Time Slot Information Sequence", '', 'TimeSlotInformationSequence'), 0x00540073: ('DS', '1', "Time Slot Time", '', 'TimeSlotTime'), 0x00540080: ('US', '1-n', "Slice Vector", '', 'SliceVector'), 0x00540081: ('US', '1', "Number of Slices", '', 'NumberOfSlices'), 0x00540090: ('US', '1-n', "Angular View Vector", '', 'AngularViewVector'), 0x00540100: ('US', '1-n', "Time Slice Vector", '', 'TimeSliceVector'), 0x00540101: ('US', '1', "Number of Time Slices", '', 'NumberOfTimeSlices'), 0x00540200: ('DS', '1', "Start Angle", '', 'StartAngle'), 0x00540202: ('CS', '1', "Type of Detector Motion", '', 'TypeOfDetectorMotion'), 0x00540210: ('IS', '1-n', "Trigger Vector", '', 'TriggerVector'), 0x00540211: ('US', '1', "Number of Triggers in Phase", '', 'NumberOfTriggersInPhase'), 0x00540220: ('SQ', '1', "View Code Sequence", '', 'ViewCodeSequence'), 0x00540222: ('SQ', '1', "View Modifier Code Sequence", '', 'ViewModifierCodeSequence'), 0x00540300: ('SQ', '1', "Radionuclide Code Sequence", '', 'RadionuclideCodeSequence'), 0x00540302: ('SQ', '1', "Administration Route Code Sequence", '', 'AdministrationRouteCodeSequence'), 0x00540304: ('SQ', '1', "Radiopharmaceutical Code Sequence", '', 'RadiopharmaceuticalCodeSequence'), 0x00540306: ('SQ', '1', "Calibration Data Sequence", '', 'CalibrationDataSequence'), 0x00540308: ('US', '1', "Energy Window Number", '', 'EnergyWindowNumber'), 0x00540400: ('SH', '1', "Image ID", '', 'ImageID'), 0x00540410: ('SQ', '1', "Patient Orientation Code Sequence", '', 'PatientOrientationCodeSequence'), 0x00540412: ('SQ', '1', "Patient Orientation Modifier Code Sequence", '', 'PatientOrientationModifierCodeSequence'), 0x00540414: ('SQ', '1', "Patient Gantry Relationship Code Sequence", '', 'PatientGantryRelationshipCodeSequence'), 0x00540500: ('CS', '1', "Slice Progression Direction", '', 'SliceProgressionDirection'), 0x00541000: ('CS', '2', "Series Type", '', 'SeriesType'), 0x00541001: ('CS', '1', "Units", '', 'Units'), 0x00541002: ('CS', '1', "Counts Source", '', 'CountsSource'), 0x00541004: ('CS', '1', "Reprojection Method", '', 'ReprojectionMethod'), 0x00541006: ('CS', '1', "SUV Type", '', 'SUVType'), 0x00541100: ('CS', '1', "Randoms Correction Method", '', 'RandomsCorrectionMethod'), 0x00541101: ('LO', '1', "Attenuation Correction Method", '', 'AttenuationCorrectionMethod'), 0x00541102: ('CS', '1', "Decay Correction", '', 'DecayCorrection'), 0x00541103: ('LO', '1', "Reconstruction Method", '', 'ReconstructionMethod'), 0x00541104: ('LO', '1', "Detector Lines of Response Used", '', 'DetectorLinesOfResponseUsed'), 0x00541105: ('LO', '1', "Scatter Correction Method", '', 'ScatterCorrectionMethod'), 0x00541200: ('DS', '1', "Axial Acceptance", '', 'AxialAcceptance'), 0x00541201: ('IS', '2', "Axial Mash", '', 'AxialMash'), 0x00541202: ('IS', '1', "Transverse Mash", '', 'TransverseMash'), 0x00541203: ('DS', '2', "Detector Element Size", '', 'DetectorElementSize'), 0x00541210: ('DS', '1', "Coincidence Window Width", '', 'CoincidenceWindowWidth'), 0x00541220: ('CS', '1-n', "Secondary Counts Type", '', 'SecondaryCountsType'), 0x00541300: ('DS', '1', "Frame Reference Time", '', 'FrameReferenceTime'), 0x00541310: ('IS', '1', "Primary (Prompts) Counts Accumulated", '', 'PrimaryPromptsCountsAccumulated'), 0x00541311: ('IS', '1-n', "Secondary Counts Accumulated", '', 'SecondaryCountsAccumulated'), 0x00541320: ('DS', '1', "Slice Sensitivity Factor", '', 'SliceSensitivityFactor'), 0x00541321: ('DS', '1', "Decay Factor", '', 'DecayFactor'), 0x00541322: ('DS', '1', "Dose Calibration Factor", '', 'DoseCalibrationFactor'), 0x00541323: ('DS', '1', "Scatter Fraction Factor", '', 'ScatterFractionFactor'), 0x00541324: ('DS', '1', "Dead Time Factor", '', 'DeadTimeFactor'), 0x00541330: ('US', '1', "Image Index", '', 'ImageIndex'), 0x00541400: ('CS', '1-n', "Counts Included", 'Retired', 'CountsIncluded'), 0x00541401: ('CS', '1', "Dead Time Correction Flag", 'Retired', 'DeadTimeCorrectionFlag'), 0x00603000: ('SQ', '1', "Histogram Sequence", '', 'HistogramSequence'), 0x00603002: ('US', '1', "Histogram Number of Bins", '', 'HistogramNumberOfBins'), 0x00603004: ('US or SS', '1', "Histogram First Bin Value", '', 'HistogramFirstBinValue'), 0x00603006: ('US or SS', '1', "Histogram Last Bin Value", '', 'HistogramLastBinValue'), 0x00603008: ('US', '1', "Histogram Bin Width", '', 'HistogramBinWidth'), 0x00603010: ('LO', '1', "Histogram Explanation", '', 'HistogramExplanation'), 0x00603020: ('UL', '1-n', "Histogram Data", '', 'HistogramData'), 0x00620001: ('CS', '1', "Segmentation Type", '', 'SegmentationType'), 0x00620002: ('SQ', '1', "Segment Sequence", '', 'SegmentSequence'), 0x00620003: ('SQ', '1', "Segmented Property Category Code Sequence", '', 'SegmentedPropertyCategoryCodeSequence'), 0x00620004: ('US', '1', "Segment Number", '', 'SegmentNumber'), 0x00620005: ('LO', '1', "Segment Label", '', 'SegmentLabel'), 0x00620006: ('ST', '1', "Segment Description", '', 'SegmentDescription'), 0x00620008: ('CS', '1', "Segment Algorithm Type", '', 'SegmentAlgorithmType'), 0x00620009: ('LO', '1', "Segment Algorithm Name", '', 'SegmentAlgorithmName'), 0x0062000A: ('SQ', '1', "Segment Identification Sequence", '', 'SegmentIdentificationSequence'), 0x0062000B: ('US', '1-n', "Referenced Segment Number", '', 'ReferencedSegmentNumber'), 0x0062000C: ('US', '1', "Recommended Display Grayscale Value", '', 'RecommendedDisplayGrayscaleValue'), 0x0062000D: ('US', '3', "Recommended Display CIELab Value", '', 'RecommendedDisplayCIELabValue'), 0x0062000E: ('US', '1', "Maximum Fractional Value", '', 'MaximumFractionalValue'), 0x0062000F: ('SQ', '1', "Segmented Property Type Code Sequence", '', 'SegmentedPropertyTypeCodeSequence'), 0x00620010: ('CS', '1', "Segmentation Fractional Type", '', 'SegmentationFractionalType'), 0x00640002: ('SQ', '1', "Deformable Registration Sequence", '', 'DeformableRegistrationSequence'), 0x00640003: ('UI', '1', "Source Frame of Reference UID", '', 'SourceFrameOfReferenceUID'), 0x00640005: ('SQ', '1', "Deformable Registration Grid Sequence", '', 'DeformableRegistrationGridSequence'), 0x00640007: ('UL', '3', "Grid Dimensions", '', 'GridDimensions'), 0x00640008: ('FD', '3', "Grid Resolution", '', 'GridResolution'), 0x00640009: ('OF', '1', "Vector Grid Data", '', 'VectorGridData'), 0x0064000F: ('SQ', '1', "Pre Deformation Matrix Registration Sequence", '', 'PreDeformationMatrixRegistrationSequence'), 0x00640010: ('SQ', '1', "Post Deformation Matrix Registration Sequence", '', 'PostDeformationMatrixRegistrationSequence'), 0x00660001: ('UL', '1', "Number of Surfaces", '', 'NumberOfSurfaces'), 0x00660002: ('SQ', '1', "Surface Sequence", '', 'SurfaceSequence'), 0x00660003: ('UL', '1', "Surface Number", '', 'SurfaceNumber'), 0x00660004: ('LT', '1', "Surface Comments", '', 'SurfaceComments'), 0x00660009: ('CS', '1', "Surface Processing", '', 'SurfaceProcessing'), 0x0066000A: ('FL', '1', "Surface Processing Ratio", '', 'SurfaceProcessingRatio'), 0x0066000B: ('LO', '1', "Surface Processing Description", '', 'SurfaceProcessingDescription'), 0x0066000C: ('FL', '1', "Recommended Presentation Opacity", '', 'RecommendedPresentationOpacity'), 0x0066000D: ('CS', '1', "Recommended Presentation Type", '', 'RecommendedPresentationType'), 0x0066000E: ('CS', '1', "Finite Volume", '', 'FiniteVolume'), 0x00660010: ('CS', '1', "Manifold", '', 'Manifold'), 0x00660011: ('SQ', '1', "Surface Points Sequence", '', 'SurfacePointsSequence'), 0x00660012: ('SQ', '1', "Surface Points Normals Sequence", '', 'SurfacePointsNormalsSequence'), 0x00660013: ('SQ', '1', "Surface Mesh Primitives Sequence", '', 'SurfaceMeshPrimitivesSequence'), 0x00660015: ('UL', '1', "Number of Surface Points", '', 'NumberOfSurfacePoints'), 0x00660016: ('OF', '1', "Point Coordinates Data", '', 'PointCoordinatesData'), 0x00660017: ('FL', '3', "Point Position Accuracy", '', 'PointPositionAccuracy'), 0x00660018: ('FL', '1', "Mean Point Distance", '', 'MeanPointDistance'), 0x00660019: ('FL', '1', "Maximum Point Distance", '', 'MaximumPointDistance'), 0x0066001A: ('FL', '6', "Points Bounding Box Coordinates", '', 'PointsBoundingBoxCoordinates'), 0x0066001B: ('FL', '3', "Axis of Rotation", '', 'AxisOfRotation'), 0x0066001C: ('FL', '3', "Center of Rotation", '', 'CenterOfRotation'), 0x0066001E: ('UL', '1', "Number of Vectors", '', 'NumberOfVectors'), 0x0066001F: ('US', '1', "Vector Dimensionality", '', 'VectorDimensionality'), 0x00660020: ('FL', '1-n', "Vector Accuracy", '', 'VectorAccuracy'), 0x00660021: ('OF', '1', "Vector Coordinate Data", '', 'VectorCoordinateData'), 0x00660023: ('OW', '1', "Triangle Point Index List", '', 'TrianglePointIndexList'), 0x00660024: ('OW', '1', "Edge Point Index List", '', 'EdgePointIndexList'), 0x00660025: ('OW', '1', "Vertex Point Index List", '', 'VertexPointIndexList'), 0x00660026: ('SQ', '1', "Triangle Strip Sequence", '', 'TriangleStripSequence'), 0x00660027: ('SQ', '1', "Triangle Fan Sequence", '', 'TriangleFanSequence'), 0x00660028: ('SQ', '1', "Line Sequence", '', 'LineSequence'), 0x00660029: ('OW', '1', "Primitive Point Index List", '', 'PrimitivePointIndexList'), 0x0066002A: ('UL', '1', "Surface Count", '', 'SurfaceCount'), 0x0066002B: ('SQ', '1', "Referenced Surface Sequence", '', 'ReferencedSurfaceSequence'), 0x0066002C: ('UL', '1', "Referenced Surface Number", '', 'ReferencedSurfaceNumber'), 0x0066002D: ('SQ', '1', "Segment Surface Generation Algorithm Identification Sequence", '', 'SegmentSurfaceGenerationAlgorithmIdentificationSequence'), 0x0066002E: ('SQ', '1', "Segment Surface Source Instance Sequence", '', 'SegmentSurfaceSourceInstanceSequence'), 0x0066002F: ('SQ', '1', "Algorithm Family Code Sequence", '', 'AlgorithmFamilyCodeSequence'), 0x00660030: ('SQ', '1', "Algorithm Name Code Sequence", '', 'AlgorithmNameCodeSequence'), 0x00660031: ('LO', '1', "Algorithm Version", '', 'AlgorithmVersion'), 0x00660032: ('LT', '1', "Algorithm Parameters", '', 'AlgorithmParameters'), 0x00660034: ('SQ', '1', "Facet Sequence", '', 'FacetSequence'), 0x00660035: ('SQ', '1', "Surface Processing Algorithm Identification Sequence", '', 'SurfaceProcessingAlgorithmIdentificationSequence'), 0x00660036: ('LO', '1', "Algorithm Name", '', 'AlgorithmName'), 0x00686210: ('LO', '1', "Implant Size", '', 'ImplantSize'), 0x00686221: ('LO', '1', "Implant Template Version", '', 'ImplantTemplateVersion'), 0x00686222: ('SQ', '1', "Replaced Implant Template Sequence", '', 'ReplacedImplantTemplateSequence'), 0x00686223: ('CS', '1', "Implant Type", '', 'ImplantType'), 0x00686224: ('SQ', '1', "Derivation Implant Template Sequence", '', 'DerivationImplantTemplateSequence'), 0x00686225: ('SQ', '1', "Original Implant Template Sequence", '', 'OriginalImplantTemplateSequence'), 0x00686226: ('DT', '1', "Effective DateTime", '', 'EffectiveDateTime'), 0x00686230: ('SQ', '1', "Implant Target Anatomy Sequence", '', 'ImplantTargetAnatomySequence'), 0x00686260: ('SQ', '1', "Information From Manufacturer Sequence", '', 'InformationFromManufacturerSequence'), 0x00686265: ('SQ', '1', "Notification From Manufacturer Sequence", '', 'NotificationFromManufacturerSequence'), 0x00686270: ('DT', '1', "Information Issue DateTime", '', 'InformationIssueDateTime'), 0x00686280: ('ST', '1', "Information Summary", '', 'InformationSummary'), 0x006862A0: ('SQ', '1', "Implant Regulatory Disapproval Code Sequence", '', 'ImplantRegulatoryDisapprovalCodeSequence'), 0x006862A5: ('FD', '1', "Overall Template Spatial Tolerance", '', 'OverallTemplateSpatialTolerance'), 0x006862C0: ('SQ', '1', "HPGL Document Sequence", '', 'HPGLDocumentSequence'), 0x006862D0: ('US', '1', "HPGL Document ID", '', 'HPGLDocumentID'), 0x006862D5: ('LO', '1', "HPGL Document Label", '', 'HPGLDocumentLabel'), 0x006862E0: ('SQ', '1', "View Orientation Code Sequence", '', 'ViewOrientationCodeSequence'), 0x006862F0: ('FD', '9', "View Orientation Modifier", '', 'ViewOrientationModifier'), 0x006862F2: ('FD', '1', "HPGL Document Scaling", '', 'HPGLDocumentScaling'), 0x00686300: ('OB', '1', "HPGL Document", '', 'HPGLDocument'), 0x00686310: ('US', '1', "HPGL Contour Pen Number", '', 'HPGLContourPenNumber'), 0x00686320: ('SQ', '1', "HPGL Pen Sequence", '', 'HPGLPenSequence'), 0x00686330: ('US', '1', "HPGL Pen Number", '', 'HPGLPenNumber'), 0x00686340: ('LO', '1', "HPGL Pen Label", '', 'HPGLPenLabel'), 0x00686345: ('ST', '1', "HPGL Pen Description", '', 'HPGLPenDescription'), 0x00686346: ('FD', '2', "Recommended Rotation Point", '', 'RecommendedRotationPoint'), 0x00686347: ('FD', '4', "Bounding Rectangle", '', 'BoundingRectangle'), 0x00686350: ('US', '1-n', "Implant Template 3D Model Surface Number", '', 'ImplantTemplate3DModelSurfaceNumber'), 0x00686360: ('SQ', '1', "Surface Model Description Sequence", '', 'SurfaceModelDescriptionSequence'), 0x00686380: ('LO', '1', "Surface Model Label", '', 'SurfaceModelLabel'), 0x00686390: ('FD', '1', "Surface Model Scaling Factor", '', 'SurfaceModelScalingFactor'), 0x006863A0: ('SQ', '1', "Materials Code Sequence", '', 'MaterialsCodeSequence'), 0x006863A4: ('SQ', '1', "Coating Materials Code Sequence", '', 'CoatingMaterialsCodeSequence'), 0x006863A8: ('SQ', '1', "Implant Type Code Sequence", '', 'ImplantTypeCodeSequence'), 0x006863AC: ('SQ', '1', "Fixation Method Code Sequence", '', 'FixationMethodCodeSequence'), 0x006863B0: ('SQ', '1', "Mating Feature Sets Sequence", '', 'MatingFeatureSetsSequence'), 0x006863C0: ('US', '1', "Mating Feature Set ID", '', 'MatingFeatureSetID'), 0x006863D0: ('LO', '1', "Mating Feature Set Label", '', 'MatingFeatureSetLabel'), 0x006863E0: ('SQ', '1', "Mating Feature Sequence", '', 'MatingFeatureSequence'), 0x006863F0: ('US', '1', "Mating Feature ID", '', 'MatingFeatureID'), 0x00686400: ('SQ', '1', "Mating Feature Degree of Freedom Sequence", '', 'MatingFeatureDegreeOfFreedomSequence'), 0x00686410: ('US', '1', "Degree of Freedom ID", '', 'DegreeOfFreedomID'), 0x00686420: ('CS', '1', "Degree of Freedom Type", '', 'DegreeOfFreedomType'), 0x00686430: ('SQ', '1', "2D Mating Feature Coordinates Sequence", '', 'TwoDMatingFeatureCoordinatesSequence'), 0x00686440: ('US', '1', "Referenced HPGL Document ID", '', 'ReferencedHPGLDocumentID'), 0x00686450: ('FD', '2', "2D Mating Point", '', 'TwoDMatingPoint'), 0x00686460: ('FD', '4', "2D Mating Axes", '', 'TwoDMatingAxes'), 0x00686470: ('SQ', '1', "2D Degree of Freedom Sequence", '', 'TwoDDegreeOfFreedomSequence'), 0x00686490: ('FD', '3', "3D Degree of Freedom Axis", '', 'ThreeDDegreeOfFreedomAxis'), 0x006864A0: ('FD', '2', "Range of Freedom", '', 'RangeOfFreedom'), 0x006864C0: ('FD', '3', "3D Mating Point", '', 'ThreeDMatingPoint'), 0x006864D0: ('FD', '9', "3D Mating Axes", '', 'ThreeDMatingAxes'), 0x006864F0: ('FD', '3', "2D Degree of Freedom Axis", '', 'TwoDDegreeOfFreedomAxis'), 0x00686500: ('SQ', '1', "Planning Landmark Point Sequence", '', 'PlanningLandmarkPointSequence'), 0x00686510: ('SQ', '1', "Planning Landmark Line Sequence", '', 'PlanningLandmarkLineSequence'), 0x00686520: ('SQ', '1', "Planning Landmark Plane Sequence", '', 'PlanningLandmarkPlaneSequence'), 0x00686530: ('US', '1', "Planning Landmark ID", '', 'PlanningLandmarkID'), 0x00686540: ('LO', '1', "Planning Landmark Description", '', 'PlanningLandmarkDescription'), 0x00686545: ('SQ', '1', "Planning Landmark Identification Code Sequence", '', 'PlanningLandmarkIdentificationCodeSequence'), 0x00686550: ('SQ', '1', "2D Point Coordinates Sequence", '', 'TwoDPointCoordinatesSequence'), 0x00686560: ('FD', '2', "2D Point Coordinates", '', 'TwoDPointCoordinates'), 0x00686590: ('FD', '3', "3D Point Coordinates", '', 'ThreeDPointCoordinates'), 0x006865A0: ('SQ', '1', "2D Line Coordinates Sequence", '', 'TwoDLineCoordinatesSequence'), 0x006865B0: ('FD', '4', "2D Line Coordinates", '', 'TwoDLineCoordinates'), 0x006865D0: ('FD', '6', "3D Line Coordinates", '', 'ThreeDLineCoordinates'), 0x006865E0: ('SQ', '1', "2D Plane Coordinates Sequence", '', 'TwoDPlaneCoordinatesSequence'), 0x006865F0: ('FD', '4', "2D Plane Intersection", '', 'TwoDPlaneIntersection'), 0x00686610: ('FD', '3', "3D Plane Origin", '', 'ThreeDPlaneOrigin'), 0x00686620: ('FD', '3', "3D Plane Normal", '', 'ThreeDPlaneNormal'), 0x00700001: ('SQ', '1', "Graphic Annotation Sequence", '', 'GraphicAnnotationSequence'), 0x00700002: ('CS', '1', "Graphic Layer", '', 'GraphicLayer'), 0x00700003: ('CS', '1', "Bounding Box Annotation Units", '', 'BoundingBoxAnnotationUnits'), 0x00700004: ('CS', '1', "Anchor Point Annotation Units", '', 'AnchorPointAnnotationUnits'), 0x00700005: ('CS', '1', "Graphic Annotation Units", '', 'GraphicAnnotationUnits'), 0x00700006: ('ST', '1', "Unformatted Text Value", '', 'UnformattedTextValue'), 0x00700008: ('SQ', '1', "Text Object Sequence", '', 'TextObjectSequence'), 0x00700009: ('SQ', '1', "Graphic Object Sequence", '', 'GraphicObjectSequence'), 0x00700010: ('FL', '2', "Bounding Box Top Left Hand Corner", '', 'BoundingBoxTopLeftHandCorner'), 0x00700011: ('FL', '2', "Bounding Box Bottom Right Hand Corner", '', 'BoundingBoxBottomRightHandCorner'), 0x00700012: ('CS', '1', "Bounding Box Text Horizontal Justification", '', 'BoundingBoxTextHorizontalJustification'), 0x00700014: ('FL', '2', "Anchor Point", '', 'AnchorPoint'), 0x00700015: ('CS', '1', "Anchor Point Visibility", '', 'AnchorPointVisibility'), 0x00700020: ('US', '1', "Graphic Dimensions", '', 'GraphicDimensions'), 0x00700021: ('US', '1', "Number of Graphic Points", '', 'NumberOfGraphicPoints'), 0x00700022: ('FL', '2-n', "Graphic Data", '', 'GraphicData'), 0x00700023: ('CS', '1', "Graphic Type", '', 'GraphicType'), 0x00700024: ('CS', '1', "Graphic Filled", '', 'GraphicFilled'), 0x00700040: ('IS', '1', "Image Rotation (Retired)", 'Retired', 'ImageRotationRetired'), 0x00700041: ('CS', '1', "Image Horizontal Flip", '', 'ImageHorizontalFlip'), 0x00700042: ('US', '1', "Image Rotation", '', 'ImageRotation'), 0x00700050: ('US', '2', "Displayed Area Top Left Hand Corner (Trial)", 'Retired', 'DisplayedAreaTopLeftHandCornerTrial'), 0x00700051: ('US', '2', "Displayed Area Bottom Right Hand Corner (Trial)", 'Retired', 'DisplayedAreaBottomRightHandCornerTrial'), 0x00700052: ('SL', '2', "Displayed Area Top Left Hand Corner", '', 'DisplayedAreaTopLeftHandCorner'), 0x00700053: ('SL', '2', "Displayed Area Bottom Right Hand Corner", '', 'DisplayedAreaBottomRightHandCorner'), 0x0070005A: ('SQ', '1', "Displayed Area Selection Sequence", '', 'DisplayedAreaSelectionSequence'), 0x00700060: ('SQ', '1', "Graphic Layer Sequence", '', 'GraphicLayerSequence'), 0x00700062: ('IS', '1', "Graphic Layer Order", '', 'GraphicLayerOrder'), 0x00700066: ('US', '1', "Graphic Layer Recommended Display Grayscale Value", '', 'GraphicLayerRecommendedDisplayGrayscaleValue'), 0x00700067: ('US', '3', "Graphic Layer Recommended Display RGB Value", 'Retired', 'GraphicLayerRecommendedDisplayRGBValue'), 0x00700068: ('LO', '1', "Graphic Layer Description", '', 'GraphicLayerDescription'), 0x00700080: ('CS', '1', "Content Label", '', 'ContentLabel'), 0x00700081: ('LO', '1', "Content Description", '', 'ContentDescription'), 0x00700082: ('DA', '1', "Presentation Creation Date", '', 'PresentationCreationDate'), 0x00700083: ('TM', '1', "Presentation Creation Time", '', 'PresentationCreationTime'), 0x00700084: ('PN', '1', "Content Creator's Name", '', 'ContentCreatorName'), 0x00700086: ('SQ', '1', "Content Creator's Identification Code Sequence", '', 'ContentCreatorIdentificationCodeSequence'), 0x00700087: ('SQ', '1', "Alternate Content Description Sequence", '', 'AlternateContentDescriptionSequence'), 0x00700100: ('CS', '1', "Presentation Size Mode", '', 'PresentationSizeMode'), 0x00700101: ('DS', '2', "Presentation Pixel Spacing", '', 'PresentationPixelSpacing'), 0x00700102: ('IS', '2', "Presentation Pixel Aspect Ratio", '', 'PresentationPixelAspectRatio'), 0x00700103: ('FL', '1', "Presentation Pixel Magnification Ratio", '', 'PresentationPixelMagnificationRatio'), 0x00700207: ('LO', '1', "Graphic Group Label", '', 'GraphicGroupLabel'), 0x00700208: ('ST', '1', "Graphic Group Description", '', 'GraphicGroupDescription'), 0x00700209: ('SQ', '1', "Compound Graphic Sequence", '', 'CompoundGraphicSequence'), 0x00700226: ('UL', '1', "Compound Graphic Instance ID", '', 'CompoundGraphicInstanceID'), 0x00700227: ('LO', '1', "Font Name", '', 'FontName'), 0x00700228: ('CS', '1', "Font Name Type", '', 'FontNameType'), 0x00700229: ('LO', '1', "CSS Font Name", '', 'CSSFontName'), 0x00700230: ('FD', '1', "Rotation Angle", '', 'RotationAngle'), 0x00700231: ('SQ', '1', "Text Style Sequence", '', 'TextStyleSequence'), 0x00700232: ('SQ', '1', "Line Style Sequence", '', 'LineStyleSequence'), 0x00700233: ('SQ', '1', "Fill Style Sequence", '', 'FillStyleSequence'), 0x00700234: ('SQ', '1', "Graphic Group Sequence", '', 'GraphicGroupSequence'), 0x00700241: ('US', '3', "Text Color CIELab Value", '', 'TextColorCIELabValue'), 0x00700242: ('CS', '1', "Horizontal Alignment", '', 'HorizontalAlignment'), 0x00700243: ('CS', '1', "Vertical Alignment", '', 'VerticalAlignment'), 0x00700244: ('CS', '1', "Shadow Style", '', 'ShadowStyle'), 0x00700245: ('FL', '1', "Shadow Offset X", '', 'ShadowOffsetX'), 0x00700246: ('FL', '1', "Shadow Offset Y", '', 'ShadowOffsetY'), 0x00700247: ('US', '3', "Shadow Color CIELab Value", '', 'ShadowColorCIELabValue'), 0x00700248: ('CS', '1', "Underlined", '', 'Underlined'), 0x00700249: ('CS', '1', "Bold", '', 'Bold'), 0x00700250: ('CS', '1', "Italic", '', 'Italic'), 0x00700251: ('US', '3', "Pattern On Color CIELab Value", '', 'PatternOnColorCIELabValue'), 0x00700252: ('US', '3', "Pattern Off Color CIELab Value", '', 'PatternOffColorCIELabValue'), 0x00700253: ('FL', '1', "Line Thickness", '', 'LineThickness'), 0x00700254: ('CS', '1', "Line Dashing Style", '', 'LineDashingStyle'), 0x00700255: ('UL', '1', "Line Pattern", '', 'LinePattern'), 0x00700256: ('OB', '1', "Fill Pattern", '', 'FillPattern'), 0x00700257: ('CS', '1', "Fill Mode", '', 'FillMode'), 0x00700258: ('FL', '1', "Shadow Opacity", '', 'ShadowOpacity'), 0x00700261: ('FL', '1', "Gap Length", '', 'GapLength'), 0x00700262: ('FL', '1', "Diameter of Visibility", '', 'DiameterOfVisibility'), 0x00700273: ('FL', '2', "Rotation Point", '', 'RotationPoint'), 0x00700274: ('CS', '1', "Tick Alignment", '', 'TickAlignment'), 0x00700278: ('CS', '1', "Show Tick Label", '', 'ShowTickLabel'), 0x00700279: ('CS', '1', "Tick Label Alignment", '', 'TickLabelAlignment'), 0x00700282: ('CS', '1', "Compound Graphic Units", '', 'CompoundGraphicUnits'), 0x00700284: ('FL', '1', "Pattern On Opacity", '', 'PatternOnOpacity'), 0x00700285: ('FL', '1', "Pattern Off Opacity", '', 'PatternOffOpacity'), 0x00700287: ('SQ', '1', "Major Ticks Sequence", '', 'MajorTicksSequence'), 0x00700288: ('FL', '1', "Tick Position", '', 'TickPosition'), 0x00700289: ('SH', '1', "Tick Label", '', 'TickLabel'), 0x00700294: ('CS', '1', "Compound Graphic Type", '', 'CompoundGraphicType'), 0x00700295: ('UL', '1', "Graphic Group ID", '', 'GraphicGroupID'), 0x00700306: ('CS', '1', "Shape Type", '', 'ShapeType'), 0x00700308: ('SQ', '1', "Registration Sequence", '', 'RegistrationSequence'), 0x00700309: ('SQ', '1', "Matrix Registration Sequence", '', 'MatrixRegistrationSequence'), 0x0070030A: ('SQ', '1', "Matrix Sequence", '', 'MatrixSequence'), 0x0070030C: ('CS', '1', "Frame of Reference Transformation Matrix Type", '', 'FrameOfReferenceTransformationMatrixType'), 0x0070030D: ('SQ', '1', "Registration Type Code Sequence", '', 'RegistrationTypeCodeSequence'), 0x0070030F: ('ST', '1', "Fiducial Description", '', 'FiducialDescription'), 0x00700310: ('SH', '1', "Fiducial Identifier", '', 'FiducialIdentifier'), 0x00700311: ('SQ', '1', "Fiducial Identifier Code Sequence", '', 'FiducialIdentifierCodeSequence'), 0x00700312: ('FD', '1', "Contour Uncertainty Radius", '', 'ContourUncertaintyRadius'), 0x00700314: ('SQ', '1', "Used Fiducials Sequence", '', 'UsedFiducialsSequence'), 0x00700318: ('SQ', '1', "Graphic Coordinates Data Sequence", '', 'GraphicCoordinatesDataSequence'), 0x0070031A: ('UI', '1', "Fiducial UID", '', 'FiducialUID'), 0x0070031C: ('SQ', '1', "Fiducial Set Sequence", '', 'FiducialSetSequence'), 0x0070031E: ('SQ', '1', "Fiducial Sequence", '', 'FiducialSequence'), 0x00700401: ('US', '3', "Graphic Layer Recommended Display CIELab Value", '', 'GraphicLayerRecommendedDisplayCIELabValue'), 0x00700402: ('SQ', '1', "Blending Sequence", '', 'BlendingSequence'), 0x00700403: ('FL', '1', "Relative Opacity", '', 'RelativeOpacity'), 0x00700404: ('SQ', '1', "Referenced Spatial Registration Sequence", '', 'ReferencedSpatialRegistrationSequence'), 0x00700405: ('CS', '1', "Blending Position", '', 'BlendingPosition'), 0x00720002: ('SH', '1', "Hanging Protocol Name", '', 'HangingProtocolName'), 0x00720004: ('LO', '1', "Hanging Protocol Description", '', 'HangingProtocolDescription'), 0x00720006: ('CS', '1', "Hanging Protocol Level", '', 'HangingProtocolLevel'), 0x00720008: ('LO', '1', "Hanging Protocol Creator", '', 'HangingProtocolCreator'), 0x0072000A: ('DT', '1', "Hanging Protocol Creation DateTime", '', 'HangingProtocolCreationDateTime'), 0x0072000C: ('SQ', '1', "Hanging Protocol Definition Sequence", '', 'HangingProtocolDefinitionSequence'), 0x0072000E: ('SQ', '1', "Hanging Protocol User Identification Code Sequence", '', 'HangingProtocolUserIdentificationCodeSequence'), 0x00720010: ('LO', '1', "Hanging Protocol User Group Name", '', 'HangingProtocolUserGroupName'), 0x00720012: ('SQ', '1', "Source Hanging Protocol Sequence", '', 'SourceHangingProtocolSequence'), 0x00720014: ('US', '1', "Number of Priors Referenced", '', 'NumberOfPriorsReferenced'), 0x00720020: ('SQ', '1', "Image Sets Sequence", '', 'ImageSetsSequence'), 0x00720022: ('SQ', '1', "Image Set Selector Sequence", '', 'ImageSetSelectorSequence'), 0x00720024: ('CS', '1', "Image Set Selector Usage Flag", '', 'ImageSetSelectorUsageFlag'), 0x00720026: ('AT', '1', "Selector Attribute", '', 'SelectorAttribute'), 0x00720028: ('US', '1', "Selector Value Number", '', 'SelectorValueNumber'), 0x00720030: ('SQ', '1', "Time Based Image Sets Sequence", '', 'TimeBasedImageSetsSequence'), 0x00720032: ('US', '1', "Image Set Number", '', 'ImageSetNumber'), 0x00720034: ('CS', '1', "Image Set Selector Category", '', 'ImageSetSelectorCategory'), 0x00720038: ('US', '2', "Relative Time", '', 'RelativeTime'), 0x0072003A: ('CS', '1', "Relative Time Units", '', 'RelativeTimeUnits'), 0x0072003C: ('SS', '2', "Abstract Prior Value", '', 'AbstractPriorValue'), 0x0072003E: ('SQ', '1', "Abstract Prior Code Sequence", '', 'AbstractPriorCodeSequence'), 0x00720040: ('LO', '1', "Image Set Label", '', 'ImageSetLabel'), 0x00720050: ('CS', '1', "Selector Attribute VR", '', 'SelectorAttributeVR'), 0x00720052: ('AT', '1-n', "Selector Sequence Pointer", '', 'SelectorSequencePointer'), 0x00720054: ('LO', '1-n', "Selector Sequence Pointer Private Creator", '', 'SelectorSequencePointerPrivateCreator'), 0x00720056: ('LO', '1', "Selector Attribute Private Creator", '', 'SelectorAttributePrivateCreator'), 0x00720060: ('AT', '1-n', "Selector AT Value", '', 'SelectorATValue'), 0x00720062: ('CS', '1-n', "Selector CS Value", '', 'SelectorCSValue'), 0x00720064: ('IS', '1-n', "Selector IS Value", '', 'SelectorISValue'), 0x00720066: ('LO', '1-n', "Selector LO Value", '', 'SelectorLOValue'), 0x00720068: ('LT', '1', "Selector LT Value", '', 'SelectorLTValue'), 0x0072006A: ('PN', '1-n', "Selector PN Value", '', 'SelectorPNValue'), 0x0072006C: ('SH', '1-n', "Selector SH Value", '', 'SelectorSHValue'), 0x0072006E: ('ST', '1', "Selector ST Value", '', 'SelectorSTValue'), 0x00720070: ('UT', '1', "Selector UT Value", '', 'SelectorUTValue'), 0x00720072: ('DS', '1-n', "Selector DS Value", '', 'SelectorDSValue'), 0x00720074: ('FD', '1-n', "Selector FD Value", '', 'SelectorFDValue'), 0x00720076: ('FL', '1-n', "Selector FL Value", '', 'SelectorFLValue'), 0x00720078: ('UL', '1-n', "Selector UL Value", '', 'SelectorULValue'), 0x0072007A: ('US', '1-n', "Selector US Value", '', 'SelectorUSValue'), 0x0072007C: ('SL', '1-n', "Selector SL Value", '', 'SelectorSLValue'), 0x0072007E: ('SS', '1-n', "Selector SS Value", '', 'SelectorSSValue'), 0x00720080: ('SQ', '1', "Selector Code Sequence Value", '', 'SelectorCodeSequenceValue'), 0x00720100: ('US', '1', "Number of Screens", '', 'NumberOfScreens'), 0x00720102: ('SQ', '1', "Nominal Screen Definition Sequence", '', 'NominalScreenDefinitionSequence'), 0x00720104: ('US', '1', "Number of Vertical Pixels", '', 'NumberOfVerticalPixels'), 0x00720106: ('US', '1', "Number of Horizontal Pixels", '', 'NumberOfHorizontalPixels'), 0x00720108: ('FD', '4', "Display Environment Spatial Position", '', 'DisplayEnvironmentSpatialPosition'), 0x0072010A: ('US', '1', "Screen Minimum Grayscale Bit Depth", '', 'ScreenMinimumGrayscaleBitDepth'), 0x0072010C: ('US', '1', "Screen Minimum Color Bit Depth", '', 'ScreenMinimumColorBitDepth'), 0x0072010E: ('US', '1', "Application Maximum Repaint Time", '', 'ApplicationMaximumRepaintTime'), 0x00720200: ('SQ', '1', "Display Sets Sequence", '', 'DisplaySetsSequence'), 0x00720202: ('US', '1', "Display Set Number", '', 'DisplaySetNumber'), 0x00720203: ('LO', '1', "Display Set Label", '', 'DisplaySetLabel'), 0x00720204: ('US', '1', "Display Set Presentation Group", '', 'DisplaySetPresentationGroup'), 0x00720206: ('LO', '1', "Display Set Presentation Group Description", '', 'DisplaySetPresentationGroupDescription'), 0x00720208: ('CS', '1', "Partial Data Display Handling", '', 'PartialDataDisplayHandling'), 0x00720210: ('SQ', '1', "Synchronized Scrolling Sequence", '', 'SynchronizedScrollingSequence'), 0x00720212: ('US', '2-n', "Display Set Scrolling Group", '', 'DisplaySetScrollingGroup'), 0x00720214: ('SQ', '1', "Navigation Indicator Sequence", '', 'NavigationIndicatorSequence'), 0x00720216: ('US', '1', "Navigation Display Set", '', 'NavigationDisplaySet'), 0x00720218: ('US', '1-n', "Reference Display Sets", '', 'ReferenceDisplaySets'), 0x00720300: ('SQ', '1', "Image Boxes Sequence", '', 'ImageBoxesSequence'), 0x00720302: ('US', '1', "Image Box Number", '', 'ImageBoxNumber'), 0x00720304: ('CS', '1', "Image Box Layout Type", '', 'ImageBoxLayoutType'), 0x00720306: ('US', '1', "Image Box Tile Horizontal Dimension", '', 'ImageBoxTileHorizontalDimension'), 0x00720308: ('US', '1', "Image Box Tile Vertical Dimension", '', 'ImageBoxTileVerticalDimension'), 0x00720310: ('CS', '1', "Image Box Scroll Direction", '', 'ImageBoxScrollDirection'), 0x00720312: ('CS', '1', "Image Box Small Scroll Type", '', 'ImageBoxSmallScrollType'), 0x00720314: ('US', '1', "Image Box Small Scroll Amount", '', 'ImageBoxSmallScrollAmount'), 0x00720316: ('CS', '1', "Image Box Large Scroll Type", '', 'ImageBoxLargeScrollType'), 0x00720318: ('US', '1', "Image Box Large Scroll Amount", '', 'ImageBoxLargeScrollAmount'), 0x00720320: ('US', '1', "Image Box Overlap Priority", '', 'ImageBoxOverlapPriority'), 0x00720330: ('FD', '1', "Cine Relative to Real-Time", '', 'CineRelativeToRealTime'), 0x00720400: ('SQ', '1', "Filter Operations Sequence", '', 'FilterOperationsSequence'), 0x00720402: ('CS', '1', "Filter-by Category", '', 'FilterByCategory'), 0x00720404: ('CS', '1', "Filter-by Attribute Presence", '', 'FilterByAttributePresence'), 0x00720406: ('CS', '1', "Filter-by Operator", '', 'FilterByOperator'), 0x00720420: ('US', '3', "Structured Display Background CIELab Value", '', 'StructuredDisplayBackgroundCIELabValue'), 0x00720421: ('US', '3', "Empty Image Box CIELab Value", '', 'EmptyImageBoxCIELabValue'), 0x00720422: ('SQ', '1', "Structured Display Image Box Sequence", '', 'StructuredDisplayImageBoxSequence'), 0x00720424: ('SQ', '1', "Structured Display Text Box Sequence", '', 'StructuredDisplayTextBoxSequence'), 0x00720427: ('SQ', '1', "Referenced First Frame Sequence", '', 'ReferencedFirstFrameSequence'), 0x00720430: ('SQ', '1', "Image Box Synchronization Sequence", '', 'ImageBoxSynchronizationSequence'), 0x00720432: ('US', '2-n', "Synchronized Image Box List", '', 'SynchronizedImageBoxList'), 0x00720434: ('CS', '1', "Type of Synchronization", '', 'TypeOfSynchronization'), 0x00720500: ('CS', '1', "Blending Operation Type", '', 'BlendingOperationType'), 0x00720510: ('CS', '1', "Reformatting Operation Type", '', 'ReformattingOperationType'), 0x00720512: ('FD', '1', "Reformatting Thickness", '', 'ReformattingThickness'), 0x00720514: ('FD', '1', "Reformatting Interval", '', 'ReformattingInterval'), 0x00720516: ('CS', '1', "Reformatting Operation Initial View Direction", '', 'ReformattingOperationInitialViewDirection'), 0x00720520: ('CS', '1-n', "3D Rendering Type", '', 'ThreeDRenderingType'), 0x00720600: ('SQ', '1', "Sorting Operations Sequence", '', 'SortingOperationsSequence'), 0x00720602: ('CS', '1', "Sort-by Category", '', 'SortByCategory'), 0x00720604: ('CS', '1', "Sorting Direction", '', 'SortingDirection'), 0x00720700: ('CS', '2', "Display Set Patient Orientation", '', 'DisplaySetPatientOrientation'), 0x00720702: ('CS', '1', "VOI Type", '', 'VOIType'), 0x00720704: ('CS', '1', "Pseudo-Color Type", '', 'PseudoColorType'), 0x00720705: ('SQ', '1', "Pseudo-Color Palette Instance Reference Sequence", '', 'PseudoColorPaletteInstanceReferenceSequence'), 0x00720706: ('CS', '1', "Show Grayscale Inverted", '', 'ShowGrayscaleInverted'), 0x00720710: ('CS', '1', "Show Image True Size Flag", '', 'ShowImageTrueSizeFlag'), 0x00720712: ('CS', '1', "Show Graphic Annotation Flag", '', 'ShowGraphicAnnotationFlag'), 0x00720714: ('CS', '1', "Show Patient Demographics Flag", '', 'ShowPatientDemographicsFlag'), 0x00720716: ('CS', '1', "Show Acquisition Techniques Flag", '', 'ShowAcquisitionTechniquesFlag'), 0x00720717: ('CS', '1', "Display Set Horizontal Justification", '', 'DisplaySetHorizontalJustification'), 0x00720718: ('CS', '1', "Display Set Vertical Justification", '', 'DisplaySetVerticalJustification'), 0x00740120: ('FD', '1', "Continuation Start Meterset", '', 'ContinuationStartMeterset'), 0x00740121: ('FD', '1', "Continuation End Meterset", '', 'ContinuationEndMeterset'), 0x00741000: ('CS', '1', "Procedure Step State", '', 'ProcedureStepState'), 0x00741002: ('SQ', '1', "Procedure Step Progress Information Sequence", '', 'ProcedureStepProgressInformationSequence'), 0x00741004: ('DS', '1', "Procedure Step Progress", '', 'ProcedureStepProgress'), 0x00741006: ('ST', '1', "Procedure Step Progress Description", '', 'ProcedureStepProgressDescription'), 0x00741008: ('SQ', '1', "Procedure Step Communications URI Sequence", '', 'ProcedureStepCommunicationsURISequence'), 0x0074100a: ('ST', '1', "Contact URI", '', 'ContactURI'), 0x0074100c: ('LO', '1', "Contact Display Name", '', 'ContactDisplayName'), 0x0074100e: ('SQ', '1', "Procedure Step Discontinuation Reason Code Sequence", '', 'ProcedureStepDiscontinuationReasonCodeSequence'), 0x00741020: ('SQ', '1', "Beam Task Sequence", '', 'BeamTaskSequence'), 0x00741022: ('CS', '1', "Beam Task Type", '', 'BeamTaskType'), 0x00741024: ('IS', '1', "Beam Order Index (Trial)", 'Retired', 'BeamOrderIndexTrial'), 0x00741026: ('FD', '1', "Table Top Vertical Adjusted Position", '', 'TableTopVerticalAdjustedPosition'), 0x00741027: ('FD', '1', "Table Top Longitudinal Adjusted Position", '', 'TableTopLongitudinalAdjustedPosition'), 0x00741028: ('FD', '1', "Table Top Lateral Adjusted Position", '', 'TableTopLateralAdjustedPosition'), 0x0074102A: ('FD', '1', "Patient Support Adjusted Angle", '', 'PatientSupportAdjustedAngle'), 0x0074102B: ('FD', '1', "Table Top Eccentric Adjusted Angle", '', 'TableTopEccentricAdjustedAngle'), 0x0074102C: ('FD', '1', "Table Top Pitch Adjusted Angle", '', 'TableTopPitchAdjustedAngle'), 0x0074102D: ('FD', '1', "Table Top Roll Adjusted Angle", '', 'TableTopRollAdjustedAngle'), 0x00741030: ('SQ', '1', "Delivery Verification Image Sequence", '', 'DeliveryVerificationImageSequence'), 0x00741032: ('CS', '1', "Verification Image Timing", '', 'VerificationImageTiming'), 0x00741034: ('CS', '1', "Double Exposure Flag", '', 'DoubleExposureFlag'), 0x00741036: ('CS', '1', "Double Exposure Ordering", '', 'DoubleExposureOrdering'), 0x00741038: ('DS', '1', "Double Exposure Meterset (Trial)", 'Retired', 'DoubleExposureMetersetTrial'), 0x0074103A: ('DS', '4', "Double Exposure Field Delta (Trial)", 'Retired', 'DoubleExposureFieldDeltaTrial'), 0x00741040: ('SQ', '1', "Related Reference RT Image Sequence", '', 'RelatedReferenceRTImageSequence'), 0x00741042: ('SQ', '1', "General Machine Verification Sequence", '', 'GeneralMachineVerificationSequence'), 0x00741044: ('SQ', '1', "Conventional Machine Verification Sequence", '', 'ConventionalMachineVerificationSequence'), 0x00741046: ('SQ', '1', "Ion Machine Verification Sequence", '', 'IonMachineVerificationSequence'), 0x00741048: ('SQ', '1', "Failed Attributes Sequence", '', 'FailedAttributesSequence'), 0x0074104A: ('SQ', '1', "Overridden Attributes Sequence", '', 'OverriddenAttributesSequence'), 0x0074104C: ('SQ', '1', "Conventional Control Point Verification Sequence", '', 'ConventionalControlPointVerificationSequence'), 0x0074104E: ('SQ', '1', "Ion Control Point Verification Sequence", '', 'IonControlPointVerificationSequence'), 0x00741050: ('SQ', '1', "Attribute Occurrence Sequence", '', 'AttributeOccurrenceSequence'), 0x00741052: ('AT', '1', "Attribute Occurrence Pointer", '', 'AttributeOccurrencePointer'), 0x00741054: ('UL', '1', "Attribute Item Selector", '', 'AttributeItemSelector'), 0x00741056: ('LO', '1', "Attribute Occurrence Private Creator", '', 'AttributeOccurrencePrivateCreator'), 0x00741057: ('IS', '1-n', "Selector Sequence Pointer Items", '', 'SelectorSequencePointerItems'), 0x00741200: ('CS', '1', "Scheduled Procedure Step Priority", '', 'ScheduledProcedureStepPriority'), 0x00741202: ('LO', '1', "Worklist Label", '', 'WorklistLabel'), 0x00741204: ('LO', '1', "Procedure Step Label", '', 'ProcedureStepLabel'), 0x00741210: ('SQ', '1', "Scheduled Processing Parameters Sequence", '', 'ScheduledProcessingParametersSequence'), 0x00741212: ('SQ', '1', "Performed Processing Parameters Sequence", '', 'PerformedProcessingParametersSequence'), 0x00741216: ('SQ', '1', "Unified Procedure Step Performed Procedure Sequence", '', 'UnifiedProcedureStepPerformedProcedureSequence'), 0x00741220: ('SQ', '1', "Related Procedure Step Sequence", 'Retired', 'RelatedProcedureStepSequence'), 0x00741222: ('LO', '1', "Procedure Step Relationship Type", 'Retired', 'ProcedureStepRelationshipType'), 0x00741224: ('SQ', '1', "Replaced Procedure Step Sequence", '', 'ReplacedProcedureStepSequence'), 0x00741230: ('LO', '1', "Deletion Lock", '', 'DeletionLock'), 0x00741234: ('AE', '1', "Receiving AE", '', 'ReceivingAE'), 0x00741236: ('AE', '1', "Requesting AE", '', 'RequestingAE'), 0x00741238: ('LT', '1', "Reason for Cancellation", '', 'ReasonForCancellation'), 0x00741242: ('CS', '1', "SCP Status", '', 'SCPStatus'), 0x00741244: ('CS', '1', "Subscription List Status", '', 'SubscriptionListStatus'), 0x00741246: ('CS', '1', "Unified Procedure Step List Status", '', 'UnifiedProcedureStepListStatus'), 0x00741324: ('UL', '1', "Beam Order Index", '', 'BeamOrderIndex'), 0x00741338: ('FD', '1', "Double Exposure Meterset", '', 'DoubleExposureMeterset'), 0x0074133A: ('FD', '4', "Double Exposure Field Delta", '', 'DoubleExposureFieldDelta'), 0x00760001: ('LO', '1', "Implant Assembly Template Name", '', 'ImplantAssemblyTemplateName'), 0x00760003: ('LO', '1', "Implant Assembly Template Issuer", '', 'ImplantAssemblyTemplateIssuer'), 0x00760006: ('LO', '1', "Implant Assembly Template Version", '', 'ImplantAssemblyTemplateVersion'), 0x00760008: ('SQ', '1', "Replaced Implant Assembly Template Sequence", '', 'ReplacedImplantAssemblyTemplateSequence'), 0x0076000A: ('CS', '1', "Implant Assembly Template Type", '', 'ImplantAssemblyTemplateType'), 0x0076000C: ('SQ', '1', "Original Implant Assembly Template Sequence", '', 'OriginalImplantAssemblyTemplateSequence'), 0x0076000E: ('SQ', '1', "Derivation Implant Assembly Template Sequence", '', 'DerivationImplantAssemblyTemplateSequence'), 0x00760010: ('SQ', '1', "Implant Assembly Template Target Anatomy Sequence", '', 'ImplantAssemblyTemplateTargetAnatomySequence'), 0x00760020: ('SQ', '1', "Procedure Type Code Sequence", '', 'ProcedureTypeCodeSequence'), 0x00760030: ('LO', '1', "Surgical Technique", '', 'SurgicalTechnique'), 0x00760032: ('SQ', '1', "Component Types Sequence", '', 'ComponentTypesSequence'), 0x00760034: ('CS', '1', "Component Type Code Sequence", '', 'ComponentTypeCodeSequence'), 0x00760036: ('CS', '1', "Exclusive Component Type", '', 'ExclusiveComponentType'), 0x00760038: ('CS', '1', "Mandatory Component Type", '', 'MandatoryComponentType'), 0x00760040: ('SQ', '1', "Component Sequence", '', 'ComponentSequence'), 0x00760055: ('US', '1', "Component ID", '', 'ComponentID'), 0x00760060: ('SQ', '1', "Component Assembly Sequence", '', 'ComponentAssemblySequence'), 0x00760070: ('US', '1', "Component 1 Referenced ID", '', 'Component1ReferencedID'), 0x00760080: ('US', '1', "Component 1 Referenced Mating Feature Set ID", '', 'Component1ReferencedMatingFeatureSetID'), 0x00760090: ('US', '1', "Component 1 Referenced Mating Feature ID", '', 'Component1ReferencedMatingFeatureID'), 0x007600A0: ('US', '1', "Component 2 Referenced ID", '', 'Component2ReferencedID'), 0x007600B0: ('US', '1', "Component 2 Referenced Mating Feature Set ID", '', 'Component2ReferencedMatingFeatureSetID'), 0x007600C0: ('US', '1', "Component 2 Referenced Mating Feature ID", '', 'Component2ReferencedMatingFeatureID'), 0x00780001: ('LO', '1', "Implant Template Group Name", '', 'ImplantTemplateGroupName'), 0x00780010: ('ST', '1', "Implant Template Group Description", '', 'ImplantTemplateGroupDescription'), 0x00780020: ('LO', '1', "Implant Template Group Issuer", '', 'ImplantTemplateGroupIssuer'), 0x00780024: ('LO', '1', "Implant Template Group Version", '', 'ImplantTemplateGroupVersion'), 0x00780026: ('SQ', '1', "Replaced Implant Template Group Sequence", '', 'ReplacedImplantTemplateGroupSequence'), 0x00780028: ('SQ', '1', "Implant Template Group Target Anatomy Sequence", '', 'ImplantTemplateGroupTargetAnatomySequence'), 0x0078002A: ('SQ', '1', "Implant Template Group Members Sequence", '', 'ImplantTemplateGroupMembersSequence'), 0x0078002E: ('US', '1', "Implant Template Group Member ID", '', 'ImplantTemplateGroupMemberID'), 0x00780050: ('FD', '3', "3D Implant Template Group Member Matching Point", '', 'ThreeDImplantTemplateGroupMemberMatchingPoint'), 0x00780060: ('FD', '9', "3D Implant Template Group Member Matching Axes", '', 'ThreeDImplantTemplateGroupMemberMatchingAxes'), 0x00780070: ('SQ', '1', "Implant Template Group Member Matching 2D Coordinates Sequence", '', 'ImplantTemplateGroupMemberMatching2DCoordinatesSequence'), 0x00780090: ('FD', '2', "2D Implant Template Group Member Matching Point", '', 'TwoDImplantTemplateGroupMemberMatchingPoint'), 0x007800A0: ('FD', '4', "2D Implant Template Group Member Matching Axes", '', 'TwoDImplantTemplateGroupMemberMatchingAxes'), 0x007800B0: ('SQ', '1', "Implant Template Group Variation Dimension Sequence", '', 'ImplantTemplateGroupVariationDimensionSequence'), 0x007800B2: ('LO', '1', "Implant Template Group Variation Dimension Name", '', 'ImplantTemplateGroupVariationDimensionName'), 0x007800B4: ('SQ', '1', "Implant Template Group Variation Dimension Rank Sequence", '', 'ImplantTemplateGroupVariationDimensionRankSequence'), 0x007800B6: ('US', '1', "Referenced Implant Template Group Member ID", '', 'ReferencedImplantTemplateGroupMemberID'), 0x007800B8: ('US', '1', "Implant Template Group Variation Dimension Rank", '', 'ImplantTemplateGroupVariationDimensionRank'), 0x00880130: ('SH', '1', "Storage Media File-set ID", '', 'StorageMediaFileSetID'), 0x00880140: ('UI', '1', "Storage Media File-set UID", '', 'StorageMediaFileSetUID'), 0x00880200: ('SQ', '1', "Icon Image Sequence", '', 'IconImageSequence'), 0x00880904: ('LO', '1', "Topic Title", 'Retired', 'TopicTitle'), 0x00880906: ('ST', '1', "Topic Subject", 'Retired', 'TopicSubject'), 0x00880910: ('LO', '1', "Topic Author", 'Retired', 'TopicAuthor'), 0x00880912: ('LO', '1-32', "Topic Keywords", 'Retired', 'TopicKeywords'), 0x01000410: ('CS', '1', "SOP Instance Status", '', 'SOPInstanceStatus'), 0x01000420: ('DT', '1', "SOP Authorization DateTime", '', 'SOPAuthorizationDateTime'), 0x01000424: ('LT', '1', "SOP Authorization Comment", '', 'SOPAuthorizationComment'), 0x01000426: ('LO', '1', "Authorization Equipment Certification Number", '', 'AuthorizationEquipmentCertificationNumber'), 0x04000005: ('US', '1', "MAC ID Number", '', 'MACIDNumber'), 0x04000010: ('UI', '1', "MAC Calculation Transfer Syntax UID", '', 'MACCalculationTransferSyntaxUID'), 0x04000015: ('CS', '1', "MAC Algorithm", '', 'MACAlgorithm'), 0x04000020: ('AT', '1-n', "Data Elements Signed", '', 'DataElementsSigned'), 0x04000100: ('UI', '1', "Digital Signature UID", '', 'DigitalSignatureUID'), 0x04000105: ('DT', '1', "Digital Signature DateTime", '', 'DigitalSignatureDateTime'), 0x04000110: ('CS', '1', "Certificate Type", '', 'CertificateType'), 0x04000115: ('OB', '1', "Certificate of Signer", '', 'CertificateOfSigner'), 0x04000120: ('OB', '1', "Signature", '', 'Signature'), 0x04000305: ('CS', '1', "Certified Timestamp Type", '', 'CertifiedTimestampType'), 0x04000310: ('OB', '1', "Certified Timestamp", '', 'CertifiedTimestamp'), 0x04000401: ('SQ', '1', "Digital Signature Purpose Code Sequence", '', 'DigitalSignaturePurposeCodeSequence'), 0x04000402: ('SQ', '1', "Referenced Digital Signature Sequence", '', 'ReferencedDigitalSignatureSequence'), 0x04000403: ('SQ', '1', "Referenced SOP Instance MAC Sequence", '', 'ReferencedSOPInstanceMACSequence'), 0x04000404: ('OB', '1', "MAC", '', 'MAC'), 0x04000500: ('SQ', '1', "Encrypted Attributes Sequence", '', 'EncryptedAttributesSequence'), 0x04000510: ('UI', '1', "Encrypted Content Transfer Syntax UID", '', 'EncryptedContentTransferSyntaxUID'), 0x04000520: ('OB', '1', "Encrypted Content", '', 'EncryptedContent'), 0x04000550: ('SQ', '1', "Modified Attributes Sequence", '', 'ModifiedAttributesSequence'), 0x04000561: ('SQ', '1', "Original Attributes Sequence", '', 'OriginalAttributesSequence'), 0x04000562: ('DT', '1', "Attribute Modification DateTime", '', 'AttributeModificationDateTime'), 0x04000563: ('LO', '1', "Modifying System", '', 'ModifyingSystem'), 0x04000564: ('LO', '1', "Source of Previous Values", '', 'SourceOfPreviousValues'), 0x04000565: ('CS', '1', "Reason for the Attribute Modification", '', 'ReasonForTheAttributeModification'), 0x20000010: ('IS', '1', "Number of Copies", '', 'NumberOfCopies'), 0x2000001E: ('SQ', '1', "Printer Configuration Sequence", '', 'PrinterConfigurationSequence'), 0x20000020: ('CS', '1', "Print Priority", '', 'PrintPriority'), 0x20000030: ('CS', '1', "Medium Type", '', 'MediumType'), 0x20000040: ('CS', '1', "Film Destination", '', 'FilmDestination'), 0x20000050: ('LO', '1', "Film Session Label", '', 'FilmSessionLabel'), 0x20000060: ('IS', '1', "Memory Allocation", '', 'MemoryAllocation'), 0x20000061: ('IS', '1', "Maximum Memory Allocation", '', 'MaximumMemoryAllocation'), 0x20000062: ('CS', '1', "Color Image Printing Flag", 'Retired', 'ColorImagePrintingFlag'), 0x20000063: ('CS', '1', "Collation Flag", 'Retired', 'CollationFlag'), 0x20000065: ('CS', '1', "Annotation Flag", 'Retired', 'AnnotationFlag'), 0x20000067: ('CS', '1', "Image Overlay Flag", 'Retired', 'ImageOverlayFlag'), 0x20000069: ('CS', '1', "Presentation LUT Flag", 'Retired', 'PresentationLUTFlag'), 0x2000006A: ('CS', '1', "Image Box Presentation LUT Flag", 'Retired', 'ImageBoxPresentationLUTFlag'), 0x200000A0: ('US', '1', "Memory Bit Depth", '', 'MemoryBitDepth'), 0x200000A1: ('US', '1', "Printing Bit Depth", '', 'PrintingBitDepth'), 0x200000A2: ('SQ', '1', "Media Installed Sequence", '', 'MediaInstalledSequence'), 0x200000A4: ('SQ', '1', "Other Media Available Sequence", '', 'OtherMediaAvailableSequence'), 0x200000A8: ('SQ', '1', "Supported Image Display Formats Sequence", '', 'SupportedImageDisplayFormatsSequence'), 0x20000500: ('SQ', '1', "Referenced Film Box Sequence", '', 'ReferencedFilmBoxSequence'), 0x20000510: ('SQ', '1', "Referenced Stored Print Sequence", 'Retired', 'ReferencedStoredPrintSequence'), 0x20100010: ('ST', '1', "Image Display Format", '', 'ImageDisplayFormat'), 0x20100030: ('CS', '1', "Annotation Display Format ID", '', 'AnnotationDisplayFormatID'), 0x20100040: ('CS', '1', "Film Orientation", '', 'FilmOrientation'), 0x20100050: ('CS', '1', "Film Size ID", '', 'FilmSizeID'), 0x20100052: ('CS', '1', "Printer Resolution ID", '', 'PrinterResolutionID'), 0x20100054: ('CS', '1', "Default Printer Resolution ID", '', 'DefaultPrinterResolutionID'), 0x20100060: ('CS', '1', "Magnification Type", '', 'MagnificationType'), 0x20100080: ('CS', '1', "Smoothing Type", '', 'SmoothingType'), 0x201000A6: ('CS', '1', "Default Magnification Type", '', 'DefaultMagnificationType'), 0x201000A7: ('CS', '1-n', "Other Magnification Types Available", '', 'OtherMagnificationTypesAvailable'), 0x201000A8: ('CS', '1', "Default Smoothing Type", '', 'DefaultSmoothingType'), 0x201000A9: ('CS', '1-n', "Other Smoothing Types Available", '', 'OtherSmoothingTypesAvailable'), 0x20100100: ('CS', '1', "Border Density", '', 'BorderDensity'), 0x20100110: ('CS', '1', "Empty Image Density", '', 'EmptyImageDensity'), 0x20100120: ('US', '1', "Min Density", '', 'MinDensity'), 0x20100130: ('US', '1', "Max Density", '', 'MaxDensity'), 0x20100140: ('CS', '1', "Trim", '', 'Trim'), 0x20100150: ('ST', '1', "Configuration Information", '', 'ConfigurationInformation'), 0x20100152: ('LT', '1', "Configuration Information Description", '', 'ConfigurationInformationDescription'), 0x20100154: ('IS', '1', "Maximum Collated Films", '', 'MaximumCollatedFilms'), 0x2010015E: ('US', '1', "Illumination", '', 'Illumination'), 0x20100160: ('US', '1', "Reflected Ambient Light", '', 'ReflectedAmbientLight'), 0x20100376: ('DS', '2', "Printer Pixel Spacing", '', 'PrinterPixelSpacing'), 0x20100500: ('SQ', '1', "Referenced Film Session Sequence", '', 'ReferencedFilmSessionSequence'), 0x20100510: ('SQ', '1', "Referenced Image Box Sequence", '', 'ReferencedImageBoxSequence'), 0x20100520: ('SQ', '1', "Referenced Basic Annotation Box Sequence", '', 'ReferencedBasicAnnotationBoxSequence'), 0x20200010: ('US', '1', "Image Box Position", '', 'ImageBoxPosition'), 0x20200020: ('CS', '1', "Polarity", '', 'Polarity'), 0x20200030: ('DS', '1', "Requested Image Size", '', 'RequestedImageSize'), 0x20200040: ('CS', '1', "Requested Decimate/Crop Behavior", '', 'RequestedDecimateCropBehavior'), 0x20200050: ('CS', '1', "Requested Resolution ID", '', 'RequestedResolutionID'), 0x202000A0: ('CS', '1', "Requested Image Size Flag", '', 'RequestedImageSizeFlag'), 0x202000A2: ('CS', '1', "Decimate/Crop Result", '', 'DecimateCropResult'), 0x20200110: ('SQ', '1', "Basic Grayscale Image Sequence", '', 'BasicGrayscaleImageSequence'), 0x20200111: ('SQ', '1', "Basic Color Image Sequence", '', 'BasicColorImageSequence'), 0x20200130: ('SQ', '1', "Referenced Image Overlay Box Sequence", 'Retired', 'ReferencedImageOverlayBoxSequence'), 0x20200140: ('SQ', '1', "Referenced VOI LUT Box Sequence", 'Retired', 'ReferencedVOILUTBoxSequence'), 0x20300010: ('US', '1', "Annotation Position", '', 'AnnotationPosition'), 0x20300020: ('LO', '1', "Text String", '', 'TextString'), 0x20400010: ('SQ', '1', "Referenced Overlay Plane Sequence", 'Retired', 'ReferencedOverlayPlaneSequence'), 0x20400011: ('US', '1-99', "Referenced Overlay Plane Groups", 'Retired', 'ReferencedOverlayPlaneGroups'), 0x20400020: ('SQ', '1', "Overlay Pixel Data Sequence", 'Retired', 'OverlayPixelDataSequence'), 0x20400060: ('CS', '1', "Overlay Magnification Type", 'Retired', 'OverlayMagnificationType'), 0x20400070: ('CS', '1', "Overlay Smoothing Type", 'Retired', 'OverlaySmoothingType'), 0x20400072: ('CS', '1', "Overlay or Image Magnification", 'Retired', 'OverlayOrImageMagnification'), 0x20400074: ('US', '1', "Magnify to Number of Columns", 'Retired', 'MagnifyToNumberOfColumns'), 0x20400080: ('CS', '1', "Overlay Foreground Density", 'Retired', 'OverlayForegroundDensity'), 0x20400082: ('CS', '1', "Overlay Background Density", 'Retired', 'OverlayBackgroundDensity'), 0x20400090: ('CS', '1', "Overlay Mode", 'Retired', 'OverlayMode'), 0x20400100: ('CS', '1', "Threshold Density", 'Retired', 'ThresholdDensity'), 0x20400500: ('SQ', '1', "Referenced Image Box Sequence (Retired)", 'Retired', 'ReferencedImageBoxSequenceRetired'), 0x20500010: ('SQ', '1', "Presentation LUT Sequence", '', 'PresentationLUTSequence'), 0x20500020: ('CS', '1', "Presentation LUT Shape", '', 'PresentationLUTShape'), 0x20500500: ('SQ', '1', "Referenced Presentation LUT Sequence", '', 'ReferencedPresentationLUTSequence'), 0x21000010: ('SH', '1', "Print Job ID", 'Retired', 'PrintJobID'), 0x21000020: ('CS', '1', "Execution Status", '', 'ExecutionStatus'), 0x21000030: ('CS', '1', "Execution Status Info", '', 'ExecutionStatusInfo'), 0x21000040: ('DA', '1', "Creation Date", '', 'CreationDate'), 0x21000050: ('TM', '1', "Creation Time", '', 'CreationTime'), 0x21000070: ('AE', '1', "Originator", '', 'Originator'), 0x21000140: ('AE', '1', "Destination AE", 'Retired', 'DestinationAE'), 0x21000160: ('SH', '1', "Owner ID", '', 'OwnerID'), 0x21000170: ('IS', '1', "Number of Films", '', 'NumberOfFilms'), 0x21000500: ('SQ', '1', "Referenced Print Job Sequence (Pull Stored Print)", 'Retired', 'ReferencedPrintJobSequencePullStoredPrint'), 0x21100010: ('CS', '1', "Printer Status", '', 'PrinterStatus'), 0x21100020: ('CS', '1', "Printer Status Info", '', 'PrinterStatusInfo'), 0x21100030: ('LO', '1', "Printer Name", '', 'PrinterName'), 0x21100099: ('SH', '1', "Print Queue ID", 'Retired', 'PrintQueueID'), 0x21200010: ('CS', '1', "Queue Status", 'Retired', 'QueueStatus'), 0x21200050: ('SQ', '1', "Print Job Description Sequence", 'Retired', 'PrintJobDescriptionSequence'), 0x21200070: ('SQ', '1', "Referenced Print Job Sequence", 'Retired', 'ReferencedPrintJobSequence'), 0x21300010: ('SQ', '1', "Print Management Capabilities Sequence", 'Retired', 'PrintManagementCapabilitiesSequence'), 0x21300015: ('SQ', '1', "Printer Characteristics Sequence", 'Retired', 'PrinterCharacteristicsSequence'), 0x21300030: ('SQ', '1', "Film Box Content Sequence", 'Retired', 'FilmBoxContentSequence'), 0x21300040: ('SQ', '1', "Image Box Content Sequence", 'Retired', 'ImageBoxContentSequence'), 0x21300050: ('SQ', '1', "Annotation Content Sequence", 'Retired', 'AnnotationContentSequence'), 0x21300060: ('SQ', '1', "Image Overlay Box Content Sequence", 'Retired', 'ImageOverlayBoxContentSequence'), 0x21300080: ('SQ', '1', "Presentation LUT Content Sequence", 'Retired', 'PresentationLUTContentSequence'), 0x213000A0: ('SQ', '1', "Proposed Study Sequence", 'Retired', 'ProposedStudySequence'), 0x213000C0: ('SQ', '1', "Original Image Sequence", 'Retired', 'OriginalImageSequence'), 0x22000001: ('CS', '1', "Label Using Information Extracted From Instances", '', 'LabelUsingInformationExtractedFromInstances'), 0x22000002: ('UT', '1', "Label Text", '', 'LabelText'), 0x22000003: ('CS', '1', "Label Style Selection", '', 'LabelStyleSelection'), 0x22000004: ('LT', '1', "Media Disposition", '', 'MediaDisposition'), 0x22000005: ('LT', '1', "Barcode Value", '', 'BarcodeValue'), 0x22000006: ('CS', '1', "Barcode Symbology", '', 'BarcodeSymbology'), 0x22000007: ('CS', '1', "Allow Media Splitting", '', 'AllowMediaSplitting'), 0x22000008: ('CS', '1', "Include Non-DICOM Objects", '', 'IncludeNonDICOMObjects'), 0x22000009: ('CS', '1', "Include Display Application", '', 'IncludeDisplayApplication'), 0x2200000A: ('CS', '1', "Preserve Composite Instances After Media Creation", '', 'PreserveCompositeInstancesAfterMediaCreation'), 0x2200000B: ('US', '1', "Total Number of Pieces of Media Created", '', 'TotalNumberOfPiecesOfMediaCreated'), 0x2200000C: ('LO', '1', "Requested Media Application Profile", '', 'RequestedMediaApplicationProfile'), 0x2200000D: ('SQ', '1', "Referenced Storage Media Sequence", '', 'ReferencedStorageMediaSequence'), 0x2200000E: ('AT', '1-n', "Failure Attributes", '', 'FailureAttributes'), 0x2200000F: ('CS', '1', "Allow Lossy Compression", '', 'AllowLossyCompression'), 0x22000020: ('CS', '1', "Request Priority", '', 'RequestPriority'), 0x30020002: ('SH', '1', "RT Image Label", '', 'RTImageLabel'), 0x30020003: ('LO', '1', "RT Image Name", '', 'RTImageName'), 0x30020004: ('ST', '1', "RT Image Description", '', 'RTImageDescription'), 0x3002000A: ('CS', '1', "Reported Values Origin", '', 'ReportedValuesOrigin'), 0x3002000C: ('CS', '1', "RT Image Plane", '', 'RTImagePlane'), 0x3002000D: ('DS', '3', "X-Ray Image Receptor Translation", '', 'XRayImageReceptorTranslation'), 0x3002000E: ('DS', '1', "X-Ray Image Receptor Angle", '', 'XRayImageReceptorAngle'), 0x30020010: ('DS', '6', "RT Image Orientation", '', 'RTImageOrientation'), 0x30020011: ('DS', '2', "Image Plane Pixel Spacing", '', 'ImagePlanePixelSpacing'), 0x30020012: ('DS', '2', "RT Image Position", '', 'RTImagePosition'), 0x30020020: ('SH', '1', "Radiation Machine Name", '', 'RadiationMachineName'), 0x30020022: ('DS', '1', "Radiation Machine SAD", '', 'RadiationMachineSAD'), 0x30020024: ('DS', '1', "Radiation Machine SSD", '', 'RadiationMachineSSD'), 0x30020026: ('DS', '1', "RT Image SID", '', 'RTImageSID'), 0x30020028: ('DS', '1', "Source to Reference Object Distance", '', 'SourceToReferenceObjectDistance'), 0x30020029: ('IS', '1', "Fraction Number", '', 'FractionNumber'), 0x30020030: ('SQ', '1', "Exposure Sequence", '', 'ExposureSequence'), 0x30020032: ('DS', '1', "Meterset Exposure", '', 'MetersetExposure'), 0x30020034: ('DS', '4', "Diaphragm Position", '', 'DiaphragmPosition'), 0x30020040: ('SQ', '1', "Fluence Map Sequence", '', 'FluenceMapSequence'), 0x30020041: ('CS', '1', "Fluence Data Source", '', 'FluenceDataSource'), 0x30020042: ('DS', '1', "Fluence Data Scale", '', 'FluenceDataScale'), 0x30020050: ('SQ', '1', "Primary Fluence Mode Sequence", '', 'PrimaryFluenceModeSequence'), 0x30020051: ('CS', '1', "Fluence Mode", '', 'FluenceMode'), 0x30020052: ('SH', '1', "Fluence Mode ID", '', 'FluenceModeID'), 0x30040001: ('CS', '1', "DVH Type", '', 'DVHType'), 0x30040002: ('CS', '1', "Dose Units", '', 'DoseUnits'), 0x30040004: ('CS', '1', "Dose Type", '', 'DoseType'), 0x30040006: ('LO', '1', "Dose Comment", '', 'DoseComment'), 0x30040008: ('DS', '3', "Normalization Point", '', 'NormalizationPoint'), 0x3004000A: ('CS', '1', "Dose Summation Type", '', 'DoseSummationType'), 0x3004000C: ('DS', '2-n', "Grid Frame Offset Vector", '', 'GridFrameOffsetVector'), 0x3004000E: ('DS', '1', "Dose Grid Scaling", '', 'DoseGridScaling'), 0x30040010: ('SQ', '1', "RT Dose ROI Sequence", '', 'RTDoseROISequence'), 0x30040012: ('DS', '1', "Dose Value", '', 'DoseValue'), 0x30040014: ('CS', '1-3', "Tissue Heterogeneity Correction", '', 'TissueHeterogeneityCorrection'), 0x30040040: ('DS', '3', "DVH Normalization Point", '', 'DVHNormalizationPoint'), 0x30040042: ('DS', '1', "DVH Normalization Dose Value", '', 'DVHNormalizationDoseValue'), 0x30040050: ('SQ', '1', "DVH Sequence", '', 'DVHSequence'), 0x30040052: ('DS', '1', "DVH Dose Scaling", '', 'DVHDoseScaling'), 0x30040054: ('CS', '1', "DVH Volume Units", '', 'DVHVolumeUnits'), 0x30040056: ('IS', '1', "DVH Number of Bins", '', 'DVHNumberOfBins'), 0x30040058: ('DS', '2-2n', "DVH Data", '', 'DVHData'), 0x30040060: ('SQ', '1', "DVH Referenced ROI Sequence", '', 'DVHReferencedROISequence'), 0x30040062: ('CS', '1', "DVH ROI Contribution Type", '', 'DVHROIContributionType'), 0x30040070: ('DS', '1', "DVH Minimum Dose", '', 'DVHMinimumDose'), 0x30040072: ('DS', '1', "DVH Maximum Dose", '', 'DVHMaximumDose'), 0x30040074: ('DS', '1', "DVH Mean Dose", '', 'DVHMeanDose'), 0x30060002: ('SH', '1', "Structure Set Label", '', 'StructureSetLabel'), 0x30060004: ('LO', '1', "Structure Set Name", '', 'StructureSetName'), 0x30060006: ('ST', '1', "Structure Set Description", '', 'StructureSetDescription'), 0x30060008: ('DA', '1', "Structure Set Date", '', 'StructureSetDate'), 0x30060009: ('TM', '1', "Structure Set Time", '', 'StructureSetTime'), 0x30060010: ('SQ', '1', "Referenced Frame of Reference Sequence", '', 'ReferencedFrameOfReferenceSequence'), 0x30060012: ('SQ', '1', "RT Referenced Study Sequence", '', 'RTReferencedStudySequence'), 0x30060014: ('SQ', '1', "RT Referenced Series Sequence", '', 'RTReferencedSeriesSequence'), 0x30060016: ('SQ', '1', "Contour Image Sequence", '', 'ContourImageSequence'), 0x30060020: ('SQ', '1', "Structure Set ROI Sequence", '', 'StructureSetROISequence'), 0x30060022: ('IS', '1', "ROI Number", '', 'ROINumber'), 0x30060024: ('UI', '1', "Referenced Frame of Reference UID", '', 'ReferencedFrameOfReferenceUID'), 0x30060026: ('LO', '1', "ROI Name", '', 'ROIName'), 0x30060028: ('ST', '1', "ROI Description", '', 'ROIDescription'), 0x3006002A: ('IS', '3', "ROI Display Color", '', 'ROIDisplayColor'), 0x3006002C: ('DS', '1', "ROI Volume", '', 'ROIVolume'), 0x30060030: ('SQ', '1', "RT Related ROI Sequence", '', 'RTRelatedROISequence'), 0x30060033: ('CS', '1', "RT ROI Relationship", '', 'RTROIRelationship'), 0x30060036: ('CS', '1', "ROI Generation Algorithm", '', 'ROIGenerationAlgorithm'), 0x30060038: ('LO', '1', "ROI Generation Description", '', 'ROIGenerationDescription'), 0x30060039: ('SQ', '1', "ROI Contour Sequence", '', 'ROIContourSequence'), 0x30060040: ('SQ', '1', "Contour Sequence", '', 'ContourSequence'), 0x30060042: ('CS', '1', "Contour Geometric Type", '', 'ContourGeometricType'), 0x30060044: ('DS', '1', "Contour Slab Thickness", '', 'ContourSlabThickness'), 0x30060045: ('DS', '3', "Contour Offset Vector", '', 'ContourOffsetVector'), 0x30060046: ('IS', '1', "Number of Contour Points", '', 'NumberOfContourPoints'), 0x30060048: ('IS', '1', "Contour Number", '', 'ContourNumber'), 0x30060049: ('IS', '1-n', "Attached Contours", '', 'AttachedContours'), 0x30060050: ('DS', '3-3n', "Contour Data", '', 'ContourData'), 0x30060080: ('SQ', '1', "RT ROI Observations Sequence", '', 'RTROIObservationsSequence'), 0x30060082: ('IS', '1', "Observation Number", '', 'ObservationNumber'), 0x30060084: ('IS', '1', "Referenced ROI Number", '', 'ReferencedROINumber'), 0x30060085: ('SH', '1', "ROI Observation Label", '', 'ROIObservationLabel'), 0x30060086: ('SQ', '1', "RT ROI Identification Code Sequence", '', 'RTROIIdentificationCodeSequence'), 0x30060088: ('ST', '1', "ROI Observation Description", '', 'ROIObservationDescription'), 0x300600A0: ('SQ', '1', "Related RT ROI Observations Sequence", '', 'RelatedRTROIObservationsSequence'), 0x300600A4: ('CS', '1', "RT ROI Interpreted Type", '', 'RTROIInterpretedType'), 0x300600A6: ('PN', '1', "ROI Interpreter", '', 'ROIInterpreter'), 0x300600B0: ('SQ', '1', "ROI Physical Properties Sequence", '', 'ROIPhysicalPropertiesSequence'), 0x300600B2: ('CS', '1', "ROI Physical Property", '', 'ROIPhysicalProperty'), 0x300600B4: ('DS', '1', "ROI Physical Property Value", '', 'ROIPhysicalPropertyValue'), 0x300600B6: ('SQ', '1', "ROI Elemental Composition Sequence", '', 'ROIElementalCompositionSequence'), 0x300600B7: ('US', '1', "ROI Elemental Composition Atomic Number", '', 'ROIElementalCompositionAtomicNumber'), 0x300600B8: ('FL', '1', "ROI Elemental Composition Atomic Mass Fraction", '', 'ROIElementalCompositionAtomicMassFraction'), 0x300600C0: ('SQ', '1', "Frame of Reference Relationship Sequence", '', 'FrameOfReferenceRelationshipSequence'), 0x300600C2: ('UI', '1', "Related Frame of Reference UID", '', 'RelatedFrameOfReferenceUID'), 0x300600C4: ('CS', '1', "Frame of Reference Transformation Type", '', 'FrameOfReferenceTransformationType'), 0x300600C6: ('DS', '16', "Frame of Reference Transformation Matrix", '', 'FrameOfReferenceTransformationMatrix'), 0x300600C8: ('LO', '1', "Frame of Reference Transformation Comment", '', 'FrameOfReferenceTransformationComment'), 0x30080010: ('SQ', '1', "Measured Dose Reference Sequence", '', 'MeasuredDoseReferenceSequence'), 0x30080012: ('ST', '1', "Measured Dose Description", '', 'MeasuredDoseDescription'), 0x30080014: ('CS', '1', "Measured Dose Type", '', 'MeasuredDoseType'), 0x30080016: ('DS', '1', "Measured Dose Value", '', 'MeasuredDoseValue'), 0x30080020: ('SQ', '1', "Treatment Session Beam Sequence", '', 'TreatmentSessionBeamSequence'), 0x30080021: ('SQ', '1', "Treatment Session Ion Beam Sequence", '', 'TreatmentSessionIonBeamSequence'), 0x30080022: ('IS', '1', "Current Fraction Number", '', 'CurrentFractionNumber'), 0x30080024: ('DA', '1', "Treatment Control Point Date", '', 'TreatmentControlPointDate'), 0x30080025: ('TM', '1', "Treatment Control Point Time", '', 'TreatmentControlPointTime'), 0x3008002A: ('CS', '1', "Treatment Termination Status", '', 'TreatmentTerminationStatus'), 0x3008002B: ('SH', '1', "Treatment Termination Code", '', 'TreatmentTerminationCode'), 0x3008002C: ('CS', '1', "Treatment Verification Status", '', 'TreatmentVerificationStatus'), 0x30080030: ('SQ', '1', "Referenced Treatment Record Sequence", '', 'ReferencedTreatmentRecordSequence'), 0x30080032: ('DS', '1', "Specified Primary Meterset", '', 'SpecifiedPrimaryMeterset'), 0x30080033: ('DS', '1', "Specified Secondary Meterset", '', 'SpecifiedSecondaryMeterset'), 0x30080036: ('DS', '1', "Delivered Primary Meterset", '', 'DeliveredPrimaryMeterset'), 0x30080037: ('DS', '1', "Delivered Secondary Meterset", '', 'DeliveredSecondaryMeterset'), 0x3008003A: ('DS', '1', "Specified Treatment Time", '', 'SpecifiedTreatmentTime'), 0x3008003B: ('DS', '1', "Delivered Treatment Time", '', 'DeliveredTreatmentTime'), 0x30080040: ('SQ', '1', "Control Point Delivery Sequence", '', 'ControlPointDeliverySequence'), 0x30080041: ('SQ', '1', "Ion Control Point Delivery Sequence", '', 'IonControlPointDeliverySequence'), 0x30080042: ('DS', '1', "Specified Meterset", '', 'SpecifiedMeterset'), 0x30080044: ('DS', '1', "Delivered Meterset", '', 'DeliveredMeterset'), 0x30080045: ('FL', '1', "Meterset Rate Set", '', 'MetersetRateSet'), 0x30080046: ('FL', '1', "Meterset Rate Delivered", '', 'MetersetRateDelivered'), 0x30080047: ('FL', '1-n', "Scan Spot Metersets Delivered", '', 'ScanSpotMetersetsDelivered'), 0x30080048: ('DS', '1', "Dose Rate Delivered", '', 'DoseRateDelivered'), 0x30080050: ('SQ', '1', "Treatment Summary Calculated Dose Reference Sequence", '', 'TreatmentSummaryCalculatedDoseReferenceSequence'), 0x30080052: ('DS', '1', "Cumulative Dose to Dose Reference", '', 'CumulativeDoseToDoseReference'), 0x30080054: ('DA', '1', "First Treatment Date", '', 'FirstTreatmentDate'), 0x30080056: ('DA', '1', "Most Recent Treatment Date", '', 'MostRecentTreatmentDate'), 0x3008005A: ('IS', '1', "Number of Fractions Delivered", '', 'NumberOfFractionsDelivered'), 0x30080060: ('SQ', '1', "Override Sequence", '', 'OverrideSequence'), 0x30080061: ('AT', '1', "Parameter Sequence Pointer", '', 'ParameterSequencePointer'), 0x30080062: ('AT', '1', "Override Parameter Pointer", '', 'OverrideParameterPointer'), 0x30080063: ('IS', '1', "Parameter Item Index", '', 'ParameterItemIndex'), 0x30080064: ('IS', '1', "Measured Dose Reference Number", '', 'MeasuredDoseReferenceNumber'), 0x30080065: ('AT', '1', "Parameter Pointer", '', 'ParameterPointer'), 0x30080066: ('ST', '1', "Override Reason", '', 'OverrideReason'), 0x30080068: ('SQ', '1', "Corrected Parameter Sequence", '', 'CorrectedParameterSequence'), 0x3008006A: ('FL', '1', "Correction Value", '', 'CorrectionValue'), 0x30080070: ('SQ', '1', "Calculated Dose Reference Sequence", '', 'CalculatedDoseReferenceSequence'), 0x30080072: ('IS', '1', "Calculated Dose Reference Number", '', 'CalculatedDoseReferenceNumber'), 0x30080074: ('ST', '1', "Calculated Dose Reference Description", '', 'CalculatedDoseReferenceDescription'), 0x30080076: ('DS', '1', "Calculated Dose Reference Dose Value", '', 'CalculatedDoseReferenceDoseValue'), 0x30080078: ('DS', '1', "Start Meterset", '', 'StartMeterset'), 0x3008007A: ('DS', '1', "End Meterset", '', 'EndMeterset'), 0x30080080: ('SQ', '1', "Referenced Measured Dose Reference Sequence", '', 'ReferencedMeasuredDoseReferenceSequence'), 0x30080082: ('IS', '1', "Referenced Measured Dose Reference Number", '', 'ReferencedMeasuredDoseReferenceNumber'), 0x30080090: ('SQ', '1', "Referenced Calculated Dose Reference Sequence", '', 'ReferencedCalculatedDoseReferenceSequence'), 0x30080092: ('IS', '1', "Referenced Calculated Dose Reference Number", '', 'ReferencedCalculatedDoseReferenceNumber'), 0x300800A0: ('SQ', '1', "Beam Limiting Device Leaf Pairs Sequence", '', 'BeamLimitingDeviceLeafPairsSequence'), 0x300800B0: ('SQ', '1', "Recorded Wedge Sequence", '', 'RecordedWedgeSequence'), 0x300800C0: ('SQ', '1', "Recorded Compensator Sequence", '', 'RecordedCompensatorSequence'), 0x300800D0: ('SQ', '1', "Recorded Block Sequence", '', 'RecordedBlockSequence'), 0x300800E0: ('SQ', '1', "Treatment Summary Measured Dose Reference Sequence", '', 'TreatmentSummaryMeasuredDoseReferenceSequence'), 0x300800F0: ('SQ', '1', "Recorded Snout Sequence", '', 'RecordedSnoutSequence'), 0x300800F2: ('SQ', '1', "Recorded Range Shifter Sequence", '', 'RecordedRangeShifterSequence'), 0x300800F4: ('SQ', '1', "Recorded Lateral Spreading Device Sequence", '', 'RecordedLateralSpreadingDeviceSequence'), 0x300800F6: ('SQ', '1', "Recorded Range Modulator Sequence", '', 'RecordedRangeModulatorSequence'), 0x30080100: ('SQ', '1', "Recorded Source Sequence", '', 'RecordedSourceSequence'), 0x30080105: ('LO', '1', "Source Serial Number", '', 'SourceSerialNumber'), 0x30080110: ('SQ', '1', "Treatment Session Application Setup Sequence", '', 'TreatmentSessionApplicationSetupSequence'), 0x30080116: ('CS', '1', "Application Setup Check", '', 'ApplicationSetupCheck'), 0x30080120: ('SQ', '1', "Recorded Brachy Accessory Device Sequence", '', 'RecordedBrachyAccessoryDeviceSequence'), 0x30080122: ('IS', '1', "Referenced Brachy Accessory Device Number", '', 'ReferencedBrachyAccessoryDeviceNumber'), 0x30080130: ('SQ', '1', "Recorded Channel Sequence", '', 'RecordedChannelSequence'), 0x30080132: ('DS', '1', "Specified Channel Total Time", '', 'SpecifiedChannelTotalTime'), 0x30080134: ('DS', '1', "Delivered Channel Total Time", '', 'DeliveredChannelTotalTime'), 0x30080136: ('IS', '1', "Specified Number of Pulses", '', 'SpecifiedNumberOfPulses'), 0x30080138: ('IS', '1', "Delivered Number of Pulses", '', 'DeliveredNumberOfPulses'), 0x3008013A: ('DS', '1', "Specified Pulse Repetition Interval", '', 'SpecifiedPulseRepetitionInterval'), 0x3008013C: ('DS', '1', "Delivered Pulse Repetition Interval", '', 'DeliveredPulseRepetitionInterval'), 0x30080140: ('SQ', '1', "Recorded Source Applicator Sequence", '', 'RecordedSourceApplicatorSequence'), 0x30080142: ('IS', '1', "Referenced Source Applicator Number", '', 'ReferencedSourceApplicatorNumber'), 0x30080150: ('SQ', '1', "Recorded Channel Shield Sequence", '', 'RecordedChannelShieldSequence'), 0x30080152: ('IS', '1', "Referenced Channel Shield Number", '', 'ReferencedChannelShieldNumber'), 0x30080160: ('SQ', '1', "Brachy Control Point Delivered Sequence", '', 'BrachyControlPointDeliveredSequence'), 0x30080162: ('DA', '1', "Safe Position Exit Date", '', 'SafePositionExitDate'), 0x30080164: ('TM', '1', "Safe Position Exit Time", '', 'SafePositionExitTime'), 0x30080166: ('DA', '1', "Safe Position Return Date", '', 'SafePositionReturnDate'), 0x30080168: ('TM', '1', "Safe Position Return Time", '', 'SafePositionReturnTime'), 0x30080200: ('CS', '1', "Current Treatment Status", '', 'CurrentTreatmentStatus'), 0x30080202: ('ST', '1', "Treatment Status Comment", '', 'TreatmentStatusComment'), 0x30080220: ('SQ', '1', "Fraction Group Summary Sequence", '', 'FractionGroupSummarySequence'), 0x30080223: ('IS', '1', "Referenced Fraction Number", '', 'ReferencedFractionNumber'), 0x30080224: ('CS', '1', "Fraction Group Type", '', 'FractionGroupType'), 0x30080230: ('CS', '1', "Beam Stopper Position", '', 'BeamStopperPosition'), 0x30080240: ('SQ', '1', "Fraction Status Summary Sequence", '', 'FractionStatusSummarySequence'), 0x30080250: ('DA', '1', "Treatment Date", '', 'TreatmentDate'), 0x30080251: ('TM', '1', "Treatment Time", '', 'TreatmentTime'), 0x300A0002: ('SH', '1', "RT Plan Label", '', 'RTPlanLabel'), 0x300A0003: ('LO', '1', "RT Plan Name", '', 'RTPlanName'), 0x300A0004: ('ST', '1', "RT Plan Description", '', 'RTPlanDescription'), 0x300A0006: ('DA', '1', "RT Plan Date", '', 'RTPlanDate'), 0x300A0007: ('TM', '1', "RT Plan Time", '', 'RTPlanTime'), 0x300A0009: ('LO', '1-n', "Treatment Protocols", '', 'TreatmentProtocols'), 0x300A000A: ('CS', '1', "Plan Intent", '', 'PlanIntent'), 0x300A000B: ('LO', '1-n', "Treatment Sites", '', 'TreatmentSites'), 0x300A000C: ('CS', '1', "RT Plan Geometry", '', 'RTPlanGeometry'), 0x300A000E: ('ST', '1', "Prescription Description", '', 'PrescriptionDescription'), 0x300A0010: ('SQ', '1', "Dose Reference Sequence", '', 'DoseReferenceSequence'), 0x300A0012: ('IS', '1', "Dose Reference Number", '', 'DoseReferenceNumber'), 0x300A0013: ('UI', '1', "Dose Reference UID", '', 'DoseReferenceUID'), 0x300A0014: ('CS', '1', "Dose Reference Structure Type", '', 'DoseReferenceStructureType'), 0x300A0015: ('CS', '1', "Nominal Beam Energy Unit", '', 'NominalBeamEnergyUnit'), 0x300A0016: ('LO', '1', "Dose Reference Description", '', 'DoseReferenceDescription'), 0x300A0018: ('DS', '3', "Dose Reference Point Coordinates", '', 'DoseReferencePointCoordinates'), 0x300A001A: ('DS', '1', "Nominal Prior Dose", '', 'NominalPriorDose'), 0x300A0020: ('CS', '1', "Dose Reference Type", '', 'DoseReferenceType'), 0x300A0021: ('DS', '1', "Constraint Weight", '', 'ConstraintWeight'), 0x300A0022: ('DS', '1', "Delivery Warning Dose", '', 'DeliveryWarningDose'), 0x300A0023: ('DS', '1', "Delivery Maximum Dose", '', 'DeliveryMaximumDose'), 0x300A0025: ('DS', '1', "Target Minimum Dose", '', 'TargetMinimumDose'), 0x300A0026: ('DS', '1', "Target Prescription Dose", '', 'TargetPrescriptionDose'), 0x300A0027: ('DS', '1', "Target Maximum Dose", '', 'TargetMaximumDose'), 0x300A0028: ('DS', '1', "Target Underdose Volume Fraction", '', 'TargetUnderdoseVolumeFraction'), 0x300A002A: ('DS', '1', "Organ at Risk Full-volume Dose", '', 'OrganAtRiskFullVolumeDose'), 0x300A002B: ('DS', '1', "Organ at Risk Limit Dose", '', 'OrganAtRiskLimitDose'), 0x300A002C: ('DS', '1', "Organ at Risk Maximum Dose", '', 'OrganAtRiskMaximumDose'), 0x300A002D: ('DS', '1', "Organ at Risk Overdose Volume Fraction", '', 'OrganAtRiskOverdoseVolumeFraction'), 0x300A0040: ('SQ', '1', "Tolerance Table Sequence", '', 'ToleranceTableSequence'), 0x300A0042: ('IS', '1', "Tolerance Table Number", '', 'ToleranceTableNumber'), 0x300A0043: ('SH', '1', "Tolerance Table Label", '', 'ToleranceTableLabel'), 0x300A0044: ('DS', '1', "Gantry Angle Tolerance", '', 'GantryAngleTolerance'), 0x300A0046: ('DS', '1', "Beam Limiting Device Angle Tolerance", '', 'BeamLimitingDeviceAngleTolerance'), 0x300A0048: ('SQ', '1', "Beam Limiting Device Tolerance Sequence", '', 'BeamLimitingDeviceToleranceSequence'), 0x300A004A: ('DS', '1', "Beam Limiting Device Position Tolerance", '', 'BeamLimitingDevicePositionTolerance'), 0x300A004B: ('FL', '1', "Snout Position Tolerance", '', 'SnoutPositionTolerance'), 0x300A004C: ('DS', '1', "Patient Support Angle Tolerance", '', 'PatientSupportAngleTolerance'), 0x300A004E: ('DS', '1', "Table Top Eccentric Angle Tolerance", '', 'TableTopEccentricAngleTolerance'), 0x300A004F: ('FL', '1', "Table Top Pitch Angle Tolerance", '', 'TableTopPitchAngleTolerance'), 0x300A0050: ('FL', '1', "Table Top Roll Angle Tolerance", '', 'TableTopRollAngleTolerance'), 0x300A0051: ('DS', '1', "Table Top Vertical Position Tolerance", '', 'TableTopVerticalPositionTolerance'), 0x300A0052: ('DS', '1', "Table Top Longitudinal Position Tolerance", '', 'TableTopLongitudinalPositionTolerance'), 0x300A0053: ('DS', '1', "Table Top Lateral Position Tolerance", '', 'TableTopLateralPositionTolerance'), 0x300A0055: ('CS', '1', "RT Plan Relationship", '', 'RTPlanRelationship'), 0x300A0070: ('SQ', '1', "Fraction Group Sequence", '', 'FractionGroupSequence'), 0x300A0071: ('IS', '1', "Fraction Group Number", '', 'FractionGroupNumber'), 0x300A0072: ('LO', '1', "Fraction Group Description", '', 'FractionGroupDescription'), 0x300A0078: ('IS', '1', "Number of Fractions Planned", '', 'NumberOfFractionsPlanned'), 0x300A0079: ('IS', '1', "Number of Fraction Pattern Digits Per Day", '', 'NumberOfFractionPatternDigitsPerDay'), 0x300A007A: ('IS', '1', "Repeat Fraction Cycle Length", '', 'RepeatFractionCycleLength'), 0x300A007B: ('LT', '1', "Fraction Pattern", '', 'FractionPattern'), 0x300A0080: ('IS', '1', "Number of Beams", '', 'NumberOfBeams'), 0x300A0082: ('DS', '3', "Beam Dose Specification Point", '', 'BeamDoseSpecificationPoint'), 0x300A0084: ('DS', '1', "Beam Dose", '', 'BeamDose'), 0x300A0086: ('DS', '1', "Beam Meterset", '', 'BeamMeterset'), 0x300A0088: ('FL', '1', "Beam Dose Point Depth", '', 'BeamDosePointDepth'), 0x300A0089: ('FL', '1', "Beam Dose Point Equivalent Depth", '', 'BeamDosePointEquivalentDepth'), 0x300A008A: ('FL', '1', "Beam Dose Point SSD", '', 'BeamDosePointSSD'), 0x300A00A0: ('IS', '1', "Number of Brachy Application Setups", '', 'NumberOfBrachyApplicationSetups'), 0x300A00A2: ('DS', '3', "Brachy Application Setup Dose Specification Point", '', 'BrachyApplicationSetupDoseSpecificationPoint'), 0x300A00A4: ('DS', '1', "Brachy Application Setup Dose", '', 'BrachyApplicationSetupDose'), 0x300A00B0: ('SQ', '1', "Beam Sequence", '', 'BeamSequence'), 0x300A00B2: ('SH', '1', "Treatment Machine Name", '', 'TreatmentMachineName'), 0x300A00B3: ('CS', '1', "Primary Dosimeter Unit", '', 'PrimaryDosimeterUnit'), 0x300A00B4: ('DS', '1', "Source-Axis Distance", '', 'SourceAxisDistance'), 0x300A00B6: ('SQ', '1', "Beam Limiting Device Sequence", '', 'BeamLimitingDeviceSequence'), 0x300A00B8: ('CS', '1', "RT Beam Limiting Device Type", '', 'RTBeamLimitingDeviceType'), 0x300A00BA: ('DS', '1', "Source to Beam Limiting Device Distance", '', 'SourceToBeamLimitingDeviceDistance'), 0x300A00BB: ('FL', '1', "Isocenter to Beam Limiting Device Distance", '', 'IsocenterToBeamLimitingDeviceDistance'), 0x300A00BC: ('IS', '1', "Number of Leaf/Jaw Pairs", '', 'NumberOfLeafJawPairs'), 0x300A00BE: ('DS', '3-n', "Leaf Position Boundaries", '', 'LeafPositionBoundaries'), 0x300A00C0: ('IS', '1', "Beam Number", '', 'BeamNumber'), 0x300A00C2: ('LO', '1', "Beam Name", '', 'BeamName'), 0x300A00C3: ('ST', '1', "Beam Description", '', 'BeamDescription'), 0x300A00C4: ('CS', '1', "Beam Type", '', 'BeamType'), 0x300A00C6: ('CS', '1', "Radiation Type", '', 'RadiationType'), 0x300A00C7: ('CS', '1', "High-Dose Technique Type", '', 'HighDoseTechniqueType'), 0x300A00C8: ('IS', '1', "Reference Image Number", '', 'ReferenceImageNumber'), 0x300A00CA: ('SQ', '1', "Planned Verification Image Sequence", '', 'PlannedVerificationImageSequence'), 0x300A00CC: ('LO', '1-n', "Imaging Device-Specific Acquisition Parameters", '', 'ImagingDeviceSpecificAcquisitionParameters'), 0x300A00CE: ('CS', '1', "Treatment Delivery Type", '', 'TreatmentDeliveryType'), 0x300A00D0: ('IS', '1', "Number of Wedges", '', 'NumberOfWedges'), 0x300A00D1: ('SQ', '1', "Wedge Sequence", '', 'WedgeSequence'), 0x300A00D2: ('IS', '1', "Wedge Number", '', 'WedgeNumber'), 0x300A00D3: ('CS', '1', "Wedge Type", '', 'WedgeType'), 0x300A00D4: ('SH', '1', "Wedge ID", '', 'WedgeID'), 0x300A00D5: ('IS', '1', "Wedge Angle", '', 'WedgeAngle'), 0x300A00D6: ('DS', '1', "Wedge Factor", '', 'WedgeFactor'), 0x300A00D7: ('FL', '1', "Total Wedge Tray Water-Equivalent Thickness", '', 'TotalWedgeTrayWaterEquivalentThickness'), 0x300A00D8: ('DS', '1', "Wedge Orientation", '', 'WedgeOrientation'), 0x300A00D9: ('FL', '1', "Isocenter to Wedge Tray Distance", '', 'IsocenterToWedgeTrayDistance'), 0x300A00DA: ('DS', '1', "Source to Wedge Tray Distance", '', 'SourceToWedgeTrayDistance'), 0x300A00DB: ('FL', '1', "Wedge Thin Edge Position", '', 'WedgeThinEdgePosition'), 0x300A00DC: ('SH', '1', "Bolus ID", '', 'BolusID'), 0x300A00DD: ('ST', '1', "Bolus Description", '', 'BolusDescription'), 0x300A00E0: ('IS', '1', "Number of Compensators", '', 'NumberOfCompensators'), 0x300A00E1: ('SH', '1', "Material ID", '', 'MaterialID'), 0x300A00E2: ('DS', '1', "Total Compensator Tray Factor", '', 'TotalCompensatorTrayFactor'), 0x300A00E3: ('SQ', '1', "Compensator Sequence", '', 'CompensatorSequence'), 0x300A00E4: ('IS', '1', "Compensator Number", '', 'CompensatorNumber'), 0x300A00E5: ('SH', '1', "Compensator ID", '', 'CompensatorID'), 0x300A00E6: ('DS', '1', "Source to Compensator Tray Distance", '', 'SourceToCompensatorTrayDistance'), 0x300A00E7: ('IS', '1', "Compensator Rows", '', 'CompensatorRows'), 0x300A00E8: ('IS', '1', "Compensator Columns", '', 'CompensatorColumns'), 0x300A00E9: ('DS', '2', "Compensator Pixel Spacing", '', 'CompensatorPixelSpacing'), 0x300A00EA: ('DS', '2', "Compensator Position", '', 'CompensatorPosition'), 0x300A00EB: ('DS', '1-n', "Compensator Transmission Data", '', 'CompensatorTransmissionData'), 0x300A00EC: ('DS', '1-n', "Compensator Thickness Data", '', 'CompensatorThicknessData'), 0x300A00ED: ('IS', '1', "Number of Boli", '', 'NumberOfBoli'), 0x300A00EE: ('CS', '1', "Compensator Type", '', 'CompensatorType'), 0x300A00F0: ('IS', '1', "Number of Blocks", '', 'NumberOfBlocks'), 0x300A00F2: ('DS', '1', "Total Block Tray Factor", '', 'TotalBlockTrayFactor'), 0x300A00F3: ('FL', '1', "Total Block Tray Water-Equivalent Thickness", '', 'TotalBlockTrayWaterEquivalentThickness'), 0x300A00F4: ('SQ', '1', "Block Sequence", '', 'BlockSequence'), 0x300A00F5: ('SH', '1', "Block Tray ID", '', 'BlockTrayID'), 0x300A00F6: ('DS', '1', "Source to Block Tray Distance", '', 'SourceToBlockTrayDistance'), 0x300A00F7: ('FL', '1', "Isocenter to Block Tray Distance", '', 'IsocenterToBlockTrayDistance'), 0x300A00F8: ('CS', '1', "Block Type", '', 'BlockType'), 0x300A00F9: ('LO', '1', "Accessory Code", '', 'AccessoryCode'), 0x300A00FA: ('CS', '1', "Block Divergence", '', 'BlockDivergence'), 0x300A00FB: ('CS', '1', "Block Mounting Position", '', 'BlockMountingPosition'), 0x300A00FC: ('IS', '1', "Block Number", '', 'BlockNumber'), 0x300A00FE: ('LO', '1', "Block Name", '', 'BlockName'), 0x300A0100: ('DS', '1', "Block Thickness", '', 'BlockThickness'), 0x300A0102: ('DS', '1', "Block Transmission", '', 'BlockTransmission'), 0x300A0104: ('IS', '1', "Block Number of Points", '', 'BlockNumberOfPoints'), 0x300A0106: ('DS', '2-2n', "Block Data", '', 'BlockData'), 0x300A0107: ('SQ', '1', "Applicator Sequence", '', 'ApplicatorSequence'), 0x300A0108: ('SH', '1', "Applicator ID", '', 'ApplicatorID'), 0x300A0109: ('CS', '1', "Applicator Type", '', 'ApplicatorType'), 0x300A010A: ('LO', '1', "Applicator Description", '', 'ApplicatorDescription'), 0x300A010C: ('DS', '1', "Cumulative Dose Reference Coefficient", '', 'CumulativeDoseReferenceCoefficient'), 0x300A010E: ('DS', '1', "Final Cumulative Meterset Weight", '', 'FinalCumulativeMetersetWeight'), 0x300A0110: ('IS', '1', "Number of Control Points", '', 'NumberOfControlPoints'), 0x300A0111: ('SQ', '1', "Control Point Sequence", '', 'ControlPointSequence'), 0x300A0112: ('IS', '1', "Control Point Index", '', 'ControlPointIndex'), 0x300A0114: ('DS', '1', "Nominal Beam Energy", '', 'NominalBeamEnergy'), 0x300A0115: ('DS', '1', "Dose Rate Set", '', 'DoseRateSet'), 0x300A0116: ('SQ', '1', "Wedge Position Sequence", '', 'WedgePositionSequence'), 0x300A0118: ('CS', '1', "Wedge Position", '', 'WedgePosition'), 0x300A011A: ('SQ', '1', "Beam Limiting Device Position Sequence", '', 'BeamLimitingDevicePositionSequence'), 0x300A011C: ('DS', '2-2n', "Leaf/Jaw Positions", '', 'LeafJawPositions'), 0x300A011E: ('DS', '1', "Gantry Angle", '', 'GantryAngle'), 0x300A011F: ('CS', '1', "Gantry Rotation Direction", '', 'GantryRotationDirection'), 0x300A0120: ('DS', '1', "Beam Limiting Device Angle", '', 'BeamLimitingDeviceAngle'), 0x300A0121: ('CS', '1', "Beam Limiting Device Rotation Direction", '', 'BeamLimitingDeviceRotationDirection'), 0x300A0122: ('DS', '1', "Patient Support Angle", '', 'PatientSupportAngle'), 0x300A0123: ('CS', '1', "Patient Support Rotation Direction", '', 'PatientSupportRotationDirection'), 0x300A0124: ('DS', '1', "Table Top Eccentric Axis Distance", '', 'TableTopEccentricAxisDistance'), 0x300A0125: ('DS', '1', "Table Top Eccentric Angle", '', 'TableTopEccentricAngle'), 0x300A0126: ('CS', '1', "Table Top Eccentric Rotation Direction", '', 'TableTopEccentricRotationDirection'), 0x300A0128: ('DS', '1', "Table Top Vertical Position", '', 'TableTopVerticalPosition'), 0x300A0129: ('DS', '1', "Table Top Longitudinal Position", '', 'TableTopLongitudinalPosition'), 0x300A012A: ('DS', '1', "Table Top Lateral Position", '', 'TableTopLateralPosition'), 0x300A012C: ('DS', '3', "Isocenter Position", '', 'IsocenterPosition'), 0x300A012E: ('DS', '3', "Surface Entry Point", '', 'SurfaceEntryPoint'), 0x300A0130: ('DS', '1', "Source to Surface Distance", '', 'SourceToSurfaceDistance'), 0x300A0134: ('DS', '1', "Cumulative Meterset Weight", '', 'CumulativeMetersetWeight'), 0x300A0140: ('FL', '1', "Table Top Pitch Angle", '', 'TableTopPitchAngle'), 0x300A0142: ('CS', '1', "Table Top Pitch Rotation Direction", '', 'TableTopPitchRotationDirection'), 0x300A0144: ('FL', '1', "Table Top Roll Angle", '', 'TableTopRollAngle'), 0x300A0146: ('CS', '1', "Table Top Roll Rotation Direction", '', 'TableTopRollRotationDirection'), 0x300A0148: ('FL', '1', "Head Fixation Angle", '', 'HeadFixationAngle'), 0x300A014A: ('FL', '1', "Gantry Pitch Angle", '', 'GantryPitchAngle'), 0x300A014C: ('CS', '1', "Gantry Pitch Rotation Direction", '', 'GantryPitchRotationDirection'), 0x300A014E: ('FL', '1', "Gantry Pitch Angle Tolerance", '', 'GantryPitchAngleTolerance'), 0x300A0180: ('SQ', '1', "Patient Setup Sequence", '', 'PatientSetupSequence'), 0x300A0182: ('IS', '1', "Patient Setup Number", '', 'PatientSetupNumber'), 0x300A0183: ('LO', '1', "Patient Setup Label", '', 'PatientSetupLabel'), 0x300A0184: ('LO', '1', "Patient Additional Position", '', 'PatientAdditionalPosition'), 0x300A0190: ('SQ', '1', "Fixation Device Sequence", '', 'FixationDeviceSequence'), 0x300A0192: ('CS', '1', "Fixation Device Type", '', 'FixationDeviceType'), 0x300A0194: ('SH', '1', "Fixation Device Label", '', 'FixationDeviceLabel'), 0x300A0196: ('ST', '1', "Fixation Device Description", '', 'FixationDeviceDescription'), 0x300A0198: ('SH', '1', "Fixation Device Position", '', 'FixationDevicePosition'), 0x300A0199: ('FL', '1', "Fixation Device Pitch Angle", '', 'FixationDevicePitchAngle'), 0x300A019A: ('FL', '1', "Fixation Device Roll Angle", '', 'FixationDeviceRollAngle'), 0x300A01A0: ('SQ', '1', "Shielding Device Sequence", '', 'ShieldingDeviceSequence'), 0x300A01A2: ('CS', '1', "Shielding Device Type", '', 'ShieldingDeviceType'), 0x300A01A4: ('SH', '1', "Shielding Device Label", '', 'ShieldingDeviceLabel'), 0x300A01A6: ('ST', '1', "Shielding Device Description", '', 'ShieldingDeviceDescription'), 0x300A01A8: ('SH', '1', "Shielding Device Position", '', 'ShieldingDevicePosition'), 0x300A01B0: ('CS', '1', "Setup Technique", '', 'SetupTechnique'), 0x300A01B2: ('ST', '1', "Setup Technique Description", '', 'SetupTechniqueDescription'), 0x300A01B4: ('SQ', '1', "Setup Device Sequence", '', 'SetupDeviceSequence'), 0x300A01B6: ('CS', '1', "Setup Device Type", '', 'SetupDeviceType'), 0x300A01B8: ('SH', '1', "Setup Device Label", '', 'SetupDeviceLabel'), 0x300A01BA: ('ST', '1', "Setup Device Description", '', 'SetupDeviceDescription'), 0x300A01BC: ('DS', '1', "Setup Device Parameter", '', 'SetupDeviceParameter'), 0x300A01D0: ('ST', '1', "Setup Reference Description", '', 'SetupReferenceDescription'), 0x300A01D2: ('DS', '1', "Table Top Vertical Setup Displacement", '', 'TableTopVerticalSetupDisplacement'), 0x300A01D4: ('DS', '1', "Table Top Longitudinal Setup Displacement", '', 'TableTopLongitudinalSetupDisplacement'), 0x300A01D6: ('DS', '1', "Table Top Lateral Setup Displacement", '', 'TableTopLateralSetupDisplacement'), 0x300A0200: ('CS', '1', "Brachy Treatment Technique", '', 'BrachyTreatmentTechnique'), 0x300A0202: ('CS', '1', "Brachy Treatment Type", '', 'BrachyTreatmentType'), 0x300A0206: ('SQ', '1', "Treatment Machine Sequence", '', 'TreatmentMachineSequence'), 0x300A0210: ('SQ', '1', "Source Sequence", '', 'SourceSequence'), 0x300A0212: ('IS', '1', "Source Number", '', 'SourceNumber'), 0x300A0214: ('CS', '1', "Source Type", '', 'SourceType'), 0x300A0216: ('LO', '1', "Source Manufacturer", '', 'SourceManufacturer'), 0x300A0218: ('DS', '1', "Active Source Diameter", '', 'ActiveSourceDiameter'), 0x300A021A: ('DS', '1', "Active Source Length", '', 'ActiveSourceLength'), 0x300A0222: ('DS', '1', "Source Encapsulation Nominal Thickness", '', 'SourceEncapsulationNominalThickness'), 0x300A0224: ('DS', '1', "Source Encapsulation Nominal Transmission", '', 'SourceEncapsulationNominalTransmission'), 0x300A0226: ('LO', '1', "Source Isotope Name", '', 'SourceIsotopeName'), 0x300A0228: ('DS', '1', "Source Isotope Half Life", '', 'SourceIsotopeHalfLife'), 0x300A0229: ('CS', '1', "Source Strength Units", '', 'SourceStrengthUnits'), 0x300A022A: ('DS', '1', "Reference Air Kerma Rate", '', 'ReferenceAirKermaRate'), 0x300A022B: ('DS', '1', "Source Strength", '', 'SourceStrength'), 0x300A022C: ('DA', '1', "Source Strength Reference Date", '', 'SourceStrengthReferenceDate'), 0x300A022E: ('TM', '1', "Source Strength Reference Time", '', 'SourceStrengthReferenceTime'), 0x300A0230: ('SQ', '1', "Application Setup Sequence", '', 'ApplicationSetupSequence'), 0x300A0232: ('CS', '1', "Application Setup Type", '', 'ApplicationSetupType'), 0x300A0234: ('IS', '1', "Application Setup Number", '', 'ApplicationSetupNumber'), 0x300A0236: ('LO', '1', "Application Setup Name", '', 'ApplicationSetupName'), 0x300A0238: ('LO', '1', "Application Setup Manufacturer", '', 'ApplicationSetupManufacturer'), 0x300A0240: ('IS', '1', "Template Number", '', 'TemplateNumber'), 0x300A0242: ('SH', '1', "Template Type", '', 'TemplateType'), 0x300A0244: ('LO', '1', "Template Name", '', 'TemplateName'), 0x300A0250: ('DS', '1', "Total Reference Air Kerma", '', 'TotalReferenceAirKerma'), 0x300A0260: ('SQ', '1', "Brachy Accessory Device Sequence", '', 'BrachyAccessoryDeviceSequence'), 0x300A0262: ('IS', '1', "Brachy Accessory Device Number", '', 'BrachyAccessoryDeviceNumber'), 0x300A0263: ('SH', '1', "Brachy Accessory Device ID", '', 'BrachyAccessoryDeviceID'), 0x300A0264: ('CS', '1', "Brachy Accessory Device Type", '', 'BrachyAccessoryDeviceType'), 0x300A0266: ('LO', '1', "Brachy Accessory Device Name", '', 'BrachyAccessoryDeviceName'), 0x300A026A: ('DS', '1', "Brachy Accessory Device Nominal Thickness", '', 'BrachyAccessoryDeviceNominalThickness'), 0x300A026C: ('DS', '1', "Brachy Accessory Device Nominal Transmission", '', 'BrachyAccessoryDeviceNominalTransmission'), 0x300A0280: ('SQ', '1', "Channel Sequence", '', 'ChannelSequence'), 0x300A0282: ('IS', '1', "Channel Number", '', 'ChannelNumber'), 0x300A0284: ('DS', '1', "Channel Length", '', 'ChannelLength'), 0x300A0286: ('DS', '1', "Channel Total Time", '', 'ChannelTotalTime'), 0x300A0288: ('CS', '1', "Source Movement Type", '', 'SourceMovementType'), 0x300A028A: ('IS', '1', "Number of Pulses", '', 'NumberOfPulses'), 0x300A028C: ('DS', '1', "Pulse Repetition Interval", '', 'PulseRepetitionInterval'), 0x300A0290: ('IS', '1', "Source Applicator Number", '', 'SourceApplicatorNumber'), 0x300A0291: ('SH', '1', "Source Applicator ID", '', 'SourceApplicatorID'), 0x300A0292: ('CS', '1', "Source Applicator Type", '', 'SourceApplicatorType'), 0x300A0294: ('LO', '1', "Source Applicator Name", '', 'SourceApplicatorName'), 0x300A0296: ('DS', '1', "Source Applicator Length", '', 'SourceApplicatorLength'), 0x300A0298: ('LO', '1', "Source Applicator Manufacturer", '', 'SourceApplicatorManufacturer'), 0x300A029C: ('DS', '1', "Source Applicator Wall Nominal Thickness", '', 'SourceApplicatorWallNominalThickness'), 0x300A029E: ('DS', '1', "Source Applicator Wall Nominal Transmission", '', 'SourceApplicatorWallNominalTransmission'), 0x300A02A0: ('DS', '1', "Source Applicator Step Size", '', 'SourceApplicatorStepSize'), 0x300A02A2: ('IS', '1', "Transfer Tube Number", '', 'TransferTubeNumber'), 0x300A02A4: ('DS', '1', "Transfer Tube Length", '', 'TransferTubeLength'), 0x300A02B0: ('SQ', '1', "Channel Shield Sequence", '', 'ChannelShieldSequence'), 0x300A02B2: ('IS', '1', "Channel Shield Number", '', 'ChannelShieldNumber'), 0x300A02B3: ('SH', '1', "Channel Shield ID", '', 'ChannelShieldID'), 0x300A02B4: ('LO', '1', "Channel Shield Name", '', 'ChannelShieldName'), 0x300A02B8: ('DS', '1', "Channel Shield Nominal Thickness", '', 'ChannelShieldNominalThickness'), 0x300A02BA: ('DS', '1', "Channel Shield Nominal Transmission", '', 'ChannelShieldNominalTransmission'), 0x300A02C8: ('DS', '1', "Final Cumulative Time Weight", '', 'FinalCumulativeTimeWeight'), 0x300A02D0: ('SQ', '1', "Brachy Control Point Sequence", '', 'BrachyControlPointSequence'), 0x300A02D2: ('DS', '1', "Control Point Relative Position", '', 'ControlPointRelativePosition'), 0x300A02D4: ('DS', '3', "Control Point 3D Position", '', 'ControlPoint3DPosition'), 0x300A02D6: ('DS', '1', "Cumulative Time Weight", '', 'CumulativeTimeWeight'), 0x300A02E0: ('CS', '1', "Compensator Divergence", '', 'CompensatorDivergence'), 0x300A02E1: ('CS', '1', "Compensator Mounting Position", '', 'CompensatorMountingPosition'), 0x300A02E2: ('DS', '1-n', "Source to Compensator Distance", '', 'SourceToCompensatorDistance'), 0x300A02E3: ('FL', '1', "Total Compensator Tray Water-Equivalent Thickness", '', 'TotalCompensatorTrayWaterEquivalentThickness'), 0x300A02E4: ('FL', '1', "Isocenter to Compensator Tray Distance", '', 'IsocenterToCompensatorTrayDistance'), 0x300A02E5: ('FL', '1', "Compensator Column Offset", '', 'CompensatorColumnOffset'), 0x300A02E6: ('FL', '1-n', "Isocenter to Compensator Distances", '', 'IsocenterToCompensatorDistances'), 0x300A02E7: ('FL', '1', "Compensator Relative Stopping Power Ratio", '', 'CompensatorRelativeStoppingPowerRatio'), 0x300A02E8: ('FL', '1', "Compensator Milling Tool Diameter", '', 'CompensatorMillingToolDiameter'), 0x300A02EA: ('SQ', '1', "Ion Range Compensator Sequence", '', 'IonRangeCompensatorSequence'), 0x300A02EB: ('LT', '1', "Compensator Description", '', 'CompensatorDescription'), 0x300A0302: ('IS', '1', "Radiation Mass Number", '', 'RadiationMassNumber'), 0x300A0304: ('IS', '1', "Radiation Atomic Number", '', 'RadiationAtomicNumber'), 0x300A0306: ('SS', '1', "Radiation Charge State", '', 'RadiationChargeState'), 0x300A0308: ('CS', '1', "Scan Mode", '', 'ScanMode'), 0x300A030A: ('FL', '2', "Virtual Source-Axis Distances", '', 'VirtualSourceAxisDistances'), 0x300A030C: ('SQ', '1', "Snout Sequence", '', 'SnoutSequence'), 0x300A030D: ('FL', '1', "Snout Position", '', 'SnoutPosition'), 0x300A030F: ('SH', '1', "Snout ID", '', 'SnoutID'), 0x300A0312: ('IS', '1', "Number of Range Shifters", '', 'NumberOfRangeShifters'), 0x300A0314: ('SQ', '1', "Range Shifter Sequence", '', 'RangeShifterSequence'), 0x300A0316: ('IS', '1', "Range Shifter Number", '', 'RangeShifterNumber'), 0x300A0318: ('SH', '1', "Range Shifter ID", '', 'RangeShifterID'), 0x300A0320: ('CS', '1', "Range Shifter Type", '', 'RangeShifterType'), 0x300A0322: ('LO', '1', "Range Shifter Description", '', 'RangeShifterDescription'), 0x300A0330: ('IS', '1', "Number of Lateral Spreading Devices", '', 'NumberOfLateralSpreadingDevices'), 0x300A0332: ('SQ', '1', "Lateral Spreading Device Sequence", '', 'LateralSpreadingDeviceSequence'), 0x300A0334: ('IS', '1', "Lateral Spreading Device Number", '', 'LateralSpreadingDeviceNumber'), 0x300A0336: ('SH', '1', "Lateral Spreading Device ID", '', 'LateralSpreadingDeviceID'), 0x300A0338: ('CS', '1', "Lateral Spreading Device Type", '', 'LateralSpreadingDeviceType'), 0x300A033A: ('LO', '1', "Lateral Spreading Device Description", '', 'LateralSpreadingDeviceDescription'), 0x300A033C: ('FL', '1', "Lateral Spreading Device Water Equivalent Thickness", '', 'LateralSpreadingDeviceWaterEquivalentThickness'), 0x300A0340: ('IS', '1', "Number of Range Modulators", '', 'NumberOfRangeModulators'), 0x300A0342: ('SQ', '1', "Range Modulator Sequence", '', 'RangeModulatorSequence'), 0x300A0344: ('IS', '1', "Range Modulator Number", '', 'RangeModulatorNumber'), 0x300A0346: ('SH', '1', "Range Modulator ID", '', 'RangeModulatorID'), 0x300A0348: ('CS', '1', "Range Modulator Type", '', 'RangeModulatorType'), 0x300A034A: ('LO', '1', "Range Modulator Description", '', 'RangeModulatorDescription'), 0x300A034C: ('SH', '1', "Beam Current Modulation ID", '', 'BeamCurrentModulationID'), 0x300A0350: ('CS', '1', "Patient Support Type", '', 'PatientSupportType'), 0x300A0352: ('SH', '1', "Patient Support ID", '', 'PatientSupportID'), 0x300A0354: ('LO', '1', "Patient Support Accessory Code", '', 'PatientSupportAccessoryCode'), 0x300A0356: ('FL', '1', "Fixation Light Azimuthal Angle", '', 'FixationLightAzimuthalAngle'), 0x300A0358: ('FL', '1', "Fixation Light Polar Angle", '', 'FixationLightPolarAngle'), 0x300A035A: ('FL', '1', "Meterset Rate", '', 'MetersetRate'), 0x300A0360: ('SQ', '1', "Range Shifter Settings Sequence", '', 'RangeShifterSettingsSequence'), 0x300A0362: ('LO', '1', "Range Shifter Setting", '', 'RangeShifterSetting'), 0x300A0364: ('FL', '1', "Isocenter to Range Shifter Distance", '', 'IsocenterToRangeShifterDistance'), 0x300A0366: ('FL', '1', "Range Shifter Water Equivalent Thickness", '', 'RangeShifterWaterEquivalentThickness'), 0x300A0370: ('SQ', '1', "Lateral Spreading Device Settings Sequence", '', 'LateralSpreadingDeviceSettingsSequence'), 0x300A0372: ('LO', '1', "Lateral Spreading Device Setting", '', 'LateralSpreadingDeviceSetting'), 0x300A0374: ('FL', '1', "Isocenter to Lateral Spreading Device Distance", '', 'IsocenterToLateralSpreadingDeviceDistance'), 0x300A0380: ('SQ', '1', "Range Modulator Settings Sequence", '', 'RangeModulatorSettingsSequence'), 0x300A0382: ('FL', '1', "Range Modulator Gating Start Value", '', 'RangeModulatorGatingStartValue'), 0x300A0384: ('FL', '1', "Range Modulator Gating Stop Value", '', 'RangeModulatorGatingStopValue'), 0x300A0386: ('FL', '1', "Range Modulator Gating Start Water Equivalent Thickness", '', 'RangeModulatorGatingStartWaterEquivalentThickness'), 0x300A0388: ('FL', '1', "Range Modulator Gating Stop Water Equivalent Thickness", '', 'RangeModulatorGatingStopWaterEquivalentThickness'), 0x300A038A: ('FL', '1', "Isocenter to Range Modulator Distance", '', 'IsocenterToRangeModulatorDistance'), 0x300A0390: ('SH', '1', "Scan Spot Tune ID", '', 'ScanSpotTuneID'), 0x300A0392: ('IS', '1', "Number of Scan Spot Positions", '', 'NumberOfScanSpotPositions'), 0x300A0394: ('FL', '1-n', "Scan Spot Position Map", '', 'ScanSpotPositionMap'), 0x300A0396: ('FL', '1-n', "Scan Spot Meterset Weights", '', 'ScanSpotMetersetWeights'), 0x300A0398: ('FL', '2', "Scanning Spot Size", '', 'ScanningSpotSize'), 0x300A039A: ('IS', '1', "Number of Paintings", '', 'NumberOfPaintings'), 0x300A03A0: ('SQ', '1', "Ion Tolerance Table Sequence", '', 'IonToleranceTableSequence'), 0x300A03A2: ('SQ', '1', "Ion Beam Sequence", '', 'IonBeamSequence'), 0x300A03A4: ('SQ', '1', "Ion Beam Limiting Device Sequence", '', 'IonBeamLimitingDeviceSequence'), 0x300A03A6: ('SQ', '1', "Ion Block Sequence", '', 'IonBlockSequence'), 0x300A03A8: ('SQ', '1', "Ion Control Point Sequence", '', 'IonControlPointSequence'), 0x300A03AA: ('SQ', '1', "Ion Wedge Sequence", '', 'IonWedgeSequence'), 0x300A03AC: ('SQ', '1', "Ion Wedge Position Sequence", '', 'IonWedgePositionSequence'), 0x300A0401: ('SQ', '1', "Referenced Setup Image Sequence", '', 'ReferencedSetupImageSequence'), 0x300A0402: ('ST', '1', "Setup Image Comment", '', 'SetupImageComment'), 0x300A0410: ('SQ', '1', "Motion Synchronization Sequence", '', 'MotionSynchronizationSequence'), 0x300A0412: ('FL', '3', "Control Point Orientation", '', 'ControlPointOrientation'), 0x300A0420: ('SQ', '1', "General Accessory Sequence", '', 'GeneralAccessorySequence'), 0x300A0421: ('SH', '1', "General Accessory ID", '', 'GeneralAccessoryID'), 0x300A0422: ('ST', '1', "General Accessory Description", '', 'GeneralAccessoryDescription'), 0x300A0423: ('CS', '1', "General Accessory Type", '', 'GeneralAccessoryType'), 0x300A0424: ('IS', '1', "General Accessory Number", '', 'GeneralAccessoryNumber'), 0x300A0431: ('SQ', '1', "Applicator Geometry Sequence", '', 'ApplicatorGeometrySequence'), 0x300A0432: ('CS', '1', "Applicator Aperture Shape", '', 'ApplicatorApertureShape'), 0x300A0433: ('FL', '1', "Applicator Opening", '', 'ApplicatorOpening'), 0x300A0434: ('FL', '1', "Applicator Opening X", '', 'ApplicatorOpeningX'), 0x300A0435: ('FL', '1', "Applicator Opening Y", '', 'ApplicatorOpeningY'), 0x300A0436: ('FL', '1', "Source to Applicator Mounting Position Distance", '', 'SourceToApplicatorMountingPositionDistance'), 0x300C0002: ('SQ', '1', "Referenced RT Plan Sequence", '', 'ReferencedRTPlanSequence'), 0x300C0004: ('SQ', '1', "Referenced Beam Sequence", '', 'ReferencedBeamSequence'), 0x300C0006: ('IS', '1', "Referenced Beam Number", '', 'ReferencedBeamNumber'), 0x300C0007: ('IS', '1', "Referenced Reference Image Number", '', 'ReferencedReferenceImageNumber'), 0x300C0008: ('DS', '1', "Start Cumulative Meterset Weight", '', 'StartCumulativeMetersetWeight'), 0x300C0009: ('DS', '1', "End Cumulative Meterset Weight", '', 'EndCumulativeMetersetWeight'), 0x300C000A: ('SQ', '1', "Referenced Brachy Application Setup Sequence", '', 'ReferencedBrachyApplicationSetupSequence'), 0x300C000C: ('IS', '1', "Referenced Brachy Application Setup Number", '', 'ReferencedBrachyApplicationSetupNumber'), 0x300C000E: ('IS', '1', "Referenced Source Number", '', 'ReferencedSourceNumber'), 0x300C0020: ('SQ', '1', "Referenced Fraction Group Sequence", '', 'ReferencedFractionGroupSequence'), 0x300C0022: ('IS', '1', "Referenced Fraction Group Number", '', 'ReferencedFractionGroupNumber'), 0x300C0040: ('SQ', '1', "Referenced Verification Image Sequence", '', 'ReferencedVerificationImageSequence'), 0x300C0042: ('SQ', '1', "Referenced Reference Image Sequence", '', 'ReferencedReferenceImageSequence'), 0x300C0050: ('SQ', '1', "Referenced Dose Reference Sequence", '', 'ReferencedDoseReferenceSequence'), 0x300C0051: ('IS', '1', "Referenced Dose Reference Number", '', 'ReferencedDoseReferenceNumber'), 0x300C0055: ('SQ', '1', "Brachy Referenced Dose Reference Sequence", '', 'BrachyReferencedDoseReferenceSequence'), 0x300C0060: ('SQ', '1', "Referenced Structure Set Sequence", '', 'ReferencedStructureSetSequence'), 0x300C006A: ('IS', '1', "Referenced Patient Setup Number", '', 'ReferencedPatientSetupNumber'), 0x300C0080: ('SQ', '1', "Referenced Dose Sequence", '', 'ReferencedDoseSequence'), 0x300C00A0: ('IS', '1', "Referenced Tolerance Table Number", '', 'ReferencedToleranceTableNumber'), 0x300C00B0: ('SQ', '1', "Referenced Bolus Sequence", '', 'ReferencedBolusSequence'), 0x300C00C0: ('IS', '1', "Referenced Wedge Number", '', 'ReferencedWedgeNumber'), 0x300C00D0: ('IS', '1', "Referenced Compensator Number", '', 'ReferencedCompensatorNumber'), 0x300C00E0: ('IS', '1', "Referenced Block Number", '', 'ReferencedBlockNumber'), 0x300C00F0: ('IS', '1', "Referenced Control Point Index", '', 'ReferencedControlPointIndex'), 0x300C00F2: ('SQ', '1', "Referenced Control Point Sequence", '', 'ReferencedControlPointSequence'), 0x300C00F4: ('IS', '1', "Referenced Start Control Point Index", '', 'ReferencedStartControlPointIndex'), 0x300C00F6: ('IS', '1', "Referenced Stop Control Point Index", '', 'ReferencedStopControlPointIndex'), 0x300C0100: ('IS', '1', "Referenced Range Shifter Number", '', 'ReferencedRangeShifterNumber'), 0x300C0102: ('IS', '1', "Referenced Lateral Spreading Device Number", '', 'ReferencedLateralSpreadingDeviceNumber'), 0x300C0104: ('IS', '1', "Referenced Range Modulator Number", '', 'ReferencedRangeModulatorNumber'), 0x300E0002: ('CS', '1', "Approval Status", '', 'ApprovalStatus'), 0x300E0004: ('DA', '1', "Review Date", '', 'ReviewDate'), 0x300E0005: ('TM', '1', "Review Time", '', 'ReviewTime'), 0x300E0008: ('PN', '1', "Reviewer Name", '', 'ReviewerName'), 0x40000010: ('LT', '1', "Arbitrary", 'Retired', 'Arbitrary'), 0x40004000: ('LT', '1', "Text Comments", 'Retired', 'TextComments'), 0x40080040: ('SH', '1', "Results ID", 'Retired', 'ResultsID'), 0x40080042: ('LO', '1', "Results ID Issuer", 'Retired', 'ResultsIDIssuer'), 0x40080050: ('SQ', '1', "Referenced Interpretation Sequence", 'Retired', 'ReferencedInterpretationSequence'), 0x400800FF: ('CS', '1', "Report Production Status (Trial)", 'Retired', 'ReportProductionStatusTrial'), 0x40080100: ('DA', '1', "Interpretation Recorded Date", 'Retired', 'InterpretationRecordedDate'), 0x40080101: ('TM', '1', "Interpretation Recorded Time", 'Retired', 'InterpretationRecordedTime'), 0x40080102: ('PN', '1', "Interpretation Recorder", 'Retired', 'InterpretationRecorder'), 0x40080103: ('LO', '1', "Reference to Recorded Sound", 'Retired', 'ReferenceToRecordedSound'), 0x40080108: ('DA', '1', "Interpretation Transcription Date", 'Retired', 'InterpretationTranscriptionDate'), 0x40080109: ('TM', '1', "Interpretation Transcription Time", 'Retired', 'InterpretationTranscriptionTime'), 0x4008010A: ('PN', '1', "Interpretation Transcriber", 'Retired', 'InterpretationTranscriber'), 0x4008010B: ('ST', '1', "Interpretation Text", 'Retired', 'InterpretationText'), 0x4008010C: ('PN', '1', "Interpretation Author", 'Retired', 'InterpretationAuthor'), 0x40080111: ('SQ', '1', "Interpretation Approver Sequence", 'Retired', 'InterpretationApproverSequence'), 0x40080112: ('DA', '1', "Interpretation Approval Date", 'Retired', 'InterpretationApprovalDate'), 0x40080113: ('TM', '1', "Interpretation Approval Time", 'Retired', 'InterpretationApprovalTime'), 0x40080114: ('PN', '1', "Physician Approving Interpretation", 'Retired', 'PhysicianApprovingInterpretation'), 0x40080115: ('LT', '1', "Interpretation Diagnosis Description", 'Retired', 'InterpretationDiagnosisDescription'), 0x40080117: ('SQ', '1', "Interpretation Diagnosis Code Sequence", 'Retired', 'InterpretationDiagnosisCodeSequence'), 0x40080118: ('SQ', '1', "Results Distribution List Sequence", 'Retired', 'ResultsDistributionListSequence'), 0x40080119: ('PN', '1', "Distribution Name", 'Retired', 'DistributionName'), 0x4008011A: ('LO', '1', "Distribution Address", 'Retired', 'DistributionAddress'), 0x40080200: ('SH', '1', "Interpretation ID", 'Retired', 'InterpretationID'), 0x40080202: ('LO', '1', "Interpretation ID Issuer", 'Retired', 'InterpretationIDIssuer'), 0x40080210: ('CS', '1', "Interpretation Type ID", 'Retired', 'InterpretationTypeID'), 0x40080212: ('CS', '1', "Interpretation Status ID", 'Retired', 'InterpretationStatusID'), 0x40080300: ('ST', '1', "Impressions", 'Retired', 'Impressions'), 0x40084000: ('ST', '1', "Results Comments", 'Retired', 'ResultsComments'), 0x40100001: ('CS', '1', "Low Energy Detectors", '', 'LowEnergyDetectors'), 0x40100002: ('CS', '1', "High Energy Detectors", '', 'HighEnergyDetectors'), 0x40100004: ('SQ', '1', "Detector Geometry Sequence", '', 'DetectorGeometrySequence'), 0x40101001: ('SQ', '1', "Threat ROI Voxel Sequence", '', 'ThreatROIVoxelSequence'), 0x40101004: ('FL', '3', "Threat ROI Base", '', 'ThreatROIBase'), 0x40101005: ('FL', '3', "Threat ROI Extents", '', 'ThreatROIExtents'), 0x40101006: ('OB', '1', "Threat ROI Bitmap", '', 'ThreatROIBitmap'), 0x40101007: ('SH', '1', "Route Segment ID", '', 'RouteSegmentID'), 0x40101008: ('CS', '1', "Gantry Type", '', 'GantryType'), 0x40101009: ('CS', '1', "OOI Owner Type", '', 'OOIOwnerType'), 0x4010100A: ('SQ', '1', "Route Segment Sequence", '', 'RouteSegmentSequence'), 0x40101010: ('US', '1', "Potential Threat Object ID", '', 'PotentialThreatObjectID'), 0x40101011: ('SQ', '1', "Threat Sequence", '', 'ThreatSequence'), 0x40101012: ('CS', '1', "Threat Category", '', 'ThreatCategory'), 0x40101013: ('LT', '1', "Threat Category Description", '', 'ThreatCategoryDescription'), 0x40101014: ('CS', '1', "ATD Ability Assessment", '', 'ATDAbilityAssessment'), 0x40101015: ('CS', '1', "ATD Assessment Flag", '', 'ATDAssessmentFlag'), 0x40101016: ('FL', '1', "ATD Assessment Probability", '', 'ATDAssessmentProbability'), 0x40101017: ('FL', '1', "Mass", '', 'Mass'), 0x40101018: ('FL', '1', "Density", '', 'Density'), 0x40101019: ('FL', '1', "Z Effective", '', 'ZEffective'), 0x4010101A: ('SH', '1', "Boarding Pass ID", '', 'BoardingPassID'), 0x4010101B: ('FL', '3', "Center of Mass", '', 'CenterOfMass'), 0x4010101C: ('FL', '3', "Center of PTO", '', 'CenterOfPTO'), 0x4010101D: ('FL', '6-n', "Bounding Polygon", '', 'BoundingPolygon'), 0x4010101E: ('SH', '1', "Route Segment Start Location ID", '', 'RouteSegmentStartLocationID'), 0x4010101F: ('SH', '1', "Route Segment End Location ID", '', 'RouteSegmentEndLocationID'), 0x40101020: ('CS', '1', "Route Segment Location ID Type", '', 'RouteSegmentLocationIDType'), 0x40101021: ('CS', '1-n', "Abort Reason", '', 'AbortReason'), 0x40101023: ('FL', '1', "Volume of PTO", '', 'VolumeOfPTO'), 0x40101024: ('CS', '1', "Abort Flag", '', 'AbortFlag'), 0x40101025: ('DT', '1', "Route Segment Start Time", '', 'RouteSegmentStartTime'), 0x40101026: ('DT', '1', "Route Segment End Time", '', 'RouteSegmentEndTime'), 0x40101027: ('CS', '1', "TDR Type", '', 'TDRType'), 0x40101028: ('CS', '1', "International Route Segment", '', 'InternationalRouteSegment'), 0x40101029: ('LO', '1-n', "Threat Detection Algorithm and Version", '', 'ThreatDetectionAlgorithmandVersion'), 0x4010102A: ('SH', '1', "Assigned Location", '', 'AssignedLocation'), 0x4010102B: ('DT', '1', "Alarm Decision Time", '', 'AlarmDecisionTime'), 0x40101031: ('CS', '1', "Alarm Decision", '', 'AlarmDecision'), 0x40101033: ('US', '1', "Number of Total Objects", '', 'NumberOfTotalObjects'), 0x40101034: ('US', '1', "Number of Alarm Objects", '', 'NumberOfAlarmObjects'), 0x40101037: ('SQ', '1', "PTO Representation Sequence", '', 'PTORepresentationSequence'), 0x40101038: ('SQ', '1', "ATD Assessment Sequence", '', 'ATDAssessmentSequence'), 0x40101039: ('CS', '1', "TIP Type", '', 'TIPType'), 0x4010103A: ('CS', '1', "DICOS Version", '', 'DICOSVersion'), 0x40101041: ('DT', '1', "OOI Owner Creation Time", '', 'OOIOwnerCreationTime'), 0x40101042: ('CS', '1', "OOI Type", '', 'OOIType'), 0x40101043: ('FL', '3', "OOI Size", '', 'OOISize'), 0x40101044: ('CS', '1', "Acquisition Status", '', 'AcquisitionStatus'), 0x40101045: ('SQ', '1', "Basis Materials Code Sequence", '', 'BasisMaterialsCodeSequence'), 0x40101046: ('CS', '1', "Phantom Type", '', 'PhantomType'), 0x40101047: ('SQ', '1', "OOI Owner Sequence", '', 'OOIOwnerSequence'), 0x40101048: ('CS', '1', "Scan Type", '', 'ScanType'), 0x40101051: ('LO', '1', "Itinerary ID", '', 'ItineraryID'), 0x40101052: ('SH', '1', "Itinerary ID Type", '', 'ItineraryIDType'), 0x40101053: ('LO', '1', "Itinerary ID Assigning Authority", '', 'ItineraryIDAssigningAuthority'), 0x40101054: ('SH', '1', "Route ID", '', 'RouteID'), 0x40101055: ('SH', '1', "Route ID Assigning Authority", '', 'RouteIDAssigningAuthority'), 0x40101056: ('CS', '1', "Inbound Arrival Type", '', 'InboundArrivalType'), 0x40101058: ('SH', '1', "Carrier ID", '', 'CarrierID'), 0x40101059: ('CS', '1', "Carrier ID Assigning Authority", '', 'CarrierIDAssigningAuthority'), 0x40101060: ('FL', '3', "Source Orientation", '', 'SourceOrientation'), 0x40101061: ('FL', '3', "Source Position", '', 'SourcePosition'), 0x40101062: ('FL', '1', "Belt Height", '', 'BeltHeight'), 0x40101064: ('SQ', '1', "Algorithm Routing Code Sequence", '', 'AlgorithmRoutingCodeSequence'), 0x40101067: ('CS', '1', "Transport Classification", '', 'TransportClassification'), 0x40101068: ('LT', '1', "OOI Type Descriptor", '', 'OOITypeDescriptor'), 0x40101069: ('FL', '1', "Total Processing Time", '', 'TotalProcessingTime'), 0x4010106C: ('OB', '1', "Detector Calibration Data", '', 'DetectorCalibrationData'), 0x4FFE0001: ('SQ', '1', "MAC Parameters Sequence", '', 'MACParametersSequence'), 0x52009229: ('SQ', '1', "Shared Functional Groups Sequence", '', 'SharedFunctionalGroupsSequence'), 0x52009230: ('SQ', '1', "Per-frame Functional Groups Sequence", '', 'PerFrameFunctionalGroupsSequence'), 0x54000100: ('SQ', '1', "Waveform Sequence", '', 'WaveformSequence'), 0x54000110: ('OB or OW', '1', "Channel Minimum Value", '', 'ChannelMinimumValue'), 0x54000112: ('OB or OW', '1', "Channel Maximum Value", '', 'ChannelMaximumValue'), 0x54001004: ('US', '1', "Waveform Bits Allocated", '', 'WaveformBitsAllocated'), 0x54001006: ('CS', '1', "Waveform Sample Interpretation", '', 'WaveformSampleInterpretation'), 0x5400100A: ('OB or OW', '1', "Waveform Padding Value", '', 'WaveformPaddingValue'), 0x54001010: ('OB or OW', '1', "Waveform Data", '', 'WaveformData'), 0x56000010: ('OF', '1', "First Order Phase Correction Angle", '', 'FirstOrderPhaseCorrectionAngle'), 0x56000020: ('OF', '1', "Spectroscopy Data", '', 'SpectroscopyData'), 0x7FE00010: ('OW or OB', '1', "Pixel Data", '', 'PixelData'), 0x7FE00020: ('OW', '1', "Coefficients SDVN", 'Retired', 'CoefficientsSDVN'), 0x7FE00030: ('OW', '1', "Coefficients SDHN", 'Retired', 'CoefficientsSDHN'), 0x7FE00040: ('OW', '1', "Coefficients SDDN", 'Retired', 'CoefficientsSDDN'), 0xFFFAFFFA: ('SQ', '1', "Digital Signatures Sequence", '', 'DigitalSignaturesSequence'), 0xFFFCFFFC: ('OB', '1', "Data Set Trailing Padding", '', 'DataSetTrailingPadding'), 0xFFFEE000: ('NONE', '1', "Item", '', 'Item'), 0xFFFEE00D: ('NONE', '1', "Item Delimitation Item", '', 'ItemDelimitationItem'), 0xFFFEE0DD: ('NONE', '1', "Sequence Delimitation Item", '', 'SequenceDelimitationItem')} RepeatersDictionary = { '002031xx': ('CS', '1-n', "Source Image IDs", 'Retired', 'SourceImageIDs'), '002804x0': ('US', '1', "Rows For Nth Order Coefficients", 'Retired', 'RowsForNthOrderCoefficients'), '002804x1': ('US', '1', "Columns For Nth Order Coefficients", 'Retired', 'ColumnsForNthOrderCoefficients'), '002804x2': ('LO', '1-n', "Coefficient Coding", 'Retired', 'CoefficientCoding'), '002804x3': ('AT', '1-n', "Coefficient Coding Pointers", 'Retired', 'CoefficientCodingPointers'), '002808x0': ('CS', '1-n', "Code Label", 'Retired', 'CodeLabel'), '002808x2': ('US', '1', "Number of Tables", 'Retired', 'NumberOfTables'), '002808x3': ('AT', '1-n', "Code Table Location", 'Retired', 'CodeTableLocation'), '002808x4': ('US', '1', "Bits For Code Word", 'Retired', 'BitsForCodeWord'), '002808x8': ('AT', '1-n', "Image Data Location", 'Retired', 'ImageDataLocation'), '1000xxx0': ('US', '3', "Escape Triplet", 'Retired', 'EscapeTriplet'), '1000xxx1': ('US', '3', "Run Length Triplet", 'Retired', 'RunLengthTriplet'), '1000xxx2': ('US', '1', "Huffman Table Size", 'Retired', 'HuffmanTableSize'), '1000xxx3': ('US', '3', "Huffman Table Triplet", 'Retired', 'HuffmanTableTriplet'), '1000xxx4': ('US', '1', "Shift Table Size", 'Retired', 'ShiftTableSize'), '1000xxx5': ('US', '3', "Shift Table Triplet", 'Retired', 'ShiftTableTriplet'), '1010xxxx': ('US', '1-n', "Zonal Map", 'Retired', 'ZonalMap'), '50xx0005': ('US', '1', "Curve Dimensions", 'Retired', 'CurveDimensions'), '50xx0010': ('US', '1', "Number of Points", 'Retired', 'NumberOfPoints'), '50xx0020': ('CS', '1', "Type of Data", 'Retired', 'TypeOfData'), '50xx0022': ('LO', '1', "Curve Description", 'Retired', 'CurveDescription'), '50xx0030': ('SH', '1-n', "Axis Units", 'Retired', 'AxisUnits'), '50xx0040': ('SH', '1-n', "Axis Labels", 'Retired', 'AxisLabels'), '50xx0103': ('US', '1', "Data Value Representation", 'Retired', 'DataValueRepresentation'), '50xx0104': ('US', '1-n', "Minimum Coordinate Value", 'Retired', 'MinimumCoordinateValue'), '50xx0105': ('US', '1-n', "Maximum Coordinate Value", 'Retired', 'MaximumCoordinateValue'), '50xx0106': ('SH', '1-n', "Curve Range", 'Retired', 'CurveRange'), '50xx0110': ('US', '1-n', "Curve Data Descriptor", 'Retired', 'CurveDataDescriptor'), '50xx0112': ('US', '1-n', "Coordinate Start Value", 'Retired', 'CoordinateStartValue'), '50xx0114': ('US', '1-n', "Coordinate Step Value", 'Retired', 'CoordinateStepValue'), '50xx1001': ('CS', '1', "Curve Activation Layer", 'Retired', 'CurveActivationLayer'), '50xx2000': ('US', '1', "Audio Type", 'Retired', 'AudioType'), '50xx2002': ('US', '1', "Audio Sample Format", 'Retired', 'AudioSampleFormat'), '50xx2004': ('US', '1', "Number of Channels", 'Retired', 'NumberOfChannels'), '50xx2006': ('UL', '1', "Number of Samples", 'Retired', 'NumberOfSamples'), '50xx2008': ('UL', '1', "Sample Rate", 'Retired', 'SampleRate'), '50xx200A': ('UL', '1', "Total Time", 'Retired', 'TotalTime'), '50xx200C': ('OW or OB', '1', "Audio Sample Data", 'Retired', 'AudioSampleData'), '50xx200E': ('LT', '1', "Audio Comments", 'Retired', 'AudioComments'), '50xx2500': ('LO', '1', "Curve Label", 'Retired', 'CurveLabel'), '50xx2600': ('SQ', '1', "Curve Referenced Overlay Sequence", 'Retired', 'CurveReferencedOverlaySequence'), '50xx2610': ('US', '1', "Curve Referenced Overlay Group", 'Retired', 'CurveReferencedOverlayGroup'), '50xx3000': ('OW or OB', '1', "Curve Data", 'Retired', 'CurveData'), '60xx0010': ('US', '1', "Overlay Rows", '', 'OverlayRows'), '60xx0011': ('US', '1', "Overlay Columns", '', 'OverlayColumns'), '60xx0012': ('US', '1', "Overlay Planes", 'Retired', 'OverlayPlanes'), '60xx0015': ('IS', '1', "Number of Frames in Overlay", '', 'NumberOfFramesInOverlay'), '60xx0022': ('LO', '1', "Overlay Description", '', 'OverlayDescription'), '60xx0040': ('CS', '1', "Overlay Type", '', 'OverlayType'), '60xx0045': ('LO', '1', "Overlay Subtype", '', 'OverlaySubtype'), '60xx0050': ('SS', '2', "Overlay Origin", '', 'OverlayOrigin'), '60xx0051': ('US', '1', "Image Frame Origin", '', 'ImageFrameOrigin'), '60xx0052': ('US', '1', "Overlay Plane Origin", 'Retired', 'OverlayPlaneOrigin'), '60xx0060': ('CS', '1', "Overlay Compression Code", 'Retired', 'OverlayCompressionCode'), '60xx0061': ('SH', '1', "Overlay Compression Originator", 'Retired', 'OverlayCompressionOriginator'), '60xx0062': ('SH', '1', "Overlay Compression Label", 'Retired', 'OverlayCompressionLabel'), '60xx0063': ('CS', '1', "Overlay Compression Description", 'Retired', 'OverlayCompressionDescription'), '60xx0066': ('AT', '1-n', "Overlay Compression Step Pointers", 'Retired', 'OverlayCompressionStepPointers'), '60xx0068': ('US', '1', "Overlay Repeat Interval", 'Retired', 'OverlayRepeatInterval'), '60xx0069': ('US', '1', "Overlay Bits Grouped", 'Retired', 'OverlayBitsGrouped'), '60xx0100': ('US', '1', "Overlay Bits Allocated", '', 'OverlayBitsAllocated'), '60xx0102': ('US', '1', "Overlay Bit Position", '', 'OverlayBitPosition'), '60xx0110': ('CS', '1', "Overlay Format", 'Retired', 'OverlayFormat'), '60xx0200': ('US', '1', "Overlay Location", 'Retired', 'OverlayLocation'), '60xx0800': ('CS', '1-n', "Overlay Code Label", 'Retired', 'OverlayCodeLabel'), '60xx0802': ('US', '1', "Overlay Number of Tables", 'Retired', 'OverlayNumberOfTables'), '60xx0803': ('AT', '1-n', "Overlay Code Table Location", 'Retired', 'OverlayCodeTableLocation'), '60xx0804': ('US', '1', "Overlay Bits For Code Word", 'Retired', 'OverlayBitsForCodeWord'), '60xx1001': ('CS', '1', "Overlay Activation Layer", '', 'OverlayActivationLayer'), '60xx1100': ('US', '1', "Overlay Descriptor - Gray", 'Retired', 'OverlayDescriptorGray'), '60xx1101': ('US', '1', "Overlay Descriptor - Red", 'Retired', 'OverlayDescriptorRed'), '60xx1102': ('US', '1', "Overlay Descriptor - Green", 'Retired', 'OverlayDescriptorGreen'), '60xx1103': ('US', '1', "Overlay Descriptor - Blue", 'Retired', 'OverlayDescriptorBlue'), '60xx1200': ('US', '1-n', "Overlays - Gray", 'Retired', 'OverlaysGray'), '60xx1201': ('US', '1-n', "Overlays - Red", 'Retired', 'OverlaysRed'), '60xx1202': ('US', '1-n', "Overlays - Green", 'Retired', 'OverlaysGreen'), '60xx1203': ('US', '1-n', "Overlays - Blue", 'Retired', 'OverlaysBlue'), '60xx1301': ('IS', '1', "ROI Area", '', 'ROIArea'), '60xx1302': ('DS', '1', "ROI Mean", '', 'ROIMean'), '60xx1303': ('DS', '1', "ROI Standard Deviation", '', 'ROIStandardDeviation'), '60xx1500': ('LO', '1', "Overlay Label", '', 'OverlayLabel'), '60xx3000': ('OB or OW', '1', "Overlay Data", '', 'OverlayData'), '60xx4000': ('LT', '1', "Overlay Comments", 'Retired', 'OverlayComments'), '7Fxx0010': ('OW or OB', '1', "Variable Pixel Data", 'Retired', 'VariablePixelData'), '7Fxx0011': ('US', '1', "Variable Next Data Group", 'Retired', 'VariableNextDataGroup'), '7Fxx0020': ('OW', '1', "Variable Coefficients SDVN", 'Retired', 'VariableCoefficientsSDVN'), '7Fxx0030': ('OW', '1', "Variable Coefficients SDHN", 'Retired', 'VariableCoefficientsSDHN'), '7Fxx0040': ('OW', '1', "Variable Coefficients SDDN", 'Retired', 'VariableCoefficientsSDDN')} pydicom-0.9.7/dicom/_private_dict.py000644 000765 000024 00003123316 11726534363 017744 0ustar00darcystaff000000 000000 # _private_dict.py # This file is autogenerated by "make_private_dict_alt.py", # from private elements list maintained by the GDCM project # (http://gdcm.svn.sf.net/viewvc/gdcm/trunk/Source/DataDictionary/privatedicts.xml). # Downloaded on 2010-01-22. # See the license.txt file for license information on pydicom, and GDCM. # This is a dictionary of DICOM dictionaries. # The outer dictionary key is the Private Creator name ("owner"), # the inner dictionary is a map of DICOM tag to # (VR, type, name, is_retired) private_dictionaries = \ {'1.2.840.113663.1': {'0029xx00': ('US', '1', 'Unknown', ''), '0029xx01': ('US', '1', 'Unknown', '')}, '1.2.840.113681': {'0019xx10': ('ST', '1', 'CR Image Params Common', ''), '0019xx11': ('ST', '1', 'CR Image IP Params Single', ''), '0019xx12': ('ST', '1', 'CR Image IP Params Left', ''), '0019xx13': ('ST', '1', 'CR Image IP Params Right', '')}, '1.2.840.113708.794.1.1.2.0': {'0087xx10': ('CS', '1', 'Media Type', ''), '0087xx20': ('CS', '1', 'Media Location', ''), '0087xx30': ('ST', '1', 'Storage File ID', ''), '0087xx40': ('DS', '1', 'Study or Image Size in MB', ''), '0087xx50': ('IS', '1', 'Estimated Retrieve Time', '')}, '2.16.840.1.114059.1.1.6.1.50.1': {'0029xx20': ('LT', '1', 'Description', ''), '0029xx21': ('ST', '1', 'Orientation', ''), '0029xx22': ('ST', '1', 'Parameter 1', ''), '0029xx23': ('ST', '1', 'Parameter 2', ''), '0029xx24': ('LO', '1', 'Teeth', ''), '0029xx25': ('LO', '1', 'Jaw', ''), '0029xx26': ('LO', '1', 'Quadrant', ''), '0029xx27': ('LO', '1', 'CRC', '')}, 'A.L.I. Technologies, Inc.': {'3711xx01': ('LO', '1', 'Filename', ''), '3711xx02': ('OB', '1', 'Data Blob of a Visit', ''), '3711xx03': ('US', '1', 'Revision Number', ''), '3711xx04': ('UL', '1', 'Unix Timestamp', ''), '3711xx05': ('IS', '1', 'Bag ID', ''), '3711xx0c': ('UI', '1', 'Original Study UID', ''), '3711xx0d': ('US', '1', 'Overlay Grayscale Value', ''), '3711xx0e': ('CS', '1', 'Anonymization Status', '')}, 'ACUSON': {'0009xx00': ('IS', '1', 'Unknown', ''), '0009xx01': ('IS', '1', 'Unknown', ''), '0009xx02': ('UN', '1', 'Unknown', ''), '0009xx03': ('UN', '1', 'Unknown', ''), '0009xx04': ('UN', '1', 'Unknown', ''), '0009xx05': ('UN', '1', 'Unknown', ''), '0009xx06': ('UN', '1', 'Unknown', ''), '0009xx07': ('UN', '1', 'Unknown', ''), '0009xx08': ('LT', '1', 'Unknown', ''), '0009xx09': ('LT', '1', 'Unknown', ''), '0009xx0a': ('IS', '1', 'Unknown', ''), '0009xx0b': ('IS', '1', 'Unknown', ''), '0009xx0c': ('IS', '1', 'Unknown', ''), '0009xx0d': ('IS', '1', 'Unknown', ''), '0009xx0e': ('IS', '1', 'Unknown', ''), '0009xx0f': ('UN', '1', 'Unknown', ''), '0009xx10': ('IS', '1', 'Unknown', ''), '0009xx11': ('UN', '1', 'Unknown', ''), '0009xx12': ('IS', '1', 'Unknown', ''), '0009xx13': ('IS', '1', 'Unknown', ''), '0009xx14': ('LT', '1', 'Unknown', ''), '0009xx15': ('UN', '1', 'Unknown', '')}, 'ACUSON: 1.2.840.11386.1.0': {'7fdfxx00': ('IS', '1', 'Lossy Compression Ratio', ''), '7fdfxx01': ('US', '1', 'Image Format', ''), '7fdfxx02': ('US', '1', 'Acuson Region Type', ''), '7fdfxx0b': ('UL', '1', 'Acuson Image Apex X', ''), '7fdfxx0c': ('UL', '1', 'Acuson Image Apex Y', ''), '7fdfxx0d': ('IS', '1', 'B-Color-On Flag', '')}, 'ACUSON:1.2.840.113680.1.0:0921': {'0009xx20': ('UN', '1', 'View Name', ''), '0009xx2a': ('UN', '1', 'View List', '')}, 'ACUSON:1.2.840.113680.1.0:7f10': {'7fdfxx00': ('UN', '1', 'Lossy Compression Ratio', ''), '7fdfxx01': ('UN', '1', 'Image Format', ''), '7fdfxx02': ('UN', '1', 'Acuson Region Type', ''), '7fdfxx0b': ('UN', '1', 'Acuson Image Apex X', ''), '7fdfxx0c': ('UN', '1', 'Acuson Image Apex Y', ''), '7fdfxx0d': ('UN', '1', 'B-Color-On Flag', ''), '7fdfxx0e': ('UN', '1', 'Acuson Mechanical Apex X', ''), '7fdfxx0f': ('UN', '1', 'Acuson Mechanical Apex Y', ''), '7fdfxx10': ('UN', '1', 'Acquisition Type:', ''), '7fdfxx18': ('UN', '1', 'Transformation Matrix Sequence', ''), '7fdfxx20': ('UN', '1', 'Left angle', ''), '7fdfxx22': ('UN', '1', 'Right angle', ''), '7fdfxx24': ('UN', '1', 'Color Map Family', ''), '7fdfxx25': ('UN', '1', 'Full Colormap.', ''), '7fdfxx26': ('UN', '1', 'Color Invert', ''), '7fdfxx27': ('UN', '1', 'Color Baseline', ''), '7fdfxx28': ('UN', '1', 'CD Color Mix Points X1', ''), '7fdfxx29': ('UN', '1', 'CD Color Mix Points Y1', ''), '7fdfxx2a': ('UN', '1', 'CD Color Mix Points X2', ''), '7fdfxx2b': ('UN', '1', 'CD Color Mix Points Y2', ''), '7fdfxx2c': ('UN', '1', 'Color Accent', ''), '7fdfxx30': ('UN', '1', 'Persistence SQ', ''), '7fdfxx31': ('UN', '1', 'Persistence Mode', ''), '7fdfxx32': ('UN', '1', 'Persistence Coefficient Mode', ''), '7fdfxx33': ('UN', '1', 'Alpha coefficient', ''), '7fdfxx34': ('UN', '1', 'Gamma coefficient', ''), '7fdfxx35': ('UN', '1', 'Persistence Time Flag', ''), '7fdfxx36': ('UN', '1', 'Persistence adaptive flag', ''), '7fdfxx37': ('UN', '1', 'Persistence Frame Rate', ''), '7fdfxx38': ('UN', '1', 'Persistence ID', ''), '7fdfxx40': ('UN', '1', 'Observation Date Time SQ', ''), '7fdfxx50': ('UN', '1', 'Capture Type Name', ''), '7fdfxx52': ('UN', '1', 'Capture Type Number', ''), '7fdfxx54': ('UN', '1', 'Number of Capture Types', ''), '7fdfxx60': ('UN', '1', 'CD Steering Angle', ''), '7fdfxx61': ('UN', '1', 'CD PRI', ''), '7fdfxx62': ('UN', '1', 'CD Dynamic Range', ''), '7fdfxx63': ('UN', '1', 'CD Velocity Scale Min', ''), '7fdfxx64': ('UN', '1', 'CD Velocity Scale Max', ''), '7fdfxx65': ('UN', '1', 'CD Color Mode', ''), '7fdfxx66': ('UN', '1', 'CD Frequency', ''), '7fdfxx67': ('UN', '1', 'CD Balance', ''), '7fdfxx68': ('UN', '1', 'CD Delta', ''), '7fdfxx69': ('UN', '1', 'CD Pan Box Min X0', ''), '7fdfxx6a': ('UN', '1', 'CD Pan Box Min Y0', ''), '7fdfxx6b': ('UN', '1', 'CD Pan Box Min X1', ''), '7fdfxx6c': ('UN', '1', 'CD Pan Box Min Y1', ''), '7fdfxx6d': ('UN', '1', 'CPS Map Type', ''), '7fdfxx6e': ('UN', '1', 'CPS Map Data', ''), '7fdfxx6f': ('UN', '1', 'CPS Balance Setting', ''), '7fdfxx70': ('UN', '1', '3DCard Step Angle', ''), '7fdfxx71': ('UN', '1', '3DCard Xdcr Angle', ''), '7fdfxx72': ('UN', '1', 'B-mode Frequency', ''), '7fdfxx73': ('UN', '1', 'B-mode Dynamic Range', ''), '7fdfxx74': ('UN', '1', 'B-mode Frame Rate', ''), '7fdfxx75': ('UN', '1', 'B-mode Space Time', ''), '7fdfxx76': ('UN', '1', 'B-mode Persistence', ''), '7fdfxx77': ('UN', '1', 'B-mode Display Depth Start', ''), '7fdfxx78': ('UN', '1', 'B-mode Display Depth End', ''), '7fdfxx79': ('UN', '1', 'B-mode Res Mode', ''), '7fdfxx7a': ('UN', '1', 'B-mode Preset Application', ''), '7fdfxx7b': ('UN', '1', 'Image Spec Name', ''), '7fdfxx7c': ('UN', '1', 'B Preset Image Look', ''), '7fdfxx7d': ('UN', '1', 'B-mode Post Processing', ''), '7fdfxx7e': ('UN', '1', 'B Edge', ''), '7fdfxx7f': ('UN', '1', 'B Delta', ''), '7fdfxx80': ('UN', '1', 'B-mode 1D Post Processing Curve', ''), '7fdfxx81': ('UN', '1', 'B-mode Delta (ECRI) Map Diagonal', ''), '7fdfxx82': ('UN', '1', 'Bytes Per Timestamp', ''), '7fdfxx83': ('UN', '1', 'Microseconds in unit timestamp', ''), '7fdfxx84': ('UN', '1', 'Start Stopwatch Timestamp', ''), '7fdfxx85': ('UN', '1', 'Acoustic Frame Timestamp', ''), '7fdfxx86': ('UN', '1', 'R-Wave Timestamp', ''), '7fdfxx87': ('UN', '1', 'Last Destruction Timestamp', ''), '7fdfxx88': ('UN', '1', 'Pixels Per Second', ''), '7fdfxx89': ('UN', '1', 'ECG Reference Timestamp', ''), '7fdfxx8a': ('UN', '1', 'ECG Sampling Interval (milliseconds)', ''), '7fdfxx8b': ('UN', '1', 'ECG Sample Count', ''), '7fdfxx8c': ('UN', '1', 'ECG Sample Size', ''), '7fdfxx8d': ('UN', '1', 'ECG Data Value', ''), '7fdfxx8e': ('UN', '1', 'Contrast/Active Image Indicator', ''), '7fdfxx8f': ('UN', '1', 'Live Dual Mode Indicator', ''), '7fdfxx90': ('UN', '1', '3DCard Clipset ID', ''), '7fdfxx91': ('UN', '1', '3DCard HRWave Min', ''), '7fdfxx92': ('UN', '1', '3DCard HRWave Max', ''), '7fdfxx93': ('UN', '1', 'Perspective Capture Type', ''), '7fdfxxf1': ('UN', '1', 'Trigger Mask.', ''), '7fdfxxf2': ('UN', '1', 'Study Directory', ''), '7fdfxxf3': ('UN', '1', 'Last Modify Date', ''), '7fdfxxf4': ('UN', '1', 'Last Modify Time', ''), '7fdfxxf5': ('UN', '1', 'Teaching Study', ''), '7fdfxxf6': ('UN', '1', 'Series Base UID', '')}, 'ACUSON:1.2.840.113680.1.0:7ffe': {'7fdfxx00': ('UN', '1', 'Data Padding', '')}, 'ADAC_IMG': {'0019xx02': ('IS', '1', 'Ver200 ADAC Pegasys File Size', ''), '0019xx10': ('LO', '2', 'ADAC Header Signature', ''), '0019xx11': ('US', '1', 'Number of ADAC Headers', ''), '0019xx12': ('IS', '1-n', 'ADAC Header/Image Sizes', ''), '0019xx20': ('OB', '1', 'ADAC Pegasys Headers', ''), '0019xx21': ('US', '1', 'Ver200 Number of ADAC Headers', ''), '0019xx41': ('IS', '1-n', 'Ver200 ADAC Header/Image Size', ''), '0019xx61': ('OB', '1', 'Ver200 ADAC Pegasys Headers', ''), '7043xx00': ('SH', '1', 'Cardiac Stress State', ''), '7043xx10': ('LO', '1', 'Philips NM Private Group', '')}, 'AEGIS_DICOM_2.00': {'0003xx00': ('US', '1-n', 'Unknown', ''), '0005xx00': ('US', '1-n', 'Unknown', ''), '0009xx00': ('US', '1-n', 'Unknown', ''), '0019xx00': ('US', '1-n', 'Unknown', ''), '0029xx00': ('US', '1-n', 'Unknown', ''), '1369xx00': ('US', '1-n', 'Unknown', '')}, 'AGFA': {'0009xx10': ('LO', '1', 'Unknown', ''), '0009xx11': ('LO', '1', 'Unknown', ''), '0009xx13': ('LO', '1', 'Unknown', ''), '0009xx14': ('LO', '1', 'Unknown', ''), '0009xx15': ('LO', '1', 'Unknown', ''), '0019xx10': ('SH', '1', 'Private Identification Code', ''), '0019xx11': ('LO', '3', 'Identification Data (Note 2)', ''), '0019xx13': ('LO', '1', 'Sensitometry Name', ''), '0019xx14': ('ST', '3', 'Window/Level List (Note 3)', ''), '0019xx15': ('LO', '1', 'Dose Monitoring List', ''), '0019xx16': ('LO', '3', 'Other Info (Note 5)', ''), '0019xx1a': ('LO', '1', 'Clipped Exposure Deviation', ''), '0019xx1b': ('LO', '1', 'Logarithmic PLT Full Scale', ''), '0019xx60': ('US', '1', 'Total number of series', ''), '0019xx61': ('SH', '1', 'Session Number', ''), '0019xx62': ('SH', '1', 'ID Station name', ''), '0019xx65': ('US', '1', 'Number of images in study to be transmitted (only sent with autoverify: on)', ''), '0019xx70': ('US', '1', 'Total number of images', ''), '0019xx80': ('ST', '1', 'Geometrical Transformations', ''), '0019xx81': ('ST', '1', 'Roam Origin', ''), '0019xx82': ('US', '1', 'Zoom factor', ''), '0019xx93': ('CS', '1', 'Status', '')}, 'AGFA PACS Archive Mirroring 1.0': {'0031xx00': ('CS', '1', 'Unknown', ''), '0031xx01': ('UL', '1', 'Unknown', '')}, 'AGFA-AG_HPState': {'0071xx18': ('SQ', '1', 'Unknown', ''), '0071xx19': ('SQ', '1', 'Unknown', ''), '0071xx1a': ('SQ', '1', 'Unknown', ''), '0071xx1c': ('SQ', '1', 'Unknown', ''), '0071xx1e': ('SQ', '1', 'Unknown', ''), '0071xx20': ('FL', '1-n', 'Unknown', ''), '0071xx21': ('FD', '1-n', 'Unknown', ''), '0071xx22': ('FD', '1-n', 'Unknown', ''), '0071xx23': ('FD', '1-n', 'Unknown', ''), '0071xx24': ('FD', '1', 'Unknown', ''), '0073xx23': ('SH', '1', 'Unknown', ''), '0073xx24': ('SQ', '1', 'Unknown', ''), '0073xx28': ('SQ', '1', 'Unknown', ''), '0073xx80': ('FL', '1', 'Unknown', ''), '0075xx10': ('LO', '1', 'Unknown', ''), '0087xx01': ('LO', '1', 'Unknown', ''), '0087xx02': ('LO', '1', 'Unknown', '')}, 'AGFA_ADC_Compact': {'0019xx05': ('ST', '1', 'Data stream from cassette', ''), '0019xx10': ('LO', '1', 'Private Identification Code', ''), '0019xx30': ('ST', '1', 'Set of destination types', ''), '0019xx40': ('ST', '1', 'Set of destination Ids', ''), '0019xx50': ('ST', '1', 'Set of processing codes', ''), '0019xx60': ('US', '1', 'Number of series in study', ''), '0019xx61': ('US', '1', 'Session Number', ''), '0019xx62': ('SH', '1', 'ID station name', ''), '0019xx70': ('US', '1', 'Number of images in series', ''), '0019xx71': ('US', '1', 'Break condition', ''), '0019xx72': ('US', '1', 'Wait (or Hold) flag', ''), '0019xx73': ('US', '1', 'ScanRes flag', ''), '0019xx74': ('SH', '1', 'Operation code', ''), '0019xx95': ('CS', '1', 'Image quality', '')}, 'ALOKA:1.2.392.200039.103.2': {'0009xx00': ('SH', '1', 'Unknown', ''), '0009xx04': ('US', '1-n', 'Unknown', ''), '0009xx06': ('US', '1-n', 'Unknown', ''), '0009xx0a': ('SH', '1', 'Unknown', ''), '0009xx20': ('CS', '1', 'Unknown', ''), '0009xx22': ('CS', '1', 'Unknown', ''), '0009xx24': ('CS', '1', 'Unknown', ''), '0009xx26': ('IS', '1', 'Unknown', ''), '0009xx28': ('IS', '1', 'Unknown', ''), '0009xx2a': ('DS', '1', 'Unknown', ''), '0009xx30': ('FD', '1', 'Unknown', ''), '0009xx32': ('DS', '1', 'Unknown', ''), '0009xx34': ('CS', '1', 'Unknown', ''), '0019xx08': ('FD', '1', 'Unknown', ''), '0019xx0c': ('CS', '1', 'Unknown', ''), '0019xx0e': ('DS', '1', 'Unknown', ''), '0019xx18': ('SL', '1', 'Unknown', ''), '0019xx1a': ('SL', '1', 'Unknown', ''), '0019xx40': ('SS', '1', 'Unknown', ''), '0019xx46': ('US', '1', 'Unknown', ''), '0019xx50': ('SL', '1', 'Unknown', ''), '0019xx52': ('DS', '1', 'Unknown', ''), '0019xx54': ('DS', '1', 'Unknown', ''), '0019xx56': ('FD', '1', 'Unknown', '')}, 'AMI Annotations_01': {'3101xx10': ('SQ', '1', 'AMI Annotation Sequence (RET)', '')}, 'AMI Annotations_02': {'3101xx20': ('SQ', '1', 'AMI Annotation Sequence (RET)', '')}, 'AMI ImageContextExt_01': {'3107xxa0': ('CS', '1', 'AMI Window Function (RET)', ''), '3107xxb0': ('DS', '1', 'AMI Window Slope (RET)', '')}, 'AMI ImageContext_01': {'3109xx10': ('CS', '1', 'AMI Window Invert (RET)', ''), '3109xx20': ('IS', '1', 'AMI Window Center (RET)', ''), '3109xx30': ('IS', '1', 'AMI Window Widith (RET)', ''), '3109xx40': ('CS', '1', 'AMI Pixel Aspect Ratio Swap (RET)', ''), '3109xx50': ('CS', '1', 'AMI Enable Averaging (RET)', ''), '3109xx60': ('CS', '1', 'AMI Quality (RET)', ''), '3109xx70': ('CS', '1', 'AMI Viewport Annotation Level (RET)', ''), '3109xx80': ('CS', '1', 'AMI Show Image Annotation (RET)', ''), '3109xx90': ('CS', '1', 'AMI Show Image Overlay (RET)', '')}, 'AMI ImageTransform_01': {'3107xx10': ('DS', '1', 'AMI Transformation Matrix (RET)', ''), '3107xx20': ('DS', '1', 'AMI Center Offset (RET)', ''), '3107xx30': ('DS', '1', 'AMI Magnification (RET)', ''), '3107xx40': ('CS', '1', 'AMI Magnification Type (RET)', ''), '3107xx50': ('DS', '1', 'AMI Displayed Area (RET)', ''), '3107xx60': ('DS', '1', 'AMI Calibration Factor (RET)', '')}, 'AMI Sequence AnnotElements_01': {'3105xx10': ('DS', '1', 'AMI Annotation Element Position', ''), '3105xx20': ('LT', '1', 'AMI Annotation Element Text', '')}, 'AMI Sequence Annotations_01': {'3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), '3103xx40': ('FD', '1', 'FontSize', ''), '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), '3103xxa0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), '3103xxb0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), '3103xxc0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), '3103xxd0': ('TM', '1', 'AMI Annotation Mofification Times (RET)', ''), '3103xxe0': ('US', '1', 'AMI Annotation Frame Number (RET)', '')}, 'AMI Sequence Annotations_02': {'3103xx10': ('CS', '1', 'AMI Annotation Sequence (RET)', ''), '3103xx20': ('UI', '1', 'AMI Annotation UID (RET)', ''), '3103xx30': ('US', '1', 'AMI Annotation Color (RET)', ''), '3103xx50': ('CS', '1', 'AMI Annotation Line Style (RET)', ''), '3103xx60': ('SQ', '1', 'AMI Annotation Elements (RET)', ''), '3103xx70': ('SH', '1', 'AMI Annotation Label (RET)', ''), '3103xx80': ('PN', '1', 'AMI Annotation Creator (RET)', ''), '3103xx90': ('PN', '1', 'AMI Annotation Modifiers (RET)', ''), '3103xxa0': ('DA', '1', 'AMI Annotation Creation Date (RET)', ''), '3103xxb0': ('TM', '1', 'AMI Annotation Creation Time (RET)', ''), '3103xxc0': ('DA', '1', 'AMI Annotation Modification Dates (RET)', ''), '3103xxd0': ('TM', '1', 'AMI Annotation Modification Times (RET)', ''), '3103xxe0': ('US', '1', 'AMI Annotation Frame Number (RET)', '')}, 'AMI StudyExtensions_01': {'3111xx01': ('UL', '1', 'AMI Last Released Annot Label (RET)', '')}, 'AMICAS0': {'0023xx01': ('UI', '1', '', ''), '0023xx08': ('US', '1', '', ''), '0023xx10': ('US', '1', '', ''), '0023xx16': ('SL', '1', '', '')}, 'APEX_PRIVATE': {'0027xx10': ('LO', '1', 'Private Creator', ''), '0027xx11': ('DS', '1', 'Bed Position', '')}, 'ATL HDI V1.0': {'0009xx00': ('UN', '1', 'Private', ''), '0009xx10': ('UN', '1', 'Private', ''), '0009xx20': ('UN', '1', 'Private', ''), '0009xx30': ('UN', '1', 'Private', ''), '0009xx40': ('UN', '1', 'Private', ''), '0009xx50': ('UN', '1', 'Private', ''), '0009xx60': ('UN', '1', 'Private', ''), '0009xx70': ('UN', '1', 'Private', ''), '0009xx80': ('UN', '1', 'Private', ''), '0009xx90': ('UN', '1', 'Private', ''), '0009xx91': ('UN', '1', 'Private', ''), '0029xx30': ('UN', '1', 'Loop Mode', ''), '0029xx31': ('UN', '1', 'Trigger mode', ''), '0029xx32': ('UN', '1', 'Number of Loops', ''), '0029xx33': ('UN', '1', 'Loop Indexes', ''), '0029xx34': ('UN', '1', 'Loop Heart Rates', ''), '0029xx35': ('UN', '1', 'Medications', '')}, 'ATL PRIVATE TAGS': {'0029xx30': ('UL', '1', 'Loop Mode', ''), '0029xx31': ('UL', '1', 'Trigger mode', ''), '0029xx32': ('UL', '1', 'Number of Loops', ''), '0029xx33': ('DS', '1-n', 'Loop Indexes', ''), '0029xx34': ('DS', '1-n', 'Loop Heart Rates', ''), '0029xx35': ('LO', '1', 'Medications', '')}, 'Acuson X500': {'0009xx20': ('UN', '1', '(a)View Name', ''), '0009xx2a': ('UN', '1', 'View List', ''), '0011xx10': ('UN', '1', 'Siemens Medical', ''), '0011xx11': ('UN', '1', 'DIMAQ Software', ''), '0011xx20': ('UN', '1', 'Private Data', ''), '0011xx21': ('UN', '1', 'Private Data', ''), '0013xx10': ('UN', '1', 'Siemens Medical', ''), '0013xx11': ('UN', '1', 'DIMAQ Software', ''), '0013xx20': ('UN', '1', 'Private Data', ''), '0015xx10': ('UN', '1', 'Siemens Medical', ''), '0015xx11': ('UN', '1', 'DIMAQ Software', ''), '0015xx20': ('UN', '1', 'Private Data', ''), '0017xx10': ('UN', '1', 'Siemens Medical', ''), '0017xx11': ('UN', '1', 'DIMAQ Software', ''), '0017xx20': ('UN', '1', 'Private Data', ''), '0019xx20': ('UN', '1', 'Import Structured', '')}, 'Agfa ADC NX': {'0019xx09': ('SQ', '1', 'Unknown', ''), '0019xxf5': ('CS', '1', 'Cassette Orientation', ''), '0019xxf6': ('DS', '1', 'Plate Sensitivity', ''), '0019xxf7': ('DS', '1', 'Plate Erasability', ''), '0019xxf8': ('IS', '1', 'Unknown', ''), '0019xxfe': ('CS', '1', 'Unknown', '')}, 'AgilityRuntime': {'0029xx11': ('CS', '1', 'Unknown', ''), '0029xx12': ('US', '1', 'Unknown', ''), '0029xx13': ('US', '1', 'Unknown', ''), '0029xx14': ('US', '1', 'Unknown', ''), '0029xx1f': ('US', '1', 'Unknown', '')}, 'Applicare/Centricity Radiology Web/Version 1.0': {'4109xx01': ('SH', '1', 'Mammography Laterality', ''), '4109xx02': ('SH', '1', 'Mammography View Name', ''), '4109xx03': ('SH', '1', 'Mammography View Modifier', '')}, 'Applicare/Centricity Radiology Web/Version 2.0': {'4111xx01': ('CS', '1', 'Secondary Spine Label', ''), '4111xx02': ('IS', '1', 'Additional tags for Presentation State', '')}, 'Applicare/Print/Version 5.1': {'4101xx01': ('UL', '1', ' 1: del encodings[0] if data_element.VM == 1: data_element.value = clean_escseq( data_element.value.decode( encodings[0]), encodings) else: data_element.value = [clean_escseq( value.decode(encodings[0]), encodings) for value in data_element.value] pydicom-0.9.7/dicom/config.py000644 000765 000024 00000001404 11726534363 016363 0ustar00darcystaff000000 000000 # config.py """Pydicom configuration options.""" # Copyright (c) 2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # doc strings following items are picked up by sphinx for documentation allow_DS_float = False """Set allow_float to True to allow DS instances to be created with floats; otherwise, they must be explicitly converted to strings, with the user explicity setting the precision of digits and rounding. Default: False""" enforce_valid_values = True """Raise errors if any value is not allowed by DICOM standard, e.g. DS strings that are longer than 16 characters; IS strings outside the allowed range. """pydicom-0.9.7/dicom/contrib/000755 000765 000024 00000000000 11726534607 016206 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/datadict.py000644 000765 000024 00000017617 11726534363 016710 0ustar00darcystaff000000 000000 # datadict.py # -*- coding: utf-8 -*- """Access dicom dictionary information""" # # Copyright (c) 2008-2011 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # import logging logger = logging.getLogger("pydicom") from dicom.tag import Tag from dicom._dicom_dict import DicomDictionary # the actual dict of {tag: (VR, VM, name, is_retired, keyword), …} from dicom._dicom_dict import RepeatersDictionary # those with tags like "(50xx, 0005)" from dicom._private_dict import private_dictionaries import warnings # Generate mask dict for checking repeating groups etc. # Map a true bitwise mask to the DICOM mask with "x"'s in it. masks = {} for mask_x in RepeatersDictionary: # mask1 is XOR'd to see that all non-"x" bits are identical (XOR result = 0 if bits same) # then AND those out with 0 bits at the "x" ("we don't care") location using mask2 mask1 = long(mask_x.replace("x", "0"),16) mask2 = long("".join(["F0"[c=="x"] for c in mask_x]),16) masks[mask_x] = (mask1, mask2) # For shorter naming of dicom member elements, put an entry here # (longer naming can also still be used) # The descriptive name must start with the long version (not replaced if internal) shortNames = [("BeamLimitingDevice", "BLD"), ("RTBeamLimitingDevice", "RTBLD"), ("ControlPoint", "CP"), ("Referenced", "Refd") ] def mask_match(tag): for mask_x, (mask1, mask2) in masks.items(): if (tag ^ mask1) & mask2 == 0: return mask_x return None def get_entry(tag): """Return the tuple (VR, VM, name, is_retired, keyword) from the DICOM dictionary If the entry is not in the main dictionary, check the masked ones, e.g. repeating groups like 50xx, etc. """ tag = Tag(tag) try: return DicomDictionary[tag] except KeyError: mask_x = mask_match(tag) if mask_x: return RepeatersDictionary[mask_x] else: raise KeyError, "Tag %s not found in DICOM dictionary" % tag def dictionary_description(tag): """Return the descriptive text for the given dicom tag.""" return get_entry(tag)[2] def dictionaryVM(tag): """Return the dicom value multiplicity for the given dicom tag.""" return get_entry(tag)[1] def dictionaryVR(tag): """Return the dicom value representation for the given dicom tag.""" return get_entry(tag)[0] def dictionary_has_tag(tag): """Return True if the dicom dictionary has an entry for the given tag.""" return (tag in DicomDictionary) def dictionary_keyword(tag): """Return the official DICOM standard (since 2011) keyword for the tag""" return get_entry(tag)[4] import string normTable = string.maketrans('','') def keyword_for_tag(tag): """Return the DICOM keyword for the given tag. Replaces old CleanName() method using the 2011 DICOM standard keywords instead. Will return GroupLength for group length tags, and returns blank ("") if the tag doesn't exist in the dictionary. """ try: return dictionary_keyword(tag) except KeyError: return "" def CleanName(tag): """Return the dictionary descriptive text string but without bad characters. Used for e.g. *named tags* of Dataset instances (before DICOM keywords were part of the standard) """ tag = Tag(tag) if tag not in DicomDictionary: if tag.element == 0: # 0=implied group length in DICOM versions < 3 return "GroupLength" else: return "" s = dictionary_description(tag) # Descriptive name in dictionary # remove blanks and nasty characters s = s.translate(normTable, r""" !@#$%^&*(),;:.?\|{}[]+-="'’/""") # Take "Sequence" out of name as more natural sounding # e..g "BeamSequence"->"Beams"; "ReferencedImageBoxSequence"->"ReferencedImageBoxes" # 'Other Patient ID' exists as single value AND as sequence so check for it and leave 'Sequence' in if dictionaryVR(tag) == "SQ" and not s.startswith("OtherPatientIDs"): if s.endswith("Sequence"): s = s[:-8]+"s" if s.endswith("ss"): s = s[:-1] if s.endswith("xs"): s = s[:-1] + "es" if s.endswith("Studys"): s = s[:-2]+"ies" return s # Provide for the 'reverse' lookup. Given clean name, what is the tag? logger.debug("Reversing DICOM dictionary so can look up tag from a name...") NameDict = dict([(CleanName(tag), tag) for tag in DicomDictionary]) keyword_dict = dict([(dictionary_keyword(tag), tag) for tag in DicomDictionary]) def short_name(name): """Return a short *named tag* for the corresponding long version. Return a blank string if there is no short version of the name. """ for longname, shortname in shortNames: if name.startswith(longname): return name.replace(longname, shortname) return "" def long_name(name): """Return a long *named tag* for the corresponding short version. Return a blank string if there is no long version of the name. """ for longname, shortname in shortNames: if name.startswith(shortname): return name.replace(shortname, longname) return "" def tag_for_name(name): """Return the dicom tag corresponding to name, or None if none exist.""" if name in keyword_dict: # the usual case return keyword_dict[name] # If not an official keyword, check the old style pydicom names if name in NameDict: tag = NameDict[name] msg = ("'%s' as tag name has been deprecated; use official DICOM keyword '%s'" % (name, dictionary_keyword(tag))) warnings.warn(msg, DeprecationWarning) return tag # check if is short-form of a valid name longname = long_name(name) if longname: return NameDict.get(longname, None) return None def all_names_for_tag(tag): """Return a list of all (long and short) names for the tag""" longname = keyword_for_tag(tag) shortname = short_name(longname) names = [longname] if shortname: names.append(shortname) return names # PRIVATE DICTIONARY handling # functions in analogy with those of main DICOM dict def get_private_entry(tag, private_creator): """Return the tuple (VR, VM, name, is_retired) from a private dictionary""" tag = Tag(tag) try: private_dict = private_dictionaries[private_creator] except KeyError: raise KeyError, "Private creator '%s' not in private dictionary" % private_creator # private elements are usually agnostic for "block" (see PS3.5-2008 7.8.1 p44) # Some elements in _private_dict are explicit; most have "xx" for high-byte of element # Try exact key first, but then try with "xx" in block position try: dict_entry = private_dict[tag] except KeyError: # so here put in the "xx" in the block position for key to look up group_str = "%04x" % tag.group elem_str = "%04x" % tag.elem key = "%sxx%s" % (group_str, elem_str[-2:]) if key not in private_dict: raise KeyError, "Tag %s not in private dictionary for private creator '%s'" % (key, private_creator) dict_entry = private_dict[key] return dict_entry def private_dictionary_description(tag, private_creator): """Return the descriptive text for the given dicom tag.""" return get_private_entry(tag, private_creator)[2] def private_dictionaryVM(tag, private_creator): """Return the dicom value multiplicity for the given dicom tag.""" return get_private_entry(tag, private_creator)[1] def private_dictionaryVR(tag, private_creator): """Return the dicom value representation for the given dicom tag.""" return get_private_entry(tag, private_creator)[0]pydicom-0.9.7/dicom/dataelem.py000644 000765 000024 00000031317 11726534363 016700 0ustar00darcystaff000000 000000 # dataelem.py """Define the DataElement class - elements within a dataset. DataElements have a DICOM value representation VR, a value multiplicity VM, and a value. """ # # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # import logging logger = logging.getLogger('pydicom') from dicom.datadict import dictionary_has_tag, dictionary_description from dicom.datadict import private_dictionary_description, dictionaryVR from dicom.tag import Tag from dicom.UID import UID from dicom.valuerep import IS, DS, PersonName from decimal import Decimal try: from collections import namedtuple except ImportError: # for python <2.6 from dicom.util.namedtup import namedtuple # os.stat is only available on Unix and Windows # Not sure if on other platforms the import fails, or the call to it?? stat_available = True try: from os import stat except: stat_available = False import os.path from dicom.filebase import DicomFile import warnings # Helper functions: def isMultiValue(value): """Helper function: return True if 'value' is 'list-like'.""" if isString(value): return False try: iter(value) except TypeError: return False return True def isString(val): """Helper function: return True if val is a string.""" try: val + "" except: return False return True def isStringOrStringList(val): """Return true if val consists only of strings. val may be a list/tuple.""" if isMultiValue(val): for item in val: if not isString(item): return False return True else: # single value - test for a string return isString(val) _backslash = "\\" # double '\' because it is used as escape chr in Python class DataElement(object): """Contain and manipulate a Dicom data element, having a tag, VR, VM and value. Most user code will not create data elements using this class directly, but rather through 'named tags' in Dataset objects. See the Dataset class for a description of how Datasets, Sequences, and DataElements work. Class Data ---------- For string display (via __str__), the following are used: descripWidth -- maximum width of description field (default 35). maxBytesToDisplay -- longer data will display "array of # bytes" (default 16). showVR -- True (default) to include the dicom VR just before the value. """ descripWidth = 35 maxBytesToDisplay = 16 showVR = 1 def __init__(self, tag, VR, value, file_value_tell=None, is_undefined_length=False): """Create a data element instance. Most user code should instead use DICOM keywords, (formerly 'Named tags' in pydicom) to create data_elements, for which only the value is supplied, and the VR and tag are determined from the dicom dictionary. tag -- dicom (group, element) tag in any form accepted by Tag(). VR -- dicom value representation (see DICOM standard part 6) value -- the value of the data element. One of the following: - a single string value - a number - a list or tuple with all strings or all numbers - a multi-value string with backslash separator file_value_tell -- used internally by Dataset, to store the write position for ReplaceDataElementValue method is_undefined_length -- used internally to store whether the length field in this data element was 0xFFFFFFFFL, i.e. "undefined length" """ self.tag = Tag(tag) self.VR = VR # Note!: you must set VR before setting value self.value = value self.file_tell = file_value_tell self.is_undefined_length = is_undefined_length def _getvalue(self): """Get method for 'value' property""" return self._value def _setvalue(self, val): """Set method for 'value' property""" # Check if is a string with multiple values separated by '\' # If so, turn them into a list of separate strings if isString(val) and self.VR not in \ ['UT','ST','LT', 'FL','FD','AT','OB','OW','OF','SL','SQ','SS', 'UL', 'OB/OW', 'OW/OB', 'OB or OW', 'OW or OB', 'UN'] and 'US' not in self.VR: # latter covers 'US or SS' etc if _backslash in val: val = val.split(_backslash) self._value = self._convert_value(val) value = property(_getvalue, _setvalue, doc= """The value (possibly multiple values) of this data_element.""") def _getVM(self): """Get method for VM property""" if isMultiValue(self.value): return len(self.value) else: return 1 VM = property(_getVM, doc = """The number of values in the data_element's 'value'""") def _convert_value(self, val): """Convert Dicom string values if possible to e.g. numbers. Handle the case of multiple value data_elements""" if self.VR=='SQ': # a sequence - leave it alone from dicom.sequence import Sequence if isinstance(val,Sequence): return val else: return Sequence(val) # if the value is a list, convert each element try: val.append except AttributeError: # not a list return self._convert(val) else: returnvalue = [] for subval in val: returnvalue.append(self._convert(subval)) return returnvalue def _convert(self, val): """Take the value and convert to number, etc if possible""" if self.VR == 'IS': return IS(val) elif self.VR == 'DS': return DS(val) elif self.VR == "UI": return UID(val) # Later may need this for PersonName as for UI, # but needs more thought # elif self.VR == "PN": # return PersonName(val) else: # is either a string or a type 2 optionally blank string return val # this means a "numeric" value could be empty string "" #except TypeError: #print "Could not convert value '%s' to VR '%s' in tag %s" \ # % (repr(val), self.VR, self.tag) #except ValueError: #print "Could not convert value '%s' to VR '%s' in tag %s" \ # % (repr(val), self.VR, self.tag) def __str__(self): """Return str representation of this data_element""" repVal = self.repval if self.showVR: s = "%s %-*s %s: %s" % (str(self.tag), self.descripWidth, self.description()[:self.descripWidth], self.VR, repVal) else: s = "%s %-*s %s" % (str(self.tag), self.descripWidth, self.description()[:self.descripWidth], repVal) return s def _get_repval(self): """Return a str representation of the current value for use in __str__""" if (self.VR in ['OB', 'OW', 'OW/OB', 'OW or OB', 'OB or OW', 'US or SS or OW', 'US or SS'] and len(self.value) > self.maxBytesToDisplay): repVal = "Array of %d bytes" % len(self.value) elif hasattr(self, 'original_string'): # for VR of IS or DS repVal = repr(self.original_string) elif isinstance(self.value, Decimal): repVal = repr(self.value) elif isinstance(self.value, UID): repVal = self.value.name else: repVal = repr(self.value) # will tolerate unicode too return repVal repval = property(_get_repval) def __unicode__(self): """Return unicode representation of this data_element""" if isinstance(self.value, unicode): # start with the string rep then replace the value part with the unicode strVal = str(self) uniVal = unicode(strVal.replace(self.repval, "")) + self.value return uniVal else: return unicode(str(self)) def __getitem__(self, key): """Returns the item from my value's Sequence, if it is one.""" try: return self.value[key] except TypeError: raise TypeError, "DataElement value is unscriptable (not a Sequence)" def _get_name(self): return self.description() name = property(_get_name) def description(self): """Return the DICOM dictionary description for this dicom tag.""" if dictionary_has_tag(self.tag): name = dictionary_description(self.tag) elif self.tag.is_private: name = "Private tag data" # default if hasattr(self, 'private_creator'): try: # If have name from private dictionary, use it, but # but put in square brackets so is differentiated, # and clear that cannot access it by name name = "[" + private_dictionary_description(self.tag, self.private_creator) + "]" except KeyError: pass elif self.tag.elem >> 8 == 0: name = "Private Creator" elif self.tag.element == 0: # implied Group Length dicom versions < 3 name = "Group Length" else: name = "" return name def __repr__(self): """Handle repr(data_element)""" if self.VR == "SQ": return repr(self.value) else: return str(self) class DeferredDataElement(DataElement): """Subclass of DataElement where value is not read into memory until needed""" def __init__(self, tag, VR, fp, file_mtime, data_element_tell, length): """Store basic info for the data element but value will be read later fp -- DicomFile object representing the dicom file being read file_mtime -- last modification time on file, used to make sure it has not changed since original read data_element_tell -- file position at start of data element, (not the start of the value part, but start of whole element) """ self.tag = Tag(tag) self.VR = VR self._value = None # flag as unread # Check current file object and save info needed for read later # if not isinstance(fp, DicomFile): # raise NotImplementedError, "Deferred read is only available for DicomFile objects" self.fp_is_implicit_VR = fp.is_implicit_VR self.fp_is_little_endian = fp.is_little_endian self.filepath = fp.name self.file_mtime = file_mtime self.data_element_tell = data_element_tell self.length = length def _get_repval(self): if self._value is None: return "Deferred read: length %d" % self.length else: return DataElement._get_repval(self) repval = property(_get_repval) def _getvalue(self): """Get method for 'value' property""" # Must now read the value if haven't already if self._value is None: self.read_value() return DataElement._getvalue(self) def _setvalue(self, val): DataElement._setvalue(self, val) value = property(_getvalue, _setvalue) RawDataElement = namedtuple('RawDataElement', 'tag VR length value value_tell is_implicit_VR is_little_endian') def DataElement_from_raw(raw_data_element): """Return a DataElement from a RawDataElement""" from dicom.values import convert_value # XXX buried here to avoid circular import filereader->Dataset->convert_value->filereader (for SQ parsing) raw = raw_data_element VR = raw.VR if VR is None: # Can be if was implicit VR try: VR = dictionaryVR(raw.tag) except KeyError: if raw.tag.is_private: VR = 'OB' # just read the bytes, no way to know what they mean elif raw.tag.element == 0: # group length tag implied in versions < 3.0 VR = 'UL' else: raise KeyError, "Unknown DICOM tag %s - can't look up VR" % str(raw.tag) try: value = convert_value(VR, raw) except NotImplementedError, e: raise NotImplementedError, "%s in tag %r" % (str(e), raw.tag) return DataElement(raw.tag, VR, value, raw.value_tell, raw.length==0xFFFFFFFFL) class Attribute(DataElement): """Deprecated -- use DataElement instead""" def __init__(self, tag, VR, value, file_value_tell=None): warnings.warn("The Attribute class is deprecated and will be removed in pydicom 1.0. Use DataElement", DeprecationWarning) DataElement.__init__(self, tag, VR, value, file_value_tell) pydicom-0.9.7/dicom/dataset.py000644 000765 000024 00000066405 11726534363 016557 0ustar00darcystaff000000 000000 # dataset.py """Module for Dataset class Overview of Dicom object model: Dataset(derived class of Python's dict class) contains DataElement instances (DataElement is a class with tag, VR, value) the value can be a Sequence instance (Sequence is derived from Python's list), or just a regular value like a number, string, etc., or a list of regular values, e.g. a 3d coordinate Sequence's are a list of Datasets (note recursive nature here) """ # # Copyright (c) 2008-2010 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # import sys from sys import byteorder sys_is_little_endian = (byteorder == 'little') import logging logger = logging.getLogger('pydicom') from dicom.datadict import DicomDictionary, dictionaryVR from dicom.datadict import tag_for_name, all_names_for_tag from dicom.tag import Tag, BaseTag from dicom.dataelem import DataElement, DataElement_from_raw, RawDataElement from dicom.valuerep import is_stringlike from dicom.UID import NotCompressedPixelTransferSyntaxes import os.path import cStringIO, StringIO import dicom # for write_file import dicom.charset import warnings have_numpy = True try: import numpy except: have_numpy = False stat_available = True try: from os import stat except: stat_available = False class PropertyError(Exception): """For AttributeErrors caught in a property, so do not go to __getattr__""" pass class Dataset(dict): """A Dataset is a collection (dictionary) of Dicom DataElement instances. Example of two ways to retrieve or set values: 1. dataset[0x10, 0x10].value --> patient's name 2. dataset.PatientName --> patient's name Example (2) is referred to as *Named tags* in this documentation. PatientName is not actually a member of the object, but unknown member requests are checked against the dicom dictionary. If the name matches a DicomDictionary descriptive string, the corresponding tag is used to look up or set the Data Element's value. :attribute indentChars: for string display, the characters used to indent for nested Data Elements (e.g. sequence items). Default is 3 blank characters. """ indentChars = " " def add(self, data_element): """Equivalent to dataset[data_element.tag] = data_element.""" self[data_element.tag] = data_element def Add(self, data_element): # remove in v1.0 """Deprecated -- use add()""" msg = ("Dataset.Add() is deprecated and will be removed in pydicom 1.0." " Use Dataset.add()") warnings.warn(msg, DeprecationWarning) self.add(data_element) def add_new(self, tag, VR, value): """Create a new DataElement instance and add it to this Dataset.""" data_element = DataElement(tag, VR, value) self[data_element.tag] = data_element # use data_element.tag since DataElement verified it def AddNew(self, tag, VR, value): #remove in v1.0 """Deprecated -- use add_new()""" msg = ("Dataset.AddNew() is deprecated and will be removed in pydicom 1.0." " Use Dataset.add_new()") warnings.warn(msg, DeprecationWarning) self.add_new(tag, VR, value) def attribute(self, name): #remove in v1.0 """Deprecated -- use Dataset.data_element()""" warnings.warn("Dataset.attribute() is deprecated and will be removed in pydicom 1.0. Use Dataset.data_element() instead", DeprecationWarning) return self.data_element(name) def data_element(self, name): """Return the full data_element instance for the given descriptive name. When using *named tags*, only the value is returned. If you want the whole data_element object, for example to change the data_element.VR, call this function with the name and the data_element instance is returned.""" tag = tag_for_name(name) if tag: return self[tag] return None def __contains__(self, name): """Extend dict.__contains__() to handle *named tags*. This is called for code like: ``if 'SliceLocation' in dataset``. """ if is_stringlike(name): tag = tag_for_name(name) else: try: tag = Tag(name) except: return False if tag: return dict.__contains__(self, tag) else: return dict.__contains__(self, name) # will no doubt raise an exception def decode(self): """Apply character set decoding to all data elements. See DICOM PS3.5-2008 6.1.1. """ # Find specific character set. 'ISO_IR 6' is default # May be multi-valued, but let dicom.charset handle all logic on that dicom_character_set = self.get('SpecificCharacterSet', "ISO_IR 6") # shortcut to the decode function in dicom.charset decode_data_element = dicom.charset.decode # sub-function callback for walk(), to decode the chr strings if necessary # this simply calls the dicom.charset.decode function def decode_callback(ds, data_element): decode_data_element(data_element, dicom_character_set) # Use the walk function to go through all elements in the dataset and convert them self.walk(decode_callback) def __delattr__(self, name): """Intercept requests to delete an attribute by name, e.g. del ds.name If name is a dicom descriptive string (cleaned with CleanName), then delete the corresponding tag and data_element. Else, delete an instance (python) attribute as any other class would do. """ # First check if is a valid DICOM name and if we have that data element tag = tag_for_name(name) if tag and tag in self: del self[tag] # If not a DICOM name (or we don't have it), check for regular instance name # can't do delete directly, that will call __delattr__ again! elif name in self.__dict__: del self.__dict__[name] # Not found, raise an error in same style as python does else: raise AttributeError, name def __dir__(self): """___dir__ is used in python >= 2.6 to give a list of attributes available in an object, for example used in auto-completion in editors or command-line environments. """ import inspect meths = set(zip(*inspect.getmembers(Dataset,inspect.isroutine))[0]) props = set(zip(*inspect.getmembers(Dataset,inspect.isdatadescriptor))[0]) deprecated = set(('Add', 'AddNew', 'GroupDataset', 'RemovePrivateTags', 'SaveAs', 'attribute', 'PixelArray')) dicom_names = set(self.dir()) alldir=sorted((props|meths|dicom_names)-deprecated) return alldir def dir(self, *filters): """Return a list of some or all data_element names, in alphabetical order. Intended mainly for use in interactive Python sessions. filters -- 0 or more string arguments to the function if none provided, dir() returns all data_element names in this Dataset. Else dir() will return only those items with one of the strings somewhere in the name (case insensitive). """ allnames = [] for tag, data_element in self.items(): allnames.extend(all_names_for_tag(tag)) allnames = [x for x in allnames if x] # remove blanks - tags without valid names (e.g. private tags) # Store found names in a dict, so duplicate names appear only once matches = {} for filter_ in filters: filter_ = filter_.lower() match = [x for x in allnames if x.lower().find(filter_) != -1] matches.update(dict([(x,1) for x in match])) if filters: names = sorted(matches.keys()) return names else: return sorted(allnames) def file_metadata(self): # remove in v1.0 """Return a Dataset holding only meta information (group 2). Only makes sense if this dataset is a whole file dataset. """ import warnings msg = ("Dataset.file_metadata() is deprecated and will be removed" " in pydicom 1.0. Use FileDataset and its file_meta" " attribute instead.") warnings.warn(msg, DeprecationWarning) return self.group_dataset(2) def get(self, key, default=None): """Extend dict.get() to handle *named tags*.""" if is_stringlike(key): try: return getattr(self, key) except AttributeError: return default else: # is not a string, try to make it into a tag and then hand it # off to the underlying dict if not isinstance(key, BaseTag): try: key = Tag(key) except: raise TypeError("Dataset.get key must be a string or tag") try: return_val = self.__getitem__(key) except KeyError: return_val = default return return_val def __getattr__(self, name): """Intercept requests for unknown Dataset python-attribute names. If the name matches a Dicom dictionary string (without blanks etc), then return the value for the data_element with the corresponding tag. """ # __getattr__ only called if instance cannot find name in self.__dict__ # So, if name is not a dicom string, then is an error tag = tag_for_name(name) if tag is None: raise AttributeError, "Dataset does not have attribute '%s'." % name tag = Tag(tag) if tag not in self: raise AttributeError, "Dataset does not have attribute '%s'." % name else: # do have that dicom data_element return self[tag].value def __getitem__(self, key): """Operator for dataset[key] request.""" tag = Tag(key) data_elem = dict.__getitem__(self, tag) if isinstance(data_elem, DataElement): return data_elem elif isinstance(data_elem, tuple): # If a deferred read, then go get the value now if data_elem.value is None: from dicom.filereader import read_deferred_data_element data_elem = read_deferred_data_element(self.fileobj_type, self.filename, self.timestamp, data_elem) # Hasn't been converted from raw form read from file yet, so do so now: self[tag] = DataElement_from_raw(data_elem) return dict.__getitem__(self, tag) def group_dataset(self, group): """Return a Dataset containing only data_elements of a certain group. group -- the group part of a dicom (group, element) tag. """ ds = Dataset() ds.update(dict( [(tag,data_element) for tag,data_element in self.items() if tag.group==group] )) return ds def GroupDataset(self, group): # remove in v1.0 """Deprecated -- use group_dataset()""" msg = ("Dataset.GroupDataset is deprecated and will be removed in pydicom 1.0." " Use Dataset.group_dataset()") warnings.warn(msg, DeprecationWarning) self.add_new(tag, VR, value) # dict.has_key removed in python 3. But should be ok to keep this. def has_key(self, key): """Extend dict.has_key() to handle *named tags*.""" return self.__contains__(key) # is_big_endian property def _getBigEndian(self): return not self.is_little_endian def _setBigEndian(self, value): self.is_little_endian = not value is_big_endian = property(_getBigEndian, _setBigEndian) def __iter__(self): """Method to iterate through the dataset, returning data_elements. e.g.: for data_element in dataset: do_something... The data_elements are returned in DICOM order, i.e. in increasing order by tag value. Sequence items are returned as a single data_element; it is up to the calling code to recurse into the Sequence items if desired """ # Note this is different than the underlying dict class, # which returns the key of the key:value mapping. # Here the value is returned (but data_element.tag has the key) taglist = sorted(self.keys()) for tag in taglist: yield self[tag] def _PixelDataNumpy(self): """Return a NumPy array of the pixel data. NumPy is the most recent numerical package for python. It is used if available. :raises TypeError: if no pixel data in this dataset. :raises ImportError: if cannot import numpy. """ if not 'PixelData' in self: raise TypeError, "No pixel data found in this dataset." if not have_numpy: msg = "The Numpy package is required to use pixel_array, and numpy could not be imported.\n" raise ImportError, msg # determine the type used for the array need_byteswap = (self.is_little_endian != sys_is_little_endian) # Make NumPy format code, e.g. "uint16", "int32" etc # from two pieces of info: # self.PixelRepresentation -- 0 for unsigned, 1 for signed; # self.BitsAllocated -- 8, 16, or 32 format_str = '%sint%d' % (('u', '')[self.PixelRepresentation], self.BitsAllocated) try: numpy_format = numpy.dtype(format_str) except TypeError: raise TypeError("Data type not understood by NumPy: " "format='%s', PixelRepresentation=%d, BitsAllocated=%d" % ( numpy_format, self.PixelRepresentation, self.BitsAllocated)) # Have correct Numpy format, so create the NumPy array arr = numpy.fromstring(self.PixelData, numpy_format) # XXX byte swap - may later handle this in read_file!!? if need_byteswap: arr.byteswap(True) # True means swap in-place, don't make a new copy # Note the following reshape operations return a new *view* onto arr, but don't copy the data if 'NumberOfFrames' in self and self.NumberOfFrames > 1: if self.SamplesPerPixel > 1: arr = arr.reshape(self.SamplesPerPixel, self.NumberOfFrames, self.Rows, self.Columns) else: arr = arr.reshape(self.NumberOfFrames, self.Rows, self.Columns) else: if self.SamplesPerPixel > 1: if self.BitsAllocated == 8: arr = arr.reshape(self.SamplesPerPixel, self.Rows, self.Columns) else: raise NotImplementedError, "This code only handles SamplesPerPixel > 1 if Bits Allocated = 8" else: arr = arr.reshape(self.Rows, self.Columns) return arr # PixelArray property def _getPixelArray(self): # Check if pixel data is in a form we know how to make into an array # XXX uses file_meta here, should really only be thus for FileDataset if self.file_meta.TransferSyntaxUID not in NotCompressedPixelTransferSyntaxes : raise NotImplementedError, "Pixel Data is compressed in a format pydicom does not yet handle. Cannot return array" # Check if already have converted to a NumPy array # Also check if self.PixelData has changed. If so, get new NumPy array alreadyHave = True if not hasattr(self, "_PixelArray"): alreadyHave = False elif self._pixel_id != id(self.PixelData): alreadyHave = False if not alreadyHave: self._PixelArray = self._PixelDataNumpy() self._pixel_id = id(self.PixelData) # is this guaranteed to work if memory is re-used?? return self._PixelArray def _get_pixel_array(self): try: return self._getPixelArray() except AttributeError: t, e, tb = sys.exc_info() raise PropertyError("AttributeError in pixel_array property: " + \ e.args[0]), None, tb pixel_array = property(_get_pixel_array) PixelArray = pixel_array # for backwards compatibility -- remove in v1.0 # Format strings spec'd according to python string formatting options # See http://docs.python.org/library/stdtypes.html#string-formatting-operations default_element_format = "%(tag)s %(name)-35.35s %(VR)s: %(repval)s" default_sequence_element_format = "%(tag)s %(name)-35.35s %(VR)s: %(repval)s" def formatted_lines(self, element_format=default_element_format, sequence_element_format=default_sequence_element_format, indent_format=None): """A generator to give back a formatted string representing each line one at a time. Example: for line in dataset.formatted_lines("%(name)s=%(repval)s", "SQ:%(name)s=%(repval)s"): print line See the source code for default values which illustrate some of the names that can be used in the format strings indent_format -- not used in current version. Placeholder for future functionality. """ for data_element in self.iterall(): # Get all the attributes possible for this data element (e.g. gets descriptive text name too) # This is the dictionary of names that can be used in the format string elem_dict = dict() for x in dir(data_element): if not x.startswith("_"): get_x = getattr(data_element, x) if callable(get_x): get_x = get_x() elem_dict[x] = get_x # Commented out below is much less verbose version of above dict for python >= 2.5 # elem_dict = dict([(x, getattr(data_element,x)() if callable(getattr(data_element,x)) # else getattr(data_element,x)) # for x in dir(data_element) if not x.startswith("_")]) if data_element.VR == "SQ": yield sequence_element_format % elem_dict else: yield element_format % elem_dict def _PrettyStr(self, indent=0, topLevelOnly=False): """Return a string of the data_elements in this dataset, with indented levels. This private method is called by the __str__() method for handling print statements or str(dataset), and the __repr__() method. It is also used by top(), which is the reason for the topLevelOnly flag. This function recurses, with increasing indentation levels. """ strings = [] indentStr = self.indentChars * indent nextIndentStr = self.indentChars *(indent+1) for data_element in self: if data_element.VR == "SQ": # a sequence strings.append(indentStr + str(data_element.tag) + " %s %i item(s) ---- " % ( data_element.description(),len(data_element.value))) if not topLevelOnly: for dataset in data_element.value: strings.append(dataset._PrettyStr(indent+1)) strings.append(nextIndentStr + "---------") else: strings.append(indentStr + repr(data_element)) return "\n".join(strings) def remove_private_tags(self): """Remove all Dicom private tags in this dataset and those contained within.""" def RemoveCallback(dataset, data_element): """Internal method to use as callback to walk() method.""" if data_element.tag.is_private: # can't del self[tag] - won't be right dataset on recursion del dataset[data_element.tag] self.walk(RemoveCallback) RemovePrivateTags = remove_private_tags # for backwards compatibility def save_as(self, filename, WriteLikeOriginal=True): """Write the dataset to a file. filename -- full path and filename to save the file to WriteLikeOriginal -- see dicom.filewriter.write_file for info on this parameter. """ dicom.write_file(filename, self, WriteLikeOriginal) SaveAs = save_as # for backwards compatibility def __setattr__(self, name, value): """Intercept any attempts to set a value for an instance attribute. If name is a dicom descriptive string (cleaned with CleanName), then set the corresponding tag and data_element. Else, set an instance (python) attribute as any other class would do. """ tag = tag_for_name(name) if tag is not None: # successfully mapped name to a tag if tag not in self: # don't have this tag yet->create the data_element instance VR = dictionaryVR(tag) data_element = DataElement(tag, VR, value) else: # already have this data_element, just changing its value data_element = self[tag] data_element.value = value # Now have data_element - store it in this dict self[tag] = data_element else: # name not in dicom dictionary - setting a non-dicom instance attribute # XXX note if user mis-spells a dicom data_element - no error!!! self.__dict__[name] = value def __setitem__(self, key, value): """Operator for dataset[key]=value. Check consistency, and deal with private tags""" if not isinstance(value, (DataElement, RawDataElement)): # ok if is subclass, e.g. DeferredDataElement raise TypeError, "Dataset contents must be DataElement instances.\n" + \ "To set a data_element value use data_element.value=val" tag = Tag(value.tag) if key != tag: raise ValueError, "data_element.tag must match the dictionary key" data_element = value if tag.is_private: # See PS 3.5-2008 section 7.8.1 (p. 44) for how blocks are reserved logging.debug("Setting private tag %r" % tag) private_block = tag.elem >> 8 private_creator_tag = Tag(tag.group, private_block) if private_creator_tag in self and tag != private_creator_tag: if isinstance(data_element, RawDataElement): data_element = DataElement_from_raw(data_element) data_element.private_creator = self[private_creator_tag].value dict.__setitem__(self, tag, data_element) def __str__(self): """Handle str(dataset).""" return self._PrettyStr() def top(self): """Show the DICOM tags, but only the top level; do not recurse into Sequences""" return self._PrettyStr(topLevelOnly=True) def trait_names(self): """Return a list of valid names for auto-completion code Used in IPython, so that data element names can be found and offered for autocompletion on the IPython command line """ return self.__dir__() # can't use dir(self) for python <2.6 def update(self, dictionary): """Extend dict.update() to handle *named tags*.""" for key, value in dictionary.items(): if is_stringlike(key): setattr(self, key, value) else: self[Tag(key)] = value def iterall(self): """Iterate through the dataset, yielding all data elements. Unlike Dataset.__iter__, this *does* recurse into sequences, and so returns all data elements as if the file were "flattened". """ for data_element in self: yield data_element if data_element.VR == "SQ": sequence = data_element.value for dataset in sequence: for elem in dataset.iterall(): yield elem def walk(self, callback): """Call the given function for all dataset data_elements (recurses). Go through all data_elements, recursing into sequences and their datasets, calling the callback function at each data_element (including the SQ data_element). This can be used to perform an operation on certain types of data_elements. For example, RemovePrivateTags() finds all private tags and deletes them. callback -- a callable method which takes two arguments: a dataset, and a data_element belonging to that dataset. DataElements will come back in dicom order (by increasing tag number within their dataset) """ taglist = sorted(self.keys()) for tag in taglist: data_element = self[tag] callback(self, data_element) # self = this Dataset # 'tag in self' below needed in case data_element was deleted in callback if tag in self and data_element.VR == "SQ": sequence = data_element.value for dataset in sequence: dataset.walk(callback) __repr__ = __str__ class FileDataset(Dataset): def __init__(self, filename_or_obj, dataset, preamble=None, file_meta=None, is_implicit_VR=True, is_little_endian=True): """Initialize a dataset read from a DICOM file :param filename: full path and filename to the file. Use None if is a StringIO. :param dataset: some form of dictionary, usually a Dataset from read_dataset() :param preamble: the 128-byte DICOM preamble :param file_meta: the file meta info dataset, as returned by _read_file_meta, or an empty dataset if no file meta information is in the file :param is_implicit_VR: True if implicit VR transfer syntax used; False if explicit VR. Default is True. :param is_little_endian: True if little-endian transfer syntax used; False if big-endian. Default is True. """ Dataset.__init__(self, dataset) self.preamble = preamble self.file_meta = file_meta self.is_implicit_VR = is_implicit_VR self.is_little_endian = is_little_endian if isinstance(filename_or_obj, basestring): self.filename = filename_or_obj self.fileobj_type = file else: # Note next line uses __class__ due to gzip using old-style classes # until after python2.5 (or 2.6?) # Should move to using type(filename_or_obj) when possible # See http://docs.python.org/reference/datamodel.html: # "if x is an instance of an old-style class, then x .__class__ # designates the class of x, but type(x) is always " self.fileobj_type = filename_or_obj.__class__ if getattr(filename_or_obj, "name", False): self.filename = filename_or_obj.name elif getattr(filename_or_obj, "filename", False): #gzip python <2.7? self.filename = filename_or_obj.filename else: self.filename = None # e.g. came from StringIO or something file-like self.timestamp = None if stat_available and self.filename and os.path.exists(self.filename): statinfo = stat(self.filename) self.timestamp = statinfo.st_mtime pydicom-0.9.7/dicom/doc/000755 000765 000024 00000000000 11726534607 015313 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/encaps.py000644 000765 000024 00000005716 11726534363 016401 0ustar00darcystaff000000 000000 # encaps.py """Routines for working with encapsulated (compressed) data """ # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # Encapsulated Pixel Data -- 3.5-2008 A.4 # Encapsulated Pixel data is in a number of Items (start with Item tag (0xFFFE,E000) and ending ultimately with SQ delimiter and Item Length field of 0 (no value), # just like SQ of undefined length, but here Item must have explicit length. # PixelData length is Undefined Length if encapsulated # First item is an Offset Table. It can have 0 length and no value, or it can have a table of US pointers to first byte of the Item tag starting each *Frame*, # where 0 of pointer is at first Item tag following the Offset table # If a single frame, it may be 0 length/no value, or it may have a single pointer (0). import logging logger = logging.getLogger('pydicom') from dicom.filebase import DicomStringIO from dicom.tag import ItemTag, SequenceDelimiterTag def defragment_data(data): """Read encapsulated data and return one continuous string data -- string of encapsulated data, typically dataset.PixelData Return all fragments concatenated together as a byte string If PixelData has multiple frames, then should separate out before calling this routine. """ # Convert data into a memory-mapped file fp = DicomStringIO(data) fp.is_little_endian = True # DICOM standard requires this BasicOffsetTable = read_item(fp) seq = [] while True: item = read_item(fp) if not item: # None is returned if get to Sequence Delimiter break seq.append(item) # XXX should return "".join(seq) # read_item modeled after filereader.ReadSequenceItem def read_item(fp): """Read and return a single Item in the fragmented data stream""" try: tag = fp.read_tag() except EOFError: # already read delimiter before passing data here, so should just run out return None if tag == SequenceDelimiterTag: # No more items, time for sequence to stop reading length = fp.read_UL() logger.debug("%04x: Sequence Delimiter, length 0x%x", fp.tell()-8, length) if length != 0: logger.warning("Expected 0x00000000 after delimiter, found 0x%x, at data position 0x%x", length, fp.tell()-4) return None if tag != ItemTag: logger.warning("Expected Item with tag %s at data position 0x%x", ItemTag, fp.tell()-4) length = fp.read_UL() else: length = fp.read_UL() logger.debug("%04x: Item, length 0x%x", fp.tell()-8, length) if length == 0xFFFFFFFFL: raise ValueError, "Encapsulated data fragment had Undefined Length at data position 0x%x" % fp.tell()-4 item_data = fp.read(length) return item_data pydicom-0.9.7/dicom/examples/000755 000765 000024 00000000000 11726534607 016364 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/filebase.py000644 000765 000024 00000014536 11726534363 016702 0ustar00darcystaff000000 000000 # filebase.py """Hold DicomFile class, which does basic I/O for a dicom file.""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from dicom.tag import Tag from struct import unpack, pack from cStringIO import StringIO import logging logger = logging.getLogger('pydicom') class DicomIO(object): """File object which holds transfer syntax info and anything else we need.""" max_read_attempts = 3 # number of times to read if don't get requested bytes defer_size = None # default def __init__(self, *args, **kwargs): self._ImplicitVR = True # start with this by default def __del__(self): self.close() def read_le_tag(self): """Read and return two unsigned shorts (little endian) from the file.""" bytes = self.read(4) if len(bytes) < 4: raise EOFError # needed for reading "next" tag when at end of file return unpack(bytes, "HH") def write_tag(self, tag): """Write a dicom tag (two unsigned shorts) to the file.""" tag = Tag(tag) # make sure is an instance of class, not just a tuple or int self.write_US(tag.group) self.write_US(tag.element) def read_leUS(self): """Return an unsigned short from the file with little endian byte order""" return unpack("H", self.read(2))[0] def read_leUL(self): """Return an unsigned long read with little endian byte order""" return unpack("H", val)) def write_beUL(self, val): """Write an unsigned long with big endian byte order""" self.write(pack(">L", val)) write_US = write_leUS # XXX should we default to this? write_UL = write_leUL # XXX " def read_beUL(self): """Return an unsigned long read with big endian byte order""" return unpack(">L", self.read(4))[0] # Set up properties BigEndian, LittleEndian, ImplicitVR, ExplicitVR. # Big/Little Endian changes functions to read unsigned short or long, e.g. length fields etc def _setLittleEndian(self, value): self._LittleEndian = value if value: # LittleEndian self.read_US = self.read_leUS self.read_UL = self.read_leUL self.write_US = self.write_leUS self.write_UL = self.write_leUL self.read_tag = self.read_le_tag else: # BigEndian self.read_US = self.read_beUS self.read_UL = self.read_beUL self.write_US = self.write_beUS self.write_UL = self.write_beUL self.read_tag = self.read_be_tag def _getLittleEndian(self): return self._LittleEndian def _setBigEndian(self, value): self.is_little_endian = not value # note: must use self.is_little_endian not self._LittleEndian def _getBigEndian(self): return not self.is_little_endian def _getImplicitVR(self): return self._ImplicitVR def _setImplicitVR(self, value): self._ImplicitVR = value def _setExplicitVR(self, value): self.is_implicit_VR = not value def _getExplicitVR(self): return not self.is_implicit_VR is_little_endian = property(_getLittleEndian, _setLittleEndian) is_big_endian = property(_getBigEndian, _setBigEndian) is_implicit_VR = property(_getImplicitVR, _setImplicitVR) is_explicit_VR = property(_getExplicitVR, _setExplicitVR) class DicomFileLike(DicomIO): def __init__(self, file_like_obj): self.parent = file_like_obj self.parent_read = file_like_obj.read self.write = getattr(file_like_obj, "write", self.no_write) self.seek = file_like_obj.seek self.tell = file_like_obj.tell self.close = file_like_obj.close self.name = getattr(file_like_obj, 'name', '') def no_write(self, bytes): """Used for file-like objects where no write is available""" raise IOError, "This DicomFileLike object has no write() method" def DicomFile(*args, **kwargs): return DicomFileLike(open(*args, **kwargs)) def DicomStringIO(*args, **kwargs): return DicomFileLike(StringIO(*args, **kwargs)) pydicom-0.9.7/dicom/filereader.py000644 000765 000024 00000070126 11726534363 017227 0ustar00darcystaff000000 000000 # filereader.py """Read a dicom media file""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # Need zlib and cStringIO for deflate-compressed file import os.path import warnings import zlib from cStringIO import StringIO # tried cStringIO but wouldn't let me derive class from it. import logging from dicom.tag import TupleTag from dicom.dataelem import RawDataElement from dicom.util.hexutil import bytes2hex logger = logging.getLogger('pydicom') stat_available = True try: from os import stat except: stat_available = False try: from os import SEEK_CUR except ImportError: # SEEK_CUR not available in python < 2.5 SEEK_CUR = 1 import dicom.UID # for Implicit/Explicit / Little/Big Endian transfer syntax UIDs from dicom.filebase import DicomFile, DicomFileLike from dicom.filebase import DicomIO, DicomStringIO from dicom.dataset import Dataset, FileDataset from dicom.datadict import dictionaryVR from dicom.dataelem import DataElement, DeferredDataElement from dicom.tag import Tag, ItemTag, ItemDelimiterTag, SequenceDelimiterTag from dicom.sequence import Sequence from dicom.misc import size_in_bytes from dicom.fileutil import absorb_delimiter_item, read_undefined_length_value from dicom.fileutil import length_of_undefined_length from struct import unpack from sys import byteorder sys_is_little_endian = (byteorder == 'little') class InvalidDicomError(Exception): """Exception that is raised when the the file does not seem to be a valid dicom file. This is the case when the three characters "DICM" are not present at position 128 in the file. (According to the dicom specification, each dicom file should have this.) To force reading the file (because maybe it is a dicom file without a header), use read_file(..., force=True). """ def __init__(self, *args): if not args: args = ('The specified file is not a valid DICOM file.',) Exception.__init__(self, *args) def open_dicom(filename, force=False): """Iterate over data elements for full control of the reading process. **Note**: This function is possibly unstable, as it uses the DicomFile class, which has been removed in other parts of pydicom in favor of simple files. It needs to be updated (or may be removed in future versions of pydicom). Use ``read_file`` or ``read_partial`` for most purposes. This function is only needed if finer control of the reading process is required. :param filename: A string containing the file path/name. :returns: an iterator which yields one data element each call. First, the file_meta data elements are returned, then the data elements for the DICOM dataset stored in the file. Similar to opening a file using python open() and iterating by line, for example like this:: from dicom.filereader import open_dicom from dicom.dataset import Dataset ds = Dataset() for data_element in open_dicom("CT_small.dcm"): if meets_some_condition(data_element): ds.add(data_element) if some_other_condition(data_element): break """ return DicomIter(DicomFile(filename,'rb'), force=force) class DicomIter(object): """Iterator over DICOM data elements created from a file-like object """ def __init__(self, fp, stop_when=None, force=False): """Read the preambleand meta info, prepare iterator for remainder fp -- an open DicomFileLike object, at start of file Adds flags to fp: Big/Little-endian and Implicit/Explicit VR """ self.fp = fp self.stop_when = stop_when self.preamble = preamble = read_preamble(fp, force) self.has_header = has_header = (preamble is not None) self.file_meta_info = Dataset() if has_header: self.file_meta_info = file_meta_info = _read_file_meta_info(fp) transfer_syntax = file_meta_info.TransferSyntaxUID if transfer_syntax == dicom.UID.ExplicitVRLittleEndian: self._is_implicit_VR = False self._is_little_endian = True elif transfer_syntax == dicom.UID.ImplicitVRLittleEndian: self._is_implicit_VR = True self._is_little_endian = True elif transfer_syntax == dicom.UID.ExplicitVRBigEndian: self._is_implicit_VR = False self._is_little_endian = False elif transfer_syntax == dicom.UID.DeflatedExplicitVRLittleEndian: # See PS3.6-2008 A.5 (p 71) -- when written, the entire dataset following # the file metadata was prepared the normal way, then "deflate" compression applied. # All that is needed here is to decompress and then use as normal in a file-like object zipped = fp.read() # -MAX_WBITS part is from comp.lang.python answer: http://groups.google.com/group/comp.lang.python/msg/e95b3b38a71e6799 unzipped = zlib.decompress(zipped, -zlib.MAX_WBITS) fp = StringIO(unzipped) # a file-like object that usual code can use as normal self.fp = fp #point to new object self._is_implicit_VR = False self._is_little_endian = True else: # Any other syntax should be Explicit VR Little Endian, # e.g. all Encapsulated (JPEG etc) are ExplVR-LE by Standard PS 3.5-2008 A.4 (p63) self._is_implicit_VR = False self._is_little_endian = True else: # no header -- make assumptions fp.TransferSyntaxUID = dicom.UID.ImplicitVRLittleEndian self._is_little_endian = True self._is_implicit_VR = True logger.debug("Using %s VR, %s Endian transfer syntax" %(("Explicit", "Implicit")[self._is_implicit_VR], ("Big", "Little")[self._is_little_endian])) def __iter__(self): tags = sorted(self.file_meta_info.keys()) for tag in tags: yield self.file_meta_info[tag] for data_element in data_element_generator(self.fp, self._is_implicit_VR, self._is_little_endian, stop_when=self.stop_when): yield data_element def data_element_generator(fp, is_implicit_VR, is_little_endian, stop_when=None, defer_size=None): """Create a generator to efficiently return the raw data elements Specifically, returns (VR, length, raw_bytes, value_tell, is_little_endian), where: VR -- None if implicit VR, otherwise the VR read from the file length -- the length as in the DICOM data element (could be DICOM "undefined length" 0xffffffffL), value_bytes -- the raw bytes from the DICOM file (not parsed into python types) is_little_endian -- True if transfer syntax is little endian; else False """ # Summary of DICOM standard PS3.5-2008 chapter 7: # If Implicit VR, data element is: # tag, 4-byte length, value. # The 4-byte length can be FFFFFFFF (undefined length)* # If Explicit VR: # if OB, OW, OF, SQ, UN, or UT: # tag, VR, 2-bytes reserved (both zero), 4-byte length, value # For all but UT, the length can be FFFFFFFF (undefined length)* # else: (any other VR) # tag, VR, (2 byte length), value # * for undefined length, a Sequence Delimitation Item marks the end # of the Value Field. # Note, except for the special_VRs, both impl and expl VR use 8 bytes; # the special VRs follow the 8 bytes with a 4-byte length # With a generator, state is stored, so we can break down # into the individual cases, and not have to check them again for each # data element # Make local variables so have faster lookup fp_read = fp.read fp_tell = fp.tell logger_debug = logger.debug debugging = dicom.debugging if is_little_endian: endian_chr = "<" else: endian_chr = ">" if is_implicit_VR: unpack_format = endian_chr + "HHL" # XXX in python >=2.5, can do struct.Struct to save time else: # Explicit VR unpack_format = endian_chr + "HH2sH" # tag, VR, 2-byte length (or 0 if special VRs) extra_length_format = endian_chr + "L" # for special VRs while True: # Read tag, VR, length, get ready to read value bytes_read = fp_read(8) if len(bytes_read) < 8: raise StopIteration # at end of file if debugging: debug_msg = "%08x: %s" % (fp.tell()-8, bytes2hex(bytes_read)) if is_implicit_VR: VR = None # must reset each time -- may have looked up on last iteration (e.g. SQ) group, elem, length = unpack(unpack_format, bytes_read) else: # explicit VR group, elem, VR, length = unpack(unpack_format, bytes_read) if VR in ('OB','OW','OF','SQ','UN', 'UT'): bytes_read = fp_read(4) length = unpack(extra_length_format, bytes_read)[0] if debugging: debug_msg += " " + bytes2hex(bytes_read) if debugging: debug_msg = "%-47s (%04x, %04x)" % (debug_msg, group, elem) if not is_implicit_VR: debug_msg += " %s " % VR if length != 0xFFFFFFFFL: debug_msg += "Length: %d" % length else: debug_msg += "Length: Undefined length (FFFFFFFF)" logger_debug(debug_msg) # Now are positioned to read the value, but may not want to -- check stop_when value_tell = fp_tell() # logger.debug("%08x: start of value of length %d" % (value_tell, length)) tag = TupleTag((group, elem)) if stop_when is not None: if stop_when(tag, VR, length): # XXX VR may be None here!! Should stop_when just take tag? if debugging: logger_debug("Reading ended by stop_when callback. Rewinding to start of data element.") rewind_length = 8 if not is_implicit_VR and VR in ('OB','OW','OF','SQ','UN', 'UT'): rewind_length += 4 fp.seek(value_tell-rewind_length) raise StopIteration # Reading the value # First case (most common): reading a value with a defined length if length != 0xFFFFFFFFL: if defer_size is not None and length > defer_size: # Flag as deferred read by setting value to None, and skip bytes value = None logger_debug("Defer size exceeded. Skipping forward to next data element.") fp.seek(fp_tell()+length) else: value = fp_read(length) if debugging: dotdot = " " if length > 12: dotdot = "..." logger_debug("%08x: %-34s %s %r %s" % (value_tell, bytes2hex(value[:12]), dotdot, value[:12], dotdot)) yield RawDataElement(tag, VR, length, value, value_tell, is_implicit_VR, is_little_endian) # Second case: undefined length - must seek to delimiter, # ... unless is SQ type, in which case is easier to parse it, because # undefined length SQs and items of undefined lengths can be nested # and it would be error-prone to read to the correct outer delimiter else: # Try to look up type to see if is a SQ # if private tag, won't be able to look it up in dictionary, # in which case just ignore it and read the bytes if VR is None: try: VR = dictionaryVR(tag) except KeyError: pass if VR == 'SQ': if debugging: logger_debug("%08x: Reading and parsing undefined length sequence" % fp_tell()) seq = read_sequence(fp, is_implicit_VR, is_little_endian, length) yield DataElement(tag, VR, seq, value_tell, is_undefined_length=True) else: delimiter = SequenceDelimiterTag if debugging: logger_debug("Reading undefined length data element") value = read_undefined_length_value(fp, is_little_endian, delimiter, defer_size) yield RawDataElement(tag, VR, length, value, value_tell, is_implicit_VR, is_little_endian) def read_dataset(fp, is_implicit_VR, is_little_endian, bytelength=None, stop_when=None, defer_size=None): """Return a Dataset instance containing the next dataset in the file. :param fp: an opened file object :param is_implicit_VR: True if file transfer syntax is implicit VR :param is_little_endian: True if file has little endian transfer syntax :param bytelength: None to read until end of file or ItemDeliterTag, else a fixed number of bytes to read :param stop_when: optional call_back function which can terminate reading. See help for data_element_generator for details :param defer_size: optional size to avoid loading large elements into memory. See help for data_element_generator for details :returns: a Dataset instance """ raw_data_elements = dict() fpStart = fp.tell() de_gen = data_element_generator(fp, is_implicit_VR, is_little_endian, stop_when, defer_size) try: while (bytelength is None) or (fp.tell()-fpStart < bytelength): raw_data_element = de_gen.next() # Read data elements. Stop on certain errors, but return what was already read tag = raw_data_element.tag if tag == (0xFFFE, 0xE00D): #ItemDelimiterTag --dataset is an item in a sequence break raw_data_elements[tag] = raw_data_element except StopIteration: pass except EOFError, details: logger.error(str(details) + " in file " + getattr(fp, "name", "")) # XXX is this visible enough to user code? except NotImplementedError, details: logger.error(details) return Dataset(raw_data_elements) def read_sequence(fp, is_implicit_VR, is_little_endian, bytelength, offset=0): """Read and return a Sequence -- i.e. a list of Datasets""" seq = [] # use builtin list to start for speed, convert to Sequence at end is_undefined_length = False if bytelength != 0: # Sequence of length 0 is possible (PS 3.5-2008 7.5.1a (p.40) if bytelength == 0xffffffffL: is_undefined_length = True bytelength = None fp_tell = fp.tell # for speed in loop fpStart = fp_tell() while (not bytelength) or (fp_tell()-fpStart < bytelength): file_tell = fp.tell() dataset = read_sequence_item(fp, is_implicit_VR, is_little_endian) if dataset is None: # None is returned if get to Sequence Delimiter break dataset.file_tell = file_tell+offset seq.append(dataset) seq = Sequence(seq) seq.is_undefined_length = is_undefined_length return seq def read_sequence_item(fp, is_implicit_VR, is_little_endian): """Read and return a single sequence item, i.e. a Dataset""" if is_little_endian: tag_length_format = "= defer_size: return None else: return "".join(value_chunks) def find_delimiter(fp, delimiter, is_little_endian, read_size=128, rewind=True): """Return file position where 4-byte delimiter is located. Return None if reach end of file without finding the delimiter. On return, file position will be where it was before this function, unless rewind argument is False. """ struct_format = "2.4 val = "\\".join([x.original_string if hasattr(x, 'original_string') # else str(x) for x in val]) newval = [] for x in val: if hasattr(x, 'original_string'): newval.append(x.original_string) else: newval.append(str(x)) val = "\\".join(newval) else: # XXX python>2.4 val = val.original_string if hasattr(val, 'original_string') else str(val) if hasattr(val, 'original_string'): val = val.original_string else: val = str(val) if len(val) % 2 != 0: val = val + padding # pad to even length fp.write(val) def write_data_element(fp, data_element): """Write the data_element to file fp according to dicom media storage rules.""" fp.write_tag(data_element.tag) VR = data_element.VR if fp.is_explicit_VR: if len(VR) != 2: msg = "Cannot write ambiguous VR of '%s' for data element with tag %r." % (VR, data_element.tag) msg += "\nSet the correct VR before writing, or use an implicit VR transfer syntax" raise ValueError, msg fp.write(VR) if VR in ['OB', 'OW', 'OF', 'SQ', 'UT', 'UN']: fp.write_US(0) # reserved 2 bytes if VR not in writers: raise NotImplementedError, "write_data_element: unknown Value Representation '%s'" % VR length_location = fp.tell() # save location for later. if fp.is_explicit_VR and VR not in ['OB', 'OW', 'OF', 'SQ', 'UT', 'UN']: fp.write_US(0) # Explicit VR length field is only 2 bytes else: fp.write_UL(0xFFFFFFFFL) # will fill in real length value later if not undefined length item try: writers[VR][0] # if writer is a tuple, then need to pass a number format except TypeError: writers[VR](fp, data_element) # call the function to write that kind of item else: writers[VR][0](fp, data_element, writers[VR][1]) # print DataElement(tag, VR, value) is_undefined_length = False if hasattr(data_element, "is_undefined_length") and data_element.is_undefined_length: is_undefined_length = True location = fp.tell() fp.seek(length_location) if fp.is_explicit_VR and VR not in ['OB', 'OW', 'OF', 'SQ', 'UT', 'UN']: fp.write_US(location - length_location - 2) # 2 is length of US else: # write the proper length of the data_element back in the length slot, unless is SQ with undefined length. if not is_undefined_length: fp.write_UL(location - length_location - 4) # 4 is length of UL fp.seek(location) # ready for next data_element if is_undefined_length: fp.write_tag(SequenceDelimiterTag) fp.write_UL(0) # 4-byte 'length' of delimiter data item def write_dataset(fp, dataset): """Write a Dataset dictionary to the file. Return the total length written.""" fpStart = fp.tell() # data_elements must be written in tag order tags = sorted(dataset.keys()) for tag in tags: write_data_element(fp, dataset[tag]) return fp.tell() - fpStart def write_sequence(fp, data_element): """Write a dicom Sequence contained in data_element to the file fp.""" # write_data_element has already written the VR='SQ' (if needed) and # a placeholder for length""" sequence = data_element.value for dataset in sequence: write_sequence_item(fp, dataset) def write_sequence_item(fp, dataset): """Write an item (dataset) in a dicom Sequence to the dicom file fp.""" # see Dicom standard Part 5, p. 39 ('03 version) # This is similar to writing a data_element, but with a specific tag for Sequence Item fp.write_tag(ItemTag) # marker for start of Sequence Item length_location = fp.tell() # save location for later. fp.write_UL(0xffffffffL) # will fill in real value later if not undefined length write_dataset(fp, dataset) if getattr(dataset, "is_undefined_length_sequence_item", False): fp.write_tag(ItemDelimiterTag) fp.write_UL(0) # 4-bytes 'length' field for delimiter item else: # we will be nice and set the lengths for the reader of this file location = fp.tell() fp.seek(length_location) fp.write_UL(location - length_location - 4) # 4 is length of UL fp.seek(location) # ready for next data_element def write_UN(fp, data_element): """Write a byte string for an DataElement of value 'UN' (unknown).""" fp.write(data_element.value) def write_ATvalue(fp, data_element): """Write a data_element tag to a file.""" try: iter(data_element.value) # see if is multi-valued AT; # Note will fail if Tag ever derived from true tuple rather than being a long except TypeError: tag = Tag(data_element.value) # make sure is expressed as a Tag instance fp.write_tag(tag) else: tags = [Tag(tag) for tag in data_element.value] for tag in tags: fp.write_tag(tag) def _write_file_meta_info(fp, meta_dataset): """Write the dicom group 2 dicom storage File Meta Information to the file. The file should already be positioned past the 128 byte preamble. Raises ValueError if the required data_elements (elements 2,3,0x10,0x12) are not in the dataset. If the dataset came from a file read with read_file(), then the required data_elements should already be there. """ fp.write('DICM') # File meta info is always LittleEndian, Explicit VR. After will change these # to the transfer syntax values set in the meta info fp.is_little_endian = True fp.is_explicit_VR = True if Tag((2,1)) not in meta_dataset: meta_dataset.add_new((2,1), 'OB', "\0\1") # file meta information version # Now check that required meta info tags are present: missing = [] for element in [2, 3, 0x10, 0x12]: if Tag((2, element)) not in meta_dataset: missing.append(Tag((2, element))) if missing: raise ValueError, "Missing required tags %s for file meta information" % str(missing) # Put in temp number for required group length, save current location to come back meta_dataset[(2,0)] = DataElement((2,0), 'UL', 0) # put 0 to start group_length_data_element_size = 12 # !based on DICOM std ExplVR group_length_tell = fp.tell() # Write the file meta datset, including temp group length length = write_dataset(fp, meta_dataset) group_length = length - group_length_data_element_size # counts from end of that # Save end of file meta to go back to end_of_file_meta = fp.tell() # Go back and write the actual group length fp.seek(group_length_tell) group_length_data_element = DataElement((2,0), 'UL', group_length) write_data_element(fp, group_length_data_element) # Return to end of file meta, ready to write remainder of the file fp.seek(end_of_file_meta) def write_file(filename, dataset, WriteLikeOriginal=True): """Store a Dataset to the filename specified. Set dataset.preamble if you want something other than 128 0-bytes. If the dataset was read from an existing dicom file, then its preamble was stored at read time. It is up to you to ensure the preamble is still correct for its purposes. If there is no Transfer Syntax tag in the dataset, Set dataset.is_implicit_VR, and .is_little_endian to determine the transfer syntax used to write the file. WriteLikeOriginal -- True if want to preserve the following for each sequence within this dataset: - preamble -- if no preamble in read file, than not used here - dataset.hasFileMeta -- if writer did not do file meta information, then don't write here either - seq.is_undefined_length -- if original had delimiters, write them now too, instead of the more sensible length characters - .is_undefined_length_sequence_item -- for datasets that belong to a sequence, write the undefined length delimiters if that is what the original had Set WriteLikeOriginal = False to produce a "nicer" DICOM file for other readers, where all lengths are explicit. """ # Decide whether to write DICOM preamble. Should always do so unless trying to mimic the original file read in preamble = getattr(dataset, "preamble", None) if not preamble and not WriteLikeOriginal: preamble = "\0"*128 file_meta = dataset.file_meta if file_meta is None: file_meta = Dataset() if 'TransferSyntaxUID' not in file_meta: if dataset.is_little_endian and dataset.is_implicit_VR: file_meta.add_new((2, 0x10), 'UI', ImplicitVRLittleEndian) elif dataset.is_little_endian and not dataset.is_implicit_VR: file_meta.add_new((2, 0x10), 'UI', ExplicitVRLittleEndian) elif dataset.is_big_endian and not dataset.is_implicit_VR: file_meta.add_new((2, 0x10), 'UI', ExplicitVRBigEndian) else: raise NotImplementedError, "pydicom has not been verified for Big Endian with Implicit VR" fp = DicomFile(filename,'wb') try: if preamble: fp.write(preamble) # blank 128 byte preamble _write_file_meta_info(fp, file_meta) # Set file VR, endian. MUST BE AFTER writing META INFO (which changes to Explict LittleEndian) fp.is_implicit_VR = dataset.is_implicit_VR fp.is_little_endian = dataset.is_little_endian write_dataset(fp, dataset) finally: fp.close() WriteFile = write_file # for backwards compatibility version <=0.9.2 writefile = write_file # forgive user for missing underscore # Map each VR to a function which can write it # for write_numbers, the Writer maps to a tuple (function, struct_format) # (struct_format is python's struct module format) writers = {'UL':(write_numbers,'L'), 'SL':(write_numbers,'l'), 'US':(write_numbers,'H'), 'SS':(write_numbers, 'h'), 'FL':(write_numbers,'f'), 'FD':(write_numbers, 'd'), 'OF':(write_numbers,'f'), 'OB':write_OBvalue, 'UI':write_UI, 'SH':write_string, 'DA':write_string, 'TM': write_string, 'CS':write_string, 'PN':write_string, 'LO': write_string, 'IS':write_number_string, 'DS':write_number_string, 'AE': write_string, 'AS':write_string, 'LT':write_string, 'SQ':write_sequence, 'UN':write_UN, 'AT':write_ATvalue, 'ST':write_string, 'OW':write_OWvalue, 'US or SS':write_OWvalue, 'OW/OB':write_OBvalue, 'OB/OW':write_OBvalue, 'OB or OW':write_OBvalue, 'OW or OB':write_OBvalue, 'DT':write_string, 'UT':write_string, } # note OW/OB depends on other items, which we don't know at write time pydicom-0.9.7/dicom/misc.py000644 000765 000024 00000001370 11726534363 016053 0ustar00darcystaff000000 000000 # misc.py """Miscellaneous helper functions""" # Copyright (c) 2009 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com _size_factors = dict(KB=1024, MB=1024*1024, GB=1024*1024*1024) def size_in_bytes(expr): """Return the number of bytes for a defer_size argument to read_file() """ try: return int(expr) except ValueError: unit = expr[-2:].upper() if unit in _size_factors.keys(): val = float(expr[:-2]) * _size_factors[unit] return val else: raise ValueError, "Unable to parse length with unit '%s'" % unitpydicom-0.9.7/dicom/multival.py000644 000765 000024 00000004347 11726534363 016764 0ustar00darcystaff000000 000000 # multival.py """Code for multi-value data elements values, or any list of items that must all be the same type. """ # Copyright (c) 2009-2012 Darcy Mason # This file is part of pydicom, relased under an MIT-style license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # class MultiValue(list): """Class to hold any multi-valued DICOM value, or any list of items that are all of the same type. This class enforces that any items added to the list are of the correct type, by calling the constructor on any items that are added. Therefore, the constructor must behave nicely if passed an object that is already its type. The constructor should raise TypeError if the item cannot be converted. """ def __init__(self, type_constructor, iterable): """Initialize the list of values :param type_constructor: a constructor for the required type for all list items. Could be the class, or a factory function. For DICOM mult-value data elements, this will be the class or type corresponding to the VR. :param iterable: an iterable (e.g. list, tuple) of items to initialize the MultiValue list """ self.type_constructor = type_constructor super(MultiValue, self).__init__([type_constructor(x) for x in iterable]) def append(self, val): super(MultiValue, self).append(self.type_constructor(val)) def extend(self, list_of_vals): super(MultiValue, self).extend((self.type_constructor(x) for x in list_of_vals)) def insert(self, position, val): super(MultiValue, self).insert(position, self.type_constructor(val)) def __setitem__(self, i, val): """Set an item of the list, making sure it is of the right VR type""" if isinstance(i, slice): val = [self.type_constructor(x) for x in val] else: val = self.type_constructor(val) super(MultiValue, self).__setitem__(i, val) def __str__(self): lines = [str(x) for x in self] return "[" + ", ".join(lines) + "]" __repr__ = __str__ pydicom-0.9.7/dicom/sequence.py000644 000765 000024 00000004304 11726534363 016730 0ustar00darcystaff000000 000000 # sequence.py """Hold the Sequence class, which stores a dicom sequence (list of Datasets)""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from dicom.dataset import Dataset from dicom.multival import MultiValue def validate_dataset(elem): """Ensures that the value is a Dataset instance""" if not isinstance(elem, Dataset): raise TypeError('Sequence contents must be a Dataset instance') return elem class Sequence(MultiValue): """Class to hold multiple Datasets in a list This class is derived from MultiValue and as such enforces that all items added to the list are Dataset instances. In order to due this, a validator is substituted for type_constructor when constructing the MultiValue super class """ def __init__(self, iterable=None): """Initialize a list of Datasets :param iterable: an iterable (e.g. list, tuple) of Datasets. If no value is provided, an empty Sequence is generated """ # We add this extra check to throw a relevant error. Without it, the # error will be simply that a Sequence must contain Datasets (since a # Dataset IS iterable). This error, however, doesn't inform the user # that the actual issue is that their Dataset needs to be INSIDE an # iterable object if isinstance(iterable, Dataset): raise TypeError('The Sequence constructor requires an iterable') # If no inputs are provided, we create an empty Sequence if not iterable: iterable = list(); # validate_dataset is used as a pseudo type_constructor super(Sequence, self).__init__(validate_dataset, iterable) def __str__(self): lines = [str(x) for x in self] return "[" + "".join(lines) + "]" def __repr__(self): """Sequence-specific string representation""" formatstr = "<%(classname)s, length %(count)d, at %(id)X>" return formatstr % {'classname':self.__class__.__name__, 'id':id(self), 'count':len(self)} pydicom-0.9.7/dicom/tag.py000644 000765 000024 00000012124 11726534363 015672 0ustar00darcystaff000000 000000 # tag.py """Define Tag class to hold a dicom (group, element) tag""" # Copyright (c) 2008, 2010 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com def Tag(arg, arg2=None): """Factory function for creating Tags in more general ways than the (gp, el) """ if arg2 is not None: arg = (arg, arg2) # act as if was passed a single tuple if isinstance(arg, (tuple, list)): if len(arg) != 2: raise ValueError, "Tag must be an int or a 2-tuple" if isinstance(arg[0], basestring): if not isinstance(arg[1], basestring): raise ValueError, "Both arguments must be hex strings if one is" arg = (int(arg[0], 16), int(arg[1], 16)) if arg[0] > 0xFFFF or arg[1] > 0xFFFF: raise OverflowError, "Groups and elements of tags must each be <=2 byte integers" long_value = long(arg[0])<<16 | arg[1] # long needed for python <2.4 where shift could make int negative elif isinstance(arg, basestring): raise ValueError, "Tags cannot be instantiated from a single string" else: # given a single number to use as a tag, as if (group, elem) already joined to a long long_value = long(hex(arg), 16) # needed in python <2.4 to avoid negative ints if long_value > 0xFFFFFFFFL: raise OverflowError, "Tags are limited to 32-bit length; tag %r, long value %r" % (arg, long_value) return BaseTag(long_value) class BaseTag(long): """Class for storing the dicom (group, element) tag""" # Store the 4 bytes of a dicom tag as a python long (arbitrary length, not like C-language long). # NOTE: logic (in write_AT of filewriter at least) depends on this # NOT being a tuple, for checks if a value is a multi-value element # Using python int's may be different on different hardware platforms. # Simpler to deal with one number and separate to (group, element) when necessary. # Also can deal with python differences in handling ints starting in python 2.4, # by forcing all inputs to a proper long where the differences go away # Override comparisons so can convert "other" to Tag as necessary # Changes this from __cmp__ to using __lt__ and __eq__ for python 3. # See Ordering Comparisons at http://docs.python.org/dev/3.0/whatsnew/3.0.html def __lt__(self, other): # Allow comparisons to other longs or (group,elem) tuples directly. # So check if comparing with another Tag object; if not, create a temp one if not isinstance(other, BaseTag): try: other = Tag(other) except: raise TypeError, "Cannot compare Tag with non-Tag item" return long(self) < long(other) def __eq__(self, other): # Check if comparing with another Tag object; if not, create a temp one if not isinstance(other, BaseTag): try: other = Tag(other) except: raise TypeError, "Cannot compare Tag with non-Tag item" # print "self %r; other %r" % (long(self), long(other)) return long(self) == long(other) def __ne__(self, other): # Check if comparing with another Tag object; if not, create a temp one if not isinstance(other, BaseTag): try: other = Tag(other) except: raise TypeError, "Cannot compare Tag with non-Tag item" return long(self) != long(other) # For python 3, any override of __cmp__ or __eq__ immutable requires # explicit redirect of hash function to the parent class # See http://docs.python.org/dev/3.0/reference/datamodel.html#object.__hash__ __hash__ = long.__hash__ def __str__(self): """String of tag value as (gggg, eeee)""" return "(%04x, %04x)" % (self.group, self.elem) __repr__ = __str__ # Property group def getGroup(self): return self >>16 group = property(getGroup) # Property elem def getElem(self): return self & 0xffff elem = property(getElem) element = elem # Property is_private def getis_private(self): """Private tags have an odd group number""" return self.group % 2 == 1 is_private = property(getis_private) isPrivate = is_private # for backwards compatibility def TupleTag(group_elem): """Fast factory for BaseTag object with known safe (group, element) tuple""" # long needed for python <2.4 where shift could make int negative long_value = long(group_elem[0])<<16 | group_elem[1] return BaseTag(long_value) # Define some special tags: # See PS 3.5-2008 section 7.5 (p.40) ItemTag = TupleTag((0xFFFE, 0xE000)) # start of Sequence Item ItemDelimiterTag = TupleTag((0xFFFE, 0xE00D)) # end of Sequence Item SequenceDelimiterTag = TupleTag((0xFFFE,0xE0DD)) # end of Sequence of undefined length pydicom-0.9.7/dicom/test/000755 000765 000024 00000000000 11726534607 015525 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/testcharsetfiles/000755 000765 000024 00000000000 11726534607 020122 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/testfiles/000755 000765 000024 00000000000 11726534607 016550 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/UID.py000644 000765 000024 00000010615 11726534363 015543 0ustar00darcystaff000000 000000 # UID.py """Dicom Unique identifiers""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from _UID_dict import UID_dictionary class UID(str): """Subclass python string so have human-friendly UIDs Use like: uid = UID('1.2.840.10008.1.2.4.50') then uid.name, uid.type, uid.info, and uid.is_retired all return values from the UID_dictionary String representation (__str__) will be the name, __repr__ will be the full 1.2.840.... """ def __new__(cls, val): """Set up new instance of the class""" # Don't repeat if already a UID class -- then may get the name # that str(uid) gives rather than the dotted number if isinstance(val, UID): return val else: if isinstance(val, basestring): return super(UID, cls).__new__(cls, val.strip()) else: raise TypeError, "UID must be a string" def __init__(self, val): """Initialize the UID properties Sets name, type, info, is_retired, and is_transfer_syntax. If UID is a transfer syntax, also sets is_little_endian, is_implicit_VR, and is_deflated boolean values. """ # Note normally use __new__ on subclassing an immutable, but here we just want # to do some pre-processing against the UID dictionary. # "My" string can never change (it is a python immutable), so is safe if self in UID_dictionary: self.name, self.type, self.info, retired = UID_dictionary[self] self.is_retired = bool(retired) else: self.name = str.__str__(self) self.type, self.info, self.is_retired = (None, None, None) # If the UID represents a transfer syntax, store info about that syntax self.is_transfer_syntax = (self.type == "Transfer Syntax") if self.is_transfer_syntax: # Assume a transfer syntax, correct it as necessary self.is_implicit_VR = True self.is_little_endian = True self.is_deflated = False if val == '1.2.840.10008.1.2': # implicit VR little endian pass elif val == '1.2.840.10008.1.2.1': # ExplicitVRLittleEndian self.is_implicit_VR = False elif val == '1.2.840.10008.1.2.2': # ExplicitVRBigEndian self.is_implicit_VR = False self.is_little_endian = False elif val == '1.2.840.10008.1.2.1.99': # DeflatedExplicitVRLittleEndian: self.is_deflated = True self.is_implicit_VR = False else: # Any other syntax should be Explicit VR Little Endian, # e.g. all Encapsulated (JPEG etc) are ExplVR-LE by Standard PS 3.5-2008 A.4 (p63) self.is_implicit_VR = False def __str__(self): """Return the human-friendly name for this UID""" return self.name def __eq__(self, other): """Override string equality so either name or UID number match passes""" if str.__eq__(self, other) is True: # 'is True' needed (issue 96) return True if str.__eq__(self.name, other) is True: # 'is True' needed (issue 96) return True return False ExplicitVRLittleEndian = UID('1.2.840.10008.1.2.1') ImplicitVRLittleEndian = UID('1.2.840.10008.1.2') DeflatedExplicitVRLittleEndian = UID('1.2.840.10008.1.2.1.99') ExplicitVRBigEndian = UID('1.2.840.10008.1.2.2') NotCompressedPixelTransferSyntaxes = [ExplicitVRLittleEndian, ImplicitVRLittleEndian, DeflatedExplicitVRLittleEndian, ExplicitVRBigEndian] # Many thanks to the Medical Connections for offering free valid UIDs (http://www.medicalconnections.co.uk/FreeUID.html) # Their service was used to obtain the following root UID for pydicom: pydicom_root_UID = '1.2.826.0.1.3680043.8.498.' pydicom_UIDs = { pydicom_root_UID + '1': 'ImplementationClassUID', } pydicom-0.9.7/dicom/util/000755 000765 000024 00000000000 11726534607 015523 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/valuerep.py000644 000765 000024 00000022734 11726534363 016752 0ustar00darcystaff000000 000000 # valuerep.py """Special classes for DICOM value representations (VR)""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from decimal import Decimal import dicom.config from dicom.multival import MultiValue from sys import version_info if version_info[0] < 3: namebase = object bytestring = str strbase = str else: namebase = bytestring strbase = basestring def is_stringlike(name): """Return True if name is string-like.""" try: name + "" except TypeError: return False else: return True def clean_escseq(element, encodings): """Remove escape sequences that Python does not remove from Korean encoding ISO 2022 IR 149 due to the G1 code element. """ if 'euc_kr' in encodings: return element.replace( "\x1b\x24\x29\x43", "").replace("\x1b\x28\x42", "") else: return element class DS(Decimal): """Store values for DICOM VR of DS (Decimal String). Note: if constructed by an empty string, returns the empty string, not an instance of this class. """ def __new__(cls, val): """Create an instance of DS object, or return a blank string if one is passed in, e.g. from a type 2 DICOM blank value. """ # DICOM allows spaces around the string, but python doesn't, so clean it if isinstance(val, strbase): val=val.strip() if val == '': return val if isinstance(val, float) and not dicom.config.allow_DS_float: msg = ("DS cannot be instantiated with a float value, unless " "config.allow_DS_float is set to True. It is recommended to " "convert to a string instead, with the desired number of digits, " "or use Decimal.quantize and pass a Decimal instance.") raise TypeError, msg if not isinstance(val, Decimal): val = super(DS, cls).__new__(cls, val) if len(str(val)) > 16 and dicom.config.enforce_valid_values: msg = ("DS value representation must be <= 16 characters by DICOM " "standard. Initialize with a smaller string, or set config.enforce_valid_values " "to False to override, " "or use Decimal.quantize() and initialize with a Decimal instance.") raise OverflowError, msg return val def __init__(self, val): """Store the original string if one given, for exact write-out of same value later. E.g. if set '1.23e2', Decimal would write '123', but DS will use the original """ # ... also if user changes a data element value, then will get # a different Decimal, as Decimal is immutable. if isinstance(val, strbase): self.original_string = val def __repr__(self): if hasattr(self, 'original_string'): return "'" + self.original_string + "'" else: return "'" + super(DS,self).__str__() + "'" class IS(int): """Derived class of int. Stores original integer string for exact rewriting of the string originally read or stored. Don't use this directly; call the IS() factory function instead. """ # Unlikely that str(int) will not be the same as the original, but could happen # with leading zeros. def __new__(cls, val): """Create instance if new integer string""" if isinstance(val, strbase) and val.strip() == '': return '' newval = super(IS, cls).__new__(cls, val) # check if a float or Decimal passed in, then could have lost info, # and will raise error. E.g. IS(Decimal('1')) is ok, but not IS(1.23) if isinstance(val, (float, Decimal)) and newval != val: raise TypeError, "Could not convert value to integer without loss" # Checks in case underlying int is >32 bits, DICOM does not allow this if (newval < -2**31 or newval >= 2**31) and dicom.config.enforce_valid_values: message = "Value exceeds DICOM limits of -2**31 to (2**31 - 1) for IS" raise OverflowError, message return newval def __init__(self, val): # If a string passed, then store it if isinstance(val, basestring): self.original_string = val def __repr__(self): if hasattr(self, 'original_string'): return "'" + self.original_string + "'" else: return "'" + int.__str__(self) + "'" def MultiString(val, valtype=str): """Split a string by delimiters if there are any val -- DICOM string to split up valtype -- default str, but can be e.g. UID to overwrite to a specific type """ # Remove trailing blank used to pad to even length # 2005.05.25: also check for trailing 0, error made in PET files we are converting if val and (val.endswith(' ') or val.endswith('\x00')): val = val[:-1] # XXX --> simpler version python > 2.4 splitup = [valtype(x) if x else x for x in val.split("\\")] splitup = [] for subval in val.split("\\"): if subval: splitup.append(valtype(subval)) else: splitup.append(subval) if len(splitup) == 1: return splitup[0] else: return MultiValue(valtype, splitup) class PersonNameBase(namebase): """Base class for Person Name classes""" def __init__(self, val): """Initialize the PN properties""" # Note normally use __new__ on subclassing an immutable, but here we just want # to do some pre-processing for properties # PS 3.5-2008 section 6.2 (p.28) and 6.2.1 describes PN. Briefly: # single-byte-characters=ideographic characters=phonetic-characters # (each with?): # family-name-complex^Given-name-complex^Middle-name^name-prefix^name-suffix self.parse() def formatted(self, format_str): """Return a formatted string according to the format pattern Use "...%(property)...%(property)..." where property is one of family_name, given_name, middle_name, name_prefix, name_suffix """ return format_str % self.__dict__ def parse(self): """Break down the components and name parts""" self.components = self.split("=") nComponents = len(self.components) self.single_byte = self.components[0] self.ideographic = '' self.phonetic = '' if nComponents > 1: self.ideographic = self.components[1] if nComponents > 2: self.phonetic = self.components[2] if self.single_byte: name_string = self.single_byte+"^^^^" # in case missing trailing items are left out parts = name_string.split("^")[:5] (self.family_name, self.given_name, self.middle_name, self.name_prefix, self.name_suffix) = parts else: (self.family_name, self.given_name, self.middle_name, self.name_prefix, self.name_suffix) = ('', '', '', '', '') class PersonName(PersonNameBase, str): """Human-friendly class to hold VR of Person Name (PN) Name is parsed into the following properties: single-byte, ideographic, and phonetic components (PS3.5-2008 6.2.1) family_name, given_name, middle_name, name_prefix, name_suffix """ def __new__(cls, val): """Return instance of the new class""" # Check if trying to convert a string that has already been converted if isinstance(val, PersonName): return val return super(PersonName, cls).__new__(cls, val) def family_comma_given(self): """Return name as 'Family-name, Given-name'""" return self.formatted("%(family_name)s, %(given_name)s") # def __str__(self): # return str(self.byte_string) # XXX need to process the ideographic or phonetic components? # def __len__(self): # return len(self.byte_string) class PersonNameUnicode(PersonNameBase, unicode): """Unicode version of Person Name""" def __new__(cls, val, encodings): """Return unicode string after conversion of each part val -- the PN value to store encodings -- a list of python encodings, generally found from dicom.charset.python_encodings mapping of values in DICOM data element (0008,0005). """ # Make the possible three character encodings explicit: if not isinstance(encodings, list): encodings = [encodings]*3 if len(encodings) == 2: encodings.append(encodings[1]) components = val.split("=") # Remove the first encoding if only one component is present if (len(components) == 1): del encodings[0] unicomponents = [clean_escseq( unicode(components[i],encodings[i]), encodings) for i, component in enumerate(components)] new_val = u"=".join(unicomponents) return unicode.__new__(cls, new_val) def __init__(self, val, encodings): self.encodings = encodings PersonNameBase.__init__(self, val) def family_comma_given(self): """Return name as 'Family-name, Given-name'""" return self.formatted("%(family_name)u, %(given_name)u") class OtherByte(bytestring): pass pydicom-0.9.7/dicom/values.py000644 000765 000024 00000015013 11726534363 016416 0ustar00darcystaff000000 000000 # values.py """Functions for converting values of DICOM data elements to proper python types """ # Copyright (c) 2010-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from struct import unpack, calcsize, pack import logging logger = logging.getLogger('pydicom') from dicom.valuerep import PersonName, MultiString from dicom.multival import MultiValue import dicom.UID from dicom.tag import Tag, TupleTag, SequenceDelimiterTag from dicom.datadict import dictionaryVR from dicom.filereader import read_sequence from cStringIO import StringIO from dicom.valuerep import DS, IS def convert_tag(bytes, is_little_endian, offset=0): if is_little_endian: struct_format = " 4 if length % 4 != 0: logger.warn("Expected length to be multiple of 4 for VR 'AT', got length %d at file position 0x%x", length, fp.tell()-4) return MultiValue(Tag,[convert_tag(bytes, is_little_endian, offset=x) for x in range(0, length, 4)]) def convert_DS_string(bytes, is_little_endian, struct_format=None): """Read and return a DS value or list of values""" return MultiString(bytes, valtype=DS) def convert_IS_string(bytes, is_little_endian, struct_format=None): """Read and return an IS value or list of values""" return MultiString(bytes, valtype=IS) def convert_numbers(bytes, is_little_endian, struct_format): """Read a "value" of type struct_format from the dicom file. "Value" can be more than one number""" endianChar = '><'[is_little_endian] bytes_per_value = calcsize("="+struct_format) # "=" means use 'standard' size, needed on 64-bit systems. length = len(bytes) if length % bytes_per_value != 0: logger.warn("Expected length to be even multiple of number size") format_string = "%c%u%c" % (endianChar, length // bytes_per_value, struct_format) value = unpack(format_string, bytes) if len(value) == 1: return value[0] else: return list(value) # convert from tuple to a list so can modify if need to def convert_OBvalue(bytes, is_little_endian, struct_format=None): """Return the raw bytes from reading an OB value""" return bytes def convert_OWvalue(bytes, is_little_endian, struct_format=None): """Return the raw bytes from reading an OW value rep Note: pydicom does NOT do byte swapping, except in dataset.pixel_array function """ return convert_OBvalue(bytes, is_little_endian) # for now, Maybe later will have own routine def convert_PN(bytes, is_little_endian, struct_format=None): """Read and return string(s) as PersonName instance(s)""" return MultiString(bytes, valtype=PersonName) def convert_string(bytes, is_little_endian, struct_format=None): """Read and return a string or strings""" return MultiString(bytes) def convert_single_string(bytes, is_little_endian, struct_format=None): """Read and return a single string (backslash character does not split)""" if bytes and bytes.endswith(' '): bytes = bytes[:-1] return bytes def convert_SQ(bytes, is_implicit_VR, is_little_endian, offset=0): """Convert a sequence that has been read as bytes but not yet parsed.""" fp = StringIO(bytes) seq = read_sequence(fp, is_implicit_VR, is_little_endian, len(bytes), offset) return seq def convert_UI(bytes, is_little_endian, struct_format=None): """Read and return a UI values or values""" # Strip off 0-byte padding for even length (if there) if bytes and bytes.endswith('\0'): bytes = bytes[:-1] return MultiString(bytes, dicom.UID.UID) def convert_UN(bytes, is_little_endian, struct_format=None): """Return a byte string for a VR of 'UN' (unknown)""" return bytes def convert_value(VR, raw_data_element): """Return the converted value (from raw bytes) for the given VR""" tag = Tag(raw_data_element.tag) if VR not in converters: raise NotImplementedError, "Unknown Value Representation '%s'" % VR # Look up the function to convert that VR # Dispatch two cases: a plain converter, or a number one which needs a format string if isinstance(converters[VR], tuple): converter, num_format = converters[VR] else: converter = converters[VR] num_format = None bytes = raw_data_element.value is_little_endian = raw_data_element.is_little_endian is_implicit_VR = raw_data_element.is_implicit_VR # Not only two cases. Also need extra info if is a raw sequence if VR != "SQ": value = converter(bytes, is_little_endian, num_format) else: value = convert_SQ(bytes, is_implicit_VR, is_little_endian, raw_data_element.value_tell) return value # converters map a VR to the function to read the value(s). # for convert_numbers, the converter maps to a tuple (function, struct_format) # (struct_format in python struct module style) converters = {'UL':(convert_numbers,'L'), 'SL':(convert_numbers,'l'), 'US':(convert_numbers,'H'), 'SS':(convert_numbers, 'h'), 'FL':(convert_numbers,'f'), 'FD':(convert_numbers, 'd'), 'OF':(convert_numbers,'f'), 'OB':convert_OBvalue, 'UI':convert_UI, 'SH':convert_string, 'DA':convert_string, 'TM': convert_string, 'CS':convert_string, 'PN':convert_PN, 'LO': convert_string, 'IS':convert_IS_string, 'DS':convert_DS_string, 'AE': convert_string, 'AS':convert_string, 'LT':convert_single_string, 'SQ':convert_SQ, 'UN':convert_UN, 'AT':convert_ATvalue, 'ST':convert_string, 'OW':convert_OWvalue, 'OW/OB':convert_OBvalue,# note OW/OB depends on other items, which we don't know at read time 'OB/OW':convert_OBvalue, 'OW or OB': convert_OBvalue, 'OB or OW': convert_OBvalue, 'US or SS':convert_OWvalue, 'US or SS or OW':convert_OWvalue, 'US\US or SS\US':convert_OWvalue, 'DT':convert_string, 'UT':convert_single_string, } if __name__ == "__main__": passpydicom-0.9.7/dicom/util/__init__.py000644 000765 000024 00000000017 11726534363 017631 0ustar00darcystaff000000 000000 # __init__.py pydicom-0.9.7/dicom/util/dump.py000644 000765 000024 00000006513 11726534363 017046 0ustar00darcystaff000000 000000 # dump.py """Utility functions for seeing contents of files, etc, to debug writing and reading""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from cStringIO import StringIO def PrintCharacter(ordchr): """Return a printable character, or '.' for non-printable ones.""" if 31 < ordchr < 126 and ordchr != 92: return chr(ordchr) else: return '.' def filedump(filename, StartAddress=0, StopAddress=None): """Dump out the contents of a file to a standard hex dump 16 bytes wide""" fp = file(filename, 'rb') return hexdump(fp, StartAddress, StopAddress) def datadump(data): StopAddress = len(data) + 1 fp = StringIO(data) print hexdump(fp, 0, StopAddress) def hexdump(file_in, StartAddress=0, StopAddress=None, showAddress=True): """Return a formatted string of hex bytes and characters in data. This is a utility function for debugging file writing. file_in -- a file-like object to get the bytes to show from""" str_out = StringIO() byteslen = 16*3-1 # space taken up if row has a full 16 bytes blanks = ' ' * byteslen file_in.seek(StartAddress) data = True # dummy to start the loop while data: if StopAddress and file_in.tell() > StopAddress: break if showAddress: str_out.write("%04x : " % file_in.tell()) # address at start of line data = file_in.read(16) if not data: break row = [ord(x) for x in data] # need ord twice below so convert once bytes = ' '.join(["%02x" % x for x in row]) # string of two digit hex bytes str_out.write(bytes) str_out.write(blanks[:byteslen-len(bytes)]) # if not 16, pad str_out.write(' ') str_out.write(''.join([PrintCharacter(x) for x in row])) # character rep of bytes str_out.write("\n") return str_out.getvalue() def PrettyPrint(ds, indent=0, indentChars=" "): """Print a dataset directly, with indented levels. This is just like Dataset._PrettyStr, but more useful for debugging as it prints each item immediately rather than composing a string, making it easier to immediately see where an error in processing a dataset starts. """ strings = [] indentStr = indentChars * indent nextIndentStr = indentChars *(indent+1) for data_element in ds: if data_element.VR == "SQ": # a sequence new_str = indentStr + str(data_element.tag) + " %s %i item(s) ---- " % ( data_element.name, len(data_element.value)) print new_str for dataset in data_element.value: PrettyPrint(dataset, indent+1) print nextIndentStr + "---------" else: print indentStr + repr(data_element) if __name__ == "__main__": import sys filename = sys.argv[1] StartAddress = 0 StopAddress = None if len(sys.argv) > 2: # then have start address StartAddress = eval(sys.argv[2]) if len(sys.argv) > 3: StopAddress = eval(sys.argv[3]) print filedump(filename, StartAddress, StopAddress) pydicom-0.9.7/dicom/util/hexutil.py000644 000765 000024 00000002167 11726534363 017564 0ustar00darcystaff000000 000000 # hexutil.py """Miscellaneous utility routines relating to hex and byte strings""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com def hex2bytes(hex_string): """Return bytestring for a string of hex bytes separated by whitespace This is useful for creating specific byte sequences for testing, using python's implied concatenation for strings with comments allowed. Example: hex_string = ( "08 00 32 10" # (0008, 1032) SQ "Procedure Code Sequence" " 08 00 00 00" # length 8 " fe ff 00 e0" # (fffe, e000) Item Tag ) bytes = hex2bytes(hex_string) Note in the example that all lines except the first must start with a space, alternatively the space could end the previous line. """ return "".join((chr(int(x,16)) for x in hex_string.strip().split())) def bytes2hex(bytes): """Return a hex dump of the bytes given""" return " ".join(["%02x" % ord(b) for b in bytes])pydicom-0.9.7/dicom/util/namedtup.py000644 000765 000024 00000012260 11726534363 017712 0ustar00darcystaff000000 000000 # namedtup.py """Named tuple for python < 2.6, from Activestate cookbook""" # Python >=2.6 has this in collections module from operator import itemgetter as _itemgetter from keyword import iskeyword as _iskeyword import sys as _sys def namedtuple(typename, field_names, verbose=False, rename=False): """Returns a new subclass of tuple with named fields. >>> Point = namedtuple('Point', 'x y') >>> Point.__doc__ # docstring for the new class 'Point(x, y)' >>> p = Point(11, y=22) # instantiate with positional args or keywords >>> p[0] + p[1] # indexable like a plain tuple 33 >>> x, y = p # unpack like a regular tuple >>> x, y (11, 22) >>> p.x + p.y # fields also accessable by name 33 >>> d = p._asdict() # convert to a dictionary >>> d['x'] 11 >>> Point(**d) # convert from a dictionary Point(x=11, y=22) >>> p._replace(x=100) # _replace() is like str.replace() but targets named fields Point(x=100, y=22) """ # Parse and validate the field names. Validation serves two purposes, # generating informative error messages and preventing template injection attacks. if isinstance(field_names, basestring): field_names = field_names.replace(',', ' ').split() # names separated by whitespace and/or commas field_names = tuple(map(str, field_names)) if rename: names = list(field_names) seen = set() for i, name in enumerate(names): if (not min([c.isalnum() or c=='_' for c in name]) or _iskeyword(name) or not name or name[0].isdigit() or name.startswith('_') or name in seen): names[i] = '_%d' % i seen.add(name) field_names = tuple(names) for name in (typename,) + field_names: if not min([c.isalnum() or c=='_' for c in name]): raise ValueError('Type names and field names can only contain alphanumeric characters and underscores: %r' % name) if _iskeyword(name): raise ValueError('Type names and field names cannot be a keyword: %r' % name) if name[0].isdigit(): raise ValueError('Type names and field names cannot start with a number: %r' % name) seen_names = set() for name in field_names: if name.startswith('_') and not rename: raise ValueError('Field names cannot start with an underscore: %r' % name) if name in seen_names: raise ValueError('Encountered duplicate field name: %r' % name) seen_names.add(name) # Create and fill-in the class template numfields = len(field_names) argtxt = repr(field_names).replace("'", "")[1:-1] # tuple repr without parens or quotes reprtxt = ', '.join(['%s=%%r' % name for name in field_names]) template = '''class %(typename)s(tuple): '%(typename)s(%(argtxt)s)' \n __slots__ = () \n _fields = %(field_names)r \n def __new__(_cls, %(argtxt)s): return _tuple.__new__(_cls, (%(argtxt)s)) \n @classmethod def _make(cls, iterable, new=tuple.__new__, len=len): 'Make a new %(typename)s object from a sequence or iterable' result = new(cls, iterable) if len(result) != %(numfields)d: raise TypeError('Expected %(numfields)d arguments, got %%d' %% len(result)) return result \n def __repr__(self): return '%(typename)s(%(reprtxt)s)' %% self \n def _asdict(self): 'Return a new dict which maps field names to their values' return dict(zip(self._fields, self)) \n def _replace(_self, **kwds): 'Return a new %(typename)s object replacing specified fields with new values' result = _self._make(map(kwds.pop, %(field_names)r, _self)) if kwds: raise ValueError('Got unexpected field names: %%r' %% kwds.keys()) return result \n def __getnewargs__(self): return tuple(self) \n\n''' % locals() for i, name in enumerate(field_names): template += ' %s = _property(_itemgetter(%d))\n' % (name, i) if verbose: print template # Execute the template string in a temporary namespace namespace = dict(_itemgetter=_itemgetter, __name__='namedtuple_%s' % typename, _property=property, _tuple=tuple) try: exec template in namespace except SyntaxError, e: raise SyntaxError(e.message + ':\n' + template) result = namespace[typename] # For pickling to work, the __module__ variable needs to be set to the frame # where the named tuple is created. Bypass this step in enviroments where # sys._getframe is not defined (Jython for example) or sys._getframe is not # defined for arguments greater than 0 (IronPython). try: result.__module__ = _sys._getframe(1).f_globals.get('__name__', '__main__') except (AttributeError, ValueError): pass return result pydicom-0.9.7/dicom/testfiles/CT_small.dcm000644 000765 000024 00000114322 11726534363 020735 0ustar00darcystaff000000 000000 II*TDICMULÀOBUI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 100CSORIGINAL\PRIMARY\AXIALDA20040119TM072731UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.2UI01.3.6.1.4.1.5962.1.1.1.1.1.20040119072730.12322 DA20040119!DA19970430"DA19970430#DA199704300TM0727301TM1127492TM1129363TM113008PSH`CSCTpLOGE MEDICAL SYSTEMS€LOJFK IMAGING CENTERPNSH-0500 SHCT01_OC00LOe+1 LORHAPSODE LO GEMS_IDEN_01 LOGE_GENESIS_FF SHCT01 SH HiSpeed CT/i 'SLµ,g3 0SH 1SH æSH05 çULM": éSLµ,g3PNCompressedSamples^CT1  LO1CT10DA@CSO AS000Y0DS0.000000°!LTLO GEMS_PATI_01SSLOISOVUE300/100 "CS HELICAL MODEPDS5.000000`DS120 ˆDS5.000000DS 480.000000 LO05@LOIVDS 338.671600DS1099.3100585938 DS 630.000000 DS0.0000000DS 133.699997PIS1601QIS170 RIS170 `SHLARGE BOWTIE FILDS0.700000SHSTANDARDQCSFFS LO GEMS_ACQU_01SLDS 373.750000DS1.016600DS 955.799988SSSSSSSSSSSSLOS DS7.791870LOI DS -320.197968 DS0.000000#DS5.000000$DS 17.784578 %SS&SL'DS1.000000*DS 178.079926+DS 3994.299316 ,SL¿(.DS -718.079956 /DS 984.0000009SS@SSASSBSSCSSDDS1.000000GSSJSSKSL¿(RSSWSS¡ÿXSS^SLû_SL`SL±aSL(bSLjSSkSSTpSSqSSrDS0.000000sDS0.000000tDS0.000000uDS0.000000vDS0.000000ÚSSÛDS0.000000ÜSSÝSSÞDS0.000000 UI,1.3.6.1.4.1.5962.1.2.1.20040119072730.12322 UI.1.3.6.1.4.1.5962.1.3.1.1.20040119072730.12322 SH1CT1 IS1 IS2 IS1 2DS"-158.135803\-179.035797\-75.699997 7DS61.000000\0.000000\0.000000\0.000000\1.000000\0.000000 RUI.1.3.6.1.4.1.5962.1.4.1.1.20040119072730.12322 `CS @LOSN ADS-77.2040634155 @LT Uncompressed!LO GEMS_RELA_01!SS!SH05!UL)/¶_!US^!SS!SH05!UL2f¾,!7SS!JLO!SSè!‘SS!’FL!“FL#LO GEMS_STDY_01#pFDÖ7Žˆ–³ÉA#tSL#}SS%LO GEMS_SERS_01%SS%SL,%SL%SS%SL%SL%SL%SH'LO GEMS_IMAG_01'SL'SS'SL–'SS'SL'SL' SS'0SH'5SS'@SHI 'AFL{hšÂ'BFL333Á'CFL33A'DFLff—Â'EFL'FFL'GFL€¿'HFL*‰4Ã'IFL* 3C'JFLff—Â'KFL*‰4Ã'LFLÄ¢Ã'MFLff—Â'PFLÌÌ|Â'QFLögèÂ'RSHL 'SSHA 'TSHI 'USHI (US(CS MONOCHROME2 (US€(US€(0DS0.661468\0.661468 (US(US(US(US( SS0ø(RDS-1024 (SDS1 )LO GEMS_IMPS_01)SL)DS0.000000)DS0.000000)SLW)SH) SH) SSü)&SS)4SL)5SLCLO GEMS_PARM_01CUSCUS¿(CSSCSS kCSSCSS¿(CSSCDS0.095000CDS0.085000\1.102000\0.095000CSS^CSLCSS CSSCSS(CDS2.000000CSLC DS0.000000C!SSC%SS ìíîC&US C'SH/1.0:1C(OBPCT01HiSpeed CT/i0505z:=|C)OBCÏR׿C*OB(CT01HiSpeed CT/i0505z:=|C+SSC1DS-11.200000\9.700000 C@FLv2CCAFLƒƒnECBSLCCSLCDSLCESLCFSLCGSLÿÿÿÿCHSLCISLCJSSCKSLCLSSCMFLCNFLœ)AàOW€¯´¦‹˜§»ÔìåÕËÍ¿ÌÏÅÀº¿ÎüFjR9áÕм³ÎÒÇÀØûãÏËÎÓí][9¾  ìãÒ³¨Ÿ¨ÊêßÛâï8Ti—§ ˜®µ¨š–¥Ÿ¦žœ–³°Ÿ¡ŸŸˆyˆˆ~Š•˜Œ•KÙúzà7Ü”œ»Í½‘†”»ÝËÏØº·“£ÁÑÎÁ¼¶¹ÄÕÐÒÉÅÇËí2[XbHìÚÕê  íÛåéÌÑÐÏ×ðy‘Sª   çÜÔÑÕ·£¾Å·¼ËÈãMmŒšž £Œ—ŸŽ¬¬‘‹®²­ž–˜‰Ž—ž™ ž—¦¨”za3_¹8Àš¥²ÖÌ£’¢¶Êɵ¾ï¸´«²½¾ÀÌÑ¿ÈÔÆÅ×âÒŹÇÎÑãü,NVN8)V`M;  ãÜÈÈÛìŠÀa£âôë, õôíåÒÅÙ×ÉÃÔÆÞEr~ž´®•€”£¹¬¤¤¦¤¦ª³›ˆ ¤œ– ­¯ªªª®°­ªŠiœÈ-´—œ«À “¡§«¢˜¤ë­¡ž°ÄÉÅÑÐÍßÙº­·Ë¾³ÄÙÛÜ××êATrf5,:,*,ëëäÞÔÍë ¸ê`’¢°×Ô+$7+)'þôò᪸ÈÔDl…«¸¬‹ Ÿ˜§©ŸÂ»²¸— „¡’”¢£ª ¨¯¶»®§‰W”Ê/3›Œ§Á¶‚‹Ÿ·¾­¤™©ô·ºµ¾ËúÄÁ»Ã±­¬ÂæâæûöìßÌÐÒí9T6ùôóòþêÏÐÒ×áÑöD,A†ª´Åìè FF?QH9=ýâ¶ÌÝ´ó5^Œ £§§­ š–œ—Ÿµ²°¶ ž’Ÿ¶¯¢žŸœ©•˜§¬šv?’ÛN;¡ºãùÄ‹”¸ÎÖ«™±òÍÓÙßDZ¯º¸´»·¾ÉîöìæÓÍ·¯¸µÀð-9íóñïõçÛãùñÔ‹¬‡¢Âð>D=^VMpi[H òÏÁ¿¥ã%O€Šœ®¼Æ©¨¤•“”¡§¥£— ¬¥“‹”©°Ÿš£¤žZÔ W>Õú£€Š£§µª°©·ã¸ÈåóÖÇÃÂÅȾ»ÙîìÉ¿³¥ ¨´²·¸ÕçÖÒÝéúýçæëðâðh8MÞéï'/Zn‡¿ÐÞ /§vY6 ×ÉÁÝL”­¶” ‘­ ‚“žˆ––œ¡ž™¢–’Š’“ °¿µ±±¯­§…ZØû+.üEô§£´Ãºµ°µÉÃÁÑØÐÃÄÇÆÇÇÝÿíŨ›§©˜Ÿ©¬ºÀÈô üçÉÊØØàü úéî3ûÀ&÷ü+EtÄ<hA[äõvŸe7ÿؽÏE’¹µ’“¦¤Ž£Ÿƒ¤¤²µž›¥±¯®Àª¥±ººµ¨©²—|A«Çë!!]çÈŸ«®¬¬—¬ÄÖáÑÔÖÑÍÚçúøãѹÎÐÀÂÂÃÅÑÒû%÷ÒÐÒÄÑø ô±·”ù,6 HŽúƒÏåßpùñ“öæ¾fã_ üæë"Bˆ³°š¦˜°©´§“ºª¸®¥©Ÿ´´´²™§¬­£ ¢«°Žx3{ƒ¤   äĨ—ŠŽ—»ÏÔÒ¿ÀÅÐÛãú+÷èéÜÇÁËÝç×ÊÊÏÎÐȼâ÷ìãÞéñû 3¡hMÏ!5Q‰ÒFÂÞż”QÊJwÇÉëj0$e•—’‘œ©§­„¡Ÿ˜­¯†¤¶›š¦¼·¹°¼Äµ—t]#$cëÝÝó"È­º¬©²ÄÍÅäêÖËÊÌÎäüôàØæÖ¹ºÉÙà͹¸ÈÔåÏÄ×÷ þçÛÛÜë nå—ô! Aƒ § Œ8M,þîÁÝTϱ\ ,i”˜•|’‰ŒŽ~¥·ª²·©€žºž¢±¼¶ËÔ¾¾ŸoBÒÖâ?øù÷б¾½¨ª©¸Àé÷ñÌ¿¾¶ÅÍ»¬¾æéϾ¹·Ç»­³¿Í̵Òçú÷ÖÕÛêü+eãž\Í0rã ð´[ò¹Ëù½¦æ…Á“Ø;%Ny•–—‰¡¦„Ž”‘‘©¨—’”ˆ’§«©¶»»°Ž—·Ÿj6¡¨(ýÐÕØÑðË©¡¼±­«§ºé äǽ´ÉÁ§¦¶Àº°¥¦®ÏÀºÇÅÐÓÆæóõõúýð )€5ævÆßþ7¯LÖÔ†=è®’°ßÛäÛÄÒà4H—~ª#?a‹ŠŽŽ¡¬‚™§™§®“œœŽ”¡¢¸²š¯¶®¥ž¦£p9ö( BÝÓ̰ÇÛÇÕ½§–¶Ã´¾·¿ô7EëǼÙÐÅȶµÃÍÆ¹¸ÚÑÎ×ÐÒÞÛßåäìéìóë3§y Ðåc¯ºmGôÎÇ¥©§ÆÍ­¿ÀËÛúñ\ÉR€ö%=xƒ£¢›€•ž¦ ®©£¯°ª¿·¢¶°¸¶³Á f9¶¡¦0í×Ö½¹ÄÁ·®® ³Ì³¹¼¹í-N<ͨ¿ËÐ;ÍÔÔ͸°Â¼©¦¯ÃãæÛäâîéÙרèï[ê“ä-[É…×k/èËØ½âË¿·w€}¨ËÑÙ&‹µ(OýPz—¶„’’v‹•¡ž´¶¸ª§¶®³¹»µ­Ã³ª„GòüR!ôÌÄ´±½Ã¸¼ÌÓÞ⟫£×ô*M?ÚÏ×ßÍÁËÈÏÆ²¸ÑÏÂÎÓÞ  ÷ñØãÞÏÉÊÁÊò~_IÉøPœº·0òôÈÚÕ²œ¢š¬¼ÂÀý%™Àø/ãó=p€‹¦ª‘¯¹¹®›¨»°¸È¿¹·¿¬ÂǨ™Š` TDsöÖÊÃÀËÍÅÐèëоÀ¼´ª¿¾úBWH%óààÌÁÔäëãêø C%(O@)! úëÖÊæ )¿Ì—Öê LµD¾sØã;&ÌËÅÍÂÔãÆ¢¶È¼ÙÜEÊ…vÊÖ+Vo£¢¢§¶´¦§˜·ÒÓÉ»¼¼°³©º¤„|_”˜-   ñÝÛÐÈÙàèÿѳ¾´©¶›Ò6jtUÑÇÀÆâàÒÑå €ÛŠ13éåëâýêÇÇÜñ ãþ¬àïaà^„έ¹Íðﳸ´ÕÖáíש¿Öͯ­tÃ(/Ûö3Mj™¤™¤´© ˜›˜©¶¶§¬¶²¹£š™ˆY‰ÓøS úþèÞÓÈ×ö/&øÔÌ·¡¡Å¶×=Ф¦f/÷3 'kÑæ„F"롵ÁÁé ÿÚàáýF5DÃô%œ)p7×Å©À·¿ï³­ÃæÝ½ÇéÕÈú+©¦ÛÛANq–šŸ­¬¨š¡¹Á¬¬µ¹³¯™‹Sôxä'oôïÛñëåû ó1I+ëÆ²·®¯¿µÉ3Ž¹Ê•bKOcu`gwˆ¢ˆ< ÝË¿½ÈÈÂËèôûçùàGÁ7@Íš†µ·´ßÍáüÁ¢²ÑÙÜЩ¹ÑáR§ßõ°Ò)`vz‹–‰{ž§§½±£¥–—|w>àyg«%ö÷ö äï 2x6ѵ±¾µ²®¤¯ƒ×Ø„HIN:16OQl„W"ðÎͼ¹½½º¾ÙÕÐÎãñÉ¢Ü !_ÃïÊש“¤£¢¹åççË¥¾¼§¯ÜíÛØËÔ#€aX¶·½Ü@:KwŠŒ‹®¤®¬—±¢vr}`/ËaóyÜh/#ÚÞòëg¸›4ͱ´¾½¾’œ¢ïˆùÒNüöêßå*A@G2ôèâÐÈÁÌäãÒÝÙÐÚ ç¤å7‚Ý6÷Õ厭˜¼ãôÉÏÏÐóÓ½º»ÍÍÍÌ»ÁûI«Ï游ë,Ymˆ…˜˜©œ˜ZSP÷$Ã>¼U )5üæêðé*®ë‹ ¹¥¯ÀÍÑ °ºÛ7ëUøÎÀ·£®ÊÓóîí (( #þðáäöâÕíà·º2XM¹þU¡jÊÅ·¶ ˜ÉæÍÀýåûëãÖ¯˜§­·ÉÁ×ýqȲ«¹Úëú#@Q@Zqˆ„„wiSÜw"±Š3úø@SN3èè† rúÓÐÝÖÕÑǺÇbK/yüÖÒÄÉÓ××éÞÔÕÀÙô ( þßÍÒËÍäÛÇãÎxÔ Qº! ¾™®¸¬”™°¯–¨ïÔûòÕ·‘Ž›“±ÚÊÈß]{‚ß¼±·Àå $06OYyqUM,Ηa™jöòÿ@q ¢z.âÝDÏ&å1ÛáåéÔÆÄÐÝÂÐuyôÚÍÅÒÖñïëÝÐÆÅÐÕà÷áÌÕÐÐ"¢ð  {ú?¦“²–’¬–‚–¨®¸ááùÞÄÐÄ»®›³°¡™©+¥íÍ¡¬¨¸è 3?4CI#Û’bÆlàe&%'.9Tp³ ¶4æô| 0ÄÑÚÚÍ»µÆÎÒã‚»=|fíèåѽ°ÒÜ娽¹ÃÅÒÙßø5H)úäíåá\wlÝ H½4 ̳έª¶‚“ÜùïêÐÖÞ¼ÃÀÇæØ±‡‹œ£ð?=åÃÃÎ×è!""/-܈NꑘQ'*II^г¹é/ñy$ LÅ!xæÎÔï°´ßÓàùjjëVmöæÚÜÒºÅÎÚÙÀÃÄÌ×ÖÜæ øáÞïçí´é§öK§ ñ´®¼¬¡t¸ûíÕóÖ·ÒÞÓ¿æá¸z‰¬á\xŸíÇÇîñêåÙ¡>ß™}Iç€2#"%3q £šŠL$8\—¿Û²;âÑÒݹÂòÛçê8ÝOÿEÛº¨½»Ãççà⺺ÊçêïìÚãüõÛÓéè=OÎÿ2C⯥À»©Ÿ‘·Í¶±àÙĽäÌ¿±ºÎïË^’Åt  °¨ÓùüùñÿÚÀ„3Ãu>þÏ€D5$!+0+71ôÙÙjš™yvt? Ê¥¦¡¦¸æÜÖÑ.´ ¿)ݽ³¾Èï ðÖ¹Íîì×àÙÍÉßùöκÌâ~Æ{Åá÷4KŸE(ïͪ¾ÃÛçºËãÕÎ÷üáÍõ ì°ºÏìö×­{‰¢×rJJÊÅ»¾·ÁÉѱzŠó«vE+%%"àéðíÜÈÃÊê+{|O6=j[Ï—ž°ÎâÝã a¾à A çÚÕÖí$?'÷àã´¿·¿ÀÉíóÕÈçFBQ·ÞûK\¨<óÕµ·½õÑËÕɽèæâð0àßÙêçäâÆ—ŽÂLT¨Ý³§¡©¥‰yVÁÐ'éä ýþßÌÊÉÍÖÚ7dq4ø0mVóÈžÄá á`–ª¢jãÍÃÂÂÈ m«r)))ïÌű¹³±ÝîÞÍî©Õ¹Öü=`ÍÂÌÄ«¬ÂòýÐ¹ÃØåîå þöûÿéÜÖÌãÒ¦­8Ç"Õº©¡¦§~V<‰vßÝàñ#  üðíóðû 9=MK.óÒï.Y8åÁ°Åæõ -„˜X0JJôÛÒÓÒÁÔ&|!õóäßßÖÑÆÕçÜÚîHJX·Ðàþ/W‡$¬ˆs²ÎéìÌË×åúÉÿàü %ùÈÔÑÁÔðשõ%àKÕ²¨»»¥€N,ˆ˜üêîëôüøñïááׯÁØôþ  /0?*ýß¿Ô>ôÙç$úŠÃ‰ü$A+ ûûáÒ¾³¿+Vö³ÇÜìõýüõñø*çÄ Haœ:î×ËÊÒËåÜÝýûò÷¼Òú!þôÖñûíÕñæ¼ö%uòµ«³«¤“pMÅÁ÷àÚÙàÙÅÒÈÆµž­Éàñõõ/E"ÛdzØ0ÑÑ.='àÒ³2áØö-7 ÿß»ÄÑÛÓDr É×ÓÌÑàíþûýzŠ NH(([°2]ÑËòõéÑÉô·‰¥Ýþï÷*!4üëá 3œ3Ë¡{¦›‹níξÙÍÏÙÑâÕÏ×ÙÝÜáæîé5ìÆ½¬«Ð éÅi—ƒ,á¿áyê·²Çø êÐÁÃÉÎÕFt3üöØÎÙïîùôõÞ88:Ñ7sj,"g×^„!øöÈßþæÄÖë¢k€Çöüÿ9(  öÛÕþ="¹yÀ“È¥‘~9L2ĽáɯߨÉÂÅìöíâèäéè áÅÓ¿ÂÑØÙHß'l빞#Ðÿ¿ÇÓðäÑÌÔààä F2ìááåçÿì(ÙL‘¥›D3píhq/ñÑÜþüÿüëýß²¼¾†ZŠàæ$!Ý× K7ΨOäÇËàɽ¾¥ý­÷ÙæØ×òêÑàù翾ÈàäÅž´»ü¡0dV¥Ö>ä¾½ËÍÌëùÏÊÚáïûù.5úåæèíø ÿ ŸÓ­/œ¾ÝÙN FŽv„Z-"âÝòßÐÐÌѱšxfNt¾ß%@ ôå$7*LQô·ZöïðìæÓÊ</ìØÔØëòßåüᯧÅö öæì×ÄÁµ­â VÙ!3;æ‚8öı´¼¼Íîò͵ÅÍÔâçú-@ãØæîçÖãøWjvïR—–ÂÐK8}ìIa8+SV4ô×ÖÍÒÒ«hru‹Ô64 #ü .?íŸL"õïÉÍÙîùÒÅÒÙåȯ»½Á¿¸¿åÒÒÓÊÈÇȾÍêß˨¿¶}쾚›ª°ÅÕ×À¼ÉÂÇÀ®Ãï ãÓÖÑÇËÕ÷°¢ƒ¨Õl5Ñ"V4(1,OJ7!êìä””¢¯Ëâî&>,)îó7bæd ýÞß÷ ¾­ÇÁÁ½°À¼¶»Ùâ,ïðÜØÂ¹²Ïhüe ;ovÙ³”¦´°²¸»¨²À½¼³µÁâùãÖßèñÆñœñW¦š‹·Ûw5Ç1hA0%"0TÎÐØÆÌëÞ52EC1`kF XŸkøû+!áâêÎÚ}Ì­ÆÈ¾ÉÂdz·ÔûíòóÙÚþÝÓÎÛñ'ŽËË’<üÜæHßȿȽÃ×䢲¿ÇÈÕñóøôçÜÍÍåáÙ[–vÑ.zŒ€¢Ç rìNQ0,$K›Ñ²~7ùãé"ÿ+#%4,=24 C}ílEA*ýQK ñðärA)ÓÑØÎпÉÊÞÿýäÊ¿ÁÏåØÑô;f¤“O;îÂ±Ý  ÐÙëæù é×Ò½³´ÏÚâúöóæîñöá.:JÇFdexz†¥| 8¬‘_K,75B‹Ù¾<ìÖËÎêòøBfK7"& $ @c°A+ \`$öýë» »úëúôõòøõøú÷ÝÀÇÔÏÙðð:>ÌóöÕÀÕíH×ÁÇÆéñÍ»ÆÖÔÐËdzÐðüÿêî×àä©7Zpp‡v‹y%Yø›„FR7MSz*ÒQ³_=LYKgy×WŠ^-?O M0õêää.þõЇ`îãÓÒÛÊÓÔÚéîÜÊÅÕÌÛ øëÙ4 ãÐÍÊi帹¸Óѵ¯¶ËËÃÅÊÉÕÅØèèôÜÿš®{Ð 1Tc{qy‘ƒH%@Ô£³‡‹l‰ÉC]¥î—PC,$* ;¤&—µ~SG,#J1ŠFÉÂÔßï÷üéɬ'ð èêàãÒÐÎÏÇ¿ÈÊ®ÁËÜöçâæ ú÷î÷(åÔÓÜpÊ̹²¤˜¨±¹¼½ÌÒÛîâñ÷õõô‚ ö$Vcdh~qOZhlh90ÄÆôʳ¹=ʆfˆH>ø %YôÊ'÷‚702ER[ ‡KÐÌÚäô!ïè̯—°„úöêåóÜÎÏÉÍέÊîäÙ××ö ÓÎÈÎ/æ×íg#ÝʽÕÛ¾¸±ª¸Ì×ÛîçÑçüüÿs‡ð;xvc\YLOSR:6 éiÏ6ÛÍ^/ô™9 ÿ  //¼žO8ÍsCo¡nø‚2þçíåù" ÿôÓÓ\63ÜØÇÃàÏÀÒÍÁÍÇàûâÃÉÒùÜ´µ¿Ä(âÆÎ&ÖÏÄÑáÔßäÐÉÕÓÝõÜéÿŠ€vñ;^ˆrN/  çËG½uQtûí¶–JJ/<FF)($)3.(;‘h@úÈ(}¨*÷ÚÍçÖçï$øúðèÊÛ ×ÚÆÌÆÆâåàîôøë̯°¿äúèÓÂÅÂÝû÷æÇÃÞÝëúÞÎäÚÔáÞÍÀ¸Îëíèïúmubí/Zn„J21(! &,5œDhÒ»+%$ö;5>;+*('1-)+C”ƒ³æ¾¦Ô¹áîöìâñ ! ïåÝÞÖ›¾”ý÷ãäçÜáãíðõùêÜÎØàøùðÚÊÇÎâ Ò²ÉÑñ÷éãðÞÃÎáÙÃÁÜåÙÕöomiîFm‡{†‰bP5ò úõ;胱½ÕæMv)ãÿ!,%!% 3n«æPYê&ž¥ØÛËÔÑÖÜîõüóáä×ÞÁ¿mO7ßÜàèÞÖáõõòëâãÚ÷ åèÖÉÂÒìÕ½»¹ÏÀÈÔÌÅÄÄÎÎÈËßçÐñŒ„cî2^]ncXLûÔÑîøöÙã júH[a{˜îZ+$!*/*3.&%ø>|°àîä¼XÛ½ÔɼçêíëïòðèØÛĽ‡‹ýú%ñíëõõÿ æÑÎæãëûî»±½ÂÉÄÔ " ñ­¹Æ¹×ßÕØÏÌʽ´¾ÜÐÔŽuôFjs^VAùÕÐÖèýþòó0{à -@5mƒÚ{Z<HQA64./98( ( 4:"%$x ¿µ”ƒNñÉÓØâÿ ýñõÿìݼ°À¨ N ñèÐÇÖÉÀÆÅÏÐÐàëÚÊÎáßëàè>#îääÍÃàÜÖÉÉÞÓÏØëý¸Ê©+EMNI?7&ÿí÷òüû ,JËæ(/YCœJ4+FI,%62*+6$#00)eo’‘g\N)ñÙæçõý þñ ûéÛÛÓ’ìùBïÔÍÍàØàåÕÚáêûúðÝ×ÏÏôùô ÷ÂÐׯÇÔÒĵËÛÎØãúN Ò9U5'" ðÕËÜ þ<T€†‘éþFC-òb#('1@=/"  ø 8Lˆ¤yr\M&üú÷öåçå Õ»»¼ÂϦrö2ËÈÖåÕÆÈÊßó ûéßÖßæããáöûÀ”³¯±ÅÇÊÙî߯°²ãjH;æ<]= éêôøþóëðÿ Uzº«À*G[KC‡! &0)20&74'..:-3Q|‘diTO@ÿ *EÞ¾ÆÇ¼Ó¼Ÿ|òJçÏÝ×ÏÛáßãó÷äÌÄÄÙÚÀÝ÷%å¸Ï½ÒØÑäû ÿñÆ·4' èõöåàßèðîðC‚ÍÍÇÎÄÕSIDq„—†_ÓO.55*-+=3'.2..% ùÁØü6ZfN[JB2  "ÝØì&HEêÇÙúùòÑ¥>söûñåÚÝéëèÚÑØÝäà#;O×ØÚØÎÓ×ÒÕÔà< ×@L,üôøÞÑÕʽÁë[“²±š®¡Ä7“±ÇľÜÔ·B¹q`UM80=)!   "⟿ó:WYJhpZUN<M1"'?4+$ÿèç¾ÃßÑê öÝ‹ÍÚHüìíëýü÷öïæÓÑê!òÅÅÓËÞëåëô ŽqZ81ÙÍÐÛ˵ÂÒÏïG²Ïöü×åܾ£#FKOnT¶?3/#- '÷× 8p‚¡°Ýüèçã¢h&úûûüÞÐïվư½ÙëöõòéÅ/Sœ8öîûü  åÏÜÙ×ÕÞû ÞµìÒÎÔÇÌÿa Ï:[AéÒÜÔÈ·²ÜR¦ðö'/IH'+OrÚ×ßõúÿ%áŒ<°E#(/!ûöû÷úçݽÓàôT|¯Ì]ÉûóçÇaêuìϸ»Àèù÷áÏÃÈÜçåÞäîÿëw«âR  ößòäÚÑÌøýß½÷òþeþªfŒTäÉÇÚÄÐáö6r£ÈÝò,$9BR—çY®Úòèß#3ÄSÏÞ3 ûøøíèÒÐËõ2nãb–ø¦?aA×näFœ?úØàçñï䯝 ¢¸½ÀÕãâèñ¸:‚ óõøÿõóåêî".×àÚÿfåz'Èzø³a$ñçìøò?Q˜Â»·Âõ7*/Py…˜Æáã2’•acÀ[|‰Ïð?*ðåíù!y­©Cvº5vlZDA#Æz#ííÖº¾¸ªšƒ_x¦ªÇÒÚÙô çf¿? òò  úèæ êήƒ¾( Ò¡ƒM2+7Xjž¥§ÍßÝØã 'EHUt–¶µÎ؇’óáºîY…³6@Ù÷<סX% â÷õ÷-2.?yÆó¶±4,6mxóœ¡9óÚÑãçæôíâÖ»‘š}’¢’°ÍåÜ‚Þ{"ûõêÝÌÚù âá#³yÉQ%‹Uí³žn%!C``e†°¿ÎÐÍÜ>~—¨ÂØ'_8¨v¼ÄŸ¨òö=Å ËZÞ}û…>7aÑLCúêWÃúò÷¾¦ËßͰÈ:¥Tئ?íàïñþÿöÔ¿µ«”›¬¡‘§¹Ùúü×]§òt&úåæèú o–¾äÈ[0ã¹­É–PX´Å{fgxŽ€€­Ëí-e•Ü3Kt”~Iõ©~°è³ÆJÍB)8D+×Yæ¯ÛbG³ˆ“Üiy$üöß5JhÉwÏ&¯¦O$ ïÚÅÇѽ¯ÆßÖÎÎî°»º±·ÃÊÕæòÞvË&’4êÛâäÝïþæÙÏõ!5=Sòâö  :V .¿‘”«¡’¥µ½Óø"`²íùÚÁ¬«[…p¶¯²T[º±ÎÛOz—o^‹ƒs3’\P¶/³žÅáñAZ¢=‘öì]6)û׺¹ÐðäÕò÷þãÁ¸¶¶³¶®ª°½×ýã˜@®¬i5ìýìò¼î áÖ* R“}qḻı·ÑÖËÂÂá'm„b@Õªv®¶Yj ñßš®à‡ú7„Õ5i^VJçˆHîÎ Ð¿Ò L}”¸ðûgŒÇyF%á¼—ŒšËɺÐÛÜ×åÞÇ¿Á´¤³®¢ž‰©¶¸À„£3Ê|V.ûüÛýë­¤Ú^GµG‰mà°±±¼¼µ§Ÿ°õ8H¬}J<-( hVCƒc'ú´³R×ÞßåxÝë3IÄž€ —NïÎÏÍÿ}ǹ€O¢I ùØÆ¸ÝðÜæøûðãó úÞÍÐÏÁÌôôýç¥k¹_Ø›n(þÞòâûc–tb×8‡}š€èËÍÖÈÈÊÎÎÈáàP; ÷ òñ7 s•‚8â×'Ydlvr»þ  ûåɉ< Àª´¾ˆyÂU""ö1,!óÙâþûþùþ%-24"ÿöñÝÐÖîãßäµ®¥x-ë¹t'½dôþ Tz€†ÂR&¢SÆ¿tºž¤¡¥ÉÀ¬µÆÍ°ˆk;5A.+%óòô=ä¥1r\>Qmn~sxŒ®ÇÈ–k^PophCþ3n­—Îö]ôâëåèââú÷þôîæ×ǶÄÝéúõêôþóòóÚÒÔáâÁ¿—ž¿§wH+õ¼~*Øø9x‘•Ð ,ßL‰U ……’‚t…ydmvkJ2$ ýïùöúåå÷ùü«ZÝ AognhQOY53ù<7?-D[y—2j¥9ÿëîÝäéóùøÿôäÛÜèôóáàáðùåäåÙáõñìøñù  òæ÷ʯšpK:$íÿóú-@Wxœe“!ÖytRdŽ´Åže, óåæèðòäûó0‹v¸þh´ÔÈŒp_òÅÓª˜”ÎÛêû?_=ðG™3çßÝÎØî "-$ ñØÏÊØý $0%($üá˺¶õùÿý#4JWEbË*Ù|n\Ia”Éâ³W'&#ÿú&2,*F. Q¢ƒ³ ô¡~n'æ·•’€Êü'0åÛý£óF.ýûùý Û¼¯ª¸ìè"   èíîðîÕÉ»¹­>46)+86eȲ§z‘ªÇÑ‹) ÿ ')    ìî<‡Ð4ÂS›‚O.òÚ²—¸Ò%YyFå¦o=Å8ôàü÷ý #&#) ìîöéÿòóûïìæËÈÌÙåêùóÕÐÇÆÐ½¾·¥²A   1,4t·¶†‰Ž}¥Ùàëï›: þú ýéÞéäèûõåÐàê)fÑrô,ä•tkz±ç*X ¬g­V&#þùùìò*)6-%!#'!ÙÉâçøý.69=,// ,%# îþ  " .ȼœ‘Œ±'Rëk#!  '8õýý  áçï't2MÝ•“¹úßôùš-á™A! üü÷) óùÓ¾âàÔîçô;KJKNUF38:(ûãêúùíåæÕø"B@AD2 ">j«¯·É‹¦N©I-5,÷  &4áä÷÷éÿ".<I6T©ÂbRõÉÂä<_!ÕJÏ|>!%øá¿®µ½Ãºª¡³½¯ÈÈÉÒÞòüÿüü"*'95+# ÷ìÛB:7,',%/*(29C@8BRk“Ö#ÆX ý:06!+Øâ)JRC>3!%4<‘V*|Bç$x•ZwÚ\+ý÷ ÿþïëùíëâñßÛþúï÷ùñòëÑǹª§ž¸Ï¿½À¹ÂÚçèêòö÷  ù"#ÍÓìåí÷õîóþ '+06;-:iiL;.)7TCMC 3'2" (56¯…R‡G!<_u:£ú…2))+ úò53''*E?5I2,  ÿ ëÔØâËÌëó)%úøüõæóùäêþ  ç*598($%.)!)5%F^?:LGGCI1.#8DIG3</ ìøõæìô$,=X×ÍyfKV`ÕdC!!ø ='þüø*B.=AFN:*4 *1&îǾÈÓêõþ &-991+/5!úðúþ1=?R_B.& 1:240;2=EI@.>860$#%%-/ ù -\1.bC2l³7 úý2ý  *,+×ÓïÚÏéú  7)÷åõíóû"(&$óéàÙÞíþýÿüìíóó %5*)29WTYykohj:%5,/ÿú÷"-%$&tQêè´Tª@    èàõþûñçͽ¹Û" úãÒò/&&& þ"YO:3;0<EUMAH<1.@65;*##" 64;>4(ÿ&%,8( "¿ŠÇ‘XKOT0(  ù/HX4PneO*&ó %A=<+  ''/&4@:45&';RK[[\^LD2*%+#ýääââÜÑá ,NB:SJPYQL8*%-01!-&(!&:41 Iâß~5/-7L8.:CSC.)?@D<F_d[[dL75#8C. þ×Ñô#,øèÐÔèæÛÜéøÿ%.-.4-7SF7,  ôôõ÷ãßî&,=YWE7DdZDAG#$% )0040/=72*4=OXQ<-- ýáøO„g+ó" )>5!&1(ü4ýóØÓãÚæóôú-( %"! çßç 2&!#(DA0#,55>A78)#)( */7BT^T`K9."%!îõ ê1 ñû.ù8EU[dH2(õòíîöõùÿ  ýÑò5:+++<BCRZPDS`XED3%ù÷!ð!*$ $:31:?OaMBR@>JLB2DSA::ERWGJ8 ùñûøò*%'7OR-*6LUTW?>8!D3#"11.9/:FRH' ÿ" (ÿÿ1)(>C;8A1150÷Òéïí÷  ÿA7,&%+IFFCE>%<fm]C:92:3!&+1C1/0)$'2*4/(;>)<>7818@G2êîì,&")"ûðÞó21<HE6 +5!%%)-ïì '# ñ½±³ÂÓÝÛßÜNA)*,$&2*(-/*&#34**3+&%2A7&9;4A2(ïìÿ÷ßά¯¦à óí !>[R2.'"*/7)6Q- 3VXJ94.07@JQA*);:)%,,1-"0+!ܯµÏþþ ,>ORJ:),&%ìÙý',-ÿûû  üûû&%9C@10, ":òóöûñÒ·ËàÖ$ù èé0,%5IS[OL1êÂÔ.TZPRebMJ</@AJW]\[SQB6452ÑÒâö  -ó "&ÿöýÿ*:8//OQR[]SS!-%/7@8787), ð,68øï85Vca?'åØí ''*45#&ùɦ¸ï#$ ýõõü %8KQ)æà&#úò÷ +0üû4:556@MN;7$5D0 &!#)èãâÒÜ;<òÙçäÑè "&%"(&%/6E@KJOLîý!*"$%ÿõÚÖÝâí  òݦ–¸âìý^daaTEK?54üý% $+GL>/#$2:BEB?725=ü!1BA@6ï½îýíÑÐÓ¹ª¹áñßËçòýôñ '#"&$&,"Æ»â HI>D0#,')/$(1DLFKG)472$ûÍ·Ò*44RPA.<OAñ 1-0.',62CCR|q_SS>3,)2Êß&8:;<èÿ >N÷çûôéæ/*  # &.3;1ê¨¨Ó )+%;: A=TQP:&$1 ,</2*åê*0'4&:8;VC%)1548 í .(ü'  2(-3  ";KGCäãóòõ&ÜÏøýôhÇÅz4ýßÔãè=A-5=STEUWOFJG3*àÁ—’®Þó 2- *1EKQQUXbgH441 %Õ·¨¿÷(ûø*3>9, 禸êùϽã÷õõã·°Öä÷óí=KRB?7æÊθ±­½Þà×¼Íÿ )†Íæaóúùßó!"()ùúìÞº¦Ÿ…‡¶ôÿúüæëñõ 2GN;->HRUOD!ñÛÂÎÿ*7:2OOKE=/CJI?!$÷¹µÃȵ¸ÎôôôúëõཽÇì&4?1ñ§•­˜‹–¸ÕãìÞéîíü@’¿ÎÁ~2 ñåÏâ*10.6&'+! þßÔÑœŒ¦ØèîãÝëÖ¼³Ï%89! %7GKFMR3õðì&*,<FLE9:B9OTTVAåÞïôÞ×ø).+# ÿñÚáÚÄÐëÿôÊ©¨Î¾¶ÇÚóI§¹žn<÷íÝÌééú(@C>J,'B@òƸ¾ž ®æýãÌà  "  */#*Ú¾·¸¤®ÊìUHG7"' (( öèÜɽÍéóöåÎÀ´Á«³¬¤¨¼Ëʾ›£±ÆéÜéóø ùùü ðù#C, üúãôýõü &+<$%íÕÆÑÚËÄÁî  ìÚñ  óßââçâä Ù¨’‘£µÀØé&"2:O`J?:;6:9?=4#ÿÛŸ¸¯²²¬®´®ž§¨”¡­Èïúõáóèöÿðïû#**%).üæÜïþÝíÿ÷ø éñúààÞåññáâÒÙ×Ͱ®¾ÏÖÝÊÍ  óèì " % ù䯤ª½Ôè÷þ  $:GG@=.úú ýÿÿúûòÛÓʹ¾Îų·´·Ø5#& *97;:0>0Ü´¯ËëÈã';BKQ"÷óëäáÚØßÒ¸¸¯«´ÄÕÓÆ«¢Ðð øÏ³¼÷( üýïîýõýÿûü.'!.A=,"÷ò $$ þÿñçæäÝáÞÔÔâðåê >:(, 6?J6# ñÓ¸±ÆæÆÚ(".553+60 åçç;®¦¨¬²»ÏëüüÒ½×òîïúóéí;;<<7 ÿý"487;>>NH"$!!18/! H^II>-"þóù*2=A463-.)$$;06=8*!$îßÝëãýõü ')&#$=JH/5ðÙæÜµ£¢¥¡™™ž”™œŸ´ÀÇãñìù$.' .ImldOE<*'.&#1D\wtUAFXMGVPQTLN_iwrTPBHBB=9;)+ <=?GCGYbqwys\ROK=BM=?8[UM'úÈ£¹ÛÅä#DTUcWB%!   ûßËÁµÃÐÕ×ÂÀ¼¢˜”¨ÆÜëÿ.'! $+++.==5&*LZecK77AA?FH 1* $$5D9HMRXTM?.  BK7NU<?LN[WUP?),;-(25æÇ·­ÅÜÅÖð!A?'  #üýâÒÊÄØÏÕäâÞáïïüûäòïöû÷"+)"")"!-V\SONLNVSB3*&9.B& *õåÚßëí$)88TO7E:*<5) 9)$)! çÈÏèèññÓßóþ/#-"&<@@N]G(6#÷øþ &/;NM@-=;22""  !/+"(-29=5%# >C9+5+$*  "3/LMEYLSa?$/@AF87P>=>;$#02  ïåæìèÏÈÖÔ´»°¦Ñìþ%.B<6:=@ZK>1>G6,7:)B=<9*7PHDDKLIVTXJ:VbfbUWWRDLJC5"')-(#)605,-"/9'*=Rec_]@F6)**7--<0 ú$M[pa[S4þÙ®¢šž—–œ”›¿³¤½Ê×ï"äè&%2<>;("*A9CM2(,*+!"&&<JF@@4@G:;40HGDEG>'-/09OZ](/826340-FR?.%<<$)&$/1D.#>8B>.533:)4&ôèçÞÆ¶¸¨š¥ŽŒ›¦¦ª»›z­¹ÃÜÔ¹ªÐù +:9=O@/(ýúýùô6?2!"#1*6>4:J@H7.=ASN[TE::3.E[Z_WXWGCOSC3-'AleaTGNFB<3%2??9/' ôèßÛÍâêɱ«£Ã¼Ã½±¤¤¾¦––¶µ˜†“¡›¶æ%-(/4B8&#øóñíäþ  0EEEJL84>;=RKJFC=*;@C51/%,&FY_ZXRH>6%$>F][25?! "% ùçÜÒÒÈȹÁÈÁ°§”´ÎÐÓ¶¤©×Ó»¤»±‡™ž“Î4:IHL7&÷òù!<;95,í 10 )5*.<4. '$'59*+1?5CIC958@=FTUJ72@0%8+û ü  %*üåØÔÓØÙÒÏ¿ª°«©§£”©§¬° ©›£ÉÕµœÁÆ£œ²£~ŸÓëý!4I@R9$ /;C83L;07SQ/+! üîñ',#++)/9-0=!03)?N@1- 24,,C]YQN3 Þ¼´¿³•”—¡§£ £”„„‚}’”œ ¯½™ Ãצ‰²À›–·¹¢­¾µ±¿ÙØà+2<0/;2*" 1TM& #>@9:?4 úñö  "& ûü:64(' üöñ   50'?NG6$þá¾±¬«¶°ºÀ´¦›œ• –„†ƒ¤­·¼×Ò™š¡§˜Ž³¼ªÁ¦‘Ÿ¡±¯´˜…Ÿ­Ýðêý-6>7$#1>70(%$/C?.#14!'()+/6+%4A5+;7ED9@-1*#06,01+;M@;4ñîäâÑÐÎÏÊͦ¡ ¬¯º­»³¥ ”˜™„{Œ¾É«©¯Æ¹ž»Ã©§¡„}‡Ÿ­°¥ª£Ÿª¥¸­¤Ðå0GFAI@,!(?94NG7. $;QPPK?BE8&%"=JG<1IKD./BLWMHALYS;*ùõóæîêÖ͸ÀÈÚÌ¿½Ä·®¦ª²¢³«Ÿ§š—šŒŠ}p|«º¡¨ÆàÁš–ŽŒ–xr„˜˜«¹¸«©¡±´š«Þè& 489<$ *272HRGCNQG?:75/10.=NE/0H$0$    )úôíÐŶ²¤”¡¯ ¥·²¯¤¡œ¯É¾­  ¡ŠtŽŽ‹„x‘§¦”›šª¯— ´¸§‹Ž†Ž¡§®¦œ‰‰˜«ÀÉÞß¿Ñøô ')/9JP:8DPLI@*1'*1-+(1 )BbfWNM>23'#,$5LD@00üíØÀ±º¹Ä¸¨ª²¡¡˜Ÿ¦«§žž§‹Š†‹£­®°‹ƒ‹‘™´Ëµ›  ·Îº­²°¯©ÄÓÑȽ’“œœ’”š˜™¥¸×Ò´··«ÉþÒÛåÜéö*G9,;47;A0+07H:74  "%KM6<LL@11M>üõêëðè׿»ÊÊÌÌǺ·¿¼ÂƳ£‚{…˜œŽƒ‚´¶¢›•¡¾ÌÖÆ®¯¿Ã¼š‹¤°½Æ¸®¸¯¯µ½ÈÙÌ´–Œ’”ˆ•šŽ‘”š«š|yŠ¥˜“–¡¬°á÷õ!0,5BI>2"53/%.87;?7+ "*F[]Q;5ÓÜÙàÉÁ°˜£ª¼¸®²°¨–‹–Ž‹sixŠž«²¸³°•}rp„“––“—˜§ ‡©ŸŒ†Žš¦ºÖ§˜˜«¼¨¥§ •‰t‚‘“£ž˜¨ ‰š¨Âż·­¢®ÒÕÉÀÇÞàÛéðò7CB+ "?OOB3*"/ ÷ëåIJ»²½ÆÁ«¢–‘–¢˜––‰Š˜Š‹ˆ‚œ©¯¢­ÆÐÆ»µº´­ ˆˆŠ“£ …z‹— ÁѦ‹Œšš™™¨¸«£œ—žœŒ‘™“—¥§‰†•py•¢ž©¥©±ª®¶¨‘tpŒ¢«¯ÆÌµ¬¼Ïçôú÷ð÷ëÚØâçôýûêØÍ¼¹ —¶ ƒŒ˜œ¦£œ›£¥¡©ª–Œ¡œ¡¶ÍÞŰ²¿»±š‘ž¸°šªµ°²²º½®®™’”š‹Ž˜¢‘„„˜­¡žœ–‹Œ¡©©¨««ž–‹u\S`jqo~‰‹–Ÿž“ˆ}…¥™ƒ}Ššœ“©³ª¥›–œ½ÂÀ½±ªºÂÉɳ©ª¸±­¦¢›ht†–ž¬ºÈ´±®¯²¯¬¦­¡›«¯®¢†s{†‰xlŠ› œ®¡ž´ªŽŠ†‰Œ“ˆ˜¥«¡©®ÑÞÃ¥„p‡›ž ¡¦ª§§¦ª¼Ã¾¾¶´Â¸®¡“•šˆˆ— Ÿ¬¢™Œ‰ŠŽ}{y‘±¼¾ ¢º¼ÀÈÅÁ³¦ ¬­­¢¥žŸ–´¥§®­§œŽ˜¡‡††ƒ «§—{wdkr‰’Œ……Œ• ‰„”Œqv€yq{‹Ÿ¤›ˆ”œ¡£»··¹¬™™¥ ¯¿°±±º¹Æ¼¦£¬¶½»©¤¤©¨œ–••𶏱µºµ®Ž¦¸¾¾½±¤ ª±¦«­¤•™¦¬£Ÿ£¯»¼¶žˆ”‘ŽŸ¡‘‡‘}wo{qhv‰œ¢¹³«¤’¡¬¶¦„hlt`p…•¯°°³°°¨¢©£ª«¤£•›­­«¤£´Ä˦•‡nƒ’Ÿ©¼¬š•“š™™~wŠ’‰™©¬›ž ž®®·ËŪ·»º³™£©ž’£´¿ÊDZ«³›…’Š„ˆŸ¥Ž¡ ž ž˜˜ˆ‰¡½Ÿ™‹‡•¢¯§ —ŸœŸž¡¤›»ª’¸Ä±²·«’‰Ž››”£¬­¸º·¦– ¥™›“•“‡Œ{pe{𱤗§´»·¨…šš¡Ÿ ›ª™—œ§±¯ˆ…Ž˜“§ ’“¬šŒ™¢™ž¦›Ÿº³¸ÄÌ´°¡—Ÿ €‚“™œŸ­¼²­©¸¿©“ypqtxŸ”„~}¡² Š§¡¤ ˜‡Ž›«ª®³®¢Ÿ«®±ÅÎá̪©™†††¤®®‘Œ”Ÿ™‡‡†Žž¤ž °»•ƒ‰€”‰•†šŒ’¨²«§©­«¦­¦™—šž˜¥¤¹ÎÈ»»ŠŽ›› Ÿ«¦—’˜Ÿ¡˜ ©§š’Œ‹šž˜‘ˆ€œ° ‘kpˆ‡”ŽŒŒ¤½Î½–“ ­­«µ´®­±ÏÊü¤¤¨¢£´¸¶ª°­£–•œŸŽŠ„ž£›”•›Šœ§ŸŸ­´¨—•°¢ªÉÍ®•‘¤ž¤¤®°¡°¯˜”®¯¨Ÿš‹š¡Ÿ’ºªŠ‹•Ÿ²Á±¥—xneqtz‡„‹—œ”–¥¢ …qƒ™£“ˆƒ¦Åó£¥™’ž ¤¡–¡µ¹Â¼´™¦Ì×Àª±­¤¦°¢œž¢¦²±¶¯¨™§¶¯¢¦µ¯¥®°¬ž— £™‘ˆ‘”«´´Â­ª®§©„›˜•–¥Ÿ•£§Ÿ®‰¿»”•˜˜ ™Ž›†q›¥¦ŽŽ£ž–¦ ‘–§Ÿ¥¡“ •—ž¯¶¹¤~x‡žÀÖÏǺ¿ÊÆÈÇ×ÇÁÇÄÀÀ½ œ¨±¡»Çº¸º«ª©µº½¹¡«·¼¨›©±ª˜œ”›®­º·   ´²ªž‘§«®–ƒ“—•™‹—ˆüÿüÿOB~ þHpydicom-0.9.7/dicom/testfiles/ExplVR_BigEnd.dcm000644 000765 000024 00000036064 11726534363 021635 0ustar00darcystaff000000 000000 DICMULÌOBUI1.2.840.10008.5.1.4.1.1.6.1UI:1.2.840.1136190195280574824680000700.3.0.1.19970424140438UI1.2.840.10008.1.2.2UI1.2.276.0.7230010.3.0.3.1.1SHOFFIS-DCMTK-311 UL4CSORIGINAL\PRIMARY\EPICARDIAL UI1.2.840.10008.5.1.4.1.1.6.1UI:1.2.840.1136190195280574824680000700.3.0.1.19970424140438 DA 1997.04.240TM14:04:38`CSUSpLOG.E. Medical Systems€LOGE MEDICAL SYSTEMSSHmvme87LO LOGIQ 700 !"IS0 !$IS1 !(IS0 !*IS1 ULPN AnonymizedULLO4131101  LOR6.1 UL† UI01.2.840.113619.2.21.848.246800003.0.1952805748.3 UI21.2.840.113619.2.21.24680000.700.0.1952805748.3.0 IS0 IS1 (UL\(US(CSRGB (US(US<(USP(US(US(US(USàUL8LàOB8@«­œ°¥À©ÿÿÿÿÿÿÂÿÿÿÿ´¹ÒÉÉÎá¾Ç±ºÉåÏÔÝÔÕ¸µÛÜÛØÈíÉÊáÄðíÛºÃοÅ×ÅÚÕðÿÿÿÃÄÿÿÿÿÿÿ½ÅºÉ°¶Á©¸®§®£·³ÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÖèÄÑÍÅÓßÑ·¿±Á¿ÏßïìãÈÔÁÑëÈàÚàÚ¬ÏØ²ËÊÿÿÿðÿÿÿÿÿÿÿÿÿÿ³Ã¶´¶«ÇÄ£¾¸š¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ©ÿÿÿÿÿÿÕßÔ°Í̺ÖãÖÛÛÏÁÅÀÈË×ÔÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾Ì¸²¼¬Ç–šÀ­•žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÀ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÎáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË̾±ÇÏÇœ›ž–©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËħ¥ÌÚΦ•¦›¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ­«ÌÑË©ª®˜Áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾±¼ÑÇ·°•­³Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¬¾Ì²¢¤“©´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¤§“–¥•›«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¦•˜œ£š•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·¨¥£”‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¨ ›•’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”ª°’™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§°±–Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³±š•Šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¥ƒžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›†œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«­œ°¥À©ÿÿÿÿÿÿÂÿÿÿÿ´¹ÒÉÉÎá¾Ç±ºÉåÏÔÝÔÕ¸µÛÜÛØÈíÉÊáÄðíÛºÃοÅ×ÅÚÕðÿÿÿÃÄÿÿÿÿÿÿ½ÅºÉ°¶Á©¸®§®£·³ÿÿÿÿÿÿÿÿÿÿ½ÿÿÿÿÿÖèÄÑÍÅÓßÑ·¿±Á¿ÏßïìãÈÔÁÑëÈàÚàÚ¬ÏØ²ËÊÿÿÿðÿÿÿÿÿÿÿÿÿÿ³Ã¶´¶«ÇÄ£¾¸š¬ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄ©ÿÿÿÿÿÿÕßÔ°Í̺ÖãÖÛÛÏÁÅÀÈË×ÔÇÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾Ì¸²¼¬Ç–šÀ­•žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÄÀ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÎáÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿË̾±ÇÏÇœ›ž–©ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿËħ¥ÌÚΦ•¦›¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÌ­«ÌÑË©ª®˜Áÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¾±¼ÑÇ·°•­³Äÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¬¾Ì²¢¤“©´ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¤§“–¥•›«ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬¦•˜œ£š•ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·¨¥£”‚ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¥¨ ›•’ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ”ª°’™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ§°±–Žÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³±š•Šÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨¥ƒžÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ›†œÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹ˆÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÜÜïÿÿÿÿÿèäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûóÿÿï÷ÿÿÿóèäÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÍÕÿÿÿÿÿÿûìïÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿèäÍÑÿÿÿÿÿÿÑóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÙÕ³ÑÿÿÿÿÿÍÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºäè«·ÙÿÿÿïÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿìûÂèèÂÙäÿÿÿ÷ÿÿÿÿÿèèïÿÿèäÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷äÿÊàÜÑÿÿÿÿÿÿïàïïàÜÿÿÿÿÑÙïìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿ÷ìûÂàìïÿÿÿûÿûÿÿûóÜÕÙèÿÿóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿìïÿóï÷ÍÙÙàóïìÕÙìÿÿÿÿ÷ûÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûäÙÜÙÂÕÑÑÊÊÍÕäÿÿÿÿàïÿÿóÜÜÿÿÿÿûÿÿÿÿÿÿÿÿìÑÑÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÙè¾¾¾ºÑÂÊäÿÿÿìÙóÿóäààÑäÿ÷÷óÿÿÿÿÿÿÿèàèÿÿìïÿÿÿÿäìÿÿÿÿÿÿÕèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆÆÊÆ³ • Ê¾ºóÿÿìÆÊûóàìûÿììäïä÷ÿÿÿÿÿÿÿèÜóÿÿìèÿÿÿÿ÷ÿÿÿ÷ÿÿÿèèÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷ʺ¾·•† ºº·ÍÿÿèÆÑÿäÙäèûïèàèì÷ÿÿÿÿûÿÿäàûÿÿóïóÿÿÿÿÿÿìÿÿÿÿ÷óÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÑÑïóѾ¤«Æº«ÍÕ···÷ÿìÕÊûàÙïàÑÙäïìì÷ÿÿÿìÕÿÿèÕÜìûïïÜÙ÷ûÿÿÿäûÿÿóûÿÿÿÿóïÿÿÿ÷ïÿÿÿÿÿ÷ûìèìÕóÿ¯¤«º¾Æïì·¯·Õ÷ìܯ³ÊÑÿÿÿÿÿÿû÷ïóÿóàÑÿÿìÜÑÜÜÑÑÂÊïÿÿÿÿÜÑèï÷ÿÿÿÿÿ÷ûÿÿÿÊäÿÿÿÿÿÿïÜïÿ÷ÿÿ¯¨«¯Æ³Ñº¾¨«¨·ÍÙÍ•‰¤ÊÿÿÿÿÿÿÿäàÑÑàäèÿÿÿÜÑÜÑÑÑÆÍ÷ÿÿÿû;Ñûÿóóûÿÿÿÿÿÿ÷Íóÿÿÿÿÿÿÿäïÿÿ÷è«­œ°¥À©ÿÂÿÿÿÿ´¹ÒÉÉÎá¾Ç±ºÉåÏÔÝÔÕ¸µÛÜÛØÈíÉÊáÄðíÛºÃοÅ×ÅÚÕðÿÿÿÃÄÿ½ÅºÉ°¶Á©¸®§®£·³ÿ½ÿÿÿÿÿÖèÄÑÍÅÓßÑ·¿±Á¿ÏßïìãÈÔÁÑëÈàÚàÚ¬ÏØ²ËÊÿÿÿðÿ³Ã¶´¶«ÇÄ£¾¸š¬ÿÄ©ÿÿÿÿÿÿÕßÔ°Í̺ÖãÖÛÛÏÁÅÀÈË×ÔÇÿÿÿÿÿÿÿÿÿ¾Ì¸²¼¬Ç–šÀ­•žÿÄÀ§ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÅÎáÿË̾±ÇÏÇœ›ž–©ÿÿËħ¥ÌÚΦ•¦›¹ÿÿÌ­«ÌÑË©ª®˜Áÿÿ¾±¼ÑÇ·°•­³Äÿÿ¤¬¾Ì²¢¤“©´ÿÿ ¤§“–¥•›«ÿÿ¬¦•˜œ£š•ÿÿ·¨¥£”‚ÿÿ¥¨ ›•’ÿÿ”ª°’™ÿÿ§°±–Žÿÿ³±š•Šÿÿ¨¥ƒžÿÿ›†œÿÿ‹ˆÿÿ{ÿÿ€ÿÿ ÿÿÿpydicom-0.9.7/dicom/testfiles/image_dfl.dcm000644 000765 000024 00000011035 11726534363 021143 0ustar00darcystaff000000 000000 DICMUL¾OBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.0.0.977067309.6001.0UI1.2.840.10008.1.2.1.99UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 íÝÏnÜÖÇqÆ /ÚBE¢èj€lÜ d'µ“]TǪX’aÉ šEÑEWZòÝ0Ð…!/ y w¥M#»”󗼇ç’÷Ž9$ï=ߟ Í ïŸ™ðÃCŽî(Éýâ7Åë“ß|öéáÁÃÃÃÃÏþtððàÓòûáÁ“â~ñÛ²ÇÊŸ<^mÿÓç-š_Ÿ?yrøøÉ'‡Ÿ<><,7–cfÅ—GEy{X\žÎo_Ïç·/ž^Ü+Î/ïÿ(ï}X|}ñåì~ñ¯âÅù¼õ?Å˳‹¿•Ù/ök÷g‹öýr¶ù¬ûÅ娢Üú‹ò•=Ð^Ù£êU=<\¿ªYñ˲ÿÇZÿOêÿõû‹×=+~Uœ,žñ׫ÛÙê_¼¸ügqùüÙìüõåË×—³óãÙåó“‹ÙÅùñå×G¯žÍÊûÇç¯f'g_=»¸<ùËÑåÉùÙÑ‹Ùë‹rÈÙ‹¿Îþ8;;¿œ]–Ͼœ•^¾|uþUy>êé‹“³“§e÷rë‹òÎ|ðìAq¯x]îÅŠŇåëøyqz~vþôù«óÓgÊÖýEkqïAùª×÷Šæ÷î—#>ØÜ»·¸·WÞûÙâ^QüïßûÅùŸË;å¼ÿ9¿9ßþ¶ƒ¿íào;sƒŸ|ùÑïü þCäTäXD¶{FúÇlýÊð"øã?þøã?þøã?þøã?þ=úk½[Ž“4ý÷V)VY?ÆüÓõßÛ“²•m]ümøû»9-ÚSá¿Y·ƒÿðÿü­ûwyËvÏHüñÇ¿Œl[?ÆãþZo­ß*øüñÇ¿Û_S¯¶Åø»Íø¯‚ÿ™¶<³wþjðÇÿþüe›÷bòþþnN‹öTøã?þ&ýÝæ|ýµÞZ¿Uð"øã·¿¦^mK׿Ë[¶{Fâ?þAÁüíú‡f|©ˆ?þøã?þþ»þCüñïö>ÃìeüñÇ¿?ÿ½bñ%6lë/÷¾—ÉëÕ‡¿þKþBlÀߊ\ý¯ßOÖoñOÙ¿«þÅ#ü3óïªÑ8ºÿt37ˆgöŽ«þ•ã#_ÿÓãÍ—ÜVë$þ<¯0MÿFý+ÇGí‘°Ÿß¦ì_ñËmU§¬ýã’›võ¿WOQÓ‚ÿ2ÙÕ?þÞÌ_Äò»¶úJÊïÿ4êߎÿZßùw¨ÓþZý7‚þ¡×ÿFäK]?6èŸÛû¿ úÇdÿÐ Û§ ½þÛò_­ÿ~蟛P²ö¯øýœ$íü¿ZÿâÀZï½1Þÿá?pý×3Ïûñß:YûÇ]ÿñŸ¸¿ŸÜi‰¨üåSz¦NÓ?®þÛ’Âë¿;®þ þCý÷àOýoëÏì1¢?õoÍß]þ·Tÿý%eÿ¶åüó÷o þYøWë¿[¬$¬çà?þ~ÿº~ôgÀø¯²œióÿLýçªïüMœÿýäN þø·§®/þo`õC`ÿÐ Û§1qþÇÿhý<¯ŸÿÓõ=ÿ·ÿ1¸uÿ1®ÿ;÷w–ûÛÿÿï¿+íõŸìù?Éëÿþ7’¥gêIøûÉ–ˆú7èŸðúo´\ý·%ÿ„?ÿÙqýÛð§þ·õgöŽÑŸú·æï.ÿSÿÖüÛ–ÿóöï/)û·ÿ,ü«õß-Ö€‚?þcÿvÿº~ôgÀøãÿ‹àåÌËŸ ùsþñŸ¨¾ñOÄßOî´¤å:aû4&Îÿ½ù×õÅÿ ¬~à"þ¡çÿö?ÏÑ_?Ïëçÿ,ýåþö?·îŸåõßý¸Ï­wîÕ£¼üõó¼~þÏÒ¿­þñÏÄËßÿ¢üC—þ{YðïÍßüõþ[Æ€ÌùÛþé^ÿñïãüoÎß}¾–YñÇtÿƒ?þøÛögöŽÀÿaü×Cë·øãVþË›Ÿ¡þîÜÍ· ÿ®)Ô¡øãŸ§è„íÓxý¥}ã°Á?ÿ:¾#Œ?þ¹øß‰¼‘í5?Ù¤ צXOƒ?þSöë»þKûÆ0ü ûüC­µ~øïÖÿïú¿miÿæÍVá?þÓõë»þã?þvý¥½xvüóð÷ü§åß5…:üñß¿§à?þøêß…%ÛñÇ¿GËÁßvð·ÔýC­µ~øãÿ­ñào;øÛÎÜ ÔZë‡ÚÁ¨\+¹R¢õë˜Æ;—wÂͬøã?þ=øwM¡ÅÿÄü×;»~‹?þøãÿ6þ]X²}ÊþË›Ÿøgç/íç·øã?þ‹Öú!€?þøgå/í] ümû_sýÇÿ¡üC­µ~>w‡6ð·í/íç·Në5×üñÇ?ÿ1“ÿuz×ü£ü¥}£U÷¥Ñúá?þCù»û­AÐîï þ^ÿ÷þøì¿eðÇ¿ÿxfïüñÇüñ?Z¬ß.Wi—?ë ó ëom»kê_ö¬ÿNÌßÝo«GøãoÔ¿®_ÿ/>hÛðOÖ¿Žÿ‘îŒwæ«ïü9ÿã­ýêúÊy䌮ë‹? ˜¶’×ÿ÷Í6þW¹s0àŸWÚë?Ùó¿×Êçÿ1ü¯$yþI^ÿÇðï8:R=ÿGÿþç þøÛõ÷ÿCi´~ƒøG_ÿñÇ_‹ŸÜiÉÔßwþO×?6ø'éß[lû'{þÇÿéûk ùÞUïÒ¿oý_î3`ûãÿýÅò?þyû_ËÕß¶µàìý?þhóeÄÿêZ~à˜,ý+~g½0cÿFýìÏìу?õoÛŸú·ío¯þ·Î´ý×:õ[ƒõ/÷Ùú1þõï'wZðOÆßáí¬üw¸þ;Š¿Ëëܧþ³ð—ö› t³þÝûÔ¿’~þ;Š¿7Ôÿâ÷Á+ñ[¡ý °ä_ñ;ÖÍóOÁZþjý§ç/í7@¶üåάï*=jýkçü³ð—µ|ýÇ? Yë™\ÿñôªÿôüyÿèTÿ; þ Ôÿ“€L’ó7Yÿîú®Hcý/kÿLë¿ýý_«ocý?aÿégñùŽXî´þ㙽#†õïòÒt¦â/þ¾Kü¹Ï õÿþn¨ÿüücBýÛö§þGôï9Û©õüñÇ?/mñW,ûâ?þøOÏ_ÒPü–EüñÇüñŸ´¿k§ªá?þ6ý¥mÓüñ—º¼eûøßîÆ_S¯¶á?þøOÔ_ÒPòõwíjø/‚?þøÛõ÷[zsñ—¶MWüñÇÿøÇ3{Gàc‡àïŠyßÝùý5õjþøãÿDý5j›‡ü­øKÛ¦+þøã/»¼eûøßâߨ!øwÿEð·íï·ô(â¿ ÿ˜à?þ)ù÷›Éù‡üñÇüñÇüñÇüñÇÿ¼ý3 þ¶“œÏ{ÿümÛ±îÿNÐXEpydicom-0.9.7/dicom/testfiles/JPEG-LL.dcm000644 000765 000024 00000350312 11726534363 020272 0ustar00darcystaff000000 000000 DICMULÀOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.4.20040826185059.5457UI1.2.840.10008.1.2.4.70UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.4.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical Systems€LOSt. John's Memorial PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !STJPEG lossless SV1 !SQÿÿÿÿþÿàÿÿÿÿPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@p¡SQÿÿÿÿþÿàÿÿÿÿSH121320SHDCM LOUncompressed predecessorþÿ àþÿÝàþÿ àþÿÝà LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL`ê %SL N &SL 'SL *SL ,LO .FD`ffþ? 0LO WHOLE BODY @LO BERRA,JAMES ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH°!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDÀð¥«k@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FDð?<FD>SL ?SLDFD @EFD°@FSLUFDð?VFDð?LO GEMS_GENIE_1FDàz‚@àz¢@SLSLSLŒSLFDFD€Q@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS4 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LTJPEG lossless SV1 (US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US(US(US(SS(SS(!CS00TUSTUST UST!USTSH WHOLE BODY_EàOBÿÿÿÿþÿàþÿàÿØÿà ÿÄÿÚþ „ÀÀLLL`0™ˆ10LIÄÂ`˜&&ba0LL „¡0L ‰€”(La10`Ï JyL0LL`”0”Q0J&\ÌuÌÀ&& €IˆÀLuÌ¢`¹% ‰A(× &:äL`&`&\õ100ï”LÁ10uË®@ @I 10&@ê"a(„À™ˆÀ&3˜˜ 0ê!0&&”˜I10˜ :ä˜ €˜:ä&Á0€` $LL(0` €ÄÁ0 €˜”ÀP&I’ ‚`%:å(Q ‚P €˜˜˜ ‰‚P0LÀuÌÁ(×)€ € €”L$‚SÈLL`˜b`J ‚`a0˜¹g™å0˜˜L%L:ä˜&0˜uÉ0L:äÂ`&Âc®@LL ˜˜b`˜ @ ˜€& „ÀL&a100˜ÄÀ0PL`˜ ! ‚b`L "`ÀPLÀ™å0L €`ÀJ ‚`P ‚`L 0L €L A10L& ‰„Âa( ‰‰€(ë‘0&bb`&& ‰€ ˜ 0LL&&ÀJy®I€&&D%˜˜Ja0˜`% „À&&& ‰„ÀL&&0&˜”(0ba0J& ‰‚`L`˜ €˜LòLLuÌÂ`&Ç\„À˜ 0˜& @:äL&&0ÄÀ”LJbDL&&Lb`ë ‚b``0H˜L`”&˜b`LJ €˜ €%J0(˜Â`%ÄÀ B`(Lu;à˜uÌÄÀ”%&&uLLLÄÂ`g™‰‚`LQ"LQ10˜ ‰‰€LuÌÁ10˜”&À”˜LL®f&& €Ls100`uÈ DÀL0À`LÀ&îR€˜% €(˜J ˜ër™å10˜À&&ÀJ`J&0˜L®DÀ’ × L& ‚b` €ÄÀ&&€ 0`À%ÀLLÄÀLuÈ`×$Â`&:ä” ÄÂ`0:äL&uÉ0˜˜P ‰„À”‰€L €¹˜uÌÀ`™äÀ €uÈë×)„ ˜LLÀ ‰‰€LLLb`LĘë”ÄÀ˜ €Âa3ÌÄÂ`%`&%0LL¡× &˜À`LÀ ‚P˜ÀP:ä0L`”Á0J˜˜˜&&& €”L˜:ä%(\‚`0J€& €&`&L„ÄÀL @ë”ÀLJ`& „ÄÀ˜& A0˜&Âa0’˜LqÈÀ €L @ ˜LÀ\“0L( @˜LLL10:ä& ‰@ b`uÈLLIL „Á13ÈL(˜&ÄÄÄÀÀ¹L`”%uÌÀ¡00D Á0I`˜J\‚bQ0r&a10˜ë™€Â`” ‚a(LL0ÀL&&y˜%×2‚SÊ`˜(&%110J  ‰ž]r&%&Á0˜ "c®@¹L&˜0Á0`˜&uÈÀL@”D¢`’&% €&¢&%Ç\Ì €”˜L ƒ¨€&˜ba×2€% ‚PLLD`uÌ ‰‰‰žeÀuÊa1(&¡ €€˜`˜IQ0˜Â`ë‘0&&0¹L˜L „¡0`’˜LL:ç®BbbbP%˜‚`L0˜IQ0%”&`LLL&˜`˜ „À`bPJ0&&! @:æP @J&À˜×30”LbP”Q0˜&À`˜0Q11ß$ë—Qu˜˜˜rÁ0 @Á0(˜110 €& „ÄÀa0˜˜&” `ÄÀrL& 0L A0ê&À&aÀLr˜IÀ&&Á0&&&&&01rr „À&€( L ‰€˜”Ô10;à&c®@¨A1( a0„À`Ä %Â`&`ê ”:å0L˜J €&(H‡\‚a0L& €˜˜À „À”tˆ”(ë’bH €L%La(˜À˜L˜&Á0L”¡0 Ž¢˜ (˜Ió×"`uÈHüHL0 0 €&  ‰0˜\¦ÄÂbPb`&;á0ÌD¢a3Êa0J‚`”`0˜&&1(&& „À € €$bb`Á0 DÄÄÀ&P˜ €&¨€:„LLL ‚a0˜JQÄÀI3Ìè×!(Ç\ºæa0€L`ê  L``˜:æ`LP˜%À&Ç)„¢`&g™!3ĺàJ`%Jø`ë’a(:ärL˜LI˜0 DÁÔ@11(Lr˜ÄÂbb`&%¢ ‰‰0˜¡0”1$ÄÁ(`0ë `˜Ç\100& €&Ç\„À˜˜ D¢`Lu:ˆ&y˜&‚bbb`L&&!1$`À&P˜0LL& @L&€˜LLÄ& ‰‰˜„À&ÀJ €LI€ žSÀ €”òc®S(˜ÂPî@&&` ‰€bP ‰€LL0”LÂP:ä˜ ƒ¨„£¨‰€ê"SÈ&&¹ 10‰‚Pa0L&L&&(LLJ DÀ&&ÄÄÄÄ &1(˜˜u(™å0L0˜’ €L&&:ä ‚`ë˜`˜`&0&`&0%(ÀÄÀ ‚`LuL¹˜˜ ‚a(ê0QÜ9wÄʘL&;âP˜LLI Ba0&®C®f&&%L„Á× &`˜&(ÀL10c®S&&&J:æaÜO3Ý}J¾ùuÏ\Nf˜™å10 ‰€&&L0˜˜ë”˜0 €Â``0:ç®@§—| Aß×ÜM•M±ÑgS˜LIßP !0r\€`˜˜ë ‰‰€À&˜r:å10˜uÈLL0L;ˆ„ÄÁ)æbH% ˜‰ë›"êã¸ë¼úbkãeY»¶™¦,ç‘1Ô@˜˜ @”JÀ&¹þ @`”<ÌL%)ä O30”L¹Àt”÷=Wlñ³…:9æk‰³=z)ç‰!L˜L:„ €:äL% ‰B`J%0LL 0LJL˜˜„ÀÀJ`I0’Á(J&aßdh¯G3_zöâ®ÌöÄ×Ô×Âq‘_|YuÉ3L €˜` €˜ÀL&€uÈë‘10ë”Á0$€&&ÀÏ LrLL§¨²Ìú£T÷R=úhêº÷RïWw“žóÕm‰ç®eÀJ‰DÄÀ&&&&` ‰DÂ`&L&×)€˜LL €LL¹&$Bb`Ia0”Ç}wevÏ´óÚþ3+ßNˆÏº˜ÉººrËÜSÜì¶sƒ¸æL ‰ë0˜LLLÄ!×!0”&À®g®`:ä”&¢`L ‚PJÁ0ë‘0&yYÔÊÞ½úã×ð=w6Q}Šø¿/­áõ»ž©îüê»Ó߃«ˆóúyÖw›„ò˜˜ê L €’˜˜L˜Âg™0JÀ&%LL ‰„ÂQ11"&)ä$Nèçewz6yš»ÝVMyµ×^M>—›¢ú9Ͷ¾èÝ—®g˜4æÝåÓ^tñÇ\¦ @L ƒ¨€&& „Á0¹ €0&ÀLB`&`”®DÂc¨‚`¢z»žôLnŒÞõ^—›dzl¯®-Égz{ÇMúh²qèyþ– 8oó:ª¾qMR®& ¹%.@L ‰ ˜¢`P˜L ‡\¦ ‡\¤‚a×3110`˜L`ë¾g]:«·_7]fžrûO›§ušp^²ü¶ÝÅVúfž-NevF{<úz«UÙ™ÄÁ×3 ‰‚`˜˜J&:æ`0˜L˜Àa(L &&ÁÔ@” G\÷Ì:æbg®ïŽ—ëêúïî¯K"»¬¢ªôó×ðú9ù천ÚmïF{qQ²oÁÞ:ló«ãŠœG3uÈøÄÄ  € €˜˜À&r˜&$€”LÀÇ\„ê r×3˜uOqÞþ;¿G«~\>µ:"qf²¿KKnËß:0iî]g㟣fŒ]ôf·?yì–ï+~ø-«o^_¡£Üõû®ªÙªª´ÑD¼ëðñ‡¼üq<¦:ä%À˜ï‰L¹ ‰€`uÈ €&% „§QÁ0LQ1ÇQÚû-·ŸC»îõçºx§Žt䜺:¯¾éËÔ}“ž&Ý<÷ï¡Îγæõrù¾·Ÿ_WEUgru˜˜˜LLL:å0ó`1(ÄÀr˜JH&ó žS”˜˜u(Â` ‰lï>Ë6mÏN÷UÆž×Ò̶iÁèù—O<êó=<–ÑÖœZøçºµiï=üs›Ó§NNqÆK*¦re˜æbH& 0L ×31(& ‚` @:ä˜(& ‚PL&ÀL €&zÑÔiïÒËéFÿ/ÙÏU]ãÓ§U;8ËßÙe¾>ºæ"î©–œÛ}%wÓ}¸øÓÌä£~èfs×=s0 D˜˜ž¸&| „¡0L\‰„Ç|LÀL A0 @ „˜LH€ñbzÓ©dõ§Õ«¿9èóEvcë5óÇ^§›=çч­y4EuvõFª=+_Tèë²F^œãªŒµPŽSH@”L&g’b`%À&À&¹ „ÀL&13È&& €`L&Ä¡3˨뮺×Öê6úzlªÛäúõeÙãhÕB®¬æÜZü­&¾8çtfÛG^„¼öm^\Û“vmyþc\G(˜LL&:ä˜%ˆI`ë˜ €¢& 0’zæyLLJ ‰‚o‹m³›·]gWÙWÙôõE”»ïœ÷f¶Ž¬ã›³Û|ùWÝ~{szfãvk&Ì}{z<>´Sæ`¿çæ¹ä‰€ë”ÀJ € €%˜1×)€˜ €ÔDÇ| Ló2²;Óm¾÷£Óñwââ—zëÇlÖ«U¾6ÆMQ<]›ÒóZjï0êéSês—VMœø=¬¹ªÕ߯G™]žÚÎ(»Lj«¥‚jö<êµS޸ϫTY-žé³W™F~<þh¯”¡0&®A0L ‰€r € ×)€ „îf„À AÔ@:ç®I‰‰‰ïˆN‹:¿U—úõŸW›}ù³ñ·5vUeùpµkÅF¬V¶uÍs×ÜëòæÚwYWJ} ¾Ž[¬¾/nŒ:ÁOy¸:æ`ë“®@uÈ&®f(& ‰€uÊ` €uÉ10”L‡\¦޹˜”uÉ$LêæÝv]ß¡_§âúž^‹ü:1ë§ÄÛÜõ–™zW§ž‘w5ÝÍÚ|þ­êºìî8·?i£o«ãîÓe>WqáôÉÏ‚z扉‰DÂQ0LL @:ˆ˜˜˜L&&b`Á1ÔO.¹Lò& ‰„À˜JrL˜L»õqzT}“~ìš¼îé§lf¯nz)Õ×mViÃÕZÔz¹-ìë¨Ío:(­–ʹΫ|ïS&ŸoϦºkÇŽ¼¨9˜L&:ä:å0J €˜& €ë“®f&L:äwÌ ƒ®f&P˜˜LuÈëµmÝnÛjÕo¹Ãê[æuÅ™=:üÛ*»?Z¸Í~}ùÎá‹wtÇÓx”wÞ;gí×Ö©ÕM󟼚<ÜÊñs110&À&¹L„ÄÀ˜%0L¾``LÄu¹˜˜&:ä žS®ILÝdúÓêUÞ­8fÎS_4_9áÛŽ)êÞµjÉÌzXã6Ü~…=qçú×dî¦<v«òmòñÕfLUÌO3 ¹0LJ&&¹ÇQ¢`LrÁ10˜& (L:ä:äê &În³E¶zu:¯gèÝš¾n<éÉ~žkÏ]½Öë»æ›£…6MìÝÏ6E6믉«mIõwSO™VU5ÖE•Ô@LL˜žS„À € ‚P €`JÀ˜&& !(ÄÌA1(˜ê;®m‹¯·gõ:óƪ+ɦg¼· ñ_uÇSDÝÏVÑuÙÅÜäÕN[9¯u5ÕÝ—¶ä«ÔÓŽªkÁ8‰L#¨@L ‰‰„Á1(˜ë’`LuÈ€$޹˜™ˆLP(Jy˜—qÖ­­švxº¸Ûæ[¿wæšye¯Ž¨»E6uŸvMp¥¯&mþ_£U³Bèã÷è`Ù¯îù4çŒV~f;ŽDÇ| ß(`LLLL @¢`LÀI®DÀë‘10;àrL뀘ݟUñ~ÚñÝŽêy³¼•u“ªm³7}S4é‹1m…}÷Ÿ[Òñí£§Züøî;âî5ãÓÄúf¼yöù‘çNb0”&ÂPJßÏ L˜˜¹Ç\„Âa× `ëuÌÁ0&&&&s=G]W}š¯Ó²¸ˆ—›ìùº¯ñ÷s’ï/®-ç¸Õ“6w’{ã\,g²9Ãèçî«,‡ðÇaÏ3s×2똘:ä €ÄÌ!(<¥L O$À˜˜uÈLL ˜:æ`u0뙃®]]Ý÷w»[^l”uÒ½YïË^ž³s–í1wEÓmuuMÕÕÖnîŒÝwÝ=â¿.îtYe^‡³.n7áïËQOPuÌ:ä&uÌÀ& ‰‚P˜ €„À˜L ‚`LÁ10`L&a!×VÌéôtO\_M\õ×\ówèÍ ½ ¸îÜz9ºÎ)Ó«.ÌJ©ê.ãŒÚ3ú8= |çÝéeôóòÙâÓš»<øç˜Lñ)„Ì"a0<Ì €&˜ë” ˜˜˜LL% ŽøÀ` ޹:žbSÏ\Ì ‡\ºŽû»g\úæÓ‡4YƼš'œÚ(ç‹øz8­«¸Ý]:Ó‚wbÕ‹~ yè·šœõÖ]í®æŽ9ͧ?|ù¼gç<Äu0L& 1(&b& &:rP™å0`LL13Q0uÈ×=ð:†ªvµh²ëyÏ9úˆÙ›¾ªcô-œöóF¬ºÜÓèuEôwe[)¿6ÛÏŸ·>œìþ¥7UÞ~šðÆ7?ÄuOQÈê L žN¢a C®S<€˜˜L×3À `a10LLJC¾ìïMþ–=[pfÔÅwyî•—cŠ,ŸOŒ6Sªê£J}OŸôðhÏEù6猛rúxÍVˆ²ž¥‹œüÕž9ª¨‹8BDó×$Ä¢b` €ÀD`À&¹&LuÉ1×2A$&g]íë7ÙÅ]óŸÐó6sÎ_K_Ÿèfïw…î iÍ«›4]e8ô]ÕY#޽/.Z¼ÓNÜzyvdß–‹c5z|¼õÓÞy¯® :æP&&&\ºä˜& ƒ¨‡\“0뙂PDÀ®A0 € ‚PÂg” L'¾;¶Êöú]_ŽÍ˜âʹŽmº=<=߿ȕ÷‚T^³½zyÁªÎ5yÛ3WmYïÅužn‘FªbÝnG6^袷=r‚a0ÇPDÂ`&Â`ž¸LÀ˜s0ÄÀ”u0˜J\‚bÎe[mó¯¯B·9ñúQ’Ù¯ÔÃëÓéåžñF["n¯Ïöê¶½öS¦pèçf:nËæêÎ=L½ÛÞ[üÞîÏߟ]<Óߟe\òˆu”˜J%a0˜˜ €0 €L&& 0;æ ž@˜‡P뉔wÄÌ]~ž7s¶(ÓnK0÷NÛ#¬¾žèÙåÑëyLþº®´Y³Øñô]å÷³-ñý’i_“×òÛöbò7³]W™×Y<ëbž¸ª!`&Á0DLÀ& Ž¢Àb`˜˜`˜P ž¢'´ó¥uýæô}Ž|•õžãÇãÌŠ7ÓªŸ{Áª5ñV}ù8¯=•Wyc„¸NIG\ÌL& „¢P˜˜LIøÂP !0˜€L ‚D&:æf s$LëžùêfË;ÎÛG>›eQ£¾2Dõ]ÕèuÍ´÷—­¾v<éÝôš|ßgÇç_—îãÇe>G>6Œ{x˳¡O«ç:Õ›.\Óª¯>;Âæ”BQ(˜ÂPÀ” €ê!0˜L0L¡0€ „À ‚bP”I16ÅœÏÕ›yï­Ó¢yºªqzœñ—M—ÆÏ>¹å}7=ú½?_½ÝYÇ—îy³£å½¯—ãÉ£oŸ·…³¸³~+ðfׇ%¼_†ºèÑ’b"ë’ba(”uÊ`LL&œDÂ`ë”À˜ A0&Â`D L&˜&];™ž©Ð³LÙè]–/ª&ºmßEt]¶¯CÊ·üýGtû¾¾ŸJ˽† ùo_ŽkÇ£ærçªï;U>–íÛ^+jã5tjÉE™mÍnhˆï‰A3ÊaÜs.¸ ‰‚g™€&3”LJÀJ×2‡\Êg&&sdÄutqº¸×nªwÓÌúžf¾su‹Õãv]“›¿Ô§½¦­žÏ_M§Íó6âÁnÜfltQ—®x\³/¡W:sQ‚³WÍ<Å|uÉ(L% ‡|0Lò&À”òLgL&s1"&‰1Ó’`&‘"'E+¹qe½S¶Ëµùšôh¾ÌVqÄæÓ]”Wéd÷|¾ù®ruôŽÝ–ÏÐysMž7Tf×g‰7ϲúXsÝ¿#ÝŠ›#¿"S5óÔ˜˜ Bba3 ×3<Ìr”˜&&0˜$A0˜JÀ&&&tž.”6S¢lÙNê7×VÌý×v,>­ÔjãW(Ág:çèðïÛÕŸCâÝWéù~—™—>ß š¬ÉÖ=[ŽûèË›×ñ{æ¨ë/\]æÕe]G=ñ)ˆë”‚`˜˜&\’‚b`J0&À•‰‰€ Bb` ƒ¨ë¹t9³E–õ®ùn¶vùú°Û«¬íë̓Tu«dêªßcÑŸ+^H»Ï>Mþ—æcŒ·Sèù¸}/;Ø«-žw£æE6挗gœîyë“®f%‰‰„‘)äa0Âa×)ƒ®@Â`uÈLÂa0 „ÂQ0wÄ6ñÌÚ®þg­7:ÙÞžùÍêyÑ¡«ÈÙ‹W=nºÿ/ÒÝ\Û³>š½Hź|Ù»º{OXy«Èï~|UÝ–ˆç«¼î-É|þòQLÔG|&¢9J„À& ‚b`L &”‚c¾`P&$L¡‰‰”“ßq÷=óº«ìï×ÃÖ¦IîÿO$âµfœµõ«už†mš°lÑÇ©ãiòýMsãéŒvéçËÅÖ>{ÉõÇ|óƒN:³[Þ|Ó–xë”ÄÄÀ GQ &¹”Hž@ÇQ ‰DÂ`L®Ba0˜ @ë‘10Hv·‹e\mç\êã½^£«%zqw?AãsèèÏe·õêzÞN/r‹rìÍ¢2_Æ/cÃöp8Ñ_¼Ÿ6¾2z³äªÍéqÎÁÝ”«ÏZ<õJ&:ˆP0˜uÌÀ¡\‚b`&&×$Âzå:‚5÷o=ñ];sÝmödÕdmÆ¯ÒæªcÛó=‰o§m>=:}»rç×ëy6Çý,ÓO?=MÙwW‹Nz1ó}¢ú:Ë_9Êúäê ˜˜˜˜”L „ÀLs0˜0`%À‰€1×$¢bPÚêf]´qªÞm×NÏ;sØË~ >ž,^†œÕúÙt}uQàn²­ž^ÏWÆê‹¼Ï[Èô|ÿÈ÷<íþW«ÍÐñwæ¶rÎ:l>®èë¬VóMN]r&:å10˜LIL®StˆL$u̧™×)‡\‰€˜ë”Jb tu×uGz´gÓ³6ê6ù^ÕÕêêx+Ýžˆõóhߪ6qÏ_ݸùÇw§óþ­¸öF–öÕ’"ìýyû¼ì8ÇÕ¼gë=™óמx—"b%Á×#¨‡\ɘ ‰GQL 0 ‚PL&%ø˜ €L:æbeÈï‹jžù²;âlêû4oËÔ_ÅûwùÔߧκc^M3ô~GÒxþ½8·dçÒñõä¯ÝOZiÑe¸°z~fß;kÉï6G yöç£>Žb¼õFYŽm¤™„&y €Jc®]DL|L&aÓ™€`˜‘)äu˜˜˜ï‡Qrb;î;Õ_£çz¸u¬ô2íÐÍÂhÑÔ{6õß)³ÑÃ]¹.Ž|OfÌ[pJίÍež6‹‘ƒÏÑM¸8‰ÍFœýuÍTà²(„ &yÂ`LL¢bHr’ €`˜`& €”Âa0LL\Ì$&:GBÔ-·G4néu]ë¯ÒϱšÈ­èLÙèøž¯WlËèSƒ_ÅÍv¯>tÝýÿ:ü~n­9nó=LØéçŠÜáÝ—Ž³ÙM5ó\J#®zˆc¨DÄÀ˜1Ô@’:æ`& „À0ÊÂ`  „ÂbP¹‘Õ¼º˜ÑÎŒó¶Ýú™¬_1~k8·¿7Ñׯ«¶ùÚ/Ñ›W~ZúãvjêÕ§ÙïÀëÕò2d»g“m^^ÊjÕƒž¼ù¿4S£$çæ¾b`‰‹+Ló0% 1×"f ”À`˜”˜ G\¦<»á×.¹˜¢ê»‹-µ×}q>že¹××_Bü®Ž^·ŸîhφÿWŒY®Áèxº7ù¶ê¦ÝÖåó6x»ã}^EºrÕªÏ;Œ•uVš§=4uÇ¢c®fbc®dD¢bP$1( ‰‡\‚`˜ë˜LLIˆ˜ë’HJ&\¦Á0³ˆ&¢%=u[MZ­ÇèñEº³ßewÙÅ>ŽM³o{òmÛFìÍZ<ÝvÑmíÔÕ×—å]—ÕÝS‚Z¼k4yÜ&¾5ùñÏtæ—”OaÔDÀ˜1Ôð˜J&& ‰‰‡QL&&&:ä ‚a)ˆ:ˆ&”<Ì $ „Ç\ߎuz8øÒ¾Õ:ø«W¡£ÂчЉãѣѿe>‘«Ëõ*ÇçÏ£/­ÍWíÉ¿E^VŒÞ]ùÕNsÅë>6U 6Æ~ºïΚ܉‚a311$uÊPë’bb`˜L 0&¨Ba0”ë™0L&&"@O"aß0˜”ó1ßVógQu×¢Ÿc5z8êGÛôhñnô|;özôzÓlwîù¼yÓïõmz¼c>¯_çý?: ¿cäqõ«4ú>_<ÕÖ-™ê³ºs[TUO„C—\Ìó0Ræ`wÄ &b`&<€ €bP¹¹\(J@H˜˜‚g”ň¿›bØÓÎk{ô(¦Ú6êÇ­¢ê=~W~Žîý-Ó›MQf‹|½ž·»Áö–z´ÙNÎòzÜçõ3忚þƒ×ñ}Ú{çÐÃã}&=,Y­Û>n¿ªð=\y|ý˜|n9òž‡¯Ïϲ+橌ÖÕ©«šúæ A1×3Ä & „Ä  D‘(& €`&& €”täL0<ÌL˜‚bP˜‘=ÛÇZy¡e›hqÕù½6YoÛžíëjÓô~|·M ·/xª¿Ž;š³õOtYÍSP”& „Âa(:ä% ‡\ºr” „ÀLuÈðëJ&$‰‰!0˜uÌÁ$LÄ&]q36Y]ü[eÙz·¾½7VÈÝ}\7ã«›öù:õhçˆïM9iôhÓŸ¡ÖôM9éçg~ ºpè«Íõü÷twE™¦«9çŽeøuȘ”% ‰€LòÝ` ‰„ && € 0˜\‚a(uÈs(˜ !ÜLwßk:ãM•_Mü[n{}\¦^½\´ÆÏ>W'yɲ^G½åzõÑUy½.(»Ž"Vå·Ë³žwøMÙ4sG ýÅr级®f"bH( ‡P@&& (’&¡10˜”Á$ ‰‰„Á×!(ð& „Á(OsÚÕ×ÇY¶WMÖjæÛ{Û¢œ–ù>•;hëªlŸ?½Rô|-9íÙF¯!«œ{~mŽlÃÎb®ëkÇMø¬Éu3ÌLs1ßó10 3ÊQ1$0 „Â{¬s×)‰DÁ0 ƒ§2„ˆ˜ÀuÊQ11=u]Ñ:¸ï[6ççE¼z6ÝèEtó^ü=ø¶eÑU§+òqÖÊ9ÃzÙzϯ.F+ûã‰ç6ÌÑÏ5qßÙ_\ô‰á6×Ê]Dó1¢f"b`&b&¹”L<¦bb`˜DL „Àë”Ï3 ޹s10˜ ƒ¸ˆI)›/&ä[}¸¯ôòG¦×wz¾tûžFü>{Nº/êhÍ¢Ö}¸h×W5[£Šz§˜bh̳,M[¼½Å¸•µÂlâUt‰åÔDÄÇ\ºäDÄ& D ƒ¨ž@ €&y0J&b`&’Ï)D¢SÉß'\÷¢/²žïœ—ÆîÊ=-;|ú:ËNßö¼ûj¿.ì;xÓžšoÓMñÎ\º®³¥Šï+MTwåuóFì¹íŽ#˜âxîk‰êx‹+ˆ™ê'žêuÌÀéȘ˜˜˜ë’P0 @LòwĘ:äL:äL ‰'™—3ÄÁ×)Gi•ñ~¼º³wÝÛ9›ºô} bvæÃÄчÌ>Ï—ô>¥‡ÿ:Ílóts“»fÕ3‹=]ã³¹ç¬z+®hŽ\-ªo¢ÚzYs<]O|LÏ0ƒ¾`0À& @`& €LLÄ&:ˆbbDLa30”Gq6]e»‹ùÒO¯ålÙ»nÏßGÅÑ‹Ïz¾T]ä}N¸¯Ôȯ]sg8=:¸ï5}óÇ4ÕÖnªÝV+òõÏšì®¹º™YÄ9wÄLÂy޹JuÁ ˜ë%€˜&˜L×=rLL0˜ê!Ô'—SÄÁÔóšèÝãúÞ]¾žìò½/NÃ6Œ±¿©Dy5f»?5‘Þ8Ñ–Ê•÷MzêæzŽeÎŒ¶ógºâxîUÏ2˜%0s00&§ž¹éÈ&yLwÄ‘0Jb&&aºä‰Ž¹™„u6óÎûk¾›ù³V[jô¹ö³kö«â®ž[ºÍ:ñîÑ5ÆìÚ8áæí«Mýfô>oOŸW¥çUÆi³6޲ußqŠ;®«;LSe|è¢Î³wצޏšºˆë”s<Ê&0„Á0˜&®e1(LLuȘ% ‰‰‰DÄ '¨ç¨˜žù޹¶›õÄõe7[^ì×Õ¯¾8·nK½ ºöü»óõwTwçzÜÆ{ó׳Óð.ëÕò5±æêÖKí§ÆôñaçMÇ©£©YÞ ž¥^¬;ü]5úY)Ó^w6¯/ÑÇ›iŠ&;Ã_¡ŽÌgÙçõËžîçζêºådÓ=×ÖŒÕßô²‹;wZÚëŽ#ªû­ß1‰#®e ‚Q0&0‚c®e @LL%‰‡DIÍ‘É(²sÄßuu1Åù´J­5ê§¾µSw0º¯WÉÕFÿFŒ[ñ—g]åçè²{«»‹gzk§Îõ|Žº«œ:kEQu5OSeqO(õß<]Ö{¹†ºóØ»›k¢)»šºê²å0% „¢Q0 €:ç®C®RŽ¢$ë‡\‰žf ‰Ž¹˜wÏ}U=BzºÕ f+º®{‹)ÕK‹9«ÔâtÝŸ­SƩק›q{Yió}\s¯=~Ÿ_­ãïõ<Üñw1÷çY–º¬âì÷äE;ñ;ï,YE™¯‹éãW4Fºl®»zÉ®­œÍ3d3ßÇ9Î:ªêù‰žP”uÔ@LrL˜”&$„Ï2‰„º:q1wßÍ’—=×Õwúk꘳6Ì¥ø»ÕÅV9âþªÝNmÕúØÚª·ª7×–ìÖå®9Ív>&i8˜˜’À˜ÄÀ”&yLLîf{+³›è¾Žã©çž¯§®æ:ϦUªëŽ®Ílq·º9ç~VŽëë¨8׳=Ö,»}TêŹ4uØÇ]š;Ç’îü¸±äéóõS£+Ò£CœÚr¨±Æ‰gïxænâÚíWÚug×êù·èš´áÕæÝž;¯ÌUWÞ~g™­@˜%ÄÁ0ë޹`L:åÕ‘Wtï5²¯¸í=*kÁ·•üQU¼ñlõ(ªíÜU£5ü÷v}¹lïÔ¢xß·Ì¿$m¶{§¼ú=œô㾞±qGx½?¼ónZµu‹®­Íf]˜gUS1®Š­ž«ë¶¼ÝìYÓ‹.KÇßO>·—Þte»?qWTÌA0&§$L:ä”L;àLLˆunøë®âÊ­®ì÷Õۺ皶G×\]Í\M[¸WÆË3ÝM“¿.ª0n×›Gvi«M6æôð{3×Í~Žwyþ¦Jg[±ñçzîóíÙçz9lŠSv³W.ú§¾¹ê«ûæ,âþøÕeQìwæìïnN½qÏ“ß9´×äh³Ê›)ÍWp‚`&$‰@b` ”&bP„ÇQÓ®£®ªêÞyêl®gµ×Ó¡]•Í:#E1ÕVG†JlöÑT[Îü…i¶]íÓN~÷寋= š*ÙnïÏÞŸ,ÇCR)ãg5]ƒ_9­Çmv³o¦Î4ÕOqßyôÙêê»y§Ø³§—W‘¢›{·ÓŠü™8ª©ž*€À0LuȘ&î]s0ì‰ê'®â\_[©æ½§§twÌL´f¾®íÍd×Ý÷]ÝQgVhÏè`»‹­š6ó«‹ûÓ.Ë~Š4ôâÚûߎ­~>¿#ÒËEY;ë¼´XZ£DõŸo›Ö{+î9ÓV{êëuz9˜Ó¶º½ ëÌô17sß«>Þ{§»±yO›Õ™ú«ˆ10˜uë’b`&%("ÈâbPžº¯¸îÞo¢ååæÞ«³¬wt­o7ÒŠìž8º»:«E]ÕÎüWf¶Úµgï}5Ë?§¿Âõòû.ô2]UÙý7^lÞŽ½X#Îô1ÝŠï'UÙûÁwTgë‹4u“9½>11éáEÜêÇgsÝÔúYmzðû^nÊý ¬qס]Õ[ÍôóNìºü.|ë0SlÓTóÞ"Û£.›qlçM;žŸqÞRˆ”ãú ØúÍéy¾¯‰³ÝG™Mµ÷ŸN\ÓÞŽ°Ùéy½h¡ŠÞ:ÑTuΊ7çô2z–øþ«Îøªõ³{¾Mþ~¿SÀßÕÕlò4dõü™ÍÇ™Ÿ¾xqLó1ÔÈLÀ˜”L& ×2‰³‰·‹«:ÕÅv®ço›ÝF{øŠø¾˜êzê»*¾»ò×ßvs+³tK™×Íñ›¨Õ›ØÃÖíµh¶†ÌQšÿWŽc›0úž}ßMUóÄy¼ïÍF¯?ÖóìiÍ7SZ›k×e<óÕ{"ìž–?O]z1ÕÝ‘WŸ³E}QÖÊiÝjšºÑãé®:¬kº¢”G.ø &&¢®f:æîn盋l­ušªæÊà×n>ìŠ;ç›c?SoyºfÙèë,uÜÛ½ º¸·8} 0ú‹k»ÑŸ?^н,—`Ú£¯WÆÓo‘O­‡ Z3N+¸£Ž¸žº³•üUFÌZqñÅúñßÖ~=j¢}ì]ç¾Êé·o:U_Ti²ª½ |ý3–½tU8xâšû㊜ĹL`˜Á10‘GhæÙê.ê¾í»¨ÑÕÙuFNx‹*uM¼+ªè¦n«›;³4sÍ»°ó7ç‹´Ñë¶&¾tY¢¾„Cv=×hñ­£®½'ÝËf|ÚóyÝgªÜs«YÅ\è«­s_VÉu]Æ…Vw}.®.ç~LZøî‹³gÛ—½žnŽ5åÓÖ/kÉëìWyÜSË>ú3Ds ‰& J;âbbN¸ë—ILñ²¦‹¸ÕÇktG·Fî™Áì`-Üßç[ÌO*£^k/Ï×qÜóÄh¦îé×—»yѧ9= t÷§ªm¿N.öäÙáz¸g½x)ÕçÑwsÏ8¦zÏÛUtO«‚tlðõgï+½–wEžŸlÕêù»=/ÈæÚ¸î9»Œ…¼ñ¦qäöÿ3U=u«;vʽj©õòè®ÙÝ“êlù¯§ñxã­\`ó;ŒÑÍ/?MuÅHj¶û°ç¶½µsOg'¥8¶ÙFÇ¥ƒuL–yž‡èQ~¬^Mºòs}SÏ=妾3÷\õŽÇ÷ÄJÀ3˨0˜Á×!3×+\ëϦé›yëÔç_¡G§N[yï?™Î½~=çÁ}]:ÏTÑ« œ-²™ê*ßšî±èÓŸºtÙUíW÷®7hÛéù­Ïîõãh׫ŷ_Íõ“º¼Ý÷y:1êÇ9³úmötã§7O‘סŸBû³[EùìÙÙm¸:ãesÔuÖŽ¨ãÓðý,7WOj¨ÍE‘ŨÃÏ=Õ稀"ÂbP”%q3+;ï‰ÝÍ»×ï«ÔÑ^Üu×Õ´îÓåzÔWªÏû< Ud»œÙò.«%y­ÓÛ«zÇÍ[jÏ£‹Üh¿›òeÝÞ¯;×õ<_FŸ:»óìœoÅÆº,Íg=hò½#F«5:qEµðç™ä&À&r˜uIqݺéloÑèó~m~•þŸé`Ãí|ï^†^|‹qëë5:«®«²ßšž(¯f+¸”ñ×:î¢Ú{^~‹®«M”ìãÒÙwY·^]yvù~ÞÜ]âŒyüW-JòÄõ«ËßäL[çÙe½îñµ×e}Ù³ú÷‡Ô¯7vú~¥_ñ—Fjí[Í–S^KÉãNJªQ¬ËuWå㪹æ„¢`&y˜ê"ba$JÞfÎ4Wjúý>µkb=~1dú\l®¬]8wàÙ‹nocËŒôõU\ÅÞ^Ï;®m¯Fœõéæï>øô±ÌÆŽ]ÑÑ^ÈßÕÛóâô¢vüǯTü§Uc›hÅ]yf)ÝÝæû8nÃ}Ê&qú\ÝFFOFsuêjž¶Ïy#†k{ÇÖüš|ÏKo“fëOy:ÍŽÌqß*ë(꾉B`$‰A(˜J¹ë—Rç»;©§­6NßZÝÚü?{±›‹pèÉ‹FIô|=Ù,YÖ;5d®›0ÆM”Nn6dºÌó¶Ž4Å”S=ŸŸöcÔñøô7fºþ=(Ûêá׎}_Ðñ=ïÔÃÆ‹¯x´ú´ÛŸÑÕx£ºç˜ïšôW;<ýìÝg§½5Q®Íµìºy¯Ñ£6¿+GÍô7sŽ«³ÛÖz,·ÈÛæÎ.ugêªxž"Žù„ €˜ê ëžù#¾ß=uYuÖäô=^;5Q;çËóþ‡Ëæ¼zcÏôžN¸ºônòíÉÇx»§O™êâ˧œ{ø¶uy·l/ÒË|ë¾¼ûâδug­ÖþñzO£äÙçl£‹ütyÞ·ÎÝv/KÎÑ«7»TSéäËÚrE6[Ïëf¿-œ_E»qmz5yÚòßš»zïw—²Î¨É}‹m=àâs×W6y±·&ÿ;®y㞢yu&&% „Âc®z•±Õ:¹¾ÚìÙVÏjgFMÖjÉ×›éãbן¨¿~^í«Îß—6Œ±^mfÕÎ~yj³º¼ÏO½ž/§Fì÷ßâûÌìÕÆl}ú~'£äzu÷V8âÙó½¯2ë3ÅqEüѦ¾4ת}ÏKÏÛoÍýlù=*¹®Ï>ý[¼Ìž¦*¸òíã$ÒŽ™öSŸªf9‡$ÀLîRA×2#¸ë«këGk»®~‡ÍÛèúU×^®3dÙNoWÈÍvÎp{ž-Ú;«­YòW=÷—Eþf]´ióy¿/«êõüë=Ï:­ õUn¼4ÎÝqëfݯ~Kî›4`ÏE¹öxcÈ·>9ëVK³U>µ4Ï—ñ§ÉçÐÇèçç¬ñº¢øêÛ)žûïw©šŽ»ïº*Óø»{ɲ{çˆÃèx÷äÉFŒ¶3M´uMwÓ¹ë‚`À&P'žådß6q~{´oš7ÅÏ5Ê~^«óÑ£ üwÖ¸«M±äú4uæj¦:£Ò¢>VÖ NuÕ~]ºqi£]x=U±w£±=ê»ÌÛìêË'¹-??ëhó|{kówQ‹^|¶çõ¼ÊwW~~#&ï7°î¯6JyÕ’èåè3Îý/7è²åÓ~vgÙçz»Í›~}vÛŠ+Á®3óoYìéMz1uÊkïˆA(J$C¨E+¶&Ë9²êû›ûÝÜÝíx5l»%]Se:¼ßW->ç«bÌ·èÃÓ¡ãoæÚó]zóÝEœÏ:¯œž½ytÑtS5ïÁ¿m~_¥«FÕ¿5ô?³&ï ìŒÜgçeŠ×¡äjô~vë)ßžÜõoñ´hÁ‡O|ULëÅÞ}=w»ÎôtÛÇ¡³Ä×G]z<ùW÷Ç—ëx¶ìÏ£¿1Vi¦Ì×ãÕE¹Æxrç®`¨DÁ0'®HíX¾Ž´óNº¯ÓFéôüÏ_œ{°oÍ~[{É}xoÛ›gú”Ûm›|Êó8³vS4÷çeÑ¢½ó“¹Ùm|j«-.¦ »ûÝéºÑ“Oµ“¯åÅ~Ïæ¹ËTùØï¾Ž1ï]x›^ž-ñê¹›-Xíˆãª5ÑÜÛçúÙ¯§Fªnϳ^/cÓ¶þ<Ë(çwæÝæwGŸnNs_ŠÍm·|*ë™â€ „ÀQ#¾fÎ-³‹8²jÚ›cE´úϧçêÏÕ¼ùÞ–)êúiߪ®7g‰ËãìæjžûÕå{X©ÑR7aô0ÙÎÚ=úñß‹ Ï£WŸ«o—¥¦ŸB9úŸ®ê¾)êü;pyˆ§W“O¡†ìt[͸ý/Néï-ñ‡žüž'†{ôÑMÖgÓM:îâ¿S?^Ï•¾¾­®Ì¼mÃÖ©®2j⋼ÌÜQe\uÍ”_ÌW5©"#®@¹L:ä ‚eÓN{,ãGtjw¯ÊÓ7ñèìç[v÷« Éî¬^ޝ:ÿKˆï3-6øEÝåôºæ´wŸ/¯Šuz_?é;».{,Ï«¼Ôm¶¹vzõëŠ=Y÷üŒfÞ÷zþÈõ¯ÆßäèŽrß—Wm½ñ7ouÇ›¯Š³[‚•™kô0÷v~ç®ú-Éîù>þ?WËßÜEwø—iÇ¿ÎËêlÅU9s]’«³Mô*îjï‹2YÏp€110Ä’êbcG=]ÍZ,ª½÷Õ_¥§Ø,ºÌ~Î~;¢ËüíþVÎ8ß»?¡åmóùçÏó¸Í²]{9é³mzpîÁÞ¾)êìþ¿ßMþ¾*vu’éæÝ]Qõ˜½;©Ó’~£á÷ó—Ïßåù›22]’ͬœüuÅÞ†owŒžnÖF —b㛨÷T[m:9¶ëûѯÊô"ø§4EunKseœ³Š8æÎzŽóõVŠù®êy+ë(”ê žÝóß7ñßõM«(ÕÖ¯N¬~¾¼zwùºpåÛè`ÅêÕ:õkϲ6çÏÖ#Š­Ïom9m‹lêÜzõÕO;­¦˜ÕäYM{¯ó;ßçûVdÝæýÒëÓ®ž} òTô>zsõšœSíx:1FCʾ½{kº­^?­^Ïœ¿=4õUµ]Læ·NXÉtÝgz)ãÓ³­y}L•ù·z~m\ÝÞœ9tõåߎ›3G 9â½<Äu_yz˜ã˜‰„Ï)‰‰™ëž¦ùt®úâ6p×dië?¿Gt߇¯Î:ô­Áw™îáô3íó·ùï FLQ~/C-›+¾Í(ß›M}Q¿Ÿ#tùv×ÕœéͧÏúŸ#gUìçèûÏ¿† æÚuãó£?g™§Ì§Ô󺊢͕n‹¦ì[ðâãO›žlŒu‡TÑÎÞ2]Çz"ê­«ÖË]Þ†lþ—lUhç¼¾­UÑfªæ"jm뺧§5òŽ‘1×2éuwGQ¢9‹³uÖ›-ºvãÛ²#»ëÕóžî/oÊßóÿIDã·f= Eââ½xÓ*µæöê¶Ê}j*Óƒéñc»ÆÙg‘èyš»·-ù½£š*Õéû5=;£èx^¥]Þ/µäÆ*kîÊ'Œ—[çŸßS¿Ìç/X/ïÍÏ®Ï>Ê.³:ê²,îŽêãÚò}+hÔãN;= 3]V=z•ñOQE´P²Êë¿'6s=××.k瀮f& „‘ß3oÝüóm¬úb®ïé]zµÛ£'³žî'_ëàÔ¢^_±~lÛµyù{¯ÏÇVÌQ=lóôñ¦x¯G§n­ì£ŸÍ]ßâúÓ>g¡Ì4Õ¯ÊÕô}[}3ÙÅ^Ï#eZ¼lÞÓóàìÁ£¼½T®îñÛèæÅ7骊¢<ë£V;±h̘Ï×lœšê£×ËÞ¬ÖÝäú|½ø÷¨æìÜêçËWe¹×Ï\J"-¢«¨î¸LòLLˆ²;îzUwyûºzáÆ›5Í>…ø};÷ùZyY¯Î¿Óñ÷óMõu5íò(Œ|Äbž4WÆž#Fœ:ô_éS»Î¿Õós߃ØÇÆ%þf›*ÏéhͲ7ø×Ý¿ÙÃîÓw•ÍZóù?IáÕŽ­¼Uå]uøè×eþN¬Ñlyþ…»ã.º5Sn|ñŸv;+ï´šèæÚãýáл6ÞišõeÑ–¾øÇv ³iª&µ±Çg©ƒ?-ù}œ«}e¾Ž4ÓeÜãÓèùþî*º®}¿>ÿGµO]åÅG­>|z÷Ìq—NÊ)Ž~—ç~Ðó¨³Òðý-¹ñèò½Lõ[}•Y‚ì÷s4s£6¿+^=q£Äôéeª«rõÇ|wªQoè羺ù¿6[Nìuëë`×çU~^ëªþ{ž«á\YW}S4g‘1"zîetSjlËw<´k¦ÝˆÝ5õn­x4z™1z×ø7é퟊|íÕbê¼ÜÑ¢U“V>^ݳ^Ï3Òϯ%û±÷¿'¡TëÅçÙ»ž°èõù»‹§GWÕtÍe^tzÔSÖ¾;Íì×ónÉçñvŸ2™ã%¹¬Ùæf»Öñç­ÖW“œžž2ÝÅWÕ¢‰âîë³Ìö0ó³Ï×Êmê"rëô(c£M~uÕÌçÕS¨Ž,î­곞+:䳈&óÕ•w®–™ª.¦TOVY<ïN5hçž¶YmYý°ëŸS&N1íÓäcõŽmÏC«ëÃ|bô3Yw«f\öäö5]ÏŸèNz°a›óyzqqŽÙ®ˆ¿¼Óéùî¯çw›]˜õ`ÏlWŸOJû·Š¦åsšÇQ³%ÜîÂô²å݆êyÑ“?|÷ÅVÓoUÇ æ;©P „ÂVBåÔ[ÏUèÍ«ˆŽx¿-šônÍêæÍ¥®‹³mÕäz;hÁW¯­>¿:ï;G“»štrÙ}}W³F lœº¨Ûn^ý.&î²ìÑ>O¯o7úÜàч^\ž¶h§ÈÕ^ŸŸsèí®Ë0_àÕëüíTz'ÇÇ®š¬£lák_’b9¿=qó×Y±ú5èªênÏu\w·Îêjî.›g®¸›2#ÐòøÃ£˜ê:¥Óº¯ÏÔÕ×e%ÂS<¬¶Ê¯æ¾û­Æœö÷Fšïé¾~¦IâÿC‡è`³Ð)ç¨Ï¢Š°[Côu“ºõÝ—¯W7¡Lêó6EvSÝžçég×»ÇÓ²¿7{íëߟœ·›}¾~úxç˜5i¾ÿJÏwæuwäùœaŒØ§ÎÝdd§=}júŽê×9¬ÃënÓVcÏÝ–þºÓÎwÝ›9»§O6W}ÝÒÙ‹u^Vúðô«F.¢ü·seÙKUY#8×)@—p‹l‹4fE¼M:ÊfÎíÏÕû:دn-™öe¶»ú¯Ò«Íö,ñµäë1NšóõºŽ°z˜lÑfß3ÑÍ£']ßÔñ½OBœ›¸Ó›|Ŷk³~¼ý°e±|áôïñ4Ù’Ûk§î<¯GÎÑf_ñu×åyþ·Oy}lY:»ž5y½ÛÝZ,ó¶s¡æMY·á®Î4L׳ Z3ßß4MÔM·Û›Tc²ÜšiÉ*5U_ê¢ä×vmYl‰«0®f»å×õgqÞ{{â芧ž¯ªîèÝF×?AæÙ£7§E½fÑÍwÕ}š|Ú<ý6`§fJóh³ªsó½f|uÝ]1ñtlÅëdÙ~ʯòúÉêY³©ôþ~ìWÕ›ÊÝëe¢i¿ÜùŸwÍò7E¾æÿ7^o?åýÉæü[<ÏcÏïW‘ÍSëùÔWuº¼ÝÖóæn¯G—£¬½gÕDO(_Dqvx¾j³vhïBœúhâ;ªÌÔÛOÙÏ\\£º¯®¶`ˆ&:æÎlé~}=E6sßY=:i³<õèùþ绺ë»8²Ì³¢rìŦ̺²ñ·ÌËs=Þ}ºpÝU›rWw¢¿=ú|Ý4s¿'+½Ïngnò3ûÔ{Ç©ëx+§Ãõ{Õw™ëíùϤ£Ë¯/¶Ý95ãÏæy~^=]Îmjzóºm·Ï§\Yb:˿΋8¢¬û*ºüs~ &;ï¬Z—yž†-©‹­ë/yöS—ˆžjëžó[ÓÒsßšÜÀ @˜uÏVwÅ–Ug yçµÙÛ°mÏÖŽ»¯Ðç^IÝ—{>7Ýòµ2-º¼“§;âüzòÕŸUÝ×Í÷]uWÙMdêÝY¯Ö·OtâôpmËìæõ»ëÒò~‹À±^ìεàˆï=¾_ÐÏ‹uÿ?Ÿ7ËM^tìñîÏf)²/ç.‡s_v׋fn1kæŽã^k1z4Ó<óg¡æ»Žœ]§>‡nÕÆk<íW6×Ešs]›«+Ñ•w€<“ žê»˜×Ï=Y\qltêjïª5sÍÛ¬u³,îÉßz2DÆÌUúaô<êõ(º¾lǧÏÙÅ;<ë÷ãÓo^†[²Ó|sO~½6.ëeYc¯'è1úwXú?=Þ{4zúœUYýÿ›²Œ_Có›ü|¶ÿ*Ÿ.ïKÆúfjãŒãÕšË)ÙvLûÕU«šèPªþl¢vaã]9í롟˜˜ÕÝÕë®(³œVuš8qw.Ën^ôÓÏ<ÐJ¢R‹x»©®ú 3žË8¦ËmÍ®6aëm“¦jªÛUi­NK~;ߎmͦ¨Ñæïñ6wÏ)âÿC¨Éîy6lÏž:æÝw¥‚+_½äøåñ2íñùÛ—U¸-玦pçÝŠžøÝ=ß–qEÔ÷Õ˜c«soâŒÓÆšîÁoS]¼zÓÝ2^늳]G]O.§‰ÍÞœöáJß=ÇW÷žÞVsÔSmõÏE_ŸTߣvMþFÙVέ¯?1ÇQE7÷²º¹ÓÕ§ËÓtáÝÏWñÎË%_1ÒÃè[›Ò³vncËöú³%ÖêZ­Ç»ídÁö¾¹ó>Ï>MØ~«ä¼þã‹nžW«âk×lÁ±LqÖz4êUøÚl¢½9úÛçOz)ÏÇuY¯ËºÌ¶S4ÝÞº¸X¶½94U}uOt°jŒösÖ{ì®´ñj»ÍrLuÝ]_ÄÍœwßi­Ïk‘ÄkËmº2ûYnׇ?¡š} òlaÔî¼ViŒýófЬ»N'?¢¦íœùþ®k¬®9¯Ðå9þ“̾߇èf¶­^›í{¾_ õh«èp{ž~Ž2}§ÌÓ£çç^zü]¸jò,ó>·æ®³ËëÓã%wÕóþ–oCÎÓG«Ži¹z~L_–&Û<ŸF¬ýÄS²¥±_=ómÜiëª,ÏÍøîë7tÍ]©‹+DÇQ<õˆ˜”uewsÇZ«uÍÙû[1ÍvM³Üw÷§¾7ùu[yz¦Îbº×u9ë²= .Ó’4u›ÑÎï­•z×ãúfÈï­þ.ïOÏÛe~–¾·ƒ«Ñ·<[ëÙ~Ow££ÙÃw›ÞÚéòìÍ‹?ÎîãÇô:É_âteõsù1Sª¶aôkˆrâü]òÓ’ÕÙ*ꞯïu_¦œÛzÍ·õMؽm盳M˜¸×ƒG9®îêò×Ͷfío8@.¸žìŽ5sÊzLóßUq§™ž»Ž&û&«#×ÅÜM¾>Êf»9OtÅüUÚ{hçºmš#«:Íg=[§FKÖU¯Ê׫ŒþŽ/kœ½óèQF”mÑ4íô²íõ0gß“Òy·]ƒÓÅãl§çêÏôŸ'£-ÔUª¬]FzìÁÎÚ"˦ÿ/Vœyô8Ó’êêÍ¿/:)¦ü;j£©®uSÛµÙ¶qÕ,šîëšêêªx£E=Õm +Ì&Óe},†Þ)sƘã®o¯6ž¢[úÝæzfÞ©œÚtyöW¼ÿS/¯—>o[Ÿk‡ÐyÔ룭åéÍô·xT`Ýâkòðä¿Îæ¸ýk<«*ÆŠuy}[óíÇv>µãç~>÷áçŠleªþ&ª´s›U“›­XûŠ5zÞv˜²š¸Ñoe}f]–Ú:êʸê¾'¬À "]×c¾Î꿪W×.è¾ÖYÓWúºüzuaÙçú™xëº2ëÁlwÇWY•f{{²ÎóuN¬~Ç‘ïù|z8¸Ó9= ÷TÑäww6Lãõ/ÍêßW§çmÆãv‰ú/˜öïNÊ1[éøž×‘e9bŽü©ñ7Ò»>ÿ;Îôóñ–ØóµbM9/猺)®êmçlUÅùts‚êîóá~-­Íºžéì¿M‘šüWÒÙNUu]‰ßqÍÝ"žëÎ:ˆuõÞŠÝåîÙêž¹ÑÌ×}+âÞ,¶¿C<ëÃFÑÎn3õ×WçæÊìÑżw–ûòz>o±åkçggÔysÕ]óOs¶«rìÉ£ø=^=,_ϧ§ÏÓV­^VßWWêÙo“¯G•çúyh£Ò£Î§ŸÞòm»=>nÌ—Ñß.wá×ÅõÙQ»ËÛï«FŒk3s_^vÚ1úuçÓMÜó5õUÕYm›¹«n:f»è‹jɦ•\¹ïºgªtd¨Ltž¬X‰ê«*ÓG]õuW5ꉺÖ;ËèàÕgŸ³ÌÝÕFGN “O<ìÑçèÏ«-ž…3~_N¬žƒŠìëVk«ªcnjuSÝZ³]èìâȲ4cõzý,þ§™ìùš2ú×âùüÕû~Þ<®;Œ—uÎ>2ã».Üüß]:1]–͘wUŽÊ¶Ym=/6Î5ãÕãuÕÙg™í9îYÝ=g»eN¹ß†è¿?d«ºèêÎ;‹è²º¢ÀN»‹Í´]qgQÝ}ÛÏwÕcŽöÓÕÚ¼û(ôðDÏCOŸ¦-¦n¿]ñ»¢Ti˯LNh²‹4#Ï×mùùÝŸÏô3Ìó»®©õf®uǵÍ>W×x>¿:0û¾}=zUxöß—ÌÝ— [¨·Âô¢Œ›<ޏ³º¹³ÐÍEœç¿']ç¶ÜÜlçmtïÉ›F)Ï›½ÞwóFšøÑ÷ÔsÅ´ú±ú~T]RìôÕ5s²šëªþ:ê˜×ç …:˜¶&βõaÜ_Tg·^}4÷fŽ£%Úùï†IÛV¬üêªzçÊêÉÍÝYôE}G=ÛU>ž 4åÛ}ÜQÔ诊ºîxe_»(æmï\×Xba+æ.ï?s=g»™î¾7UÍÖYz8®ÕWWâ«ÐëVLÓ^ì¼âÛO¡Š3iÍß¡g«µÆŒš¶äÕfºã®rÛ¶Îg¡‹ÔÁVÏ.í3zuÙýì]úyuѲÏNÜ®óÆ¿è³çòoïÏ7dg?EzüÚmô²ê®ˆÑž™îk¿µÍüY]ZíÏùý[çu£5½óÕ³¼3Ï(·»©Ó]Êø~š¢5S~~lš§ºó ’zÕÅ7s3f{;玗ÔîÚ×s³Ž¬¢ê4iÇfŠ4`ç¯ÐÏm7fÛÎn=õê¢ÈÓÆ«.ÏÖ+u昧GóîϞηy6MšiÕŸ‰ô©É»'¥Ð¿]Z}9ù¿¡Áªž®ÉUþ}8òëꌸv÷ÝT[Æ~6çï.ï?^ŒøtguTÝ~~"þ5QN˜Í—·tf³ª­æ®kÑÝ“_‹qú4eõüíõw’ìuYM3ŽQ~;-çŒÀláÔ×§ªtwšî©ëžø¶‰ºè«LFþj®È¶èîŒÙùﮔߞÜÚ³hž#ª´sv>®ÙNë'U8}o'N{§ ÈÑ¢iÝ84uN z|™º'¾6Sìb×ê÷:ñÆê}ožÑ—åcÉìøóS&œÞ4wÏ<Û–ÙÏn'x}*{œvuU›¹­·.Ï+ª,ÍeöŠ#Uqª»;mÅeV]NÚ(×Ï|ñÇ5ÓgŸ«™»$Ùmx€’Ž´8Õ•×=uV¼šs÷ÕZxîÉ·žnÛ×hËo³wžjî9(Ù—LW»Eoò÷W¢yÙÙégº^|]–¾³º³¥ñ½žùç̹~ß3^K/»oö96naöpçñ¾ƒ6ÌžDßåñ·.<ºóéŠ*¯U‘NŒ}Û=fŪÏ?º¶×“G{pºN,^ÇÖ:´å×–l£ŽïâlŽ9îÞc¬Ú4¿A’qõn\Ýñy–ÔEJ@<˸[}U[Æš-&Î,Í­n;ºæÛûÑæziŠ#OYTdÓfyæg«³3j£~+z¿ÏÙVìÑìÓéÙ£ÄïÖñé¾¼mœ–=Xú®në¯?Š}šüÝÝÅ‘»]‡«];üo[ÂÑ4³Ncæ±è³_Fên7ÕæÚúÏ4Qc›(»Uñ¶m²êªãªt±,Êâkǧ6èͯ?6O_4Ýס®š®œÓ6ä·4QÝ•ÑlY„u3=:ôÙ“ž®Ž¡ÇQ=h禊5ÝY«'x}«ëÍÑ]V×›BÙÏÒ¾´UÍ–WÓFœþ‡¥D`·¦Œ¶ä®ùσ٣ÐÅW³f/G¬x}.p]o—¢ËùÝ£ÕÁ«\õÞ}eó=nkÁWøê2Y‘dkêÌýhÏÞ=£¹ÅuTØÑänÕ4÷¶ª¢)ºº®óoæü™­(ÓÓ6¹§µ]Í7êÅéDOsÅUÙ9z¯•¬Ñg6јØêz‹S_|YŹn±Õºæ'Ñ«¬Ú;s¦¨ÑÞ,Û+¢"Ü"üš1è癫ÛÏ 9ïeoVªo‹:®œÖczXu÷çl¶:ÔUsÝN¼:+³Wv[·'^ÅváôjÙ–š?±Šý4[¦ŽiÉ·©³7>¦7è=l¾–Œôìóìßä³iñüÝ·ÑO|eëw‹èÄõ×Y°¬Ééy]éóý?>nŠ}3Nm:|ÿCÏѧ›‹s[›Oѳ4³õu}Wè`çlµ_E˜-˲¬–uÇtqL]ˆ—]:ë™ï›:­Ï\[w7gžm²ÛbɣХƌ–Ö§wŸÖj´W¿›UZ5dŽêÕŸ«²Ù¶½]O>·‘¹£~ 㮼ÏKɾ46eÛ–Û;ÍÓnj´¨“«7Ð|ç­>Ÿ>ÊË“êyä-£=ú(¯%¯B©ëÎÅ:ñéóöצ{QnntUÍÜW³Š'š+¶2õu<÷—N_B«)Ñš.ã¬{²ßÖÌš¬®+𻦛1]]µÌ]šÙÀ—VY3ŵ×}ÕÝw÷¿ŸÏ}f®òžoª¼€ Ž»¶¾¢.‰ÑMvXÉ«¼ÚxÓ‹m~‡÷îâ,óû¿œÑU¶*Ž-曜uv?G6º2içM÷w6U³/|]NŠoÜóôgÑ]ÞU¼Y_zøÏ§š=óWqªÜ6ߪ­÷Yëe§F+Ùñ3Yƒg‘Ç;¹ç ^–q¦ìw×£çßM¸=)λß+ÖóîãªlL–z_çÝ“™ÙŽ­TK·]WÇqg\÷ox= ýõ× tóןªìVSlç¨ÔÏ×£™æÎøº¸¯mSžþw¦Ž½ùãFEÑTÆl·º›rqtu˘ê«,âkæþt[«®-·5ýP²¹ô風ôsy÷idz zù¡è`·®{Sèù^¶+wkÌôöjó¶ë+ÑÏ–Ü?5îyºªó·dê&ß+½z+§¼8q«=tú*&üÑÍVYwŸ1èF*&Öz®ÆÉyôÖ[W¡ål®ºú»¾Ôzyí±Žø«®h|Dsõå€O7OqÝo=ªÓÂkÑVÎo³gêäÝ‚%Ï8®ç=·Ù‹º·gçŽã˜îÈçoŸnÜö鯮½¯:6y;=~”eɳª§¥ƒ~Y÷F8ÙšuO;Õ»«¶s_µdEUû^o•O©W›†:·3›2Æ_C­Jʽ\¬ünËÝÅ:*uŸª;ÏígϦ̚9» é§W5U×:(Ñß}\eÕÅ”[Üé§TÑšÈÑ›Ž8®ÈG6sÎ0ÅËyãM3]Å{3Ù_vS¯Žº×GS¦¿SÎÓƒ¹ÏeVfï-ÝEÙåÝY´GUõu´èªiô¼í—ßÍ—åϯ5ž~dõjëUâÓG¡Æ;ꯪmW|æÑ1ß^¥wûèñ~»ÈÑåèãwŸ]Þ6ÿ ïC5sß9;Òºß?‰ßáߢh³‹ùªx®skËtQßêԉãŒõO\㶺{Ó•©£>Ítw›U¼×·Š;ãvY³TEzh³›§Ëuº®ožóÛÜSÕÜW6ÏUèÙÐÃèWüþ.ÇuuÌÕ¢—|[Ö}ž}µ]ÕÝe1ßÌiîÛ5sŸtEHêý·ñ4èÙáêÕÏu}täõ,ó÷åiÙ‹VBÌý¿5wߊÞ<úñN>iÕżâÑ^}Ui¡O\ßvŸ7¼«*»œ•ñ.´ê£6¼wì⚪§Œú:Ï›e|Ïu[Æï7OTgõè³>Ú"뫜~…™+ÏEÙÍœcXîxë®»«]uYMÑuÌñfšmÛçúÞW£ŠË)U¿ÇÑ_–8»4ÙOlÞ¾nÜuÙuú£«,Õ‹¹¦xêú3õ²=//^MzéËëe³W•Zvášå¦4gÓ›eÏ_M]¦ë0{^~ü¸¹ÃêYåY|®tìñý-o§››±çôh‰æ¾i£E™9»›ûëαhu–ìµ[M9Ç¿µßO}FŠÑE³V›¹®þûôðâg˜i—\YMþp¾º›"9QÏÓ¦tÇ|wßOO4óVÌÖw†ÊmËÅñ9}¼ÙTñ×Z)‹qßÓ«¢Ú·ç»nÞ~ï5ÕüØW—ѧ_xôqªÚo³6N¹·ÌÙ®8sSîÙm¶Û›˜ôüì¾bÏo‘Í´hÁ³Ïç7³]|íªž¥®¿:ٷϾF¹­[·UßMð®Ê³Ù_ˆªŽ§ŽGy8±€Ý•]}O+ê³…Žl¢Û6Q§›¨Ó—ež>ª+[Æ{yíW6DÄÛ›ªt9kœwEÖ鯫2[£›Õõ[6Î9£ÐªÌížVÍ*µy>®*}²k¾®¶f£|eöön™£oìx÷gêºñF^ø¶ºã¬~ž8ÕW±‡O5_æiËÞ+3í·¼ÙÛ댺zÍ]ÚqçnÇ_TqOp¶žváÕ›¹ê-¢4eîÚï¯Wx5îó·¼×k?=GQç€/æúz³žmæzŽnâ&4EÜlÉèçSèU‚飈²‹)ÙŽÄqvŒG=çÓN®-ÍÅ×ÓªWƺqhç½V¨®ÿ/ÔœšÙ4qÖ‰ËW¯çGYoŸ¢þ²îÏ’ýýú¹ïîýTÔÕÖ?KÊûg&—t[w™ÎšñwêQwœëÐò»«›©¦nÕ‡Mq£‰«žªÍ1žÝÜ]“2“ºú¦îo꺯£ª»«gÊ}<óšmï*.â<ûÚh¿É[õdFmqÌño6ѧ.®WÎ×W:«³;>œœ«ž4gӖά¢Ê¬Ï§˜âÈÑ—vIѦ޲útæ§U>ŸüOW7íãÏ[Äwëøû°½3¾=?36ùëˆæû_׳ÞVŸ_Æóþªœ`ò½œ¸i×çûf'uÎ{µáÇëyž¿—èùuz˜1o®­–iÇ–Þ´yùôõ~^/¯ž&#ŒüÓo:sÛ\æÙžØ§LñUºuY–­˜º«ºÇtZ§Þëêêo®næ9ôõÇ}ñ]ýÝŸÑÍÕ—mz(U×TYN̽Û_LÑlÏ;©[Ÿ_9·=z¹×E-ø¶S¦ºmš÷ù·3E4貨㾱lâ4äõ5x^Ô=}^o©“Òð»ö|}5M7ùsg8èßçk‰óôU æuŸz¢ûlÙƒÑò쌚ñÕ¯‰ÓÏ4Û9åÏ9•ÍÙQ}}wnk#šµ#™·¬úùº‹zÁÙžžî爷ËXmª"mÑç]Çvw_gvªžN±sÖMY­¦Þy·œÚÕÄuÍ´ÆÚb­5Q;®Ãu½h4d櫹¶;»©Uø½,—wÕ\hóxõ°ÙN›<½“–kÝÆš4ónÝíÄô3ùÞôlðtãïÃô±lÉÖ_Wç}l{üþ^ŠiŽ÷ù~®ZèÙDß–ìöñlWš•rlÉÎmTõõL8œwqÔ]—EÓG7Óç¶æŽ4Wv}y*êÚ3hNnêÆÕÏ=ÛÞfüFœüÝÞ]\ßomœ¼ÙÂŽ{Ëݹùî]×Çuóm]uÄFŒºk¶8ï]FÏ7Öª8ªË«Ïèçõ<½y½ žq]8wõ‹_ugq¬¢¹²Ê5lêÏ ñ®ô<{žÚ¯УÙ³ÓÅ“‚ûç¯á^Ëu]š{çf-Þ¥Æ|•úYty¾‡—vÏ>sÏíçmj¢hœ[pÙžusŠÝû›ù®4çåj¹Eº8˺¾²U§·ãªîüàÑoY]•]Å•èç¾î˦Þbæš}´sMš)çXúÑf+j³—£¸«dV_o:jô©ÛåÛ‡V¯7_]Y]j¯£5w«7•èqÍZù<Ý7ó¢».Ý“Õñ}Vq§Èô\ú3ƒ¼x1oÁf×g~ÿѪÜôÏ9ýù} ÑÞžrïó6÷æuñUÎlž+ÝÆ*ÕTíã ÙEÙ¦'»¼ýÕ÷Ýí×W3O¢æ)Ô²ºæžtÎ|Zid[*¯Oj­êc®y²¾ôÝšë²jÛçô«œZ-®žz«nnæÌ½ñ^®iêQÄlª«ûïe¬~¤MµæsNì;¸ÕÅœ`õ8Ñ¿Íòý·ÝæÛ¿ÏÓ¯ËÍêyÞžŒË-ůҷ6Ú9ö<»;‡ƒìßó×õFC®ðiâty¿$åçdéËÕS›G»É“N?GÇ»_tS6s».-”s:¨‰¢š,ž9æm¦Î(ÚY‹¾ufï›õÒæ5á¯_y9¯®­Í”êÇSgqW|ÛT_Ï=ßÔUÎìý_Õ=g׊ʩ¶|UvoGœšªãž4Q¦ÜvE”lªëùºÝvø¾­þvéËÆn²‹¸|÷‹uyyýªëQ·ž}}^X=OF¼^ÝÖù¼o³/4æÍmžmº²c²Þ³[Ó¬Çorßc6ÜÙ½/:êtùqnZ»cÙ—^[5aª7U£Ê笶wFܼõß=Ù—µ}GÎþ/¢Ëq6U’î#ª£˜Ä¿‹-¦:ï»)[Gv]ÏNlÓ1RÚ4WÎNº¯º¸ïžã«ø«¼Ë8˜´i˦™£eÙïÜ_~ugÍÞœuÅ>Îztc§^MrgëGtjÑ6xþìNœÞ²ý>~Ê3zÞ_;X¬Ï‹O›Æœ–WUµj²Ž¬yíË»ºîòöêÁ6bŒ½[];y¯7]_÷cŽíŠ"y¶ùuEÕñÕ“E[ªœëc·tñªú-dçe=Í<료`­æýÌñ}+ª·.În¿-µíͻ˿˜éB3u×wrǦxæY¬Ó_}SVŽ;]èe£WwY¹W<Ô¿7yï¥Õu{9¬óõ±ÝÓfŒ½œ:8õ<ŸWͯÙç«ý]žm÷QÅýVk«ÁR1wÖmy=Š{ã:<ûôÍ4bŒwéÅ¿ËÑF~øãµÓ³4uÅ»ª»²wF;£‹#¬ºòYtQ³<òš5ÇUÇ[§ŽíÅ^šùç-ôN Ócª·çšfÉÏÓ^_R‰ÓÝYoÅ}ŒöWv=çÝÄU«§9™ê¸îi¾¯E¸¾¿[4[V¯;G™êó’½YæÊyãù5óUöU›]•WuV]Gkc~ݾw±—6¸3úyÞ§—oy»|Ù˯EO|űçö<¯Mæm£¼Üz>m”w\ÑÖÿ;MôS¦Ü¸ý µh¿œÖ«ãÍÓÌ.çŠz¶;¶ŽºÇ©MõÜwUÜzX"¾æ«s×ÖÝ/S6÷WVs,»˜[£?Vòꨮ{+Ó‹Fkn®iâ'«y뮸¾¨»¨²7Ó“Óyôú;ìSGwb³¼0wNµ{b©ÃèQ«-Ö[…ì`Í»ÐùÿGÖÅõ³lã~Ÿ3š4âë/;¨ñº§Vœñª§Uù~Åf«~gl>§‰7U—ÑÏd´[g‡écUmù5q±£\[WŸ¢Žm¯¾eÞ{뻞âžöãÛ§7}*¶Ž¨Ù–’|Ð]\]4Ïz(ï®xºî8ÕžØfÝÅÆšø«F^{ÓG 3飮éíÔèÃmð™7ÕMѢƎ5ñ¢¼TkòæÍ9öa»Îõ9Ë¢Õyîï©®›øêî±ê»g^¥{h»Êßn~-s·ÆÅè宋üë]Ó]Ö÷fœòïG]W“¼W×›M•çÛf.½9ÑÏŸ²¬=Å—O}â˪šè¦üº¹ãžã»éîÚxÓ]Z:¥e[±õ¯9ïKÇ_ͱrxîeÕÃOi¯•ž[±Y͘­Î¿Ž¸n✫¹²«ÕÏq×mèçÒ®¾tߟGuYuدˣŽüþôáë^[9ž¹¶1õèæâ¿A4Ówì§ßâÛtÕ^/n¾*Ž1Ù’¯£ð²9s’Ëmë•;ü­ÞvŠøžüÏoÈÛWqdSÕZï¯W›4×ÝS8vhËêU]9®ÍÏ\×b®;ލÓ_q«:ÔWfŒº#‹b½4©»Žü`®«G=uΞ)M´Y:Ÿ½¸f¹®üU¸[f{h޹æÎ9ë‹S<Ù=×lz¹¸×«Æõ±Ý:iêìôêâÿ3Ÿ~œ6ÑèáëºÑ¿Î§ué®®Ü:õiÙçwèÕ¶ü–oñ½ ü¯ÒÊÁéø¾¯ŸN¾#x¶á»ªnÉ¢X tgÏ¢­sŸÓÁ§Ë»5ÔêÐºŠ¨âÆk2Î}1O7S^®«ÙOÑ0îüº¹®ýxó]ÜN;§Fo0wsß×vMw掶ãßC¾tâךî²E™nï]½Yöp®›­š,åßvW›Ð¦uñtzX³Ñèáô¬ÁêóÎ}UQ³Š°wÕZ;SO:zãVmY¸ÑÍùÚðz½K,Œñêæ}?ÑçÌÍJ[ÉÛ›6{µçÙ;Çèy[¯§ZúóçZß>­¹mÝ]|oó´f²ÜùtsÕ{êÙ‚•:<åÌÝr¢Þùï8­ŽlâÚ´[_ºæ2õ~k®â®»ñÙWVÅZ+ÑÏS‡Ô§Gyç~lœNŽ;Ž1z|×v>4qO6õ4G|ñeü«ÑNÌWW¡fغºöçámsŸwWsg“ëy·fç~yï6Ýh²ú´gãŸS=¹4æ¾þûŸ_MØtÍyµãÎú¯–¦ŒÕÛgTQŽßCZ2ÏSíxX} t×_•îù»¨ˆÑ–î1n¿ÌßGUè®7ùÕuÍ5z>o:±èÉ6D÷6S3_]s;Í£ž.Œ×,Q`mãq\jÍ;«ª½ šé³¬Ûóq][p]ÕwåÓ^ hîf©¦zhŶ¨¾"|hžcÑ·5Уü³nmú<ßR¨¢ýüy¾ŒfË¥ãú”Ó*êë)¾ÜWów¥Ïuûx+Õ¯Ïô<¿Vï ~Ž/ëÎÕ‚«²ìˆæ»»ÍezqqÝÍ¢Ýþu™9·»<룚wc9ôDèÏG¡†­n¬Ëx㎈æÇ=õÇQou׫&‰ªþéê©éW^XG6÷Ÿ×óµÑÑÔi¯{ºkŽtQÍ:²ºï؈š¬âÞ*ª×\Y{—=]eZ#VøËNºüþºî«/âúîÍVç¿Ì¶ì»3[L#MWÎ[6fÙ‚ÙõmËêåôüÝÕYM›2WèyÛü.±ÝF^º·<éã«æNÞ¼þ‘£5¾Wµ×4Ù‡E÷å‹°ÓÜW|êã›;Œ±Ö«¼¼Ç<ñÄÛF¼FŠ.㮓V®rlª­uj箲ÛÅrò@D]Å‘ÙÕq²¼÷MùûïœÍ9ø®\YÅ–GXv«‹)ï6”ó´ÑcŽõ÷eË{ñt²hˆŠ­³EZê§ÕÃÅÚ³äê¾ùÙçwź²Fü;êºü›3úY“C­:©ÁªíørSŸ¸ò÷U“f:®«E{¼ª´N{lϯœ]ù»õqçßÏs‹V]þ~™®n§ÒÁΚ)Ý‹šf®ÜæÑ‡gµqe˜n²ŽôG©¦8îì>†[iÏèaóÀ÷u)_ÇM 3]Í|Ûß|ÝçÙ=ÓE”utS£=®ºã—=wW\wÏV]Ý«¿O»³nqèšxî¾á;æÞ{Ž»Ë’kÛGuÛ;¦Íñ»¡Už­éW\hÍÖúùôq÷oŸVŒø2q¦qõžÝ~u´õ8} õàêίï®íÇÔ)¦Ûtdï/£E¹éÑÏ|ë÷¬÷Wñ×ÓÓ‘›uQ9Z/Éo>–²ëɦÊgª"ß³›+îÜ×»Ó›J»¨Û“F-™¹æÜ—"Ê,ÍgqN®y[ŹkÕÅ:i¯­wO:"Ë­]g}EØ-ÍÄf²Í84kÅ«ºz³Œê£·Ÿ;ÛVÊ7âÓÜkîË-³nJœw~ÿ7г…µnÎkˇv Ùnóý¿'\sÆmÎkͺ¹§F;µu]·ÛÖÛ,Íéǃël&'Ųû¼ xÉTñÏ›ì穲ž_|]ƌ۩ËÔÕU½qSV¬×ÛqOíÊõ°{^du™›qßZ|Þ„GI·ŽœÙŸ;š,ÑŽ½9ý/3M¹æËsY×3ÝyèË·ºùºt]Þ«Ùß6Wªg¬™kêG˳/5ó¢mª¬zªµÜN Úºñ­ã®'>ލô0ÕÒþâpêfîÛ¬‹l§,SÍÒUÖžëî{ï,]\h«NK/ï6ŽùëºTßá€/Ó|q|©êÎ-›óñÆÌ±8æ˜ÕÌâ×ÕójÍ-¯š»iчO}™.¶:¯}>Ž=wñÌ[ŸVz8š´Q~k•i«9è²6ÕÍwY=µ`ÛÑæ÷lõü Y^®:{×óäFÊ|ïC{8ê¾Uê§Ÿ_ÂÓ<çÕÆÜz|øf¯_U_Y}¯º3Õßrño¥WYôb·-4Ù5íóú—3Íõq~{x²«:‹®Ç®jÍ®‹¹Ï€¾«6æ›8âÎbtUtë¿3G=Ue™9î›{‹+·?¡ç÷ñÕs_^Fx³©ã^Iôi²ìûs_f[-ÉÅ´õF¬EöWÇ¡æu4]ǧçéÉ}˜.ӞݵY|uÆsíøUnÍëæ¡£ÉÏîyùónÅ×äÕv|›nó·2×NžzϦyˆËßí³nNtwW4ÛÝz<½lËêÓŸÐÏuyùl¶¹®*·ªtqßuÓtMVLÓg]ß9tŶqŸÊnæÄ[Mš3lɯ¯ç§Vnh¾8ªÊ;æêâ»bVT®&îj›"\»£N™¦Î.Ù›UÞ~¼÷÷VÌ™ý[|mu8ž¹¶F¿2êïÑælãžÕÏ]mâ™».Ú­ÕÏ¡ƒÓªý]×_w‡6šìÉf~kuçú5Qèg£®¨×7Ñß›§ÏÕßY£¾tÑÆ­z¾«¨ã57óª{–àÍÞLö_‚æ~¸²Ê»‹ÜqeIwFÞòêÍN¨ë‹)›Ÿ8–QÎ9¿.¿+ÔÏO§æñn»±WÛ4Ç}aÝ4èË“~=|Q£ ¹¬ó4õÆ)ïš-ÍRîm£½9xßšÌÚªEôÛU•ÙßÑμóä5óÜíÍrQn¾g›1ãÙÕSÏ\W}]sÏ]Ï0Ù×\Ó×1³š¹hž…Üjï–fÓM~Ÿ™z*îŽ-²ùÉ¿.¯3M:(¶ׯm컜~†NéŽöU¯ÍÓ¢þwùû5q«Ë¶ÎqݯG“gy3úš<ë|ïG/ãºû±Ï7G]C~Kg6Œó›N¼üe³¸»«æshËf/.ŒsÄÛÞ+ù·ºnï¾jâyº+¾*å.êãÔÁoŠõ*®Îú«FoS¾+œ³täx´ç¶®ùÏu¸ž.¯\ñM”èãŽn׉gT÷ÚÞµÙV_R<ûmÍÅš1zLÓo)Ë©OnlËw}wžhëV›<Ýx{ѯÍÒͳªo¶Í¹6oóöø-ùmëœïÇ_Y÷⯫zÁeìóšø».‹òwÞžk„Nlë»|ÍÑNÚ)ÕEWU«Äô0sݱ’][O}s}™¢¾åÝ•gÓ\ì¦îcžzòì²ÕmmÙîæÊ;ª"Üš±Ú¶Žz²®¬æ»)¾«+µMùÉíÆÌZê¿^.î×_²sv.ïÃn×:óõVnl£~[;ºº¦xÕGwlàôè§g4Nœ–÷Æê½>pz·sçz*¯›uÑ—]6G•oËózy/L×£5çõx³œXõæ§8ºíÇéd¶Ž´ÑEø&ìügº‹+®úvWiåU½uMýÑÊȲyëžéÝóàCšû¿ou\Ï\÷Ÿ¾oÁ}6õUÙº«¾¨ÑWQ§÷g¾¾b{éÔÔê˧m5Ûuê®ÌÕõùûi£«¬Å«<êǾ®.æ'š9_]•k·ÏÝÜÏéuO=ëºvCŽY«Û]>OµÔOŸ²¬“»-òõtUÏ©çìÉ|į˓]4×Ç=s]ÝôçѦ™mÉÕÔhªœÕÅœs׿«¯¢ÊéÕŸºî˜ë‡}q×YÅÞ]“ÝZf¾´ó“o5×e:2_K‹(¿¬WóÝÜf¾‹VLÇ4Å—g·Ž»ç‹º›ù¿ø´wÝQŠÜ×NOGèõ›®ºŠí®j«\WÞÎüëbÛ¨×gàÕÞ ‘ÜëÛwîfY›Ž¬ïÚôáž{ÏÞRgŽºª;ºÚº·Ñóè§NÌÙñõTsÛn®¨žõE4à‹#¨âÌvgÓžWdç¾zÍÎë3sm37Û_UwG”ÙÕœ]U÷Ó¦ŠzòæúùÓ–Úî¯-µ´Y^ŒÑ×uqv{úªbl¢åÔO}½|ì]švå묮éª-©^Ê4çÜÅg: VçºÈË:xë]x®»©»_ŸÓèSËm ž·‘v¬<Ù“Ò³ÌÛŵdÑ]]Læ·Ú&ÎóNÇŸ¯¹(ÍW¥äi§V}LoÏèáÕš½ï:z²qÏ·ùÜM½ç›ù£v[©É£žíœöõàÛ}WmZ¼©UÕh¿tnŠºîy˦*»|YnIÑÅZ²èç>˜æj·«hÏ·.¬Z8º­ý/¦;›­§ÒË{ ”EÝæ¦û³iÎê¾oWñu6Y~^+ºÞ42õm7U¿Ó~®fûlîf9çO—£º9¶=J(¿ÉÕ›º˜´DóF©· ÝE“´ç‹±]›n{²ú¼Uéso—¦2fÓ]êy·=˜ø®Þ;kÉm¦;ÍSÅ[=eº{îü»*¯Èz^† ²»”i¯­9¸·š%Õ Tñ£/L÷Ê©³¾h¾¹º®úÏÝÔ¯ˆç_Yµ×ª›æìÛ¢˜<ßG;®¢Çh«½ÝçoÃébž»»Y¶—¸ÕUõ×ÞÊù¦.¶ÊjÓ¡]‘5iÏ·š}:ªã‹3E5úÞVÌ›¨î2zžn¾mÏßvíót監®£<×Í…sèçïØóZ9³Œ1z¾Fδ㿆;©· ÕoÇæú—qEz¹§M˜,¦;‹&ŽoS§=~¦MÝÞZ³Q«˜¯^¹ÉšˆŽ(×ÌW}WÙçß]œ×7bÓ¢•]ôëš½,Û~pèiŒýÙn]xôpuW<×u\Wg=q<_žúÓW7OWΛhŸN{»êÍ|è·Ìu«5º;ˆÍv Q§šÑV§4õ:¹ªuÑ4ïÇ®Žüí–Õ}4nSÍÔÙkfÜkó/³™×†ÚøßçØïš2ìÏÔóžÎùÓ‹Øò/ï^b×SW7ß“^ÿ?îÉ(òíÙŸvšpu“ºç6œº*²½ø×EÕóÇõ7Õ=ñYµsÎßœz:ñèäî¹ÑfKYëµ3Ÿ®jí<+îÞ:ͧªÖéÉo9ã~[.œ}ó£½;qìóãN[oÏõÓw•DõTlÅÔ÷ÕÔwÖm»Ý–½tßú¾-¶s»6FŒ·[ǺçÕË­åkæ0û~§Û6[ü»ªæ1îÑ–®nϹK^.ážwQÖ¼lÑ“]ú1nÍŸ¬}õÙµóÅóF~ªÕÅîx¶+éÖ8ÑTs×Z¸îsÝó\ùb¼»ºŽ©ê™ô`ÑÏZsq®zǧ®g=ÝWn.ç^;Û´WÞž4x¼ë«NŠhמ‹z¢q]Çu[Þ{õù¶Î~!‡ÔÏäÍnØæè×»Žëçš0³.¿‹= ¹ïÌ¢ú¢hŽ­çšµc¾ÞrMz«âte}æ¯LYoy CEzÍfªç[“SŽzœ×vk¯ÍMùìï‹8žmvæÍçº.·5¼_nO¾ta³=lóµbºÍ~u¹û£­#MVg³ºúº«¹ž²éˆº‰ÜÏÎì5uEÕÅó«?£•*ÓW¡çåÓ³\èÁèÓU×åÏŸ=»øæÚ3êÈîß?mY=ž*›)ô»¾î¦ª¼®éëš®¦4iYW,Çu|ꮥ³šÜöt‰§ÑÏÏ$ñg|z5æŸ$ëÝ’Ù‹3ßb®©˜²»xÍÜEZ)›h‹-Í£–ž,¢žû¶»!鯫|í´Uý n·-[p]Ôg]›ÔM™»âëbÊù¿:öo_ϧV}YìF}˜uÙGwé»oó};ózÛDõ»œWꪨÏg¡Žª/‹2ó^œ¹¯›¦ü—ÕŸÑÓÖš5ùúüìz±Ç*ãV¬ÓUõgœÚéÁécî(»Fi²¾ù³6¸ªúªÓD÷¢ºvÏ€õ-Ý>m—gzÑ›ºô÷–h¯®ù_Š®Ü;_G<õÕ‹³éç7x·ª{ÑÎÜ:wäÓŒgê«ûÕŽ­VQÝ|«¶,WmŠì¬Ù~~/«/§ç饫%¼å²4z4÷n{[2Ù“fm98öl¢™¡žˆ²z£ÒÉVOBj»- ï?;§‹²q¶«7ѯG“« TU—Ô£dÛ}fï ñšÙê9çEtuÇuõc?ZqÝÕ¹î»oDygŽÔwªžûï=QÆÊ-b·˜ë¼ýå¶Ü‘=×e}ßW÷ßuÓl¸ëªt«³ÐT×~,×fö±k«™®‰²sk©ÜhǧÍô:ÏÕøíªÖß:Û.®¾óY³Ìõ2÷ÌiâŽmô]wx6éÍ]¹´hªš8¾Ü~…8´äåUóÍkÕšÖüÕÛNÎ)¶ÚlÝ^löbÕæÝ¢šôiéèdË’¼Ûñq¯$©êËêã¾*¿žâ'ªç]7óþªò€ß 7WÏ ©çŽ¢ž5å¶‹i…vW.ºêtñ<׳GwZ™õåÕF-YoªU×ìyº¸®êtd¶Ì¶÷Rúë³ÐóëÓLó1«5‘^œQ²î¸Ïv¼þ-7SƒfzvõÍTuf]¾vÈógF.­š¯snYººjë¬ÞÖû.ïÑÅg5õ‚šý*ûã®5QÕÙ*ëœôwçô0k³<ÑÅ–WÍÖf¿”weÙOnüP£n;»èÕÖž3wO=÷_31K®y¦Êzˆ¯©ã«&Úìëªy·­X­¯MÙ¬²vç×U}ÕÖ|Úy›)Ý–¹»‰Ïeñ_ñeëÉ ÑŸGÙg]aß·ÉwÖŠ_Ïzÿ7o7Su\sVÚöùÚlâγ*»lçâk¾»sîãO6è¶­}¾vÎfÊòK¯cÅÑÆzºÍ«ý7c®ç^w©\âö1ä·œÓÜW^K,ëU·yYý,¹øçV3Æž{‰Žj¾‹óß–Ëk³Eógr÷=äÑä=+©¾½6c¿5ùõQéùÕÙNß/ny¦b(µÊ¾¸‰Žäí§›34ñª»-ó²ýTaÓ‰ãÐó+îÇ7ó³‡ÜiÉm4[eÜÍôÓ§šø¾.㫬£Ž4SWz©ë¨¯~Œš|½×v²h™×óúúžëòû¶¾WbÛ5W¯:uy”o‹0è«o6Ùæõ4_UN£U;íõ|l~Žz©î¾qYóÄ[U–S1÷q~}ù¢½Ù¹Ñe]ø`bù5×ß›£n.=2ëãï•m™¹ÑÌÛ²´ów¦þòWç(·5œß\YWsvNÜG[²÷—]uÅÖ]ŠuÙà€=•ÑŸ›õ㯎­âl£¾²Ç:©êžTó<õÊ!=ñ|EÝs¿Ï_Vì–Í•kºúª·6Œ]rîŽêÑÖŒ]lË]ž{š6âÕßN=‘¦š¹ÛŸ´÷]×QW©“£+÷xûsi)ãvmÞeñÅw×UÙ³wÄ_ÝðÎ_ŽÛsñ©“ÔÏmÞ|ÍtÍ\jçFoÈô©Éècã«1uçÙ\õªÙdð㪴åÙÇTh‹¸sß;³ø€?Tí©]—`Ý—‹³ól[—¸ëˆ®®­Ï<Ä"b{æ.˜êÞúæ(¶,Ó^¹×£ ¹7ùÕÙÝ}Ó£†m¸ïÉ}ÕæÙ9«·‰_žÌû+âüôÑ®šøô)žx³ÕÃÄÓ»ÎõsÙM³}ÙmÃìâEÝó‚ŸOËu_Z|ê­³Þ&a‹}-Y6aõ|®¶ãßåBe®Ì{5±wÎ?»ðwÞ5sNŒú²s¦yš,ž,‰²UwÙ›ÝÝÝ×|sUú±Ó(¾›²ÛÕUY–Úi¿Ž,âÌ‹9½5i«ººÕM¶Y5½¬×Å7yÓ^m”ÏSt]ÛHÙß§œ{êšøÕÞ~4èâ=g¯Eõhy·isn{yÑèà¿G’ÓovsÝùêͦï>ü×S–ÜÚ¼Þù4VïoŸ¦6ä»-ù-Œš+ŽùÝG¡Îm4fî‹,ã7UÓ~[¢ž«í<ÆŽz¯˜Ù]Ù,êê´å¶Ê»ñ×xõUmW«ËêfêÌvC¼½W4Ý]G1ÜÇ1×Q=ض9Y¯æÕy·qÄðYÍ}¢bTu:+²Î.æ5eëE^‡Ê€=œú¨îË2õg¹®½\sm9â,†~ª²©Y_\:åÇ]uÏ|Í–MÝå×Ý}éÇ£;šzž*눳‹ôT¦)Ù\ß]+¸²‡7Dkæ,žÞK<ßN»¸šïz¾g¡Ï>¦Jz§EÓ—?5jÁÓ¬ÓUì½ðæ;ªÛñ[ÔlÌÑV{iïŠg¾vÔâÝ̵ú2£ìSÞkêê,Í6q}1}ôjɧºë˜»˜¿œô»£vÏ6Üüê¦Ê¬î;ª)ªçDó\×× LuÏ}w5ßF‰á vÙΕØÑ§%}÷M´è®Ê¨¹]ùo«K%×äן¸¿=zß–èôrWμülÇmû2Û5ÆoB~ŸŸ3(×åéÑ×Vù·NZ,ó»£MQU:êÑÖoC̹=©”÷—nÕU;ð_Å©îÇ|õ\`ÑŸˆâÎbf*ë¾xî,®Þ¹·–¬|i£ÕÃHvš´Õm};¥Fºí£»0ÛLYWW"%×êßÍõqÞ¨ÏeËkÑv øöæî¹®¾úžðÛo6羨»>Ìšs÷ÍÜõ×8õó}\EZ{ÑÖIã«òéÍ£W¾qì㘲®ç®cVhɯ¸Ëªì½õb­ÜyÖoò7_N®oñýª"yâß_Ä¿ÞÉ‹bþtà±]}ä‹k¯.Üy´.É_3fˆï¬ÖÅ]÷]wæôrdFç{¸ÑªžúN|3TsÓ5ÜÕdºŽ¹º¼Ýõ¢¾-ï¸æls¦Ÿé»çEN)ÛÍ“—©®tW–üÖWLu]¹ìá×=s0éj&ɪêtQ¢ítsÆþôyzèï]›Nfü“Þk¯Êºo¢›¹·>ŒwÓgq&Œó~3G7wU•æºxÕn;fÉÑ|uÝ—bân·ÍŒ´ÍÙ´Ñ9},UÏ›¸W8rÎ}8ûºˆ¾¸çŽúuW|K¸‹Õj‚=L¿>ôögÑÞm4tÕF^-ãŽ-ÕŸ%¼W͕ƌ±×0…•ÙO]õš.î«:²øªÍüÕ9é˜íÄ_žÔquujx¯›¶yÝMwV‹.Ç¿?]´y×Κwdñ_\è¦Ë´EÙ­×7w3›‹/£>ŒÕõÃŽ¨¢ˆÏèàï_Y4áчÝËÞOKnïŠzš4_«z8Û«uUYzžkSÕ•óÝœqÏ]Wßy¯ucUu]§5ö×ó w˜çEµçâ{ê2ÛÏ5×Ô]“W5q÷Ây#¾¬ë…‘~~í®É³>ž¦Ú¹Ñ]¼`ÓžnÇ­ÝZ§>Ž=Ø{£ÐÃÜ]£Œwqdð·E5×Þ™ª®ôåÕU~ž^+Ñ]œõ¡¶_^y³Æ³~nµ]ãYÄñÆ:ìë&ª£«;Qm²÷=Wßr×ÎMµu5ó¢ÎéÙ—ES}Ùkˆî»òÝ^ŒÚ3k£MUߟDõúÏÝ{>lîóÏqšëy¶¾#—5¬ª¸µOÍ9íî8æwfœ—Wm¹ú«O=èÍÝz)³.΢œšú¿?©‚ž×f¿Žêôñé¶7ÑŸTãիγg4àô¼ËùÍÝ-Ì㛺âÙ·%;¸¶ŒýÓéeŒû±]Ëž³ó«-÷q¢ºÇtsJÊ9]éªoªÞzgÓg|Ä]u^ÕՃЫšç›è¶›è¿Ž8³-:«¯¾yM}sÕ}:ﮣ›øYEŽœÄX¶þ¦qlÏ«ŒÖuçëë•Ó‹ÒçŽó^›sëË¢¨¢m²žæ™²Îl¯½¸ï«M\NYôr_“»£u.´÷£ÝÙ9cεùSf9ë;Ín¬6Ý]”ÓèóŘèÒÍ·„WQ^šéî&þúÇ×4[ÝM|ÙNž+¶+¶:Šm«U}sÞœVÛ×yü ¹“ÖÏ]|õ×SÏyvÕ_|ñÖxïšøë›i먋lÏw=t…”XêÊ´qųÝÔßÇJx¯FkPÑÇ7c×D¶dÓ^K:›i§ò¦]-ų7zsíǪ2é®9²žîâ¯Kø¶gŸ[Ìç_Ÿêf¿Êß—œšséÃÏ¡ŽŽ4qdä¾­SlÑÅŠ¬É¢¾ðÛe|鯬Ýß§ÌÐÏoéï½²wdUµƒ«9£T3õ³ŽnåÞœË<`ÐM<÷3GT]4èçŠ.§¨åªø¯½þWu«6¸§NKbÞºî¨æÉ£žúª9ßO©çúùîÙÕZ3M\æÓ›»©º¼U]£Yú¾ÜWo[ê»>ü<ûk¶ü”k®Ú{¦f,³?|s~>¡Ç|[v^§Žzº›ºª-£}5¸ž{Ó_˜ôlºŽ«ÛÎ]y/ª®«î›4PâÎA÷§žl¦ÎbêæÚbÝ9¢îzŽ­£šõf¿¾{꙯«;œ³r®³wwÕiÇw\UèeL÷Å™¶àôiâÄÙv£5zi³Ö«Ïõjë]:¬Ïm™*œ¶fÛ–ë:œ¼»0λ:ÍMu_Lh⽦:Ëox´ÙEwQÔ颭,î«ïw™]µêdº®­ÉTÊê.âÚº¶s»û>|êjËlÍ;¨¯¬ú0ÝÕé¢x»5•öå]ÜÜë¾y•‘4èªÅÙ‡ÕëÍl«¬;èº&"ìšqwÔ[T'®»£n9·=½®?Y9ÙªŠ×b&اDmÍÄÎm·Sëy»^…Sš,¦4gêÎ'\÷Ž*²Ÿg]dîÎrèÍ9}:°mÇ·®"Ž{æÞmã5Õª³Jª®ç‹,£¾*ŽªtÅ|Æšûž9³ºl[ÓÇz-y·Ñ1Æ}=ñDW=[—·\×4u<îË#›f+‹9ë®4Pž´æî½4õ›Ôó®ïž*¿FkÓžÞéîÌ÷ÓÔêçŠ}O6úk»¾tæ¯C=ýéó};M™­³n.zÑ–þ4ÏT{š|Êô󹑯C-tw6ÎX¯µQÅ‹1Qw:xWÇuÙ—MUߟm3—LiÉv{sͼE{0ëQU–dOxž-²¬ö»uÕÙf9²ÉÓ“Ío·D#›iâ‹{s›­™iÓß5óÌpëžÖs 9¦î¹âʵMz"™]Lƈâ®ìͦz狳Eâú•¹ïn>,²,ͦ¾»Ž#ºíó}LÜÝ=eÙž5¶ážo§EQÌêôíï½éë]ù}cºyÏn|Z£ øôWÜhófÞ³íÍÕM;íJ8·¨«ŽûªÎ±èº¼ýÙW\kÄ®Úõä[ÌÊ¢«bzº¹¢Ý9,ÕÅvy w,ó³™Í£Š¬ÏÍ:9YšÚ®®Îyáõu6h¢ê”Ýevñ×uYÍœÝE˰ÝÍùöçš{â›eÇfŽíçŽ5Óªœ÷[—GyvÆ;nâ¾-骹æ­:çµ4c¾øÝ‡×ãFºtÓ›N.2úžoõëùñÕ¯j8Û–êváÑ|ÕEó¯œ3¢¾óõLuj»4s…×|s6ñ}TèQ7WMÔÝž4WVÊx]Nü·å·žçŽíò…ü]žl²®m¯6ì½uÄDYŸ®Õ–¹ê›&®®¢þ8긙ÕU:ñíÃ{=—ÇêªìÝW³/Q£.Êj²Ê«²ö~öaЭV‰ç¨ž+ߎùšì·šóë§~œXý¯WÂß×m>nȳŸ5ªï*Î|ý˜¹ã»quÆŒÚ"»y®«"­QŸºì]—ˆ»™ë.‹*ScžêÙ†y²êÇÄsÔÙš#Lߟ¸›;Í~MZ<0ýæ·¼×8âüµ[NŽ™¸îêy®Ú{sÔÆ¼®×QÙ]ÝQ]»â­™ìW6ñÌ裬·ëòÝo«6¬÷ˬwMÕÖ¾ÜóÅÙôáëe|Nˆqmú(ɲ)†Éᱫ®»ÕÆœU×èùÔÎÌ÷ç«?uTfÙU9;›¬ËUÔßDÓ+·9kºž4yûslËbcž:ŠoãÐÃM¶×VšrõwS5õ5Ù[͸øëVmwÇ”ô4g³¹¢Ùq]•ñ[W|A5Õ~{i±¢­UiÈæÍÕÎꪻ‹ò÷uWWû½o?ZÍsçèÇ4jÉ›Õñ= ”×Þ~UùÚ+ÕM)ºª¶â³&Êæ)ôkο.ª.Ëuutï=“é¡Í™ë»„J8ˆïŽùï¸X®»ª³EQ«ÉiÙvwvQj¢®£>}Ö×5pê½[£Š/®×]TâÊôWggÐï-^…VW5w}Ói­¢«qó3jî-ÁtSj›»åN¾V×Ý:²ÛÆúyëV]¸·Û£ —û½lóݾ.œ\ú˜}/Ž-ñôÕ¢3yz¦ÛkËécsÍŒ·õÕ7÷ŠÉË·šôäæ­_Qg|ç×]|ÏYõæ¿-ÖUÝQe;2¢î,Íw\ÕdÙ;PÛ¢­5ÅÙúÕŠË)ÕŠ®¶g¢teº‹ës]Ð×^N«Ü£D[GS^¬õ÷ŸG|[}Uׯ.}“nN»›êqDhׇ›ïË~[9ÙNK.¬wÛ Ôì§½¹«¶zª4sÖOnr÷·Ÿ_Îõ0mÕŸÔ[V{4eÁ^NñF¬»üž°úxWg¦Ú6ã¿M9ú³ždïGsG:)ë˜Ï£ª¹Žy²›m¦4ñVš9ã¹§º¯ªÎªMš¨¦ÙèQamôq]«ôNšmÊ­]ÔBm¯žâ»9墾/ꛬÅmýçÑôóÅùo®«lî‰îÚùãFm4ìâ‹bçTh§–kóêË·,wrÞóqe:y®5Qo3éd÷¦]¥sèq¿üýZ¼k¢»ôåõ|fŒš}Ž|>Ž~³ù1Õ=õšÿ1ÕÜáëM3ÝVW:±Å¼ºiÇ}Y:¾›ò®Ç¦®¸»ž:çMQ1ÏwPŽãš-æbú£myøÑÜuÇšöxãOei¯¼ôÛ}蘯‰â,¦:ê«6×Ì[—¥ÕwPîÚózX4—bÛÅ}eÛGuìÓ›>¼}sVŽx»Šºžûê­ž~ª{‡ZcófmY·S«lËÞ¾²òçE××ëW:4ñ³ÏÓ~XcÃÑ5êóõøŠð[5㿉µUüq6Fk{çžÝäï}T÷Μٺ³?rZªú•Û4ÝM|uÝz#¼š•:ê2è«RºöqwŠÛ|Wk»¢ža}L&*²žfkÜF¼µ_pÕetu_¡‚Þ,¿›#<ÓßVÕgÙÕôUg]Mzj»76ß–,wÍ=u¿6=}jó´Ñ¾©Ž-·>{5õçúøu]®Îµéò¯ºN&ynº‹«ŸÌô)¿Íâ­ylŒÛ²Û’Úî³yûïºûê­d·»rË5®'ž:מ»hëFgWv~¸ë^[9ªî:ë´ææÎãGŒô,µU=ñW\]Û]WÞtÕ6Óu•n£‰…6ÝÖŽ²ÝÎ-W\Ìq^fÍtGuŸS%Üó®j¯»òó}SÕüMuè£V-öbã^n©æíømï›5x¾ÏFkêùôpzš2S³º÷×vn,Íô^V;ü™¢ú3ñOM}q›_»ºxå1‡›Í÷âY<Ũ‡1GVÄuÏtÙU–÷—]uE”z¹üP¢ÑVži]^œ‘fK»QÝVT®úÜÍŠt9¢ù®ËëáÔÊ›xæ»æ¾ïâ»yë¹â«£ŽâêuV§D÷F_B›°k³3ªtÑm^ŸEØõÏèwO§æ9Z*Ž/½¢ý~eñÖŽuñÇ—ëwUaϳ xwMÝyúêæÌÚTs—O6ÙU7O\ñ:2jçŽ&„ÙÜUUœLk¢éïue¯Žñ_Ç^жgîúó[.yÂô8¶›'¨ï7:ð®æ¾ežÈUß=wÍ–ÔÕEZsÍýVåw*¬¾šìí7ùúoËBüÜÍ–ªî5cq×wfêø×Ž®êÕ^+5Ñ·=Vú\qMz¦‹òÝ×m5]èÑÎÜêϪ0躿WÏÉêy•nó2-ò´Y_Ÿ»5ü×=c¶yïŽWhâŽ:¾·ݧÉÝNŒ—çê{¦èËu{°ÎŽ)q£'wuGñg ua]Žy¯«±ÛfZµV­uoY­æÉãF^:ï%õÝÄO55O9õgéoW×ä=-Lõw~mµss%ù¯ª¸›c.ˆÍß–Ïu_Å]wŸe´ãÛÏKxîÞq×ݶ×Rvåî,ª¯CÎ×_=ݳ=SÔs~iÙšmâÌóêóîŽø¿£ƒ|ÌeõüËíšcØÉ»¯å5Ù]Öew§×èxÞ–\{hÅ›eëÑEºhëdy¶[›}tO[r]šjæÊõåæüúéç76.®®éÝšÊ:·•s“¾o£Ž»²‹*ëMYì×9ù×ã=èÝM=W¯›3ÝžÚ“ÎŒv[Og›;뎭ë?}×Í–”õ4[g÷gUÙ_UÛÍõóMš³Ûý*]ßÕ3ÝQmué«N]y­ª–ÍW£_]àŽ÷âÙs³]œW²¼Þ¥øµÛžÜ·ló4UìùÙ_‡èuäM•q“Ódzk³V/F<ýøõgºy«M5Õ«Fþ3_Füž—ŸÐ_Fþxáw;zŒ†)׃½´óÝ4Ñ™6s’9Ó‡dÍ•FM}æÍÜzx­ÓÍ;sg¸.³Îôñdëfjvd²›.â¾n§«këšíc»f(ïž5WÙ¢ž:Ž¢ï(é÷å‹{j¯̶Ï4ñv}ñÌÇUÍ™µß’g»¨º¾û¢ÊõUÞ]:¯ŽîϺÌT]mS×–+ývzýJ:ÏuW_çmqn ~vš<ÿc. y«ÙTàö³QÇw©«e6ñŸTgïFЦ»²iã´÷žÇTó³Ï²­UÙÅ”]™ßy»ž,êŽëé×}sÅŠ¬ïË{8tóÝÕÛ͹µãœ÷QÝ}MG}Mz(íÔÄFì®óÝnN§U5éËÜÙ]™µu:üþ­§¸ãNÌ:¢jîÎiªÜ×èSšlº»i®»fÿG7z²dÙ]KzæyôÜÎ = xôùӖ̺ã®f¾úËèU¦Û¸ˆ£fZú£ªôÓgvUÖm¼ómz±ßÔëÉßoWON8Ö‡WwU7æô£ˆóí÷0åï¾*ŦìTz>o«å×läô#>ʹ¿&Ëü¹ÕMZ9ô#£…ÇK3e¾¬ó¯/:kh¯-qͼÙÍ.ìóÖuNªºî¾ì§Ѿ¾´æÓGVYV é×UØåLDò¿/}õÇKêêm¿,_ëÅ]M=ØÓž¥¹kÙ×\Xw=æÝ]Ú£qŽÞóΦ+ꙋ:ÃîÅñhÇèyº5s–ŸúÙg<Û’­v÷f~ëÏv½^»´ùsÆž¼Þ¨ÒÏVmÜãÕfUÛü»VXò=/>íÜÛn[­ÍÛ&~ñß]¹ìæTöï¼ú²÷3Ý=[G=çšç\gí×VWÕ¾8]×Íj´E;8³?\ÕÍV®øqo5MlÉÅÓLMW£¼³¯÷Ï+ù®»-É£®:¶¨ç^ŒWjǧEz(ϧ ±W7Å9öÑ^›} xûã{®üν¿:¾{ï?±‡n{slÉèfÉïãSoumñ}¬–eïÐól¶¯/ÒçTÌײдw]v*³¾ugªzªýLÚïŽ8ˆ§Ì¿,èÃ6FŒ‹´ùúª\Î^íË¢qôžoÍÌÍÒÓMèhÏ}RÕ~nxï4EÙ´dêþm«ˆ¥1bÚî—}NMQ^¸ÏÜäÑ6EQ_§‹¥±VmÑf{óﻋy›¨»Ì³EYvÕÏ7fî\ñéã¹³|kšé×G¯·îÅŸGŸª»{³žðìÓ–úrm«ÓÃÄëÉšmÉoŸÎÜÓÖ=¾~úx¶ØïœÑe¶f³wdõ1qÅ4N>ùâk·%½uZ,‹)íMœtž:ê0Ù3us*šïò@»îê¢Þ¨Ù5Q²µãšyçšãES=öºŠõñMújsM×YG7á»›fžlælëš4«¶ªõ[×WkÏ|×VKòÙ:qçŽzÑo9ýfüù}\ÔÕéæô<ßF¬þž-†~ºÔÉèUÞ|þž 8vdŠøwwŸêùöGñŹõkÍéQ΋ñÍy¼­6yöç颷69ªÉ¯º»ê'›±êʾž¦ªú%×q¡ËËzYïéM×ÑèÑÕqÎ]™4ÑÅvWÌLõsÜÄwVê­ÏÞŠºánzt÷9´_Ÿ§rß̧ž¸º»ùŽôèËšÙ‹¨QUôêÍë`ÑF¼Ë,£ey6jçgwT[W]ó‹Ev鯚Üõ|ÎL~­ÓžÛ3ßR~m³ËÑóâŽ,ëŠÓ<ÝÄî†Ì¶ÄÏ‘d¯ˆî›)ë^No¦ó6Š¸Ýš›ë–{x·¬öJŽóêY×\¯ñ€æ.O1¾¼–NŒ™´WSÒŽ™ô9·º»æÎ{â.ë<ëÏ|Wvn¯‡Xõ,Ë|¸âþOKË™¿3›x·z©Žog£­Eq¦™çÑÇo×zžnÌØ}\Õ} M;³eïÓñ·sÕù´×f]:¯¯ÌªÜšjë6™œÝÄe¿yè³OQèß•éyO>ü´h§TÕtqc&ެÍ<Ý“­Y*k¶¾øâê»Í£Ž{ÛÍ™uhùð:gˆÏÞŠn¯º{®®êÕŸ˜î¾óó7󣊺æ,ºžº]Uz"Ë2F‰ãŽô×Mzs½ nÇÝÝöMWùþ•¶ÑEv÷óÇÙNú©ÕVm–W³$n£Epº‹¶æ«¬´bîÊâ.Ó»qéÏÄ[êsŽø¯¹ÉÍ;éÓ–‡wã»,ßOY§Wz±~>;óñè³Í¿5œçÑn]q®¼ºžxî»iwÇ=w÷AÏWÕg]Unßès³¶U§nm‹üÞtqq͹⩘åÕ¼õßUÏ7Ut]›¾:žtå´ê,ç7©Mt÷ÕÕÝE”wÄ÷Þ½4_Þ.úÍNªzÏ·›²§«zë¾úű¿ÏãWhÈé\w“M|W§-{¦~Ÿõg-vé³5Û<û¼ÝÙfŽõÓ]Ù¸œšè»5÷Fn½ý¯&Œ9òM™¹³e\åÕŸN{(šº¶Žû¶¨’:ä„õM}óÝ_›»:ê| Þøî#Usc«rÇçæá_ÏWçæþQÜGW]ÌSgUlÉ6篭Ùyô(ç«U¢Ž'eU£Uøu÷Ÿtñ±ÊÌ×÷¢ŒšòËÕã%—ÅôS§‚Ûüû"¾½L:úgdz½þ©åÙëxÛ,Á¾ºõù~Æjóúc¶9Í}q}¸®Ë²ÎìVSƒFJ9Ï~iâç›+²­TÄÙæj·ˆ«f~'›U¤Š®«˜Õe:êë¯ ºÚ{§M~–noS5÷]•We\pªØ‹xï™u3Uöæî.¯»ªï>–gZ·ãºo¢#¾èîj…üMöuw|ÓÏ|E}Ûš­ÕU»Œš´W®Ê꿼÷çôü«¬š,ÉÆ=·QjͲ«cˆçgxîãNŸÒæÌ4zµ3uFšuäá¦^m¼éã7«³Èß›ÏÑçÑu|_E–ÕÏ]E´ä‹ûÏÅ‘Ç\¹ÕŽb«ë³…qÜNªthÏæ7÷FŽ{³êáe¸åe5uÏ]åSoóÒꪾy²­W«šôqšÍ\ºŽ¹‹nÏp겎ê²ÌvѲìÚ­ËeÜñ·]ÍÞm¹vhÏêù3¾©ÏèÕÔt¢Þ/ϺŒÔ뮩œµk¾8¿ºªÙæG;¸­uÑ uMÞ.î»ïõÌùÝ_›u¹ÛšMs–9Ь]U<ßÖi»¨ž*³®fj¯] ¢zYG\sß<÷Ïz.¯Ÿ8±lꢻìžêÏÕz)WU¦NE·Ó@U³›Ðæ¾m²‰Õ<ä¶úi·‰ë=ç뙿‰VîÊûsÒÊ»æÚœO1¶¾¦:íÍ×+š1ú™:»¨£^_C>š2Û£º*ÑV˜ê½ÕÇuÙDî¯-Z£ÐÁšõYçkŒöQèu‹Dêò½ <ê;Y®˜Õèyš<î´åô²qÒ¾âß]ú^Eá׿p²¸¢­1\÷Ç7cÛŽü×WtY–ìöE”ÙOVU}ttçž«‹4Y[}~8M•èå|Mzb¾¨›'˜¦ü‘Ï\G2™Žã¹âê´ãêlÑŸ›øŽ¦UuÅ›<ÞôEV[eÞ¬S֬ضբÝ~yveÕG]ÅŒUeº1nɢ힪¸£}˜L‘lzTb¶x×Em”áÕŸª¸ï½Ùóìò©ô£Vnj¶Œ¾·éùZ/ّ檣½eµÑßVÅR¶”Ñ=qÕœØæ˜²r²(™æ¸DO:ºn¦|yvU1oLºûf²Ùêç¹®¨®¹™—qÔhåÕ]U¶Žº«¸»?÷Õ¹­YÍs«4õ\Ï£—NN´f·¬¾]Ó§¡8îiǧ'^”`ú7.þmÏo§˜ïÕ‚¼¾­~^­Î8ÇéùõîKÁ×§%Üæú ´eÕv˜ÑæúWõ–ÊœYLlÉèxÚcv/2\qÏ®ÃßQW:¸·?<µÆntr©~[j¿?7Ó¦š,爞ù×ß|u«Â_lY6fÑÝq¯š®ÍÞ¼7eâ9ꪺYÌÍvYÍÑšËS×£7s¢™¦ó§útÑ]üqݕƼÚjÐQnªwq]{.É &­ô÷NœZ¦zòwêɵ;«Ñë|ýM<Õ¶›qóm\_4âôrkŒÑ§?Ü__¬ãSVÞ|æõ0hë%Ô`ç-µÌÍ\ómðìœú©ê¹¦Ê4ó^¬vS¦½X­£Nwt9‰êzºê4uߌ²{¾»;ï®ì£ª´³ß†4gŒÚñÉß7q<­‡}óÅùâzî×1Y£=}_]ôsg¡åz<ñ4L÷otìã.Í•Y‹ÕÉÏIÑS}Öñ¯5Y­Ýš,ß“.Š´çªZq_ÕÑèáÙ‡Vn¼Ù¯OYcEèæÜŽïŒž¯™³ÖóGŒÞ¯:s±ùÝUmQ5×›_;­dÎS¦©®ÚSÏSu]ô¦9î]÷ÅöCÎ]<Ý;èâîyæ½\LÝMSKªc¸E³Ç7M´iÏgn¢g›3wÍ—æ¶ŽöÑj«)ïUÝד^Î(ÙbíluÅïŦ2íÍk¡9¹âÝ´ÏU3Ñénªþ/Ö‹6øó™#v ¼û£º¶ßçuº,«5¹6YUfšüÞýÅ_=e§fZ!EÖgµUÙú«¾4MZ²lÏK‰º»3óչ휽Ä×1²Éºn·Â]×Ü¿ª(ÑO©‹«8¿Ùù„sÌЇwG<ÝÔuÑÆØç?Nx»†‹3÷šÎªÑ<[eÑÖžyïŽ[5à×—f¬éÕ9îÍýxã&Ë#&Œ]ñ¢Ú4Ó¯š4}ƒêÅþ7¥ëY“š<³šhóhÓgtíó.¾«²×ŸÐÍíeóuMZêóö÷_9jÍn8¯G4÷ÍVÎk"4åî¤Xq¢rq¶“‰æù⾫©Ë›8²è±už0Ûº¦}*)žïš¯Í:1ÛM1ÌU<º‰wÅ“Õ|ÙÔsÕ±Ô×V™áb›9J­]Å6ÛW6ñ;sߊþ¬næŸC5¹õUèyýE±Åz«ÇêÄ[áz¹®§}S¶¯wš½ :ÕWÖ|î¼YrçÕ×Ïzžnz«ß›93êš{ôpWǵOê]æ÷—Òó4÷ŸÐÄÁ–Ú±èštææÎz‹3[Í\i{¯¾&ìèëž/‰¦ÕgÕvž§¯4e²Óžúo˜é¡FMq9;ëŽg2'ž¹žÓßQF©¦m‹”u¦Š{õ|+<ÏsÊòÜùuó‹F^˜ï¾"Þ=zê§G>mÜmëšôfÁšß+lÓ–úSßn¸ˆ³Ž²hãTùú)ç»3Åùîã”õOtõÕsoJôíð€se¼èæ½ø÷fëf~3ßMÝ×RŽªê©æc«9ãº÷g_W+Õoh¡_vs.çµíÍÖ}-¸tΚ9¿w2kÇÖ¼õzž^š}¯*Î'%ùµuåëÓ8öí§ÖÜ×g§Íø#Õô~KØÍݾYó³æÇn~¢:šíæ®óNî÷w›&]5ê»Ãõ©ª¬Xoâžtu‹½TDÄS· û||æô|ûªæØïНÏg=ÄwM=ó×|[§/{£¾ôgÏcDóVË}O'Îö:Ë“$l®tmó¾·Íú›£OÐy½¯{?‘ô>'¡‡Êïçº6ŠüËò÷W:qz¸iÛg+)¿­#‹ò³æ¢öûð]£Š*Õ\WMÙ¶u‰w}ç¶»ò[mñÍ=JºÓes»ÓÏo43q:4qÒxîŽõy»ñuÖN¦®«‡)‡|Fˆs1w16D[ÕÌ;â4×Eº3Æ]ÓŸUÕfÞ«uõ¦¯CNNý*®lz}.òý[¹ñ;Ïw1ëã·ØúLÛ=<¿Eàú6hÙš¯G'tYWÌú¾5f(óòG›îåÁ¢kžîÕƒ×ò.«W—ªÝ˜Ó—#%Ôw_x4ÑuµÎ[ã?wg»¼óǧŽjÕM¹mE™n©Äñe= 5qdϘžçMV]Vê:義ë­9¹á’Þzãšyê'“§]Øë5ú³õóܳž{YŽ-ž}µú>TúóV|šxÕMªæ¿/Ž#G2ÍUõõUÑNŒôhªÈîzï¾btªžf­QdpŽ¢z³m3ß–žø»´Y»4÷V‹8†{™¬ËuqnXåÝn¢Þl‰×WT4ºÎѧÌÙUsÍ‹)îè««hïOŸ³5ºi±^¾£R‹§nZ5uÜúñƒnmÕÕuóó¦Í^ÿ³ž>ή~šˆºß#G±³Íúš<Ìé£ç#“ƒç·yÖ)¯±ORçŽêºyÛ–ÍÕy@ wÔÙ6Ln⛳μ¶Äá:â9«˜ï˜—|wLvîþó|ñ£Ž!£:ËsèÏg6ñÇ£^j÷ÄÝ];skîŠ}N)›½|Z|ßCN.:Ñnï7w•ƒØó½˜÷v{ú¶ÿ'é¼?¨Óçdö¼½4`úÊßåyµx¹0×çãËõ×n<ÏWß/Ø6å˜ô<ësY‰Õ”á¢zë_8wæâÎüý6QØš;ê7âYE”ÛÁgŽ3ghžôið@²g»x¶"ÝcM6ãØËm¶gªÎ9ˆ1¢5hëŽÝ×ݘ:Ñ<Ùžz³¨î®=/'U÷¨Ž»ã‹Ñ5z™óuíù»¸Í£ŸB®l¹F›|í5fô4zsí}Oú¾¦Hõñz¬¦<÷£ó¶nð½O›Îù}ß!èüý4wçl«B•US»4wVMs]ƒ¼WYãè·5ï7^}tg·¬÷]Šþbº¶ÓÇ<èç•3v²·yÜ¡1l[êâœ@£®ºêPö1ÝUÔÙESÕ•ÖÑ‚§SÄ:sÔu;˜é\º;×_ïÇ·4EÙõÓ»Véç~N³jš®·Þ|uºÑ‡e½Wª¸»ÛùÍY>£?‹ª>µëßõVùŸQF¯C^}X²uîz¿œnÑcæµÙðõâäðhÑwSKvS–Íøú╹usš)稳¼ô﫾yÙŽ½ÿ±ô]ïÙîüÿ£u~×™‹W±æ{žu=ìÁ…ì|çÍYáx•ßóÝø÷z˜iëÈŸF¨§õf÷{ÚðãÓùoŸö¾Kœtøš<k˳'£‡7yý<:xïÉßF›£ž}™5EñçÛÝ]ÔqMùê²ÙæyÓFngU4ÝLÛšÌý_MVDqÔXµ÷›Wš:飬ڪºÕwñÝ=uVŠs[ÖuqÇ\¥b»'»¨ë¹•–Ù–uæêÑ}µU§–›)ž4Uêâ§sʺÅv÷8}~ègôj§Ñeë×ÉG;hßÞŸO~ŸGÙ= ~Î{>U—èßóþ÷¯óÜjò½ÿói£Çóüž>wÓðýŒ¹iÙEôgô<K&Ï'v?C4Qéùù4Æ}QG]uÍMÌj;ø›j™Ï1^ˆª,­ÄóÇuñ2ž¦éO^x-Íý÷oJg‹ìÉ3ÆÜ“Åל‰Žù뺻ë®g¤]evõÆšèOuÛݸû¯OVÙ—UùÝß^M³µišxºÛfž;ÑVBîñéëÛÅVm»=yô=I÷ðz\y:}ßžÙêlÏ4ÕìüÇ©‹™ãçðq›“ŽÏ6nÁ£¼¯•Ö§™b©õµxwd¯¿CÄÑžüÚswªêñjÃUÎ{Ç£6ŠãF~g˜âÞ³%wÄñ‰ž¥®”ÇžuÏ]Í­xvÝž:¶2è§‹#4æîžéæeg3ÚÞçºëYÇ¡“Yn¦¿N9ͦ«£ž´w4úy¸²©¿/;Ñã´bõòEêêÞ,ÛMÑ~+7ißϯéU±’­œÎ½z0ú>NœzTãÍèù_;Eôü÷‰·<¬ëËÑVœ2h§ÕÅ:úû¯V,×ߎʽ FÊðz¸:ž±wf[1m³%FŒÑÉUõSÔwTóç«&mº¯4(ê4÷5éë.«z£Vj¬­Ý|«®xâHžfzçU}w]¹eÖ?c-}i¢«,ã­ñr­wUosh¢ïCç¿›{ã¿W-3Ï^•f¦vžpõfJ¯ÛâúüQÝü÷‹&¬]àÓ’ûrÑÆŽ&»¯ÅÝ7æšæÞx˜ç›Íö»ëŸ430º«×÷~KóÛUœÏY¯æ™:¢!Ì#¾n§Gqmz&:.š¬âÞé»»2éËÓN;¬«ÙÕ‹&J‹o«4{=šðzùâsk·&ܹ÷[çm¾œ½k£Ò³«fÞü/[Æô¼O£±ž}o™Ñ¿ÂôêÇVüÕjñ=O&}¼ø=\|çѣ;åîëTäWÖÿ3ª¸ö(Ç>Ÿ¶9⻫óh‹³×UÕÑ,óú½“GQ7çâú)ê¹ïˆëGGS_¥á¹êm‹VèÇn}Ü"¿ÆÝš+»/¡Ÿ§%:mòÙ®ëxûµ]åîTÛE½õmYkÑ_uuùóâg· ¼×Ƭ×ÓÅÕsÏ6sÕ£>Œ©ˆê;ÑÇvñ<\ºžî¦Î6ÒÛÞ.t÷^nùÙçBÊót‰ˆï¾y›¦ÊtQÖÌZ*ëákq¦®Üè]NÊ;ç&Ítpôq×m^®z8ÑvGÌS“×¢­Z|Ao­’¿Vsåú ºóú~?|kõ¬§›7øÜÇ£]Ù«ÝW<ÛÜóFÊ7iÑæëãÐá‡ÑëWnNüM·wæÌ\ÅÕ·‘·Þ•M<ßUù;Åìù¶y^Ôáô'Šî§fÕäúÙ,«:Ž©óuGÕ›o9µg›y®x»Š¹¾ˆê&z<Úgôü0®z羸ÐêË«¶‹&ÌöGPóµ[ø•nÜÙ3(²zêÎòÝÌLu=ñVüv[]Ó¿/V٣ͷDu×iÅGwækœ¼ç¾þùÅw\Wm¬ÝY‹o—îáÓ1ìqkW‘ëõ‹f<Ü´UŠ8¦Ú/Ë6ÝÅ;iërÞ} ‡^W­æë³?Ÿ»CÎ×Mô]ݾ«¸Ã>–.qgÝF}˜ç+޹ï<ÕÕ–ç«QÍ5uÊ:ŽûžîæÊ´Ñç Lwhë¾;›keÑe[ŽÉ¯ªèéÄJf;™·Ž/³Ž«¹Åõñ.ùé»;9‹uÇã>ÜZj·¯GÉî”LêÅŸ7¡šÜ¾·“v˜§Mù«ïŠm§U—í˾ÉÏÝz<Ïs*¾7ÑNz;ñ÷Ó²‹iÒ¶6ßoUäôêîš÷y^‡›Ý”ñVÚ}óYfM^vŸ;|ÔÍW«æs›Ž²¢9«­¬«¨¯¬÷g¶žñ=sÕ—ç»|ßG˜˜LOnºqªþyµlÉßQÏD×ß=&u½Ñ:²÷=S«<ÍÕq~ŒVÍñw(ôðú»çv}XóqEÞo¥ƒ»¨ïÑæž(îÎxª7ùº¸ËéÛG©FÎëmóªßvLœO^mêežÊ+ôróëߟÒÇv¼^§šô|-¸;²™ÕLÇ£›¸´#g•¿ÉßG™¦ß;ѯ$fÇnMù»©DÙ6瞺Ϛyïž:‰³›úâ軫©ò „Ë®-›cv~÷äªÚt溪9º—1J XãE7r»Žo¯™­ê¾«ëV+úçÐÇfê®æ‹=|Ni™³WyówUvä¯F^ûºÌ÷º²œVwŸU¹´ÓèÙŸ»tQšýnñ_/Ð&Þºóû_‹_Uú¸ôݯ¥Vä³&ž8Žò_e*µ¶0]vN=Lþ}\Åt[–ÿ?^yæ*çªúîšìšû®®,¨Ž»¶ÈªÍTÙŸG–˜JV[ßè¢#‹z뮫Dæ:®—1enùï½5p¿UyjßÍZ)º+™æé¯LÕ·7[y³V=¾g©‡Nm2£n*£^]:ÍÙ;Žý+w4c²¸ÕNOS¦þ3Wº¸ß‡VjúŒœQFß:cÔÁÇ~†}]_åû×`³gŸE6ù›{×åú™²ú5Yëy;qwÍž>¬·™»ÌtgӒܹìë¾)¶ºíã‹©ž8ŽóõË®¸ëG6ós®/ñ€ …‡}ófˆ§Ò§š¦É¦Î3jqM}UÇneu[*á¿-úh®Ì—YNŠ&ÊtS~{ž¿•|ûywãïïO7™Öê;õ<›(Ç6ónM|ç»ÍÞnî+æîr[ÆÙ³­—ùºp_;¼íQן¿Ï¶Šzœ×Ugf¸çÔ³^YÕVªjòý.ºí¶o¯[6ü¼eÝŸÍâí_çhËΟêøEž/Kg»æ<êôsŠíXgNìþ¯uêó,¿¯2Ø»vyÚñõÌ䲞òóÕЦüÚ³Ñm0âÇ:jï½4÷¢­¹ìÍå:ä;éßrôÑ›^\z;⬷Góe6DYÕõÝÅŠ.®ü÷D͹íç.úô_½uz^_«ÞmÕݧGèìñúÍêEׇŸKÇ·n^éÝNœšé§¹£¾ö©Ó4fëW“²îÆ}ytáë>{Ôu¢Êeg^ß߯ËÕ‚ü^Ÿ3ŸÐ§UºÖd×VJîªõd¥O~wU×wæÑeTmÍßR¦©žMœ÷¢‹ú×›ªt_?<¢g›øëG7`ÛUýw^•Yïœ×㳞9ž"yµ§5½Ulñjêêï/£Ez8êzɧU]Y¦ž½ k®ë=úoâ^6k´ôª¬;5Qt©×/3_=hÍ£>Žtw“Uz1êËΆ‰¢üóFGÇÓÌç×vœwÛzërg¢¾úÇÇ«MúÕg>¿ßvSÎ9îÌ6f«6œtÏ5wržk¿6¼|GSU="fÞzîÈæî¯¾ªí«Å&1gwSeÜ÷Ý];ÐÉfm:±Fk*æ8™[Ç}TÑ]ÜuZëêEmô_VŽW°{TíÏ«­3O¥éùÓÏ£]>™Fn®×‹6‰4ÔçFKÍS×]—Š,ßçjó»¯ÝÁ²pàïDøÚxõüN½uO7Õej4w‚ûòy›§¼z4j£o”ö¾oe¾G~¥~TsEu»¯^[¨æz¯‰ëFZUYG3˜ÑÝ]Ýëȳ^J¼ À“E_ÒÔhWÕ[»§8lËd*ÏÏ\èÍ×k;æÈ®;›x²ª¯ïšì²so¦7g²-ô£͵çÙÆï/Ùób«+ËÔN]žfþ{Çn軹݅_[7ù}ú>]µYç{>.ÏCÆçÕ©Ÿ5¹­óouèUu;±z³á{~G«Ž©Ëu;|ízuaÓêSçÎý\Õ7y—S‚Ú"ÉæŠm•\馻!uÕLY\Ye:b-²÷7÷žËïù0ºæÍDÅ´Ïj»-[s[ÔeÓŸ™¦Ê&»ùhê9·/|é¿-Õ[»ïFm™{ïEܨ¿Ñ£¼Ú»Éês·›s]‹ºy«.êìçš3iS£Ž´w‡Ó®Êù±84,ë,÷›v¯&ïkæöGTe®ÜÛ»ÆõöÛU|g³lâîŸ&5Wªx³é|‹ôç³=•eÙŽ}/Û‡3NZ¥ÅÜYçõ7ÕEÔw~{òñä÷o6FšôæÛÂ̶éù°(˜ž¦,›º‹,ËvŽsïâ­TÕE½p¡_)æÊµWß—¾és~[ûëYëžîæ»öÛÉÚtñm}Ñ£_gµã{žvZ|hyz²ÊìÍ®½ÙlÖáÇ'y½÷³ÍÓG}\4]—?wQ»Í·N=^·Ÿ:ñQ²½Tùºo«?j¯z‰¯9ëš;ÍìùµÓ³·ÍÓ‡½5qvUõsÕØì£šåd[u”Ùsž5i«›#¿š% Eõ/æÛøŽ§Uz³Eç»/VSeºˆ·/|[×sv}X¥£7zóMœÝO:9ÑßU}ßC¿OÏô¶aóô»êްק§n.5y^®[ðîÝ5Y›7ÓÖ{-ÃÇo£äÕÝúl®½2ì±Ýù½[üÍ3†îzôió,ÏÏs^º½¿?×ÉÖÉ»ÌÑfÒ«hñµ¹É¶Ü4÷Õ#¡œ—S¢º/«U™YG}[w6õ×sœj·;ç€g”õoõÌ[3dk£oˆªÞ³Y*ÑÂ-ï=©ª4Ñß=i®¨¶½y-}]ŽÎ'|sÕzû£«é˧,ÕΊâ)Û’Í´Õ×}[¦¼ûú¡8ìÑÞz¬žr튫ãV º°N›ò;£¨Õ]XšëS£º2èçwG³EÞ•_«æo£®¹Õæjñ­šÔO1e6q’üó©M“MJì®Þm·‹'-4q¦QèyÔùÀwÅôõeùíï^[ÑÎÜô®–e§¬×+¾*æ«zu]—SÞï'GU,æé¯Ù¯çO=ÓmÍu]E Ú#^_WQ®»sÙg]dÛéxÚ{êqê«FŸ?^<ú·Mø®Ê¬ÏÖ;Ÿ_¿*ßG6¬ýÙ›‰ôü®oËG¥G—*ª»Š4wºj¿¼=^¯~V̘tç³?|[ÄÓeyvY§ªë™¿>žêwG|ûe”O†ë‘Üs1Ú5gÑ;*çu4»‰ÓÇ5GsÖW=ѯ5ª{OÔìÇt³÷N˜¢úæ6_u{yÍNÚ}/;˜§~N¸çÐËÓ§6‹¼¿J+ï6m^Ï~}{-Ívy¯­\ÙÆº'V üýY—wƒ¾ïÏ·_›éftö¬ž†.ôyZ£5ö&ß#¾ô錞–¿;uM^·ŸOWž)fï«9ÓŸ™ÍÕüÙ‰1F…üwM±ÆŠšbÎìã>Lò˜W3lÝÒ½–fÙDi«gÕV¬y‹¢¾¸£®wäžkºlÏõÕ|hæÌí4úÛE{iãÕ¦êo»Ìºº.âÿ7Fž;§žzÍ¢f‰ôoòoçDsvìtèŽn¶«iÉæúwU/Ï}¹ïç×É=ù¶Ó«%—bŸgzïŽèæ5yºm×_l£m}秨»/Bž;W²Š«¶»©ª½=UÌñÛUõ§¹îÊæûi¢û£(ž“eüÆÎ'EZéɱFüüY^]ÄæçŸGÍõ誛kê:…wÅÔN¼½óÏ{içEmŽ:S›¾.ÁÝ:{â3æõ+ŒVßeÓèY\W¶+ºû£Í×nk°ú¹™ëæ”iÃwéã¶=QÅÓçn˧5œNš »FÜÝWF®·ä¾‹ïÇ¥’îü=•Y™E—ÕD_C®l³/}dsw+âê¦oÇï¢ëøÓOy¸0˜L]Z›«ÝƒÐçŽùŽnÕ¸§} (£vzlÍ£=õØã¶Ì˪¨ÙWUîweÕ_л.­Uyôæõ1ç¾ï7vm^n®®¦›çŠý†z»$h¯VŒÞÇ—žýg›f»%Üñ£øêf›s¹Û–ö{èë•G|ݘÚéÙ^OC©çЮÏ:èÇÍØcšîǦk+ª‹¹²9á0‹8ÓŸ«C9ûãeú3Æn/ãÃLÕ“ÜmhË}žW§O—™c7:Úq+¿¹¢úso®½ÕgÕW··6óÄÕÞ¿>ŽlÍж;šùâ%°®¦{¯e'vuÅ:zuÛË/>P0’;æ&c¾û›.Žt]ÍkÏéâÏ¿Š;£³ž{ŠºwÆ{Gп&‰ã·£^ª(÷ñÎüu櫺ª×‘èq–½y"Í^~Œ}Û:°Í–w‹Dèås»­ª¯oç¶fWžêkÓåÙe¼×g§œ¶eÚ˜çýù›|Û7UmX=O/w4뿞‘žížm•ÙWQÚ«ìÏ\wÏ\wuWtÓª›:Žïͦ‹4e\îÍ–V9çÆ&&á6ów¡Íø-׆üÛ8¯ºnê*£nX³ª,šæ#­4qÅøŽ,ªÊuuÔèëW_G¥åèÁÇtè¦W”æ·F|›Öã§Utêϧš'u[n§üz­òý]~W¥W9sæÛŸ¸ˆÝEZëžë£«uùz¢/Íl”k²ªo¿wYßz²qf~üíÓz®ªµÐ«]UmvwZ˜¥«‹-Ë.ãeWe»ºôá¿^}ÞFœÓä€&˜HêmæËíãŠâ»ùÑ—ººÑ_wç_»Uo3W7ÑguYÔMøï»‹fØVq“ÑÍ»¬¸óÝŽþè[›®æ¬×õW6+w«›2ïͧ®l²qnÍÅvñv:ê·¨ªü{©·<]–ëðífô°mÃu[¸¦«*Ûž«l«TêÌë¬Þ‡».(_Ï›º‰‹¨ãG<Ù–Þâjšúå®qiŽìY—Nœ7Y_;iÁ×>H0›¹·˜ØY[Ž´3ßßË£›;㎬¦ê,ã\Ç-uÕ]‹+º‰ë”ÅRõyÇe¼÷ÅÔóÅm–ùÓeyèÓDqw¯¢ëèՊγO][6ñÝ:üÝTßM>†[j¯ÐÒóz5#¼œUί>ÞÓ“G8œ¶MK3ß^Œš3i­ÜE¶ÙÞ~ý }W£œt÷W–˜L&ÄõÌwuÕÃY³Úm¢½Y.磺ø»EvâÑ›[Ìv+¶,ªü÷qfÎú£ZzÇèù;²å¿>ݪ³Žc=ÙwÑßThê©Çªì½,Õê××z¸Uvz§Š5ÑGsNK·ù5èžvbŽ¦Êø¾ê{â›­Š®âª­²›§e1¯%¼õV¼9ìçWjÚ»·7qIìSM´wfŒÖDñoÝ®3ÄÙÕU0E8À‡|ÄÄLwÔw;9¶¹âÍ™,î)£f~ý?"å(™î‹Ô[Î}uÏ6svmUݯ•^¾ æ3q~9Ž&j׫7›âU×Õvñsš-î{®Ë=_?Òª»yã»ù²rhÉ–Í>f]¹va¶®'K5¼¢èë5qÕw×_kÉ×\i¶¼ž¶+©ã«*¦®¹³Ž'®6u^hE•ñ§&œZhÓNüýÛÏ]nÕ¯4Uw—‚¬š|Àßa10&Þ¬³V lªûxæ4óÄÎzlÙÍ3ÂÉ‹²wÇG]qv>6T¾îµÑ“WuUº»¼éÑM½÷Ò¯?è§]O6sß›£ºï¯Nú=¿Òïo;B(·ÏË»'z2M6ÓÅÔi£œUs®c6èÓæïÅ¢¹ÉlÝ]ø÷Q¦üß«']W_Ÿ®ÜTÝg6áÑ×U]˜2Í–iª­ùº½s¾½õ1ùWdð¶g§(a0˜uÌÄÇ\õgÛ^ºudÒïÉŠû§»é®Ê­žxîü¶8¶‹ñ_6PºÊî_FžnÇ­F®²N~{ï™=cі鯫9ãšfêîçŽ->…mÍ}Dbø±÷·ÏÑVz¦8®ÛùÍ}z2õtcÑYögê|So‹¹ªØŽ/›íÙ³©úûó*óªózÌ „Ç\ÊLh竸ô0Zˆ·nZõbî»ñYtS]Y’Û³óÜM|ÙÜhËÇz·c×›SEôS§==Å}ßL÷×~}‘fkµa‹y¶«3_Ç®{ÑçèË×É£»(¿Ž)Í:k¦ú)»ž7Q¶¼“V]ô[—EQ¦Šõ*³—N=^4fÓ^ݘiç®m¢Þo¯ªî£©µÏmtÓÜušÅw׳5½ó[·º1_Å5õšÈ³%–dÓ9º¿˜¶®9çºöSÅ‘Ö}£VòëŠL½V ƒ®@ê#¹æè¶o®.«®»§¥z+_’zõ¦Žg›³Íô×+š®¶«³éÏès–ÉÅÎmüÑ¢{²,¦ª:Ín+²\#­ö¾šªÒ¯f|NÌ}÷FÝ”q]Q­—/7ÓÍùî§ìó4Gw.9[FŒó§?|Ò²Ž.ªÌýYYuÈÀ˜ë”èžù¾Uêâ×}óu×|qTèÕçÇ-H™¢ûy¢Í<Ó¡ß6hÏ~Ts8z妺—ͱš­U]š»èãLD_ÅVqÇ\ç×V¾nÛo«Žr躼=gse[Ý:y®:ãv+*ïO7å¶éÏmkrßnG_—²þyq‹^ýü¢Ží§«ñw«4s*VO×ÔñFŒQz¤qÜ"LLLL$™˜²ÊfîtuÅwºê8G5jSa}¹n«>«óÙU7]ŸEš#žªéfU<ñg9´jª4u™u9cÓÃÝtÅ‘w6åâÊ.º§#¹î¾oéžÚ)ã®4×ÔódsVŒÚxç½3[ºïÉÅ”zS‹E;²÷³–}zj§¼Wåâå9öâºërcÙW{±sצž8›¨wW6U<“É11× ‰€˜”¢ cžïªÚ×ñ>†sÕYìŽfÚù²;¾ªvf멪ŽìÒ¦u×o=äêëÆæz§ºxÝQ¢ˆŽ8‰Ñ–-›3òêÌúóSouÙu¼ÓÔÙŠúøê¹‹*sQDYg²UßžüÕl˧=mT£g]´æÝŠkšuùõ%ÖÍÇTO}gÙ§ÔUmN•ßey®ÏÏ|s•x5S»,tYñÇWE¹âÌýåšùë” Lr&(‡|a0&÷ÅŽî¦ÅÕF©®žúç¾ùçºm‹iÛvžüíÙ"ï}Y§”ÇS=VÑž"«k³-¶ÅqDñe]ª‰‡ÇsßDum6:‹»Ê[mYÍ–ñÑñÔÝ‹^mWS¯½Í>uóFª(×—¾ûru_=ó£ µ¸o»šcOh¢kížxã©C¸²xëO3_W×6SÌwm+:Ñz»òΪ4qÝ~­mtõÞnó[“Œzæªë·-Îk³˜ã˜áÈÁ× LÁ0ï‚`1esdX²Ú´W³-éªoÉe´mɪúèô,¯ºuWž9ïŒ÷«˜”SlYs~z&È©gYÕ š-ãN;-¢)r㨎Ç}Ó­_|w1]•l˧½wMøóÝgYu߯º—Q¯9èí—Š·sU´]Ívf²ªeÄÂa0€L& ‰žBPÇ\¥ÔÛU“6×rêlâ«,§½þ]ÖYv=ý÷Oz<ýq]=G=sÙÍýSÜЪ6eÓ—ªïáO]+²hêžê牉„õ+!m;莫=œk§M\Îk8‹æ¶6mãeS“\õåiã'<ÝEÙ•ìÍgynÍWDL®A10%I&À ›Hë­5Û,Ú¢–žrÛ¡›oY­ÛŸ]3]ÊóhÁ¶1sß[­X¶w=ÝçzèŠmŒyoÏÏWy¶ëó.®Ø¿<ÅTó×(˜˜L "`LI €Âbb`:å0˜% ƒ¹é²só§šïŽí£Eq«ÑcÕÞ;sÅZsÕO7qÝ™¸·›­²•^†lz3õÆÌ™íî»øæsÍQÏ\ uÌÊ;ïŽã®´SjÉ‹øÏW©ÎFì]uMÔjÏ]–èõ¸ÍfžðuWŸ£Ï¶¹ë®×6Ñ\ñÀO=r¸ä®A0˜˜˜˜uÊ`r£’f;ë®î˜ê»"¾¬Z²v­£§Ã ¹oóµÓΜž†+éï^jº»Í»½¸ûç/Vʾèr«”ÄG\L᦭ÙÇ}sguhŽ¢]c¿¼Û²õ;q_ÎØÕ]zrzO3Îôü½Xí³=ô\Êžg} ¸ë5¦]}Wfn&Ü7hÏf;»Ë=ç¶©¯ªæ&\“ ‰‰wÝ}ÙʹͽX³X#Em”ْȾ6qw5w©‹Ðâ¬U[ž‹ª¶¯§¹ªsÔÀ˜L ‚`똙ˆLÄÀ˜& @Ⱥlâô×®ˆëE77Q~}hÉÕj¸g¶›{ÍdlÉ«'}ÓÝwæž.¦.ºã®yu<rOQÌ$læ„uOuÏ3_(D¡×2C®e×}YÇvwWN5qÏUM—Q¦‹¶qn+®¿Î݇ÓîºïótbwžÕ3¢ˆ¢&ºÎDÁ110&0”L:æa10uÂc®fc¨žøº6fêé¯eujÍ.ÕYEÛ(³5uF‹°wvM*6Q¢ªl¦j²µÔÝO覮b„ˆu˾&z‰]e7ñÏ]õ=wÅê¦T]5wîøýõ^¿&ë¸ëÌî¤æ²Ë3ßLqO5uÊ% „ÄÀ D¡×)€î9J` @&ß(Ž¯Óšûk›øî›ëÛÅúoËeTuUüן6Ú®£‹m»ÌŽ«æ,£­&úÛfzâ*·šÝñ3 C®ùF®!wYý ÷q_z±Æš.šî§u›(ж`˜µá"¨·+†ª8¥Ï<òL0”Qa0`L&y:äê"QÝú¨·‰M~6_çkkhóº¯mWßæDfî–c·ªîÃ:&8®-ͦ9x9éëž&8 #¨AuqmœèãžuåÝ’êZ*ÒªÎùŠïÙYŸC¼žÏwûêX£mTs5WÇ$ÀÀÄÄ¡0L €0˜˜H™äu˜LIL»›ÖîótuÍõÏ}ñß|õ«5öàžzòôíË4]etE7ñ4ß_=WÅ•uUÍ}×ß „Äó1(L;箬G]Ó¨®þœêÏÑn=ýÙ:6yoëÓU¸#š»²*ç™k¾œÜñÝg|ÂbP˜LLò@˜`Ô@” O3 O"`ë‘11Ó«µS^®8ÙŸLW®Ú÷y·ìóý;ÐËyÜÑ£=½W§¼“ß3\]U]qÒ#5ÕÝ])¯®` 'ž§¾«ï«-Ë«žúç›Ù»²®éÙgvÝ;)ÇÆê³7SŸ®2õoSg=g扭10”&y%À˜LL¹˜Á0&&(\‚`˜˜×e]wnmuÛ£?¥’ÈëÐó­ëž³Mœq—¾lÏ»<:»Yfkjé é˯ õÅ}q( ß1×3õ8³ªí»š,²¨ÓžÞ¸·&«/«N¾ÞNªí‰ËÖ |EQÝÕÔU58áȘ0„Ä ”uÉ0<÷Âba(`0uÏ\ÌLJvê;ë\8wÑ7'W=\´ç¶º¶eŒÛø¢»u~~­¯®¸ÍÝÜs“^{hæyá<¬ã¾'”Å•¦;æ&ÈÕÇ7:ê®vWEÑo2×5QgW]w ×7aŽüÝf̺ië.¢¥|‰‰‰€ï€L ˜L 110&LŽ¢&Ä¡×'\ÌtÑMÖ÷]ÆŒVjæø²ÊnãfH¿oC'x·SÕQß¼›ºs4õ|g晲¹¿?*ˆŽ¹;‡3<„–_Ä,«O_’ýYº§º¢ËµäÓ}Q,»¾´ùp®Ü‘Üõ’þ«gŽ ”&‚H˜r& €˜ €&rJÀDÄÝÏ}\ž6UžÍ6×»=ÜÑ~Î:ã7~u—E×eüñΚ²êÉeSu4ñ«™ËÏu9DõZRˆ<Äu6E±Ç]ÛÏUnÂÝ‹/£m7YÝú23l¦ÍZ¼ß2xë‹+ç¨Ï¢¹Ê㈎¹Ja0À”0(LLL$‰‰Ba×"DLwÅý]^Œûªçg¹ªÚúÓVy1h³&K,òµç»5üwÒ«èâ;¢Ú/Џ˜®”&&®]DÙÒÎæ:é_y½Ü[èå§ÓªŽïÙ—¾¸ÕEÕݹ0ÛB½øø[žþrMñÁ×3`˜:æ`P`` €˜˜”¹ëJ%Í–qÖüÔú ¬çЫ›)³e/WÀî¶ŽðÂÞcª;®—vÏ6SÇ6UuQ]³OYºà˜žfÂHu1ÏwDEÜú†O^©ãN ºîŠ;ózžm똦fsÇÂ%‰„À:ä˜LJ:æ` „Ë‘0LP&=sÛ»yÓÆšiÛ\ës§ºø™¾›óäÏmõñ¯Ë»«1]Ìu§œÉç‹ù¯Žg˜qS<õÊgg®ê®¢Ýó·'sw÷“]¸ßd`ë«õfÏ®œµf݆5W\h¢®Usɨ‰€&&&%(§”\€`Q0žù×UÜéÅÚ<û´_‡m{»ÃM“WÄ]_uÅ3=÷5pçUn¼ý5ÍQÔ*ê¤J%r˜LLù¶-ᣫ*®î,§^-Óe}iô2讽£“5ԜחMWUn[V䳺:²žâxã®é®-§˜˜˜J ‡qÈ[&ª¯§1×]çº:˲¾§TjïºúÓåvÑGxëWN¬ýf«…Nzæg˜J¹&”%˜1(u×0%<Ê !0;æn›ZæÛ^þ&}ê«Óò6ðc[N_C=±ÜgôsÏðÍEôq×=×f+kuÄ£®I!0˜YÅÜ÷¢ê»ÏéyÚ;§TæÓŠ},Û:ô3rªúù·‹ñõ“J-ÑçY¦žr9‰ ë”ÀÀLuÏ\€Àb` ‰€L:ˆ_ÍÜ·quW¢®ýŒ§Š©õ¼û³uuYwdÃ}w4g§®gO Ž«jÇÍœ;§„DLHDÇ\õÈž¹ÑÇUêã¾ :›¢6ãŽù¿œÎú.Á¶+¦þ9ÍGlVÝMùW_3DL ‚` ‰€L0L&` DÄŽ¹Žø™æ{çMz4æÙƒwg·’4õž›¢ù{«®2Ù9®ËeÝqUª-§¸¦‹£ª´×ÄS&&;ætsÆŽ;¶ Y:âÉã»)·tq¦/Opó“~h£Ž"ú/Àž+²ž,ªP˜&‘¡ø™å1ß ‰‰€`0J@‚a(·«VEºq÷Þž·y´îÓO ÑV]5ÙåkÏÁžn8²'Ž.Í<ÄæÛTqÖw ‰„™ˆYWz9‹lͦÊ5U:«£›³ÙwQ£½Tg»Ô£ª3íò}ùóDñm=WW.b®¹®B`&:䘠0„ ‰‰tÓ3-UÝß}âÕ¦Ì7Û]z8³Ï¾ºkÝš¾k¾¾læDh¡COuÇU«ˆ‰‰‰€˜LÄLu]GZè¾Þ9º½9U_¢›èÛÛÝ3^Þ½o3wyôÝÇ}ñWYc˜‰‹*PL&Â` €&Àa0˜Ižzºë¬ª¯K-ºòÎÜlæª÷eÕTG™v{º®«b©ïžl§»³óWVÓ§4wR¾P(LLL:æ{æ'»ëï¹çG3=c¶lÍÖØí§Ó£ž¨îüýcâܼgÓ.§E]QBkž`L&`˜&0JÂ`뙄Âg«#]õæßn{¬ãVß2½½S5ôão—]}õÞiÏu”íë/…|âôpG\uL]W5Ê& ‚P˜qÚzï¢û¬ÏÞ{¸Ñ—ެ»«º»½˜f§¡æêÅÓqŰ꺸çžjë”Ç\€Àë”ÀLL ƒ®ea0D`Âa×2îlÑRÍwTÓ_7ßVŽzÁéçj¢œ]LÅvçÑV¿>øÕå÷èeSß,óo58ï„¢bQ1:8²«â½Q]ðïžy×U•úÄð³ÎÙeZíòósŸyoæ¼ú+§?N`” ƒ®S0``L¹˜™äL& ‰‰ƒ¾ÖumµN´4à÷3õ5Ñ9mð­îŠj·¼üì­ž{«¾ë_ŠÈ³?JúŠœÂQ×3<¦Ï2²Úºw«¬ýõÌÁ_×~»¯¯Œs¿¹ÕF²b¿=õ¸¢­ÑF~x„Ï La0I0L ‰ž@˜”L&JuÌÊgžöYFŠu÷3}ýJý,œõ]Þfê+«¬½ÍW×Í;p_Ý|ÅÜQÆŠûuMQÏDÁ0˜˜ë—S=9вîhÑc˜Ëw{i¯FZ[üË;Ų»x˜üú¯âXnë=µæ³Ž`:ˆÀ`Á0LuÈ ‰Ž¢ú8øÛl[Rë&“Í7w9{¯×myzŽl²ß3ÑÉ=O\ÕNØâ‹ó×dW<¹Â`ê_E–qwotÝ1Å{°ßÏQ=j¿«ów}견yêEøº‹*˜ÏO|'™˜ 0€esÂ`˜$‰Ž¹¢ D÷ÊþuñzØÑ—mWÚ¯G=9ʯVM¸3ñ§-Õ×~MùÝצš9²UE}P‚"H „Ĉ—]vw7òîŽìïFz®¯­×¦ùÏKžêú/œ{¼k8e»¾,ËÌqÏ`uÈ&&L ‰€˜LL10$O\% @˜ ›v³‹»šõuw|k£šôÙƒ~ qõž"ü¹æ'Nnj·º8¹5[Ö>Ž9žzå0”&\º‰çµ½ÏU]ÝœsÝÙ´sE•m©ÞÎlÕƒŸW ·`¾üù±Í׿ÉÊb¸Ïm@˜˜% „Á(˜§ ºàë’D& €À DÏ=G}j³›³ì¶‰æÏV)yÞîyЧ=¹æœ_EÙfëðدÒòïœÚ9‰ª½ú¢9êž¹žI‰A36K™»™»›èêWÞ}Úô¸Ý,ïTcSçõ¼¹«E6äV»/<ó ‡\¦& ‚`˜˜JPL & ‰€uÉ( BbnæÆ‹8Ñ7OXöÛW£‡yºZ|«"««Ãkº©Ñ9t[‹mUO1m5slÕÏus×!1)åÔC¨Žû¯«bÊ5[o§¾&Æ]½+ã{vSn~mµ§.|wyÛ3ÛOy;‰¦”&rL& €Lbb`wÀ”uÔkìªÝÏ:³mǵçëÓG•·]à¦Þ#VJ-ÝDPî»lÎÕ†Ú:¶Šú§¾!1Ô ‚bØêlã~=5Mµ]›Fm´ÏVõ£¬ú/ÇÞŒ÷õvŽü¬]dÓš­5gÕ‹M9ùžS"DL’ÀuÊ`Âa11"%1‰&/ëºï·›bõ³:kçÑÅuRj³¸ûç®sl×ÅÑ~}.sÁóÇ2Žø&%Òl·=ñuõYÄLõ Ö&½—×ëb®«ú׎~oYº®Í~oUÅ×ÌÄ& ‰€ÀJ¹:å1×!×'|ÄÄ¥k¾ç«îÍl_Nþ3zx»ô¼üº&ü·bâ¨êÇQÕœe³EÔ亽ê.Í1ÇJ% „Ä“6U{<ñÖÚóÛÝw×èÑ‹oož4±õÕ”ã¶è³¿Mvf²‹x§Šùå0LL& ‚P„À˜ë”À €˜ßâë9Ñ“FÎ*²},žŸ›»Š¨¾7àÓF+꺺ªë¬÷eÓWQu6±ßVÎ(ã‹)ºŽ:q‘$& ²/G\ZëV~wb¿¿?G:{Ï«e6õ« vjÁÖê®ÏŠ8Šk¾3÷_DÇ\„¡0¢`®f$\“Q10˜˜wÄÄÊÈîtu^WWUü³zUh£¡ÅT÷—¬Ûxɳ$l¦¾£]6çâùÍ×Å|MqÕr‚bPë™%Κû‹lŽ8Ñ颸šuq­×N{ãE¾'¯ŸÕ¦|íÙã>}w}ªªÊjže˜;á0 ‡\€&%0&&”˜˜LÝß{ó»_Ý3ªî¨¹çWèÆné·>¿:ÜÖñÏQÏQUœiªx•=ºÏ6U\ð‰‰‰Bc®GIï¾-·&¸ë•;9««ûªÛVð·E[³Õ]´l»Ï¿ÉÙUØÊë¯Fj'ža0¢HL`˜L˜L €˜˜” @˜"&„‘1(˜·®úÑ×:/óûÛÆ‹rhªÊë¿,õBÎ2Ý“Wy+·›c¾y·%–çæìÚ2ݧ¬h§N=üõm´¢yïwä³®(º&¹¶hâêû¦9BP”ºYÏsÇW[Eéæ½1M»kÕÔùû4[OWU}|fÏ5÷¦ª§Ž-¯/Žp_›G^™·šñ~/¯>½8ûÇÈLLL×#¨!×)O  ‰€ë‘0& ”:²n×g­·6ú9ž©¦Ý>e_“ŒÚ0iï-÷æç¼½Vѕ՜r¯¼õꪨžóó×ÇQr:äér²Þ/…×wÞº4U®˜soªÜÓ—^MÙ=ìûÊ5iŒVyô¨ÇW=q]R0LLL&&˜& @Hž@r&˜M“Ϫõòz×hë>[»Éƒnª|¾µ+µçW·,z8éµdSá¿Fnèë¬Ý9ŠºæxŠåÄÏ3ÜÙ]‘bÍw¢‹iï>î6å¯N+íâ­x¬çMZpkw›ÝœùãÌÏùýd™ªy”% €& „Àr0˜ A0Äõfî5õ¶¯V&ÛsÒið÷äÕV-¾jñŽÚ­ªjמoªÈêºgŠsèÍ|QÕHž@%1Ú{‹kÓ]šu׳>¿7ÚËŠý>NžéïÓòzÛ_ytUG£Ý<Ûwy{õ¾rß?/B™æ`L߀ ޹˜L €LÄÁ0˜L:ä˜ €& ‰;ï­Vo«fÜú®êŒû«ÏŠÊmëÙ7Õäçg^~¼:8hóô¶yêâ«*鳘šÓ ‰.¦{îÕ7é².ºG'Y£»/ÉÆŠsîê™êgW6GVèÍÌÏ·Éæìyñ„˜ÀLL&&˜Q0˜˜˜ÄĈ”Jg™ç­Hô-ܧGÑùžÆ/.̘cÖ®­8{î©ç†{°õÝZrÆÚûËèbš2ßGvumÍb®I‰„ÄÄÄÇSÔÍùíÑUÚ½:)Ù‘~C¿?dñçÛÛ«º¢íùtztæï_²ºó2⯚x¦& ‰‰D‘1× %`L0L%J9˜L¾;¶Þ¬Ñu¶N½]e«F>.Í®ê9²<¾®ãšï¯4æô°iæØœ›+®¬šòíóôQeq\LwÌL&&$î&m²ÕÖFûøf®íx®¢­QÎ{ïËέRß;mþgS>~¿:rñDg£ª¸„ÀîBQ(&IÀ0”uL ‰Ž¹édõeÜèÛ¦êkô}º¢hÕ–í”æ¯n{ŒöÛ‡F=}q§Œ®5åº*Ï[¾éšæ99JÚWq7Ó¶»ê»}ùôdÓ>f®ù£½´×}Suþí5Ç“¹æW9ºÉn|dæ'L%L& „&&LuÈ×$ÄÙ-½Öû#O=õ³u~x³™ÍÝð´Q_lú¸æõVÄUU\ëËÇtLs1ÌOÁ(+¢é«SŸBê}s×W£“LÆZïòý:8ö*¶,Õ¯ºëÉ¢Œ=Ñ“G•¯>.øÏ×$À`¹L`˜˜˜˜1×"b` ‰"ba1×$ÍjãÑoë'µ‡GŸ^[¢Û°Ýf-5YÅ|iÍ«7YõæÛž/¢8·%™ÎëåÍsuuÊ`uÌÄ¢øçLèçU±Üß~= <Ûjê,˧ŽvÆ‹5*Ñ‹^9ÑV[üõQO2ž@:äJ$À „ÀP˜žS3w}ÝV¥¾|ö¦óe%О4g¹U¸«Ôï¾³wž9ÍÍÑM¼Õ×yøë™Žù€›+„ÌwmsmO{¸¿OslÏ©äóž4ç·‡\z[sÇ£›EèùÜû¨ç==S›šy®b`L$ L @ uȘLu3ÌÄÂQ+¹êîöóŸV‹ëÉ®Éó¯·‹‘u;¹ÏEÜ]†û9âÈ«º,¦®óuÝ\ufhŽ£™‚g—\„ÏQßV×Þ=ÇZã­5ÝôŸ+eX­ªÉÍ~š6{´ç¹ä}'Î]v=}xëʦy”ò˜0€ @Á0LL:r&¢`™„ ‰ë‹x¶Ûzï~h×s ÷ù:]MÙôgˆ‡bk§M}f×Ïy­®ºy»7yæÌÚ+ŠÐŽ¢‰‰O=÷=ý[ºËfïC}Q£Æ»Î×Ï]LǨÝTñ6óÇ›f:+Ó‚!Ä ™äLÄr&yë’`&&&&zåH:縉ë»kÑÝŽšpz\×®¬{Õéy½WTñ»4Õ£ü·ÓÞxž:ã6ªxî¨U1Ìs1×)€J;°î.¾³³Ñ§‰ïe=ãîš]æ»U|ùþ§w]½cÍvÑU9´åónÏÏU¤žf €J` „ÀÄÀ˜&&Â`% „ͼé¿¿C¯:ùÓžkî};}4NüÝÓÍZèÓ†-Í®Þyû'Yæ3Û\ó_uÏÉ11110:sdMœèê/»o^Ý5ÙviÁèã³$œÝN=ô¯ë÷•¯3GsUUuó\%1€:„ „Âa0˜˜À˜&rQ\“ÄÏ$ êfÛ»æûؽÚ¸º½>}Ûj·n_:ÈžùFJ½lÎ{³ëã:Žkæxç®xžb%9 ‰‰‰'›æÙî7h¿Ö«ÒŠkÎç <úX»ãš·÷‚};šz»¦ÉåÓ— qTñÌ&y”0L`˜× 1(¨€uwÞšmÑÕe«Uø}M}O3­O|çÇ«gŸº»|ËvWÎKyÛŠï/WŸ³vÝ´Ý_åS–ü<àô©Mêñ´ÑÞ^:¿ª{«®)£%•Ñe\÷€LÀL& €Q×3˜˜ÌÆ®¸êÙÕ»&}Wu]*Û«”[ä{|S_y=i‹j[Ÿ-ÙºŠºîˆ9âÀL:å0uß6ÏviµîzQß¡½=_Îwæ÷8uç²Æî£;ê®\rJ:äÀ™å1o "û*ÛÝv]³/sìùýÎOó‡ŸRqß›Ö𽘫7}à4d£ÄÏ!10&` @LÀ뙄¢b`Â``a.¬¶mãÝɳÖóµUèù¶G—n̶á»O›êyWSÏwyúxÁ«=Öe®Ù«ŽlÌžÇ\’‰(™ç©ï›zã¾î›k×eº¼ÏGª-ˆwwljÉßµF;rצž(ã?××3 €P˜:ˆ&ÄÀJ ‰30& '’g˜LLuÉ×=Yξu]«¼]Ƭž™³Ïªøç/:)£nï2î±Øï&…s¦™¢9æy¾0DÅüGzyêÛ³m»6Ì·l£µQ²†}mò-îÿ?ÐÉ’½˜ú·œ<殤ó(L&&b G\Ì&Á0 ‰€L`bP”:ˆ&¨Ž¡[Í›*ßUýèô+õ(?FnüßO-5Ó¦¨ï-‘ÄiÇÏ:2ú¸ªç˜âyŠÑ=q×)‚a0êë¾føÓ=Õn»ÆÊzºé²ï#MØçf¬´Y•†"Û|뫜p¬„À`&aÔ@”0&L(L$ê哲Þ}Ž5SÕ:ty³£3Çûуn{§&Ž3­š,ª®¸åÕ\óÌî@”%rë’z[ö¼»»ðhÙEÔnœÚmtθ¦ÌÈ»Uç#¼Š9”®S1011$ @˜`‘`„÷6ÅÚ-Ñ}I=Ü[Žyc‰ÏõNž5y“ÕSÞ{&®øŽT8á1×)€˜€&&&EË»4ÑÕŽºÑDΖŒ=ú¾U¶ó«¾hº¬¹öfËÝqG7fŠkL §“®@&&% A× r3ÈœÌÝ:4]N‹¶hY¸¿Åõ|Û<ß_<`ÙçGwן_zêÜúñߊÞêåWÌLLJ:æ`LL „‹:âÞuqooBŠ¦Í±Îª_żݛux§7yú:ç.¬vQB¢Ýg\¥`˜`L%& ‰@J®f@& ‰uÍ÷Müi³Ýóý ç¬:èÅv˜ã¸ÅÜMœF;ó¬Í¢»g´wJ#™‰Ž¹DÄ:€‰J÷Ývië5Ý×z븮ÝÞ~žçV}¶ÓëüåþnŠ(»>~øîh¦žaÊH„ &&× À˜˜`À&:䘔LL%˜‹zï»mÓn«c}¼­|UŠê4äô|=ùzœÕÒ«+âúôyö㛩…2„Ä£®Ižf%¢b{Ž´Õ^Þ#UþfÝZ|ýµ[:³éž2Yf¹¿LzsSß\Se5E|ÌL&bgÀ €(%<õL\ôw£M=Õ¯»l³E˜¶F=SV]˜ª˜ç^=8ôåªÞWÏ.ã/|s_ß1(ur:„÷ݶOõÆÚê³Ó󬶻³÷¾¾,¯o>—…Ök2Ö£.Šï¢…QÈÂH%`˜”P „ÀDÀ3Èë”Á0 Ž¢Eð·|Ón‹µG¥æ¸â{ï=Ió¶ÙŠ©ô|úø³ª¹³¬wWe\r®!ÄÁ0:‰æc¨‰‰‰î×iâè[Öª=?f}•qÇ:5_GL^_Yl²ÌÖÍÝGr˜Ú¦& ‰ƒ¨0La0î@`˜™äL|Ï)5=,öé¾]Æú(ÙŠþû¯ï2cÎˆë ‘Ôu“u7朽Óeu(&&&& !0™ç¨¹Î›s÷Ý•Xôxh³>šzë‹ú¯nnùó÷ùõÕ~krW¦žª¢”s0ÄÇ\ÊLL0ë €ÄÀ&®I10 ²Ë8ÛÆ¸âûgvSŒüõŸn7ÓlSÓŸVjû¯f»?<ñ'uÌè:äLO}'©×–ý9¯ç¯G~®Juó‡ÔÉ]þ“ÎŽóõÕ9£.̱O]g¯„Âg”ÀuÌÄÄÁ0gLL˜ € ‰žg®%eÕwkW§SµãYÛ¼÷[ž½9fmóçv©ŽóOn:ŠU8ˆ’ DÀDÝ3<ÎÊóÛz4©ÛÅoò»ß“lUèyù§¼¶à·‰ë=.iŽI€`ï˜& €`&¢a0J&0 „LL-ë6ÝLYVîçÒËi¦»|ë4ÓnkçÏÓš›gž8æþüëó.£žf%rÄ  ×}[oUufì×oÉ»Êô3éÁ³»iÙ‘ÏŸ~-yóöÕ•Þ9ËÔB`˜LJ AÔ r €˜L€& €¨ë®Ø§u7Ï5S¯¥çwºšø®o£ª£ŒÓ1Ö¯:écî®;â§“¾bRæP”Jn²”Û~níÙ—m¶ƒš6×N¾¸Éw3M=qÛ–*Q ‡\“0u˜ÀPL 0ÂPs0K®-ãOÝTw¯GhŽ3õÔmùí»^w£Ž™ªˆŽ5U*â(9U110wÇQ ß1×'\ºs+l¯u|u¢šj_×5E–èÏ}yQõžž+Ó‡V{°Ç0’LrLs0` €”uÊQ(LLu7EYŸÑ¡g§—m4ë§%–h®Ï3m7ñ†Ê/£‹2MóóŽÊ¦™€0”‚c¤;:‹tMQ£Fžæ:¢½ÔW—Ôž= \Íóßm:rÙúÏÄL%”r`ÄÀ˜P0뙉‚`ë’bSÝwd¸Õ—ÒâÍ_æóÆœ>ŸŸl»Í‹v^ª¾¼ü]ÇSÁÇÂba10:ç¾:ˆLt44ö¯žç»ûâ‹èsíUÏ›©fVkpÛN¼]Eyc¾ ˜LHÀÄÂ`”¢ žDÄÁ0ë‘3È—|YÛG]f³½6iç›ê»ìµÎ˜ëž©¯,ÑÏ}eÙLÕUÜwU=ñ0˜GQ € „Á(›’ÓîÌÕèÍ:{Ï›¾0뫬õÍDÄÄÀ¹ €`L1×.¹\’‚`I`3ÕÕß}wõFŠ4ß:seÛŠýÙó÷nK*8¡Íó­œÑ4õÏ "f ‡\“rž¹Ž¡Õ½Ùe}Å×qª­túx”n»>š|ûñqÝVóM±ÅZq*㙉‚`˜ „ÀLu(L žI€ €H‚HQ×.¹˜×Q§V[©²½‹.²ŸOtÅyõl[=µE×u}ÑeUØÊq0LLLuÈJ$€˜ž¸ï®¯æúº¯½4îžwùýç×§ÌÓÇ£FŒ”Q¯Î¹Ä[晫šzàLø:ä˜À:ä¹ "P:ˆ”:ä[g6ß—».ãMÝ;Á¦Ü»5QJ›¼Û)調§»è¦ìöåë˜&%<„¡×#®I„¢e;]sÌz9¹¶ì®#©Yž½YüÝyôÓÇt]]5Mh˜bbbb`L&ÀÄÁ0H€L˜I1©tlâbo¯½+ÐóZ_<'¬(¡W7լ鿭“?YºªÌ}M7¸ºŽ8•Q<‚` €&&'¨‹9µª'šílâû¦¼þ‡Ÿ¦»=Lñuì:+ÇnŒ™¦8¦´r ×3 0ë ” „ÄÀJ`€ ˜E·q³&®,§OÛíò}L«5º(—•¯Ïê­8§]u÷DWUÕñbS˸å0&×2;·«kÕGiÔôj«O=Ó¯/z0ú¹rcÓŸV>¢ž¦*ÓÆ8ª DÀL¾˜˜LH&ê!0’ ÷ÔETiï>¯B­3Õ|ú8pú\e¿Ï³4èâ«jquTÍ3ÌõÄ¢g™C®A0L 'G\Ûe|Ý6u¦®º·N«›ý •ÕWVÆ:tq5žz¢©â`J ‡\‰‚`˜À˜”Âa1×30$«kïOuOs×zf¯Jž+›ñZj˨Áq³-³E´Û–Ê©—)ƒ®@‰DÁ(™‹-ºîy‰îÝUYOZ<ïc<ź{ÇæÛfLñ^¼óO죮`”‚Pë™3Ì¢bb`˜ \¦&&’Ï ‰‰„ÂSß6ÛÅñe{3[êS¢ÿ6­xöfÕ8â¾ü«j¯Lt®QTåˆDÀJ&&¢a0u3tݧSÓOWlÆæz£Ñç›óEY¬º¸Í~hš-g㈀”I 110L;àb` €0˜ žI€˜ ‚a0Jé=E—êÉ¢»uëÑ^MTu×q¦®(ˆÇ«-ÕG]ÛEUÄñ Bb`I<×.§¶žlštC=Ù£¾|ü~¥—¡—®ÔºÏßÅSv>UÄL0LL`ÄÀ˜ë™‚b`”&zïO <[8¿vKæú'‰ÛŠÞ*çš»ÍÅÝÍ=qÄq\Љ‰‰€˜L‚`“®ú³µWõÍÓ¿-×uOÏvëÇÏ^v«(Ó›-·ù·YÇ8»æ¸ä&®@ A0˜˜ €˜Àë‘(L% „ÄÄÇQ GeýU¶›#º÷g¶ìû¼ÿ ñê²Õµ=Uçæs_ƒÚç5[ÅPãž`˜% ë™‰LAÑt_e[pÇ{9»v ;»%œêÓFWTWÝÙœçTUÕtO¼:sßž-³w’8:ˆ0DË™‰žmâö˜uOM–è¯Fn9éÞ¾fÞ/ZcбiæìWߎžxr ‰‰„À ˜€˜&&ÀÄÂ`”ÄÂH&&rugVuÍÔu~ª«ÑݽU«Îº©Ðº|Çi§—|s_y·Ñ^~bb&y×®DÀLßK.›8ýNµàõ|ÍÞm¼ÅªfÚ«¦Èë4×U£¤ ‰€ë”`˜ €L& 0LLLÂ`¡=÷]×õßY¯³»jÑn~¹êªt_κpmˇEqW­æh¦úk¦¾9 ”L „À&&&&-MöulÓu£]×y³ù¯ˆO)‰‰ ˜LÄLL&×3müÙÔéâféÙç4*׋_ë¯GW9yÓWçª")ë‘0%`˜”Á× P0˜%˜% @&&&\“ÜYÎÊf½7õ]º²YÛ›ñÝw ³ÛŽÞ1;æè§‹ª¯ŽÁ0똔L%Y=͵èFüzyÁìc땸º³.œýq·Íîkë¼¼×W"bb`&&0˜Ä‘0˜0ê!":å×.¹Ê:¿ª¯lóõuºtÍqf]W{Šã˜ŠlŠ&sñ<Âg™„À˜”Â1=Lhîþz·‰º®ï‹xÍëf£F~­ò·eê«yë.¼·Euä¶¹ç‘1×"a×)@`®DÀL& ƒ®B`P”L €ê;µ·&ªº·ª®ï_ª¼ÚhÓ†ÊlÑÎJ'Žûãš;qU1×)똘:å3ÊD¹˜›´YNºmçÒ®Ú«³$ë3ÝvKók³”[UHŽ#˜ ‰‰€ žRDÀ`&Àë`À˜˜uÈ&:„L,¬êtwÍ•úÖUë3Yß7ã²g‹hç=Ù»âÊ哾«Š!Ë®@‚bHuêîth睊ÙFž®å 3^œ•âêÉÙ‘–­y{ï\sϘ&Ï"`H‰‚`ï””LL „Á0LL­«g÷Ä_Æ‹ûç½~w<_WzmÏÎ Í»= tf¯®òòç™rJ&$O.¢ ƒ¨‰îlë}b¹ôù­Ÿº·÷››Wy\èî«òsÜæ˜ÏÌL@uÈJ& ‰„À:ä € B`<“˜ €˜YÕ«ªŸO¼;–êÉuqfÏ;®tgÍêy¼Îk&)»$wK‰'”ÀLL0&;æÛ;ÑËM|ìªÉº›«¶sŸœvhËÆ¬±¢¼–qŸšˆLÄ&€LJL&u®I€LÄÄ¢c®f ø{ê;ºËª±m³»ÆôêÇfŠ÷)¢J¨éšbjšjêx䘘 ޹˜ž¹Dõ։޵ñìïw>nüqg8û޹ÓM5*æü}Tâ ‚bbc¾`L„ÀÀ € @À%Ó’P:‹–]VÌ×èÍ5]žØ­»>š»Ãxg®Õs§ÎæyŽf:æ`”ó(˜:å0LL»»‹¬‹k§}½ó=G:pßf[üíØo®½ÓwUæÍg5ÄÂ`À „ €®@ ‰0 „À˜tÒ¯]7uΚ;»ª÷ẞo¶1è¡m9÷SÄGuÆ^!ÀL:å0‘<“ ¦½õ9×ñêÓ¢sÇÎkí†g|ó_6qLE]æî&&a×$Àa(˜¹˜:æ`s0˜MÎŽº¿/­”󲨦5Uª¾o:ñuWsudUÏ(ï™ä<¥110˜•³®]O7qªê:§Cªºç5¹ïªÊWÕ—_9:¦9æaÔO)€a0˜&&&&0ê10 $HêÎøï»»S¶¦žó÷8¶â×6Ñ͸´äí£7õeæ§\À˜™æzâQ3ÉÔ!(›.çGVMq,Œþ–eiêY£FnûÉZa•rˆ˜˜” 1(‚`&`\‡\€%˜:ä:æc®@ „‘0uÉ=ót舞m·½UÓÞìôI§¬QÌ]Šub¾(®Êé®Q0L%Ó˜é× ”u5×§º-ïM:#Î]6S«š4СV˜ÍEQ˜:ˆ&˜0@L`Lba110™„ÂP„£®m‹¦ë+¾#_Ug3iâüº,É]”_‚t嫾#ŠbHê ˜”I›/æíäÛF™Ï:³[FŠã›2ÝÏ£ ÛF¬tYš#™€˜À™ä @u¹&% „À’&bQ×)޹ë‘0˜›z‹4YZîuWκ³ú¬³,Üó5Ù‚ì:/ËU¼çŽªë˜&$L&&`ë®—÷¥ZÚvÑèq]tú¹.Í9õâÙ‡¾i×Í]Ó—ºy€ƒ®B`žI„À ‚`Àa0LžBP” ‚`˜ë‘)ï1u–áõnÇUÜOWÑÖ…qÏ|sGqMôÏÅ9ž¸L;æy˜L DÏ'|Ç]wÝÑÍóÖš·U›Ö§?‡ŸTó1Åá¶7ù”i¯*9€ ޹%r˜˜LuLL$‚`00 „ÀÀ „Àê Lñ.º³¾æéêË9ÛåúTçâþê¿Ï·n,öt¯OŸ×7bî®y˜JÂ`™ˆ¡g÷®ŸBµ}^¿Îmtê¿7Å:qßEªrt¯žA( GQ €˜1(0&Â`&0뙀 Uj޵hÇe¶Í|ñ®ÌLû³Õ<Ù«-Ôbô¼û3óGQÏ\Ì&&Ä¡0fn›8Û)·ä9Û—v|;èŒwõÕ}å²ì5wV~¹Lu1× wÀ&&LòLÂg™„ ”˜˜™í£­UõVÈçõçúYÑÝy´×Åz뤷]qLñ× ×ZiiîÛë®îûËvž9[V^.í¶y÷s]*j޹L:ä$D¡(L$0˜L1×=s0`J&H˜`;t³UÜÆŽ5çˆiª5æ³¼õŽÊcÑUQÏyã®]9˜\ȉ‡\õÉ1:û›;umÓ£œ\ßòqwÅz)DÕ8瘞zå(” 0ë˜LuÈJ0˜uÉ0` ß×)€0˜”& .êÞ©ÓÆÙãGd³“¾*³Š&ÙǪ»ñ'7âjÇon·.^xªÚ癉DÀë˜%`:ä¡10˜ 0˜10& B`\€˜Lr’m¯i»6žk»Ž¯¦û:ã ¹©·¨pæ»8¦Ê©"P˜”uÝÛ²_f¬üꪛ²úSèÔ¡“V|Í*$€ë’Q0˜L&% € €ÀLLLJ`€™æz¶Ý[5ªÛ]ÜÏ:2lÃ4s~mÝW1šüñÏ1®@‰ “«l¿ºzÙÃW3¥ŸŠêÑÆhêVQÞó#™ ޹˜$L:ä˜`g˜˜& ƒ®f D¢Q0sÓžºÑÎ몮鲻øæú¦üÝã»<[Z‰ëžfˆŽPA0L%<“Ï.í‹ífôò_Ǝ벘õ<Í>~­þO\YÅy:ª8€L` €LL˜$„Â`ëL&DI G\„風Ñ:êãEzTuv}£„äiÉk™©DsÏ3 €&ba$wÍÓ¦­•uÞì·õO6Ý›N^h¾f¬9ÍW?N^ójɧ,Wž" ¡0&Â`;àÁ0ÂbPH뙉žR‚`L _m–q¢Îè·ŸOQêaºŽäYU_]¸çžs¦%10˜J:æc®fmïC>ÙîÎuÑmUw<ñ•T1ÍqT£¨€uÌÀ&A(wÀ˜&&À˜× ˜˜& 'ž¹˜LJ<ÌI=YcÒÍ©—½b¿›´f¦Û<¾÷ñÍ}Wߟe=çâx˜:稀% BaÜήù‹íîÜœ]~}ts¯>jyÓÛ$ñER0L0"Q@`ÄîDÀ ‰@O\:æa3:祖Osfºtä·“FŠì¯š«sE–íÅÅ9¢¨â9LaÔAß ‰‰ë‹¦Þ4õ×ëÍÇ}YU:q[¿^–.2ßO5UÉ10ë‘(˜% € ‚a(L$@s0À&ÀL%<ÌL ‚`›{êË·ñšþ³z¹«î™îìnxïã6¬vUžQ11(K®`1}z¸z8»GQ¯kìÅz+§®¸«Šøæ$‰Bbg‘0L;à˜uÊ`˜&0”¹0`™ä”L%r& O7q~¸»¼·ëÏm¼F}¸¿Užn»®Žx«®Dó1×3 .¢Ë»«]’ÙTsÍÛ|žé²Ìq²qQu4×0 „¡10˜L&ÄÄ L&bc®S €&```uÊSÈ™×ݶwó£-Újfô<Ø·¥…ªžr¯ã%µ×ÇrL$ —]v]mõéçͳOhÃWtÆ{(³?<¹ ޹ $žSuÈ €P:å1×2@LL‚`L&LL €ê JÞïºÎ­ÃèÓÞ}<ë«»åMqè㘦»s÷›•\Ä¢bQ13˸AÉfžèßVÕ—~~»Ï¦š¨²»y«œýQÓ’gL€10˜ë™‚a(`LJ „Âc¾0a×=;êÝQ¯7ußVΩîÊïÏÝSÃ)¾š¸¯2¹®c§3Ê`’$€wÔ= x»Fü¾¾<:ëÕFj·ä®üìЮ—\‚PðtæQ3”H&rJPÀLL 0L×'Vóß[œÆºk»|[Ÿ]¾† ;¿'kó]æÌc™æ „Ï)‰€˜—Vuª,îqdѧÏ×g×å»%‹·y;¼ËzËÂî{£ºkŽ*®HC®]s×wÍÜ÷¶cUVâum>†Ë~KrwM\ÄÁ1ÔA0&P”L(˜˜ ‰‚baÔ@LH€%bguÏ\Ì&Á1)ä˜LOWYλù¢Úõg·v+ûŽ³Í”S»:¸ï'Înùá11ÔDÁ0Lò˜éÕuÝYÅö×;ðßÝ^œ²Ì\÷ÖIÍW=U1110L:䘘”L˜ BP˜`&`˜`uÈ.ÕV‹k×Zož©ëVU|lÍfÓŠzœ G3¹LòLLO\u.Óe–_Lwéç¶žvN©âÜÚ'?1Fiˆ‰„Ï2ƒ¨‚`&& &L0˜0L%\€L×.ù„Á×'H‰·«,¿­â»&Ìþ¥N?^hêÜ-ªÌ÷䮺x™BÂb`;㨠®-–ÓÝ}éÏE½MnÑ/5Õ1(uÈuÌÀ˜˜uÊbb`P˜L%0&Ç\“ „ÀL&P”Yß¶­ø´UÕ7ÅWu5jâžtf¯ªvbÉÍ™PêxuÊ`ž¹BbbgD4Ó³­U[¢Œ>–+yæ+GY(­‡QJÀ&(r€&r˜™äL €L €ë™€&÷ÓGwuÆÎózDEôÇtÙÌ÷ž½ëÇ9¦·PŽ „Âg—\ºŽºëWݶ‰˜œ[úÇn[5cӋЏqT0L A0% A(˜a0˜À˜ÄÄÀ0L˜=ñèq©ê㺫±ëѨÙD]8»ÉK/ó˜ï˜ëî" …ŽÙ:#M‰©üÚ4ðÓ‚›kï'¦"`J„À0D%<Ì& ‚HL¢& „ÀÀ˜ba1(&$…ów\{ø´`ô«éžþqúXõ_ƒ}yh£_4b®Ê9˜ê"bP¡+šxÑ9}/CÏ‹{«¡çn§6þ9ÇfJ¸(˜DuÊ``„뙀\€I®fr˜0õ¸Õ^þW_–ªø×]Ö`ôpè§&Êk¦sS<¹˜L$‰‚SÒg­=wÖÞ¦¾/≶¹³$ñ9ùÏ#®S(LL&Ä¢`ÀJ:ä%˜$ž@ bQ0L& „Ä®²îâí–Õ×6rÑŽ5Uçí›)¿"š¢ŠéžQ)ç¾QBwù¶tÝ×1Fü¼èººÙbsó4W\%\“0LL A0LJ¢&&&&0I¹ÄÄ¢c®e`LOklßÔlÍ«žøÕçl–*Ïgt[šÜ4Ó5Ñ1$uÈIgºûîË­»¾«¯^]Þoz§/Z;ÇDWWLrLÏ$ÂbbP˜˜˜˜LÂ`LLÀ'®0IÇ\¦0b`LÀ–«ºz5Fêú¦ö{íÉŸÓó¶u›ŽùËʼ•Ã’bS˜”$Y]hºè¿]N:¦WSNÚªŽh¦¨«˜˜˜˜@&¨€ € @˜À 0˜ë‘$ ŽøJ&„£®S u :øõqÝ«SN»éÑ‚äÝzϧ-™¨çš:­1=p˜ ë”ó3:'»ißÝô_šuçYù˜ž±WUUsÕP„À¹L(’ÀÁ0`ð˜wÂ`˜˜ (:ˆ”L3ÈóbZzÝß…²ì•oûÓ²ˆš´a§Œê&®&  % G]Y~«­Ó]ióµuž½>®3ÆNyæ¨&Q0‚g™Dô±Ö‡¥–;©ÉoÌb÷¼ý^nÌy#7DÄÄÁßa0DLL¹ÀL „ÀL˜LH€rÂP&y:ˆ&Q$-wvܾµWdôéÍ·/Y½ ûÆæ½žtuWy|ט˜˜&y&nãNˆÙ²¬~¾~rwts¡›Š3s]|¹ë”À”L\“&\0˜LLLLgÂH’:æ`J`3Þ«jÞÛª¬þ•ÓFk/ÏÏú™¬¯¬ÞtFe3$ò:å$Ŷèçl죾5ÍæîÙ³¼WÓ_›Lu\s1×!0”& ‚`”Q0L%\‚a10˜®@&¢bba(˜Âbzæy˜‡S˨ºÛbíóFÕ°lÉ««¨Ó‘Ÿ%±Å.Ç\ó0˜L¹¹·«7sªŽ®×VŠxº+éŸs6+|éÍn~`LLLO\  DÄÂ`˜L ƒ®S0&&€0&$¹˜ €uÏ\0˜J'®lÓøëwqtäï_»¨³á»Ðó¨ŒÒä’ —)‰Oq®èÓÝôws.Ü×eÙ^žwåçϦ0óO1<Ì$€”L¢ÀL$€¡010˜&&ÄÀ˜˜&&:äL%–žoõjºì^†½J|íÞ?Ðóåíê™æa§¼\×W$‰—.㦻*ղίÃV‡º,gÉÜæÃR˜s×)@r˜®DÂb`À˜L0LòÄÄÀ`LL&b ‚]s×Wumöé¶üµ'Ðó¶Õg9.¿frqÎz8¦ž\Á0uÌ¡Ôñ×}[uz»ëFSÌVõèϳ‹òñ’kÍ¢¸”uÉ0Á10˜”% €Ä¹&À˜&&˜˜`˜uxÕ~œ¾¯;.ó´wFÆü9½K<ÝÙé·Ë¯?|åç˜LL0‰Iešzˆô‡5q×Ç}[ÙÏh¯Í늣™€LL ”\0L&ð`ÂbQ10˜L`ÇQ ‰0˜bÇMúëãwqèy”j¿Šç3bºêêÌÑ^zruUbPë’f&\ß­E}úuçÙš/Å|[‹ÒM4dÍ4QÉ:äLL@wÊ10LJ €ëÄÁÔ |¢PL¢Á1(”&&ba×=ÍÜëïE^:pzæëDlÇoZzyû±Y^³^^+r„ÀwÂc®ã»uÝm¹›®FOCϺQ§-•]çf®˜§ˆˆŽù€%‚c®@L €b`& ޹& Lb`rL˜|˜˜JÌA$öÑÝÚnº­5Ÿ;ߎþjÓç[Û ™æš*¢’& žS Mº9ÛÕ¶Fk,׆»çg3—F¼Ùë¿4ãœC™AÔDÇQ0&À®R€ „Às00ÀÀ”uÕÓu–j¶Î{ÍfÌZüß_xýL6zYk×åsM4×KŠúrL'®P¶,ÕÝ{ãGÙ³.¨Éb˲qÞ¼jã.n{¯7\ÊP€`JD$‚``˜Â`&0 ï€uÊbdç©¶Û[vçãe:¼½µõêüç³n ™÷y{ñÍ”q}Yãž©JW10¶fþôÇ[óQéS“ØÅnŽM99³–~|îë⸘La0a0&À`uÌ¢P®f0ÄÇ\„Â`uÏP‰”]o}úqyú˜³ÊÝu¶YŠ*Ù¼}UÏ1ÔA11Ó«;¶ý”õ×váÓ§ÏßÖ\z},®lQ¿yã%Ùóò‰BP ˜ €LLê"b`LL%À €¢bP™êûjÑè'_™ª5sGLG~×™]¶ñ“OŸwÕx¹ž<“ÔÊýÙý,[ûźúsîɧ>Šbè«®ùç RÏW<ÉL0 B`(ßÄÄÇ\ºˆ€0b`L&Ä¢a0˜:wv¾ôUÞª»‰£­>_­^ŒÚUÕ3fKkËžiŠ3ÌðuÏ|uÊl¾ÙÓΛ5ãFë|½ ´Î{,ªê3|úkçˆ&%0˜0G\‡\‚ba00I`` €&&Dòî-YeÖèãN{ìÁéWßì|Gu(뙋;»µú,—M5âÕ£<èóöhÅÌYÆ}´yÓŸ73É0˜ë‘Ó™„Á0LLÀÀ&ÀLÀÀÀÓ’QÔÚÑùÑÅŠtÁVž¢Ê9õ¼»y§J¨ï5^]Ùøç„ uYÆÛtS²/Ϧ½8ûô¼É¯ÒÉ£ÜwÆ5üeŠ;óø0 ( €L(˜L`ba0r˜LÄųeÝlô|ýTFú4ùÛùÁìy[³îÅy-¿&š¼ªµñ’ŽkO£GW×¢ë{jŸ/Üó&Úõq糿G%UÛד§ÑWbc®R€L& „À&‚`˜LrÀ‡\¦Ît[|iï7«ŽÊý,×bÇìyûh·VHÙ“N=xÙcš¸â":‰O3wqeÖÝ~ß6lÑEÜÕ6su溭˜óñLÛçñG=rÀ$A1× L&&¹˜ „Àë00À` 0ê Pê%«Dñ¦êæÎ³ÚÛæíæF<ßz:ÊôUÍvgžqw–£ƒ®S×M±Å·Í›&ìÎìVÑg3¿7ëŠ|ž´U]UuÁ0& DÀLL(L˜ €˜ ‰€:æ`L”LLLLòLó0%×zuuu¹®ÙOZ»ñ£UÙøÙ—tãŽzÓŸŠ{ÏnN*Ž)ˆ²¾¢;²ëªÓ³Ï¿MüWêy¶wÖ~½üº½óoeóï·¹+‰‚bb`L&‚a0&`L˜ ޹Lò˜L¹&=Ç^”wli›j¯M6ÙW\ÙÅ™ëô0×m3r«œ0¢¾&"c·vufޏ¶Úýïbôx϶Ï3•ÜnÉÇdãŽ+®®«ê˜PL˜˜rLr&:ä0%0˜&˜™æbc·wiŠM[²dôæÁ·OsY[7¥ãúXg6SO9nªL÷lß^ž7â·U¹u蜷ÑÕôÕÏz¼îõàÃÞ~ù¦¹áZ`ë™10‰€L @L10À˜À €˜LLò&³›.âû4h«»,Ínˆôrbïmz<‹õ+Ó¼O£æ(ï/4Y[‰Žæl²«'Dñ»¨Áìã¿=¹¢9mâÚ2W~^nÄ«ªÐ& ‚g”LJ˜LbPë˜ï€&0”&a10IÀ˜QÀ˜˜»½mº*çdÓèó›e;c&Ÿ?ª´[NÌÚ<ý9kî<íèÃUq}3Ìw¦Öû*¯VÌ~Ÿ:|íw×În{³=Uu‹ž.·1Z¢Ä¢``˜&&% €&y\õÊb`JwÓEÝð¯eº<ÿOf;œwé¦.ç‹óc¶Éç6¿2«h§¾xï™k­èS£Nz}ëˆôê»?yì¿.këŽxó½öà窩æ:àQ0À” ‚H ‰€À˜Âb` ‹ZxÕÖŠ=/2ýׯ%Õ÷w:|Ï?Ù×åM[ùÍ‹f~ñô·5|ñÝ\¢îµÕ:âýtDlÉfbž4`ÝÇ~owfwãú^¼ýÑWt"`˜”‰že˜˜×  ×30 „Â`0” ‚Q0L0€½ÞΫ×Nß9ÞÚµÑe{<ÏO=Ù=¬¹¬Š¯£ÎÕÇ-Š*sWN;·}_ ³ÕQÍþ†Z}ÌlÙfúò÷ŸÓÅšÊ8£o›Õ|J$3Ê`uÈLL% @LL˜&ÂQ3uaÕó]özX¸ô+›¬ÊÑ¥|Ý^fÚí¢Ü:ïó4àÕ5qÅõ_5Ï]Y¹³iÝåëï'¢¦oç?£‹;M_œYuó‹wŸëa²Þ}¹SGQÌÍTMôóÜÛuVÙÏø§_ïï7¡³Î•ôq³ÎïOŸwŸÅuwž\õÁ"&&L\‰‡Q¹& „ÀÁ0 ×2'®fÛú¾Û(›:Žãdg¾ÎóQmÕR™åÇ8:³¼º²]Í|;Ï×]tÝ=Ñ}›sUV«.âÊûɪ9ªÛpõ‹N|Z³UÝ5ò˜%0& €LÁ0&$˜0\¦&% €:仺gEúé§ÐÏf{ã¸ê7ÒªQÞx¯_›ÆŠys9éÑ÷Ç6qÞ»Fë3¶i§?Wùþ„GUdgîìµçç¾(æžQ0LH‰€ „À&` € 0LL ƒ®N¹ÀJ;á0 € wgzjÝèå¿6½*yˆ·¨O"‹(ž#ŒüñÇYûªS~®:º7e›/¦KëÈ㉫™äur(À˜LÀL`(%€ ˜‚` ÒËkÅè']wqÍ[Msš{æú¨»š{ªÊ]Q4+ë’,usëêm¯}סlת…ù*³œzz×FN)Ñ’ÜÊ9‰€˜&Ó’`˜ÄÂb`L&˜ë˜LÀ˜̯ÑoVÃÖð}Ny¿ŸCÇïŒ:¸×–»)»šº«‰šèŽøãªÒžç›¬ã»½;»úîÚêãU™'šõ׿î;‰Ç¯&œÑMqBa0˜J&r ‰‰0P˜( ”%=]cMÜ[M÷×MÚ±sFšæÎiÙ†mÇnXº‹çŽøžzæb{mɲ¸²9ׯÚ-³/qª­Wãž)ÕW=ñ~h¯ž¨å1(b`0 @ €J0&%¡ufË6_ç÷·›ûÅ~ û£¾,Ç~z¯¦3GM”»áÄÇsm=YÕ7LY}ZkÓWó‡M±çÝŹ{º™¦ê9ãž""``b` ƒ®A0a(&`ß ˜î{º/ã}Z±[¹M¸诺§º¹³ÏºûqÕU”œ¹«šk—wE¾ÏlQ¯-Ëè‹cš»Ïß=ÓŽTWGuÏÄÄ €ÀLLÂP €&˜& A(LÄóÞ§¥W6W×¢C̵_|YšÞ§ºæ­¸-¦#EÅ}ñÌêyÑÏ|uÜuÕs5[T[dG[FŠf¸‹¸¶¥.k™­˜˜¹ ‚P0˜`&˜LÄÏ3Å‘ÝÝUªµü×ÞºTѧ¥ó_ +ºÜvÓ×Ö˜&z³½9tóŸO]çæú¦{¦Þl·75ß×*³?|uTq4¸u˜&`0˜P®@ÄÀÀ:äÂP¹J $ÑÄÝ%[8šë³®³j²‰¦/¢Èîžo³¹î›vÏ—oVaÑ¿¬õÍ}UÜG0ˆ˜` „ÀÀ˜˜`& B`&LÆŽzºxêÈSÖº²Ù«5³“µ™ºuÕ=ÓõSL ?SLDFD @EFD°@FSLUFDð?VFDð?LO GEMS_GENIE_1FDàz‚@àz¢@SLSLSLŒSLFDFD€Q@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS5 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LT JPEG lossy(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US (US (US(US(US(!CS01(!DS76TUSTUST UST!USTSH WHOLE BODY_EàOBÿÿÿÿþÿàþÿà®ÿØÿÁ ÿÛC  0:*,"0E=IHD=CBLVn]LQhRBC`‚ahru{|{J\‡‘†xny{vÿÄG !1AQ2aq"‘¡±ÁÑáð3ñÿÚüP€%&ËljÈÒ<ƒðî¬Î\M2Qá gW‡Êó'ø7\qŽ+?ys¤‰¨õb|q’ù9y¸+(å”|¬€´#líàâÅé›ù’IG§s6ï,«~ãÍ“HË[דÄqù~ç txx[³·Š÷êfñþŒÜºwDEç%–_BÞjNËÂw,õÑRçMS*ëðÉu:lº2äíFYd¬,éeoîZ.ä­_cwž:ÙçòúŒÀ#³Ã~»Içþ”|ÏEWi– gÆÔ›3p쉌èÒX†Îeõ)~Ѭµh¿WREæãn|7¹%ô«^ÇKðR×—]9yø×¨¬|Ÿ,Ï–’8yVYƒèèágRJ‚ƒµ×µ¯ù%ôÙéx8f°«ãfÜœŽnú£‡ÄðJRwìq¸yÖ ¹m®ç/V`‘¿ª³¯ŠI<ÿ&¶´ªŽÏü½-ü¹¸¤Ó~ÌÉrJö[’RŒ{c£99šéVqò¼ç©Ëˬ2£³X½+6ŒòtCVί '…'“ªR‹^W¿bn ÜRÆKón\}šö<žWR•;W®‡7#võ÷1•QƒÙS¢ñvoƒ«·„*P– }åuëHqß»Éçm»YxÁŒß[ÉÏ'ø÷1™<²(M¦uøiÔŽÎO+µ¿“Ŷ™?Û¼Ùy²õîeÍQXnŽV³fRE<¸G”†ˆMDÑ5Baƒ^9yÈOÍyƒF•¼¼$Šò¼gðrrI9au1–U™¾¸"¶Kljµ„YøyVUˉ®†mQ”¬´ceÿ¶÷CÊû _qT^4†ôuñÇé»Ñ¢Œ–—ý/^Ei|³›–éßCšWÜŠöÅ¸ä• fðáÅš¨¥ÝuViŪŲ“„g4*UF-S ¥f¼pó3¿Ãø&ÚrÑÕ/ ǦÏ?üÏÃ=˜KŲ}‹(Q¬!y;¼<Áݱ…^â|1Œ[_sƒ–*M¾þÇ/'zÙHưè‡7bÊ¢Ò{7ájj°L¸«NÑ ŽòVPèrrÇ&Y3 JËÆ&üI&­Œ9d¢©Ÿ$ÝÚy")ËhžGåU•×F8“þ ù˜ÒO§Áu勤xeRI_ÉépÊM5q6¥RM%lóù·kôa'œè«‡6°‘—$T¹‹y4㛌­-QŸ]~‹7Km»ÚZ8ù½[0iQœ–J€/].ÇGÉÛÆ•"ñãÂËy&QÊùÙËâ9|ØF´ðupÓ¥'_äÙq§ãׯc7ÆÔ›Ï¹~>)Öc—Üô<3¨STO,ÖW™jŽ.XIç©„¸^Þ*J+1ä¹´Œ'WܪÞÍa7 Ù¢ç¼{:ª9¹–YŽÈhÍì€h£AY:x7“®¬¢ë‘V_ÁN^Uœ'ÒÎI»w¢ÜJÝ&ÍÕñI¿±½§*{èû¼Vñd)»Ù/-Ž ½K-Ç8Å®¨èU+i]\N£ù£ÐðòŒ`¯){å”|µx£Ìñœ’n¼Ø8$©¶–û˜rºXý”X¶Eç}JÊ,ÎOY!+/˧a$ßÉŒ•2¯%'² Š.J4‚º6Kh¬êè¦y®†É³‹Z"-[è[ÊÚµü—‡#‚«¶tñx‹iv;¸ç%Óµt+ÉÈÜUµ…s‹—šòóŒ#Ÿ’^l&eåêÊ·Ù‘û&xZÉÍ-„òL;4¿2F|‹6dÌç².°[à²NðmÒ¼"ͤ¨ÎOÍ”Ê݃~(Õ3£iÝÙ›>å¡*Âx÷/挪¿ü-ÆÔeþÏC…ËÊ¿8Í-kx8dí¶ÝÑšò¬R¢œ’ϱš‹•<…ô¬t!»N‘„ýÙ † Õe>¦?c9ì¨ f‰i›6XUFse:¶YSküÆéÒEÛó%›#É’þf•]Ñm_C^6üÈôÒ‹Æi=”ç×ÇZ9&½ŒäÚ•ÿ$9¦°°eM¿oÀ¥x*î°ÿ,ÎjÕ£'î‡Bbéš½KöÌy=Kà¨&;4H²Ù¬]++&¨ “ÓfΕ∦ž‰"[üæÉ1Þ« øiÉ$v.ùu¶S•¹&ìä“©5D4š¶V)VJÉÅ,¿ÉžÞ# t!¬ÉS¢Èêh­Q[9ù=EA1ÙªZ/Yã4Qöº#í²:’‘·o¶àÉó)¬+ö+¯tYgmÀªVu§o¿±×äÂëÜäämü”ócØ«yÇè­bØ¿.kE[ó1X¥ÿ f³¢I,2]õ0æõ/‚€´=F©QÙù(ØÐêZ:6áIJm(©#&©à›•`„²Jnñû7ãnóŠ{:×LlžI}4¯üœœ~æ,†èNF~¥‚t‹qµÕrïäɪc¡dË}Ìy½c0ZûÅað°Q²È-“x*XL—*²|ËðB‘Ú‹'Ûe“ªs«‡–Þ:9g9_&Nš2’K?¢6O‘¾ˆ‰%”¿2­š$ã}̹5k±‹Ù8 ‹#.o_ØÌâõ}ÒiZ(öVè•’p^¥þÍ’òÕ¥(ßTdÕ= ýÉTÙ)*¢n•t5âžh´ž{"2–·ú3•Û*“¼‹­=S¯É¯<Ψ¯$³I‘%ôed²(ª,¾vgÍë_`Ó‡×ö7Ž^ˆ¬¼–6fßQd½ÙxlÞQtšE<βßÈyLŒ}Ë&ÃWîËGQºŠj“!U>å%•YkôQ¿rò?¹P£§)w-Á-KwÔ¼7ާwª6Ö½<É«LÏš)Å·WðpòRùþ ŸÂ!äŠÍU±Ð§\ބ։÷êS—Õö( ñz¾Æè«(ÄK$M{ %œV=È¢RÊ¡V±eÖKÅkoÒ躟e‚œ“µXg$îÊ}Â^ßr\{Q/±›Á*ðËoògËê_~/WØÝv+-”d"èž„à-Ùh¬ü8ý>ȦWÁ Ûÿ%â—TM]:÷4Šuu¿ÉeîY:H¬ótë²F3´Ê|êÉ¿Éh+‘I;£ïWAE^ÂÎ rú—Á@[Õö:û-™È…¢È²Ñ#à´]{³XÉ8õÁWuÜ*÷,¯¡ª§rkå÷'5Þɽ^‹aæŒä“z(ðŠ¥n´n¢ ­ÕÖÎnY¹3 CÑV W—Ô¾ Ü~£xàHÎvU]ËY:,©¡²ð•a¥ßFV²iåÍ¢“]¿’¹wj³Ø–ßLí˜kùÙI$Ÿý"+êª'Ÿ“Ðæxez |ʶ#²9½Kà &fèœÍ”E‘aÔ²}K/rñ5Q¼×Ü”»hÑRD·z{"W+òçØ•Ã=¤êŠÊ‡†B»Ý°¯tL¢ºuêBXµÑ‡+úŸc²7òF¶.ŠÉ‘ ŽoRø( ŽÍ£Ÿ‚ÙkÜÎfze¢Ë+¯’²YešGy:8×™cz.—™ûv-(bÓÿ¥xâå-¿„ð•ÆÿÉÞ¿§/+J gtpøßéÎ Ò¤y<œnÊðSËm’í'íy²³Ä]rÞÊS*þßJAü”“";'—Ô¾ aðix)*2dÇf‹D’´Z)ŒV(Ö7Ó¡´I:ɺNª­Þ ¼ |ëç©õ~ÂÂ0Z®û£Ð‡%+Í··“›ÅxhÊÒ›ì|¯õ ͸®»<é$—·ÁFßã©Y6£ú9¤­ã ؤ•+(Ñ d«(ÄvO/©|Ò Ó¡F/dÄÑVJXѬWE“H«-L^ÙxÉ.½qÔéðÞ!BMçØõõWÇ•¨ö6õi(¶ÛVíàOúÅÅù¥o¯¹äx¿ýìVoää’Tšvgå·Nˆ”{t3þÛ¿a.,|-³ži.…FQ“Ëê_-“dD´e%‹­ì^-ÅZ¤kúuÙ7”®ˆó'ü—O¸\I5ƒªn;ý–s¨åác?/+·ŸÁ’ŸÕƒ§+­û‡”ÛÎK8*Ñœâ³Óáܱ§œ¾ÅdŒ™x"9}Kà ÇfÑx,Ö2e5ìV;4D¯‚Ë7âyÊÇftF*Kÿ`M*ø÷1k9Hšm£ØÝi.ýIó6©rF¯ƒ8oîtñ´’ø+É;}‰ãúºdÒN£Š0›¤“w÷9y%wZ3e$Ò[(•³XD§2©¯ƒ0 F°vh–=ˆ”nÌœi–_‚K-ѯK'GÚö,浆båžÌ˜»iwf¾ZWA¶ðU¶šb__Ü¢KfŽ]:òIßý4á/öZOösóÈÁºêS7þJO:&îmcâ=kàÈie‚]mhŠ ‰û›AcVòÇÜ«••ó%ÿKFYö4Œï®K,Uö3ä’O+ç±g5¤ˆso%/߯rÜriUì×ÍÕü­u3zÉ^å*Ù¤UÇVsøþŸc hºfñ’«-x*ÕU¢ËG{7ãJ¬·#¤¨È†ÖHO¡¤3^ÆÑUÁ—&µö3л&ÒDa:D¼Ɨz´cɲµ‚+ü‹¥Eú{t9¹ýc0[6„«®M/£²4ÂÑ ”×µ›"®%>½ð»gMcf3Ëèa-×¹îZ#h´oÍØ½R}Œ¶Aä/snù>#†<|^eŒW#¹H3DÅY1&¬Gåš/ÁY°²»!è¿JGTeôßm7Iö­íܬm–DÛ%o—„ìÁîÈo!è#N>Oí»CÄx©MWC‘€-“X˹,”K&;/K¡Ie…¯à«Ù^‚ëF‹—é¢';F~ä—Zؾ´^²Ò®¦/ˆd7TEÒ3r+`-k“ì/;4‰w£)eº ^ä<•d2­´"ÉE‘b_cN=aä_OsÊJY*ÙPbË'‚V½8ö]˜¼’ª¨†Š² HD²,‹tÐ[VmƘ檦`÷’²fMÛ Ñtjšd®Æ¼}û¢ÒXͼ<²ßÉ7ƒ9<‘DËxAo 臥QNg˜<•žŒ€Ò4VmǬþ2v¶Ìe½D°UÕ`¬™› eÑxè³Ñ1W£¢›_®¦<›Ù›Ù”ðP ÀÕÃh´ôböJ"XeYœŠiDKîLsØé‹g?'«FoFSÙP/ š§ØÖxYz-/Á“N‰èRMh«ÁœŠ„iñüšt-ö¶j&úœóÛ3zÑ“ÙZ;6‰¯¹£VšèbÖ~ÖŠ»(ÌÙ¼th´XÛŽ8ºün“9岓Â1` [6ŽátžËºò£öù*û’(ÌÞÈã£T¾å’Îð_Nêû‘:ò3¾¦sx3JÙ´5³xìzêúMQB²ÁVfÈ‘4VYo èREg¦žÎwß±”ݲ€7ãèt@»I]èÂxoÜ¡YE$f¤VM:†ÎŒ$•`¯/¦ó“þÌg²  [7‡C~7K –}‘ŒýZ(C¢’3lÖ%ú—„r‘½ÓXýåiÇ9垦Ù ŽÎŽ4ml;Ñ”‘Jþ HÌu«5‚ø5®«¡^GnÇ<ÌÈZ Ù×¶– Ñ~åe¨ÊJºY˜&&ˆÖ ðn¢—O’ðƒwI¶gÈ›ÙÏ=3ì/Å^eg«Å>,ýŒÿ·’³TÞQœ°°RTôQàÎF`´M¸ãægT#¼ÝImoùtí]Y«Š—zÊ`æ C=<{rÊ7J»™7ŒÍ×B«+%&þÆr3¢tðѵv"éšñAIå—•ARÎNz9€VÎŽ)>›6MÈšMl¯B*—É”öe"€´N¿ )$w¿ Éy¼˜~Ç3…<­–‹”UôDK‘Ë}^} 7áît%J‰Ít"±÷ìUÒF2ü™H¨%ŽMt=n?Ꟗ_~ç7#¹ó5k?vcΨå·¦wF6“¢³M_죵ðRo­™KÆ[ Hœ3¥³IeU"¹ÈI%lÃÜlä¯2zN>M«"yf gؤ¶RF2ÙƒÉÑmF‘½ç±—+9¹­˜ÓÓêupÍëFŽYù3yLÊm[)7ƒ'²/mÇêÑÑtº—Œª-«0䕿³Üçäx2~=›ñ¿¨Ù¼ä‰b.Ì%³9€ ñ¬›Cy7¾Ÿ‚dê)#»Ù‡&ŒÀZ6‚Ê:R÷19ÚÉœ– ÀœfÜ[³ZÍ5‘ÉN¨Æ[1äeZ7ŽÍ°ã¦-y_ðdðìÎz1ñ›ñ,š/V Éå³]˜Ïe@Z;6±¼^2Åa×_s)µæ2žŒ€¼z7ãºf‹¯èÍ·œ™Ë©„¶@ [6¼QÀÃY3•÷³)™ ¸ð²oM–MQ›xÎ̦é°mÆÝbÍ–»“…ܤ‘!˜ÛFñªö%ªEL9˜5â} âôY×—lÇÌmÇTn½$Ï¢3‘Ï7l¨4âÙоpÉoé£6eÉîŒÀüz£u~R%·èÊn—þÁƒvÈøötÁ¢Z(û³)ë@¶oưl´°D•v0äjŒ@/Çê:#hºX2~Æ|”Ì€%lè‡àÓ7oôDò¨çäÙ˜¡ê:c¤]õLͬÖQŸ&Œ@&;:xò^ë4ROg<ݲ QxTÍ6¿ÙF»rë Œ&;:¸è¿¿ìÊzg;Ù¶uAý%ô©Òù2åÂÁÎh+gW¨–lÑàÀή/M³UšµtF•˜ó{hç¼N˜Úމiu0åf tðèÞ©a ]™‡2ÆŽ` 8Õô:t¿’%y³Ÿ•Û3«éY¾´O—ÑḬ̈rõéàeèÝ¡(ý7G&Ê:¸4t<º­–TìÇž6Ž),Z Ùׯ”Z}¥{P›N5¶pòl -|8]V®ô]n÷Egé8¹U33n”u%] Wµ•›Å½|»3¶tñâ(Ý4ÖY+µYYÒXNŽnTcY:8âèé‚OÊ’Þ²cË&ÒOG,ÞJ ŽÎ¨v³e‚VòRosϱD²tñèÕ;z%¬³á`åäÙ@hlìŒ~•Ue–>rý™ÎFRe"îGL(Ö8o»i8ö÷9ù£–{*4âYÑÕX±)Þ™G*Ñ”¥X2nËAñ˱¢žè‰M™ÎWg<¶@Ú ‘§™e[Á”²¦°X-¬mdIàÊO$Z &«ÞzedÌØF«E¨bˆÁY30hº-çH9®…\›*hÊ‹yÕç#ÌCv@ÿÙÿþÿÝàpydicom-0.9.7/dicom/testfiles/JPEG2000.dcm000644 000765 000024 00000006354 11726534363 020273 0ustar00darcystaff000000 000000 DICMULÀOBUI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457UI1.2.840.10008.1.2.4.91UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS$DERIVED\PRIMARY\WHOLE BODY\EMISSION DA19970911TM125206UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI.1.3.6.1.4.1.5962.1.1.8.1.3.20040826185059.5457 DA20040826!DA19970806"DA19970806#DA199708060TM1850591TM1229312TM1229313TM122931PSH`CSNMdCSWSD pLOGE Medical Systems€LOHospital Name 12345 PNSH-0400 SHgenieacq0LOWhole Body Bone `PNpPNLOMILLENNIUM MG !ST&JPEG 2000 irreversible (lossy) 2097:1 !SQÿÿÿÿþÿàÿÿÿÿPUI1.2.840.10008.5.1.4.1.1.7UUI.1.3.6.1.4.1.5962.1.1.8.1.1.20040826185059.5457@p¡SQÿÿÿÿþÿàÿÿÿÿSH121320SHDCM LOUncompressed predecessorþÿ àþÿÝàþÿ àþÿÝà’SQÿÿÿÿþÿàÿÿÿÿSH113040SHDCM LOLossy Compression þÿ àþÿÝà LO GEMS_GENIE_1 LOWB BONE SL SL UI41.2.840.113619.2.43.16112.2141964.41.61.870888524.19 LO WHOLE BODY !SL "SH #SL $SL`ê %SL N &SL 'SL *SL ,LO .FD`ffþ? 0LO WHOLE BODY @LO Patient,The ASL BDA19970806 CTM122538PNCompressedSamples^NM1  LO8NM10DA@CSM LOPNAS DS0.0000000DS0.000000`!SH°!LT@LTLO GEMS_GENIE_1 SL SLy LOTc99m LO WHOLE BODY_ELO WHOLE BODY_ESLSLSLFDÀð¥«k@SLSLSLSL#SL'SL(SL0LO WHOLE BODY_E3LOECOR4LOTc99m 5LOPMT 8SLB:SL;FDð?<FD>SL ?SLDFD @EFD°@FSLUFDð?VFDð?LO GEMS_GENIE_1FDàz‚@àz¢@SLSLSLŒSLFDFD€Q@FDFDFD&LTCS WHOLE BODYpIS3596452 qCSMANULO 172.16.193.2 LO2.0 0LOWhole Body Bone 0DS 654.8200251DS 1572.260022 BIS1210434 CIS950 DS1.671598CS1PS IS1899QCSHFS UI*1.3.6.1.4.1.5962.1.2.8.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.8.1.20040826185059.5457 SH8NM1 IS1 IS3 CS RUI,1.3.6.1.4.1.5962.1.4.8.1.20040826185059.5457 @LO @LTJPEG 2000 irreversible (lossy)(US(CS MONOCHROME2 (IS1 ( ATTT (US(US(0DS2.260000\2.260000 (QCSNRGY\LIN(US(US(US(US(SS(SS(!CS01(!DS2097TUSTUST UST!USTSH WHOLE BODY_EàOBÿÿÿÿþÿàþÿàúÿOÿQ)ÿR ÿ\#"wwwvâoonâgLgLgdPPPEWÒWÒWaÿdKakadu-2.2ÿ ˆÿ“À¸NêÑå-6Ò8ÕŸ–"ZÒ`Û‘pµàú#GúMìßUn?ð03úp³` "ìÀ¬@¤À‚{Ji™ªÓ/F\E,î†L0.E$=÷¿ˆ,íh,꜈ÀhᔫTÙÓÆ¨9_€€€ÿÙþÿÝàpydicom-0.9.7/dicom/testfiles/MR_small.dcm000644 000765 000024 00000023146 11726534363 020750 0ustar00darcystaff000000 000000 II*èDICMUL¾OBUI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSDERIVED\SECONDARY\OTHER DA20040826TM185434UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.4UI.1.3.6.1.4.1.5962.1.1.4.1.1.20040826185059.5457 DA20040826!DA"DA0TM1850591TM2TMPSH`CSMRpLO TOSHIBA_MEC €LOTOSHIBA PNSH-0400 SH 000000000 `PN----pPN----LOMRT50H1 PNCompressedSamples^MR1  LO4MR10DA@CSF  DS0DS80.0000 LO CSSE!CSNONE"CS#CS3DPDS0.8000€DS 4000.0000 DS240.0000ƒDS1.0000„DS 63.92433900 …SHH †IS1 ‘ISLO-0000200 LO V3.51*P25 DS90QCSHFS UI*1.3.6.1.4.1.5962.1.2.4.20040826185059.5457 UI,1.3.6.1.4.1.5962.1.3.4.1.20040826185059.5457 SH4MR1 IS1 IS0 IS1 2DS-83.9063\-91.2000\6.6406 7DS*1.0000\0.0000\0.0000\0.0000\1.0000\0.0000 RUI,1.3.6.1.4.1.5962.1.4.4.1.20040826185059.5457 `CS @LO ADS0.0000 @LT Uncompressed(US(CS MONOCHROME2 (US@(US@(0DS0.3125\0.3125 (US(US(US(US(SS(SS (PDS600 (QDS1600àOW ‰ûËëù”’8ag%=†il’`C1,;Z6‹·Ë¦?iƒ±s0+xJûŸ¤âɉµ¡Q\ !).0Ht‹Ž(H‰gŒÿÌ×}ÄSegnŽˆsC+=DeL@[x´G+I<v>þs€íúmŸ’o öõýÿ*Kcò6ÂS~%àp”ïTÀ–KObz›|G.H\b\IRX„&e" ü,‚xä£{.dqVK ûÿëàþ÷@ôÖ«L:ÃzÛ÷1*çšú*^D‡£«t^A<1&B\o6. øëíï÷ ·÷p²m³´wH2ùöìïÔíä /À½Ö0¯^Ï[VTtîŠ }@м´„sT"(KXU%=&óê<Ƙ¢?ëŽA%üÜÐÎÛÓÚï >ª±¾÷ŠÓLOÜUˆóß~¼«CƒÍ·§dJ, 5$-CB6# ÷5@#,2]ò.3+N#ÐÒàÑÖç$«¾4Ne½1]¹†ì ùÞ,œM}ËžtŠZ93'û6' !òí2! 5‚Éìb.$ßñÞÙåö#.®²Ã,s´ „¦Òö ¢Ê|tÁt…|a4&ï)  ó22'5Á†1(åšÒ\øíâõEq˜“Éõ¶ÂÙøƒƒ§-ƒyý!œ›—nGJ80ÿ"ðþü óþ 0[ª@ê'ZM•ÌmVX]U#tƒ‘}‡ƒ»Æ’Âéâ ά[[ÅO­Šc6R(9*ú÷ùÿüýü ü&0,CK£õËЊ”ïëÊo…lK+”|¡ˆskr˜ÝvøÏþÁ‹žb<*= ùëñø%þþ;ÿñ4.ME_‡¼Ë PyÃÀ‰-üØÊÓép~rvgWs¢¸9ÍØŸ²â’Jºe4(4óõíùBöúþ;>lª½Ü¡ø¿l©JøÐÁÈÓéÏÈÇ„•šŒpUQ‚ŽûjïVYÝå] wM5$ýêåçñü ,L:û-;ZoV^‰å)MKˆüà-'ý+9Q>_“˜yJ6ENn•ÔÌÚ |·:(ŠQ üùëíö *,$$*1'<jJh‰-Ì”¸,ügJG1$†¤4W\b†[-\=Pq«,ëg 7&!p.÷þëòþ÷ùW_S)O7nzŽ]OD¨kWŸý*CN"IºúPa‚Ž‚C ,;QÀ¯Á Ž˜%ûb)õéîçðëöíý)/D  ÿ4Trm³ƒ@õͯ”D Z2('F}]Ž„\„f+(=\¦ý„LM¡)Â{:ÿãåéïöá! !öQn‰†|g+ ¸P+þš[0OCÃAü}WTuh>(+ûg)p%ÄqNóîÿö ùì å', ýùM\|ZƒÚ`¸l ±˜i04z9 ÃyXMJAL †¸¼ ñmˆ¾€6ûòôê 5)  2GoˆkB`áˆêgû­{gO:|=·­vQcFZS:úûÿñðfs´ )WŠk»|MV  þ úô7þ%@j% E¾‘ÜçŸ(wa}hbËÛ¸íy\ZD^5ûìçòääð-rìà"Œc¨²ƒK ø ú. ûú(gŒsCÅwHêI8YC@Wš+Q"{­YFNS: õëÞåÿâæõ7½Ó¡¿hn¾±Føû úó   ï5gˆw/™„>ðǪ́ÌSA4Ef spk‰³ÎR=5B5þñãçöÛìxºˆÈPN¥È[úöüëå  úSsg (Sâãsny_SeFJXŒ…’¥»´b8(%1ôäõíßßù"•n¿`?yÎu% ðôëó×àüìêÞþ3BM(!h¯@7FqxQlÚW˜¦¨r`IF(!ìó"îæÝöH‡›rC`¾`<0 æò×êóûúÔõÿü 133[8# ,,ù<åÆ_m|݃`  ñá  0ck€UY£Ñ¡÷ÞÕèâõÒÝõÖÒÙáî"B]O37 ÞhÁpºý ÿ½nQ+ÿ÷òìñõC9Tƒ[l{è¤ åë×ÏåÞÐáÚåãÉÁÃæ6 “ùãÖü Dè;gSçZ±¤ŽC6 ôéõÿ:>H”Œ­ºâÚÕìÉߨÌÒÌÙá§ÂþˆTtVcT-d!ü Ü ½ÐÞSpDD&(  æåñý(:?O‡²Í´ÞàÅïÊĸ´·´Ÿª¬Ë"ªüú¸ŒÐ9VX矰‰7 õ7Wt?¦¨‚L9=,#&éçéûúø7(OM¾Ü8è½³äÕ°ÄÀ½È½HëXG¶‘ ]¿ÿ‘íîç¾’\ZUDiss[xjJ!!$+%#íâê%ùïöë(ûý„Êl½§Á©ÙÈîöÁ E<ü0'“m´Ï6;«‹‡õûʪxQ$ꪶºènkB(2ãæõ # "ßúÞíÀ¡§ÃÎÒÅÆmÛù³ ;>ónq/¯«Ñí·©‚ëM0U“¼â±~BC3 %í % #çÕÈòõ5A>㭨ζÊá>I•ã ê$ö¹¥]< ä¼ãÝÜÔº ™.:çÈ®[E-O8PK!  îÕÆÖð íи¯É·¬ÈÜôgZÌE.9{”›XôÄXÙäòÖ<ÈÊÞs¼×›@-%2'4DQG@EJ\8 !ÖãÇíëõêÜÃÄָݼù$=Msôˆ‹æèÒ¦0ØzK<1 ûóóH©NB ,)›/4S¥ÛÒ®)'(öÚöäáܨŽÁÉØÄæç¾â-þ%æv“%bÁ]j¦d.92 íèyï`âÞõ2h #(;bA9,.#åÛÃË¿·×áæÖÑÍÕëÇßaÖéâkgŒBÙ’…N*÷Ìeà¨'Ù×Ôá'65(*/H56KAüæáÀÀ¬¶½ËÖÔÔÐÑÑÜë$ö£²òÎÍÇ Ë@‰V[aôÝ©7ÕSéÍ#DH7*BGOR3(TaO1 õ÷Ü­©½ÃÓº¼¼ÕÃÃÊ÷Í=•C´ɦ‰È´¸­VBìÙeÙ_„ë½Þþ";.ITN-9EnU & í忥¶Ñâ­­µÄо¾ãk i9۷Ƚù–ÁÔ>$ ·¬zÙÆzÑËØÔáSQE">D@,YEkR#ú 0#Ú׫ÝÙ¦©«´ÆÀ¶Î×"À‹ìx!û%|-Ú=)Ó³¡kÖà5?úÙÑÞæNWNO(':gRV=Eúü==ýÙÂѶ¶ª½¯°´Ç¸·ºêQÓO½¨«íw7€ÈAþعƒCíïëkKÕ×ÓÔ_OOh\$<c?3K'Q?ýÿ7Dæ¾»ÃÀ´ÎÄÙÈ×ŵµ±ì^0èÊx€Ý¦1‘†46ïÔ¤)ä3¾¨k?ÚæÒ›XQqIX7G.11GV)?)/ÒÆ¹²ºÙèê×¶àêàı°è:Ê>–ØQÆ _MŠ\æ É]¾Xê÷ðÑѲU_dZJ$(:3#.A?W_U%úÔ¾«¿ª¾ÏæËÕ¯ÁçἬ¿²Ú‚kÎ0,]‰²¹˜YíŒýÖ~ýBüâÙæ³—^cBF4)@% ;*_rjKÚ³Ÿ £¼ÊÒÍÎʪ§ÓǺ¯Î˺Ôô!Q~ɯoälxÞxF’bP'#øâêøÐ›iO>J==23(- QjoTöœ®µ´Ÿ¯ª±Ì¶ª«¢§¾ÇÂå¬ðõèÞÙíOåµµÎñ†Z#¸µ)Pÿÿ^êZ4!TbH33=(NFÕ˜œª·¥¤¥²Ì²³³¤«¹¿¹ËÑЬ¦£«À'ˆG‹PâÕ¢Êê•ínY¡%ù÷Máf9<'emH)533 !½œšš¤³¬ª»Ã¸¥À „™É¶ÜDzÌÅ…‡˜tX¨/ýfö•5ThüD8MWÅôCv@\wG.33ñ濦œ´›¢­±Å¾£¢¨°Á“›Ç¨ËÐѹôn@þ?÷mÏ®”Ù»ƒ.Éâ{M%Àº}‰E,3e%8*Ô°ÃÀ¨º¡›¬¸Ä¢´ÞëἜ·²«¬®èTÊ+ž‹ç8Þ'ÊÅîwè’0˜Å³Ö¿ ôr~L*LL:'0;óë²­·À©³©ž ¶º¸¯ÊÖ®¨¼Ï§«Ì7ü5Á“7E«¥qJˆÉïüì•LÄ)ãb©µ'¯‘‡Z+?FDÚ¹ ¹¿À±®¤¡œœ¡Ÿ¥º·ÂÇÈõ ¶½5üF µqÐyç›å>Âô;ñ³G‰®Hr ÿcêu~E@42õÕË©—¦± š––¡œŸ®”“˜œ©¡¤één `&ž5¯Ñ¥¸Z•yW›®¦‚:>7÷—¬ÂQAëí½A°€Œc=!ñື›¡•¸™ª¨°º¶¯–‹Š™Ž•ôž“ Ñž]•[ëöO?_ïš–wœ¥©’bŸ#š|Y³Ÿ¶bǼ:ÝÐ¨ššŸŸÅ¦ÖáßÇ£–•‹œ¢”ª_¦ªO`d™AhÌ"ß”¢…wuŽ™’iœKo`SôµAÿ ðá¶¢š”¡¦ºÉ©Û¾µ§¾¢š”ª ¢ÁÀ2o,[½`t% |KàÉŸÜÛÌ“oE úýýWÆË'÷'Êoõèâñ š– •£¹²¸È³Ë¸Èµ¢—œ£Ç¾¿¢†’ÍiV‰ Àׯ–‡µˆšÊ¡s¬Ÿi·õ”ⶪʦ6-÷Ö ÈÕ­«¡¥©¡§»ÃËÊÌÈ»¸¦§¢š¥u»8•ø®i]±O:ïµ¥ÉדŸ ?S0Þ}ÿÇmûyŠ|kU@ÚÔÕÿÝ¿›Â¬§·®šË¶Ç±¢‘—¸7Ð´Þ þ—Þ 2 ᵘø×ÅÎ'°¤œ²—;úº ÿ^†¨•bAüîéïüæ°” Ð»­ºÊ¥°½Á»­è~G£¦%ßàæ]4Ø?þ *󯋥¹µ£MN@È©UËŽN¯žnJ# #ûÏ·œÀÍÚ¼­¥¦ž¥ÓQUñ4-Éþñ²WËÞAA#ša6GijE׿stn„@ ß¼ aF,;Sy”‰xaG<*ôø¿²ÀÔÚßǶ´c6É׎êÿײƒ“þÒ³xhlm* ÅsO4Ó½´½Éê&B8zv¦qX`MR?&ûðëÍ»´¸¿äà ò]œžI¬‡Õ¥ÂÁ©d¯ÃÉ£±”SèÓÃ̯žˆræë¿«¦º®*¾Ç©Yi^üÿüÿOB~ þÜpydicom-0.9.7/dicom/testfiles/no_meta_group_length.dcm000644 000765 000024 00000000630 11726534363 023432 0ustar00darcystaff000000 000000 DICMOBUI1.2.840.10008.5.1.4.1.1.481.1UI"1.3.46.423632.131558.1322675745.41UI1.2.840.10008.1.2UI"1.2.826.0.1.3680043.2.135.1066.101SH 1.4.1/WIN32AEIVIEW ORIGINAL\PRIMARY\PORTAL 20111130125601.140000 pydicom-0.9.7/dicom/testfiles/priv_SQ.dcm000644 000765 000024 00000001024 11726534363 020614 0ustar00darcystaff000000 000000 DICMUL¤OBUI1.2.840.10008.5.1.4.1.1.4UI41.1.111.111111.1.111.1111111111.1111.1111111111.111UI1.2.840.10008.1.2UI 1.1.1.1.1SHtest?aaabbbccc MEDICAL SYSTEMS ?ÿÿÿÿþÿàÿÿÿÿ111111111111111 ?123456789 1234567 1234567 ?11111111093402.100721-0700?image1234567 at 123 ?Values updated from xxx xxxx. þÿ àþÿÝàpydicom-0.9.7/dicom/testfiles/README.txt000644 000765 000024 00000005173 11726534363 020253 0ustar00darcystaff000000 000000 Test Files used for testing pydicom ----------------------------------- I obtained images to test the pydicom code, and revised them as follow: * images were often downsized to keep the total file size quite small (typically <50K-ish). I wanted unittests for the code where I could run a number of tests quickly, and with files I could include in the source (and binary) distributions without bloating them too much * In some cases, the original files have been binary edited to replace anything that looks like a real patient name I believe there is no restriction on using any of these files in this manner. CT_small.dcm * CT image, Explicit VR, LittleEndian * Downsized to 128x128 from 'CT1_UNC', ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ MR_small.dcm * MR image, Explicit VR, LittleEndian * Downsized to 64x64 from 'MR1_UNC', ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ JPEG2000.dcm * JPEG 2000 small image * to test JPEG transfer syntax, eventually JPEG decompression * Edited 'NM1_J2KI' from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04 image_dfl.dcm * Compressed (using "deflate" zlib compression) after FileMeta * 'image_dfl' from http://www.dclunie.com/images/compressed/ ExplVR_BigEnd.dcm * Big Endian test image * Also is Samples Per Pixel of 3 (RGB) * Downsized to 60x80 from 'US-RGB-8-epicard' at http://www.barre.nom.fr/medical/samples/ JPEG-LL.dcm * NM1_JPLL from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ * Transfer Syntax 1.2.840.10008.1.2.4.70: JPEG Lossless Default Process 14 [Selection Value 1] JPEG-lossy.dcm * NM1_JPLY from ftp://medical.nema.org/MEDICAL/Dicom/DataSets/WG04/ * 1.2.840.10008.1.2.4.51 Default Transfer Syntax for Lossy JPEG 12-bit Created by a commercial radiotherapy treatment planning system and modified: rtplan.dcm Implicit VR, Little Endian rtdose.dcm Implicit VR, Little Endian chr*.dcm * Character set files for testing (0008,0005) Specific Character Set * from http://www.dclunie.com/images/charset/SCS* * downsized to 32x32 since pixel data is irrelevant for these (test pattern only) test_SR.dcm * from ftp://ftp.dcmtk.org/pub/dicom/offis/software/dscope/dscope360/support/srdoc103.zip, file "test.dcm" * Structured Reporting example, many levels of nesting priv_SQ.dcm * a file with an undefined length SQ item in a private tag. * minimal data elements kept from example files in issues 91, 97, 98 zipMR.gz * a gzipped version of MR_small.dcm * used for checking that deferred read reopens as zip again (issue 103) pydicom-0.9.7/dicom/testfiles/reportsi.dcm000644 000765 000024 00000005630 11726534363 021107 0ustar00darcystaff000000 000000 DICMULÈOBUI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.5.3SHOFFIS_DCMTK_353 CS ISO_IR 100DA20050530TM160527UI1.2.276.0.7230010.3.0.3.5.3UI1.2.840.10008.5.1.4.1.1.88.11UI41.2.276.0.7230010.3.1.4.1787205428.166.1117461927.10 DA#DA200505300TM3TM160527PSH`CSSRpLOKuratorium OFFIS e.V. PNLast Name^First NameSQÿÿÿÿþÿàÿÿÿÿSH99_OFFIS_DCMTK UI1.2.276.0.7230010.3.0.0.1STOFFIS DCMTK Coding Scheme ST<Kuratorium OFFIS e.V., Escherweg 2, 26121 Oldenburg, Germanyþÿ àþÿÝà0LO$OFFIS Structured Reporting Templates>LO IHE Year 2 - Simple Image ReportSQÿÿÿÿþÿÝàPNLast Name^First Name LO0DA@CSO UI41.2.276.0.7230010.3.1.2.1787205428.166.1117461927.5 UI41.2.276.0.7230010.3.1.3.1787205428.166.1117461927.11 SH IS1 IS1 @@ CS CONTAINER @C SQÿÿÿÿþÿàÿÿÿÿSHIHE.01SH99_OFFIS_DCMTKLODocument Titleþÿ àþÿÝà@P CSSEPARATE@r£SQÿÿÿÿþÿÝà@‘¤CSPARTIAL @“¤CS UNVERIFIED@0§SQÿÿÿÿþÿàÿÿÿÿ@ CSHAS OBS CONTEXT @@ CSCODE@C SQÿÿÿÿþÿàÿÿÿÿSHIHE.02SH99_OFFIS_DCMTKLOObservation Context Modeþÿ àþÿÝà@h¡SQÿÿÿÿþÿàÿÿÿÿSHIHE.03SH99_OFFIS_DCMTKLODIRECTþÿ àþÿÝàþÿ àþÿàÿÿÿÿ@ CSHAS OBS CONTEXT @@ CSPNAME @C SQÿÿÿÿþÿàÿÿÿÿSHIHE.04SH99_OFFIS_DCMTKLORecording Observer's Name þÿ àþÿÝà@#¡PN Enter textþÿ àþÿàÿÿÿÿ@ CSHAS OBS CONTEXT @@ CSTEXT@C SQÿÿÿÿþÿàÿÿÿÿSHIHE.05SH99_OFFIS_DCMTKLO&Recording Observer's Organization Nameþÿ àþÿÝà@`¡UT Enter textþÿ àþÿàÿÿÿÿ@ CSHAS OBS CONTEXT @@ CSCODE@C SQÿÿÿÿþÿàÿÿÿÿSHIHE.06SH99_OFFIS_DCMTKLOObservation Context Modeþÿ àþÿÝà@h¡SQÿÿÿÿþÿàÿÿÿÿSHIHE.07SH99_OFFIS_DCMTKLOPATIENT þÿ àþÿÝàþÿ àþÿàÿÿÿÿ@ CSCONTAINS@@ CS CONTAINER @C SQÿÿÿÿþÿàÿÿÿÿSHIHE.08SH99_OFFIS_DCMTKLOSection Heading þÿ àþÿÝà@P CSSEPARATE@0§SQÿÿÿÿþÿàÿÿÿÿ@ CSCONTAINS@@ CSTEXT@C SQÿÿÿÿþÿàÿÿÿÿSHIHE.09SH99_OFFIS_DCMTKLO Report Text þÿ àþÿÝà@`¡UT Enter text@0§SQÿÿÿÿþÿàÿÿÿÿ™SQÿÿÿÿþÿàÿÿÿÿPUI0UUI0þÿ àþÿÝà@ CSINFERRED FROM @@ CSIMAGE @C SQÿÿÿÿþÿàÿÿÿÿSHIHE.10SH99_OFFIS_DCMTKLOImage Reference þÿ àþÿÝàþÿ àþÿÝàþÿ àþÿàÿÿÿÿ™SQÿÿÿÿþÿàÿÿÿÿPUI0UUI0þÿ àþÿÝà@ CSCONTAINS@@ CSIMAGE @C SQÿÿÿÿþÿàÿÿÿÿSHIHE.10SH99_OFFIS_DCMTKLOImage Reference þÿ àþÿÝàþÿ àþÿÝàþÿ àþÿÝàpydicom-0.9.7/dicom/testfiles/rtdose.dcm000644 000765 000024 00000016620 11726534363 020541 0ustar00darcystaff000000 000000 DICMULœOBUI1.2.840.10008.5.1.4.1.1.481.2UI*1.2.999.999.99.9.9999.9999.20030818153516UI1.2.840.10008.1.2UI1.2.999.999.99.9.9.9200309031500311.2.840.10008.5.1.4.1.1.481.2*1.9.999.999.99.9.9999.9999.20030818153516 200308050115747P`RTDOSEpManufacturer name here Computer001 $Treatment Planning System name here Lastname^Firstname id11111 0@O P  version 1 1.2.999.999.99.9.9999.8888 1.2.777.777.77.7.7777.7777 S1 1  22189.431250000000\199.431250000000\-761.87000000000 721.00000000000000\0.0\0.0\0.0\1.00000000000000\0.0 R22.22.222.2.222222.2.2222222222222222222222222222.2 @(( MONOCHROME2 (15( 0 ( ( (0"10.0000000000000\10.0000000000000 ( ( ((0RELATIVE0PHYSICAL0 BEAM0 ò0.0\5.00000000000000\10.0000000000000\15.0000000000000\20.0000000000000\25.0000000000000\30.0000000000000\35.0000000000000\40.0000000000000\45.0000000000000\50.0000000000000\55.0000000000000\60.0000000000000\65.0000000000000\70.0000000000000 0 1.0000000e-6 0”þÿàŒP1.2.840.10008.5.1.4.1.1.481.5U*1.2.123.456.78.9.0123.4567.89012345678901 0 ,þÿà$ 0þÿà 01 0"1 àpèèÐÐ`û p"p"ˆ@0@0(4(4p(  ø;ÈCà?à?€UhY8aP]€UÈI eðli e¨~‚`Šx†¨~ØvHŽ–0’HŽˆ³p·@¿X»ˆ³¸«(ÃøÊÇ(Ã8ð ôðûðû ôPìÀ ¨Øÿè,¸4ˆ< 8¸4è,p@@HXD 8Pu } ؈ ؈ ð„ 8y ÀŒ ” ¨ ð„ ˆÅ @Ñ Ù øÜ Ù XÍ àà °è àà (Õ x! 0- 5 5 5 0- Ð< ¸@ è8 0- èè0`ûЈp"ˆX,(4@0X,p(  8à?ÈCà?€UP]hY€U˜Q°M8aiðl e¨~x†x†¨~¨~Øv`Š––HŽˆ³X»X»p·ˆ³ ¯@¿øÊøÊ(Ã8ððûøø ô8ðØÿ¨ Øÿè, 8 8 8¸4Ð0p@@H@Hˆ<Pu ð„ Øˆ ð„ ð„  ÀŒ ” ” ؈ pÉ Ù Ù Ù Ù (Õ Èä °è Èä Ù x! 1 5 5 5 1 Ð<  D ¸@ 5 Ðè0`û`ûèˆp"ˆX,(4@0p(    @0à?ÈCà?€U8ahY˜QÈIÈIP]iðli¨~`Š‚¨~ØvØvx†0’–0’ˆ³@¿X»ˆ³ ¯ ¯X»ÇøÊÇ8ðØÿðû ô8ð8ðØÿ¨ ÀÐ0ˆ< 8¸4Ð0Ð0p@@H@Hp@ } ؈ ؈ ð„   ÀŒ ” ” ÀŒ XÍ øÜ øÜ Ù (Õ (Õ àà °è °è àà H) 5 è8 5 5 1 Ð< ¸@ ¸@ è8 èÐ Hÿ¨ï¨ï ¸p"p"@08@0ˆ$èè@0ø;ÈCÈChY8ahY°MøAøAhY eðlix†`Š‚Àzoox†HŽ––X»@¿X»ˆ³ЧЧ@¿(ÃøÊøÊøØÿðû ôPìPìØÿÀ ¨¸4p@ˆ<¸4è,Ð0p@XD@HXD ÀŒ ؈ ð„ }  ¨ ¨ ” ¨ (Õ àà øÜ Ù (Õ Ù °è Èä °è Èä 0- è8 è8 5 1 5 ¸@ ¸@  D Ð< ÐÐ x÷Øç¨ï0Јp"(48@0¸ èp(8à?ÈCP]8ahYÈI(:øA€U8aiðl`Š`Šx†Øv kðr‚`Š0’–@¿@¿X» ¯è£¸«p·(ÃÇøÊðûØÿðû8ð€äPìðûÀ¨¨ 8p@ˆ<¸4)Ð0p@XD@H@Hð„ ÀŒ ÀŒ ð„ 8y  ÀŒ ¨ ” ¨ Ù àà àà Ù @Ñ Ù Èä °è °è Èä 1 Ð< Ð< 5 1 5 ¸@ ¸@  D Ð< ÐÐè¨ïàØç`ûèˆp"88@0è0    (4à?ÈC8a8ahYøA@6(:ÈIP]iðl`Š`Šx†o8g kØv`Š0’–(Ã@¿X»Ч è£ ¯@¿ÇøÊØÿØÿðûPì€ähè ôØÿ¨¨p@p@p@è,)è,¸4XD@H@H؈ ÀŒ ÀŒ } 8y } ð„ ¨ ” ¨ øÜ àà àà (Õ @Ñ (Õ øÜ °è °è Èä 5 Ð< Ð< 1 0- 1 è8 ¸@  D Ð< ¸¸èðãàà¨ï  p"88@00 0 Hè@0ø;ÈC8a8aP]@6@6X2øAhY eðlHŽ`Šx†8gPcPcðrx†0’–(Ã(Ã@¿  œ¸«@¿ÇøÊÀÀØÿ€ä€ä˜àPìØÿ¨¨p@XDp@%)%Ð0p@@H@HÀŒ ¨ ÀŒ 8y 8y 8y  ¨ ” ¨ àà Èä Èä XÍ @Ñ @Ñ Ù Èä °è Èä è8 ¸@ ¸@ 0- 1 0- 5 ¸@ ¸@ ¸@ ˆˆè¨ïà ÜÀë p"à?à?@0èH`X,ø;ÈCiihYøA@6p.>€U eðl–0’x†oPch_o‚HŽ–øÊÇ@¿Чœ0˜ЧX»ÇøÊ¨¨ØÿPì€ä˜àPìðû¨¨XD@Hp@Ð0)%è,p@XD@H¨ ” ¨  8y Pu  ÀŒ ” ¨ àà °è Èä (Õ @Ñ XÍ (Õ Èä °è Èä Ð<  D ¸@ 5 1 0- 5 ¸@ ¸@ ¸@ p"ˆÐóà ÜØç ˆÈCÈC(4Ð0 `X,ø;ÈCiðlP]àE@6p.>€U ei0’–`ŠðrPch_ k‚HŽ–ÇàÎ@¿¸« 0˜è£X»(ÃøÊÀxØÿ8ð€ä˜àhèðûÀ¨XD(Lp@Ð0)%è,ˆ<XDXDÀŒ `œ ¨  8y Pu } ÀŒ ” ¨ àà €ð Èä Ù @Ñ XÍ (Õ Èä °è Èä Ð< ˆH ¸@ 5 1 0- 1 ¸@ ¸@ ¸@  ¸èÀëààÀë p"ø;8@0è0 HX,ø;ÈC e ehYøA@6@6>€U eiHŽHŽx†oPcPc k‚HŽ–(Ã(Ã@¿Ч œЧX»ÇøÊØÿÀØÿPì€ä˜àhèðûÀ¨p@XDp@è,)%è,ˆ<XDXD؈ ¨ ¨  8y 8y } ÀŒ ” ¨ øÜ Èä Èä (Õ @Ñ @Ñ (Õ Èä °è Èä è8 ¸@ ¸@ 5 1 0- 1 Ð< ¸@ Ð< ¸ÐèóðãðãÀë興8(4@0Ð0  @0à?à?8aP]hYàE@6(:>hYii`Š`Šx†ðr8g8g kx†0’–@¿@¿X»¸« è£è£X»øÊøÊðûØÿðû8ð€ä€ähèØÿ¨¨ 8p@ˆ<Ð0)))p@@HXDð„ ÀŒ ÀŒ  8y } } ÀŒ ” ¨ Ù àà àà Ù @Ñ @Ñ (Õ Èä °è Èä 5 Ð< Ð< 5 0- 1 1 ¸@  D Ð< ÐÐèHÿ¨ï¨ïóèp"ˆ(4(4@0  èèÐ(4ÈCà?P]8ahY°MøAøAàEP]iix†`Šx†Àzooðr`Š–0’X»@¿X»ˆ³ЧЧ¸«@¿øÊÇøØÿðû ôPìPìPìØÿ ¨ 8ˆ<ˆ<¸4è,è,Ð0p@@HXDð„ ÀŒ ÀŒ ð„ }   ÀŒ ” ¨ (Õ àà àà øÜ (Õ (Õ (Õ Èä °è Èä 1 è8 Ð< è8 1 5 1 Ð< ¸@ Ð< è¸è`û`û0Ј @08@0p(    ˆ$(4à?ø;hY8aP]€U°MÈI˜QP]i e‚`Šx†‚ÀzØvÀz`Š0’HŽp·(ÃX»p· ¯ ¯ˆ³@¿ÇÇøØÿðûø ô ô ôØÿ¨À¸4ˆ<ˆ< 8¸4¸4¸4p@XDp@ ÀŒ ÀŒ ؈ ð„ ð„ ð„ ÀŒ ” ÀŒ (Õ øÜ àà øÜ øÜ øÜ øÜ Èä °è àà 0- è8 Ð< è8 è8 è8 è8 Ð< ¸@ è8 è¸Ðè и¸@08(4@0X,X,@0(4ø;8hY8aP]hY€U€UhYP] e8a‚`Š`Šx†‚‚‚`ŠHŽ`Šp·(Ã@¿X»p·p·X»@¿(Ã@¿ ôØÿØÿðûøøðûØÿÀðûÐ0ˆ<ˆ<ˆ< 8 8ˆ<p@p@ˆ< } ؈ ÀŒ ؈ ؈ ؈ ؈ ÀŒ ÀŒ ð„ @Ñ øÜ àà àà øÜ øÜ àà àà àà Ù H) 5 Ð< è8 è8 è8 è8 Ð< Ð< 1 èиèèèèÐи@0(48(4@0@0(4888€UP]8aP]hYhYP]8a8a8a¨~`Š`Šx†x†x†x†`Š`Š`Šˆ³@¿(ÃX»X»X»X»@¿@¿X»8ððûØÿðûðûðûðûØÿØÿ ôè, 8p@ˆ<ˆ<ˆ<ˆ<ˆ<ˆ<Ð08y ð„ ÀŒ ÀŒ ؈ ؈ ÀŒ ÀŒ ؈  pÉ Ù àà àà àà àà àà àà øÜ (Õ `% 5 è8 è8 è8 è8 è8 è8 5 1 pydicom-0.9.7/dicom/testfiles/rtplan.dcm000644 000765 000024 00000005160 11726534363 020536 0ustar00darcystaff000000 000000 DICMULœOBUI1.2.840.10008.5.1.4.1.1.481.5UI*1.2.999.999.99.9.9999.9999.20030903150023UI1.2.840.10008.1.2UI1.2.888.888.88.8.8.8200309031500311.2.840.10008.5.1.4.1.1.481.5*1.2.777.777.77.7.7777.7777.20030903150023 200307160153557P`RTPLANpManufacturer name here€Here COMPUTER002 @Radiation Therappoperator$Treatment Planning System name here Last^First^mid^pre id00001 0@O   softwareV1 01.22.333.4.555555.6.7777777777777777777777777777 1.2.333.444.55.6.7777.8888 study1 2 0Plan1 0Plan1 020030903 0150023 0 PATIENT 0Dþÿઠ01 0 COORDINATES 0iso 02239.531250000000\239.531250000000\-741.87000000000 0 ORGAN_AT_RISK 0#75.0000000000000 0,75.0000000000000þÿàŠ 02 0 COORDINATES 0PTV 02239.531250000000\239.531250000000\-751.87000000000 0 TARGET 0&30.8262030000000 0p´þÿଠ0q1 0x30 0€1 0 0 0|þÿàt 0‚2239.531250000000\239.531250000000\-751.87000000000 0„1.02754010000000 0†116.003669700000 01 0°ÐþÿàÈp Linac co. €Here@Radiation Therap Zapper90009999 0²unit001 0³MU 0´1000.00000000000 0¶8þÿà 0¸X 0¼1 þÿà 0¸Y 0¼1 0À1 0ÂField 1 0ÄSTATIC 0ÆPHOTON 0Î TREATMENT 0Ð0 0à0 0í0 0ð0 01.00000000000000 02 0^þÿàÔ 00 06.00000000000000 0650.000000000000 0xþÿà4 0¸X 0"-100.00000000000\100.000000000000 þÿà4 0¸Y 0"-100.00000000000\100.000000000000 00.0 0NONE 0 0.0 0!NONE 0"0.0 0#NONE 0%0.0 0&NONE 0( 0) 0* 0,2235.711172833292\244.135437110782\-724.97815409918 00898.429664831309 040.0 0P<þÿà 0 0.0 0Q1 þÿà 0 0.0 0Q2 þÿàz 01 041.00000000000000 0PPþÿà 0  9.9902680e-1 0Q1 þÿà" 0 1.00000000000000 0Q2 0j1 0€&þÿàQHFS 0‚1 0² 0tþÿàlP1.2.840.10008.5.1.4.1.1.481.5U*1.9.999.999.99.9.9999.9999.20030903145128 0U PREDECESSOR 0`RþÿàJP1.2.840.10008.5.1.4.1.1.481.3U1.2.333.444.55.6.7777.888880 UNAPPROVEDpydicom-0.9.7/dicom/testfiles/rtplan.dump000644 000765 000024 00000034212 11726534363 020740 0ustar00darcystaff000000 000000 0000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... 0070 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0080 : 44 49 43 4d DICOM prefix 'DICM' ------------ File meta information ------------------------------------- (Always Explicit VR, Little Endian) 0084 : 02 00 00 00 (0002,0000) 0088 : 55 4c UL 008A : 04 00 value length 4 bytes 008C : 9c 00 00 00 value = 156 0090 : 02 00 01 00 (0002, 0001) 0094 : 4f 42 Explicit VR 'OB' 0096 : 00 00 2-byte reserved 0098 : 02 00 00 00 value length = 2 009c : 00 01 009e : 02 00 02 00 (0002, 0002) Media Storage SOP Class UID 00a2 : 55 49 Explicit VR 'UI' 00a4 : 1e 00 value length 30 bytes 00a6 : 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 1.2.840.10008.5. 00b6 : 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 1.4.1.1.481.5 00c3 00 pad to even length 00c4 : 02 00 03 00 (0002, 0003) 00c8 : 55 49 Explicit VR 'UI' 00ca : 2a 00 Value length 42 bytes 00cc : 31 2e 32 2e 39 39 39 2e 39 39 39 2e 39 39 2e 39 1.2.999.999.99.9 00dc : 2e 39 39 39 39 2e 39 39 39 39 2e 32 30 30 33 30 .9999.9999.20030 00ec : 39 30 33 31 35 30 30 32 33 903150023 00f5 : 00 pad to even length 00f6 : 02 00 10 00 55 49 12 00 31 2e .....UI..1. 0100 : 32 2e 38 34 30 2e 31 30 30 30 38 2e 31 2e 32 00 2.840.10008.1.2. 0110 : 02 00 12 00 55 49 14 00 31 2e 32 2e 38 38 38 2e ....UI..1.2.888. 0120 : 38 38 38 2e 38 38 2e 38 2e 38 2e 38 08 00 12 00 888.88.8.8.8.... 0130 : 08 00 00 00 32 30 30 33 30 39 30 33 08 00 13 00 ....20030903.... 0140 : 06 00 00 00 31 35 30 30 33 31 08 00 16 00 1e 00 ....150031...... 0150 : 00 00 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e ..1.2.840.10008. 0160 : 35 2e 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 00 5.1.4.1.1.481.5. 0170 : 08 00 18 00 2a 00 00 00 31 2e 32 2e 37 37 37 2e ....*...1.2.777. 0180 : 37 37 37 2e 37 37 2e 37 2e 37 37 37 37 2e 37 37 777.77.7.7777.77 0190 : 37 37 2e 32 30 30 33 30 39 30 33 31 35 30 30 32 77.2003090315002 01a0 : 33 00 08 00 20 00 08 00 00 00 32 30 30 33 30 37 3... .....200307 01b0 : 31 36 08 00 30 00 06 00 00 00 31 35 33 35 35 37 16..0.....153557 01c0 : 08 00 50 00 00 00 00 00 08 00 60 00 06 00 00 00 ..P.......`..... 01d0 : 52 54 50 4c 41 4e 08 00 70 00 16 00 00 00 4d 61 RTPLAN..p.....Ma 01e0 : 6e 75 66 61 63 74 75 72 65 72 20 6e 61 6d 65 20 nufacturer name 01f0 : 68 65 72 65 08 00 80 00 04 00 00 00 48 65 72 65 here........Here 0200 : 08 00 90 00 00 00 00 00 08 00 10 10 0c 00 00 00 ................ 0210 : 43 4f 4d 50 55 54 45 52 30 30 32 20 08 00 40 10 COMPUTER002 ..@. 0220 : 10 00 00 00 52 61 64 69 61 74 69 6f 6e 20 54 68 ....Radiation Th 0230 : 65 72 61 70 08 00 70 10 08 00 00 00 6f 70 65 72 erap..p.....oper 0240 : 61 74 6f 72 08 00 90 10 24 00 00 00 54 72 65 61 ator....$...Trea 0250 : 74 6d 65 6e 74 20 50 6c 61 6e 6e 69 6e 67 20 53 tment Planning S 0260 : 79 73 74 65 6d 20 6e 61 6d 65 20 68 65 72 65 20 ystem name here 0270 : 10 00 10 00 12 00 00 00 4c 61 73 74 5e 46 69 72 ........Last^Fir 0280 : 73 74 5e 6d 69 64 5e 70 72 65 10 00 20 00 08 00 st^mid^pre.. ... 0290 : 00 00 69 64 30 30 30 30 31 20 10 00 30 00 00 00 ..id00001 ..0... 02a0 : 00 00 10 00 40 00 02 00 00 00 4f 20 18 00 20 10 ....@.....O .. . 02b0 : 0a 00 00 00 73 6f 66 74 77 61 72 65 56 31 20 00 ....softwareV1 . 02c0 : 0d 00 30 00 00 00 31 2e 32 32 2e 33 33 33 2e 34 ..0...1.22.333.4 02d0 : 2e 35 35 35 35 35 35 2e 36 2e 37 37 37 37 37 37 .555555.6.777777 02e0 : 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 7777777777777777 02f0 : 37 37 37 37 37 37 20 00 0e 00 1a 00 00 00 31 2e 777777 .......1. 0300 : 32 2e 33 33 33 2e 34 34 34 2e 35 35 2e 36 2e 37 2.333.444.55.6.7 0310 : 37 37 37 2e 38 38 38 38 20 00 10 00 06 00 00 00 777.8888 ....... 0320 : 73 74 75 64 79 31 20 00 11 00 02 00 00 00 32 20 study1 .......2 0330 : 0a 30 02 00 06 00 00 00 50 6c 61 6e 31 20 0a 30 .0......Plan1 .0 0340 : 03 00 06 00 00 00 50 6c 61 6e 31 20 0a 30 06 00 ......Plan1 .0.. 0350 : 08 00 00 00 32 30 30 33 30 39 30 33 0a 30 07 00 ....20030903.0.. 0360 : 06 00 00 00 31 35 30 30 32 33 0a 30 0c 00 08 00 ....150023.0.... 0370 : 00 00 50 41 54 49 45 4e 54 20 0a 30 10 00 44 01 ..PATIENT .0..D. 0380 : 00 00 fe ff 00 e0 aa 00 00 00 0a 30 12 00 02 00 ...........0.... 0390 : 00 00 31 20 0a 30 14 00 0c 00 00 00 43 4f 4f 52 ..1 .0......COOR 03a0 : 44 49 4e 41 54 45 53 20 0a 30 16 00 04 00 00 00 DINATES .0...... 03b0 : 69 73 6f 20 0a 30 18 00 32 00 00 00 32 33 39 2e iso .0..2...239. 03c0 : 35 33 31 32 35 30 30 30 30 30 30 30 5c 32 33 39 531250000000.239 03d0 : 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 2d 37 .531250000000.-7 03e0 : 34 31 2e 38 37 30 30 30 30 30 30 30 30 30 0a 30 41.87000000000.0 03f0 : 20 00 0e 00 00 00 4f 52 47 41 4e 5f 41 54 5f 52 .....ORGAN_AT_R 0400 : 49 53 4b 20 0a 30 23 00 10 00 00 00 37 35 2e 30 ISK .0#.....75.0 0410 : 30 30 30 30 30 30 30 30 30 30 30 30 0a 30 2c 00 000000000000.0,. 0420 : 10 00 00 00 37 35 2e 30 30 30 30 30 30 30 30 30 ....75.000000000 0430 : 30 30 30 30 fe ff 00 e0 8a 00 00 00 0a 30 12 00 0000.........0.. 0440 : 02 00 00 00 32 20 0a 30 14 00 0c 00 00 00 43 4f ....2 .0......CO 0450 : 4f 52 44 49 4e 41 54 45 53 20 0a 30 16 00 04 00 ORDINATES .0.... 0460 : 00 00 50 54 56 20 0a 30 18 00 32 00 00 00 32 33 ..PTV .0..2...23 0470 : 39 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 32 9.531250000000.2 0480 : 33 39 2e 35 33 31 32 35 30 30 30 30 30 30 30 5c 39.531250000000. 0490 : 2d 37 35 31 2e 38 37 30 30 30 30 30 30 30 30 30 -751.87000000000 04a0 : 0a 30 20 00 06 00 00 00 54 41 52 47 45 54 0a 30 .0 .....TARGET.0 04b0 : 26 00 10 00 00 00 33 30 2e 38 32 36 32 30 33 30 &.....30.8262030 04c0 : 30 30 30 30 30 30 0a 30 70 00 b4 00 00 00 fe ff 000000.0p....... 04d0 : 00 e0 ac 00 00 00 0a 30 71 00 02 00 00 00 31 20 .......0q.....1 04e0 : 0a 30 78 00 02 00 00 00 33 30 0a 30 80 00 02 00 .0x.....30.0.... 04f0 : 00 00 31 20 0a 30 a0 00 02 00 00 00 30 20 0c 30 ..1 .0......0 .0 0500 : 04 00 7c 00 00 00 fe ff 00 e0 74 00 00 00 0a 30 ..|.......t....0 0510 : 82 00 32 00 00 00 32 33 39 2e 35 33 31 32 35 30 ..2...239.531250 0520 : 30 30 30 30 30 30 5c 32 33 39 2e 35 33 31 32 35 000000.239.53125 0530 : 30 30 30 30 30 30 30 5c 2d 37 35 31 2e 38 37 30 0000000.-751.870 0540 : 30 30 30 30 30 30 30 30 0a 30 84 00 10 00 00 00 00000000.0...... 0550 : 31 2e 30 32 37 35 34 30 31 30 30 30 30 30 30 30 1.02754010000000 0560 : 0a 30 86 00 10 00 00 00 31 31 36 2e 30 30 33 36 .0......116.0036 0570 : 36 39 37 30 30 30 30 30 0c 30 06 00 02 00 00 00 69700000.0...... 0580 : 31 20 0582 : 0a 30 b0 00 (300a, 00b0) Beam Sequence Implicit VR 'SQ' 0586 : d0 03 00 00 length 976 bytes 058a : fe ff 00 e0 Item tag (FFFE, E000) 058e : c8 03 00 00 Item length 968 bytes 0592 : 08 00 70 00 (0008, 0070) Manufacturer Implicit VR 'LO' 0596 : 0a 00 00 00 Value length 10 bytes 059a : 4c 69 6e 61 63 20 63 6f 2e Linac co. 05a3 : 20 pad to even length with blank 05a4 : 08 00 80 00 (0008, 0080) Institution Name 04 00 00 00 Value length 4 48 65 72 65 value 'Here' 05b0 : 08 00 40 10 (0008, 1040) Institutional Department Name 10 00 00 00 value length 16 52 61 64 69 61 74 69 6f 6e 20 54 68 65 72 61 70 value 'Radiation Therap' 05c8 : 08 00 90 10 (0008, 1090) Manufacturer's Model Name 0a 00 00 00 value length 10 05d0 : 5a 61 70 70 65 72 39 30 30 30 value 'Zapper9000' 18 00 00 10 (0018, 1000) Device Serial Number 04 00 00 00 value length 4 05e2 : 39 39 39 39 value '9999' 0a 30 b2 00 (300a, 00b2) Treatment Machine Name 08 00 00 00 value length 8 75 6e 69 74 30 30 31 20 value 'unit001 " 05f5 : 0a 30 b3 00 (300a, 00b3) Primary Dosimeter Unit 02 00 00 00 value length 2 4d 55 value 'MU' 0600 : 0a 30 b4 00 (300a, 00b4) Source-Axis Distance 10 00 00 00 value length 16 31 30 30 30 2e 30 30 30 30 30 30 30 30 30 30 30 value '1000.00000000000' 0608: 0a 30 b6 00 (300a, 00b6) Beam Limiting Device Sequence 38 00 00 00 length 56 0620 : fe ff 00 e0 Item tag (FFFE, E000) 14 00 00 00 Item length 20 0a 30 b8 00 (300a, 00b8) RT Beam Limiting Device Type 02 00 00 00 value length 2 58 20 value 'X ' 0a 30 bc 00 (300a, 00bc) Number of Leaf/Jaw Pairs 02 00 00 00 value length 2 31 20 value '1 ' fe ff 00 e0 Item tag (FFFE, E000) 14 00 00 00 Item length 20 0a 30 b8 00 (300a, 00b8) RT Beam Limiting Device Type 02 00 00 00 value length 2 59 20 value 'Y ' 0a 30 bc 00 (300a, 00bc) Number of Leaf/Jaw Pairs 0652 : 02 00 00 00 value length 2 31 20 value '1 ' 0a 30 c0 00 (300a, 00c0) Beam Number 02 00 00 00 value length 2 0660 : 31 20 value '1 ' 0a 30 c2 00 (300a, 00c2) Beam Name 08 00 00 00 value length 8 46 69 65 6c 64 20 31 20 'Field 1 ' 0672 : 0a 30 c4 00 06 00 00 00 53 54 41 54 49 43 1 .0......STATIC 0680 : 0a 30 c6 00 06 00 00 00 50 48 4f 54 4f 4e 0a 30 .0......PHOTON.0 0690 : ce 00 0a 00 00 00 54 52 45 41 54 4d 45 4e 54 20 ......TREATMENT 06a0 : 0a 30 d0 00 02 00 00 00 30 20 0a 30 e0 00 02 00 .0......0 .0.... 06b0 : 00 00 30 20 0a 30 ed 00 02 00 00 00 30 20 0a 30 ..0 .0......0 .0 06c0 : f0 00 02 00 00 00 30 20 0a 30 0e 01 10 00 00 00 ......0 .0...... 06d0 : 31 2e 30 30 30 30 30 30 30 30 30 30 30 30 30 30 1.00000000000000 06e0 : 0a 30 10 01 02 00 00 00 32 20 0a 30 11 01 5e 02 .0......2 .0..^. 06f0 : 00 00 fe ff 00 e0 d4 01 00 00 0a 30 12 01 02 00 ...........0.... 0700 : 00 00 30 20 0a 30 14 01 10 00 00 00 36 2e 30 30 ..0 .0......6.00 0710 : 30 30 30 30 30 30 30 30 30 30 30 30 0a 30 15 01 000000000000.0.. 0720 : 10 00 00 00 36 35 30 2e 30 30 30 30 30 30 30 30 ....650.00000000 0730 : 30 30 30 30 0a 30 1a 01 78 00 00 00 fe ff 00 e0 0000.0..x....... 0740 : 34 00 00 00 0a 30 b8 00 02 00 00 00 58 20 0a 30 4....0......X .0 0750 : 1c 01 22 00 00 00 2d 31 30 30 2e 30 30 30 30 30 .."...-100.00000 0760 : 30 30 30 30 30 30 5c 31 30 30 2e 30 30 30 30 30 000000.100.00000 0770 : 30 30 30 30 30 30 30 20 fe ff 00 e0 34 00 00 00 0000000 ....4... 0780 : 0a 30 b8 00 02 00 00 00 59 20 0a 30 1c 01 22 00 .0......Y .0..". 0790 : 00 00 2d 31 30 30 2e 30 30 30 30 30 30 30 30 30 ..-100.000000000 07a0 : 30 30 5c 31 30 30 2e 30 30 30 30 30 30 30 30 30 00.100.000000000 07b0 : 30 30 30 20 0a 30 1e 01 04 00 00 00 30 2e 30 20 000 .0......0.0 07c0 : 0a 30 1f 01 04 00 00 00 4e 4f 4e 45 0a 30 20 01 .0......NONE.0 . 07d0 : 04 00 00 00 30 2e 30 20 0a 30 21 01 04 00 00 00 ....0.0 .0!..... 07e0 : 4e 4f 4e 45 0a 30 22 01 04 00 00 00 30 2e 30 20 NONE.0".....0.0 07f0 : 0a 30 23 01 04 00 00 00 4e 4f 4e 45 0a 30 25 01 .0#.....NONE.0%. 0800 : 04 00 00 00 30 2e 30 20 0a 30 26 01 04 00 00 00 ....0.0 .0&..... 0810 : 4e 4f 4e 45 0a 30 28 01 00 00 00 00 0a 30 29 01 NONE.0(......0). 0820 : 00 00 00 00 0a 30 2a 01 00 00 00 00 0a 30 2c 01 .....0*......0,. 0830 : 32 00 00 00 32 33 35 2e 37 31 31 31 37 32 38 33 2...235.71117283 0840 : 33 32 39 32 5c 32 34 34 2e 31 33 35 34 33 37 31 3292.244.1354371 0850 : 31 30 37 38 32 5c 2d 37 32 34 2e 39 37 38 31 35 10782.-724.97815 0860 : 34 30 39 39 31 38 0a 30 30 01 10 00 00 00 38 39 409918.00.....89 0870 : 38 2e 34 32 39 36 36 34 38 33 31 33 30 39 0a 30 8.429664831309.0 0880 : 34 01 04 00 00 00 30 2e 30 20 0c 30 50 00 3c 00 4.....0.0 .0P.<. 0890 : 00 00 fe ff 00 e0 16 00 00 00 0a 30 0c 01 04 00 ...........0.... 08a0 : 00 00 30 2e 30 20 0c 30 51 00 02 00 00 00 31 20 ..0.0 .0Q.....1 08b0 : fe ff 00 e0 16 00 00 00 0a 30 0c 01 04 00 00 00 .........0...... 08c0 : 30 2e 30 20 0c 30 51 00 02 00 00 00 32 20 fe ff 0.0 .0Q.....2 .. 08d0 : 00 e0 7a 00 00 00 0a 30 12 01 02 00 00 00 31 20 ..z....0......1 08e0 : 0a 30 34 01 10 00 00 00 31 2e 30 30 30 30 30 30 .04.....1.000000 08f0 : 30 30 30 30 30 30 30 30 0c 30 50 00 50 00 00 00 00000000.0P.P... 0900 : fe ff 00 e0 1e 00 00 00 0a 30 0c 01 0c 00 00 00 .........0...... 0910 : 39 2e 39 39 30 32 36 38 30 65 2d 31 0c 30 51 00 9.9902680e-1.0Q. 0920 : 02 00 00 00 31 20 fe ff 00 e0 22 00 00 00 0a 30 ....1 ...."....0 0930 : 0c 01 10 00 00 00 31 2e 30 30 30 30 30 30 30 30 ......1.00000000 0940 : 30 30 30 30 30 30 0c 30 51 00 02 00 00 00 32 20 000000.0Q.....2 0950 : 0c 30 6a 00 02 00 00 00 31 20 ===== ??? end of SQ????? 095a : 0a 30 80 01 (300a, 0180) Patient Setup Sequence Implicit VR 'SQ' 095e : 26 00 00 00 Length 38 bytes 0962 : fe ff 00 e0 (fffe, e000) Item Tag 0966 : 1e 00 00 00 Item length 30 bytes 096a : 18 00 00 51 (0018, 5100) Patient Position Implicit VR 'CS' 096e : 04 00 00 00 Value length 4 bytes 0973 : 48 46 53 HFS 0975 : 20 pad to even length 0976 : 0a 30 82 01 (300a, 0182) 02 00 00 00 31 20 ..HFS .0......1 0980 : 0a 30 b2 01 00 00 00 00 0c 30 02 00 74 00 00 00 .0.......0..t... 0990 : fe ff 00 e0 6c 00 00 00 08 00 50 11 1e 00 00 00 ....l.....P..... 09a0 : 31 2e 32 2e 38 34 30 2e 31 30 30 30 38 2e 35 2e 1.2.840.10008.5. 09b0 : 31 2e 34 2e 31 2e 31 2e 34 38 31 2e 35 00 08 00 1.4.1.1.481.5... 09c0 : 55 11 2a 00 00 00 31 2e 39 2e 39 39 39 2e 39 39 U.*...1.9.999.99 09d0 : 39 2e 39 39 2e 39 2e 39 39 39 39 2e 39 39 39 39 9.99.9.9999.9999 09e0 : 2e 32 30 30 33 30 39 30 33 31 34 35 31 32 38 00 .20030903145128. 09f0 : 0a 30 55 00 0c 00 00 00 50 52 45 44 45 43 45 53 .0U.....PREDECES 0a00 : 53 4f 52 20 0c 30 60 00 52 00 00 00 fe ff 00 e0 SOR .0`.R....... 0a10 : 4a 00 00 00 08 00 50 11 1e 00 00 00 31 2e 32 2e J.....P.....1.2. 0a20 : 38 34 30 2e 31 30 30 30 38 2e 35 2e 31 2e 34 2e 840.10008.5.1.4. 0a30 : 31 2e 31 2e 34 38 31 2e 33 00 08 00 55 11 1c 00 1.1.481.3...U... 0a40 : 00 00 31 2e 32 2e 33 33 33 2e 34 34 34 2e 35 35 ..1.2.333.444.55 0a50 : 2e 36 2e 37 37 37 37 2e 38 38 38 38 38 00 0e 30 .6.7777.88888..0 0a60 : 02 00 0a 00 00 00 55 4e 41 50 50 52 4f 56 45 44 ......UNAPPROVED 0a70 : pydicom-0.9.7/dicom/testfiles/rtplan_truncated.dcm000644 000765 000024 00000004121 11726534363 022603 0ustar00darcystaff000000 000000 DICMULœOBUI1.2.840.10008.5.1.4.1.1.481.5UI*1.2.999.999.99.9.9999.9999.20030903150023UI1.2.840.10008.1.2UI1.2.888.888.88.8.8.8200309031500311.2.840.10008.5.1.4.1.1.481.5*1.2.777.777.77.7.7777.7777.20030903150023 200307160153557P`RTPLANpManufacturer name here€Here COMPUTER002 @Radiation Therappoperator$Treatment Planning System name here Last^First^mid^pre id00001 0@O   softwareV1 01.22.333.4.555555.6.7777777777777777777777777777 1.2.333.444.55.6.7777.8888 study1 2 0Plan1 0Plan1 020030903 0150023 0 PATIENT 0Dþÿઠ01 0 COORDINATES 0iso 02239.531250000000\239.531250000000\-741.87000000000 0 ORGAN_AT_RISK 0#75.0000000000000 0,75.0000000000000þÿàŠ 02 0 COORDINATES 0PTV 02239.531250000000\239.531250000000\-751.87000000000 0 TARGET 0&30.8262030000000 0p´þÿଠ0q1 0x30 0€1 0 0 0|þÿàt 0‚2239.531250000000\239.531250000000\-751.87000000000 0„1.02754010000000 0†116.003669700000 01 0°ÐþÿàÈp Linac co. €Here@Radiation Therap Zapper90009999 0²unit001 0³MU 0´1000.00000000000 0¶8þÿà 0¸X 0¼1 þÿà 0¸Y 0¼1 0À1 0ÂField 1 0ÄSTATIC 0ÆPHOTON 0Î TREATMENT 0Ð0 0à0 0í0 0ð0 01.00000000000000 02 0^þÿàÔ 00 06.00000000000000 0650.000000000000 0xþÿà4 0¸X 0"-100.00000000000\100.000000000000 þÿà4 0¸Y 0"-100.00000000000\100.000000000000 00.0 0NONE 0 0.0 0!NONE 0"0.0 0#NONE 0%0.0 0&NONE 0( 0) 0* 0,2235.711172833292\244.13543711pydicom-0.9.7/dicom/testfiles/rtstruct.dcm000644 000765 000024 00000004746 11726534363 021141 0ustar00darcystaff000000 000000  ISO_IR 100200912231238401.2.826.0.1.3680043.8.4981.2.840.10008.5.1.4.1.1.481.3(1.2.826.0.1.3680043.8.498.2010020400001 0P1 `RTSTRUCTppydicom station1pdmasonTPS Test^Phantom30sep  tPhantom30sep 019691231@M  0.9.3 QHFS *1.2.826.0.1.3680043.8.498.2010020400001.1 ,1.2.826.0.1.3680043.8.498.2010020400001.1.1 sep30 1 1 0sep30 0sep30 0200912230 1225070ÿÿÿÿþÿàÿÿÿÿ R*1.2.826.0.1.3680043.8.498.2010020400001.20ÿÿÿÿþÿàÿÿÿÿP1.2.840.10008.3.1.2.3.1U,1.2.826.0.1.3680043.8.498.2010020400001.2.10ÿÿÿÿþÿàÿÿÿÿ .1.2.826.0.1.3680043.8.498.2010020400001.2.1.1þÿ àþÿÝàþÿ àþÿÝàþÿ àþÿÝà0 ÿÿÿÿþÿàÿÿÿÿ0"1 0$*1.2.826.0.1.3680043.8.498.2010020400001.20&patient 0(patient 0,49200.0 06MANUALþÿ àþÿàÿÿÿÿ0"2 0$*1.2.826.0.1.3680043.8.498.2010020400001.20& Isocenter 1 0(Isocenter Beam 106MANUALþÿ àþÿàÿÿÿÿ0"3 0$*1.2.826.0.1.3680043.8.498.2010020400001.20& Isocenter 2 0(Isocenter Beam 206MANUALþÿ àþÿÝà09ÿÿÿÿþÿàÿÿÿÿ0* 220\160\120 0@ÿÿÿÿþÿàÿÿÿÿ0BCLOSED_PLANAR 0F5 0H1 0Pd-200.0\150.0\-200.0\-200.0\-150.0\-200.0\200.0\-150.0\-200.0\200.0\150.0\-200.0\-200.0\150.0\-200.0 þÿ àþÿàÿÿÿÿ0BCLOSED_PLANAR 0F6 0H2 0Pt200.0\-0.0\-190.0\200.0\-150.0\-190.0\-200.0\-150.0\-190.0\-200.0\150.0\-190.0\200.0\150.0\-190.0\200.0\-0.0\-190.0 þÿ àþÿàÿÿÿÿ0BCLOSED_PLANAR 0F6 0H3 0Pt200.0\-0.0\-180.0\200.0\-150.0\-180.0\-200.0\-150.0\-180.0\-200.0\150.0\-180.0\200.0\150.0\-180.0\200.0\-0.0\-180.0 þÿ àþÿÝà0„1 þÿ àþÿàÿÿÿÿ0* 255\64\2550@ÿÿÿÿþÿàÿÿÿÿ0BPOINT 0F1 0H1 0P 0.0\-0.0\0.0þÿ àþÿÝà0„2 þÿ àþÿàÿÿÿÿ0* 255\64\2550@ÿÿÿÿþÿàÿÿÿÿ0BPOINT 0F1 0H1 0P 0.0\-0.0\0.0þÿ àþÿÝà0„3 þÿ àþÿÝà0€ÿÿÿÿþÿàÿÿÿÿ0‚1 0„1 0…patient 0ˆpatient 0¤EXTERNAL0¦0°ÿÿÿÿþÿàÿÿÿÿ0²REL_ELEC_DENSITY0´1.000 þÿ àþÿÝàþÿ àþÿàÿÿÿÿ0‚2 0„2 0… Isocenter 1 0ˆIsocenter Beam 10¤ ISOCENTER 0¦þÿ àþÿàÿÿÿÿ0‚3 0„3 0… Isocenter 2 0ˆIsocenter Beam 20¤ ISOCENTER 0¦þÿ àþÿÝàpydicom-0.9.7/dicom/testfiles/rtstruct.dump000644 000765 000024 00000017377 11726534363 021347 0ustar00darcystaff000000 000000 (0008, 0005) Specific Character Set CS: 'ISO_IR 100' (0008, 0012) Instance Creation Date DA: '20091223' (0008, 0013) Instance Creation Time TM: '123840' (0008, 0014) Instance Creator UID UI: 1.2.826.0.1.3680043.8.498 (0008, 0016) SOP Class UID UI: RT Structure Set Storage (0008, 0018) SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001 (0008, 0020) Study Date DA: '' (0008, 0030) Study Time TM: '' (0008, 0050) Accession Number SH: '1' (0008, 0060) Modality CS: 'RTSTRUCT' (0008, 0070) Manufacturer LO: 'pydicom' (0008, 0090) Referring Physician's Name PN: '' (0008, 1010) Station Name SH: 'station1' (0008, 1070) Operators' Name PN: 'dmason' (0008, 1090) Manufacturer's Model Name LO: 'TPS' (0010, 0010) Patient's Name PN: 'Test^Phantom30sep' (0010, 0020) Patient ID LO: 'tPhantom30sep' (0010, 0030) Patient's Birth Date DA: '19691231' (0010, 0040) Patient's Sex CS: 'M' (0018, 1020) Software Version(s) LO: '0.9.3' (0018, 5100) Patient Position CS: 'HFS' (0020, 000d) Study Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.1 (0020, 000e) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.1.1 (0020, 0010) Study ID SH: 'sep30' (0020, 0011) Series Number IS: '1' (0020, 0013) Instance Number IS: '1' (3006, 0002) Structure Set Label SH: 'sep30' (3006, 0004) Structure Set Name LO: 'sep30' (3006, 0008) Structure Set Date DA: '20091223' (3006, 0009) Structure Set Time TM: '122507' (3006, 0010) Referenced Frame of Reference Sequence 1 item(s) ---- (0020, 0052) Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0012) RT Referenced Study Sequence 1 item(s) ---- (0008, 1150) Referenced SOP Class UID UI: Detached Study Management SOP Class (0008, 1155) Referenced SOP Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2.1 (3006, 0014) RT Referenced Series Sequence 1 item(s) ---- (0020, 000e) Series Instance UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2.1.1 --------- --------- --------- (3006, 0020) Structure Set ROI Sequence 3 item(s) ---- (3006, 0022) ROI Number IS: '1' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'patient' (3006, 0028) ROI Description ST: 'patient' (3006, 002c) ROI Volume DS: '49200.0' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0022) ROI Number IS: '2' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'Isocenter 1' (3006, 0028) ROI Description ST: 'Isocenter Beam 1' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0022) ROI Number IS: '3' (3006, 0024) Referenced Frame of Reference UID UI: 1.2.826.0.1.3680043.8.498.2010020400001.2 (3006, 0026) ROI Name LO: 'Isocenter 2' (3006, 0028) ROI Description ST: 'Isocenter Beam 2' (3006, 0036) ROI Generation Algorithm CS: 'MANUAL' --------- (3006, 0039) ROI Contour Sequence 3 item(s) ---- (3006, 002a) ROI Display Color IS: ['220', '160', '120'] (3006, 0040) Contour Sequence 3 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '5' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['-200.0', '150.0', '-200.0', '-200.0', '-150.0', '-200.0', '200.0', '-150.0', '-200.0', '200.0', '150.0', '-200.0', '-200.0', '150.0', '-200.0'] --------- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '6' (3006, 0048) Contour Number IS: '2' (3006, 0050) Contour Data DS: ['200.0', '-0.0', '-190.0', '200.0', '-150.0', '-190.0', '-200.0', '-150.0', '-190.0', '-200.0', '150.0', '-190.0', '200.0', '150.0', '-190.0', '200.0', '-0.0', '-190.0'] --------- (3006, 0042) Contour Geometric Type CS: 'CLOSED_PLANAR' (3006, 0046) Number of Contour Points IS: '6' (3006, 0048) Contour Number IS: '3' (3006, 0050) Contour Data DS: ['200.0', '-0.0', '-180.0', '200.0', '-150.0', '-180.0', '-200.0', '-150.0', '-180.0', '-200.0', '150.0', '-180.0', '200.0', '150.0', '-180.0', '200.0', '-0.0', '-180.0'] --------- (3006, 0084) Referenced ROI Number IS: '1' --------- (3006, 002a) ROI Display Color IS: ['255', '64', '255'] (3006, 0040) Contour Sequence 1 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'POINT' (3006, 0046) Number of Contour Points IS: '1' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['0.0', '-0.0', '0.0'] --------- (3006, 0084) Referenced ROI Number IS: '2' --------- (3006, 002a) ROI Display Color IS: ['255', '64', '255'] (3006, 0040) Contour Sequence 1 item(s) ---- (3006, 0042) Contour Geometric Type CS: 'POINT' (3006, 0046) Number of Contour Points IS: '1' (3006, 0048) Contour Number IS: '1' (3006, 0050) Contour Data DS: ['0.0', '-0.0', '0.0'] --------- (3006, 0084) Referenced ROI Number IS: '3' --------- (3006, 0080) RT ROI Observations Sequence 3 item(s) ---- (3006, 0082) Observation Number IS: '1' (3006, 0084) Referenced ROI Number IS: '1' (3006, 0085) ROI Observation Label SH: 'patient' (3006, 0088) ROI Observation Description ST: 'patient' (3006, 00a4) RT ROI Interpreted Type CS: 'EXTERNAL' (3006, 00a6) ROI Interpreter PN: '' (3006, 00b0) ROI Physical Properties Sequence 1 item(s) ---- (3006, 00b2) ROI Physical Property CS: 'REL_ELEC_DENSITY' (3006, 00b4) ROI Physical Property Value DS: '1.000' --------- --------- (3006, 0082) Observation Number IS: '2' (3006, 0084) Referenced ROI Number IS: '2' (3006, 0085) ROI Observation Label SH: 'Isocenter 1' (3006, 0088) ROI Observation Description ST: 'Isocenter Beam 1' (3006, 00a4) RT ROI Interpreted Type CS: 'ISOCENTER' (3006, 00a6) ROI Interpreter PN: '' --------- (3006, 0082) Observation Number IS: '3' (3006, 0084) Referenced ROI Number IS: '3' (3006, 0085) ROI Observation Label SH: 'Isocenter 2' (3006, 0088) ROI Observation Description ST: 'Isocenter Beam 2' (3006, 00a4) RT ROI Interpreted Type CS: 'ISOCENTER' (3006, 00a6) ROI Interpreter PN: '' ---------pydicom-0.9.7/dicom/testfiles/test-SR.dcm000644 000765 000024 00000015214 11726534363 020540 0ustar00darcystaff000000 000000 DICMULÈOBUI1.2.840.10008.5.1.4.1.1.88.33UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.4UI1.2.840.10008.1.2.1UI1.2.276.0.7230010.3.0.3.4.2SHOFFIS_DCMTK_342 CS ISO_IR 100DA20010213TM184746UI1.2.276.0.7230010.3.0.3.4.2UI1.2.840.10008.5.1.4.1.1.88.33UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.4 DA#DA200102130TM3TM184746PSH`CSSRpLOPN0LO(OFFIS Structured Reporting Test Document>LODemonstration of SR FeaturesSQPNTest^S R LO0DA@CS UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.2 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.3 SH IS1 IS1 @2 DT20010213184746@@ CS CONTAINER @C SQ2þÿà*SH1111SHTESTLO Diagnosis @P CSSEPARATE@s SQþÿà @' LO OFFIS e.V.@0 DT20010213184746@u PNRiesmeier^Jörg@ˆ SQVþÿàNSH1705SH99_OFFIS_DCMTKLOJR UI1.2.276.0.7230010.3.0.0.1þÿàP@' LO Organisation@0 DT20010213184746@u PNObserver^Verifying@ˆ SQ@`£SQ þÿàSQºþÿಙSQjþÿàbPUI1.2.840.10008.5.1.4.1.1.88.33UUI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.1 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.3 UI41.2.276.0.7230010.3.1.4.2139363186.7819.982086466.2@r£SQ@‘¤CSCOMPLETE@’¤LOThis document is completed! @“¤CSVERIFIED@0§SQþÿà¢@ CSHAS OBS CONTEXT @@ CSUIDREF@C SQ^þÿàVSH1234.0SH99_OFFIS_DCMTKLOSome UID UI1.2.276.0.7230010.3.0.0.1@$¡UI 1.2.3.4.5þÿàV@ CSCONTAINS@@ CS CONTAINER @P CS CONTINUOUS@0§SQþÿà¤@ CSCONTAINS@@ CSTEXT@C SQ^þÿàVSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`¡UT A mass of @0§SQüþÿàö@ CSHAS CONCEPT MOD @@ CSCODE@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@h¡SQbþÿàZSH2222SH99_OFFIS_DCMTKLOSample Code 1  UI1.2.276.0.7230010.3.0.0.1þÿàö@ CSHAS CONCEPT MOD @@ CSCODE@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@h¡SQbþÿàZSH2222SH99_OFFIS_DCMTKLOSample Code 2  UI1.2.276.0.7230010.3.0.0.1þÿà@ CSCONTAINS@@ CSNUM @C SQ\þÿàTSH1234SH99_OFFIS_DCMTKLODiameter UI1.2.276.0.7230010.3.0.0.1@£SQ|þÿàt@êSQ^þÿàVSHcmSH99_OFFIS_DCMTKLO Length Unit  UI1.2.276.0.7230010.3.0.0.1@ £DS3 @0§SQüþÿàô@ CSHAS CONCEPT MOD @@ CSCODE@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@h¡SQ`þÿàXSH2222SH99_OFFIS_DCMTKLO Sample Code  UI1.2.276.0.7230010.3.0.0.1þÿà @ CSCONTAINS@@ CSTEXT@C SQ^þÿàVSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`¡UTwas detected. þÿàž@ CSCONTAINS@@ CS CONTAINER @P CSSEPARATE@0§SQ`þÿàœ@ CSCONTAINS@@ CSTEXT@C SQ^þÿàVSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`¡UT A mass of þÿà @ CSCONTAINS@@ CSNUM @C SQ\þÿàTSH1234SH99_OFFIS_DCMTKLODiameter UI1.2.276.0.7230010.3.0.0.1@£SQ|þÿàt@êSQ^þÿàVSHcmSH99_OFFIS_DCMTKLO Length Unit  UI1.2.276.0.7230010.3.0.0.1@ £DS3 þÿà @ CSCONTAINS@@ CSTEXT@C SQ^þÿàVSH1234SH99_OFFIS_DCMTKLO Text Code  UI1.2.276.0.7230010.3.0.0.1@`¡UTwas detected. þÿà2@ CSCONTAINS@@ CSTEXT@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`¡UTSample Text A B C @0§SQ†þÿàÀ@ CSINFERRED FROM @@ CSTEXT@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`¡UT.Inferred Sample Text New line. &%$§"!()<>{}/;þÿà¶@ CSHAS PROPERTIES@@ CSSCOORD@C SQ`þÿàXSH1234SH99_OFFIS_DCMTKLO SCoord Code  UI1.2.276.0.7230010.3.0.0.1p"FLCCp#CSCIRCLEþÿàø@ CSHAS PROPERTIES@@ CSTCOORD@C SQ`þÿàXSH1234SH99_OFFIS_DCMTKLO TCoord Code  UI1.2.276.0.7230010.3.0.0.1@0¡CSSEGMENT @8¡DS1.000000\2.500000 @0§SQ2þÿà*@ CSSELECTED FROM @sÛUL þÿàj™SQ>þÿà6PUI1.2.840.10008.5.1.4.1.1.88.11UUI9.8.7.6@ CSCONTAINS@@ CS COMPOSITE @0§SQòþÿàš@ CSHAS ACQ CONTEXT @@ CSDATE@C SQZþÿàRSH1234.1SH99_OFFIS_DCMTKLODate UI1.2.276.0.7230010.3.0.0.1@!¡DA20001206þÿà˜@ CSHAS ACQ CONTEXT @@ CSTIME@C SQZþÿàRSH1234.2SH99_OFFIS_DCMTKLOTime UI1.2.276.0.7230010.3.0.0.1@"¡TM120000þÿà¨@ CSHAS ACQ CONTEXT @@ CSDATETIME@C SQ^þÿàVSH1234.3SH99_OFFIS_DCMTKLODateTime UI1.2.276.0.7230010.3.0.0.1@ ¡DT20001206120000þÿàb™SQ–þÿàŽPUI1.2.840.10008.5.1.4.1.1.2UUI 1.2.3.4.5.0`IS5\2 ™SQ@þÿà8PUI1.2.840.10008.5.1.4.1.1.11.1UUI 1.2.3.5.6.7@ CSCONTAINS@2 DT20010213184746@@ CSIMAGE @0§SQ€þÿàB@ CSHAS CONCEPT MOD @@ CSCODE@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@h¡SQbþÿàZSH2222SH99_OFFIS_DCMTKLOSample Code 3  UI1.2.276.0.7230010.3.0.0.1@0§SQ@þÿà8@ CSHAS CONCEPT MOD @@ CSCODE@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@h¡SQbþÿàZSH2222SH99_OFFIS_DCMTKLOSample Code 2  UI1.2.276.0.7230010.3.0.0.1@0§SQ6þÿà.@ CSINFERRED FROM @sÛULþÿà.@ CSHAS CONCEPT MOD @2 DT20010213184746@@ CSTEXT@C SQXþÿàPSH1234SH99_OFFIS_DCMTKLOCode UI1.2.276.0.7230010.3.0.0.1@`¡UTSample Text 2 @0§SQjþÿàØ™SQ>þÿà6PUI1.2.840.10008.5.1.4.1.1.4UUI 1.2.3.4.0.1@ CSHAS PROPERTIES@@ CSIMAGE @C SQ^þÿàVSH1234SH99_OFFIS_DCMTKLO Key Image  UI1.2.276.0.7230010.3.0.0.1þÿà‚™SQPþÿàHPUI1.2.840.10008.5.1.4.1.1.9.2.1UUI 1.2.3.4.5@° US@ CSHAS PROPERTIES@@ CSWAVEFORMpydicom-0.9.7/dicom/testfiles/zipMR.gz000644 000765 000024 00000015456 11726534363 020165 0ustar00darcystaff000000 000000 ‹ËaOÿzipMR.gzipÅšgxVÕ¶ïçsΕ€Ch¡(¡‡–JSz" $BQ©¶¨Á½-[E± ŠŠ TA:RE¤#JÛl¤ƒˆ‚"Ò[€û[¯åñžë¹Η“õ¼ïšk®µæã?þ£ÌZ¶¬nŽùhó¿õ—Ù²Y¶rîÐÚ™œÕˆÉmžùåÜ¡ei“’”šT7=9)%99¹nRFRJR:¾¹oy"‰'Ò’jÿ6ŸQ¯v꯷#ß©ÉÉéÉuSk§ÔÍHΨ—”‘žQGM,oû/ë†W)¬ǽ¸ÿwÅT5EM^‹‚&³YûÜÜÖ¼“ ¦„i’mšµîÓ2+%!Ú0΋7™YíZvÌÊì’—Õ,7'³I»»»ä¶o‘ÕŽûq&³I´ù]¥hVlŸTKOK6ÅþZrZ4rþÿ8D›øÿÑ&á¿èSžkÃj~;'ÿ®¯D›®ÂÙÔßÎmÀ#<÷Àj5Ùí¢M?Ó:7Æ´ÏÍkѲi“îÙYͰùy梟ãz¸i“¾%š×"0µÌlllˆmòïÌôˆm“ãL-þX÷Oãá±ázÙíÚg$·HIˆÅ—mrJ˜f}{÷ëÿà€>woï~>8 [v»ðnÒIç"kB«bM㈾w„wc3ó™dÎѦnrRDv<3­s ˜&DžÌËŠ™fyÎääæ0®À8¼[1r7-3$2ó“œT—×ã±83¯ Á®?Ö{Á„맦ÿ:oEžOùíj0W1¦vZR½Ôô´´z‘7^[5- 1-‘’Âè-F¡\A Vørjø~×MÇ´¤Œ”êmR3x²XÑLÞ©Ç=Ó6Ô»Åy ¦©þWIåâ/ø‘` óFÍ¿z#-rñ—ïÄ¢ù¯ˆ'˜"¿éžóÃQ2£¢Ì¥bw¼©UÓk§u©U/²br—ÚIµÓ“k'˜:ܯþJ]’ÿêôÝcÅvÿ¾éÿ½¾="ÞL0cCŸ'˜&±¿ú2²¤1[·1úÜÿ¿ì”fªDãx7Ædçæä6kÑ.7;+5!1Ì-ÜmÌÝ"Œ`^^aÖLKIÍèòë‰'„÷c¹/Œ42º™‘•ߥ’—fÄDM¸9Ñ´AKgj£b¢i§pñÝÀX“ÛÉ„f˜WíU»Ép—u¤ Ô·m]otOWÙ5°·êé%Ê@&oËpé!Í$EjÊmrÔ–¡ò‰l’©ÒˆgÉ< ÉRCb¥¨<)wêUo?t‡ì-©¯Ê"™(m¥‹’’R^ªI¼+I¼ÑBWµCí.ѵàÉžúº½á7Gív/ØgõsÉ“¥§ô‘7ä$4CBÉd®µ4–ÎHZ(Í™k‰v·Kq‰‡ü¢òOi¨×u€{ÞÔ+Ò[Æ£_IàþsÄJÉ5sÃT—Vr¿œ‘ÚºFóìs®²]+¤ŸŽ´§|û ¸[¥ïè0žÉ•ûäi+Ï +IÊ sfº µÜ%ƒ¥œTA£ %±*ôkÊ‹ò¤¶“Ý¿l’> IGÖI«H=a¾3×y梉—[°âœì’Ò:S[Ûún­>-_ËEMqÕýQ;Æ^ÑêÚ {_–É2S—nÒDJƒÞíø¡Š4E‡¾x¢ 3Ir“\bí“æ”¹hnÂÒOX§Ÿ›o{ëPz­Så²¹`~â‰g—)ÈàõAòoìùH;Á¶<ŠBB†T’ZÜm åf¬¹h2ж4W5±¶«œÑb6É¥Ù:Pr˜½ET¶šmxà+³Ë5ž>Ù’®9ú .×ÛU?•!ò“&¸Ëö€ÖÔ÷%[ž…éãÀÿ5˜_OÒ¤*+]5Eñv1dWÿxmä ¸Zî¥r•€~kd¸¾h·A‚1IH‹—oÍisÀì5?à‹ŠÌÍ‘ù²V #©¸Ð…:AëTÙ&´ ›¤Ãu#¼{\VË |¿Äø^I*øà”‰ƒ{Õà{ Ф£xáVä§¢Uo Á¢D÷ƒ£Û`K9t¼ïNšCÄAqÉ‚™£e„ló²m÷Ê%¤ÖÒ¤–²OÙkZÆÊ»Ä`sЯKÌÃÃ7L8ð y¨Œxpðr:ßDþu¾Kñ\g|ÛXkUw˶£t3‘ØÎtÅñf¼²/sþL¾ B_ Š×HYýQéMºEfigÛÙ®Ó\ ò÷ƒt;XWOª#íŠ)5Íe"*ß\3Å"‘W€øÏ7U]^´"jÎË&Ýj_s¥Q £À³/8>ÊÝp&JF‚éÄHvyDúƒÆ7òO½¤Ãô?ð÷º®¶Cõf‡÷nGn"ü2QvÚ\ÂÏ•aÓu|p]n‘Ó&ä~ü“g²¤;¶-C~Aׯy÷”]««äU›oö˜DÀD •~òrÿI–ë„“d‰ÔÓëÕñ2_Ù·õN]J~IÇötÖ?‹çNR.›r Å'ŽlÚ”ÑsìcÑ¥!öÍ ®÷cÙ%]iueÜŽÿ.«ÍúˆôÿpþÒ –Q2F^Gäè‰Ô«ò°žÒŽú¦Ü­ßØ´«Ô'°(Œ·¢dÎãp÷(Öæ›B0¯X·–úr+&µ"õ¡/žî†µ?H5›íZ9o_áÉ|"¯̼fjàǶÌ4¥ þºÕ³x6J¼îÐͺO é3ö­¯‰úOßÄû—#9ä°DYuä‡z¾ s•Âú·Ëì÷Pˆ¶n¶ÎÔ%hZ“§òMOî4ç©JDù‡Ä}§H6[k1j mˆ‰™RSOhO ´€­c«ýðéEÐ9aÎp™w3¾î„þyD|Q˜W ª¡U9*Fìx,KÙ®6W3ybüêD%ºFÝi†¨Kå òî þ"³ ‘êÚ–HX%suµÐ7t´­¬WѰšœÇgF~û_@á8\3ÕÈà™H.‰íA¨$`?„ÈêÉšàtm£5ô:L{¤“A¨Y¯‰æ“™Ÿ—öòüÕùq¬Ví-V÷ÔjÚû?Ç'9 }ÖüL¼_ˆT®ËT²BòzÁ–šR–ºp ¿”‚«]ýv–!»ì“ºD%§Ìƒi½žŽoêi‚]k‰K2R6œh‹Ë°B,t_BìÔ"zZ{ë+Tˆçág<¹/ ãàúsŽX+,Ç©bJlTCþMd¦°mÿ_ÁßMé™RÍŽÃ¥«2{by}²ý3¶ûÄÍvÿtmÉlw ióÅÉkapÿl°P €@'Øÿ9òôìÈú7ƒt! ¹Ö¼+èQ¾%”–0þ+ãï‡ù¾‰xZ!oé~=ªã‰¡'`Ú³ |9ék»Äž´…ÝS® ²3‰Õ ä¶î‘>öXv™àu5î%÷¶›â>s Ý}ÔÔD¼•ºNÎüyêÉIó-Çeªì(VX ±Î¢¤2ÄPyÏ!û¬ÙMFÍGÓãàvݤaG6«•¥‡àÿ\ð¾Ýê û1li Õ}ÚÉvSÝ4×ßõp-¹W.òN¸þÄšaeÿü¿ÁÊXúÆ—©ÿýñ]<ЃܚŒ}Eä<Ùܳ&ôú´»‚|“€%iEÁª.u>®!:k]—ÍíT„/ôM7Ìuw½Ý3î7ˆ5Ëq$=‹áÛ0Š"ð´9H[i÷Ãþç©NwSÏ¿‚ OÆ‘˜æX¤“Ù†®çéè¶ÑW$G(Y,ºmñèR‡• uô!»ß/u×\!Ã-w}ÜpP©É:7Èm%X=`í3`zš5ì®Gv„5¿Ç¨1dÈØMý-¶"s£ïÍjëZ«Í¥©k—™Û©“™¼y›U×Óå¹£¶´+FO4Ï}èJº7Pû‹’K”÷ŠK˜ÑΑëÏqhTŸ¼Ø‚¼9’¸š U!o'n€#{ÌfìÞ±ü#³¼vðÔïûµ=5¼¶= ¥´œ-ïœË·1n¿MpËíV{=ò\?tˤŸL„)…±=XØ|‹NSawêþ\x0Ÿ²DÀºuTæs³Ä,4Ÿðof€ß,rK;ÃæÛ+d˜×íV­g;Ú»ìQ;Þ}LÄÕqÜy[Çur»F¾HÞ­G ÖÄòЬ]-~d¡r Bn]"Ä£E.Ü^AOSWŽ™åf‘²Ó|Œ«¸Zϧ…œÐ»\s¿Ø¿å ù⮫[én¸(íßr'ÝÏî¨[AÔuù.Óõr8:»'#½ByŽJð 2:„ÝñqSï…uŽ­55?‘Üv¸,áA¼,ëÕf:¨¯‡oÇh–½Ýå»d_Õð½ýB÷WÛßægº¡îewÞöWÝF7Ã=éÚºJî8-¶Kí1Û'R'A½ •ãÎßGr_A4 ól¸áÙ5\i'M ¢z8]e&¢ÁZöRÛðĦ·|­—íƒÄ†þMÖ÷ñýcþo¾¤Ÿëfºhø¯@á7ݽèNØl›l;Øv™=DV} š' Ø_û !¡2Rã‰Qøb'–žA¯ òhCYk&›Ùfòƒ¦¡¶´qn”ûÞ‰¿Éw•üÿ©Ÿâ»úÛ}AØ-ãÎ7n¿ÛAìÅØ÷4ÉÖ·Gu½ÎÑÎääZø¶.9¶^(BÆ(ÌwX‹£áa,¼(A>Ú‰•»¨J è·ÖÍ…ýŸ˜YhµŸ\ØSï±›m–Krõ¨*#ÝXw—?ç?÷ø»ü->ÞGù½î°;ãv¹ÛÝzöd€.ÓÝ:V#½rd¿”N´¥v7F£;é êF¢¸É×ó©DÄIwŒzÊöPK9€%©T‰ü[6ÒA&Ò{Þ‡wë¡[s·r§4¹îk¬/ŠÇ7™• ¾=Ž`ûWæßøä¨|kî•]îÚ-AXÿµ©Ý«Æ–òoû—|Ž/ê«ûRþ¢ÛìtßÙiZUö²ÎV ÷’UÉH¯-Õ†MÐ(ÜO†uæ  -ZEœÏ‚mËÑcïî€_qìG‡JrA&ë|-Ã| z})t“6ÖWmGßÙßëKÀsðo:ùg§ÍÓy¦"ÞnAeðØVþ7‡ƒíˆD²ý½ŒS˜A»óôú¥e?™u6ñ¾Ïo7Kñú2¬_˱‘û7“è(m†× 7˜©òª®—…ºÄÍö}Sÿ“Ûë>Àú½¶»¬'Xç«Z:Ž0¾oï–ÈÍ‹õ`_ª]Bä7•‚ PO’˜)ØÿþžÍ±ÿoÅû+¨1Ñäí¥Ãxûk|´ž=þr¹,ï°ÝA>¨D ~âf¹§‘ÿ…}Z|Š{"ȃóYd™†àÑÏßÍÕ# æb¥§)‚&É\•}øl&Œßk¦‚ÄLìüŸ,ñÝX±J†êOôåÉ”¥‰¨g¤ˆ–µµÜ>ßÀWóÛéµ&Òsí²ßÙ mĺ{±ä6åÐæ€w©Èޤ>ìiG—ÛT²àä*A¾iÀõ5ÞXÃ;‹9f€ß\rÿBØ·{—“mÅèvÍÕåt{3å$gû¼{Ó¯÷Müu·Ç}ê¹fî¤=eO`_+Ù‰ÖÛA ;²s‰ƒ.Ø[‰îæ~j]÷«‚K#øþRXlJÃÄæ3<¾ ¹[@?Ìý»‰ÇEó¨ÆÝ$YéF}R‹Øçí7d€*ÑŸîkûSd¾]5wئ¹‘½`#ðÛ¿æ»øâþˆ›àâÜÛùw±ÚqxûKATõt¨°¸ÂjŸ&á/SMîo;àͰÃ[ÏW‚ý úž#ðg'>XM:H,ÌâÎ|2Õ‹ìÝÑ-šlk"ÉøWý|êÀh7ÙçuwÍî²Ï¹kD[™È/5‡°ä»ÔwÙÜÏìdÀj°°2œ £¢:ÒûSŸ[Õ:Œ TeDÜ6âw çÔÀíp`)šlA£¥hyΔÏçdƒDë\í«‡õQû¤[ëÆ¹áÔÞ;èîÓ6x·"{ˆ°Î_’­ô·½à@CоSB®¥Fò@-´h‹ô¾Dæ󾙃ŸÃ>g.rçÑq…<œi>0“ÐbZ¬!Fgéy<þÂwÒäÒí.ÒEv‹=m‡Ø{lœ­ˆKtV¶¡ß¼AÙýÑ›`ŸŽ÷Ë#é>²R9ØöÐÅÐ%‘踶ŽFƒp}ŠùÏ|äÏ“\Í„+ùl›[Ñ`*(Í„¥UÙ¹4§yÛÆr;Ý$»QÛQÄ@öb%ìp¬\d]Q=¸_•]JoäWCrò‹ó‰‹ìí—#} LJHœ…a,AUød˜Ìç=²Þb²ñ—ÝÖ™—äem·wé4ýývÿwwAG¹ ×Þ=d󉨺à-ì:=ͨ]©9]ؽ5§â'!» ŸÓd×#Ø7 š± =ô×ødÆÓàýj3‚ù/oŠÔ„Oá@1íc»aöº4Ò‹Ú›^Lý7ÒîeÏ5ˆ.aƒ¢›Ïƒv•–Ñ¥ìŒ_%ãÔDr(TÆeѰ:`2¨Ÿ¿&"i–Žì…xùD„ýïã—ù`> Ž3íe£Ö€oCíQ©Ëž£ªÝh×ÙŸíô¢Eü1˜ìFcõªæJI k该õ9H'\OñÈïiUɺ·±»=ÁʳY9wŸq ¾MÂh#•pz-#"?Bþf2U¾dØÕn„«c³t¦N±Ù;í+ì<6¸S.Ö统œõ£\k÷¹­f¿‡mÓµŒ]¤Uu®¼E‡ûöhúàFp.“¾dhNˆðk¨ÏÁÿ±ö}¾Çãý¥èµä׃Ï":³Å²\3l>QV€5cñ]ÞXýÁ6ôkÜ9ÐÆyñ§©ÍÝ«v޶þZÀÞ`¯rœ¾öÄmU±1ÑJå݉G§›wñý<´cÞáåG“‘x=Œ‰éÌ|ÈNáGÓG'Ø®Šg3ì\û•bÅ.‘{àÜS¾“ëçÐ ½èëSëЋ¼ëfÙ5ÚVšè =©Ëµ‰~Ì.3ü¥£”‡wßEìkÞDÂ(ð~Þ‡|[ þsÑd¨y¹7¸÷Œ'#ì÷•Gç5Êv¶'ô9¥‘v÷§üÿŽ‚®ü}:âéôD÷ÁxWÑÑgän] ãu±Þ§_Ê2†ç}d'þ \ž‰¹7Íp,ç§âïƒô[_Âýw;û'ÄhÖ]¦Ú0,×õ°è{dï‡d³JP!øÖô“èÞðÿ`Oð† zQÞw­l”!GöÐ4(\Ä[7È åä,fí1¬>œc"²—áÓéWàë0ãýzwž™D ®2©Ú—¬ß™ ÜC§ `Ÿ Zßù ~¼ßï¿ö›ÙõõYôÂÑþ á»À/t“TÕ‹|JG~™/׋H¸«_û‡Ï'`éäHå[ÓÀ‰ð¼©ïbÿdÐX?'™!f y›ÊÐK:Òùò«‚[‚ Øíç‚þË~‘ÅÃýD?ÀÏB§^ôDçíH9og°¯›JçY‹½ÿ.s“¬‡{³‰¨‰°|zd¯f¼MDÜfd†€ÈG ¦°Gü‡|¦ué/éÛËuõó‚ܨAýàr§€Ànlïc‚FA^ðÏúîK×Û]µOÉkôJPeÃßj„ˆÛìôY+áÞrÊG°pr6á‘°ÊÌCê[°â]´¨CõZ¨°¶Lp=x7ê@TÁèÔèBÑ££ƒKÈ]ç·ørAÕ xð±ÿÎ÷ï…W؇Mp7ì@ÛM†ÐŒŠtþ¥¨É?›ð÷Ý|*üÇxw,ü $–bùf½Gx}ÌLO Chest PA PA PPN`PNpPNLOADC_5156ULjPN$B$d$^$@(B^$B$?$m$&(B  LO2008-40DA18000101@CSM PN4$B$d$^$@(B^$B$?$m$&(B\$B$d$^$@(B^$B$?$m$&(B AS DS0 0DS0 °!LT $B$?$m$&(B@LTULÚCSCHEST `DS0 LO1871LOID0VAZ LOc25_1008ADS0 DDS0 RIS0 dDS0.1500\0.1500 DS`SHcode37LO60059 CSPORTRAITCSUSZQCSQCSPA`DS200 ULLOAGFAUNvEC=0.00\LR=0.00\MC=3.50\NR=3.00\MD0=-0.4000\MD1=0.2000\FA=C\FP=0.1000\BALANCE=0\MLMIN=0.5000\MLMAX=2.5000\MFOC=0.5000 UNE25 UN2.8 `UNbUNQS-C1 eUNpUN‚UNd“UN COMPLETED ULœ UI:1.3.51.0.7.11986030739.15242.20106.39861.48967.23056.44420 UI"1.3.51.5156.11871.20080504.1104919 IS1 IS1 CSL\F `CS @LT(UL¼(US(CS MONOCHROME1 (US (US (4IS(US(US (US (US(US(US(PDS2048(QDS4096(RDS0 (SDS1 (TLOOD REL(0LOE25 UL CSNORMAL 0UL 0IS 0CS0UL0CSCREATED pydicom-0.9.7/dicom/testcharsetfiles/chrKoreanMulti.dcm000644 000765 000024 00000003552 11726534363 023542 0ustar00darcystaff000000 000000 DICMULÎOBUI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461UI1.2.840.10008.1.2.1UI1.2.410.200010.99.3.5SH INFINITT_3.5AEQS-SC1ULˆCS\ISO 2022 IR 149CSDERIVED\PRIMARY DA20080504TM104918UI1.2.840.10008.5.1.4.1.1.1UI:1.3.51.0.7.11267079384.54094.16836.47802.41082.29308.17461 DA20080504"DA200805040TM1717152TM171715PSH2008050417172310`CSCRpLOAgfa-Gevaert AG PNSHCR250 0LOChest >LO Chest PA PA PPN`PNpPN$)C±èÈñÁß(B LOADC_5156ULjPN$)C±èÈñÁß(B  LO2008-30DA18000101@CSM PN$)C±èÈñÁß(B\$)C±èÈñÁß(B AS DS0 0DS0 °!LT$)C±èÈñÁß(B @LTULÚCSCHEST `DS0 LO1871LOID0VAZ LOc25_1008ADS0 DDS0 RIS0 dDS0.1500\0.1500 DS`SHcode37LO60059 CSPORTRAITCSUSZQCSQCSPA`DS200 ULLOAGFAUNvEC=0.00\LR=0.00\MC=3.50\NR=3.00\MD0=-0.4000\MD1=0.2000\FA=C\FP=0.1000\BALANCE=0\MLMIN=0.5000\MLMAX=2.5000\MFOC=0.5000 UNE25 UN2.8 `UNbUNQS-C1 eUNpUN‚UNd“UN COMPLETED ULœ UI:1.3.51.0.7.11986030739.15242.20106.39861.48967.23056.44419 UI"1.3.51.5156.11871.20080504.1104918 IS1 IS1 CSL\F `CS @LT(UL¼(US(CS MONOCHROME1 (US (US (4IS(US(US (US (US(US(US(PDS2048(QDS4096(RDS0 (SDS1 (TLOOD REL(0LOE25 UL CSNORMAL 0UL 0IS 0CS0UL0CSCREATED pydicom-0.9.7/dicom/testcharsetfiles/chrRuss.dcm000644 000765 000024 00000003542 11726534363 022243 0ustar00darcystaff000000 000000 DICMUL¼OBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5729.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 144DA20070405TM082252UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775772.5729.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PN »îÚceÜÑypÓ LOSCSRUSS 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775772.5729.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775772.5729.0 SHSCSRUSS IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USàOB¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿pydicom-0.9.7/dicom/testcharsetfiles/chrX1.dcm000644 000765 000024 00000003566 11726534363 021605 0ustar00darcystaff000000 000000 DICMUL¼OBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5711.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CS ISO_IR 192DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5711.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PNWang^XiaoDong=王^å°æ±=  LO X1EXAMPLE 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5711.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5711.0 SH X1EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USàOB¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿pydicom-0.9.7/dicom/testcharsetfiles/chrX2.dcm000644 000765 000024 00000003560 11726534363 021600 0ustar00darcystaff000000 000000 DICMUL¼OBUI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5714.0UI1.2.840.10008.1.2.1UI1.3.6.1.4.1.5962.2SH DCTOOL100 AECLUNIE1 CSGB18030 DA20070405TM082251UI1.3.6.1.4.1.5962.3UI1.2.840.10008.5.1.4.1.1.7UI,1.3.6.1.4.1.5962.1.1.0.1.1.1175775771.5714.0 DA0TMPSH`CSOTdCSWSD pLOPN^^^^SH-0400 PNWang^XiaoDong=Íõ^С¶«= LO X2EXAMPLE 0DA@CS UI(1.3.6.1.4.1.5962.1.2.0.1175775771.5714.0 UI*1.3.6.1.4.1.5962.1.3.0.1.1175775771.5714.0 SH X2EXAMPLE IS1 IS1 CS(US(CS MONOCHROME2 (US (US (US(US(US(USàOB¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿¿¿¿¿ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¿¿¿¿pydicom-0.9.7/dicom/testcharsetfiles/FileInfo.txt000644 000765 000024 00000003052 11726534363 022355 0ustar00darcystaff000000 000000 Filename Character Sets "Patient's Name" -------- -------------- '--------------' chrArab.dcm ISO_IR 127 '\xe2\xc8\xc7\xe6\xea^\xe4\xe6\xd2\xc7\xd1' chrFren.dcm ISO_IR 100 'Buc^J\xe9r\xf4me' chrFrenMulti.dcm ISO_IR 100 'Buc^J\xe9r\xf4me' chrGerm.dcm ISO_IR 100 '\xc4neas^R\xfcdiger' chrGreek.dcm ISO_IR 126 '\xc4\xe9\xef\xed\xf5\xf3\xe9\xef\xf2' chrH31.dcm ['', 'ISO 2022 IR 87'] 'Yamada^Tarou=\x1b$B;3ED\x1b(B^\x1b$BB@O:\x1b(B=\x1b$B$d$^$@\x1b(B^\x1b$B$?$m$&\x1b(B' chrH32.dcm ['ISO 2022 IR 13', 'ISO 2022 IR 87'] '\xd4\xcf\xc0\xde^\xc0\xdb\xb3=\x1b$B;3ED\x1b(J^\x1b$BB@O:\x1b(J=\x1b$B$d$^$@\x1b(J^\x1b$B$?$m$&\x1b(J' chrHbrw.dcm ISO_IR 138 '\xf9\xf8\xe5\xef^\xe3\xe1\xe5\xf8\xe4' chrI2.dcm ['', 'ISO 2022 IR 149'] 'Hong^Gildong=\x1b$)C\xfb\xf3^\x1b$)C\xd1\xce\xd4\xd7=\x1b$)C\xc8\xab^\x1b$)C\xb1\xe6\xb5\xbf' chrRuss.dcm ISO_IR 144 '\xbb\xee\xdace\xdc\xd1yp\xd3' chrX1.dcm ISO_IR 192 'Wang^XiaoDong=\xe7\x8e\x8b^\xe5\xb0\x8f\xe6\x9d\xb1=' chrX2.dcm GB18030 'Wang^XiaoDong=\xcd\xf5^\xd0\xa1\xb6\xab=' Other ===== chrFrenMulti.dcm is a modified version of chrFren.dcm with multi-valued PN and LO for testing decoding pydicom-0.9.7/dicom/test/__init__.py000644 000765 000024 00000000017 11726534363 017633 0ustar00darcystaff000000 000000 # __init__.py pydicom-0.9.7/dicom/test/_write_stds.py000644 000765 000024 00000006400 11726534363 020424 0ustar00darcystaff000000 000000 # _write_stds.py """Snippets for what a particular dataset (including nested sequences) should look like after writing in different expl/impl Vr and endian combos, as well as undefined length sequences and items """ # Implicit VR, little endian, SQ's with defined lengths impl_LE_deflen_std_hex = ( "10 00 10 00 " # (0010, 0010) Patient's Name "0c 00 00 00 " # length 12 "4e 61 6d 65 5e 50 61 74 69 65 6e 74 " # "Name^Patient" "06 30 39 00 " # (3006, 0039) ROI Contour Sequence "5a 00 00 00 " # length 90 "fe ff 00 e0 " # (fffe, e000) Item Tag "52 00 00 00 " # length 82 "06 30 40 00 " # (3006, 0040) Contour Sequence "4a 00 00 00 " # length 74 "fe ff 00 e0 " # (fffe, e000) Item Tag "1a 00 00 00 " # length 26 "06 30 48 00 " # (3006, 0048) Contour Number "02 00 00 00 " # length 2 "31 20 " # "1 " "06 30 50 00 " # (3006, 0050) Contour Data "08 00 00 00 " # length 8 "32 5c 34 5c 38 5c 31 36 " # "2\4\8\16" "fe ff 00 e0 " # (fffe, e000) Item Tag "20 00 00 00 " # length 32 "06 30 48 00 " # (3006, 0048) Contour Number "02 00 00 00 " # length 2 "32 20 " # "2 " "06 30 50 00 " # (3006, 0050) Contour Data "0e 00 00 00 " # length 14 "33 32 5c 36 34 5c 31 32 38 5c 31 39 36 20 " # "32\64\128\196 " ) # Implicit VR, big endian, SQ's with defined lengths # Realized after coding this that there is no Impl VR big endian in DICOM std; # however, it seems to exist as a GE private transfer syntax. # Will leave this here for now. impl_BE_deflen_std_hex = ( "00 10 00 10 " # (0010, 0010) Patient's Name "00 00 00 0c " # length 12 "4e 61 6d 65 5e 50 61 74 69 65 6e 74 " # "Name^Patient" "30 06 00 39 " # (3006, 0039) ROI Contour Sequence "00 00 00 5a " # length 90 "ff fe e0 00 " # (fffe, e000) Item Tag "00 00 00 52 " # length 82 "30 06 00 40 " # (3006, 0040) Contour Sequence "00 00 00 4a " # length 74 "ff fe e0 00 " # (fffe, e000) Item Tag "00 00 00 1a " # length 26 "30 06 00 48 " # (3006, 0048) Contour Number "00 00 00 02 " # length 2 "31 20 " # "1 " "30 06 00 50 " # (3006, 0050) Contour Data "00 00 00 08 " # length 8 "32 5c 34 5c 38 5c 31 36 " # "2\4\8\16" "ff fe e0 00 " # (fffe, e000) Item Tag "20 00 00 00 " # length 32 "30 06 00 48 " # (3006, 0048) Contour Number "00 00 00 02 " # length 2 "32 20 " # "2 " "30 06 00 50 " # (3006, 0050) Contour Data "00 00 00 0e " # length 14 "33 32 5c 36 34 5c 31 32 38 5c 31 39 36 20 " # "32\64\128\196 " ) pydicom-0.9.7/dicom/test/all.bat000644 000765 000024 00000001317 11726534363 016766 0ustar00darcystaff000000 000000 echo OFF echo all.bat echo run pydicom test suite on all supported python versions echo ------- python 2.4 ------------ c:\python24\python run_tests.py echo ------- python 2.5 ------------ c:\python25\python run_tests.py echo ------- python 2.6 ------------ c:\python26\python run_tests.py REM Check location for each version -- to make sure are not running old pydicom versions echo - echo ----------------- echo Check locations, make sure not pointing to old pydicom code: echo Python 2.4 c:\python24\python -c "import dicom; print dicom.__file__" echo Python 2.5 c:\python25\python -c "import dicom; print dicom.__file__" echo Python 2.6 c:\python26\python -c "import dicom; print dicom.__file__"pydicom-0.9.7/dicom/test/performance/000755 000765 000024 00000000000 11726534607 020026 5ustar00darcystaff000000 000000 pydicom-0.9.7/dicom/test/run_tests.py000644 000765 000024 00000003666 11726534363 020137 0ustar00darcystaff000000 000000 # run_tests.py """Call all the unit test files - all files in test directory starting with 'test'""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import os import os.path import sys import unittest # Get the directory test_dir where the test scripts are from pkg_resources import Requirement, resource_filename test_dir = resource_filename(Requirement.parse("pydicom"),"dicom/test") class MyTestLoader(object): def loadTestsFromNames(self, *args): # Simplest to change to directory where test_xxx.py files are save_dir = os.getcwd() if test_dir: os.chdir(test_dir) filenames = os.listdir(".") module_names = [f[:-3] for f in filenames if f.startswith("test") and f.endswith(".py")] # Load all the tests suite = unittest.TestSuite() for module_name in module_names: module_dotted_name = "dicom.test." + module_name test = unittest.defaultTestLoader.loadTestsFromName(module_dotted_name) suite.addTest(test) os.chdir(save_dir) return suite if __name__ == "__main__": # Get the tests -- in format used by Distribute library # to run under 'python setup.py test' suite = MyTestLoader().loadTestsFromNames() # Run the tests verbosity = 1 if len(sys.argv) > 1 and (sys.argv[1]=="-v" or sys.argv[1]=="--verbose"): verbosity = 2 runner = unittest.TextTestRunner(verbosity=verbosity) # Switch directories to test DICOM files, used by many of the tests save_dir = os.getcwd() testfiles_dir = resource_filename(Requirement.parse("pydicom"),"dicom/testfiles") os.chdir(testfiles_dir) runner.run(suite) os.chdir(save_dir) pydicom-0.9.7/dicom/test/shell_all000755 000765 000024 00000001415 11726534363 017412 0ustar00darcystaff000000 000000 #!/bin/bash # all.sh echo shell_all echo run pydicom test suite on all supported python versions echo ------- python 2.4 ------------ python2.4 run_tests.py echo ------- python 2.5 ------------ python2.5 run_tests.py echo ------- python 2.6 ------------ python2.6 run_tests.py echo ------- python 2.7 ------------ python2.7 run_tests.py # Check location for each version -- to make sure are not running old pydicom versions echo - echo ----------------- echo Check locations, make sure not pointing to old pydicom code: echo Python 2.4 python2.4 -c "import dicom;print dicom.__file__" echo Python 2.5 python2.5 -c "import dicom;print dicom.__file__" echo Python 2.6 python2.6 -c "import dicom;print dicom.__file__" echo Python 2.7 python2.7 -c "import dicom;print dicom.__file__" pydicom-0.9.7/dicom/test/test_charset.py000644 000765 000024 00000003734 11726534363 020575 0ustar00darcystaff000000 000000 # -*- coding: latin_1 -*- # test_charset.py """unittest cases for dicom.charset module""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest import dicom import os.path from pkg_resources import Requirement, resource_filename testcharset_dir = resource_filename(Requirement.parse("pydicom"),"dicom/testcharsetfiles") latin1_file = os.path.join(testcharset_dir, "chrFren.dcm") jp_file = os.path.join(testcharset_dir, "chrH31.dcm") multiPN_file = os.path.join(testcharset_dir, "chrFrenMulti.dcm") test_dir = resource_filename(Requirement.parse("pydicom"),"dicom/testfiles") normal_file = os.path.join(test_dir, "CT_small.dcm") class charsetTests(unittest.TestCase): def testLatin1(self): """charset: can read and decode latin_1 file........................""" ds = dicom.read_file(latin1_file) ds.decode() # Make sure don't get unicode encode error on converting to string expected = u"Buc^Jérôme" got = ds.PatientName self.assertEqual(expected, got, "Expected %r, got %r" % (expected, got)) def testStandardFile(self): """charset: can read and decode standard file without special char..""" ds = dicom.read_file(normal_file) ds.decode() def testMultiPN(self): """charset: can decode file with multi-valued data elements.........""" ds = dicom.read_file(multiPN_file) ds.decode() if __name__ == "__main__": # This is called if run alone, but not if loaded through run_tests.py # If not run from the directory where the sample images are, then need to switch there import sys import os import os.path dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() if dir_name: os.chdir(dir_name) os.chdir("../testfiles") unittest.main() os.chdir(save_dir)pydicom-0.9.7/dicom/test/test_dataelem.py000644 000765 000024 00000005103 11726534363 020710 0ustar00darcystaff000000 000000 # test_dataelem.py """unittest cases for dicom.dataelem module""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # Many tests of DataElement class are implied in test_dataset also import unittest from dicom.dataelem import DataElement from dicom.dataelem import RawDataElement, DataElement_from_raw from dicom.tag import Tag from dicom.dataset import Dataset from dicom.UID import UID class DataElementTests(unittest.TestCase): def setUp(self): self.data_elementSH= DataElement((1,2), "SH", "hello") self.data_elementIS = DataElement((1,2), "IS", "42") self.data_elementDS = DataElement((1,2), "DS", "42.00001") self.data_elementMulti = DataElement((1,2), "DS", ['42.1', '42.2', '42.3']) def testVM1(self): """DataElement: return correct value multiplicity for VM > 1........""" VM = self.data_elementMulti.VM self.assertEqual(VM, 3, "Wrong Value Multiplicity, expected 3, got %i" % VM) def testVM2(self): """DataElement: return correct value multiplicity for VM = 1........""" VM = self.data_elementIS.VM self.assertEqual(VM, 1, "Wrong Value Multiplicity, expected 1, got %i" % VM) def testBackslash(self): """DataElement: Passing string with '\\' sets multi-valued data_element.""" data_element = DataElement((1,2), "DS", r"42.1\42.2\42.3") # note r" to avoid \ as escape chr self.assertEqual(data_element.VM, 3, "Did not get a mult-valued value") def testUID(self): """DataElement: setting or changing UID results in UID type.........""" ds = Dataset() ds.TransferSyntaxUID = "1.2.3" self.assert_(type(ds.TransferSyntaxUID) is UID, "Assignment to UID did not create UID class") ds.TransferSyntaxUID += ".4.5.6" self.assert_(type(ds.TransferSyntaxUID) is UID, "+= to UID did not keep as UID class") class RawDataElementTests(unittest.TestCase): def setUp(self): # raw data element -> tag VR length value value_tell is_implicit_VR is_little_endian' # Need unknown (not in DICOM dict), non-private, non-group 0 for this test self.raw1 = RawDataElement(Tag(0x88880002), None, 4, 0x1111, 0, True, True) def testKeyError(self): """RawDataElement: conversion with unknown tag throws KeyError........""" self.assertRaises(KeyError, DataElement_from_raw, self.raw1) if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_dataset.py000644 000765 000024 00000026152 11726534363 020570 0ustar00darcystaff000000 000000 # test_dataset.py """unittest cases for dicom.dataset module""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.dataset import Dataset, have_numpy, PropertyError from dicom.dataelem import DataElement, RawDataElement from dicom.tag import Tag from dicom.sequence import Sequence class DatasetTests(unittest.TestCase): def failUnlessRaises(self, excClass, callableObj, *args, **kwargs): """Redefine unittest Exception test to return the exception object""" # from http://stackoverflow.com/questions/88325/how-do-i-unit-test-an-init-method-of-a-python-class-with-assertraises try: callableObj(*args, **kwargs) except excClass, excObj: return excObj # Actually return the exception object else: if hasattr(excClass,'__name__'): excName = excClass.__name__ else: excName = str(excClass) raise self.failureException, "%s not raised" % excName def failUnlessExceptionArgs(self, start_args, excClass, callableObj): """Check the expected args were returned from an exception start_args -- a string with the start of the expected message """ # based on same link as failUnlessRaises override above excObj = self.failUnlessRaises(excClass, callableObj) msg = "\nExpected Exception message:\n" + start_args + "\nGot:\n" + excObj[0] self.assertTrue(excObj[0].startswith(start_args), msg) def testAttributeErrorInProperty(self): """Dataset: AttributeError in property raises actual error message...""" # This comes from bug fix for issue 42 # First, fake enough to try the pixel_array property ds = Dataset() ds.file_meta = Dataset() ds.PixelData = 'xyzlmnop' attribute_error_msg = "AttributeError in pixel_array property: " + \ "Dataset does not have attribute 'TransferSyntaxUID'" self.failUnlessExceptionArgs(attribute_error_msg, PropertyError, ds._get_pixel_array) def dummy_dataset(self): # This dataset is used by many of the tests ds = Dataset() ds.add_new((0x300a, 0x00b2), "SH", "unit001") # TreatmentMachineName return ds def testSetNewDataElementByName(self): """Dataset: set new data_element by name.............................""" ds = Dataset() ds.TreatmentMachineName = "unit #1" data_element = ds[0x300a, 0x00b2] self.assertEqual(data_element.value, "unit #1", "Unable to set data_element by name") self.assertEqual(data_element.VR, "SH", "data_element not the expected VR") def testSetExistingDataElementByName(self): """Dataset: set existing data_element by name........................""" ds = self.dummy_dataset() ds.TreatmentMachineName = "unit999" # change existing value self.assertEqual(ds[0x300a, 0x00b2].value, "unit999") def testSetNonDicom(self): """Dataset: can set class instance property (non-dicom)..............""" ds = Dataset() ds.SomeVariableName = 42 has_it = hasattr(ds, 'SomeVariableName') self.assert_(has_it, "Variable did not get created") if has_it: self.assertEqual(ds.SomeVariableName, 42, "There, but wrong value") def testMembership(self): """Dataset: can test if item present by 'if in dataset'.......""" ds = self.dummy_dataset() self.assert_('TreatmentMachineName' in ds, "membership test failed") self.assert_(not 'Dummyname' in ds, "non-member tested as member") def testContains(self): """Dataset: can test if item present by 'if in dataset'........""" ds = self.dummy_dataset() self.assert_((0x300a, 0xb2) in ds, "membership test failed") self.assert_([0x300a, 0xb2] in ds, "membership test failed when list used") self.assert_(0x300a00b2 in ds, "membership test failed") self.assert_(not (0x10,0x5f) in ds, "non-member tested as member") def testGetExists1(self): """Dataset: dataset.get() returns an existing item by name...........""" ds = self.dummy_dataset() unit = ds.get('TreatmentMachineName', None) self.assertEqual(unit, 'unit001', "dataset.get() did not return existing member by name") def testGetExists2(self): """Dataset: dataset.get() returns an existing item by long tag.......""" ds = self.dummy_dataset() unit = ds.get(0x300A00B2, None).value self.assertEqual(unit, 'unit001', "dataset.get() did not return existing member by long tag") def testGetExists3(self): """Dataset: dataset.get() returns an existing item by tuple tag......""" ds = self.dummy_dataset() unit = ds.get((0x300A, 0x00B2), None).value self.assertEqual(unit, 'unit001', "dataset.get() did not return existing member by tuple tag") def testGetExists4(self): """Dataset: dataset.get() returns an existing item by Tag............""" ds = self.dummy_dataset() unit = ds.get(Tag(0x300A00B2), None).value self.assertEqual(unit, 'unit001', "dataset.get() did not return existing member by tuple tag") def testGetDefault1(self): """Dataset: dataset.get() returns default for non-existing name .....""" ds = self.dummy_dataset() not_there = ds.get('NotAMember', "not-there") self.assertEqual(not_there, "not-there", "dataset.get() did not return default value for non-member by name") def testGetDefault2(self): """Dataset: dataset.get() returns default for non-existing tuple tag.""" ds = self.dummy_dataset() not_there = ds.get((0x9999, 0x9999), "not-there") self.assertEqual(not_there, "not-there", "dataset.get() did not return default value for non-member by tuple tag") def testGetDefault3(self): """Dataset: dataset.get() returns default for non-existing long tag..""" ds = self.dummy_dataset() not_there = ds.get(0x99999999, "not-there") self.assertEqual(not_there, "not-there", "dataset.get() did not return default value for non-member by long tag") def testGetDefault4(self): """Dataset: dataset.get() returns default for non-existing Tag.......""" ds = self.dummy_dataset() not_there = ds.get(Tag(0x99999999), "not-there") self.assertEqual(not_there, "not-there", "dataset.get() did not return default value for non-member by Tag") def testGetFromRaw(self): """Dataset: get(tag) returns same object as ds[tag] for raw element..""" # This came from issue 88, where get(tag#) returned a RawDataElement, # while get(name) converted to a true DataElement test_tag = 0x100010 test_elem = RawDataElement(Tag(test_tag), 'PN', 4, 'test', 0, True, True) ds = Dataset({Tag(test_tag): test_elem}) by_get = ds.get(test_tag) by_item = ds[test_tag] # self.assertEqual(type(elem_get), type(name_get), "Dataset.get() returned different type for name vs tag access") msg = "Dataset.get() returned different objects for ds.get(tag) and ds[tag]:\nBy get():%r\nBy ds[tag]:%r\n" self.assertEqual(by_get, by_item, msg % (by_get, by_item)) def test__setitem__(self): """Dataset: if set an item, it must be a DataElement instance........""" def callSet(): ds[0x300a, 0xb2]="unit1" # common error - set data_element instead of data_element.value ds = Dataset() self.assertRaises(TypeError, callSet) def test_matching_tags(self): """Dataset: key and data_element.tag mismatch raises ValueError......""" def set_wrong_tag(): ds[0x10,0x10] = data_element ds = Dataset() data_element = DataElement((0x300a, 0x00b2), "SH", "unit001") self.assertRaises(ValueError, set_wrong_tag) def test_NamedMemberUpdated(self): """Dataset: if set data_element by tag, name also reflects change....""" ds = self.dummy_dataset() ds[0x300a,0xb2].value = "moon_unit" self.assertEqual(ds.TreatmentMachineName, 'moon_unit', "Member not updated") def testUpdate(self): """Dataset: update() method works with tag or name...................""" ds = self.dummy_dataset() pat_data_element = DataElement((0x10,0x12), 'PN', 'Johnny') ds.update({'PatientName': 'John', (0x10,0x12): pat_data_element}) self.assertEqual(ds[0x10,0x10].value, 'John', "named data_element not set") self.assertEqual(ds[0x10,0x12].value, 'Johnny', "set by tag failed") def testDir(self): """Dataset: dir() returns sorted list of named data_elements.........""" ds = self.dummy_dataset() ds.PatientName = "name" ds.PatientID = "id" ds.NonDicomVariable = "junk" ds.add_new((0x18,0x1151), "IS", 150) # X-ray Tube Current ds.add_new((0x1111, 0x123), "DS", "42.0") # private tag - no name in dir() expected = ['PatientID', 'PatientName', 'TreatmentMachineName', 'XRayTubeCurrent'] self.assertEqual(ds.dir(), expected, "dir() returned %s, expected %s" % (str(ds.dir()), str(expected))) def testDeleteDicomAttr(self): """Dataset: delete DICOM attribute by name...........................""" def testAttribute(): ds.TreatmentMachineName ds = self.dummy_dataset() del ds.TreatmentMachineName self.assertRaises(AttributeError, testAttribute) def testDeleteOtherAttr(self): """Dataset: delete non-DICOM attribute by name.......................""" ds = self.dummy_dataset() ds.meaningoflife = 42 del ds.meaningoflife def testDeleteDicomAttrWeDontHave(self): """Dataset: try delete of missing DICOM attribute....................""" def try_delete(): del ds.PatientName ds = self.dummy_dataset() self.assertRaises(AttributeError, try_delete) class DatasetElementsTests(unittest.TestCase): """Test valid assignments of data elements""" def setUp(self): self.ds = Dataset() self.sub_ds1 = Dataset() self.sub_ds2 = Dataset() def testSequenceAssignment(self): """Assignment to SQ works only if valid Sequence assigned......""" def try_non_Sequence(): self.ds.ConceptCodeSequence = [1,2,3] msg = "Assigning a non-sequence to an SQ data element did not raise error" self.assertRaises(TypeError, try_non_Sequence) # check also that assigning proper sequence *does* work self.ds.ConceptCodeSequence = [self.sub_ds1, self.sub_ds2] self.assert_(isinstance(self.ds.ConceptCodeSequence, Sequence), "Sequence assignment did not result in Sequence type") if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_dictionary.py000644 000765 000024 00000003641 11726534363 021306 0ustar00darcystaff000000 000000 # test_dictionary.py """Test suite for dicom_dictionary.py""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.tag import Tag from dicom.datadict import DicomDictionary, CleanName, all_names_for_tag, dictionary_description class DictTests(unittest.TestCase): def testCleanName(self): """dicom_dictionary: CleanName returns correct strings.............""" self.assert_(CleanName(0x00100010) == "PatientsName") self.assert_(CleanName(Tag((0x0010, 0x0010))) == "PatientsName") def testTagNotFound(self): """dicom_dictionary: CleanName returns blank string for unknown tag""" self.assert_(CleanName(0x99991111)=="") def testNameFinding(self): """dicom_dictionary: get long and short names for a data_element name""" names = all_names_for_tag(Tag(0x300a00b2)) # Treatment Machine Name expected = ['TreatmentMachineName'] self.assertEqual(names, expected, "Expected %s, got %s" % (expected, names)) names = all_names_for_tag(Tag(0x300A0120)) expected = ['BeamLimitingDeviceAngle', 'BLDAngle'] self.assertEqual(names, expected, "Expected %s, got %s" % (expected, names)) def testRepeaters(self): """dicom_dictionary: Tags with "x" return correct dict info........""" self.assertEqual(dictionary_description(0x280400), 'Transform Label') self.assertEqual(dictionary_description(0x280410), 'Rows For Nth Order Coefficients') class PrivateDictTests(unittest.TestCase): def testPrivate1(self): """private dict: """ self.assert_(CleanName(0x00100010) == "PatientsName") self.assert_(CleanName(Tag((0x0010, 0x0010))) == "PatientsName") if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_filereader.py000644 000765 000024 00000044410 11726534363 021242 0ustar00darcystaff000000 000000 # test_filereader.py """unittest tests for dicom.filereader module""" # Copyright (c) 2010-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import sys import os import os.path import unittest from cStringIO import StringIO from decimal import Decimal import shutil # os.stat is only available on Unix and Windows XXX Mac? # Not sure if on other platforms the import fails, or the call to it?? stat_available = True try: from os import stat except: stat_available = False have_numpy = True try: import numpy except: have_numpy = False from dicom.filereader import read_file, data_element_generator, InvalidDicomError from dicom.values import convert_value from dicom.tag import Tag from dicom.sequence import Sequence import gzip from warncheck import assertWarns from pkg_resources import Requirement, resource_filename test_dir = resource_filename(Requirement.parse("pydicom"),"dicom/testfiles") rtplan_name = os.path.join(test_dir, "rtplan.dcm") rtdose_name = os.path.join(test_dir, "rtdose.dcm") ct_name = os.path.join(test_dir, "CT_small.dcm") mr_name = os.path.join(test_dir, "MR_small.dcm") jpeg2000_name = os.path.join(test_dir, "JPEG2000.dcm") jpeg_lossy_name = os.path.join(test_dir, "JPEG-lossy.dcm") jpeg_lossless_name = os.path.join(test_dir, "JPEG-LL.dcm") deflate_name = os.path.join(test_dir, "image_dfl.dcm") rtstruct_name = os.path.join(test_dir, "rtstruct.dcm") priv_SQ_name = os.path.join(test_dir, "priv_SQ.dcm") no_meta_group_length = os.path.join(test_dir, "no_meta_group_length.dcm") gzip_name = os.path.join(test_dir, "zipMR.gz") dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() def isClose(a, b, epsilon=0.000001): """Compare within some tolerance, to avoid machine roundoff differences""" try: a.append # see if is a list except: # (is not) return abs(a-b) < epsilon else: if len(a) != len(b): return False for ai, bi in zip(a, b): if abs(ai-bi) > epsilon: return False return True class ReaderTests(unittest.TestCase): def testRTPlan(self): """Returns correct values for sample data elements in test RT Plan file""" plan = read_file(rtplan_name) beam = plan.BeamSequence[0] cp0, cp1 = beam.ControlPointSequence # if not two controlpoints, then this would raise exception self.assertEqual(beam.TreatmentMachineName, "unit001", "Incorrect unit name") self.assertEqual(beam.TreatmentMachineName, beam[0x300a, 0x00b2].value, "beam TreatmentMachineName does not match the value accessed by tag number") got = cp1.ReferencedDoseReferenceSequence[0].CumulativeDoseReferenceCoefficient expected = Decimal('0.9990268') self.assert_(got == expected, "Cum Dose Ref Coeff not the expected value (CP1, Ref'd Dose Ref") got = cp0.BeamLimitingDevicePositionSequence[0].LeafJawPositions self.assert_(got[0] == Decimal('-100') and got[1] == Decimal('100.0'), "X jaws not as expected (control point 0)") def testRTDose(self): """Returns correct values for sample data elements in test RT Dose file""" dose = read_file(rtdose_name) self.assertEqual(dose.FrameIncrementPointer, Tag((0x3004, 0x000c)), "Frame Increment Pointer not the expected value") self.assertEqual(dose.FrameIncrementPointer, dose[0x28, 9].value, "FrameIncrementPointer does not match the value accessed by tag number") # try a value that is nested the deepest (so deep I break it into two steps!) fract = dose.ReferencedRTPlanSequence[0].ReferencedFractionGroupSequence[0] beamnum = fract.ReferencedBeamSequence[0].ReferencedBeamNumber self.assertEqual(beamnum, 1, "Beam number not the expected value") def testCT(self): """Returns correct values for sample data elements in test CT file....""" ct = read_file(ct_name) self.assertEqual(ct.file_meta.ImplementationClassUID, '1.3.6.1.4.1.5962.2', "ImplementationClassUID not the expected value") self.assertEqual(ct.file_meta.ImplementationClassUID, ct.file_meta[0x2, 0x12].value, "ImplementationClassUID does not match the value accessed by tag number") # (0020, 0032) Image Position (Patient) [-158.13580300000001, -179.035797, -75.699996999999996] got = ct.ImagePositionPatient expected = [Decimal('-158.135803'), Decimal('-179.035797'), Decimal('-75.699997')] self.assert_(got == expected, "ImagePosition(Patient) values not as expected." "got %s, expected %s" % (got,expected)) self.assertEqual(ct.Rows, 128, "Rows not 128") self.assertEqual(ct.Columns, 128, "Columns not 128") self.assertEqual(ct.BitsStored, 16, "Bits Stored not 16") self.assertEqual(len(ct.PixelData), 128*128*2, "Pixel data not expected length") # Also test private elements name can be resolved: expected = "[Duration of X-ray on]" got = ct[(0x0043,0x104e)].name msg = "Mismatch in private tag name, expected '%s', got '%s'" self.assertEqual(expected, got, msg % (expected, got)) # Check that can read pixels - get last one in array if have_numpy: expected = 909 got = ct.pixel_array[-1][-1] msg = "Did not get correct value for last pixel: expected %d, got %r" % (expected, got) self.assertEqual(expected, got, msg) else: print "**Numpy not available -- pixel array test skipped**" def testNoForce(self): """Raises exception if missing DICOM header and force==False...........""" self.assertRaises(InvalidDicomError, read_file, rtstruct_name) def testRTstruct(self): """Returns correct values for sample elements in test RTSTRUCT file....""" # RTSTRUCT test file has complex nested sequences -- see rtstruct.dump file # Also has no DICOM header ... so tests 'force' argument of read_file rtss = read_file(rtstruct_name, force=True) expected = '1.2.840.10008.1.2' # implVR little endian got = rtss.file_meta.TransferSyntaxUID msg = "Expected transfer syntax %r, got %r" % (expected, got) self.assertEqual(expected, got, msg) frame_of_ref = rtss.ReferencedFrameOfReferenceSequence[0] study = frame_of_ref.RTReferencedStudySequence[0] uid = study.RTReferencedSeriesSequence[0].SeriesInstanceUID expected = "1.2.826.0.1.3680043.8.498.2010020400001.2.1.1" msg = "Expected Reference Series UID '%s', got '%s'" % (expected, uid) self.assertEqual(expected, uid, msg) got = rtss.ROIContourSequence[0].ContourSequence[2].ContourNumber expected = 3 msg = "Expected Contour Number %d, got %r" % (expected, got) self.assertEqual(expected, got, msg) obs_seq0 = rtss.RTROIObservationsSequence[0] got = obs_seq0.ROIPhysicalPropertiesSequence[0].ROIPhysicalProperty expected = 'REL_ELEC_DENSITY' msg = "Expected Physical Property '%s', got %r" % (expected, got) self.assertEqual(expected, got, msg) def testDir(self): """Returns correct dir attributes for both Dataset and DICOM names (python >= 2.6)..""" # Only python >= 2.6 calls __dir__ for dir() call if sys.version_info >= (2,6): rtss = read_file(rtstruct_name, force=True) # sample some expected 'dir' values got_dir = dir(rtss) expect_in_dir = ['pixel_array', 'add_new', 'ROIContourSequence', 'StructureSetDate', '__sizeof__'] expect_not_in_dir = ['RemovePrivateTags', 'AddNew', 'GroupDataset'] # remove in v1.0 for name in expect_in_dir: self.assert_(name in got_dir, "Expected name '%s' in dir()" % name) for name in expect_not_in_dir: self.assert_(name not in got_dir, "Unexpected name '%s' in dir()" % name) # Now check for some items in dir() of a nested item roi0 = rtss.ROIContourSequence[0] got_dir = dir(roi0) expect_in_dir = ['pixel_array', 'add_new', 'ReferencedROINumber', 'ROIDisplayColor', '__sizeof__'] for name in expect_in_dir: self.assert_(name in got_dir, "Expected name '%s' in dir()" % name) def testMR(self): """Returns correct values for sample data elements in test MR file.....""" mr = read_file(mr_name) # (0010, 0010) Patient's Name 'CompressedSamples^MR1' self.assertEqual(mr.PatientName, 'CompressedSamples^MR1', "Wrong patient name") self.assertEqual(mr.PatientName, mr[0x10,0x10].value, "Name does not match value found when accessed by tag number") got = mr.PixelSpacing expected = [Decimal('0.3125'), Decimal('0.3125')] self.assert_(got == expected, "Wrong pixel spacing") def testDeflate(self): """Returns correct values for sample data elements in test compressed (zlib deflate) file""" # Everything after group 2 is compressed. If we can read anything else, the decompression must have been ok. ds = read_file(deflate_name) got = ds.ConversionType expected = "WSD" self.assertEqual(got, expected, "Attempted to read deflated file data element Conversion Type, expected '%s', got '%s'" % (expected, got)) def testNoPixelsRead(self): """Returns all data elements before pixels using stop_before_pixels=False""" # Just check the tags, and a couple of values ctpartial = read_file(ct_name, stop_before_pixels=True) ctpartial_tags = sorted(ctpartial.keys()) ctfull = read_file(ct_name) ctfull_tags = sorted(ctfull.keys()) msg = "Tag list of partial CT read (except pixel tag and padding) did not match full read" msg += "\nExpected: %r\nGot %r" % (ctfull_tags[:-2], ctpartial_tags) missing = [Tag(0x7fe0, 0x10), Tag(0xfffc, 0xfffc)] self.assertEqual(ctfull_tags, ctpartial_tags+missing, msg) def testPrivateSQ(self): """Can read private undefined length SQ without error....................""" # From issues 91, 97, 98. Bug introduced by fast reading, due to VR=None # in raw data elements, then an undefined length private item VR is looked up, # and there is no such tag, generating an exception # Simply read the file, in 0.9.5 this generated an exception priv_SQ = read_file(priv_SQ_name) def testNoMetaGroupLength(self): """Read file with no group length in file meta...........................""" # Issue 108 -- iView example file with no group length (0002,0002) # Originally crashed, now check no exception, but also check one item # in file_meta, and second one in followinsg dataset ds = read_file(no_meta_group_length) got = ds.InstanceCreationDate expected = "20111130" self.assertEqual(got, expected, "Sample data element after file meta with no group length failed, expected '%s', got '%s'" % (expected, got)) class JPEG2000Tests(unittest.TestCase): def setUp(self): self.jpeg = read_file(jpeg2000_name) def testJPEG2000(self): """JPEG2000: Returns correct values for sample data elements............""" expected = [Tag(0x0054, 0x0010), Tag(0x0054, 0x0020)] # XX also tests multiple-valued AT data element got = self.jpeg.FrameIncrementPointer self.assertEqual(got, expected, "JPEG2000 file, Frame Increment Pointer: expected %s, got %s" % (expected, got)) got = self.jpeg.DerivationCodeSequence[0].CodeMeaning expected = 'Lossy Compression' self.assertEqual(got, expected, "JPEG200 file, Code Meaning got %s, expected %s" % (got, expected)) def testJPEG2000PixelArray(self): """JPEG2000: Fails gracefully when uncompressed data is asked for.......""" self.assertRaises(NotImplementedError, self.jpeg._getPixelArray) class JPEGlossyTests(unittest.TestCase): def setUp(self): self.jpeg = read_file(jpeg_lossy_name) def testJPEGlossy(self): """JPEG-lossy: Returns correct values for sample data elements..........""" got = self.jpeg.DerivationCodeSequence[0].CodeMeaning expected = 'Lossy Compression' self.assertEqual(got, expected, "JPEG-lossy file, Code Meaning got %s, expected %s" % (got, expected)) def testJPEGlossyPixelArray(self): """JPEG-lossy: Fails gracefully when uncompressed data is asked for.....""" self.assertRaises(NotImplementedError, self.jpeg._getPixelArray) class JPEGlosslessTests(unittest.TestCase): def setUp(self): self.jpeg = read_file(jpeg_lossless_name) def testJPEGlossless(self): """JPEGlossless: Returns correct values for sample data elements........""" got = self.jpeg.SourceImageSequence[0].PurposeOfReferenceCodeSequence[0].CodeMeaning expected = 'Uncompressed predecessor' self.assertEqual(got, expected, "JPEG-lossless file, Code Meaning got %s, expected %s" % (got, expected)) def testJPEGlosslessPixelArray(self): """JPEGlossless: Fails gracefully when uncompressed data is asked for...""" self.assertRaises(NotImplementedError, self.jpeg._getPixelArray) # create an in-memory fragment class DeferredReadTests(unittest.TestCase): """Test that deferred data element reading (for large size) works as expected """ # Copy one of test files and use temporarily, then later remove. def setUp(self): self.testfile_name = ct_name + ".tmp" shutil.copyfile(ct_name, self.testfile_name) def testTimeCheck(self): """Deferred read warns if file has been modified...........""" if stat_available: ds = read_file(self.testfile_name, defer_size=2000) from time import sleep sleep(1) open(self.testfile_name, "r+").write('\0') # "touch" the file warning_start = "Deferred read warning -- file modification time " def read_value(): data_elem = ds.PixelData assertWarns(self, warning_start, read_value) def testFileExists(self): """Deferred read raises error if file no longer exists.....""" ds = read_file(self.testfile_name, defer_size=2000) os.remove(self.testfile_name) def read_value(): data_elem = ds.PixelData self.assertRaises(IOError, read_value) def testValuesIdentical(self): """Deferred values exactly matches normal read...............""" ds_norm = read_file(self.testfile_name) ds_defer = read_file(self.testfile_name, defer_size=2000) for data_elem in ds_norm: tag = data_elem.tag self.assertEqual(data_elem.value, ds_defer[tag].value, "Mismatched value for tag %r" % tag) def testZippedDeferred(self): """Deferred values from a gzipped file works..............""" # Arose from issue 103 "Error for defer_size read of gzip file object" fobj = gzip.open(gzip_name) ds = read_file(fobj, defer_size=1) # before the fix, this threw an error as file reading was not in right place, # it was re-opened as a normal file, not zip file num = ds.InstanceNumber def tearDown(self): if os.path.exists(self.testfile_name): os.remove(self.testfile_name) class FileLikeTests(unittest.TestCase): """Test that can read DICOM files with file-like object rather than filename""" def testReadFileGivenFileObject(self): """filereader: can read using already opened file............""" f = open(ct_name, 'rb') ct = read_file(f) # Tests here simply repeat testCT -- perhaps should collapse the code together? got = ct.ImagePositionPatient expected = [Decimal('-158.135803'), Decimal('-179.035797'), Decimal('-75.699997')] self.assert_(got == expected, "ImagePosition(Patient) values not as expected") self.assertEqual(ct.file_meta.ImplementationClassUID, '1.3.6.1.4.1.5962.2', "ImplementationClassUID not the expected value") self.assertEqual(ct.file_meta.ImplementationClassUID, ct.file_meta[0x2, 0x12].value, "ImplementationClassUID does not match the value accessed by tag number") # (0020, 0032) Image Position (Patient) [-158.13580300000001, -179.035797, -75.699996999999996] got = ct.ImagePositionPatient expected = [Decimal('-158.135803'), Decimal('-179.035797'), Decimal('-75.699997')] self.assert_(got == expected, "ImagePosition(Patient) values not as expected") self.assertEqual(ct.Rows, 128, "Rows not 128") self.assertEqual(ct.Columns, 128, "Columns not 128") self.assertEqual(ct.BitsStored, 16, "Bits Stored not 16") self.assertEqual(len(ct.PixelData), 128*128*2, "Pixel data not expected length") # Should also be able to close the file ourselves without exception raised: f.close() def testReadFileGivenFileLikeObject(self): """filereader: can read using a file-like (StringIO) file....""" file_like = StringIO(open(ct_name, 'rb').read()) ct = read_file(file_like) # Tests here simply repeat some of testCT test got = ct.ImagePositionPatient expected = [Decimal('-158.135803'), Decimal('-179.035797'), Decimal('-75.699997')] self.assert_(got == expected, "ImagePosition(Patient) values not as expected") self.assertEqual(len(ct.PixelData), 128*128*2, "Pixel data not expected length") # Should also be able to close the file ourselves without exception raised: file_like.close() if __name__ == "__main__": # This is called if run alone, but not if loaded through run_tests.py # If not run from the directory where the sample images are, then need to switch there dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() if dir_name: os.chdir(dir_name) os.chdir("../testfiles") unittest.main() os.chdir(save_dir) pydicom-0.9.7/dicom/test/test_filewriter.py000644 000765 000024 00000016477 11726534363 021330 0ustar00darcystaff000000 000000 # test_filewriter.py """unittest cases for dicom.filewriter module""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import sys import os.path import os import unittest from dicom.filereader import read_file from dicom.filewriter import write_data_element from dicom.tag import Tag from dicom.dataset import Dataset, FileDataset from dicom.sequence import Sequence from dicom.util.hexutil import hex2bytes, bytes2hex # from cStringIO import StringIO from dicom.filebase import DicomStringIO from dicom.dataelem import DataElement from dicom.util.hexutil import hex2bytes, bytes2hex from pkg_resources import Requirement, resource_filename test_dir = resource_filename(Requirement.parse("pydicom"),"dicom/testfiles") rtplan_name = os.path.join(test_dir, "rtplan.dcm") rtdose_name = os.path.join(test_dir, "rtdose.dcm") ct_name = os.path.join(test_dir, "CT_small.dcm") mr_name = os.path.join(test_dir, "MR_small.dcm") jpeg_name = os.path.join(test_dir, "JPEG2000.dcm") # Set up rtplan_out, rtdose_out etc. Filenames as above, with '2' appended for inname in ['rtplan', 'rtdose', 'ct', 'mr', 'jpeg']: exec(inname + "_out = " + inname + "_name + '2'") def files_identical(a, b): """Return a tuple (file a == file b, index of first difference)""" a_bytes = file(a, "rb").read() b_bytes = file(b, "rb").read() return bytes_identical(a_bytes, b_bytes) def bytes_identical(a_bytes, b_bytes): """Return a tuple (bytes a == bytes b, index of first difference)""" if a_bytes == b_bytes: return True, 0 # True, dummy argument else: pos = 0 while a_bytes[pos] == b_bytes[pos]: pos += 1 return False, pos # False (not identical files), position of first difference class WriteFileTests(unittest.TestCase): def compare(self, in_filename, out_filename): """Read file1, write file2, then compare. Return value as for files_identical""" dataset = read_file(in_filename) dataset.save_as(out_filename) same, pos = files_identical(in_filename, out_filename) self.assert_(same, "Files are not identical - first difference at 0x%x" % pos) if os.path.exists(out_filename): os.remove(out_filename) # get rid of the file def testRTPlan(self): """Input file, write back and verify them identical (RT Plan file)""" self.compare(rtplan_name, rtplan_out) def testRTDose(self): """Input file, write back and verify them identical (RT Dose file)""" self.compare(rtdose_name, rtdose_out) def testCT(self): """Input file, write back and verify them identical (CT file).....""" self.compare(ct_name, ct_out) def testMR(self): """Input file, write back and verify them identical (MR file).....""" self.compare(mr_name, mr_out) def testJPEG2000(self): """Input file, write back and verify them identical (JPEG2K file).""" self.compare(jpeg_name, jpeg_out) def testListItemWriteBack(self): """Change item in a list and confirm it is written to file ..""" DS_expected = 0 CS_expected = "new" SS_expected = 999 ds = read_file(ct_name) ds.ImagePositionPatient[2] = DS_expected ds.ImageType[1] = CS_expected ds[(0x0043, 0x1012)].value[0] = SS_expected ds.save_as(ct_out) # Now read it back in and check that the values were changed ds = read_file(ct_out) self.assert_(ds.ImageType[1] == CS_expected, "Item in a list not written correctly to file (VR=CS)") self.assert_(ds[0x00431012].value[0] == SS_expected, "Item in a list not written correctly to file (VR=SS)") self.assert_(ds.ImagePositionPatient[2] == DS_expected, "Item in a list not written correctly to file (VR=DS)") if os.path.exists(ct_out): os.remove(ct_out) class WriteDataElementTests(unittest.TestCase): """Attempt to write data elements has the expected behaviour""" def setUp(self): # Create a dummy (in memory) file to write to self.f1 = DicomStringIO() self.f1.is_little_endian = True self.f1.is_implicit_VR = True def test_empty_AT(self): """Write empty AT correctly..........""" # Was issue 74 data_elem = DataElement(0x00280009, "AT", []) expected = hex2bytes(( " 28 00 09 00" # (0028,0009) Frame Increment Pointer " 00 00 00 00" # length 0 )) write_data_element(self.f1, data_elem) got = self.f1.parent.getvalue() msg = ("Did not write zero-length AT value correctly. " "Expected %r, got %r") % (bytes2hex(expected), bytes2hex(got)) msg = "%r %r" % (type(expected), type(got)) msg = "'%r' '%r'" % (expected, got) self.assertEqual(expected, got, msg) class ScratchWriteTests(unittest.TestCase): """Simple dataset from scratch, written in all endian/VR combinations""" def setUp(self): # Create simple dataset for all tests ds = Dataset() ds.PatientName = "Name^Patient" # Set up a simple nested sequence # first, the innermost sequence subitem1 = Dataset() subitem1.ContourNumber = 1 subitem1.ContourData = ['2','4','8','16'] subitem2 = Dataset() subitem2.ContourNumber = 2 subitem2.ContourData = ['32','64','128','196'] sub_ds = Dataset() sub_ds.ContourSequence = Sequence((subitem1, subitem2)) # XXX in 0.9.5 will need sub_ds.ContourSequence # Now the top-level sequence ds.ROIContourSequence = Sequence((sub_ds,)) # Comma necessary to make it a one-tuple # Store so each test can use it self.ds = ds def compare_write(self, hex_std, file_ds): """Write file and compare with expected byte string :arg hex_std: the bytes which should be written, as space separated hex :arg file_ds: a FileDataset instance containing the dataset to write """ out_filename = "scratch.dcm" file_ds.save_as(out_filename) std = hex2bytes(hex_std) bytes_written = open(out_filename,'rb').read() # print "std :", bytes2hex(std) # print "written:", bytes2hex(bytes_written) same, pos = bytes_identical(std, bytes_written) self.assert_(same, "Writing from scratch not expected result - first difference at 0x%x" % pos) if os.path.exists(out_filename): os.remove(out_filename) # get rid of the file def testImpl_LE_deflen_write(self): """Scratch Write for implicit VR little endian, defined length SQ's""" from dicom.test._write_stds import impl_LE_deflen_std_hex as std file_ds = FileDataset("test", self.ds) self.compare_write(std, file_ds) if __name__ == "__main__": # This is called if run alone, but not if loaded through run_tests.py # If not run from the directory where the sample images are, then need to switch there dir_name = os.path.dirname(sys.argv[0]) save_dir = os.getcwd() if dir_name: os.chdir(dir_name) os.chdir("../testfiles") unittest.main() os.chdir(save_dir)pydicom-0.9.7/dicom/test/test_multival.py000644 000765 000024 00000005400 11726534363 020771 0ustar00darcystaff000000 000000 # test_multival.py """Test suite for MultiValue class""" # Copyright (c) 2012 Darcy Mason # This file is part of pydicom, relased under an MIT-style license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.multival import MultiValue from dicom.valuerep import DS, IS import dicom.config import sys python_version = sys.version_info class MultiValuetests(unittest.TestCase): def testMultiDS(self): """MultiValue: Multi-valued data elements can be created........""" multival = MultiValue(DS, ['11.1', '22.2', '33.3']) for val in multival: self.assert_(isinstance(val, DS), "Multi-value DS item not converted to DS") def testLimits(self): """MultiValue: Raise error if any item outside DICOM limits....""" original_flag = dicom.config.enforce_valid_values dicom.config.enforce_valid_values = True self.assertRaises(OverflowError, MultiValue, IS, [1, -2**31-1]) # Overflow error not raised for IS out of DICOM valid range if python_version >= (2,7): # will overflow anyway for python < 2.7 dicom.config.enforce_valid_values = False i = MultiValue(IS, [1, -2**31-1]) # config enforce=False so should not raise error dicom.config.enforce_valid_values = original_flag def testAppend(self): """MultiValue: Append of item converts it to required type...""" multival = MultiValue(IS, [1, 5, 10]) multival.append('5') self.assert_(isinstance(multival[-1], IS)) self.assertEqual(multival[-1], 5, "Item set by append is not correct value") def testSetIndex(self): """MultiValue: Setting list item converts it to required type""" multival = MultiValue(IS, [1, 5, 10]) multival[1] = '7' self.assert_(isinstance(multival[1], IS)) self.assertEqual(multival[1], 7, "Item set by index is not correct value") def testExtend(self): """MultiValue: Extending a list converts all to required type""" multival = MultiValue(IS, [1, 5, 10]) multival.extend(['7', 42]) self.assert_(isinstance(multival[-2], IS)) self.assert_(isinstance(multival[-1], IS)) self.assertEqual(multival[-2], 7, "Item set by extend not correct value") def testSlice(self): """MultiValue: Setting slice converts items to required type.""" multival = MultiValue(IS, range(7)) multival[2:7:2] = [4,16,36] for val in multival: self.assert_(isinstance(val,IS), "Slice IS value not correct type") self.assertEqual(multival[4], 16, "Set by slice failed for item 4 of list") if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_rawread.py000644 000765 000024 00000033726 11726534363 020575 0ustar00darcystaff000000 000000 # test_rawread.py """unittest tests for dicom.filereader module -- simple raw data elements""" # Copyright (c) 2010 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from cStringIO import StringIO import unittest from dicom.filereader import data_element_generator from dicom.values import convert_value from dicom.sequence import Sequence def hex2str(hexstr): """Return a bytestring rep of a string of hex rep of bytes separated by spaces""" return "".join((chr(int(x,16)) for x in hexstr.split())) class RawReaderExplVRTests(unittest.TestCase): # See comments in data_element_generator -- summary of DICOM data element formats # Here we are trying to test all those variations def testExplVRLittleEndianLongLength(self): """Raw read: Explicit VR Little Endian long length......................""" # (0002,0001) OB 2-byte-reserved 4-byte-length, value 0x00 0x01 infile = StringIO(hex2str("02 00 01 00 4f 42 00 00 02 00 00 00 00 01")) expected = ((2,1), 'OB', 2, '\00\01', 0xc, False, True) de_gen = data_element_generator(infile, is_implicit_VR=False, is_little_endian=True) got = de_gen.next() msg_loc = "in read of Explicit VR='OB' data element (long length format)" self.assertEqual(got, expected, "Expected: %r, got %r in %s" % (expected, got, msg_loc)) # (0002,0002) OB 2-byte-reserved 4-byte-length, value 0x00 0x01 def testExplVRLittleEndianShortLength(self): """Raw read: Explicit VR Little Endian short length.....................""" # (0008,212a) IS 2-byte-length, value '1 ' infile = StringIO(hex2str("08 00 2a 21 49 53 02 00 31 20")) expected = ((8,0x212a), 'IS', 2, '1 ', 0x8, False, True) de_gen = data_element_generator(infile, is_implicit_VR=False, is_little_endian=True) got = de_gen.next() msg_loc = "in read of Explicit VR='IS' data element (short length format)" self.assertEqual(got, expected, "Expected: %r, got %r in %s" % (expected, got, msg_loc)) def testExplVRLittleEndianUndefLength(self): """Raw read: Expl VR Little Endian with undefined length................""" # (7fe0,0010), OB, 2-byte reserved, 4-byte-length (UNDEFINED) bytes1 = "e0 7f 10 00 4f 42 00 00 ff ff ff ff" bytes2 = " 41 42 43 44 45 46 47 48 49 4a" # 'content' bytes3 = " fe ff dd e0 00 00 00 00" # Sequence Delimiter bytes = bytes1 + bytes2 + bytes3 infile = StringIO(hex2str(bytes)) expected = ((0x7fe0,0x10), 'OB', 0xffffffffL, 'ABCDEFGHIJ', 0xc, False, True) de_gen = data_element_generator(infile, is_implicit_VR=False, is_little_endian=True) got = de_gen.next() msg_loc = "in read of undefined length Explicit VR ='OB' short value)" self.assertEqual(got, expected, "Expected: %r, got %r in %s" % (expected, got, msg_loc)) # Test again such that delimiter crosses default 128-byte read "chunks", etc for multiplier in (116, 117, 118, 120): multiplier = 116 bytes2b = bytes2 + " 00"*multiplier bytes = bytes1 + bytes2b + bytes3 infile = StringIO(hex2str(bytes)) expected = len('ABCDEFGHIJ'+'\0'*multiplier) de_gen = data_element_generator(infile, is_implicit_VR=False, is_little_endian=True) got = de_gen.next() got_len = len(got.value) msg_loc = "in read of undefined length Explicit VR ='OB' with 'multiplier' %d" % multiplier self.assertEqual(expected, got_len, "Expected value length %d, got %d in %s" % (expected, got_len, msg_loc)) msg = "Unexpected value start with multiplier %d on Expl VR undefined length" % multiplier self.assert_(got.value.startswith('ABCDEFGHIJ\0'), msg) class RawReaderImplVRTests(unittest.TestCase): # See comments in data_element_generator -- summary of DICOM data element formats # Here we are trying to test all those variations def testImplVRLittleEndian(self): """Raw read: Implicit VR Little Endian..................................""" # (0008,212a) {IS} 4-byte-length, value '1 ' infile = StringIO(hex2str("08 00 2a 21 02 00 00 00 31 20")) expected = ((8,0x212a), None, 2, '1 ', 0x8, True, True) de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=True) got = de_gen.next() msg_loc = "in read of Implicit VR='IS' data element (short length format)" self.assertEqual(got, expected, "Expected: %r, got %r in %s" % (expected, got, msg_loc)) def testImplVRLittleEndianUndefLength(self): """Raw read: Impl VR Little Endian with undefined length................""" # (7fe0,0010), OB, 2-byte reserved, 4-byte-length (UNDEFINED) bytes1 = "e0 7f 10 00 ff ff ff ff" bytes2 = " 41 42 43 44 45 46 47 48 49 4a" # 'content' bytes3 = " fe ff dd e0 00 00 00 00" # Sequence Delimiter bytes = bytes1 + bytes2 + bytes3 infile = StringIO(hex2str(bytes)) expected = ((0x7fe0,0x10), 'OW or OB', 0xffffffffL, 'ABCDEFGHIJ', 0x8, True, True) de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=True) got = de_gen.next() msg_loc = "in read of undefined length Implicit VR ='OB' short value)" self.assertEqual(got, expected, "Expected: %r, got %r in %s" % (expected, got, msg_loc)) # Test again such that delimiter crosses default 128-byte read "chunks", etc for multiplier in (116, 117, 118, 120): multiplier = 116 bytes2b = bytes2 + " 00"*multiplier bytes = bytes1 + bytes2b + bytes3 infile = StringIO(hex2str(bytes)) expected = len('ABCDEFGHIJ'+'\0'*multiplier) de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=True) got = de_gen.next() got_len = len(got.value) msg_loc = "in read of undefined length Implicit VR with 'multiplier' %d" % multiplier self.assertEqual(expected, got_len, "Expected value length %d, got %d in %s" % (expected, got_len, msg_loc)) msg = "Unexpected value start with multiplier %d on Implicit VR undefined length" % multiplier self.assert_(got.value.startswith('ABCDEFGHIJ\0'), msg) class RawSequenceTests(unittest.TestCase): # See DICOM standard PS3.5-2008 section 7.5 for sequence syntax def testEmptyItem(self): """Read sequence with a single empty item...............................""" # This is fix for issue 27 bytes = ( "08 00 32 10" # (0008, 1032) SQ "Procedure Code Sequence" " 08 00 00 00" # length 8 " fe ff 00 e0" # (fffe, e000) Item Tag " 00 00 00 00" # length = 0 ) + ( # --------------- end of Sequence " 08 00 3e 10" # (0008, 103e) LO "Series Description" " 0c 00 00 00" # length " 52 20 41 44 44 20 56 49 45 57 53 20" # value ) # "\x08\x00\x32\x10\x08\x00\x00\x00\xfe\xff\x00\xe0\x00\x00\x00\x00" # from issue 27, procedure code sequence (0008,1032) # bytes += "\x08\x00\x3e\x10\x0c\x00\x00\x00\x52\x20\x41\x44\x44\x20\x56\x49\x45\x57\x53\x20" # data element following fp = StringIO(hex2str(bytes)) gen = data_element_generator(fp, is_implicit_VR=True, is_little_endian=True) raw_seq = gen.next() seq = convert_value("SQ", raw_seq) self.assert_(isinstance(seq, Sequence), "Did not get Sequence, got type '%s'" % type(seq)) self.assert_(len(seq)==1, "Expected Sequence with single (empty) item, got %d item(s)" % len(seq)) self.assert_(len(seq[0])==0, "Expected the sequence item (dataset) to be empty") elem2 = gen.next() self.assertEqual(elem2.tag, 0x0008103e, "Expected a data element after empty sequence item") def testImplVRLittleEndian_ExplicitLengthSeq(self): """Raw read: ImplVR Little Endian SQ with explicit lengths..............""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-1 p42 bytes = ( "0a 30 B0 00" # (300a, 00b0) Beam Sequence " 40 00 00 00" # length " fe ff 00 e0" # (fffe, e000) Item Tag " 18 00 00 00" # Item (dataset) Length " 0a 30 c0 00" # (300A, 00C0) Beam Number " 02 00 00 00" # length " 31 20" # value '1 ' " 0a 30 c2 00" # (300A, 00C2) Beam Name " 06 00 00 00" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " fe ff 00 e0" # (fffe, e000) Item Tag " 18 00 00 00" # Item (dataset) Length " 0a 30 c0 00" # (300A, 00C0) Beam Number " 02 00 00 00" # length " 32 20" # value '2 ' " 0a 30 c2 00" # (300A, 00C2) Beam Name " 06 00 00 00" # length " 42 65 61 6d 20 32" # value 'Beam 2' ) infile = StringIO(hex2str(bytes)) de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=True) raw_seq = de_gen.next() seq = convert_value("SQ", raw_seq) # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: got = seq[0].BeamNumber self.assert_(got == 1, "Expected Beam Number 1, got %r" % got) got = seq[1].BeamName self.assert_(got == 'Beam 2', "Expected Beam Name 'Beam 2', got %s" % got) def testImplVRBigEndian_ExplicitLengthSeq(self): """Raw read: ImplVR BigEndian SQ with explicit lengths..................""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-1 p42 bytes = ( "30 0a 00 B0" # (300a, 00b0) Beam Sequence " 00 00 00 40" # length " ff fe e0 00" # (fffe, e000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A, 00C0) Beam Number " 00 00 00 02" # length " 31 20" # value '1 ' " 30 0a 00 c2" # (300A, 00C2) Beam Name " 00 00 00 06" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " ff fe e0 00" # (fffe, e000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A, 00C0) Beam Number " 00 00 00 02" # length " 32 20" # value '2 ' " 30 0a 00 c2" # (300A, 00C2) Beam Name " 00 00 00 06" # length " 42 65 61 6d 20 32" # value 'Beam 2' ) infile = StringIO(hex2str(bytes)) de_gen = data_element_generator(infile, is_implicit_VR=True, is_little_endian=False) raw_seq = de_gen.next() seq = convert_value("SQ", raw_seq) # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: got = seq[0].BeamNumber self.assert_(got == 1, "Expected Beam Number 1, got %r" % got) got = seq[1].BeamName self.assert_(got == 'Beam 2', "Expected Beam Name 'Beam 2', got %s" % got) def testExplVRBigEndian_UndefinedLengthSeq(self): """Raw read: ExplVR BigEndian Undefined Length SQ.......................""" # Create a fictional sequence with bytes directly, # similar to PS 3.5-2008 Table 7.5-2 p42 item1_value_bytes = "\1"*126 item2_value_bytes = "\2"*222 bytes = ( "30 0a 00 B0" # (300a, 00b0) Beam Sequence " 53 51" # SQ " 00 00" # reserved " ff ff ff ff" # undefined length " ff fe e0 00" # (fffe, e000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A, 00C0) Beam Number " 49 53" # IS " 00 02" # length " 31 20" # value '1 ' " 30 0a 00 c2" # (300A, 00C2) Beam Name " 4c 4F" # LO " 00 06" # length " 42 65 61 6d 20 31" # value 'Beam 1' # ------------- " ff fe e0 00" # (fffe, e000) Item Tag " 00 00 00 18" # Item (dataset) Length " 30 0a 00 c0" # (300A, 00C0) Beam Number " 49 53" # IS " 00 02" # length " 32 20" # value '2 ' " 30 0a 00 c2" # (300A, 00C2) Beam Name " 4C 4F" # LO " 00 06" # length " 42 65 61 6d 20 32" # value 'Beam 2' " ff fe E0 dd" # SQ delimiter " 00 00 00 00" # zero length ) infile = StringIO(hex2str(bytes)) de_gen = data_element_generator(infile, is_implicit_VR=False, is_little_endian=False) seq = de_gen.next() # Note seq itself is not a raw data element. # The parser does parse undefined length SQ # The sequence is parsed, but only into raw data elements. # They will be converted when asked for. Check some: got = seq[0].BeamNumber self.assert_(got == 1, "Expected Beam Number 1, got %r" % got) got = seq[1].BeamName self.assert_(got == 'Beam 2', "Expected Beam Name 'Beam 2', got %s" % got) if __name__ == "__main__": # import dicom # dicom.debug() unittest.main() pydicom-0.9.7/dicom/test/test_sequence.py000644 000765 000024 00000004247 11726534363 020754 0ustar00darcystaff000000 000000 # test_sequence.py """unittest cases for Sequence class""" # Copyright (c) 2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.dataset import Dataset from dicom.sequence import Sequence class SequenceTests(unittest.TestCase): def testDefaultInitialization(self): """Sequence: Ensure a valid Sequence is created""" empty = Sequence() self.assert_(len(empty) == 0, "Non-empty Sequence created") def testValidInitialization(self): """Sequence: Ensure valid creation of Sequences using Dataset inputs""" inputs = { 'PatientPosition':'HFS', 'PatientSetupNumber':'1', 'SetupTechniqueDescription':''} patientSetups = Dataset() patientSetups.update(inputs) # Construct the sequence seq = Sequence((patientSetups,)) self.assert_(isinstance(seq[0], Dataset), "Dataset modified during Sequence creation") def testInvalidInitialization(self): """Sequence: Raise error if inputs are not iterables or Datasets""" # Error on construction with single Dataset self.assertRaises(TypeError, Sequence, Dataset()) # Test for non-iterable self.assertRaises(TypeError, Sequence, 1) # Test for invalid iterable contents self.assertRaises(TypeError, Sequence, [1,2]) def testInvalidAssignment(self): """Sequence: validate exception for invalid assignment""" seq = Sequence([Dataset(),]) # Attempt to assign an integer to the first element self.assertRaises(TypeError, seq.__setitem__, 0, 1) def testValidAssignment(self): """Sequence: ensure ability to assign a Dataset to a Sequence item""" ds = Dataset() ds.add_new((1,1), 'IS', 1) # Create a single element Sequence first seq = Sequence([Dataset(),]) seq[0] = ds self.assertEqual(seq[0], ds, "Dataset modified during assignment") if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_tag.py000644 000765 000024 00000006652 11726534363 017721 0ustar00darcystaff000000 000000 """Test suite for Tag.py""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.tag import Tag, TupleTag class Values(unittest.TestCase): def testGoodInts(self): """Tags can be constructed with 4-byte integers..............""" tag = Tag(0x300a00b0) tag = Tag(0xFFFFFFEE) def testGoodTuple(self): """Tags can be constructed with two-tuple of 2-byte integers.""" tag = TupleTag((0xFFFF, 0xFFee)) tag = TupleTag((0x300a, 0x00b0)) self.assertEqual(tag.group, 0x300a, "Expected tag.group 0x300a, got %r" % tag.group) def testAnyUnpack(self): """Tags can be constructed from list.........................""" tag = Tag([2,0]) def testBadTuple(self): """Tags: if a tuple, must be a 2-tuple.......................""" self.assertRaises(ValueError, Tag, (1,2,3,4)) def testNonNumber(self): """Tags cannot be instantiated from a non-hex string.........""" self.assertRaises(ValueError, Tag, "hello") def testHexString(self): """Tags can be instantiated from hex strings.................""" tag = Tag('0010', '0002') self.assertEqual(tag.group, 16) self.assertEqual(tag.elem, 2) def testStr(self): """Tags have (gggg, eeee) string rep.........................""" self.assert_(str(Tag(0x300a00b0))=="(300a, 00b0)") def testGroup(self): """Tags' group and elem portions extracted properly..........""" tag = Tag(0x300a00b0) self.assert_(tag.group == 0x300a) self.assert_(tag.elem == 0xb0) self.assert_(tag.element == 0xb0) def testZeroElem(self): """Tags with arg2=0 ok (was issue 47)........................""" tag = Tag(2, 0) self.assert_(tag.group == 2 and tag.elem==0) def testBadInts(self): """Tags constructed with > 8 bytes gives OverflowError.......""" self.assertRaises(OverflowError, Tag, 0x123456789) class Comparisons(unittest.TestCase): def setUp(self): self.int1 = 0x300a00b0 self.tup1 = (0x300a, 0xb0) self.tup3 = (0xFFFE, 0xFFFC) self.t1 = Tag(self.int1) self.t2 = Tag(self.tup1) self.t3 = Tag(self.tup3) def testCmpEq(self): """Tags compare correctly (==)...............................""" self.assert_(self.t1==self.int1, "tag t1 was not equal to int1") self.assert_(self.t1==self.t2, "tag t1 did not equal other tag") self.assert_(self.t1==self.tup1, "tag t1 did not equal its tuple") def testCmpNotEq(self): self.assert_(self.t1 != self.t3, "Not equal comparison failed") def testCmpLT(self): """Tags compare correctly (<, >).............................""" self.assert_(self.t1 < self.int1+1, "tag < failed") self.assert_(self.int1+1 > self.t1, "int > tag failed") self.assert_(self.t3 > self.t1, "'negative' int tag > other tag failed") def testHash(self): """Tags hash the same as an int..............................""" self.assert_(hash(self.t1)==hash(self.int1)) self.assert_(hash(self.t2)==hash(self.int1)) if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_UID.py000644 000765 000024 00000004170 11726534363 017560 0ustar00darcystaff000000 000000 # test_UID.py """Test suite for UID.py""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.UID import UID class UIDtests(unittest.TestCase): def testKnownUID(self): """UID: Known UID properties accessed.....................""" uid = UID('1.2.840.10008.1.2') # Implicit VR Little Endian expected = 'Implicit VR Little Endian' got = uid.name self.assertEqual(got, expected, "UID: expected '%s', got '%s' for UID name" % (expected, got)) expected = 'Transfer Syntax' got = uid.type self.assertEqual(got, expected, "UID: expected '%s', got '%s' for UID type" % (expected, got)) expected = 'Default Transfer Syntax for DICOM' got = uid.info self.assertEqual(got, expected, "UID: expected '%s', got '%s' for UID info" % (expected, got)) expected = False got = uid.is_retired self.assertEqual(got, expected, "UID: expected '%s', got '%s' for UID is_retired" % (expected, got)) def testComparison(self): """UID: can compare by number or by name..................""" uid = UID('1.2.840.10008.1.2') self.assertEqual(uid, 'Implicit VR Little Endian', "UID equality failed on name") self.assertEqual(uid, '1.2.840.10008.1.2', "UID equality failed on number string") def testCompareNumber(self): """UID: comparing against a number give False.............""" # From issue 96 uid = UID('1.2.3') self.assertNotEqual(uid, 3, "Comparison against a number returned True") def testCompareNone(self): """UID: comparing against None give False.................""" # From issue 96 uid = UID('1.2.3') self.assertNotEqual(uid, None, "Comparison against a number returned True") def testTransferSyntaxes(self): pass if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/test_valuerep.py000644 000765 000024 00000006635 11726534363 020772 0ustar00darcystaff000000 000000 # test_valuerep.py """Test suite for valuerep.py""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import unittest from dicom.valuerep import PersonName, PersonNameUnicode default_encoding = 'iso8859' class PersonNametests(unittest.TestCase): def testLastFirst(self): """PN: Simple Family-name^Given-name works...............................""" pn = PersonName("Family^Given") expected = "Family" got = pn.family_name self.assertEqual(got, expected, "PN: expected '%s', got '%s' for family name" % (expected, got)) expected = 'Given' got = pn.given_name self.assertEqual(got, expected, "PN: expected '%s', got '%s' for given name" % (expected, got)) expected = '' got = pn.name_suffix self.assertEqual(got, expected, "PN: expected '%s', got '%s' for name_suffix" % (expected, got)) expected = '' got = pn.phonetic self.assertEqual(got, expected, "PN: expected '%s', got '%s' for phonetic component" % (expected, got)) def testThreeComponent(self): """PN: 3component (single-byte, ideographic, phonetic characters) works..""" # Example name from PS3.5-2008 section I.2 p. 108 pn = PersonName("""Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=\033$)C\310\253^\033$)C\261\346\265\277""") expected = ("Hong", "Gildong") got = (pn.family_name, pn.given_name) self.assertEqual(got, expected, "PN: Expected single_byte name '%s', got '%s'" % (expected, got)) def testFormatting(self): """PN: Formatting works..................................................""" pn = PersonName("Family^Given") expected = "Family, Given" got = pn.family_comma_given() self.assertEqual(got, expected, "PN: expected '%s', got '%s' for formatted Family, Given" % (expected, got)) def testUnicodeKr(self): """PN: 3component in unicode works (Korean)..............................""" # Example name from PS3.5-2008 section I.2 p. 101 from sys import version_info if version_info >= (2,4): pn = PersonNameUnicode( """Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=\033$)C\310\253^\033$)C\261\346\265\277""", [default_encoding,'euc_kr']) expected = ("Hong", "Gildong") got = (pn.family_name, pn.given_name) self.assertEqual(got, expected, "PN: Expected single_byte name '%s', got '%s'" % (expected, got)) def testUnicodeJp(self): """PN: 3component in unicode works (Japanese)............................""" # Example name from PS3.5-2008 section H p. 98 from sys import version_info if version_info >= (2,4): pn = PersonNameUnicode( """Yamada^Tarou=\033$B;3ED\033(B^\033$BB@O:\033(B=\033$B$d$^$@\033(B^\033$B$?$m$&\033(B""", [default_encoding,'iso2022_jp']) expected = ("Yamada", "Tarou") got = (pn.family_name, pn.given_name) self.assertEqual(got, expected, "PN: Expected single_byte name '%s', got '%s'" % (expected, got)) if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/version_dep.py000644 000765 000024 00000001445 11726534363 020417 0ustar00darcystaff000000 000000 # version_dep.py """Holds test code that is dependent on certain python versions""" # Copyright (c) 2009 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com from __future__ import with_statement # so will compile under python 2.5 without error import warnings def capture_warnings(function, *func_args, **func_kwargs): """Capture and function result and warnings. For python > 2.5 """ with warnings.catch_warnings(record=True) as w: warnings.simplefilter("always") result = function(*func_args, **func_kwargs) all_warnings = w return result, [str(warning.message) for warning in all_warnings] pydicom-0.9.7/dicom/test/warncheck.py000644 000765 000024 00000003535 11726534363 020051 0ustar00darcystaff000000 000000 # warncheck.py # import warnings import unittest from sys import version_info def assertWarns(self, warn_msg, function, *func_args, **func_kwargs): """ Check that the function generates the expected warning with the arguments given. warn_msg -- part of the warning string, any thrown warnings should contain this function -- the function to call (expected to issue a warning) func_args -- positional arguments to the function func_kwargs -- keyword arguments to the function Return the function return value. """ if version_info < (2, 6): all_warnings = [] def new_warn_explicit(*warn_args): all_warnings.append(warn_args[0]) # save only the message here saved_warn_explicit = warnings.warn_explicit try: warnings.warn_explicit = new_warn_explicit result = function(*func_args, **func_kwargs) finally: warnings.warn_explicit = saved_warn_explicit else: # python > 2.5 # Need to import this separately since syntax (using "with" statement) gives errors in python < 2.6 from dicom.test.version_dep import capture_warnings result, all_warnings = capture_warnings(function, *func_args, **func_kwargs) self.assert_(len(all_warnings)==1, "Expected one warning; got %d" % len(all_warnings)) self.assert_(warn_msg in all_warnings[0], "Expected warning message '%s...'; got '%s'" % (warn_msg, all_warnings[0])) return result def test_warning(the_warning): if the_warning: warnings.warn(the_warning) class WarnTests(unittest.TestCase): def testWarn(self): """Test that assertWarns works as expected""" assertWarns(self, "Look", test_warning, "Look out") if __name__ == "__main__": unittest.main() pydicom-0.9.7/dicom/test/performance/__init__.py000644 000765 000024 00000000064 11726534363 022136 0ustar00darcystaff000000 000000 # __init__.py # Mark the folder as a python packagepydicom-0.9.7/dicom/test/performance/time_test.py000644 000765 000024 00000007753 11726534363 022410 0ustar00darcystaff000000 000000 # time_test.py """Try reading large sets of files, profiling how much time it takes""" # Copyright (c) 2008 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import os.path import os import sys on_windows = sys.platform.startswith("win") # EDIT THIS SECTION -------------------------- # to point to local temp directory, and to a set of >400 DICOM files of same size to work on # I used images freely available from http://pcir.org if on_windows: tempfile = "c:/temp/pydicom_stats" location_base = r"z:/testdicom/" else: tempfile = "/tmp/pydicom_stats" location_base = r"/Users/darcy/testdicom/" # location_base = r"/Volumes/Disk 1/testdicom/" # Network disk location locations = ["77654033_19950903/77654033/19950903/CT2/", "98890234_20010101/98890234/20010101/CT5/", "98890234_20010101/98890234/20010101/CT6/", "98890234_20010101/98890234/20010101/CT7/", ] locations = [os.path.join(location_base, location) for location in locations] # ------------------------------------------------------- import glob import dicom from dicom.filereader import read_partial, _at_pixel_data from cStringIO import StringIO from time import time import cProfile # python >=2.5 import pstats import sys import random rp = read_partial filenames = [] for location in locations: loc_list = glob.glob(os.path.join(location, "*")) filenames.extend((x for x in loc_list if not x.startswith("."))) assert len(filenames) >= 400, "Need at least 400 files" # unless change slices below print random.shuffle(filenames) # to make sure no bias for any particular file print "Sampling from %d files" % len(filenames), ". Each test gets 100 distinct files" print "Test order is randomized too..." # Give each test it's own set of files, to avoid reading something in cache from previous test filenames1 = filenames[:100] # keep the time to a reasonable amount (~2-25 sec) filenames2 = filenames[100:200] filenames3 = filenames[200:300] filenames4 = filenames[300:400] def test_full_read(): rf = dicom.read_file datasets = [rf(fn) for fn in filenames1] return datasets def test_partial(): rp = read_partial ds = [rp(open(fn, 'rb'), stop_when=_at_pixel_data) for fn in filenames2] def test_mem_read_full(): rf = dicom.read_file str_io = StringIO memory_files = (str_io(open(fn, 'rb').read()) for fn in filenames3) ds = [rf(memory_file) for memory_file in memory_files] def test_mem_read_small(): rf = dicom.read_file str_io = StringIO # avoid global lookup, make local instead memory_files = (str_io(open(fn, 'rb').read(4000)) for fn in filenames4) ds = [rf(memory_file) for memory_file in memory_files] def test_python_read_files(): all_files = [open(fn, 'rb').read() for fn in filenames4] if __name__ == "__main__": runs = ['datasets=test_full_read()', # 'test_partial()', # 'test_mem_read_full()', # 'test_mem_read_small()', 'test_python_read_files()', ] random.shuffle(runs) for testrun in runs: cProfile.run(testrun, tempfile) p = pstats.Stats(tempfile) print "---------------" print testrun print "---------------" p.strip_dirs().sort_stats('time').print_stats(5) print "Confirming file read worked -- check for data elements near end" try: image_sizes = [len(ds.PixelData) for ds in datasets] except Exception, e: print "Failed to access dataset data for all files\nError:" + str(e) else: print "Reads checked ok." # Clear disk cache for next run? import sys if not on_windows: prompt= "Run purge command (linux/Mac OS X) to clear disk cache?...(N):" answer = raw_input(prompt) if answer.lower() == "y": print "Running 'purge'. Please wait..." os.system("purge")pydicom-0.9.7/dicom/examples/__init__.py000644 000765 000024 00000000064 11726534363 020474 0ustar00darcystaff000000 000000 # __init__.py # Mark the folder as a python packagepydicom-0.9.7/dicom/examples/anonymize.py000644 000765 000024 00000007566 11726534363 020764 0ustar00darcystaff000000 000000 # anonymize.py """Read a dicom file (or directory of files), partially "anonymize" it (them), by replacing Person names, patient id, optionally remove curves and private tags, and write result to a new file (directory) This is an example only; use only as a starting point. """ # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # Use at your own risk!! # Many more items need to be addressed for proper de-identifying DICOM data. # In particular, note that pixel data could have confidential data "burned in" # Annex E of PS3.15-2011 DICOM standard document details what must be done to # fully de-identify DICOM data usage = """ Usage: python anonymize.py dicomfile.dcm outputfile.dcm OR python anonymize.py originals_directory anonymized_directory Note: Use at your own risk. Does not fully de-identify the DICOM data as per the DICOM standard, e.g in Annex E of PS3.15-2011. """ import os, os.path import dicom def anonymize(filename, output_filename, new_person_name="anonymous", new_patient_id="id", remove_curves=True, remove_private_tags=True): """Replace data element values to partly anonymize a DICOM file. Note: completely anonymizing a DICOM file is very complicated; there are many things this example code does not address. USE AT YOUR OWN RISK. """ # Define call-back functions for the dataset.walk() function def PN_callback(ds, data_element): """Called from the dataset "walk" recursive function for all data elements.""" if data_element.VR == "PN": data_element.value = new_person_name def curves_callback(ds, data_element): """Called from the dataset "walk" recursive function for all data elements.""" if data_element.tag.group & 0xFF00 == 0x5000: del ds[data_element.tag] # Load the current dicom file to 'anonymize' dataset = dicom.read_file(filename) # Remove patient name and any other person names dataset.walk(PN_callback) # Change ID dataset.PatientID = new_patient_id # Remove data elements (should only do so if DICOM type 3 optional) # Use general loop so easy to add more later # Could also have done: del ds.OtherPatientIDs, etc. for name in ['OtherPatientIDs', 'OtherPatientIDsSequence']: if name in dataset: delattr(dataset, name) # Same as above but for blanking data elements that are type 2. for name in ['PatientBirthDate']: if name in dataset: dataset.data_element(name).value = '' # Remove private tags if function argument says to do so. Same for curves if remove_private_tags: dataset.remove_private_tags() if remove_curves: dataset.walk(curves_callback) # write the 'anonymized' DICOM out under the new filename dataset.save_as(output_filename) # Can run as a script: if __name__ == "__main__": import sys if len(sys.argv) != 3: print usage sys.exit() arg1, arg2 = sys.argv[1:] if os.path.isdir(arg1): in_dir = arg1 out_dir = arg2 if os.path.exists(out_dir): if not os.path.isdir(out_dir): raise IOError, "Input is directory; output name exists but is not a directory" else: # out_dir does not exist; create it. os.makedirs(out_dir) filenames = os.listdir(in_dir) for filename in filenames: if not os.path.isdir(os.path.join(in_dir, filename)): print filename + "...", anonymize(os.path.join(in_dir, filename), os.path.join(out_dir, filename)) print "done\r", else: # first arg not a directory, assume two files given in_filename = arg1 out_filename = arg2 anonymize(in_filename, out_filename) print pydicom-0.9.7/dicom/examples/DicomDiff.py000644 000765 000024 00000002305 11726534363 020561 0ustar00darcystaff000000 000000 # DicomDiff.py """Show the difference between two dicom files. """ # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com usage = """ Usage: python DicomDiff.py file1 file2 Results printed in python difflib form - indicated by start of each line: ' ' blank means lines the same '-' means in file1 but "removed" in file2 '+' means not in file1, but "added" in file2 ('?' lines from difflib removed - no use here) """ import sys import dicom import difflib # only used as a script if len(sys.argv) != 3: print usage sys.exit() datasets = dicom.read_file(sys.argv[1]), \ dicom.read_file(sys.argv[2]) # diflib compare functions require a list of lines, each terminated with newline character # massage the string representation of each dicom dataset into this form: rep = [] for dataset in datasets: lines = str(dataset).split("\n") lines = [line + "\n" for line in lines] # add the newline to end rep.append(lines) diff = difflib.Differ() for line in diff.compare(rep[0], rep[1]): if line[0] != "?": print line pydicom-0.9.7/dicom/examples/DicomInfo.py000644 000765 000024 00000003236 11726534363 020610 0ustar00darcystaff000000 000000 # DicomInfo.py """ Read a DICOM file and print some or all of its values. Usage: python DicomInfo.py imagefile [-v] -v (optional): Verbose mode, prints all DICOM data elements Without the -v option, a few of the most common dicom file data elements are printed: some info about the patient and about the image. """ # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, released under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import sys import dicom # check command line arguments make sense if not 1 < len(sys.argv) < 4: print __doc__ sys.exit() # read the file filename = sys.argv[1] dataset = dicom.read_file(filename) # Verbose mode: if len(sys.argv) == 3: if sys.argv[2]=="-v": #user asked for all info print dataset else: # unknown command argument print __doc__ sys.exit() # Normal mode: print print "Filename.........:", filename print "Storage type.....:", dataset.SOPClassUID print pat_name = dataset.PatientName display_name = pat_name.family_name + ", " + pat_name.given_name print "Patient's name...:", display_name print "Patient id.......:", dataset.PatientID print "Modality.........:", dataset.Modality print "Study Date.......:", dataset.StudyDate if 'PixelData' in dataset: print "Image size.......: %i x %i, %i bytes" % (dataset.Rows, dataset.Columns, len(dataset.PixelData)) if 'PixelSpacing' in dataset: print "Pixel spacing....:", dataset.PixelSpacing # use .get() if not sure the item exists, and want a default value if missing print "Slice location...:", dataset.get('SliceLocation', "(missing)") pydicom-0.9.7/dicom/examples/dicomtree.py000644 000765 000024 00000005043 11726534363 020712 0ustar00darcystaff000000 000000 # dicomtree.py """Show a dicom file using a hierarchical tree in a graphical window""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com usage = "Usage: python dicomtree.py dicom_filename" from dicom.valuerep import PersonNameUnicode import Tix def RunTree(w, filename): top = Tix.Frame(w, relief=Tix.RAISED, bd=1) tree = Tix.Tree(top, options="hlist.columns 2") tree.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10, side=Tix.LEFT) # print tree.hlist.keys() # use to see the available configure() options tree.hlist.configure(bg='white', font='Courier 10', indent=30) tree.hlist.configure(selectbackground='light yellow', gap=150) box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL) # box.add('ok', text='Ok', underline=0, command=w.destroy, width=6) box.add('exit', text='Exit', underline=0, command=w.destroy, width=6) box.pack(side=Tix.BOTTOM, fill=Tix.X) top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1) show_file(filename, tree) def show_file(filename, tree): tree.hlist.add("root", text=filename) ds = dicom.read_file(sys.argv[1]) ds.decode() # change strings to unicode recurse_tree(tree, ds, "root", False) tree.autosetmode() def recurse_tree(tree, dataset, parent, hide=False): # order the dicom tags for data_element in dataset: node_id = parent + "." + hex(id(data_element)) if isinstance(data_element.value, unicode): tree.hlist.add(node_id, text=unicode(data_element)) else: tree.hlist.add(node_id, text=str(data_element)) if hide: tree.hlist.hide_entry(node_id) if data_element.VR == "SQ": # a sequence for i, dataset in enumerate(data_element.value): item_id = node_id + "." + str(i+1) sq_item_description = data_element.name.replace(" Sequence", "") # XXX not i18n item_text = "%s %d" % (sq_item_description, i+1) tree.hlist.add(item_id, text=item_text) tree.hlist.hide_entry(item_id) recurse_tree(tree, dataset, item_id, hide=True) if __name__ == '__main__': import sys import dicom if len(sys.argv) != 2: print "Please supply a dicom file name:\n" print usage sys.exit(-1) root = Tix.Tk() root.geometry("%dx%d%+d%+d" % (800, 600, 0, 0)) RunTree(root, sys.argv[1]) root.mainloop() pydicom-0.9.7/dicom/examples/ListBeams.py000644 000765 000024 00000002030 11726534363 020613 0ustar00darcystaff000000 000000 # ListBeams.py """Given an RTPLAN DICOM file, list basic info for the beams in it """ # Copyright (c) 2008-2011 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import dicom usage = """python ListBeams.py rtplan.dcm""" def ListBeams(plan_dataset): """Return a string summarizing the RTPLAN beam information in the dataset""" lines = ["%13s %8s %8s %8s" % ("Beam name", "Number", "Gantry", "SSD (cm)")] for beam in plan_dataset.BeamSequence: cp0 = beam.ControlPointSequence[0] SSD = float(cp0.SourcetoSurfaceDistance / 10) lines.append("%13s %8s %8.1f %8.1f" % (beam.BeamName, str(beam.BeamNumber), cp0.GantryAngle, SSD)) return "\n".join(lines) if __name__ == "__main__": import sys if len(sys.argv) != 2: print usage sys.exit(-1) rtplan = dicom.read_file(sys.argv[1]) print ListBeams(rtplan)pydicom-0.9.7/dicom/examples/myprint.py000644 000765 000024 00000002671 11726534363 020445 0ustar00darcystaff000000 000000 # myprint.py """Example of printing a dataset in your own format""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com def myprint(dataset, indent=0): """Go through all item in the dataset and print. Modelled after Dataset._PrettyStr() """ dont_print = ['Pixel Data', 'File Meta Information Version'] indent_string = " " * indent next_indent_string = " " *(indent+1) for data_element in dataset: if data_element.VR == "SQ": # a sequence print indent_string, data_element.name for sequence_item in data_element.value: myprint(sequence_item, indent+1) print next_indent_string + "---------" else: if data_element.name in dont_print: print """""" else: repr_value = repr(data_element.value) if len(repr_value) > 50: repr_value = repr_value[:50] + "..." print indent_string, data_element.name, "=", repr_value if __name__ == "__main__": import dicom import sys usage = """Usage: myprint filename""" if len(sys.argv) != 2: print usage sys.exit() ds = dicom.read_file(sys.argv[1]) myprint(ds)pydicom-0.9.7/dicom/examples/show_charset_name.py000644 000765 000024 00000002512 11726534363 022426 0ustar00darcystaff000000 000000 # show_charset_name.py """Very simple app to display unicode person names""" # Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import Tkinter from dicom.valuerep import PersonName, PersonNameUnicode default_encoding = 'iso8859' root = Tkinter.Tk() # root.geometry("%dx%d%+d%+d" % (800, 600, 0, 0)) person_names = [ PersonNameUnicode( """Yamada^Tarou=\033$B;3ED\033(B^\033$BB@O:\033(B=\033$B$d$^$@\033(B^\033$B$?$m$&\033(B""", [default_encoding, 'iso2022_jp']), # DICOM standard 2008-PS3.5 H.3 p 98 PersonNameUnicode( """Wang^XiaoDong=\xcd\xf5\x5e\xd0\xa1\xb6\xab=""", [default_encoding, 'GB18030']), # DICOM standard 2008-PS3.5 J.3 p 105 PersonNameUnicode( """Wang^XiaoDong=\xe7\x8e\x8b\x5e\xe5\xb0\x8f\xe6\x9d\xb1=""", [default_encoding, 'UTF-8']), # DICOM standard 2008-PS3.5 J.1 p 104 PersonNameUnicode( """Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=\033$)C\310\253^\033$)C\261\346\265\277""", [default_encoding, 'euc_kr']), # DICOM standard 2008-PS3.5 I.2 p 101 ] for person_name in person_names: label = Tkinter.Label(text=person_name) label.pack() root.mainloop()pydicom-0.9.7/dicom/examples/write_new.py000644 000765 000024 00000005112 11726534363 020737 0ustar00darcystaff000000 000000 # write_new.py """Simple example of writing a DICOM file from scratch using pydicom. This example does not produce a DICOM standards compliant file as written, you will have to change UIDs to valid values and add all required DICOM data elements """ # Copyright (c) 2010-2012 Darcy Mason # This file is part of pydicom, released under a modified MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com import sys import os.path import dicom from dicom.dataset import Dataset, FileDataset import dicom.UID if __name__ == "__main__": print "---------------------------- " print "write_new.py example program" print "----------------------------" print "Demonstration of writing a DICOM file using pydicom" print "NOTE: this is only a demo. Writing a DICOM standards compliant file" print "would require official UIDs, and checking the DICOM standard to ensure" print "that all required data elements were present." print if sys.platform.lower().startswith("win"): filename = r"c:\temp\test.dcm" filename2 = r"c:\temp\test-explBig.dcm" else: homedir = os.path.expanduser("~") filename = os.path.join(homedir, "test.dcm") filename2 = os.path.join(homedir, "test-explBig.dcm") print "Setting file meta information..." # Populate required values for file meta information file_meta = Dataset() file_meta.MediaStorageSOPClassUID = '1.2.840.10008.5.1.4.1.1.2' # CT Image Storage file_meta.MediaStorageSOPInstanceUID = "1.2.3" # !! Need valid UID here for real work file_meta.ImplementationClassUID = "1.2.3.4" # !!! Need valid UIDs here print "Setting dataset values..." # Create the FileDataset instance (initially no data elements, but file_meta supplied) ds = FileDataset(filename, {}, file_meta=file_meta, preamble="\0"*128) # Add the data elements -- not trying to set all required here. Check DICOM standard ds.PatientName = "Test^Firstname" ds.PatientID = "123456" # Set the transfer syntax ds.is_little_endian = True ds.is_implicit_VR = True print "Writing test file", filename ds.save_as(filename) print "File saved." # Write as a different transfer syntax ds.file_meta.TransferSyntaxUID = dicom.UID.ExplicitVRBigEndian #XXX shouldn't need this but pydicom 0.9.5 bug not recognizing transfer syntax ds.is_little_endian = False ds.is_implicit_VR = False print "Writing test file as Big Endian Explicit VR", filename2 ds.save_as(filename2)pydicom-0.9.7/dicom/doc/index.html000644 000765 000024 00000000456 11726534363 017314 0ustar00darcystaff000000 000000 Pydicom - Pure Python package for DICOM files

Pydicom - Pure Python package for DICOM files

Documentation for pydicom is available at the pydicom googlecode website

pydicom-0.9.7/dicom/contrib/__init__.py000644 000765 000024 00000000064 11726534363 020316 0ustar00darcystaff000000 000000 # __init__.py # Mark the folder as a python packagepydicom-0.9.7/dicom/contrib/dicom_dao.py000644 000765 000024 00000035134 11726534363 020503 0ustar00darcystaff000000 000000 #!/usr/bin/python """ dicom_dao Data Access Objects for persisting PyDicom DataSet objects. Currently we support couchdb through the DicomCouch class. Limitations: - Private tags are discarded TODO: - Unit tests with multiple objects open at a time - Unit tests with rtstruct objects - Support for mongodb (mongo has more direct support for binary data) Dependencies: - PyDicom - python-couchdb - simplejson Tested with: - PyDicom 0.9.4-1 - python-couchdb 0.6 - couchdb 0.10.1 - simplejson 2.0.9 """ # # Copyright (c) 2010 Michael Wallace # This file is released under the pydicom license. # See the file license.txt included with the pydicom distribution, also # available at http://pydicom.googlecode.com # import hashlib import os import string import simplejson import couchdb import dicom def uid2str(uid): """ Convert PyDicom uid to a string """ return repr(uid).strip("'") # When reading files a VR of 'US or SS' is left as binary, because we # don't know how to interpret the values different numbers. We therefore # treat it as binary and will continue to until either pydicom works it out # for us, or we figure out a test. BINARY_VR_VALUES = ['OW', 'OB', 'OW/OB', 'US or SS'] class DicomCouch(dict): """ A Data Access Object for persisting PyDicom objects into CouchDB We follow the same pattern as the python-couchdb library for getting and setting documents, for example storing dicom.dataset.Dataset object dcm: db = DicomCouch('http://localhost:5984/', 'dbname') db[dcm.SeriesInstanceUID] = dcm The only constraints on the key are that it must be json-serializable and unique within the database instance. In theory it should be possible to use any DICOM UID. Unfortunately I have written this code under the assumption that SeriesInstanceUID will always be used. This will be fixed. Retrieving object with key 'foo': dcm = db['foo'] Deleting object with key 'foo': dcm = db['foo'] db.delete(dcm) TODO: - It is possible to have couchdb assign a uid when adding objects. This should be supported. """ def __init__(self, server, db): """ Create connection to couchdb server/db """ super(DicomCouch, self).__init__() self._meta = {} server = couchdb.Server(server) try: self._db = server[db] except couchdb.client.ResourceNotFound: self._db = server.create(db) def __getitem__(self, key): """ Retrieve DICOM object with specified SeriesInstanceUID """ doc = self._db[key] dcm = json2pydicom(doc) if dcm.SeriesInstanceUID not in self._meta: self._meta[dcm.SeriesInstanceUID] = {} self._meta[dcm.SeriesInstanceUID]['hashes'] = {} if '_attachments' in doc: self.__get_attachments(dcm, doc) _set_meta_info_dcm(dcm) # Keep a copy of the couch doc for use in DELETE operations self._meta[dcm.SeriesInstanceUID]['doc'] = doc return dcm def __setitem__(self, key, dcm): """ Write the supplied DICOM object to the database """ try: dcm.PixelData = dcm.pixel_array.tostring() except AttributeError: pass # Silently ignore errors due to pixel_array not existing except NotImplementedError: pass # Silently ignore attempts to modify compressed pixel data except TypeError: pass # Silently ignore errors due to PixelData not existing jsn, binary_elements, file_meta_binary_elements = pydicom2json(dcm) _strip_elements(jsn, binary_elements) _strip_elements(jsn['file_meta'], file_meta_binary_elements) if dcm.SeriesInstanceUID in self._meta: self.__set_meta_info_jsn(jsn, dcm) try: # Actually write to the db self._db[key] = jsn except TypeError, type_error: if str(type_error) == 'string indices must be integers, not str': pass if dcm.SeriesInstanceUID not in self._meta: self._meta[dcm.SeriesInstanceUID] = {} self._meta[dcm.SeriesInstanceUID]['hashes'] = {} self.__put_attachments(dcm, binary_elements, jsn) # Get a local copy of the document # We get this from couch because we get the _id, _rev and _attachments # keys which will ensure we don't overwrite the attachments we just # uploaded. # I don't really like the extra HTTP GET and I think we can generate # what we need without doing it. Don't have time to work out how yet. self._meta[dcm.SeriesInstanceUID]['doc'] = \ self._db[dcm.SeriesInstanceUID] def __str__(self): """ Return the string representation of the couchdb client """ return str(self._db) def __repr__(self): """ Return the canonical string representation of the couchdb client """ return repr(self._db) def __get_attachments(self, dcm, doc): """ Set binary tags by retrieving attachments from couchdb. Values are hashed so they are only updated if they have changed. """ for id in doc['_attachments'].keys(): tagstack = id.split(':') value = self._db.get_attachment(doc['_id'], id) _add_element(dcm, tagstack, value) self._meta[dcm.SeriesInstanceUID]['hashes'][id] = hashlib.md5(value) def __put_attachments(self, dcm, binary_elements, jsn): """ Upload all new and modified attachments """ elements_to_update = \ [(tagstack, item) for tagstack, item in binary_elements \ if self.__attachment_update_needed(\ dcm, _tagstack2id(tagstack + [item.tag]), item)] for tagstack, element in elements_to_update: id = _tagstack2id(tagstack + [element.tag]) self._db.put_attachment(jsn, element.value, id) self._meta[dcm.SeriesInstanceUID]['hashes'][id] = \ hashlib.md5(element.value) def delete(self, dcm): """ Delete from database and remove meta info from the DAO """ self._db.delete(self._meta[dcm.SeriesInstanceUID]['doc']) self._meta.pop(dcm.SeriesInstanceUID) def __set_meta_info_jsn(self, jsn, dcm): """ Set the couch-specific meta data for supplied dict """ jsn['_rev'] = self._meta[dcm.SeriesInstanceUID]['doc']['_rev'] if '_attachments' in self._meta[dcm.SeriesInstanceUID]['doc']: jsn['_attachments'] = \ self._meta[dcm.SeriesInstanceUID]['doc']['_attachments'] def __attachment_update_needed(self, dcm, id, binary_element): """ Compare hashes for binary element and return true if different """ try: hashes = self._meta[dcm.SeriesInstanceUID]['hashes'] except KeyError: return True # If no hashes dict then attachments do not exist if id not in hashes or hashes[id].digest() != \ hashlib.md5(binary_element.value).digest(): return True else: return False def _add_element(dcm, tagstack, value): """ Add element with tag, vr and value to dcm at location tagstack """ current_node = dcm for item in tagstack[:-1]: try: address = int(item) except ValueError: address = dicom.tag.Tag(__str2tag(item)) current_node = current_node[address] tag = __str2tag(tagstack[-1]) vr = dicom.datadict.dictionaryVR(tag) current_node[tag] = dicom.dataelem.DataElement(tag, vr, value) def _tagstack2id(tagstack): """ Convert a list of tags to a unique (within document) attachment id """ return string.join([str(tag) for tag in tagstack], ':') def _strip_elements(jsn, elements): """ Remove supplied elements from the dict object We use this with a list of binary elements so that we don't store empty tags in couchdb when we are already storing the binary data as attachments. """ for tagstack, element in elements: if len(tagstack) == 0: jsn.pop(element.tag) else: current_node = jsn for tag in tagstack: current_node = current_node[tag] current_node.pop(element.tag) def _set_meta_info_dcm(dcm): """ Set the file metadata DataSet attributes This is done by PyDicom when we dicom.read_file(foo) but we need to do it ourselves when creating a DataSet from scratch, otherwise we cannot use foo.pixel_array or dicom.write_file(foo). This code is lifted from PyDicom. """ TransferSyntax = dcm.file_meta.TransferSyntaxUID if TransferSyntax == dicom.UID.ExplicitVRLittleEndian: dcm.is_explicit_vr = True dcm.is_little_endian = True # This line not in PyDicom elif TransferSyntax == dicom.UID.ImplicitVRLittleEndian: dcm.is_implicit_vr = True dcm.is_little_endian = True elif TransferSyntax == dicom.UID.ExplicitVRBigEndian: dcm.is_explicit_vr = True dcm.is_big_endian = True dcm.is_little_endian = False elif TransferSyntax == dicom.UID.DeflatedExplicitVRLittleEndian: dcm.is_explicit_vr = True # Deleted lines above as it relates dcm.is_little_endian = True # to reading compressed file data. else: # Any other syntax should be Explicit VR Little Endian, # e.g. all Encapsulated (JPEG etc) are ExplVR-LE by # Standard PS 3.5-2008 A.4 (p63) dcm.is_explicit_vr = True dcm.is_little_endian = True def pydicom2json(dcm): """ Convert the supplied PyDicom object into a json-serializable dict Binary elements cannot be represented in json so we return these as as separate list of the tuple (tagstack, element), where: - element = dicom.dataelem.DataElement - tagstack = list of tags/sequence IDs that address the element The tagstack variable means we know the absolute address of each binary element. We then use this as the attachment id in couchdb - when we retrieve the attachment we can then insert it at the appropriate point in the tree. """ dcm.remove_private_tags() # No support for now dcm.decode() # Convert to unicode binary_elements = [] tagstack = [] jsn = dict((key, __jsonify(dcm[key], binary_elements, tagstack)) for key in dcm.keys()) file_meta_binary_elements = [] jsn['file_meta'] = dict((key, __jsonify(dcm.file_meta[key], file_meta_binary_elements, tagstack)) for key in dcm.file_meta.keys()) return jsn, binary_elements, file_meta_binary_elements def __jsonify(element, binary_elements, tagstack): """ Convert key, value to json-serializable types Recursive, so if value is key/value pairs then all children will get converted """ value = element.value if element.VR in BINARY_VR_VALUES: binary_elements.append((tagstack[:], element)) return '' elif type(value) == list: new_list = [__typemap(listvalue) for listvalue in value] return new_list elif type(value) == dicom.sequence.Sequence: tagstack.append(element.tag) nested_data = [] for i in range(0, len(value)): tagstack.append(i) nested_data.append(dict(\ (subkey, __jsonify(value[i][subkey], binary_elements, tagstack)) for subkey in value[i].keys())) tagstack.pop() tagstack.pop() return nested_data else: return __typemap(value) def __typemap(value): """ Map PyDicom types that won't serialise to JSON types """ if type(value) == dicom.UID.UID: return uid2str(value) elif isinstance(value, dicom.tag.BaseTag): return long(value) else: return value def json2pydicom(jsn): """ Convert the supplied json dict into a PyDicom object """ dataset = dicom.dataset.Dataset() # Don't try to convert couch specific tags dicom_keys = [key for key in jsn.keys() \ if key not in ['_rev', '_id', '_attachments', 'file_meta']] for key in dicom_keys: dataset.add(__dicomify(key, jsn[key])) file_meta = dicom.dataset.Dataset() for key in jsn['file_meta']: file_meta.add(__dicomify(key, jsn['file_meta'][key])) dataset.file_meta = file_meta return dataset def __dicomify(key, value): """ Convert a json key, value to a PyDicom DataElement """ tag = __str2tag(key) if tag.element == 0: # 0 tag implies group length (filreader.py pydicom) vr = 'UL' else: vr = dicom.datadict.dictionaryVR(tag) if vr == 'OW/OB': # Always write pixel data as bytes vr = 'OB' # rather than words if vr == 'US or SS': # US or SS is up to us as the data is already if value < 0: # decoded. We therefore choose US, unless we vr = 'SS' # need a signed value. else: vr = 'US' if vr == 'SQ': # We have a sequence of datasets, so we recurse return dicom.dataelem.DataElement(tag, vr, dicom.sequence.Sequence([ __make_dataset( [__dicomify(subkey, listvalue[subkey]) for subkey in listvalue.keys() ]) for listvalue in value ])) else: return dicom.dataelem.DataElement(tag, vr, value) def __make_dataset(data_elements): """ Create a Dataset from a list of DataElement objects """ dataset = dicom.dataset.Dataset() for element in data_elements: dataset.add(element) return dataset def __str2tag(key): """ Convert string representation of a tag into a Tag """ return dicom.tag.Tag((int(key[1:5], 16), int(key[7:-1], 16))) if __name__ == '__main__': TESTDB = 'dicom_test' SERVER = 'http://127.0.0.1:5984' # Delete test database if it already exists couch = couchdb.Server(SERVER) try: couch.delete(TESTDB) except couchdb.client.ResourceNotFound: pass # Don't worry if it didn't exist db = DicomCouch(SERVER, TESTDB) testfiles_dir = '../testfiles' testfiles = os.listdir('../testfiles') testfiles = filter(lambda x:x.endswith('dcm'), testfiles) testfiles = map(lambda x:os.path.join('../testfiles', x), testfiles) for dcmfile in testfiles: dcm = dicom.read_file(dcmfile) db[dcm.SeriesInstanceUID] = dcm pydicom-0.9.7/dicom/contrib/imViewer_Simple.py000644 000765 000024 00000034432 11726534363 021665 0ustar00darcystaff000000 000000 #========================================================================== # imViewer-Simple.py # # An example program that opens uncompressed DICOM images and # converts them via numPy and PIL to be viewed in wxWidgets GUI # apps. The conversion is currently: # # pydicom->NumPy->PIL->wxPython.Image->wxPython.Bitmap # # Gruesome but it mostly works. Surely there is at least one # of these steps that could be eliminated (probably PIL) but # haven't tried that yet and I may want some of the PIL manipulation # functions. # # This won't handle RLE, embedded JPEG-Lossy, JPEG-lossless, # JPEG2000, old ACR/NEMA files, or anything wierd. Also doesn't # handle some RGB images that I tried. # # Have added Adit Panchal's LUT code. It helps a lot, but needs # to be further generalized. Added test for window and/or level # as 'list' type - crude, but it worked for a bunch of old MR and # CT slices I have. # # Testing: minimal # Tried only on WinXP sp2 using numpy 1.3.0 # and PIL 1.1.7b1, Python 2.6.4, and wxPython 2.8.10.1 # # Dave Witten: Nov. 11, 2009 #========================================================================== import os import os.path import sys import dicom import wx have_PIL = True try: import PIL.Image except: have_PIL = False have_numpy = True try: import numpy as np except: have_numpy = False #---------------------------------------------------------------- # Initialize image capabilities. #---------------------------------------------------------------- wx.InitAllImageHandlers() #---------------------------------------------------------------- # MsgDlg() #---------------------------------------------------------------- def MsgDlg(window, string, caption='OFAImage', style=wx.YES_NO|wx.CANCEL): """Common MessageDialog.""" dlg = wx.MessageDialog(window, string, caption, style) result = dlg.ShowModal() dlg.Destroy() return result #======================================================= # class ImFrame #======================================================= class ImFrame(wx.Frame): """Class for main window.""" #------------------------------------------------------------ # ImFrame.__init__() #------------------------------------------------------------ def __init__(self, parent, title): """Create the pydicom image example's main frame window.""" wx.Frame.__init__(self, parent, id = -1, title = "", pos = wx.DefaultPosition, size = wx.Size(w=1024, h=768), style = wx.DEFAULT_FRAME_STYLE | wx.SUNKEN_BORDER | wx.CLIP_CHILDREN) #-------------------------------------------------------- # Set up the menubar. #-------------------------------------------------------- self.mainmenu = wx.MenuBar() # Make the 'File' menu. menu = wx.Menu() item = menu.Append(wx.ID_ANY, '&Open', 'Open file for editing') self.Bind(wx.EVT_MENU, self.OnFileOpen, item) item = menu.Append(wx.ID_ANY, 'E&xit', 'Exit Program') self.Bind(wx.EVT_MENU, self.OnFileExit, item) self.mainmenu.Append(menu, '&File') # Attach the menu bar to the window. self.SetMenuBar(self.mainmenu) #-------------------------------------------------------- # Set up the main splitter window. #-------------------------------------------------------- self.mainSplitter = wx.SplitterWindow(self, style=wx.NO_3D | wx.SP_3D) self.mainSplitter.SetMinimumPaneSize(1) #------------------------------------------------------------- # Create the folderTreeView on the left. #------------------------------------------------------------- self.dsTreeView = wx.TreeCtrl(self.mainSplitter, style=wx.TR_LINES_AT_ROOT | wx.TR_HAS_BUTTONS) #-------------------------------------------------------- # Create the ImageView on the right pane. #-------------------------------------------------------- self.imView = wx.Panel(self.mainSplitter, style=wx.VSCROLL | wx.HSCROLL | wx.CLIP_CHILDREN) self.imView.Bind(wx.EVT_PAINT, self.OnPaint) self.imView.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) self.imView.Bind(wx.EVT_SIZE, self.OnSize) #-------------------------------------------------------- # Install the splitter panes. #-------------------------------------------------------- self.mainSplitter.SplitVertically(self.dsTreeView, self.imView) self.mainSplitter.SetSashPosition(300, True) #-------------------------------------------------------- # Initialize some values #-------------------------------------------------------- self.dcmdsRoot = False self.foldersRoot = False self.loadCentered = True self.bitmap = None self.Show(True) #------------------------------------------------------------ # ImFrame.OnFileExit() #------------------------------------------------------------ def OnFileExit(self, event): """Exits the program.""" self.Destroy() event.Skip() #------------------------------------------------------------ # ImFrame.OnSize() #------------------------------------------------------------ def OnSize(self, event): "Window 'size' event." self.Refresh() #------------------------------------------------------------ # ImFrame.OnEraseBackground() #------------------------------------------------------------ def OnEraseBackground(self, event): "Window 'erase background' event." pass #------------------------------------------------------------ # ImFrame.populateTree() #------------------------------------------------------------ def populateTree(self, ds): """ Populate the tree in the left window with the [desired] dataset values""" if not self.dcmdsRoot: self.dcmdsRoot = self.dsTreeView.AddRoot(text="DICOM Objects") else: self.dsTreeView.DeleteChildren(self.dcmdsRoot) self.recurse_tree(ds, self.dcmdsRoot) self.dsTreeView.ExpandAll() #------------------------------------------------------------ # ImFrame.recurse_tree() #------------------------------------------------------------ def recurse_tree(self, ds, parent, hide=False): """ order the dicom tags """ for data_element in ds: if isinstance(data_element.value, unicode): ip = self.dsTreeView.AppendItem(parent, text=unicode(data_element)) else: ip = self.dsTreeView.AppendItem(parent, text=str(data_element)) if data_element.VR == "SQ": for i, ds in enumerate(data_element.value): sq_item_description = data_element.name.replace(" Sequence", "") item_text = "%s %d" % (sq_item_description, i+1) parentNodeID = self.dsTreeView.AppendItem(ip, text=item_text.rjust(128)) self.recurse_tree(ds, parentNodeID) ## --- Most of what is important happens below this line --------------------- #------------------------------------------------------------ # ImFrame.OnFileOpen() #------------------------------------------------------------ def OnFileOpen(self, event): """Opens a selected file.""" dlg = wx.FileDialog(self, 'Choose a file to add.', '', '', '*.*', wx.OPEN) if dlg.ShowModal() == wx.ID_OK: fullPath = dlg.GetPath() imageFile = dlg.GetFilename() #checkDICMHeader() self.show_file(imageFile, fullPath) #------------------------------------------------------------ # ImFrame.OnPaint() #------------------------------------------------------------ def OnPaint(self, event): "Window 'paint' event." dc = wx.PaintDC(self.imView) dc = wx.BufferedDC(dc) # paint a background just so it isn't *so* boring. dc.SetBackground(wx.Brush("WHITE")) dc.Clear() dc.SetBrush(wx.Brush("GREY", wx.CROSSDIAG_HATCH)) windowsize = self.imView.GetSizeTuple() dc.DrawRectangle(0, 0, windowsize[0], windowsize[1]) bmpX0 = 0 bmpY0 = 0 if(self.bitmap != None): if self.loadCentered: bmpX0 = (windowsize[0] - self.bitmap.Width) / 2 bmpY0 = (windowsize[1] - self.bitmap.Height) / 2 dc.DrawBitmap(self.bitmap, bmpX0, bmpY0, False) #------------------------------------------------------------ # ImFrame.ConvertWXToPIL() # Expropriated from Andrea Gavana's # ShapedButton.py in the wxPython dist #------------------------------------------------------------ def ConvertWXToPIL(self, bmp): """ Convert wx.Image Into PIL Image. """ width = bmp.GetWidth() height = bmp.GetHeight() im = wx.EmptyImage(width, height) im.fromarray("RGBA", (width, height), bmp.GetData()) return img #------------------------------------------------------------ # ImFrame.ConvertPILToWX() # Expropriated from Andrea Gavana's # ShapedButton.py in the wxPython dist #------------------------------------------------------------ def ConvertPILToWX(self, pil, alpha=True): """ Convert PIL Image Into wx.Image. """ if alpha: image = apply(wx.EmptyImage, pil.size) image.SetData(pil.convert("RGB").tostring()) image.SetAlphaData(pil.convert("RGBA").tostring()[3::4]) else: image = wx.EmptyImage(pil.size[0], pil.size[1]) new_image = pil.convert('RGB') data = new_image.tostring() image.SetData(data) return image #----------------------------------------------------------- # ImFrame.get_LUT_value() #----------------------------------------------------------- def get_LUT_value(self, data, window, level): """Apply the RGB Look-Up Table for the given data and window/level value.""" if not have_numpy: raise ImportError, "Numpy is not available. See http://numpy.scipy.org/ to download and install" if isinstance(window, list): window = window[0] if isinstance(level, list): level = level[0] return np.piecewise( data, [data <= (level - 0.5 - (window-1)/2), data > (level - 0.5 + (window-1)/2)], [0, 255, lambda data: ((data - (level - 0.5))/(window-1) + 0.5)*(255-0)] ) #----------------------------------------------------------- # ImFrame.loadPIL_LUT(dataset) # Display an image using the Python Imaging Library (PIL) #----------------------------------------------------------- def loadPIL_LUT(self, dataset): if not have_PIL: raise ImportError, "Python Imaging Library is not available. See http://www.pythonware.com/products/pil/ to download and install" if('PixelData' not in dataset): raise TypeError, "Cannot show image -- DICOM dataset does not have pixel data" if('WindowWidth' not in dataset) or ('WindowCenter' not in dataset): # can only apply LUT if these values exist bits = dataset.BitsAllocated samples = dataset.SamplesPerPixel if bits == 8 and samples == 1: mode = "L" elif bits == 8 and samples == 3: mode = "RGB" elif bits == 16: # not sure about this -- PIL source says is 'experimental' and no documentation. mode = "I;16" # Also, should bytes swap depending on endian of file and system?? else: raise TypeError, "Don't know PIL mode for %d BitsAllocated and %d SamplesPerPixel" % (bits, samples) size = (dataset.Columns, dataset.Rows) im = PIL.Image.frombuffer(mode, size, dataset.PixelData, "raw", mode, 0, 1) # Recommended to specify all details by http://www.pythonware.com/library/pil/handbook/image.htm else: image = self.get_LUT_value(dataset.pixel_array, dataset.WindowWidth, dataset.WindowCenter) im = PIL.Image.fromarray(image).convert('L') # Convert mode to L since LUT has only 256 values: http://www.pythonware.com/library/pil/handbook/image.htm return im #------------------------------------------------------------ # ImFrame.show_file() #------------------------------------------------------------ def show_file(self, imageFile, fullPath): """ Load the DICOM file, make sure it contains at least one image, and set it up for display by OnPaint(). ** be careful not to pass a unicode string to read_file or it will give you 'fp object does not have a defer_size attribute, or some such.""" ds = dicom.read_file(str(fullPath)) ds.decode() # change strings to unicode self.populateTree(ds) if 'PixelData' in ds: self.dImage = self.loadPIL_LUT(ds) if self.dImage != None: tmpImage = self.ConvertPILToWX(self.dImage, False) self.bitmap = wx.BitmapFromImage(tmpImage) self.Refresh() ##------ This is just the initialization of the App ------------------------- #======================================================= # The main App Class. #======================================================= class App(wx.App): """Image Application.""" #------------------------------------------------------------ # App.OnInit() #------------------------------------------------------------ def OnInit(self): """Create the Image Application.""" frame = ImFrame(None, 'wxImage Example') return True #--------------------------------------------------------------------- # If this file is running as main or a standalone test, begin execution here. #--------------------------------------------------------------------- if __name__ == '__main__': app = App(0) app.MainLoop() pydicom-0.9.7/dicom/contrib/pydicom_PIL.py000644 000765 000024 00000006612 11726534363 020734 0ustar00darcystaff000000 000000 # pydicom_PIL.py """View DICOM images using Python image Library (PIL) Usage: >>> import dicom >>> from dicom.contrib.pydicom_PIL import show_PIL >>> ds = dicom.read_file("filename") >>> show_PIL(ds) Requires Numpy: http://numpy.scipy.org/ and Python Imaging Library: http://www.pythonware.com/products/pil/ """ # Copyright (c) 2009 Darcy Mason, Adit Panchal # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at http://pydicom.googlecode.com # Based on image.py from pydicom version 0.9.3, # LUT code added by Adit Panchal # Tested on Python 2.5.4 (32-bit) on Mac OS X 10.6 # using numpy 1.3.0 and PIL 1.1.7b1 have_PIL=True try: import PIL.Image except: have_PIL = False have_numpy=True try: import numpy as np except: have_numpy = False have_numpy=True try: import numpy as np except: have_numpy = False def get_LUT_value(data, window, level): """Apply the RGB Look-Up Table for the given data and window/level value.""" if not have_numpy: raise ImportError, "Numpy is not available. See http://numpy.scipy.org/ to download and install" return np.piecewise(data, [data <= (level - 0.5 - (window-1)/2), data > (level - 0.5 + (window-1)/2)], [0, 255, lambda data: ((data - (level - 0.5))/(window-1) + 0.5)*(255-0)]) def get_LUT_value(data, window, level): """Apply the RGB Look-Up Table for the given data and window/level value.""" if not have_numpy: raise ImportError, "Numpy is not available. See http://numpy.scipy.org/ to download and install" return np.piecewise(data, [data <= (level - 0.5 - (window-1)/2), data > (level - 0.5 + (window-1)/2)], [0, 255, lambda data: ((data - (level - 0.5))/(window-1) + 0.5)*(255-0)]) # Display an image using the Python Imaging Library (PIL) def show_PIL(dataset): if not have_PIL: raise ImportError, "Python Imaging Library is not available. See http://www.pythonware.com/products/pil/ to download and install" if ('PixelData' not in dataset): raise TypeError, "Cannot show image -- DICOM dataset does not have pixel data" if ('WindowWidth' not in dataset) or ('WindowCenter' not in dataset): # can only apply LUT if these values exist bits = dataset.BitsAllocated samples = dataset.SamplesPerPixel if bits == 8 and samples == 1: mode = "L" elif bits == 8 and samples == 3: mode = "RGB" elif bits == 16: mode = "I;16" # not sure about this -- PIL source says is 'experimental' and no documentation. Also, should bytes swap depending on endian of file and system?? else: raise TypeError, "Don't know PIL mode for %d BitsAllocated and %d SamplesPerPixel" % (bits, samples) # PIL size = (width, height) size = (dataset.Columns, dataset.Rows) im = PIL.Image.frombuffer(mode, size, dataset.PixelData, "raw", mode, 0, 1) # Recommended to specify all details by http://www.pythonware.com/library/pil/handbook/image.htm else: image = get_LUT_value(dataset.pixel_array, dataset.WindowWidth, dataset.WindowCenter) im = PIL.Image.fromarray(image).convert('L') # Convert mode to L since LUT has only 256 values: http://www.pythonware.com/library/pil/handbook/image.htm im.show() pydicom-0.9.7/dicom/contrib/pydicom_series.py000644 000765 000024 00000053436 11726534363 021610 0ustar00darcystaff000000 000000 # dicom_series.py """ By calling the function read_files with a directory name or list of files as an argument, a list of DicomSeries instances can be obtained. A DicomSeries object has some attributes that give information about the serie (such as shape, sampling, suid) and has an info attribute, which is a dicom.DataSet instance containing information about the first dicom file in the serie. The data can be obtained using the get_pixel_array() method, which produces a 3D numpy array if there a multiple files in the serie. This module can deal with gated data, in which case a DicomSeries instance is created for each 3D volume. """ # # Copyright (c) 2010 Almar Klein # This file is released under the pydicom license. # See the file license.txt included with the pydicom distribution, also # available at http://pydicom.googlecode.com # # I (Almar) performed some test to loading a series of data # in two different ways: loading all data, and deferring loading # the data. Both ways seem equally fast on my system. I have to # note that results can differ quite a lot depending on the system, # but still I think this suggests that deferred reading is in # general not slower. I think deferred loading of the pixel data # can be advantageous because maybe not all data of all series # is needed. Also it simply saves memory, because the data is # removed from the Dataset instances. # In the few result below, cold means reading for the first time, # warm means reading 2nd/3d/etc time. # - Full loading of data, cold: 9 sec # - Full loading of data, warm: 3 sec # - Deferred loading of data, cold: 9 sec # - Deferred loading of data, warm: 3 sec import os, sys, time, gc import dicom from dicom.sequence import Sequence # Try importing numpy try: import numpy as np have_numpy = True except Exception: np = None have_numpy = False ## Helper functions and classes class ProgressBar: """ To print progress to the screen. """ def __init__(self, char='-', length=20): self.char = char self.length = length self.progress = 0.0 self.nbits = 0 self.what = '' def Start(self, what=''): """ Start(what='') Start the progress bar, displaying the given text first. Make sure not to print anything untill after calling Finish(). Messages can be printed while displaying progess by using printMessage(). """ self.what = what self.progress = 0.0 self.nbits = 0 sys.stdout.write(what+" [") def Stop(self, message=""): """ Stop the progress bar where it is now. Optionally print a message behind it.""" delta = int(self.length - self.nbits) sys.stdout.write( " "*delta + "] " + message + "\n") def Finish(self, message=""): """ Finish the progress bar, setting it to 100% if it was not already. Optionally print a message behind the bar. """ delta = int(self.length-self.nbits) sys.stdout.write( self.char*delta + "] " + message + "\n") def Update(self, newProgress): """ Update progress. Progress is given as a number between 0 and 1. """ self.progress = newProgress required = self.length*(newProgress) delta = int(required-self.nbits) if delta>0: sys.stdout.write(self.char*delta) self.nbits += delta def PrintMessage(self, message): """ Print a message (for example a warning). The message is printed behind the progress bar, and a new bar is started. """ self.Stop(message) self.Start(self.what) def _dummyProgressCallback(progress): """ A callback to indicate progress that does nothing. """ pass _progressBar = ProgressBar() def _progressCallback(progress): """ The default callback for displaying progress. """ if isinstance(progress, basestring): _progressBar.Start(progress) _progressBar._t0 = time.time() elif progress is None: dt = time.time() - _progressBar._t0 _progressBar.Finish('%2.2f seconds' % dt) else: _progressBar.Update(progress) def _listFiles(files, path): """List all files in the directory, recursively. """ for item in os.listdir(path): item = os.path.join(path, item) if os.path.isdir( item ): _listFiles(files, item) else: files.append(item) def _splitSerieIfRequired(serie, series): """ _splitSerieIfRequired(serie, series) Split the serie in multiple series if this is required. The choice is based on examing the image position relative to the previous image. If it differs too much, it is assumed that there is a new dataset. This can happen for example in unspitted gated CT data. """ # Sort the original list and get local name serie._sort() L = serie._datasets # Init previous slice ds1 = L[0] # Check whether we can do this if not "ImagePositionPatient" in ds1: return # Initialize a list of new lists L2 = [[ds1]] # Init slice distance estimate distance = 0 for index in range(1,len(L)): # Get current slice ds2 = L[index] # Get positions pos1 = ds1.ImagePositionPatient[2] pos2 = ds2.ImagePositionPatient[2] # Get distances newDist = abs(pos1 - pos2) #deltaDist = abs(firstPos-pos2) # If the distance deviates more than 2x from what we've seen, # we can agree it's a new dataset. if distance and newDist > 2.1*distance: L2.append([]) distance = 0 else: # Test missing file if distance and newDist > 1.5*distance: print 'Warning: missing file after "%s"' % ds1.filename distance = newDist # Add to last list L2[-1].append( ds2 ) # Store previous ds1 = ds2 # Split if we should if len(L2) > 1: # At what position are we now? i = series.index(serie) # Create new series series2insert = [] for L in L2: newSerie = DicomSeries(serie.suid, serie._showProgress) newSerie._datasets = Sequence(L) series2insert.append(newSerie) # Insert series and remove self for newSerie in reversed(series2insert): series.insert(i, newSerie) series.remove(serie) pixelDataTag = dicom.tag.Tag(0x7fe0, 0x0010) def _getPixelDataFromDataset(ds): """ Get the pixel data from the given dataset. If the data was deferred, make it deferred again, so that memory is preserved. Also applies RescaleSlope and RescaleIntercept if available. """ # Get original element el = dict.__getitem__(ds, pixelDataTag) # Get data data = ds.PixelArray # Remove data (mark as deferred) dict.__setitem__(ds, pixelDataTag, el) del ds._PixelArray # Obtain slope and offset slope = 1 offset = 0 needFloats = False needApplySlopeOffset = False if 'RescaleSlope' in ds: needApplySlopeOffset = True slope = ds.RescaleSlope if 'RescaleIntercept' in ds: needApplySlopeOffset = True offset = ds.RescaleIntercept if int(slope)!= slope or int(offset) != offset: needFloats = True if not needFloats: slope, offset = int(slope), int(offset) # Apply slope and offset if needApplySlopeOffset: # Maybe we need to change the datatype? if data.dtype in [np.float32, np.float64]: pass elif needFloats: data = data.astype(np.float32) else: # Determine required range minReq, maxReq = data.min(), data.max() minReq = min([minReq, minReq*slope+offset, maxReq*slope+offset]) maxReq = max([maxReq, minReq*slope+offset, maxReq*slope+offset]) # Determine required datatype from that dtype = None if minReq<0: # Signed integer type maxReq = max([-minReq, maxReq]) if maxReq < 2**7: dtype = np.int8 elif maxReq < 2**15: dtype = np.int16 elif maxReq < 2**31: dtype = np.int32 else: dtype = np.float32 else: # Unsigned integer type if maxReq < 2**8: dtype = np.int8 elif maxReq < 2**16: dtype = np.int16 elif maxReq < 2**32: dtype = np.int32 else: dtype = np.float32 # Change datatype if dtype != data.dtype: data = data.astype(dtype) # Apply slope and offset data *= slope data += offset # Done return data ## The public functions and classes def read_files(path, showProgress=False, readPixelData=False): """ read_files(path, showProgress=False, readPixelData=False) Reads dicom files and returns a list of DicomSeries objects, which contain information about the data, and can be used to load the image or volume data. The parameter "path" can also be a list of files or directories. If the callable "showProgress" is given, it is called with a single argument to indicate the progress. The argument is a string when a progress is started (indicating what is processed). A float indicates progress updates. The paremeter is None when the progress is finished. When "showProgress" is True, a default callback is used that writes to stdout. By default, no progress is shown. if readPixelData is True, the pixel data of all series is read. By default the loading of pixeldata is deferred until it is requested using the DicomSeries.get_pixel_array() method. In general, both methods should be equally fast. """ # Init list of files files = [] # Obtain data from the given path if isinstance(path, basestring): # Make dir nice basedir = os.path.abspath(path) # Check whether it exists if not os.path.isdir(basedir): raise ValueError('The given path is not a valid directory.') # Find files recursively _listFiles(files, basedir) elif isinstance(path, (tuple, list)): # Iterate over all elements, which can be files or directories for p in path: if os.path.isdir(p): _listFiles(files, os.path.abspath(p)) elif os.path.isfile(p): files.append(p) else: print "Warning, the path '%s' is not valid." % p else: raise ValueError('The path argument must be a string or list.') # Set default progress callback? if showProgress is True: showProgress = _progressCallback if not hasattr(showProgress, '__call__'): showProgress = _dummyProgressCallback # Set defer size deferSize = 16383 # 128**2-1 if readPixelData: deferSize = None # Gather file data and put in DicomSeries series = {} count = 0 showProgress('Loading series information:') for filename in files: # Skip DICOMDIR files if filename.count("DICOMDIR"): continue # Try loading dicom ... try: dcm = dicom.read_file( filename, deferSize ) except dicom.filereader.InvalidDicomError: continue # skip non-dicom file except Exception, why: if showProgress is _progressCallback: _progressBar.PrintMessage(str(why)) else: print 'Warning:', why continue # Get SUID and register the file with an existing or new series object try: suid = dcm.SeriesInstanceUID except AttributeError: continue # some other kind of dicom file if suid not in series: series[suid] = DicomSeries(suid, showProgress) series[suid]._append(dcm) # Show progress (note that we always start with a 0.0) showProgress( float(count) / len(files) ) count += 1 # Finish progress showProgress( None ) # Make a list and sort, so that the order is deterministic series = series.values() series.sort(key=lambda x:x.suid) # Split series if necessary for serie in reversed([serie for serie in series]): _splitSerieIfRequired(serie, series) # Finish all series showProgress('Analysing series') series_ = [] for i in range(len(series)): try: series[i]._finish() series_.append(series[i]) except Exception: pass # Skip serie (probably report-like file without pixels) showProgress(float(i+1)/len(series)) showProgress(None) return series_ class DicomSeries(object): """ DicomSeries This class represents a serie of dicom files that belong together. If these are multiple files, they represent the slices of a volume (like for CT or MRI). The actual volume can be obtained using loadData(). Information about the data can be obtained using the info attribute. """ # To create a DicomSeries object, start by making an instance and # append files using the "_append" method. When all files are # added, call "_sort" to sort the files, and then "_finish" to evaluate # the data, perform some checks, and set the shape and sampling # attributes of the instance. def __init__(self, suid, showProgress): # Init dataset list and the callback self._datasets = Sequence() self._showProgress = showProgress # Init props self._suid = suid self._info = None self._shape = None self._sampling = None @property def suid(self): """ The Series Instance UID. """ return self._suid @property def shape(self): """ The shape of the data (nz, ny, nx). If None, the serie contains a single dicom file. """ return self._shape @property def sampling(self): """ The sampling (voxel distances) of the data (dz, dy, dx). If None, the serie contains a single dicom file. """ return self._sampling @property def info(self): """ A DataSet instance containing the information as present in the first dicomfile of this serie. """ return self._info @property def description(self): """ A description of the dicom series. Used fields are PatientName, shape of the data, SeriesDescription, and ImageComments. """ info = self.info # If no info available, return simple description if info is None: return "DicomSeries containing %i images" % len(self._datasets) fields = [] # Give patient name if 'PatientName' in info: fields.append(""+info.PatientName) # Also add dimensions if self.shape: tmp = [str(d) for d in self.shape] fields.append( 'x'.join(tmp) ) # Try adding more fields if 'SeriesDescription' in info: fields.append("'"+info.SeriesDescription+"'") if 'ImageComments' in info: fields.append("'"+info.ImageComments+"'") # Combine return ' '.join(fields) def __repr__(self): adr = hex(id(self)).upper() return "" % (len(self._datasets), adr) def get_pixel_array(self): """ get_pixel_array() Get (load) the data that this DicomSeries represents, and return it as a numpy array. If this serie contains multiple images, the resulting array is 3D, otherwise it's 2D. If RescaleSlope and RescaleIntercept are present in the dicom info, the data is rescaled using these parameters. The data type is chosen depending on the range of the (rescaled) data. """ # Can we do this? if not have_numpy: msg = "The Numpy package is required to use get_pixel_array.\n" raise ImportError(msg) # It's easy if no file or if just a single file if len(self._datasets)==0: raise ValueError('Serie does not contain any files.') elif len(self._datasets)==1: ds = self._datasets[0] slice = _getPixelDataFromDataset( ds ) return slice # Check info if self.info is None: raise RuntimeError("Cannot return volume if serie is not finished.") # Set callback to update progress showProgress = self._showProgress # Init data (using what the dicom packaged produces as a reference) ds = self._datasets[0] slice = _getPixelDataFromDataset( ds ) #vol = Aarray(self.shape, self.sampling, fill=0, dtype=slice.dtype) vol = np.zeros(self.shape, dtype=slice.dtype) vol[0] = slice # Fill volume showProgress('Loading data:') ll = self.shape[0] for z in range(1,ll): ds = self._datasets[z] vol[z] = _getPixelDataFromDataset(ds) showProgress(float(z)/ll) # Finish showProgress(None) # Done gc.collect() return vol def _append(self, dcm): """ _append(dcm) Append a dicomfile (as a dicom.dataset.FileDataset) to the series. """ self._datasets.append(dcm) def _sort(self): """ sort() Sort the datasets by instance number. """ self._datasets.sort(key=lambda k: k.InstanceNumber) def _finish(self): """ _finish() Evaluate the series of dicom files. Together they should make up a volumetric dataset. This means the files should meet certain conditions. Also some additional information has to be calculated, such as the distance between the slices. This method sets the attributes for "shape", "sampling" and "info". This method checks: * that there are no missing files * that the dimensions of all images match * that the pixel spacing of all images match """ # The datasets list should be sorted by instance number L = self._datasets if len(L)==0: return elif len(L) < 2: # Set attributes ds = self._datasets[0] self._info = self._datasets[0] self._shape = [ds.Rows, ds.Columns] self._sampling = [ds.PixelSpacing[0], ds.PixelSpacing[1]] return # Get previous ds1 = L[0] # Init measures to calculate average of distance_sum = 0.0 # Init measures to check (these are in 2D) dimensions = ds1.Rows, ds1.Columns sampling = ds1.PixelSpacing[0], ds1.PixelSpacing[1] # row, column for index in range(len(L)): # The first round ds1 and ds2 will be the same, for the # distance calculation this does not matter # Get current ds2 = L[index] # Get positions pos1 = ds1.ImagePositionPatient[2] pos2 = ds2.ImagePositionPatient[2] # Update distance_sum to calculate distance later distance_sum += abs(pos1 - pos2) # Test measures dimensions2 = ds2.Rows, ds2.Columns sampling2 = ds2.PixelSpacing[0], ds2.PixelSpacing[1] if dimensions != dimensions2: # We cannot produce a volume if the dimensions match raise ValueError('Dimensions of slices does not match.') if sampling != sampling2: # We can still produce a volume, but we should notify the user msg = 'Warning: sampling does not match.' if self._showProgress is _progressCallback: _progressBar.PrintMessage(msg) else: print msg # Store previous ds1 = ds2 # Create new dataset by making a deep copy of the first info = dicom.dataset.Dataset() firstDs = self._datasets[0] for key in firstDs.keys(): if key != (0x7fe0, 0x0010): el = firstDs[key] info.add_new(el.tag, el.VR, el.value) # Finish calculating average distance # (Note that there are len(L)-1 distances) distance_mean = distance_sum / (len(L)-1) # Store information that is specific for the serie self._shape = [len(L), ds2.Rows, ds2.Columns] self._sampling = [distance_mean, ds2.PixelSpacing[0], ds2.PixelSpacing[1]] # Store self._info = info if __name__ == '__main__': import sys if len(sys.argv) != 2: print "Expected a single argument: a directory with dicom files in it" else: adir = sys.argv[1] t0 = time.time() all_series = read_files(adir, None, False) print "Summary of each series:" for series in all_series: print series.description pydicom-0.9.7/dicom/contrib/pydicom_Tkinter.py000644 000765 000024 00000015630 11726534363 021730 0ustar00darcystaff000000 000000 #pydicom_Tkinter.py # # Copyright (c) 2009 Daniel Nanz # This file is released under the pydicom (http://code.google.com/p/pydicom/) # license, see the file license.txt available at # (http://code.google.com/p/pydicom/) # # revision history: # Dec-08-2009: version 0.1 # # 0.1: tested with pydicom version 0.9.3, Python version 2.6.2 (32-bit) # under Windows XP Professional 2002, and Mac OS X 10.5.5, # using numpy 1.3.0 and a small random selection of MRI and # CT images. ''' View DICOM images from pydicom requires numpy: http://numpy.scipy.org/ Usage: ------ >>> import dicom # pydicom >>> import dicom.contrib.pydicom_Tkinter as pydicom_Tkinter # this module >>> df = dicom.read_file(filename) >>> pydicom_Tkinter.show_image(df) ''' from __future__ import with_statement # for python 2.5 import Tkinter import tempfile import os have_numpy = True try: import numpy as np except: # will not work... have_numpy = False def get_PGM_bytedata_string(arr): '''Given a 2D numpy array as input write gray-value image data in the PGM format into a byte string and return it. arr: single-byte unsigned int numpy array note: Tkinter's PhotoImage object seems to accept only single-byte data ''' if arr.dtype != np.uint8: raise ValueError if len(arr.shape) != 2: raise ValueError # array.shape is (#rows, #cols) tuple; PGM input needs this reversed col_row_string = ' '.join(reversed(map(str, arr.shape))) bytedata_string = '\n'.join(('P5', col_row_string, str(arr.max()), arr.tostring())) return bytedata_string def get_PGM_from_numpy_arr(arr, window_center, window_width, lut_min=0, lut_max=255): '''real-valued numpy input -> PGM-image formatted byte string arr: real-valued numpy array to display as grayscale image window_center, window_width: to define max/min values to be mapped to the lookup-table range. WC/WW scaling is done according to DICOM-3 specifications. lut_min, lut_max: min/max values of (PGM-) grayscale table: do not change ''' if np.isreal(arr).sum() != arr.size: raise ValueError # currently only support 8-bit colors if lut_max != 255: raise ValueError if arr.dtype != np.float64: arr = arr.astype(np.float64) # LUT-specific array scaling # width >= 1 (DICOM standard) window_width = max(1, window_width) wc, ww = np.float64(window_center), np.float64(window_width) lut_range = np.float64(lut_max) - lut_min minval = wc - 0.5 - (ww - 1.0) / 2.0 maxval = wc - 0.5 + (ww - 1.0) / 2.0 min_mask = (minval >= arr) to_scale = (arr > minval) & (arr < maxval) max_mask = (arr >= maxval) if min_mask.any(): arr[min_mask] = lut_min if to_scale.any(): arr[to_scale] = ((arr[to_scale] - (wc - 0.5)) / (ww - 1.0) + 0.5) * lut_range + lut_min if max_mask.any(): arr[max_mask] = lut_max # round to next integer values and convert to unsigned int arr = np.rint(arr).astype(np.uint8) # return PGM byte-data string return get_PGM_bytedata_string(arr) def get_tkinter_photoimage_from_pydicom_image(data): ''' Wrap data.pixel_array in a Tkinter PhotoImage instance, after conversion into a PGM grayscale image. This will fail if the "numpy" module is not installed in the attempt of creating the data.pixel_array. data: object returned from pydicom.read_file() side effect: may leave a temporary .pgm file on disk ''' # get numpy array as representation of image data arr = data.pixel_array.astype(np.float64) # pixel_array seems to be the original, non-rescaled array. # If present, window center and width refer to rescaled array # -> do rescaling if possible. if ('RescaleIntercept' in data) and ('RescaleSlope' in data): intercept = data.RescaleIntercept # single value slope = data.RescaleSlope # arr = slope * arr + intercept # get default window_center and window_width values wc = (arr.max() + arr.min()) / 2.0 ww = arr.max() - arr.min() + 1.0 # overwrite with specific values from data, if available if ('WindowCenter' in data) and ('WindowWidth' in data): wc = data.WindowCenter ww = data.WindowWidth try: wc = wc[0] # can be multiple values except: pass try: ww = ww[0] except: pass # scale array to account for center, width and PGM grayscale range, # and wrap into PGM formatted ((byte-) string pgm = get_PGM_from_numpy_arr(arr, wc, ww) # create a PhotoImage # for as yet unidentified reasons the following fails for certain # window center/width values: # photo_image = Tkinter.PhotoImage(data=pgm, gamma=1.0) # Error with Python 2.6.2 under Windows XP: # (self.tk.call(('image', 'create', imgtype, name,) + options) # _tkinter.TclError: truncated PPM data # OsX: distorted images # while all seems perfectly OK for other values of center/width or when # the PGM is first written to a temporary file and read again # write PGM file into temp dir (os_id, abs_path) = tempfile.mkstemp(suffix='.pgm') with open(abs_path, 'wb') as fd: fd.write(pgm) photo_image = Tkinter.PhotoImage(file=abs_path, gamma=1.0) # close and remove temporary file on disk # os.close is needed under windows for os.remove not to fail try: os.close(os_id) os.remove(abs_path) except: pass # silently leave file on disk in temp-like directory return photo_image def show_image(data, block=True, master=None): ''' Get minimal Tkinter GUI and display a pydicom data.pixel_array data: object returned from pydicom.read_file() block: if True run Tk mainloop() to show the image master: use with block==False and an existing Tk widget as parent widget side effects: may leave a temporary .pgm file on disk ''' frame = Tkinter.Frame(master=master, background='#000') if 'SeriesDescription' in data and 'InstanceNumber' in data: title = ', '.join(('Ser: ' + data.SeriesDescription, 'Img: ' + str(data.InstanceNumber))) else: title = 'pydicom image' frame.master.title(title) photo_image = get_tkinter_photoimage_from_pydicom_image(data) label = Tkinter.Label(frame, image=photo_image, background='#000') # keep a reference to avoid disappearance upon garbage collection label.photo_reference = photo_image label.grid() frame.grid() if block==True: frame.mainloop()