diff --git a/bin/.gitignore b/bin/.gitignore new file mode 100644 index 00000000..17c6a931 --- /dev/null +++ b/bin/.gitignore @@ -0,0 +1 @@ +pnp diff --git a/bin/dzi.py b/bin/dzi.py new file mode 100755 index 00000000..960c543b --- /dev/null +++ b/bin/dzi.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import os +import deepzoom +import urllib +import re + +MAX_PAGES = 10 +PAGE_COUNT = {} + + +def ensure_dir( filename ): + directory = os.path.dirname( filename ) + if not os.path.exists( directory ): + os.makedirs( directory ) + + +# Create Deep Zoom Image creator with weird parameters +creator = deepzoom.ImageCreator( + tile_size = 512, + tile_overlap = 2, + image_quality = 1, + tile_format = "tif", + resize_filter = "antialias" +) + +tiff_list = open( 'tiffs.txt', 'r' )\ + .read()\ + .split( '\n' ) + +for tiff_url in tiff_list: + + parts = re.match( + r'http://lcweb2\.loc\.gov/master/pnp/ppmsca/(\d*)/(\d*)/(\d*)u\.tif', + tiff_url + ).groups() + + id = parts[ 1 ] + fileid = parts[ 2 ] + + if id not in PAGE_COUNT: + PAGE_COUNT[ id ] = 0 + + path = tiff_url.replace( 'http://lcweb2.loc.gov/master/', '' ) + dzi_files = path.replace( 'u.tif', '_files' ) + + if PAGE_COUNT[ id ] < MAX_PAGES\ + and not os.path.exists( dzi_files ): + + print 'making directory: %s' % os.path.dirname( path ) + ensure_dir( path ) + + print 'downloading master tiff: %s' % tiff_url + tiff_file = open( path, 'wb' ) + tiff_file.write( urllib.urlopen( tiff_url ).read() ) + tiff_file.close() + + print 'creating dzi: %s' % path + # Create Deep Zoom image pyramid from source + creator.create( path, path.replace( 'u.tif', '.dzi' ) ) + + PAGE_COUNT[ id ] += 1 diff --git a/bin/tiffs.txt b/bin/tiffs.txt new file mode 100644 index 00000000..36175cca --- /dev/null +++ b/bin/tiffs.txt @@ -0,0 +1,2513 @@ +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/12800/12834/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/13700/13705/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/17800/17808/0045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09924u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09925u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09926u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09927u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09928u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09929u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09930u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09931u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09932u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09933u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09934u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09935u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09936u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09937u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09938u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09939u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09940u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09941u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09942u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09943u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09944u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09924/09945u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00113u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00114u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00115u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00116u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00117u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00118u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00119u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00120u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00121u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00122u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00123u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00124u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00125u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00126u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00127u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00128u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00129u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00130u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00131u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00132u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00133u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00134u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00135u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00136u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00137u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00138u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00139u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00140u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00141u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00142u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00143u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00144u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00145u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00146u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00147u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00148u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00149u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00150u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00151u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00152u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00153u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00154u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00155u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00156u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00157u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00158u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00159u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00160u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00161u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00162u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00163u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00164u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00165u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00166u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00167u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00168u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00169u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00170u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00171u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00172u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00173u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00174u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00175u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00176u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00177u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00178u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00179u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00180u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00181u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00182u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00183u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00184u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00185u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00186u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00187u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00188u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00189u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00190u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00191u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00192u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00193u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00194u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00195u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00196u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00197u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00198u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00199u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00200u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00201u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00202u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00203u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00204u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00205u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00206u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00207u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00208u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00209u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00210u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00211u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00212u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09955/00213u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09954/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00113u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00114u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00115u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00116u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00117u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00118u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00119u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00120u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00121u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00122u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00123u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00124u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00125u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00126u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00127u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00128u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00129u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00130u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00131u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00132u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00133u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00134u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00135u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00136u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00137u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00138u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00139u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00140u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00141u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00142u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00143u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00144u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00145u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00146u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00147u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00148u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00149u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00150u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00151u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00152u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00153u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00154u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00155u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00156u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00157u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00158u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00159u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00160u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00161u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00162u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00163u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00164u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00165u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00166u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00167u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00168u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00169u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00170u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00171u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00172u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00173u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00174u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00175u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00176u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00177u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00178u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00179u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00180u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00181u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00182u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00183u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00184u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00185u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00186u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00187u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00188u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00189u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00190u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00191u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00192u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00193u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00194u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00195u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00196u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00197u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00198u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00199u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00200u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00201u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00202u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00203u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00204u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00205u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00206u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00207u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00208u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00209u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00210u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09957/00211u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09956/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00113u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00114u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00115u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00116u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00117u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00118u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00119u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00120u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00121u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00122u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00123u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00124u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00125u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00126u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00127u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00128u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00129u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00130u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00131u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00132u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00133u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00134u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00135u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00136u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00137u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00138u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00139u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00140u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00141u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00142u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00143u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00144u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00145u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00146u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00147u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00148u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00149u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00150u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00151u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00152u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00153u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00154u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00155u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00156u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00157u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00158u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00159u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00160u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00161u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00162u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00163u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00164u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00165u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00166u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00167u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00168u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00169u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00170u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00171u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00172u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00173u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00174u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00175u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00176u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00177u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00178u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00179u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00180u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00181u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00182u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00183u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00184u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00185u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00186u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00187u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00188u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00189u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00190u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00191u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00192u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00193u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00194u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00195u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00196u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00197u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00198u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00199u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00200u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00201u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00202u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00203u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00204u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00205u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00206u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00207u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00208u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00209u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00210u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00211u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00212u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00213u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00214u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00215u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00216u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00217u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00218u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00219u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00220u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00221u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00222u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00223u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00224u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00225u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00226u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00227u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00228u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00229u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00230u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00231u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00232u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00233u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00234u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00235u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00236u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00237u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00238u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00239u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00240u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00241u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00242u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00243u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00244u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00245u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00246u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00247u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00248u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00249u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00250u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00251u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00252u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00253u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00254u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00255u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00256u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00257u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00258u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00259u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00260u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00261u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00262u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00263u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00264u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00265u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00266u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00267u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00268u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00269u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00270u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00271u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00272u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00273u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00274u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00275u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00276u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00277u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00278u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00279u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00280u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00281u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00282u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00283u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00284u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00285u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00286u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00287u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00288u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00289u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00290u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00291u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00292u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00293u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00294u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00295u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00296u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00297u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00298u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00299u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00300u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00301u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00302u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00303u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00304u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00305u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00306u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00307u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00308u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00309u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00310u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00311u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00312u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00313u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00314u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00315u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00316u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00317u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00318u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00319u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00320u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00321u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00322u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00323u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00324u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00325u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00326u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00327u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00328u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00329u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00330u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00331u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00332u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00333u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00334u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00335u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00336u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00337u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00338u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00339u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00340u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00341u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00342u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00343u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00344u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00345u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00346u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00347u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00348u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00349u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00350u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00351u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00352u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00353u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00354u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00355u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00356u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00357u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00358u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00359u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00360u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00361u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00362u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09947/00363u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09946/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09948/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00113u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00114u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00115u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00116u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00117u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00118u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00119u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00120u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00121u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00122u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00123u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00124u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00125u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00126u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00127u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00128u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00129u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00130u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00131u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00132u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00133u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00134u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00135u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00136u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00137u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00138u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00139u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00140u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00141u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00142u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00143u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00144u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00145u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00146u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00147u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00148u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00149u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00150u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00151u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00152u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00153u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00154u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00155u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00156u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00157u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00158u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00159u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00160u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00161u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00162u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00163u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00164u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00165u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00166u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00167u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00168u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00169u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00170u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00171u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00172u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00173u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00174u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00175u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00176u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00177u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00178u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00179u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00180u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00181u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00182u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00183u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00184u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00185u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00186u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00187u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00188u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00189u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00190u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00191u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00192u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00193u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00194u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00195u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00196u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00197u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00198u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00199u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00200u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00201u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00202u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00203u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00204u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00205u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00206u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00207u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00208u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00209u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00210u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00211u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00212u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00213u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00214u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00215u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00216u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00217u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00218u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00219u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00220u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00221u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00222u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00223u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00224u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00225u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00226u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00227u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00228u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00229u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00230u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00231u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00232u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00233u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00234u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00235u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00236u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00237u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00238u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00239u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00240u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00241u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00242u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00243u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00244u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00245u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00246u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00247u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00248u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00249u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00250u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00251u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00252u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00253u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00254u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00255u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00256u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00257u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00258u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00259u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00260u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00261u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00262u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00263u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00264u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00265u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00266u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00267u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00268u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00269u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00270u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00271u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00272u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00273u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00274u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00275u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00276u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00277u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00278u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00279u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00280u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00281u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00282u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00283u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00284u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00285u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00286u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00287u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00288u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00289u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00290u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00291u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00292u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00293u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00294u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00295u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00296u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00297u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00298u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00299u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00300u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00301u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00302u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00303u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00304u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00305u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00306u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00307u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00308u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00309u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00310u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00311u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00312u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00313u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00314u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00315u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00316u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00317u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00318u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00319u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00320u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00321u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00322u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00323u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00324u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00325u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00326u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00327u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00328u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00329u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00330u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00331u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00332u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00333u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00334u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00335u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00336u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00337u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00338u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00339u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00340u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00341u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00342u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00343u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00344u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00345u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00346u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00347u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00348u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00349u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00350u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00351u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00352u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00353u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00354u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00355u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00356u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00357u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00358u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00359u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00360u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00361u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00362u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00363u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00364u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00365u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00366u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00367u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00368u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00369u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00370u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00371u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00372u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00373u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00374u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00375u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00376u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00377u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00378u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00379u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00380u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00381u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00382u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00383u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00384u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00385u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00386u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00387u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00388u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00389u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00390u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00391u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00392u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00393u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00394u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00395u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00396u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00397u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00398u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00399u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00400u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00401u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00402u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00403u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00404u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00405u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00406u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00407u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00408u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00409u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00410u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00411u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00412u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00413u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00414u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00415u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00416u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00417u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00418u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00419u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00420u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00421u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00422u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00423u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00424u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00425u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00426u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00427u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00428u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00429u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00430u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00431u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00432u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00433u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00434u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00435u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00436u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00437u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00438u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00439u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00440u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00441u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00442u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00443u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00444u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00445u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00446u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00447u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00448u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00449u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00450u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00451u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00452u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00453u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00454u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00455u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00456u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00457u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00458u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00459u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00460u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00461u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00462u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00463u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00464u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00465u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00466u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00467u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00468u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00469u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00470u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00471u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00472u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00473u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00474u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00475u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00476u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00477u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00478u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00479u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00480u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00481u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00482u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00483u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00484u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00485u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00486u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00487u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00488u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00489u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00490u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00491u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00492u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00493u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00494u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00495u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09951/00496u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09950/00089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/09900/09952/00087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0086u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0087u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0088u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0089u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0090u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0091u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0092u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0093u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0094u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0095u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0096u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0097u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0098u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0099u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0100u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0101u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0102u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0103u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0104u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0105u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0106u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0107u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0108u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0109u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0110u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0111u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0112u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0113u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0114u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0115u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0116u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0117u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0118u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0119u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0120u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0121u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0122u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0123u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0124u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0125u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0126u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0127u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0128u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0129u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0130u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0131u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0132u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0133u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0134u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0135u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0136u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0137u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0138u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0139u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0140u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0141u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0142u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0143u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0144u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0145u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0146u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0147u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0148u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0149u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0150u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0151u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0152u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0153u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0154u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0155u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0156u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0157u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0158u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0159u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0160u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0161u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0162u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0163u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0164u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0165u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0166u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0167u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0168u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0169u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0170u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0171u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0172u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0173u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0174u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0175u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0176u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0177u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0178u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0179u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0180u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0181u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0182u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0183u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0184u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0185u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0186u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0187u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0188u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0189u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0190u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0191u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0192u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0193u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0194u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0195u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0196u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0197u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0198u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0199u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0200u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0201u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0202u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0203u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0204u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0205u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0206u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0207u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0208u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0209u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0210u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0211u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0212u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0213u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0214u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0215u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0216u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0217u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0218u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0219u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0220u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0221u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0222u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0223u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0224u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0225u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0226u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0227u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0228u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0229u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0230u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0231u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0232u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0233u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0234u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0235u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0236u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0237u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0238u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0239u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0240u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0241u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0242u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0243u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0244u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0245u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0246u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0247u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0248u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0249u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0250u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0251u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0252u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0253u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0254u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0255u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0256u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0257u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0258u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0259u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0260u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0261u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0262u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0263u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0264u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0265u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0266u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0267u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0268u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0269u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0270u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0271u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0272u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0273u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0274u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0275u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0276u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0277u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0278u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0279u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0280u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0281u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0282u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0283u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0284u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0285u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0286u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0287u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0288u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0289u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0290u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0291u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0292u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0293u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0294u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0295u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0296u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0297u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0298u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/08700/08729/0299u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05954u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05955u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05956u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05957u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05958u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05959u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05960u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05961u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05962u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05963u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05964u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05965u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05966u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05967u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05968u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05969u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05970u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05971u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05972u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05973u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05974u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05975u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05976u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05977u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05978u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05979u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/05900/05954/05980u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/31000/31018/0037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0026u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0027u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0028u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0029u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0030u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0031u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0032u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0033u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0034u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0035u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0036u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0037u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0038u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0039u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0040u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0041u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0042u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0043u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0044u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0045u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0046u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0047u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0048u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0049u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0050u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0051u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0052u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0053u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0054u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0055u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0056u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0057u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0058u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0059u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0060u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0061u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0062u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0063u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0064u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0065u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0066u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0067u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0068u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0069u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0070u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0071u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0072u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0073u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0074u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0075u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0076u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0077u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0078u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0079u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0080u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0081u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0082u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0083u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0084u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/23700/23762/0085u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0001u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0002u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0003u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0004u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0005u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0006u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0007u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0008u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0009u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0010u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0011u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0012u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0013u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0014u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0015u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0016u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0017u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0018u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0019u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0020u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0021u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0022u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0023u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0024u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0025u.tif +http://lcweb2.loc.gov/master/pnp/ppmsca/22200/22293/0026u.tif \ No newline at end of file diff --git a/build.properties b/build.properties index fa91e763..cb76f108 100644 --- a/build.properties +++ b/build.properties @@ -6,7 +6,7 @@ PROJECT: openseadragon BUILD_MAJOR: 0 BUILD_MINOR: 9 -BUILD_ID: 50 +BUILD_ID: 64 BUILD: ${PROJECT}.${BUILD_MAJOR}.${BUILD_MINOR}.${BUILD_ID} VERSION: ${BUILD_MAJOR}.${BUILD_MINOR}.${BUILD_ID} diff --git a/build.xml b/build.xml index 6ee6610a..e948866c 100644 --- a/build.xml +++ b/build.xml @@ -1,7 +1,7 @@ + default="www"> @@ -52,9 +52,24 @@ + + + + + | Compiling OpenSeadragon Web Site + + + + + + + + + + + - @@ -71,4 +86,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/openseadragon.js b/openseadragon.js index 6bbbf7ac..70769804 100644 --- a/openseadragon.js +++ b/openseadragon.js @@ -1,5 +1,5 @@ /** - * @version OpenSeadragon 0.9.50 + * @version OpenSeadragon 0.9.64 * * @fileOverview *

@@ -470,7 +470,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ //INTERFACE FEATURES debugMode: true, animationTime: 1.5, - blendTime: 0.5, + blendTime: 0.1, alwaysBlend: false, autoHideControls: true, immediateRender: false, @@ -490,13 +490,17 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ controlsFadeDelay: 2000, controlsFadeLength: 1500, mouseNavEnabled: true, - showNavigator: false, + showNavigator: true, //promoted to default in 0.9.64 navigatorElement: null, navigatorHeight: null, navigatorWidth: null, navigatorPosition: null, navigatorSizeRatio: 0.25, preserveViewport: false, + defaultZoomLevel: 0, + + //EVENT RELATED CALLBACKS + onPageChange: null, //PERFORMANCE SETTINGS minPixelRatio: 0.5, @@ -1178,7 +1182,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ //TODO: very bad...Why check every time using try/catch when // we could determine once at startup which activeX object // was supported. This will have significant impact on - // performance for IE Browsers + // performance for IE Browsers DONE for ( i = 0; i < ACTIVEX.length; i++ ) { try { request = new ActiveXObject( ACTIVEX[ i ] ); @@ -1212,30 +1216,39 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @throws {Error} */ makeAjaxRequest: function( url, callback ) { - var async = typeof( callback ) == "function", + + + + var async = true, request = $.createAjaxRequest(), actual, + options, i; - if ( async ) { - actual = callback; - callback = function() { - window.setTimeout( - $.createCallback( null, actual, request ), - 1 - ); + + if( $.isPlainObject( url ) ){ + options.async = options.async || async; + }else{ + options = { + url: url, + async: $.isFunction( callback ), + success: callback, + error: null }; + } + + if ( options.async ) { /** @ignore */ request.onreadystatechange = function() { if ( request.readyState == 4) { request.onreadystatechange = new function() { }; - callback(); + options.success( request ); } }; } try { - request.open( "GET", url, async ); + request.open( "GET", options.url, options.async ); request.send( null ); } catch (e) { $.console.log( @@ -1247,12 +1260,16 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ request.onreadystatechange = null; request = null; - if ( async ) { - callback(); + if ( options.error && $.isFunction( options.error ) ) { + options.error( request ); } } - return async ? null : request; + if( !options.async && $.isFunction( options.success ) ){ + options.success( request ); + } + + return options.async ? null : request; }, @@ -1302,7 +1319,10 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ script = document.createElement( "script" ); - script.async = "async"; + //TODO: having an issue with async info requests + if( undefined !== options.async || false !== options.async ){ + script.async = "async"; + } if ( options.scriptCharset ) { script.charset = options.scriptCharset; @@ -1335,18 +1355,22 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ /** - * Loads a Deep Zoom Image description from a url or XML string and - * provides a callback hook for the resulting Document + * Loads a Deep Zoom Image description from a url, XML string or JSON string + * and provides a callback hook for the resulting Document * @function * @name OpenSeadragon.createFromDZI * @param {String} xmlUrl * @param {String} xmlString * @param {Function} callback + * @deprecated */ createFromDZI: function( dzi, callback, tileHost ) { var async = typeof ( callback ) == "function", - xmlUrl = dzi.substring(0,1) != '<' ? dzi : null, - xmlString = xmlUrl ? null : dzi, + dziUrl = ( + dzi.substring(0,1) != '<' && + dzi.substring(0,1) != '{' + ) ? dzi : null, + dziString = dziUrl ? null : dzi, error = null, urlParts, filename, @@ -1359,16 +1383,23 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ tilesUrl = tileHost + "/_files/"; - } else if( xmlUrl ) { + } else if( dziUrl ) { - urlParts = xmlUrl.split( '/' ); + urlParts = dziUrl.split( '/' ); filename = urlParts[ urlParts.length - 1 ]; + if( filename.match(/_dzi\.js$/) ){ + //for jsonp dzi specification, the '_dzi' needs to be removed + //from the filename to be consistent with the spec + filename = filename.replace('_dzi.js', '.js'); + } + lastDot = filename.lastIndexOf( '.' ); if ( lastDot > -1 ) { urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); } + tilesUrl = urlParts.join( '/' ) + "_files/"; } @@ -1386,17 +1417,17 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ } if ( async ) { - if ( xmlString ) { + if ( dziString ) { window.setTimeout( function() { - var source = finish( processDZIXml, parseXml( xmlString ) ); + var source = finish( processDZIXml, $.parseXml( xmlString ) ); // call after finish sets error callback( source, error ); }, 1); } else { - if( xmlUrl.match(/\.js$/) ){ - callbackName = xmlUrl.split( '/' ).pop().replace('.js','_dzi'); + if( dziUrl.match(/_dzi\.js$/) ){ + callbackName = dziUrl.split( '/' ).pop().replace('.js',''); $.jsonp({ - url: xmlUrl, + url: dziUrl, callbackName: callbackName, callback: function( imageData ){ var source = finish( processDZIJSON, imageData.Image ); @@ -1404,7 +1435,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ } }); } else { - $.makeAjaxRequest( xmlUrl, function( xhr ) { + $.makeAjaxRequest( dziUrl, function( xhr ) { var source = finish( processDZIResponse, xhr ); // call after finish sets error callback( source, error ); @@ -1415,17 +1446,72 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ return null; } - if ( xmlString ) { + if ( dziString ) { return finish( processDZIXml, - parseXml( xmlString ) + $.parseXml( dziString ) ); } else { return finish( processDZIResponse, - $.makeAjaxRequest( xmlUrl ) + $.makeAjaxRequest( dziUrl ) ); } + }, + + /** + * Parses an XML string into a DOM Document. + * @function + * @name OpenSeadragon.parseXml + * @param {String} string + * @returns {Document} + */ + parseXml: function( string ) { + //TODO: yet another example where we can determine the correct + // implementation once at start-up instead of everytime we use + // the function. DONE. + if ( window.ActiveXObject ) { + + $.parseXml = function( string ){ + var xmlDoc = null, + parser; + + xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); + xmlDoc.async = false; + xmlDoc.loadXML( string ); + return xmlDoc; + }; + + } else if ( window.DOMParser ) { + + $.parseXml = function( string ){ + var xmlDoc = null, + parser; + + parser = new DOMParser(); + xmlDoc = parser.parseFromString( string, "text/xml" ); + return xmlDoc; + }; + + } else { + throw new Error( "Browser doesn't support XML DOM." ); + } + + return $.parseXml( string ); + }, + + + /** + * Reports whether the image format is supported for tiling in this + * version. + * @function + * @name OpenSeadragon.imageFormatSupported + * @param {String} [extension] + * @returns {Boolean} + */ + imageFormatSupported: function( extension ) { + extension = extension ? extension : ""; + return !!FILEFORMATS[ extension.toLowerCase() ]; } }); @@ -1587,6 +1673,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {XMLHttpRequest} xhr * @param {String} tilesUrl + * @deprecated */ function processDZIResponse( xhr, tilesUrl ) { var status, @@ -1606,7 +1693,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ if ( xhr.responseXML && xhr.responseXML.documentElement ) { doc = xhr.responseXML; } else if ( xhr.responseText ) { - doc = parseXml( xhr.responseText ); + doc = $.parseXml( xhr.responseText ); } return processDZIXml( doc, tilesUrl ); @@ -1618,6 +1705,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Document} xmlDoc * @param {String} tilesUrl + * @deprecated */ function processDZIXml( xmlDoc, tilesUrl ) { @@ -1651,6 +1739,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Element} imageNode * @param {String} tilesUrl + * @deprecated */ function processDZI( imageNode, tilesUrl ) { var fileFormat = imageNode.getAttribute( "Format" ), @@ -1701,6 +1790,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Element} imageNode * @param {String} tilesUrl + * @deprecated */ function processDZIJSON( imageData, tilesUrl ) { var fileFormat = imageData.Format, @@ -1748,6 +1838,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Document} errorNode * @throws {Error} + * @deprecated */ function processDZIError( errorNode ) { var messageNode = errorNode.getElementsByTagName( "Message" )[ 0 ], @@ -1756,62 +1847,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ throw new Error(message); }; - /** - * Reports whether the image format is supported for tiling in this - * version. - * @private - * @inner - * @function - * @param {String} [extension] - * @returns {Boolean} - */ - function imageFormatSupported( extension ) { - extension = extension ? extension : ""; - return !!FILEFORMATS[ extension.toLowerCase() ]; - }; - /** - * Parses an XML string into a DOM Document. - * @private - * @inner - * @function - * @name OpenSeadragon.parseXml - * @param {String} string - * @returns {Document} - */ - function parseXml( string ) { - //TODO: yet another example where we can determine the correct - // implementation once at start-up instead of everytime we use - // the function. DONE. - if ( window.ActiveXObject ) { - - $.parseXml = function( string ){ - var xmlDoc = null, - parser; - - xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); - xmlDoc.async = false; - xmlDoc.loadXML( string ); - return xmlDoc; - }; - - } else if ( window.DOMParser ) { - - $.parseXml = function( string ){ - var xmlDoc = null, - parser; - - parser = new DOMParser(); - xmlDoc = parser.parseFromString( string, "text/xml" ); - return xmlDoc; - }; - - } else { - throw new Error( "Browser doesn't support XML DOM." ); - } - - return $.parseXml( string ); - }; }( OpenSeadragon )); @@ -1819,6 +1855,12 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ /** * For use by classes which want to support custom, non-browser events. + * TODO: This is an aweful name! This thing represents an "event source", + * not an "event handler". PLEASE change the to EventSource. Also please + * change 'addHandler', 'removeHandler' and 'raiseEvent' to 'bind', + * 'unbind', and 'trigger' respectively. Finally add a method 'one' which + * automatically unbinds a listener after the first triggered event that + * matches. * @class */ $.EventHandler = function() { @@ -3385,22 +3427,19 @@ $.Viewer = function( options ) { } if ( this.tileSources ){ - //tileSources is a complex option... - //It can be a string, object, function, or an array of any of these. - // - A String implies a DZI - // - An Srray of Objects implies a simple image - // - A Function implies a custom tile source callback - // - An Array that is not an Array of simple Objects implies a sequence - // of tile sources which can be any of the above + // tileSources is a complex option... + // + // It can be a string, object, or an array of any of strings and objects. + // At this point we only care about if it is an Array or not. + // if( $.isArray( this.tileSources ) ){ - if( $.isPlainObject( this.tileSources[ 0 ] ) ){ - //This is a non-sequenced legacy tile source - initialTileSource = this.tileSources; - } else { - //Sequenced tile source - initialTileSource = this.tileSources[ 0 ]; + + //must be a sequence of tileSource since the first item + //is a legacy tile source + if( this.tileSources.length > 1 ){ THIS[ this.hash ].sequenced = true; - } + } + initialTileSource = this.tileSources[ 0 ]; } else { initialTileSource = this.tileSources; } @@ -3495,6 +3534,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, * If the string is xml is simply parsed and opened, otherwise the string * is treated as an URL and an xml document is requested via ajax, parsed * and then opened in the viewer. + * @deprecated - use 'open' instead. * @function * @name OpenSeadragon.Viewer.prototype.openDzi * @param {String} dzi and xml string or the url to a DZI xml document. @@ -3513,33 +3553,66 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, }, /** + * tileSources is a complex option... + * + * It can be a string, object, function, or an array of any of these: + * + * - A String implies a url used to determine the tileSource implementation + * based on the file extension of url. JSONP is implied by *.js, + * otherwise the url is retrieved as text and the resulting text is + * introspected to determine if its json, xml, or text and parsed. + * - An Object implies an inline configuration which has a single + * property sufficient for being able to determine tileSource + * implementation. If the object has a property which is a function + * named 'getTileUrl', it is treated as a custom TileSource. + * - An Array implies a one of two cases: + * 1) Its a legacy tile source if it is an array of objects and at + * least one object satisfies the conditions of having a 'height', + * 'width', and 'url'. + * 2) It's a sequence of tileSources, each item of which applying the + * rules above independently * @function * @name OpenSeadragon.Viewer.prototype.openTileSource * @return {OpenSeadragon.Viewer} Chainable. */ openTileSource: function ( tileSource ) { var _this = this, - customTileSource; + customTileSource, + readySource, + $TileSource, + options; setTimeout(function(){ if ( $.type( tileSource ) == 'string') { - //Standard DZI format - _this.openDzi( tileSource ); - } else if ( $.isArray( tileSource ) ){ - //Legacy image pyramid - _this.open( new $.LegacyTileSource( tileSource ) ); - } else if ( $.isPlainObject( tileSource ) && $.isFunction( tileSource.getTileUrl ) ){ - //Custom tile source - customTileSource = new $.TileSource( - tileSource.width, - tileSource.height, - tileSource.tileSize, - tileSource.tileOverlap, - tileSource.minLevel, - tileSource.maxLevel - ); - customTileSource.getTileUrl = tileSource.getTileUrl; - _this.open( customTileSource ); + //TODO: We cant assume a string implies a dzi since all + //complete TileSource implementations should have a getInfo + //which allows them to be configured via AJAX. Im not sure + //if its better to use file extension or url pattern, or to + //inspect the resulting info object. + tileSource = new $.TileSource( tileSource, function( readySource ){ + _this.open( readySource ); + }); + + } else if ( $.isPlainObject( tileSource ) ){ + if( $.isFunction( tileSource.getTileUrl ) ){ + //Custom tile source + customTileSource = new $.TileSource( + tileSource.width, + tileSource.height, + tileSource.tileSize, + tileSource.tileOverlap, + tileSource.minLevel, + tileSource.maxLevel + ); + customTileSource.getTileUrl = tileSource.getTileUrl; + _this.open( customTileSource ); + } else { + //inline configuration + $TileSource = $.TileSource.determineType( _this, tileSource ); + options = $TileSource.prototype.configure.apply( _this, [ tileSource ]); + readySource = new $TileSource( options ); + _this.open( readySource ); + } } else { //can assume it's already a tile source implementation _this.open( tileSource ); @@ -3591,8 +3664,19 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, wrapHorizontal: this.wrapHorizontal, wrapVertical: this.wrapVertical }); + if( this.preserveVewport ){ + this.viewport.resetContentSize( this.source.dimensions ); + + } else if( this.defaultZoomLevel ){ + + this.viewport.zoomTo( + this.defaultZoomLevel, + this.viewport.getCenter(), + true + ); + } this.drawer = new $.Drawer({ @@ -4135,6 +4219,40 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, } + } + }, + + goToPage: function( page ){ + //page is a 1 based index so normalize now + //page = page; + if( this.tileSources.length > page ){ + + THIS[ this.hash ].sequence = page; + + if( this.nextButton ){ + if( ( this.tileSources.length - 1 ) === page ){ + //Disable next button + this.nextButton.disable(); + } else { + this.nextButton.enable(); + } + } + if( this.previousButton ){ + if( page > 0 ){ + //Enable previous button + this.previousButton.enable(); + } else { + this.previousButton.disable(); + } + } + + this.openTileSource( this.tileSources[ page ] ); + } + if( $.isFunction( this.onPageChange ) ){ + this.onPageChange({ + page: page, + viewer: this + }); } } @@ -4488,44 +4606,14 @@ function onFullPage() { function onPrevious(){ - var previous = THIS[ this.hash ].sequence - 1, - preserveVewport = true; - if( previous >= 0 ){ - - THIS[ this.hash ].sequence = previous; - - if( 0 === previous ){ - //Disable previous button - this.previousButton.disable(); - } - if( this.tileSources.length > 0 ){ - //Enable next button - this.nextButton.enable(); - } - - this.openTileSource( this.tileSources[ previous ] ); - } + var previous = THIS[ this.hash ].sequence - 1; + this.goToPage( previous ); }; function onNext(){ - var next = THIS[ this.hash ].sequence + 1, - preserveVewport = true; - if( this.tileSources.length > next ){ - - THIS[ this.hash ].sequence = next; - - if( ( this.tileSources.length - 1 ) === next ){ - //Disable next button - this.nextButton.disable(); - } - if( next > 0 ){ - //Enable previous button - this.previousButton.enable(); - } - - this.openTileSource( this.tileSources[ next ] ); - } + var next = THIS[ this.hash ].sequence + 1; + this.goToPage( next ); }; @@ -5056,33 +5144,136 @@ $.Point.prototype = { /** + * The TileSource contains the most basic implementation required to create a + * smooth transition between layer in an image pyramid. It has only a single key + * interface that must be implemented to complete it key functionality: + * 'getTileUrl'. It also has several optional interfaces that can be + * implemented if a new TileSource wishes to support configuration via a simple + * object or array ('configure') and if the tile source supports or requires + * configuration via retreival of a document on the network ala AJAX or JSONP, + * ('getImageInfo'). + *
+ * By default the image pyramid is split into N layers where the images longest + * side in M (in pixels), where N is the smallest integer which satisfies + * 2^(N+1) >= M. * @class - * @param {Number} width + * @extends OpenSeadragon.EventHandler + * @param {Number|Object|Array|String} width + * If more than a single argument is supplied, the traditional use of + * positional parameters is supplied and width is expected to be the width + * source image at it's max resolution in pixels. If a single argument is supplied and + * it is an Object or Array, the construction is assumed to occur through + * the extending classes implementation of 'configure'. Finally if only a + * single argument is supplied and it is a String, the extending class is + * expected to implement 'getImageInfo' and 'configure'. * @param {Number} height + * Width of the source image at max resolution in pixels. * @param {Number} tileSize + * The size of the tiles to assumed to make up each pyramid layer in pixels. + * Tile size determines the point at which the image pyramid must be + * divided into a matrix of smaller images. * @param {Number} tileOverlap + * The number of pixels each tile is expected to overlap touching tiles. * @param {Number} minLevel + * The minimum level to attempt to load. * @param {Number} maxLevel + * The maximum level to attempt to load. * @property {Number} aspectRatio - * @property {Number} dimensions + * Ratio of width to height + * @property {OpenSeadragon.Point} dimensions + * Vector storing x and y dimensions ( width and height respectively ). * @property {Number} tileSize + * The size of the image tiles used to compose the image. * @property {Number} tileOverlap + * The overlap in pixels each tile shares with it's adjacent neighbors. * @property {Number} minLevel + * The minimum pyramid level this tile source supports or should attempt to load. * @property {Number} maxLevel + * The maximum pyramid level this tile source supports or should attempt to load. */ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) { - this.aspectRatio = width / height; - this.dimensions = new $.Point( width, height ); - this.tileSize = tileSize ? tileSize : 0; - this.tileOverlap = tileOverlap ? tileOverlap : 0; - this.minLevel = minLevel ? minLevel : 0; - this.maxLevel = maxLevel ? maxLevel : - Math.ceil( - Math.log( Math.max( width, height ) ) / - Math.log( 2 ) + var _this = this, + callback = null, + readyHandler = null, + args = arguments, + options, + i; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: args[0], + height: args[1], + tileSize: args[2], + tileOverlap: args[3], + minlevel: args[4], + maxLevel: args[5] + }; + } + + //Tile sources supply some events, namely 'ready' when they must be configured + //by asyncronously fetching their configuration data. + $.EventHandler.call( this ); + + //we allow options to override anything we dont treat as + //required via idiomatic options or which is functionally + //set depending on the state of the readiness of this tile + //source + $.extend( true, this, options ); + + //Any functions that are passed as arguments are bound to the ready callback + for( i = 0; i < arguments.length; i++ ){ + if( $.isFunction( arguments[i] ) ){ + callback = arguments[ i ]; + this.addHandler( 'ready', function( placeHolderSource, readySource ){ + callback( readySource ); + }); + //only one callback per constructor + break; + } + } + + if( 'string' == $.type( arguments[ 0 ] ) ){ + //in case the getImageInfo method is overriden and/or implies an + //async mechanism set some safe defaults first + this.aspectRatio = 1; + this.dimensions = new $.Point( 10, 10 ); + this.tileSize = 0; + this.tileOverlap = 0; + this.minLevel = 0; + this.maxLevel = 0; + this.ready = false; + //configuration via url implies the extending class + //implements and 'configure' + this.getImageInfo( arguments[ 0 ] ); + + } else { + + //explicit configuration via positional args in constructor + //or the more idiomatic 'options' object + this.ready = true; + this.aspectRatio = ( options.width && options.height ) ? + ( options.width / options.height ) : 1; + this.dimensions = new $.Point( options.width, options.height ); + this.tileSize = options.tileSize ? options.tileSize : 0; + this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; + this.minLevel = options.minLevel ? options.minLevel : 0; + this.maxLevel = options.maxLevel ? options.maxLevel : ( + ( options.width && options.height ) ? Math.ceil( + Math.log( Math.max( options.width, options.height ) ) / + Math.log( 2 ) + ) : 0 ); + if( callback && $.isFunction( callback ) ){ + callback( this ); + } + } + + }; + $.TileSource.prototype = { /** @@ -5151,6 +5342,107 @@ $.TileSource.prototype = { }, /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function( url ) { + var _this = this, + url = url, + error, + callbackName, + callback, + readySource, + options, + urlParts, + filename, + lastDot, + tilesUrl; + + + if( url ) { + urlParts = url.split( '/' ); + filename = urlParts[ urlParts.length - 1 ]; + lastDot = filename.lastIndexOf( '.' ); + if ( lastDot > -1 ) { + urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); + } + } + + callback = function( data ){ + var $TileSource = $.TileSource.determineType( _this, data, url ); + options = $TileSource.prototype.configure.apply( _this, [ data, url ]); + readySource = new $TileSource( options ); + _this.ready = true; + _this.raiseEvent( 'ready', readySource ); + }; + + if( url.match(/\.js$/) ){ + //TODO: Its not very flexible to require tile sources to end jsonp + // request for info with a url that ends with '.js' but for + // now it's the only way I see to distinguish uniformly. + callbackName = url.split( '/' ).pop().replace('.js',''); + $.jsonp({ + url: url, + async: false, + callbackName: callbackName, + callback: callback + }); + } else { + //TODO: struggling a little with TileSource rewrite to make info + // requests work asyncronously. For now I'm opting to make + // all xhr info request syncronous. + $.makeAjaxRequest( url, function( xhr ) { + var data = processResponse( xhr ); + callback( data ); + }); + } + + }, + + /** + * Responsible determining if a the particular TileSource supports the + * data format ( and allowed to apply logic against the url the data was + * loaded from, if any ). Overriding implementations are expected to do + * something smart with data and / or url to determine support. Also + * understand that iteration order of TileSources is not guarunteed so + * please make sure your data or url is expressive enough to ensure a simple + * and sufficient mechanisim for clear determination. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Boolean} + */ + supports: function( data, url ) { + return false; + }, + + /** + * Responsible for parsing and configuring the + * image metadata pertinent to this TileSources implementation. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Array} args - Returns an array containing the normalized values + * of the positional parameters for the constructor of the implementing + * tile source. + * @throws {Error} + */ + configure: function( data, url ) { + throw new Error( "Method not implemented." ); + }, + + /** + * Responsible for retriving the url which will return an image for the + * region speified by the given x, y, and level components. * This method is not implemented by this class other than to throw an Error * announcing you have to implement it. Because of the variety of tile * server technologies, and various specifications for building image @@ -5182,6 +5474,75 @@ $.TileSource.prototype = { } }; + +$.extend( true, $.TileSource.prototype, $.EventHandler.prototype ); + + +/** + * Decides whether to try to process the response as xml, json, or hand back + * the text + * @eprivate + * @inner + * @function + * @param {XMLHttpRequest} xhr - the completed network request + */ +function processResponse( xhr ){ + var responseText = xhr.responseText, + status = xhr.status, + statusText, + data; + + if ( !xhr ) { + throw new Error( $.getString( "Errors.Security" ) ); + } else if ( xhr.status !== 200 && xhr.status !== 0 ) { + status = xhr.status; + statusText = ( status == 404 ) ? + "Not Found" : + xhr.statusText; + throw new Error( $.getString( "Errors.Status", status, statusText ) ); + } + + if( responseText.match(/\s*<.*/) ){ + try{ + data = ( xhr.responseXML && xhr.responseXML.documentElement ) ? + xhr.responseXML : + $.parseXml( responseText ); + } catch (e){ + data = xhr.responseText; + } + }else if( responseText.match(/\s*[\{\[].*/) ){ + data = eval( responseText ); + }else{ + data = responseText; + } + return data; +}; + + +/** + * Determines the TileSource Implementation by introspection of OpenSeadragon + * namespace, calling each TileSource implementation of 'isType' + * @eprivate + * @inner + * @function + * @param {Object|Array} data - the tile source configuration object + * @param {String} url - the url where the tile source configuration object was + * loaded from, if any. + */ +$.TileSource.determineType = function( tileSource, data, url ){ + var property; + for( property in OpenSeadragon ){ + if( property.match(/.+TileSource$/) && + $.isFunction( OpenSeadragon[ property ] ) && + $.isFunction( OpenSeadragon[ property ].prototype.supports ) && + OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url ) + ){ + return OpenSeadragon[ property ]; + } + } +}; + + }( OpenSeadragon )); (function( $ ){ @@ -5203,14 +5564,27 @@ $.TileSource.prototype = { $.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects ) { var i, rect, - level; - - $.TileSource.call( this, width, height, tileSize, tileOverlap, null, null ); + level, + options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[ 0 ], + height: arguments[ 1 ], + tileSize: arguments[ 2 ], + tileOverlap: arguments[ 3 ], + tilesUrl: arguments[ 4 ], + fileFormat: arguments[ 5 ], + dispRects: arguments[ 6 ] + }; + } this._levelRects = {}; - this.tilesUrl = tilesUrl; - this.fileFormat = fileFormat; - this.displayRects = displayRects; + this.tilesUrl = options.tilesUrl; + this.fileFormat = options.fileFormat; + this.displayRects = options.displayRects; if ( this.displayRects ) { for ( i = this.displayRects.length - 1; i >= 0; i-- ) { @@ -5223,11 +5597,80 @@ $.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, file } } } + + $.TileSource.apply( this, [ options ] ); }; $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { - + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @name OpenSeadragon.DziTileSource.prototype.supports + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.Image && + "http://schemas.microsoft.com/deepzoom/2008" == data.Image.xmlns + ) || ( + data.documentElement && + "Image" == data.documentElement.tagName && + "http://schemas.microsoft.com/deepzoom/2008" == + data.documentElement.namespaceURI + ); + }, + + + /** + * + * @function + * @name OpenSeadragon.DziTileSource.prototype.configure + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retreived from if any. + * @return {Array} args - positional arguments required and/or optional + * for this tile sources constructor + */ + configure: function( configuration, dataUrl ){ + + var dziPath, + dziName, + tilesUrl, + options, + host; + + if( configuration instanceof XMLDocument ){ + + options = configureFromXML( this, configuration ); + + }else if( 'object' == $.type( configuration) ){ + + options = configureFromObject( this, configuration ); + } + + if( dataUrl && !options.tilesUrl ){ + if( !( 'http' == dataUrl.substring( 0, 4 ) ) ){ + host = location.protocol + '//' + location.host; + } + dziPath = dataUrl.split('/'); + dziName = dziPath.pop(); + dziName = dziName.substring(0, dziName.indexOf('.')); + dziPath = '/' + dziPath.join('/') + '/' + dziName + '_files/'; + tilesUrl = dziPath; + if( host ){ + tilesUrl = host + tilesUrl; + } + options.tilesUrl = tilesUrl; + } + + return options; + }, + + /** * @function * @name OpenSeadragon.DziTileSource.prototype.getTileUrl @@ -5239,6 +5682,7 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat ].join( '' ); }, + /** * @function * @name OpenSeadragon.DziTileSource.prototype.tileExists @@ -5288,6 +5732,147 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { }); +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + displayRects = [], + dispRectNodes, + dispRectNode, + rectNode, + sizeNode, + i; + + if ( rootName == "Image" ) { + + try { + sizeNode = root.getElementsByTagName( "Size" )[ 0 ]; + conf = { + Image: { + xmlns: "http://schemas.microsoft.com/deepzoom/2008", + Format: root.getAttribute( "Format" ), + DisplayRect: null, + Overlap: parseInt( root.getAttribute( "Overlap" ) ), + TileSize: parseInt( root.getAttribute( "TileSize" ) ), + Size: { + Height: parseInt( sizeNode.getAttribute( "Height" ) ), + Width: parseInt( sizeNode.getAttribute( "Width" ) ) + } + } + }; + + if ( !$.imageFormatSupported( conf.Image.Format ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", conf.Image.Format.toUpperCase() ) + ); + } + + dispRectNodes = root.getElementsByTagName( "DisplayRect" ); + for ( i = 0; i < dispRectNodes.length; i++ ) { + dispRectNode = dispRectNodes[ i ]; + rectNode = dispRectNode.getElementsByTagName( "Rect" )[ 0 ]; + + displayRects.push({ + Rect: { + X: parseInt( rectNode.getAttribute( "X" ) ), + Y: parseInt( rectNode.getAttribute( "Y" ) ), + Width: parseInt( rectNode.getAttribute( "Width" ) ), + Height: parseInt( rectNode.getAttribute( "Height" ) ), + MinLevel: 0, // ignore MinLevel attribute, bug in Deep Zoom Composer + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + } + }); + } + + if( displayRects.length ){ + conf.Image.DisplayRect = displayRects; + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( $.getString("Errors.Dzi") ); + } + } else if ( rootName == "Collection" ) { + throw new Error( $.getString( "Errors.Dzc" ) ); + } else if ( rootName == "Error" ) { + return processDZIError( root ); + } + + throw new Error( $.getString( "Errors.Dzi" ) ); +}; + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + var imageData = configuration.Image, + tilesUrl = imageData.Url, + fileFormat = imageData.Format, + sizeData = imageData.Size, + dispRectData = imageData.DisplayRect || [], + width = parseInt( sizeData.Width ), + height = parseInt( sizeData.Height ), + tileSize = parseInt( imageData.TileSize ), + tileOverlap = parseInt( imageData.Overlap ), + dispRects = [], + rectData, + i; + + //TODO: need to figure out out to better handle image format compatibility + // which actually includes additional file formats like xml and pdf + // and plain text for various tilesource implementations to avoid low + // level errors. + // + // For now, just don't perform the check. + // + /*if ( !imageFormatSupported( fileFormat ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() ) + ); + }*/ + + for ( i = 0; i < dispRectData.length; i++ ) { + rectData = dispRectData[ i ].Rect; + + dispRects.push( new $.DisplayRect( + parseInt( rectData.X ), + parseInt( rectData.Y ), + parseInt( rectData.Width ), + parseInt( rectData.Height ), + 0, // ignore MinLevel attribute, bug in Deep Zoom Composer + parseInt( rectData.MaxLevel ) + )); + } + + + return { + width: width, /* width *required */ + height: height, /* height *required */ + tileSize: tileSize, /* tileSize *required */ + tileOverlap: tileOverlap, /* tileOverlap *required */ + minLevel: null, /* minLevel */ + maxLevel: null, /* maxLevel */ + tilesUrl: tilesUrl, /* tilesUrl */ + fileFormat: fileFormat, /* fileFormat */ + dispRects: dispRects /* dispRects */ + }; + +}; }( OpenSeadragon )); @@ -5302,10 +5887,10 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { * resolution image and a high resolution image in standard web formats like * png or jpg. * @class - * @param {Array} files An array of file descriptions, each is an object with + * @param {Array} levels An array of file descriptions, each is an object with * a 'url', a 'width', and a 'height'. Overriding classes can expect more * properties but these properties are sufficient for this implementation. - * Additionally, the files are required to be listed in order from + * Additionally, the levels are required to be listed in order from * smallest to largest. * @property {Number} aspectRatio * @property {Number} dimensions @@ -5313,25 +5898,85 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { * @property {Number} tileOverlap * @property {Number} minLevel * @property {Number} maxLevel - * @property {Array} files + * @property {Array} levels */ -$.LegacyTileSource = function( files ) { - var width = files[ files.length - 1 ].width, - height = files[ files.length - 1 ].height; +$.LegacyTileSource = function( levels ) { - $.TileSource.apply( this, [ - width, - height, - Math.max( height, width ), //tileSize - 0, //overlap - 0, //mimLevel - files.length - 1 //maxLevel - ] ); + var options, + width, + height; - this.files = files; + if( $.isArray( levels ) ){ + options = { + type: 'legacy-image-pyramid', + levels: levels + }; + } + + //clean up the levels to make sure we support all formats + options.levels = filterFiles( options.levels ); + width = options.levels[ options.levels.length - 1 ].width; + height = options.levels[ options.levels.length - 1 ].height; + + $.extend( true, options, { + width: width, + height: height, + tileSize: Math.max( height, width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length - 1 + }); + + $.TileSource.apply( this, [ options ] ); + + this.levels = options.levels; }; $.LegacyTileSource.prototype = { + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @name OpenSeadragon.DziTileSource.prototype.supports + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "legacy-image-pyramid" == data.type + ) || ( + data.documentElement && + "legacy-image-pyramid" == data.documentElement.getAttribute('type') + ); + }, + + + /** + * + * @function + * @name OpenSeadragon.DziTileSource.prototype.configure + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retreived from if any. + * @return {Array} args - positional arguments required and/or optional + * for this tile sources constructor + */ + configure: function( configuration, dataUrl ){ + + var options; + + if( configuration instanceof XMLDocument ){ + + options = configureFromXML( this, configuration ); + + }else if( 'object' == $.type( configuration) ){ + + options = configureFromObject( this, configuration ); + } + + return options; + + }, /** * @function @@ -5341,8 +5986,8 @@ $.LegacyTileSource.prototype = { var levelScale = NaN; if ( level >= this.minLevel && level <= this.maxLevel ){ levelScale = - this.files[ level ].width / - this.files[ this.maxLevel ].width; + this.levels[ level ].width / + this.levels[ this.maxLevel ].width; } return levelScale; }, @@ -5389,10 +6034,10 @@ $.LegacyTileSource.prototype = { */ getTileBounds: function( level, x, y ) { var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ), - px = ( x === 0 ) ? 0 : this.files[ level ].width, - py = ( y === 0 ) ? 0 : this.files[ level ].height, - sx = this.files[ level ].width, - sy = this.files[ level ].height, + px = ( x === 0 ) ? 0 : this.levels[ level ].width, + py = ( y === 0 ) ? 0 : this.levels[ level ].height, + sx = this.levels[ level ].width, + sy = this.levels[ level ].height, scale = 1.0 / ( this.width >= this.height ? dimensionsScaled.y : dimensionsScaled.x @@ -5418,7 +6063,7 @@ $.LegacyTileSource.prototype = { getTileUrl: function( level, x, y ) { var url = null; if( level >= this.minLevel && level <= this.maxLevel ){ - url = this.files[ level ].url; + url = this.levels[ level ].url; } return url; }, @@ -5440,6 +6085,106 @@ $.LegacyTileSource.prototype = { } }; +/** + * This method removes any files from the Array which dont conform to our + * basic requirements for a 'level' in the LegacyTileSource. + * @private + * @inner + * @function + */ +function filterFiles( files ){ + var filtered = [], + file, + i; + for( i = 0; i < files.length; i++ ){ + file = files[ i ]; + if( file.height && + file.width && + file.url && ( + file.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)$/) || ( + file.mimetype && + file.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/) + ) + ) ){ + //This is sufficient to serve as a level + filtered.push({ + url: file.url, + width: Number( file.width ), + height: Number( file.height ) + }); + } + } + + return filtered.sort(function(a,b){ + return a.height - b.height; + }); + +}; + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + levels = [], + level, + i; + + if ( rootName == "image" ) { + + try { + conf = { + type: root.getAttribute( "type" ), + levels: [] + }; + + levels = root.getElementsByTagName( "level" ); + for ( i = 0; i < levels.length; i++ ) { + level = levels[ i ]; + + conf.levels .push({ + url: level.getAttribute( "url" ), + width: parseInt( level.getAttribute( "width" ) ), + height: parseInt( level.getAttribute( "height" ) ) + }); + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( 'Unknown error parsing Legacy Image Pyramid XML.' ); + } + } else if ( rootName == "collection" ) { + throw new Error( 'Legacy Image Pyramid Collections not yet supported.' ); + } else if ( rootName == "error" ) { + throw new Error( 'Error: ' + xmlDoc ); + } + + throw new Error( 'Unknown element ' + rootName ); +}; + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + + return configuration.levels; + +}; + }( OpenSeadragon )); @@ -6505,7 +7250,7 @@ var TIMEOUT = 5000, ), USE_CANVAS = SUBPIXEL_RENDERING - && !( DEVICE_SCREEN.x < 600 || DEVICE_SCREEN.y < 600 ) + && !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) && !( navigator.appVersion.match( 'Mobile' ) ) && $.isFunction( document.createElement( "canvas" ).getContext ); diff --git a/src/drawer.js b/src/drawer.js index 8488d31b..68b84f3d 100644 --- a/src/drawer.js +++ b/src/drawer.js @@ -15,7 +15,7 @@ var TIMEOUT = 5000, ), USE_CANVAS = SUBPIXEL_RENDERING - && !( DEVICE_SCREEN.x < 600 || DEVICE_SCREEN.y < 600 ) + && !( DEVICE_SCREEN.x <= 400 || DEVICE_SCREEN.y <= 400 ) && !( navigator.appVersion.match( 'Mobile' ) ) && $.isFunction( document.createElement( "canvas" ).getContext ); diff --git a/src/dzitilesource.js b/src/dzitilesource.js index 30866fcd..ef883bbc 100644 --- a/src/dzitilesource.js +++ b/src/dzitilesource.js @@ -18,14 +18,27 @@ $.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, fileFormat, displayRects ) { var i, rect, - level; - - $.TileSource.call( this, width, height, tileSize, tileOverlap, null, null ); + level, + options; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: arguments[ 0 ], + height: arguments[ 1 ], + tileSize: arguments[ 2 ], + tileOverlap: arguments[ 3 ], + tilesUrl: arguments[ 4 ], + fileFormat: arguments[ 5 ], + dispRects: arguments[ 6 ] + }; + } this._levelRects = {}; - this.tilesUrl = tilesUrl; - this.fileFormat = fileFormat; - this.displayRects = displayRects; + this.tilesUrl = options.tilesUrl; + this.fileFormat = options.fileFormat; + this.displayRects = options.displayRects; if ( this.displayRects ) { for ( i = this.displayRects.length - 1; i >= 0; i-- ) { @@ -38,11 +51,80 @@ $.DziTileSource = function( width, height, tileSize, tileOverlap, tilesUrl, file } } } + + $.TileSource.apply( this, [ options ] ); }; $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { - + + + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @name OpenSeadragon.DziTileSource.prototype.supports + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.Image && + "http://schemas.microsoft.com/deepzoom/2008" == data.Image.xmlns + ) || ( + data.documentElement && + "Image" == data.documentElement.tagName && + "http://schemas.microsoft.com/deepzoom/2008" == + data.documentElement.namespaceURI + ); + }, + + + /** + * + * @function + * @name OpenSeadragon.DziTileSource.prototype.configure + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retreived from if any. + * @return {Array} args - positional arguments required and/or optional + * for this tile sources constructor + */ + configure: function( configuration, dataUrl ){ + + var dziPath, + dziName, + tilesUrl, + options, + host; + + if( configuration instanceof XMLDocument ){ + + options = configureFromXML( this, configuration ); + + }else if( 'object' == $.type( configuration) ){ + + options = configureFromObject( this, configuration ); + } + + if( dataUrl && !options.tilesUrl ){ + if( !( 'http' == dataUrl.substring( 0, 4 ) ) ){ + host = location.protocol + '//' + location.host; + } + dziPath = dataUrl.split('/'); + dziName = dziPath.pop(); + dziName = dziName.substring(0, dziName.indexOf('.')); + dziPath = '/' + dziPath.join('/') + '/' + dziName + '_files/'; + tilesUrl = dziPath; + if( host ){ + tilesUrl = host + tilesUrl; + } + options.tilesUrl = tilesUrl; + } + + return options; + }, + + /** * @function * @name OpenSeadragon.DziTileSource.prototype.getTileUrl @@ -54,6 +136,7 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { return [ this.tilesUrl, level, '/', x, '_', y, '.', this.fileFormat ].join( '' ); }, + /** * @function * @name OpenSeadragon.DziTileSource.prototype.tileExists @@ -103,5 +186,146 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, { }); +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + displayRects = [], + dispRectNodes, + dispRectNode, + rectNode, + sizeNode, + i; + + if ( rootName == "Image" ) { + + try { + sizeNode = root.getElementsByTagName( "Size" )[ 0 ]; + conf = { + Image: { + xmlns: "http://schemas.microsoft.com/deepzoom/2008", + Format: root.getAttribute( "Format" ), + DisplayRect: null, + Overlap: parseInt( root.getAttribute( "Overlap" ) ), + TileSize: parseInt( root.getAttribute( "TileSize" ) ), + Size: { + Height: parseInt( sizeNode.getAttribute( "Height" ) ), + Width: parseInt( sizeNode.getAttribute( "Width" ) ) + } + } + }; + + if ( !$.imageFormatSupported( conf.Image.Format ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", conf.Image.Format.toUpperCase() ) + ); + } + + dispRectNodes = root.getElementsByTagName( "DisplayRect" ); + for ( i = 0; i < dispRectNodes.length; i++ ) { + dispRectNode = dispRectNodes[ i ]; + rectNode = dispRectNode.getElementsByTagName( "Rect" )[ 0 ]; + + displayRects.push({ + Rect: { + X: parseInt( rectNode.getAttribute( "X" ) ), + Y: parseInt( rectNode.getAttribute( "Y" ) ), + Width: parseInt( rectNode.getAttribute( "Width" ) ), + Height: parseInt( rectNode.getAttribute( "Height" ) ), + MinLevel: 0, // ignore MinLevel attribute, bug in Deep Zoom Composer + MaxLevel: parseInt( dispRectNode.getAttribute( "MaxLevel" ) ) + } + }); + } + + if( displayRects.length ){ + conf.Image.DisplayRect = displayRects; + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( $.getString("Errors.Dzi") ); + } + } else if ( rootName == "Collection" ) { + throw new Error( $.getString( "Errors.Dzc" ) ); + } else if ( rootName == "Error" ) { + return processDZIError( root ); + } + + throw new Error( $.getString( "Errors.Dzi" ) ); +}; + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + var imageData = configuration.Image, + tilesUrl = imageData.Url, + fileFormat = imageData.Format, + sizeData = imageData.Size, + dispRectData = imageData.DisplayRect || [], + width = parseInt( sizeData.Width ), + height = parseInt( sizeData.Height ), + tileSize = parseInt( imageData.TileSize ), + tileOverlap = parseInt( imageData.Overlap ), + dispRects = [], + rectData, + i; + + //TODO: need to figure out out to better handle image format compatibility + // which actually includes additional file formats like xml and pdf + // and plain text for various tilesource implementations to avoid low + // level errors. + // + // For now, just don't perform the check. + // + /*if ( !imageFormatSupported( fileFormat ) ) { + throw new Error( + $.getString( "Errors.ImageFormat", fileFormat.toUpperCase() ) + ); + }*/ + + for ( i = 0; i < dispRectData.length; i++ ) { + rectData = dispRectData[ i ].Rect; + + dispRects.push( new $.DisplayRect( + parseInt( rectData.X ), + parseInt( rectData.Y ), + parseInt( rectData.Width ), + parseInt( rectData.Height ), + 0, // ignore MinLevel attribute, bug in Deep Zoom Composer + parseInt( rectData.MaxLevel ) + )); + } + + + return { + width: width, /* width *required */ + height: height, /* height *required */ + tileSize: tileSize, /* tileSize *required */ + tileOverlap: tileOverlap, /* tileOverlap *required */ + minLevel: null, /* minLevel */ + maxLevel: null, /* maxLevel */ + tilesUrl: tilesUrl, /* tilesUrl */ + fileFormat: fileFormat, /* fileFormat */ + dispRects: dispRects /* dispRects */ + }; + +}; }( OpenSeadragon )); diff --git a/src/eventhandler.js b/src/eventhandler.js index 5d6e21a3..95714ca0 100644 --- a/src/eventhandler.js +++ b/src/eventhandler.js @@ -3,6 +3,12 @@ /** * For use by classes which want to support custom, non-browser events. + * TODO: This is an aweful name! This thing represents an "event source", + * not an "event handler". PLEASE change the to EventSource. Also please + * change 'addHandler', 'removeHandler' and 'raiseEvent' to 'bind', + * 'unbind', and 'trigger' respectively. Finally add a method 'one' which + * automatically unbinds a listener after the first triggered event that + * matches. * @class */ $.EventHandler = function() { diff --git a/src/legacytilesource.js b/src/legacytilesource.js index b551169e..04208950 100644 --- a/src/legacytilesource.js +++ b/src/legacytilesource.js @@ -10,10 +10,10 @@ * resolution image and a high resolution image in standard web formats like * png or jpg. * @class - * @param {Array} files An array of file descriptions, each is an object with + * @param {Array} levels An array of file descriptions, each is an object with * a 'url', a 'width', and a 'height'. Overriding classes can expect more * properties but these properties are sufficient for this implementation. - * Additionally, the files are required to be listed in order from + * Additionally, the levels are required to be listed in order from * smallest to largest. * @property {Number} aspectRatio * @property {Number} dimensions @@ -21,25 +21,85 @@ * @property {Number} tileOverlap * @property {Number} minLevel * @property {Number} maxLevel - * @property {Array} files + * @property {Array} levels */ -$.LegacyTileSource = function( files ) { - var width = files[ files.length - 1 ].width, - height = files[ files.length - 1 ].height; +$.LegacyTileSource = function( levels ) { - $.TileSource.apply( this, [ - width, - height, - Math.max( height, width ), //tileSize - 0, //overlap - 0, //mimLevel - files.length - 1 //maxLevel - ] ); + var options, + width, + height; - this.files = files; + if( $.isArray( levels ) ){ + options = { + type: 'legacy-image-pyramid', + levels: levels + }; + } + + //clean up the levels to make sure we support all formats + options.levels = filterFiles( options.levels ); + width = options.levels[ options.levels.length - 1 ].width; + height = options.levels[ options.levels.length - 1 ].height; + + $.extend( true, options, { + width: width, + height: height, + tileSize: Math.max( height, width ), + tileOverlap: 0, + minLevel: 0, + maxLevel: options.levels.length - 1 + }); + + $.TileSource.apply( this, [ options ] ); + + this.levels = options.levels; }; $.LegacyTileSource.prototype = { + /** + * Determine if the data and/or url imply the image service is supported by + * this tile source. + * @function + * @name OpenSeadragon.DziTileSource.prototype.supports + * @param {Object|Array} data + * @param {String} optional - url + */ + supports: function( data, url ){ + return ( + data.type && + "legacy-image-pyramid" == data.type + ) || ( + data.documentElement && + "legacy-image-pyramid" == data.documentElement.getAttribute('type') + ); + }, + + + /** + * + * @function + * @name OpenSeadragon.DziTileSource.prototype.configure + * @param {Object|XMLDocument} configuration - the raw configuration + * @param {String} dataUrl - the url the data was retreived from if any. + * @return {Array} args - positional arguments required and/or optional + * for this tile sources constructor + */ + configure: function( configuration, dataUrl ){ + + var options; + + if( configuration instanceof XMLDocument ){ + + options = configureFromXML( this, configuration ); + + }else if( 'object' == $.type( configuration) ){ + + options = configureFromObject( this, configuration ); + } + + return options; + + }, /** * @function @@ -49,8 +109,8 @@ $.LegacyTileSource.prototype = { var levelScale = NaN; if ( level >= this.minLevel && level <= this.maxLevel ){ levelScale = - this.files[ level ].width / - this.files[ this.maxLevel ].width; + this.levels[ level ].width / + this.levels[ this.maxLevel ].width; } return levelScale; }, @@ -97,10 +157,10 @@ $.LegacyTileSource.prototype = { */ getTileBounds: function( level, x, y ) { var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ), - px = ( x === 0 ) ? 0 : this.files[ level ].width, - py = ( y === 0 ) ? 0 : this.files[ level ].height, - sx = this.files[ level ].width, - sy = this.files[ level ].height, + px = ( x === 0 ) ? 0 : this.levels[ level ].width, + py = ( y === 0 ) ? 0 : this.levels[ level ].height, + sx = this.levels[ level ].width, + sy = this.levels[ level ].height, scale = 1.0 / ( this.width >= this.height ? dimensionsScaled.y : dimensionsScaled.x @@ -126,7 +186,7 @@ $.LegacyTileSource.prototype = { getTileUrl: function( level, x, y ) { var url = null; if( level >= this.minLevel && level <= this.maxLevel ){ - url = this.files[ level ].url; + url = this.levels[ level ].url; } return url; }, @@ -148,4 +208,104 @@ $.LegacyTileSource.prototype = { } }; +/** + * This method removes any files from the Array which dont conform to our + * basic requirements for a 'level' in the LegacyTileSource. + * @private + * @inner + * @function + */ +function filterFiles( files ){ + var filtered = [], + file, + i; + for( i = 0; i < files.length; i++ ){ + file = files[ i ]; + if( file.height && + file.width && + file.url && ( + file.url.toLowerCase().match(/^.*\.(png|jpg|jpeg|gif)$/) || ( + file.mimetype && + file.mimetype.toLowerCase().match(/^.*\/(png|jpg|jpeg|gif)$/) + ) + ) ){ + //This is sufficient to serve as a level + filtered.push({ + url: file.url, + width: Number( file.width ), + height: Number( file.height ) + }); + } + } + + return filtered.sort(function(a,b){ + return a.height - b.height; + }); + +}; + +/** + * @private + * @inner + * @function + */ +function configureFromXML( tileSource, xmlDoc ){ + + if ( !xmlDoc || !xmlDoc.documentElement ) { + throw new Error( $.getString( "Errors.Xml" ) ); + } + + var root = xmlDoc.documentElement, + rootName = root.tagName, + conf = null, + levels = [], + level, + i; + + if ( rootName == "image" ) { + + try { + conf = { + type: root.getAttribute( "type" ), + levels: [] + }; + + levels = root.getElementsByTagName( "level" ); + for ( i = 0; i < levels.length; i++ ) { + level = levels[ i ]; + + conf.levels .push({ + url: level.getAttribute( "url" ), + width: parseInt( level.getAttribute( "width" ) ), + height: parseInt( level.getAttribute( "height" ) ) + }); + } + + return configureFromObject( tileSource, conf ); + + } catch ( e ) { + throw (e instanceof Error) ? + e : + new Error( 'Unknown error parsing Legacy Image Pyramid XML.' ); + } + } else if ( rootName == "collection" ) { + throw new Error( 'Legacy Image Pyramid Collections not yet supported.' ); + } else if ( rootName == "error" ) { + throw new Error( 'Error: ' + xmlDoc ); + } + + throw new Error( 'Unknown element ' + rootName ); +}; + +/** + * @private + * @inner + * @function + */ +function configureFromObject( tileSource, configuration ){ + + return configuration.levels; + +}; + }( OpenSeadragon )); diff --git a/src/openseadragon.js b/src/openseadragon.js index 64c14688..a1248629 100644 --- a/src/openseadragon.js +++ b/src/openseadragon.js @@ -470,7 +470,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ //INTERFACE FEATURES debugMode: true, animationTime: 1.5, - blendTime: 0.5, + blendTime: 0.1, alwaysBlend: false, autoHideControls: true, immediateRender: false, @@ -490,13 +490,17 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ controlsFadeDelay: 2000, controlsFadeLength: 1500, mouseNavEnabled: true, - showNavigator: false, + showNavigator: true, //promoted to default in 0.9.64 navigatorElement: null, navigatorHeight: null, navigatorWidth: null, navigatorPosition: null, navigatorSizeRatio: 0.25, preserveViewport: false, + defaultZoomLevel: 0, + + //EVENT RELATED CALLBACKS + onPageChange: null, //PERFORMANCE SETTINGS minPixelRatio: 0.5, @@ -1178,7 +1182,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ //TODO: very bad...Why check every time using try/catch when // we could determine once at startup which activeX object // was supported. This will have significant impact on - // performance for IE Browsers + // performance for IE Browsers DONE for ( i = 0; i < ACTIVEX.length; i++ ) { try { request = new ActiveXObject( ACTIVEX[ i ] ); @@ -1212,30 +1216,39 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @throws {Error} */ makeAjaxRequest: function( url, callback ) { - var async = typeof( callback ) == "function", + + + + var async = true, request = $.createAjaxRequest(), actual, + options, i; - if ( async ) { - actual = callback; - callback = function() { - window.setTimeout( - $.createCallback( null, actual, request ), - 1 - ); + + if( $.isPlainObject( url ) ){ + options.async = options.async || async; + }else{ + options = { + url: url, + async: $.isFunction( callback ), + success: callback, + error: null }; + } + + if ( options.async ) { /** @ignore */ request.onreadystatechange = function() { if ( request.readyState == 4) { request.onreadystatechange = new function() { }; - callback(); + options.success( request ); } }; } try { - request.open( "GET", url, async ); + request.open( "GET", options.url, options.async ); request.send( null ); } catch (e) { $.console.log( @@ -1247,12 +1260,16 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ request.onreadystatechange = null; request = null; - if ( async ) { - callback(); + if ( options.error && $.isFunction( options.error ) ) { + options.error( request ); } } - return async ? null : request; + if( !options.async && $.isFunction( options.success ) ){ + options.success( request ); + } + + return options.async ? null : request; }, @@ -1302,7 +1319,10 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ script = document.createElement( "script" ); - script.async = "async"; + //TODO: having an issue with async info requests + if( undefined !== options.async || false !== options.async ){ + script.async = "async"; + } if ( options.scriptCharset ) { script.charset = options.scriptCharset; @@ -1335,18 +1355,22 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ /** - * Loads a Deep Zoom Image description from a url or XML string and - * provides a callback hook for the resulting Document + * Loads a Deep Zoom Image description from a url, XML string or JSON string + * and provides a callback hook for the resulting Document * @function * @name OpenSeadragon.createFromDZI * @param {String} xmlUrl * @param {String} xmlString * @param {Function} callback + * @deprecated */ createFromDZI: function( dzi, callback, tileHost ) { var async = typeof ( callback ) == "function", - xmlUrl = dzi.substring(0,1) != '<' ? dzi : null, - xmlString = xmlUrl ? null : dzi, + dziUrl = ( + dzi.substring(0,1) != '<' && + dzi.substring(0,1) != '{' + ) ? dzi : null, + dziString = dziUrl ? null : dzi, error = null, urlParts, filename, @@ -1359,16 +1383,23 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ tilesUrl = tileHost + "/_files/"; - } else if( xmlUrl ) { + } else if( dziUrl ) { - urlParts = xmlUrl.split( '/' ); + urlParts = dziUrl.split( '/' ); filename = urlParts[ urlParts.length - 1 ]; + if( filename.match(/_dzi\.js$/) ){ + //for jsonp dzi specification, the '_dzi' needs to be removed + //from the filename to be consistent with the spec + filename = filename.replace('_dzi.js', '.js'); + } + lastDot = filename.lastIndexOf( '.' ); if ( lastDot > -1 ) { urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); } + tilesUrl = urlParts.join( '/' ) + "_files/"; } @@ -1386,17 +1417,17 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ } if ( async ) { - if ( xmlString ) { + if ( dziString ) { window.setTimeout( function() { - var source = finish( processDZIXml, parseXml( xmlString ) ); + var source = finish( processDZIXml, $.parseXml( xmlString ) ); // call after finish sets error callback( source, error ); }, 1); } else { - if( xmlUrl.match(/\.js$/) ){ - callbackName = xmlUrl.split( '/' ).pop().replace('.js','_dzi'); + if( dziUrl.match(/_dzi\.js$/) ){ + callbackName = dziUrl.split( '/' ).pop().replace('.js',''); $.jsonp({ - url: xmlUrl, + url: dziUrl, callbackName: callbackName, callback: function( imageData ){ var source = finish( processDZIJSON, imageData.Image ); @@ -1404,7 +1435,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ } }); } else { - $.makeAjaxRequest( xmlUrl, function( xhr ) { + $.makeAjaxRequest( dziUrl, function( xhr ) { var source = finish( processDZIResponse, xhr ); // call after finish sets error callback( source, error ); @@ -1415,17 +1446,72 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ return null; } - if ( xmlString ) { + if ( dziString ) { return finish( processDZIXml, - parseXml( xmlString ) + $.parseXml( dziString ) ); } else { return finish( processDZIResponse, - $.makeAjaxRequest( xmlUrl ) + $.makeAjaxRequest( dziUrl ) ); } + }, + + /** + * Parses an XML string into a DOM Document. + * @function + * @name OpenSeadragon.parseXml + * @param {String} string + * @returns {Document} + */ + parseXml: function( string ) { + //TODO: yet another example where we can determine the correct + // implementation once at start-up instead of everytime we use + // the function. DONE. + if ( window.ActiveXObject ) { + + $.parseXml = function( string ){ + var xmlDoc = null, + parser; + + xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); + xmlDoc.async = false; + xmlDoc.loadXML( string ); + return xmlDoc; + }; + + } else if ( window.DOMParser ) { + + $.parseXml = function( string ){ + var xmlDoc = null, + parser; + + parser = new DOMParser(); + xmlDoc = parser.parseFromString( string, "text/xml" ); + return xmlDoc; + }; + + } else { + throw new Error( "Browser doesn't support XML DOM." ); + } + + return $.parseXml( string ); + }, + + + /** + * Reports whether the image format is supported for tiling in this + * version. + * @function + * @name OpenSeadragon.imageFormatSupported + * @param {String} [extension] + * @returns {Boolean} + */ + imageFormatSupported: function( extension ) { + extension = extension ? extension : ""; + return !!FILEFORMATS[ extension.toLowerCase() ]; } }); @@ -1587,6 +1673,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {XMLHttpRequest} xhr * @param {String} tilesUrl + * @deprecated */ function processDZIResponse( xhr, tilesUrl ) { var status, @@ -1606,7 +1693,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ if ( xhr.responseXML && xhr.responseXML.documentElement ) { doc = xhr.responseXML; } else if ( xhr.responseText ) { - doc = parseXml( xhr.responseText ); + doc = $.parseXml( xhr.responseText ); } return processDZIXml( doc, tilesUrl ); @@ -1618,6 +1705,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Document} xmlDoc * @param {String} tilesUrl + * @deprecated */ function processDZIXml( xmlDoc, tilesUrl ) { @@ -1651,6 +1739,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Element} imageNode * @param {String} tilesUrl + * @deprecated */ function processDZI( imageNode, tilesUrl ) { var fileFormat = imageNode.getAttribute( "Format" ), @@ -1701,6 +1790,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Element} imageNode * @param {String} tilesUrl + * @deprecated */ function processDZIJSON( imageData, tilesUrl ) { var fileFormat = imageData.Format, @@ -1748,6 +1838,7 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ * @function * @param {Document} errorNode * @throws {Error} + * @deprecated */ function processDZIError( errorNode ) { var messageNode = errorNode.getElementsByTagName( "Message" )[ 0 ], @@ -1756,61 +1847,6 @@ OpenSeadragon = window.OpenSeadragon || function( options ){ throw new Error(message); }; - /** - * Reports whether the image format is supported for tiling in this - * version. - * @private - * @inner - * @function - * @param {String} [extension] - * @returns {Boolean} - */ - function imageFormatSupported( extension ) { - extension = extension ? extension : ""; - return !!FILEFORMATS[ extension.toLowerCase() ]; - }; - /** - * Parses an XML string into a DOM Document. - * @private - * @inner - * @function - * @name OpenSeadragon.parseXml - * @param {String} string - * @returns {Document} - */ - function parseXml( string ) { - //TODO: yet another example where we can determine the correct - // implementation once at start-up instead of everytime we use - // the function. DONE. - if ( window.ActiveXObject ) { - - $.parseXml = function( string ){ - var xmlDoc = null, - parser; - - xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); - xmlDoc.async = false; - xmlDoc.loadXML( string ); - return xmlDoc; - }; - - } else if ( window.DOMParser ) { - - $.parseXml = function( string ){ - var xmlDoc = null, - parser; - - parser = new DOMParser(); - xmlDoc = parser.parseFromString( string, "text/xml" ); - return xmlDoc; - }; - - } else { - throw new Error( "Browser doesn't support XML DOM." ); - } - - return $.parseXml( string ); - }; }( OpenSeadragon )); diff --git a/src/tilesource.js b/src/tilesource.js index 9f6e1223..2a1241ab 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -3,33 +3,136 @@ /** + * The TileSource contains the most basic implementation required to create a + * smooth transition between layer in an image pyramid. It has only a single key + * interface that must be implemented to complete it key functionality: + * 'getTileUrl'. It also has several optional interfaces that can be + * implemented if a new TileSource wishes to support configuration via a simple + * object or array ('configure') and if the tile source supports or requires + * configuration via retreival of a document on the network ala AJAX or JSONP, + * ('getImageInfo'). + *
+ * By default the image pyramid is split into N layers where the images longest + * side in M (in pixels), where N is the smallest integer which satisfies + * 2^(N+1) >= M. * @class - * @param {Number} width + * @extends OpenSeadragon.EventHandler + * @param {Number|Object|Array|String} width + * If more than a single argument is supplied, the traditional use of + * positional parameters is supplied and width is expected to be the width + * source image at it's max resolution in pixels. If a single argument is supplied and + * it is an Object or Array, the construction is assumed to occur through + * the extending classes implementation of 'configure'. Finally if only a + * single argument is supplied and it is a String, the extending class is + * expected to implement 'getImageInfo' and 'configure'. * @param {Number} height + * Width of the source image at max resolution in pixels. * @param {Number} tileSize + * The size of the tiles to assumed to make up each pyramid layer in pixels. + * Tile size determines the point at which the image pyramid must be + * divided into a matrix of smaller images. * @param {Number} tileOverlap + * The number of pixels each tile is expected to overlap touching tiles. * @param {Number} minLevel + * The minimum level to attempt to load. * @param {Number} maxLevel + * The maximum level to attempt to load. * @property {Number} aspectRatio - * @property {Number} dimensions + * Ratio of width to height + * @property {OpenSeadragon.Point} dimensions + * Vector storing x and y dimensions ( width and height respectively ). * @property {Number} tileSize + * The size of the image tiles used to compose the image. * @property {Number} tileOverlap + * The overlap in pixels each tile shares with it's adjacent neighbors. * @property {Number} minLevel + * The minimum pyramid level this tile source supports or should attempt to load. * @property {Number} maxLevel + * The maximum pyramid level this tile source supports or should attempt to load. */ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLevel ) { - this.aspectRatio = width / height; - this.dimensions = new $.Point( width, height ); - this.tileSize = tileSize ? tileSize : 0; - this.tileOverlap = tileOverlap ? tileOverlap : 0; - this.minLevel = minLevel ? minLevel : 0; - this.maxLevel = maxLevel ? maxLevel : - Math.ceil( - Math.log( Math.max( width, height ) ) / - Math.log( 2 ) + var _this = this, + callback = null, + readyHandler = null, + args = arguments, + options, + i; + + if( $.isPlainObject( width ) ){ + options = width; + }else{ + options = { + width: args[0], + height: args[1], + tileSize: args[2], + tileOverlap: args[3], + minlevel: args[4], + maxLevel: args[5] + }; + } + + //Tile sources supply some events, namely 'ready' when they must be configured + //by asyncronously fetching their configuration data. + $.EventHandler.call( this ); + + //we allow options to override anything we dont treat as + //required via idiomatic options or which is functionally + //set depending on the state of the readiness of this tile + //source + $.extend( true, this, options ); + + //Any functions that are passed as arguments are bound to the ready callback + for( i = 0; i < arguments.length; i++ ){ + if( $.isFunction( arguments[i] ) ){ + callback = arguments[ i ]; + this.addHandler( 'ready', function( placeHolderSource, readySource ){ + callback( readySource ); + }); + //only one callback per constructor + break; + } + } + + if( 'string' == $.type( arguments[ 0 ] ) ){ + //in case the getImageInfo method is overriden and/or implies an + //async mechanism set some safe defaults first + this.aspectRatio = 1; + this.dimensions = new $.Point( 10, 10 ); + this.tileSize = 0; + this.tileOverlap = 0; + this.minLevel = 0; + this.maxLevel = 0; + this.ready = false; + //configuration via url implies the extending class + //implements and 'configure' + this.getImageInfo( arguments[ 0 ] ); + + } else { + + //explicit configuration via positional args in constructor + //or the more idiomatic 'options' object + this.ready = true; + this.aspectRatio = ( options.width && options.height ) ? + ( options.width / options.height ) : 1; + this.dimensions = new $.Point( options.width, options.height ); + this.tileSize = options.tileSize ? options.tileSize : 0; + this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; + this.minLevel = options.minLevel ? options.minLevel : 0; + this.maxLevel = options.maxLevel ? options.maxLevel : ( + ( options.width && options.height ) ? Math.ceil( + Math.log( Math.max( options.width, options.height ) ) / + Math.log( 2 ) + ) : 0 ); + if( callback && $.isFunction( callback ) ){ + callback( this ); + } + } + + }; + $.TileSource.prototype = { /** @@ -98,6 +201,107 @@ $.TileSource.prototype = { }, /** + * Responsible for retrieving, and caching the + * image metadata pertinent to this TileSources implementation. + * @function + * @param {String} url + * @throws {Error} + */ + getImageInfo: function( url ) { + var _this = this, + url = url, + error, + callbackName, + callback, + readySource, + options, + urlParts, + filename, + lastDot, + tilesUrl; + + + if( url ) { + urlParts = url.split( '/' ); + filename = urlParts[ urlParts.length - 1 ]; + lastDot = filename.lastIndexOf( '.' ); + if ( lastDot > -1 ) { + urlParts[ urlParts.length - 1 ] = filename.slice( 0, lastDot ); + } + } + + callback = function( data ){ + var $TileSource = $.TileSource.determineType( _this, data, url ); + options = $TileSource.prototype.configure.apply( _this, [ data, url ]); + readySource = new $TileSource( options ); + _this.ready = true; + _this.raiseEvent( 'ready', readySource ); + }; + + if( url.match(/\.js$/) ){ + //TODO: Its not very flexible to require tile sources to end jsonp + // request for info with a url that ends with '.js' but for + // now it's the only way I see to distinguish uniformly. + callbackName = url.split( '/' ).pop().replace('.js',''); + $.jsonp({ + url: url, + async: false, + callbackName: callbackName, + callback: callback + }); + } else { + //TODO: struggling a little with TileSource rewrite to make info + // requests work asyncronously. For now I'm opting to make + // all xhr info request syncronous. + $.makeAjaxRequest( url, function( xhr ) { + var data = processResponse( xhr ); + callback( data ); + }); + } + + }, + + /** + * Responsible determining if a the particular TileSource supports the + * data format ( and allowed to apply logic against the url the data was + * loaded from, if any ). Overriding implementations are expected to do + * something smart with data and / or url to determine support. Also + * understand that iteration order of TileSources is not guarunteed so + * please make sure your data or url is expressive enough to ensure a simple + * and sufficient mechanisim for clear determination. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Boolean} + */ + supports: function( data, url ) { + return false; + }, + + /** + * Responsible for parsing and configuring the + * image metadata pertinent to this TileSources implementation. + * This method is not implemented by this class other than to throw an Error + * announcing you have to implement it. Because of the variety of tile + * server technologies, and various specifications for building image + * pyramids, this method is here to allow easy integration. + * @function + * @param {String|Object|Array|Document} data + * @param {String} url - the url the data was loaded + * from if any. + * @return {Array} args - Returns an array containing the normalized values + * of the positional parameters for the constructor of the implementing + * tile source. + * @throws {Error} + */ + configure: function( data, url ) { + throw new Error( "Method not implemented." ); + }, + + /** + * Responsible for retriving the url which will return an image for the + * region speified by the given x, y, and level components. * This method is not implemented by this class other than to throw an Error * announcing you have to implement it. Because of the variety of tile * server technologies, and various specifications for building image @@ -129,4 +333,73 @@ $.TileSource.prototype = { } }; + +$.extend( true, $.TileSource.prototype, $.EventHandler.prototype ); + + +/** + * Decides whether to try to process the response as xml, json, or hand back + * the text + * @eprivate + * @inner + * @function + * @param {XMLHttpRequest} xhr - the completed network request + */ +function processResponse( xhr ){ + var responseText = xhr.responseText, + status = xhr.status, + statusText, + data; + + if ( !xhr ) { + throw new Error( $.getString( "Errors.Security" ) ); + } else if ( xhr.status !== 200 && xhr.status !== 0 ) { + status = xhr.status; + statusText = ( status == 404 ) ? + "Not Found" : + xhr.statusText; + throw new Error( $.getString( "Errors.Status", status, statusText ) ); + } + + if( responseText.match(/\s*<.*/) ){ + try{ + data = ( xhr.responseXML && xhr.responseXML.documentElement ) ? + xhr.responseXML : + $.parseXml( responseText ); + } catch (e){ + data = xhr.responseText; + } + }else if( responseText.match(/\s*[\{\[].*/) ){ + data = eval( responseText ); + }else{ + data = responseText; + } + return data; +}; + + +/** + * Determines the TileSource Implementation by introspection of OpenSeadragon + * namespace, calling each TileSource implementation of 'isType' + * @eprivate + * @inner + * @function + * @param {Object|Array} data - the tile source configuration object + * @param {String} url - the url where the tile source configuration object was + * loaded from, if any. + */ +$.TileSource.determineType = function( tileSource, data, url ){ + var property; + for( property in OpenSeadragon ){ + if( property.match(/.+TileSource$/) && + $.isFunction( OpenSeadragon[ property ] ) && + $.isFunction( OpenSeadragon[ property ].prototype.supports ) && + OpenSeadragon[ property ].prototype.supports.call( tileSource, data, url ) + ){ + return OpenSeadragon[ property ]; + } + } +}; + + }( OpenSeadragon )); diff --git a/src/viewer.js b/src/viewer.js index daad6bb4..9de0c1ca 100644 --- a/src/viewer.js +++ b/src/viewer.js @@ -140,22 +140,19 @@ $.Viewer = function( options ) { } if ( this.tileSources ){ - //tileSources is a complex option... - //It can be a string, object, function, or an array of any of these. - // - A String implies a DZI - // - An Srray of Objects implies a simple image - // - A Function implies a custom tile source callback - // - An Array that is not an Array of simple Objects implies a sequence - // of tile sources which can be any of the above + // tileSources is a complex option... + // + // It can be a string, object, or an array of any of strings and objects. + // At this point we only care about if it is an Array or not. + // if( $.isArray( this.tileSources ) ){ - if( $.isPlainObject( this.tileSources[ 0 ] ) ){ - //This is a non-sequenced legacy tile source - initialTileSource = this.tileSources; - } else { - //Sequenced tile source - initialTileSource = this.tileSources[ 0 ]; + + //must be a sequence of tileSource since the first item + //is a legacy tile source + if( this.tileSources.length > 1 ){ THIS[ this.hash ].sequenced = true; - } + } + initialTileSource = this.tileSources[ 0 ]; } else { initialTileSource = this.tileSources; } @@ -250,6 +247,7 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, * If the string is xml is simply parsed and opened, otherwise the string * is treated as an URL and an xml document is requested via ajax, parsed * and then opened in the viewer. + * @deprecated - use 'open' instead. * @function * @name OpenSeadragon.Viewer.prototype.openDzi * @param {String} dzi and xml string or the url to a DZI xml document. @@ -268,33 +266,66 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, }, /** + * tileSources is a complex option... + * + * It can be a string, object, function, or an array of any of these: + * + * - A String implies a url used to determine the tileSource implementation + * based on the file extension of url. JSONP is implied by *.js, + * otherwise the url is retrieved as text and the resulting text is + * introspected to determine if its json, xml, or text and parsed. + * - An Object implies an inline configuration which has a single + * property sufficient for being able to determine tileSource + * implementation. If the object has a property which is a function + * named 'getTileUrl', it is treated as a custom TileSource. + * - An Array implies a one of two cases: + * 1) Its a legacy tile source if it is an array of objects and at + * least one object satisfies the conditions of having a 'height', + * 'width', and 'url'. + * 2) It's a sequence of tileSources, each item of which applying the + * rules above independently * @function * @name OpenSeadragon.Viewer.prototype.openTileSource * @return {OpenSeadragon.Viewer} Chainable. */ openTileSource: function ( tileSource ) { var _this = this, - customTileSource; + customTileSource, + readySource, + $TileSource, + options; setTimeout(function(){ if ( $.type( tileSource ) == 'string') { - //Standard DZI format - _this.openDzi( tileSource ); - } else if ( $.isArray( tileSource ) ){ - //Legacy image pyramid - _this.open( new $.LegacyTileSource( tileSource ) ); - } else if ( $.isPlainObject( tileSource ) && $.isFunction( tileSource.getTileUrl ) ){ - //Custom tile source - customTileSource = new $.TileSource( - tileSource.width, - tileSource.height, - tileSource.tileSize, - tileSource.tileOverlap, - tileSource.minLevel, - tileSource.maxLevel - ); - customTileSource.getTileUrl = tileSource.getTileUrl; - _this.open( customTileSource ); + //TODO: We cant assume a string implies a dzi since all + //complete TileSource implementations should have a getInfo + //which allows them to be configured via AJAX. Im not sure + //if its better to use file extension or url pattern, or to + //inspect the resulting info object. + tileSource = new $.TileSource( tileSource, function( readySource ){ + _this.open( readySource ); + }); + + } else if ( $.isPlainObject( tileSource ) ){ + if( $.isFunction( tileSource.getTileUrl ) ){ + //Custom tile source + customTileSource = new $.TileSource( + tileSource.width, + tileSource.height, + tileSource.tileSize, + tileSource.tileOverlap, + tileSource.minLevel, + tileSource.maxLevel + ); + customTileSource.getTileUrl = tileSource.getTileUrl; + _this.open( customTileSource ); + } else { + //inline configuration + $TileSource = $.TileSource.determineType( _this, tileSource ); + options = $TileSource.prototype.configure.apply( _this, [ tileSource ]); + readySource = new $TileSource( options ); + _this.open( readySource ); + } } else { //can assume it's already a tile source implementation _this.open( tileSource ); @@ -346,8 +377,19 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, wrapHorizontal: this.wrapHorizontal, wrapVertical: this.wrapVertical }); + if( this.preserveVewport ){ + this.viewport.resetContentSize( this.source.dimensions ); + + } else if( this.defaultZoomLevel ){ + + this.viewport.zoomTo( + this.defaultZoomLevel, + this.viewport.getCenter(), + true + ); + } this.drawer = new $.Drawer({ @@ -890,6 +932,40 @@ $.extend( $.Viewer.prototype, $.EventHandler.prototype, $.ControlDock.prototype, } + } + }, + + goToPage: function( page ){ + //page is a 1 based index so normalize now + //page = page; + if( this.tileSources.length > page ){ + + THIS[ this.hash ].sequence = page; + + if( this.nextButton ){ + if( ( this.tileSources.length - 1 ) === page ){ + //Disable next button + this.nextButton.disable(); + } else { + this.nextButton.enable(); + } + } + if( this.previousButton ){ + if( page > 0 ){ + //Enable previous button + this.previousButton.enable(); + } else { + this.previousButton.disable(); + } + } + + this.openTileSource( this.tileSources[ page ] ); + } + if( $.isFunction( this.onPageChange ) ){ + this.onPageChange({ + page: page, + viewer: this + }); } } @@ -1243,44 +1319,14 @@ function onFullPage() { function onPrevious(){ - var previous = THIS[ this.hash ].sequence - 1, - preserveVewport = true; - if( previous >= 0 ){ - - THIS[ this.hash ].sequence = previous; - - if( 0 === previous ){ - //Disable previous button - this.previousButton.disable(); - } - if( this.tileSources.length > 0 ){ - //Enable next button - this.nextButton.enable(); - } - - this.openTileSource( this.tileSources[ previous ] ); - } + var previous = THIS[ this.hash ].sequence - 1; + this.goToPage( previous ); }; function onNext(){ - var next = THIS[ this.hash ].sequence + 1, - preserveVewport = true; - if( this.tileSources.length > next ){ - - THIS[ this.hash ].sequence = next; - - if( ( this.tileSources.length - 1 ) === next ){ - //Disable next button - this.nextButton.disable(); - } - if( next > 0 ){ - //Enable previous button - this.previousButton.enable(); - } - - this.openTileSource( this.tileSources[ next ] ); - } + var next = THIS[ this.hash ].sequence + 1; + this.goToPage( next ); }; diff --git a/www/base.html b/www/base.html new file mode 100644 index 00000000..b5222b2d --- /dev/null +++ b/www/base.html @@ -0,0 +1,166 @@ + + + + + + @TITLE@ OpenSeadragon + + + + + + + + Fork me on GitHub +
+
+ + + + +
+

+ OpenSeadragon + + Try it on the iPad! (new since 0.9) + +

+ + + + @EXAMPLE@ + +

+ Additional Examples & Features +

+ + + +

Dependencies

+

Currently there are no additional dependencies.

+ +

Install

+

+ You can examine the source of this page to see how it's included in the page. +

+ + +

API Documentation

+

Is available here. The API + documentation has not yet been closely aligned with our build / release cycle. + We try to minimize backward incompatible API changes but during the 0.X + release cycle are taking some liberty to do so when it makes sense. Please + keep both of these caveats in mind when referencing the API documentation.

+ +

Download

+

+ You can download this project in either + zip or + tar formats. +

+

+ You can also clone the project with Git + by running: +

$ git clone git://github.com/thatcher/openseadragon
+

+ + + +

License

+

The original license is a + New BSD style license.

+

This project adds an + MIT style license. +

+ + + +
+ + + diff --git a/www/index.html b/www/index.html new file mode 100644 index 00000000..e27eb0cd --- /dev/null +++ b/www/index.html @@ -0,0 +1,33 @@ +

refactored

+ +
+ Fork of OpenSeadragon (from its mercurial repository). We are working to + refactor the code base and see what happens from there.

+ Try it on the iPad! (new since 0.9) +
+ +
+
+ Seadragon control with default properties + +
+
+
+ + \ No newline at end of file diff --git a/www/overlay-highlights.html b/www/overlay-highlights.html new file mode 100644 index 00000000..7c36dc46 --- /dev/null +++ b/www/overlay-highlights.html @@ -0,0 +1,64 @@ +

example: highlights

+ +
+

+  Highlighted overlays are very useful for directing users attention to + specific areas of interest, though the style is often decided based + on the specific content being presented. +

+

+  OpenSeadragon makes it easy to declare highlighted areas and control + the presentation through simple css mechanisms. +

+

+ Try it on the iPad! (new since 0.9) +

+
+ +
+
+ Highlights +
+
+ + | show highlights + | hide highlights + +
+
+
+ + \ No newline at end of file diff --git a/www/tilesource-custom.html b/www/tilesource-custom.html new file mode 100644 index 00000000..c57eb0fc --- /dev/null +++ b/www/tilesource-custom.html @@ -0,0 +1,53 @@ +

example: custom tile sources

+ +

+ A Custom Tile Source can be create via inline configuration by specifying + a single function named 'getTileUrl', along with the required values for + 'height', 'width'. Optional values include 'tileSize', 'tileOverlap', + 'minLevel', and 'maxLevel'. Additionally, any default functions implemented + by OpenSeadragon.TileSource can be overridden. Functionally this allows you + to define a new TileSource implementation inline. +

+

+ Alternatively, + you can always create a new tile source which implements the required + interfaces 'getTileUrl', 'configure', and 'supports'. +

+

+ Please note the examples on this page are sketches or outlines + and not functional examples because we do not have an available + service to provide a working example against. If you have a service you + can provide an example to illustrate against please let us know. +

+ +
+

Inline Configuration for Custom Tile Sources

+

+ Minimally, an inline configuration for a custom tile source only needs + to implement the 'getTileUrl' interface and provide a height and width + for the maximum resolution of the image. +

+
+
+
+ Example Inline Configuration for Custom Tile Sources +
+

+ Below is a make believe minimal inline configuration. Note that the + default tileSize is available as a property of the tile source. +

+
+    OpenSeadragon({
+        id:            "example-inline-configuration",
+        prefixUrl:     "/openseadragon",
+        showNavigator:  true,
+        tileSources:   {
+            height: 1140,
+            width:  2450,
+            getTileUrl: function( level, x, y ){
+                return "http://example.org/imageservice/"+level+"/"+x+"/"+y+"/?tileSize="+this.tileSize
+            }
+        }
+    });
+    
+
\ No newline at end of file diff --git a/www/tilesource-dzi.html b/www/tilesource-dzi.html new file mode 100644 index 00000000..eb2d5088 --- /dev/null +++ b/www/tilesource-dzi.html @@ -0,0 +1,207 @@ +

+ example: deep zoom image support +

+

+ The DZI (Deep Zoom Image) format is an + xml specification maintained by Microsoft and described here. +

+

+ OpenSeadragon has added supports for DZI format via AJAX ( XML/JSON ), JSONP, + and as inline configuration ( using the json format ). The DZI specification + does not officially describe a JSON format however the + examples below illustrate how DZI xml is mapped to json following some + simple conventions. +

+ + +
+

XMLHTTPRequest for DZI XML or JSON

+

+ The DZI Format is implied by a tile source specified as a string + and which has the .dzi extension. OpenSeadragon sniffs + for whether the DZI is formatted as XML or JSON. +

+
+
+
+ Example XMLHTTPRequest for DZI ( XML or JSON ) +
+
+ + +
+

+ Below is a sample DZI file formatted as XML. +

+
+<?xml version="1.0" encoding="UTF-8"?>
+<Image xmlns="http://schemas.microsoft.com/deepzoom/2008"
+       Format="jpg" 
+       Overlap="2" 
+       TileSize="256" >
+    <Size Height="9221" 
+          Width="7026"/>
+</Image>
+

+ And the equivalent sample DZI file formatted as JSON. +

+
+{
+    "Image": {
+        "xmlns":    "http://schemas.microsoft.com/deepzoom/2008",
+        "Format":   "jpg", 
+        "Overlap":  "2", 
+        "TileSize": "256",
+        "Size": {
+            "Height": "9221",
+            "Width":  "7026"
+        }
+    }
+}
+

+ Configuration is done via the 'tileSources' option ( or programatically ). +

+
+OpenSeadragon({
+    ...
+    tileSources:   "/openseadragon/examples/images/highsmith/highsmith.dzi",
+    ...
+});
+
+ + + +
+

JSONP Request for DZI JSON

+

+ The DZI JSONP Format is implied by a tile source specified as a string + and which has the .js extension. The remainder of the + file name is expected to match the jsonp callback + the example below illustrates +

+
+
+
+ Example JSONPRequest for DZI JSON +
+
+ + +
+

+ Below is a sample DZI file formatted as JSONP. +

+
+highsmith({
+    "Image": {
+        "xmlns":    "http://schemas.microsoft.com/deepzoom/2008",
+        "Format":   "jpg", 
+        "Overlap":  "2", 
+        "TileSize": "256",
+        "Size": {
+            "Height": "9221",
+            "Width":  "7026"
+        }
+    }
+});
+

+ Configuration is done via the 'tileSources' option ( or programatically ). +

+
+OpenSeadragon({
+    ...
+    tileSources:   "/openseadragon/examples/images/highsmith/highsmith.js",
+    ...
+});
+
+ + + + +
+

Inline Configuration for DZI

+

+ Inline configuration is convenient as well because it avoids a potentially + complicated JSON/XML Ajax request over the network. Just plop the equivalent + json directly into 'tileSources' option. +

+
+
+
+ Example Inline Configuration for DZI +
+
+
+

+ Configuration is done via the 'tileSources' option ( or programatically ). +

+

+ Note however the non-standard dzi property 'Url' which we must supply + explicitly since this is normally inferred by the path specified + for the dzi XML/JSON/JSONP. +

+
+OpenSeadragon({
+    ...
+    tileSources:   {
+        Image: {
+            xmlns:    "http://schemas.microsoft.com/deepzoom/2008",
+            Url:      "/openseadragon/examples/images/highsmith/highsmith_files/",
+            Format:   "jpg", 
+            Overlap:  "2", 
+            TileSize: "256",
+            Size: {
+                Height: "9221",
+                Width:  "7026"
+            }
+        }
+    }
+    ...
+});
+
+ diff --git a/www/tilesource-iiif.html b/www/tilesource-iiif.html new file mode 100644 index 00000000..94981000 --- /dev/null +++ b/www/tilesource-iiif.html @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/www/tilesource-legacy.html b/www/tilesource-legacy.html new file mode 100644 index 00000000..8c85f980 --- /dev/null +++ b/www/tilesource-legacy.html @@ -0,0 +1,227 @@ +

example: legacy image pyramids

+ +

+ A "legacy image pyramid" (LIP) just means you can finally make use of your + existing images without pregenerating or dynamically creating image tiles. + Web developers have commonly created derivatives of various sizes + that are intended for use for different web presentations or for download, + like "thumbnail", "detail", and "best" etc. This is already a simple pyramid + and you can use them to create a simple deep zoom presenation with OpenSeadragon! +

+ +
+

XMLHTTPRequest for LIP JSON

+

+ The LIP format is implied by a tile source specified as a string + and which does not have the .js extension. The legacy image + pyramid format does not currently have an xml serialization. +

+
+
+
+ Example XMLHTTPRequest for LIP ( XML or JSON ) +
+
+ + +
+

+ Below is a sample LIP file formatted as JSON. +

+
+{
+    type: 'legacy-image-pyramid',
+    levels:[{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001q.jpg',
+        height: 889,
+        width:  600
+    },{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001r.jpg',
+        height: 2201,
+        width:  1485
+    },{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001v.jpg',
+        height: 4402,
+        width:  2970
+    }]
+}
+
+

+ Or the equivalent XML: +

+
+<image type='legacy-image-pyramid'>
+    <level
+        url='/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001q.jpg'
+        height='889'
+        width='600'/>
+    <level
+        url='/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001r.jpg'
+        height='2201'
+        width='1485'/>
+    <level
+        url='/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001v.jpg'
+        height='4402'
+        width='2970'/>
+</image>
+
+

+ Configuration is done via the 'tileSources' option ( or programatically ). +

+
+OpenSeadragon({
+    ...
+    tileSources:   "/openseadragon/examples/images/rbc/rbc0001/2003/rosen.xml",
+    ...
+});
+
+ + + +
+

JSONP Request for LIP JSON

+

+ The LIP JSONP format is implied by a tile source specified as a string + and which has the .js extension. The remainder of the + file name is expected to match the jsonp callback + the example below illustrates +

+
+
+
+ Example JSONPRequest for DZI JSON +
+
+ + +
+

+ Below is a sample DZI file formatted as JSONP. +

+
+rosen({
+    type: 'legacy-image-pyramid',
+    levels:[{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001q.jpg',
+        height: 889,
+        width:  600
+    },{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001r.jpg',
+        height: 2201,
+        width:  1485
+    },{
+        url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001v.jpg',
+        height: 4402,
+        width:  2970
+    }]
+});
+

+ Configuration is done via the 'tileSources' option ( or programatically ). +

+
+OpenSeadragon({
+    ...
+    tileSources:   "/openseadragon/examples/images/rbc/rbc0001/2003/rosen.js",
+    ...
+});
+
+ + + +
+

Inline Configuration for Legacy Tile Sources

+

+ We currently only support Legacy Tile Sources configured inline as the example + below demonstrates. +

+
+ +
+
+ Example Inline Configuration for Legacy Tile Sources +
+
+
+ + + +

+ The Legacy Tile Source has not been described as an official 'specification', + though we would like to eventually create a specification for it because + of how useful it can be to create interactive zoom interfaces using existing + web derivatives. As such it may change though the goal is to keep it very + simple and similar to the examples provided below. +

+ +
+OpenSeadragon({
+    ...
+    tileSources: {
+        type: 'legacy-image-pyramid',
+        levels:[{
+            url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001q.jpg',
+            height: 889,
+            width:  600
+        },{
+            url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001r.jpg',
+            height: 2201,
+            width:  1485
+        },{
+            url: '/openseadragon/examples/images/rbc/rbc0001/2003/2003rosen1799/0001v.jpg',
+            height: 4402,
+            width:  2970
+            
+        }]
+    }
+    ...
+});
+
\ No newline at end of file diff --git a/www/tilesource-sequence.html b/www/tilesource-sequence.html new file mode 100644 index 00000000..778942a7 --- /dev/null +++ b/www/tilesource-sequence.html @@ -0,0 +1,745 @@ +

example: image sequence

+ +
+

+ It is not uncommon to have a sequence of images to present, and although + it's easy enough to add a 'previous' and 'next' link on your page, it's + especially nice to allow the user to navigate the image sequence without + having leave the page. +

+ OpenSeadragon now has support for an array of tile sources, including + a previous and next button! +

+
+ +
+
+ Basic Example w/ Default Settings ( Using Legacy Image Pyramid Example ) +
+
+
+
+ Preset Zoom Level ( Resets on Page Turn )
+ Click on the navigator and alternate pressing keys 'w' and 's' to + reproduce the effect of the referenced 'overlay' (depends on screen hertz + refresh rate, most screens will display the effect). +
+
+
+
+ Preserving the Viewport Zoom Level and Position for Image Sequences +
+
+
+
+ Mixed Tile Source Example ( w/ Default Settings ) +
+
+
+ + + + + \ No newline at end of file diff --git a/www/ui-binding-custom-buttons.html b/www/ui-binding-custom-buttons.html new file mode 100644 index 00000000..7b97155e --- /dev/null +++ b/www/ui-binding-custom-buttons.html @@ -0,0 +1,123 @@ +

example: binding custom buttons

+ +
+

+ You can now bind to an entirely custom user interface by just passing + the id of the elements you want treated as buttons! This is especially useful + when you need to fully control the look and feel of the user interface. + (New since 0.9.50) +

+
+ +
+
+ Binding custom buttons. +
+
+ + | Zoom In + | Zoom 0ut + | Home + | Full Page + + + <  + + | +  > + 1 of 3 + +
+
+
+ + + +

+The relevant configuration options are shown below. Note the value for the options +are the id of the element on the page to bind the button's action to. +

+ +
+OpenSeadragon({
+    ...
+    zoomInButton:   "zoom-in",
+    zoomOutButton:  "zoom-out",
+    homeButton:     "home",
+    fullPageButton: "full-page",
+    nextButton:     "next",
+    previousButton: "previous",
+    ...
+});
+
+ +

+Also note the interface in this example updates the current page numbers in the label +"Page N of 3". This is achieved by making use of the provided callback 'onPageChange' +

+
+OpenSeadragon({
+    ...
+    onPageChange:   function( data ){
+        document.getElementById('currentpage').innerHTML = ( data.page + 1 ) + ' of 3';
+    }
+    ...
+});
+
\ No newline at end of file diff --git a/www/ui-collections.html b/www/ui-collections.html new file mode 100644 index 00000000..e69de29b diff --git a/www/ui-slideshow.html b/www/ui-slideshow.html new file mode 100644 index 00000000..e69de29b diff --git a/www/ui-toolbar.html b/www/ui-toolbar.html new file mode 100644 index 00000000..03ed33aa --- /dev/null +++ b/www/ui-toolbar.html @@ -0,0 +1,39 @@ +

example: toolbar

+ +
+

+ Although OpenSeadragon provides default buttons which are overlayed on the Viewport, + there are many use cases where the presentation may require a more traditional + 'toolbar'. OpenSeadragon now allows you to very simply dock your controls + inside any element on the page which the end user has presentation control over. +

+
+ +
+
+ Toolbar +
+
+ + | other tools + | other tools + +
+
+
+ + + +

+Most importantly the toolbar has additional logic which supports transitions between +fullpage and normal mode. The user can style, including hiding, the toolbar in fullpage +mode, even though its not otherwise related to the viewer / viewport DOM. +

\ No newline at end of file diff --git a/www/ui-viewport-navigator.html b/www/ui-viewport-navigator.html new file mode 100644 index 00000000..924257ac --- /dev/null +++ b/www/ui-viewport-navigator.html @@ -0,0 +1,51 @@ +

example: viewport navigator

+ +
+

+ A viewport navigator allows the user to see the source image displayed + as a reference image with a highlighted area showing which portion of + the image they are currently viewing in the viewport. The navigator + reuses the image sources provided by the viewport so no additional + image derivatives are required. +

+
+ +
+
+ Viewport Navigator +
+
+
+ + + +

(The viewport navigator is up for promotion as a default interface +element for accessibility reasons but could be disabled if required.) +

+

Mouse interactions scroll (zoom) and drag are now supported on +the navigator! +(New since 0.9.40) +

+

+The viewport navigator is now keyboard acessible! Just tab into it, +the highlight will change to blue-ish, and you can use the following keys: +

+ +

+* NOTE: Chrome and Safari do not support the arrow keys for the Navigator. +

\ No newline at end of file