Esempio n. 1
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/2) "o2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("o2", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/11) "Xda_diamond"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Xda_diamond", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/14) "6_00_30998_01"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("6_00_30998_01", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "200"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x8827 (ISOSpeedRatings/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x0132 (0x0132/Ascii/20) "2008:08:22 15:55:31"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:08:22 15:55:31", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:08:22 15:55:31"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:08:22 15:55:31", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:08:22 15:55:31"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:08:22 15:55:31", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "2048"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2048, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "1536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1536, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "530"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "670"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "16354"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (16354, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/10) "Panasonic"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Panasonic", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/8) "DMC-TZ5"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DMC-TZ5", (entry as StringIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/28) "Adobe Photoshop CS4 Windows"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Adobe Photoshop CS4 Windows", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:05:03 19:39:29"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:05:03 19:39:29", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "152"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/3200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3200, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "49/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (49, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:11:06 12:42:03"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:11:06 12:42:03", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:11:06 12:42:03"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:11:06 12:42:03", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "344/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (344, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "470/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (470, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "1400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1400, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "933"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (933, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "3948492"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "280"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (280, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8825 (GPSTag/SubIFD/1) "650"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD);
				Assert.IsNotNull (entry, "Entry 0x8825 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010E (ImageDescription/Ascii/32) "OLYMPUS DIGITAL CAMERA         "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageDescription);
				Assert.IsNotNull (entry, "Entry 0x010E missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OLYMPUS DIGITAL CAMERA         ", (entry as StringIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/24) "OLYMPUS OPTICAL CO.,LTD"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OLYMPUS OPTICAL CO.,LTD", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/13) "E-10        "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("E-10        ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "144/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (144, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "144/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (144, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/32) "42-0119                        "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("42-0119                        ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2005:06:01 12:21:45"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2005:06:01 12:21:45", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "283"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/160"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (160, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "36/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (36, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (80, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 49 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 49, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2005:06:01 12:21:45"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2005:06:01 12:21:45", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2005:06:01 12:21:45"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2005:06:01 12:21:45", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "206/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (206, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "170/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (170, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/758) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;

			// Olympus.0x0200 (SpecialMode/Long/3) "3631961967 3583981211 265841571"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.SpecialMode);
				Assert.IsNotNull (entry, "Entry 0x0200 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 3631961967, 3583981211, 265841571 }, (entry as LongArrayIFDEntry).Values);
			}
			// Olympus.0x0201 (Quality/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x0202 (Macro/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Macro);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x0203 (BWMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.BWMode);
				Assert.IsNotNull (entry, "Entry 0x0203 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x0204 (DigitalZoom/Rational/1) "149128747/4155087494"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.DigitalZoom);
				Assert.IsNotNull (entry, "Entry 0x0204 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (149128747, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (4155087494, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x0205 (FocalPlaneDiagonal/Rational/1) "2670046643/2671390721"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FocalPlaneDiagonal);
				Assert.IsNotNull (entry, "Entry 0x0205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2670046643, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2671390721, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x0206 (LensDistortionParams/SShort/6) "-5164 6906 7757 835 -25578 -17709"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.LensDistortionParams);
				Assert.IsNotNull (entry, "Entry 0x0206 missing in IFD 0");
				Assert.IsNotNull (entry as SShortArrayIFDEntry, "Entry is not a signed short array!");
				Assert.AreEqual (new short [] { -5164, 6906, 7757, 835, -25578, -17709 }, (entry as SShortArrayIFDEntry).Values);
			}
			// Olympus.0x0209 (CameraID/Undefined/32) "0 12 250 125 107 143 63 12 180 187 233 167 69 212 102 54 109 135 69 0 124 188 228 12 247 227 20 158 30 73 166 135"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.CameraID);
				Assert.IsNotNull (entry, "Entry 0x0209 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 12, 250, 125, 107, 143, 63, 12, 180, 187, 233, 167, 69, 212, 102, 54, 109, 135, 69, 0, 124, 188, 228, 12, 247, 227, 20, 158, 30, 73, 166, 135 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Olympus.0x1000 (ShutterSpeed/SRational/1) "764354177/-942049472"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ShutterSpeed);
				Assert.IsNotNull (entry, "Entry 0x1000 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (764354177, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (-942049472, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1001 (ISOSpeed/SRational/1) "1239879654/638047914"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ISOSpeed);
				Assert.IsNotNull (entry, "Entry 0x1001 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (1239879654, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (638047914, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1002 (ApertureValue/SRational/1) "-1765853430/1703491222"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x1002 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-1765853430, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1703491222, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1003 (Brightness/SRational/1) "-816914756/1974393359"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Brightness);
				Assert.IsNotNull (entry, "Entry 0x1003 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-816914756, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1974393359, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1004 (FlashMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FlashMode);
				Assert.IsNotNull (entry, "Entry 0x1004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1005 (FlashDevice/Short/2) "0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FlashDevice);
				Assert.IsNotNull (entry, "Entry 0x1005 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1006 (Bracket/SRational/1) "335386020/1890807289"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Bracket);
				Assert.IsNotNull (entry, "Entry 0x1006 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (335386020, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1890807289, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1007 (SensorTemperature/SShort/1) "23"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.SensorTemperature);
				Assert.IsNotNull (entry, "Entry 0x1007 missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (23, (entry as SShortIFDEntry).Value);
			}
			// Olympus.0x1008 (LensTemperature/SShort/1) "22"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.LensTemperature);
				Assert.IsNotNull (entry, "Entry 0x1008 missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (22, (entry as SShortIFDEntry).Value);
			}
			// Olympus.0x1009 (0x1009/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1009
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1009);
				Assert.IsNotNull (entry, "Entry 0x1009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x100A (0x100a/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x100A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x100A);
				Assert.IsNotNull (entry, "Entry 0x100A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x100B (FocusMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FocusMode);
				Assert.IsNotNull (entry, "Entry 0x100B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x100C (FocusDistance/Rational/1) "1973778547/1270124588"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FocusDistance);
				Assert.IsNotNull (entry, "Entry 0x100C missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1973778547, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1270124588, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x100D (Zoom/Short/1) "12"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Zoom);
				Assert.IsNotNull (entry, "Entry 0x100D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (12, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x100E (MacroFocus/Short/1) "315"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.MacroFocus);
				Assert.IsNotNull (entry, "Entry 0x100E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (315, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x100F (SharpnessFactor/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.SharpnessFactor);
				Assert.IsNotNull (entry, "Entry 0x100F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1010 (FlashChargeLevel/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FlashChargeLevel);
				Assert.IsNotNull (entry, "Entry 0x1010 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1011 (ColorMatrix/Short/9) "12808 6873 28211 62318 6183 5428 43493 44469 45896"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ColorMatrix);
				Assert.IsNotNull (entry, "Entry 0x1011 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 12808, 6873, 28211, 62318, 6183, 5428, 43493, 44469, 45896 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1012 (BlackLevel/Short/4) "37164 37255 16551 9228"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.BlackLevel);
				Assert.IsNotNull (entry, "Entry 0x1012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 37164, 37255, 16551, 9228 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1013 (0x1013/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1013
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1013);
				Assert.IsNotNull (entry, "Entry 0x1013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1014 (0x1014/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1014
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1014);
				Assert.IsNotNull (entry, "Entry 0x1014 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1015 (WhiteBalance/Short/2) "1 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x1015 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 1, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1016 (0x1016/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1016
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1016);
				Assert.IsNotNull (entry, "Entry 0x1016 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1017 (RedBalance/Short/2) "394 64"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.RedBalance);
				Assert.IsNotNull (entry, "Entry 0x1017 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 394, 64 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1018 (BlueBalance/Short/2) "406 64"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.BlueBalance);
				Assert.IsNotNull (entry, "Entry 0x1018 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 406, 64 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x1019 (0x1019/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1019
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1019);
				Assert.IsNotNull (entry, "Entry 0x1019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x101A (SerialNumber2/Ascii/32) "Fz�2�T6^c8m�)ǿ�"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.SerialNumber2);
				Assert.IsNotNull (entry, "Entry 0x101A missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Fz�2�T6^c8m�)ǿ�", (entry as StringIFDEntry).Value);
			}
			// Olympus.0x101B (0x101b/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x101B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x101B);
				Assert.IsNotNull (entry, "Entry 0x101B missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x101C (0x101c/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x101C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x101C);
				Assert.IsNotNull (entry, "Entry 0x101C missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x101D (0x101d/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x101D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x101D);
				Assert.IsNotNull (entry, "Entry 0x101D missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x101E (0x101e/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x101E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x101E);
				Assert.IsNotNull (entry, "Entry 0x101E missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x101F (0x101f/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x101F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x101F);
				Assert.IsNotNull (entry, "Entry 0x101F missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x1020 (0x1020/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1020
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1020);
				Assert.IsNotNull (entry, "Entry 0x1020 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x1021 (0x1021/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1021
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1021);
				Assert.IsNotNull (entry, "Entry 0x1021 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x1022 (0x1022/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1022
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1022);
				Assert.IsNotNull (entry, "Entry 0x1022 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x1023 (FlashBias/SRational/1) "-1152340400/689675175"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.FlashBias);
				Assert.IsNotNull (entry, "Entry 0x1023 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-1152340400, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (689675175, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1024 (0x1024/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1024
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1024);
				Assert.IsNotNull (entry, "Entry 0x1024 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1025 (0x1025/SRational/1) "-1727258578/1939699"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1025
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1025);
				Assert.IsNotNull (entry, "Entry 0x1025 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-1727258578, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1939699, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Olympus.0x1026 (ExternalFlashBounce/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ExternalFlashBounce);
				Assert.IsNotNull (entry, "Entry 0x1026 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1027 (ExternalFlashZoom/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ExternalFlashZoom);
				Assert.IsNotNull (entry, "Entry 0x1027 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1028 (ExternalFlashMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ExternalFlashMode);
				Assert.IsNotNull (entry, "Entry 0x1028 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1029 (Contrast/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0x1029 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x102A (SharpnessFactor/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.SharpnessFactor);
				Assert.IsNotNull (entry, "Entry 0x102A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x102B (ColorControl/Short/6) "56024 63818 42376 12 65280 14993"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ColorControl);
				Assert.IsNotNull (entry, "Entry 0x102B missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 56024, 63818, 42376, 12, 65280, 14993 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x102C (ValidBits/Short/2) "10 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ValidBits);
				Assert.IsNotNull (entry, "Entry 0x102C missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 10, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Olympus.0x102D (CoringFilter/Short/1) "1792"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.CoringFilter);
				Assert.IsNotNull (entry, "Entry 0x102D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1792, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x102E (ImageWidth/Long/1) "2240"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x102E missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2240, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x102F (ImageHeight/Long/1) "1680"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.ImageHeight);
				Assert.IsNotNull (entry, "Entry 0x102F missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1680, (entry as LongIFDEntry).Value);
			}
			// Olympus.0x1030 (0x1030/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1030
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1030);
				Assert.IsNotNull (entry, "Entry 0x1030 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1031 (0x1031/Long/8) "456164396 3548531428 3220502079 1524028172 379014428 2764611586 157170167 2795214894"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1031
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1031);
				Assert.IsNotNull (entry, "Entry 0x1031 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 456164396, 3548531428, 3220502079, 1524028172, 379014428, 2764611586, 157170167, 2795214894 }, (entry as LongArrayIFDEntry).Values);
			}
			// Olympus.0x1032 (0x1032/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1032
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1032);
				Assert.IsNotNull (entry, "Entry 0x1032 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Olympus.0x1033 (0x1033/Long/720) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Olympus / 0x1033
				var entry = makernote_structure.GetEntry (0, (ushort) 0x1033);
				Assert.IsNotNull (entry, "Entry 0x1033 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 3775173325, 331394186, 3281099885, 415588571, 2426091196, 4212128228, 2683815189, 1139572724, 4030669310, 877947356, 2639143467, 2070649171, 3464800745, 2355308503, 896666372, 2992184398, 3730480224, 2655348427, 1949476168, 3733186084, 3803063343, 1935747103, 863891065, 950703926, 3454560335, 246222244, 2701674380, 2626819853, 1517382345, 631836739, 3191202963, 2244309622, 4061500464, 3795641112, 3488045928, 4073115847, 206280249, 180220757, 1384811907, 1829369069, 1109751634, 1489686415, 795756839, 2330928112, 1954541719, 1050110334, 4136748398, 3006817757, 2520305159, 52224943, 357548638, 344415160, 444902544, 3345558068, 2357688060, 478163408, 4057978557, 1726171778, 1503902237, 1431841902, 2857677284, 383985415, 3060510357, 137743569, 3578698861, 1989039966, 4039826655, 3911638537, 2763491464, 3830490341, 30003179, 1568303497, 96509462, 3663574834, 2445337372, 1671773917, 3870788149, 3180420722, 958628062, 4114355108, 3246569418, 2803863317, 3540534829, 3202809588, 1533782330, 4239098617, 514240629, 971232164, 853358834, 1283694511, 1253115388, 2472364826, 779510812, 4252064062, 617834197, 886270385, 1435383474, 306235171, 4071255784, 3733273428, 1248774535, 2293129042, 3538821809, 2107986055, 2426153512, 3841867485, 3953308633, 93085972, 303122252, 1737149109, 3551364500, 1991385786, 4008910711, 1000320639, 248830453, 663092370, 857745928, 519962368, 1246447478, 960995292, 2395515671, 2284662510, 2947868834, 725462092, 3905392069, 1309211903, 11358053, 1897312037, 3617460640, 286824565, 3717300749, 634182270, 2405626554, 2828166692, 4063705886, 3164565442, 2815462827, 1495323558, 3073446409, 2378682259, 3475455354, 3569765116, 3084153749, 1045915133, 1966628744, 3725805740, 3975050445, 1009291048, 3943325923, 2352086136, 3485301028, 4049467781, 3537270455, 1275498529, 557055458, 956099561, 4249183160, 2309844716, 2778606465, 3846149856, 12499420, 238984407, 2532857668, 2197013598, 804321884, 144928977, 2855873620, 2281249806, 4219448679, 1385329594, 1022006511, 731802911, 3440968008, 1886979327, 4891944, 220399553, 3345356253, 4174365043, 2018366039, 2444127588, 2998982, 319678932, 3804024282, 1605758496, 2409348896, 4082713243, 3149825546, 257117378, 1423677646, 918445078, 538044755, 4189203334, 2438284870, 3707218137, 3526673509, 2764685341, 842901782, 1360214240, 2625413363, 1488383078, 1783474582, 574180118, 957116801, 3982127453, 1142258920, 3654823687, 2460472237, 1936461882, 3369206365, 1191422014, 4117591412, 4074122115, 3109384287, 523303506, 3849273651, 1273874943, 4106751, 8245592, 2137960959, 10384255, 3745680047, 1690723657, 2791096853, 522275589, 3721868752, 3916829380, 3230222866, 941161411, 3174521544, 814252043, 3077969124, 1946091754, 2863881436, 2964807753, 1411121274, 528140915, 2638785300, 3677875444, 3635265936, 3978885320, 1849806159, 243478179, 2125519067, 2844901664, 1862274165, 3870453029, 2512521111, 2571710137, 3474580457, 1587667181, 349930708, 4243941477, 3391780643, 953056116, 2846183026, 2875640741, 121198828, 880621921, 3533060142, 414393892, 1998371715, 2194136864, 4267008734, 3874938269, 2789483377, 1571453246, 3802387486, 725309342, 13748387, 587435643, 3820843226, 4019105190, 1228200375, 2307940767, 22307953, 3355656014, 735354184, 3253451243, 1098071646, 3886210703, 3059286596, 2298298567, 3455735149, 728513121, 1923909643, 829888551, 2457062777, 3026131565, 873277805, 615607209, 3797030060, 2217472625, 2518720464, 3608915068, 1121352789, 1628814530, 1210156212, 2990296562, 1674609209, 3850844643, 347972201, 1293494708, 3104765893, 3191591924, 1221754143, 1445933902, 3151901220, 1073750159, 1189860149, 3614038741, 3334332891, 1002005589, 4218269810, 1612240968, 3826029512, 3925351161, 920841819, 4098908994, 3952431243, 2193874717, 1224652267, 3741569876, 3566663381, 1966695089, 3051022036, 2729454809, 3826387231, 2007025489, 1461236819, 2004314019, 3316145351, 1882032187, 3582125300, 3239923637, 1959942491, 3445907172, 2380362446, 238028788, 2887365782, 2203530053, 1996384606, 2266561707, 3485345016, 2948905533, 3961146261, 1528542244, 3406593851, 685872374, 4278253046, 3868021367, 1186292893, 2624862959, 501840442, 1746070032, 1571043249, 3328478716, 4025854471, 735551034, 2078456207, 54752125, 2003793264, 1653477952, 2386820786, 1175089231, 1052681149, 2046145351, 2067477282, 2391059376, 32624143, 1582257103, 655743194, 1554209882, 1288877073, 1122337962, 1257866368, 1415817952, 332381554, 3452029257, 2694878458, 3933928869, 4217180443, 1180010815, 822346305, 3354699721, 1738922218, 3218765966, 1003199920, 3141206111, 1748561918, 2131389853, 2499481989, 3295833921, 3049728899, 4259315456, 1608998479, 3811298251, 1864054173, 3418958934, 2705604170, 1637104258, 1501162386, 1205982906, 710176909, 3983747512, 3739852279, 3292220347, 3742096732, 2862759312, 2031422318, 213612910, 3626004167, 1593770119, 2167774242, 3525925413, 743340264, 1810402582, 1507418438, 386321474, 2818384646, 1115316657, 3345995452, 2682422933, 1839659156, 1197522509, 2895162233, 1790913646, 1942025416, 432360788, 3672524582, 647727702, 1729933078, 3787000006, 14277611, 1337492189, 654731638, 4007741468, 1743477164, 3527635089, 4209250831, 1129223908, 270704066, 2742033495, 1059836130, 2980237618, 932584740, 3239586361, 894748850, 1221675648, 983549071, 2056665442, 75770375, 3713525663, 2805287497, 1628911725, 3229729576, 3462941600, 335089919, 9520439, 1627323262, 2147314216, 3138098656, 3578761932, 3745082368, 1223178669, 3364095698, 400350109, 2383759140, 2069307537, 4181731475, 59539803, 4137129724, 2238549673, 4071854478, 707515062, 2972291932, 1216931348, 1872261144, 535256713, 3771667306, 2596707102, 2463154864, 1529529559, 2075243898, 28777655, 3194734941, 2524538515, 2442392290, 3175334002, 3914528890, 1477894309, 3626487439, 3422589342, 263767401, 1243009256, 3259430188, 3717130075, 2465153776, 3989107038, 592118383, 48818034, 2394881792, 1257299275, 1586950743, 2531797860, 3854340482, 3275602229, 3496613559, 372750192, 4014566510, 1498710934, 1610742970, 2452327636, 1205448494, 546009633, 3242255342, 2211979119, 1792174413, 3723771241, 1380998358, 1339009362, 1807072658, 589562758, 1851623437, 3892919423, 707103453, 1814337486, 1221535075, 1438702993, 2449348003, 2699612875, 876041050, 2782767915, 497874976, 2364807452, 2105371229, 1895397169, 3476983030, 724173587, 3963567932, 271594042, 235927635, 2001564316, 1934839114, 3684217308, 1515937094, 3605852707, 2251170658, 2803725941, 3922984074, 3689989793, 2842229457, 3572788185, 747307690, 2890082596, 1735069419, 2673862489, 376450971, 739075725, 620504008, 1253337044, 1664656569, 393319074, 1034657335, 314839494, 1124086334, 2497411025, 2440471929, 493195205, 2400466824, 2780795848, 3132723524, 251955707, 3181441024, 404783695, 553119573, 2086003437, 1398790051, 3116325712, 2445697673, 588014421, 3930602867, 2661726392, 1708882114, 1407562496, 29826773, 2931185484, 3008306305, 1616197345, 2425819710, 3502537459, 3610822251, 1504114648, 3614810404, 2010339730, 2523685705, 1991032401, 3228944236, 4216806693, 3452230271, 4133855814, 280111159, 229951279, 2786047870, 1177668979, 2050781976, 2924927304, 3106567848, 1574688134, 410857551, 1035593405, 1673723396, 2625130316, 3622080089, 2942539111, 1266141133, 130682732, 2519347769, 3343565713, 3387691188, 1952868228, 3347590318, 2921208213, 595622159, 18552217, 2130051272, 132103511, 452373986, 1863437169, 1671902359, 1453999249, 2113290264, 2393053503, 3876970314, 2939598562, 3715177440, 3826056960, 268041387, 1464382386, 3517963617, 2367908193, 1183992928, 3138548303, 3107563241, 699291569, 3165247787, 2056633395, 2916739702, 4074495676, 2526515357, 2988652230, 132109306, 1469053183, 5225170, 2085188971, 889127018, 3888940638, 3847983504, 975169494, 3136260510, 473095709, 1791367526, 1731946053, 1111546559, 2133041344, 3841796995, 3621893813, 3096817121, 826460850, 3332475178, 2896265252, 4123423044, 4002884423, 2640169830, 1707419549, 2510124700, 1728292196, 1599714482, 613529320, 2737077610, 3932092850, 849885534, 3295832571, 3784470553, 1492881055, 1255028611, 3117001316, 1456598365, 2327941115, 1669725952, 3956597465, 1363364074, 1927034425, 528834525, 180548012, 705291290, 2794540851, 2854276201, 3358311708, 3608245198, 3053387934, 4278253801, 2729179507, 4278243079, 4278238935, 4230521749, 1998160133, 3109286658, 1030908402, 294781148, 1198157351, 57886400, 2111979744, 179352007, 839276880, 1245675660, 334802205, 3996254404, 1175431652, 1959094888, 3601544660 }, (entry as LongArrayIFDEntry).Values);
			}
			// Olympus.0x1034 (CompressionRatio/Rational/1) "3531718916/243211988"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) OlympusMakerNoteEntryTag.CompressionRatio);
				Assert.IsNotNull (entry, "Entry 0x1034 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3531718916, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (243211988, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "2240"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2240, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "1680"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1680, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "1504"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "1628"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "11447"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (11447, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

            // This file doesn't have an orientation tag, we had a bug that causes
            // an exception when looking it up. Test it here.
            Assert.AreEqual (ImageOrientation.None, file.ImageTag.Orientation);

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/15) "Canon EOS 450D"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 450D", (entry as StringIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:02:08 11:37:33"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:08 11:37:33", (entry as StringIFDEntry).Value);
			}
			// Image.0x013B (Artist/Ascii/17) "Ruben Vermeersch"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Artist);
				Assert.IsNotNull (entry, "Entry 0x013B missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Ruben Vermeersch", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "186"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/60"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (60, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "32/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (32, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "1600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1600, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:02:06 10:57:22"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:06 10:57:22", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:02:06 10:57:22"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:06 10:57:22", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "5906891/1000000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (5906891, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000000, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "3356144/1000000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3356144, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "2/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "35/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (35, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "02"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("02", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "02"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("02", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "4272000/878"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4272000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (878, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "2848000/584"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2848000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (584, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "674"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "17036"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (17036, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------
		}
Esempio n. 5
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

			var properties = file.Properties;
			Assert.IsNotNull (properties);
			Assert.AreEqual (3920, properties.PhotoWidth, "PhotoWidth");
			Assert.AreEqual (2638, properties.PhotoHeight, "PhotoHeight");

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x00FE (NewSubfileType/Long/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// Image.0x0100 (ImageWidth/Long/1) "320"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (320, (entry as LongIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Long/1) "240"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (240, (entry as LongIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/16) "Leica Camera AG"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Leica Camera AG", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/18) "M8 Digital Camera"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("M8 Digital Camera", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/4) "3936 69216 134496 199776"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (4, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Long/1) "68"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (68, (entry as LongIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/4) "65280 65280 65280 34560"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 65280, 65280, 65280, 34560 }, (entry as LongArrayIFDEntry).Values);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/6) "1.107"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("1.107", (entry as StringIFDEntry).Value);
			}
			// Image.0x013B (Artist/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Artist);
				Assert.IsNotNull (entry, "Entry 0x013B missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}

			var SubImage1_structure = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries [0];
			Assert.IsNotNull (SubImage1_structure, "SubImage1 structure not found");

			// SubImage1.0x00FE (NewSubfileType/Long/1) "0"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0100 (ImageWidth/Long/1) "3920"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3920, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0101 (ImageLength/Long/1) "2638"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2638, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0102 (BitsPerSample/Short/1) "8"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0103 (Compression/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0106 (PhotometricInterpretation/Short/1) "32803"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32803, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0111 (StripOffsets/StripOffsets/165) "234336 297056 359776 422496 485216 547936 610656 673376 736096 798816 861536 924256 986976 1049696 1112416 1175136 1237856 1300576 1363296 1426016 1488736 1551456 1614176 1676896 1739616 1802336 1865056 1927776 1990496 2053216 2115936 2178656 2241376 2304096 2366816 2429536 2492256 2554976 2617696 2680416 2743136 2805856 2868576 2931296 2994016 3056736 3119456 3182176 3244896 3307616 3370336 3433056 3495776 3558496 3621216 3683936 3746656 3809376 3872096 3934816 3997536 4060256 4122976 4185696 4248416 4311136 4373856 4436576 4499296 4562016 4624736 4687456 4750176 4812896 4875616 4938336 5001056 5063776 5126496 5189216 5251936 5314656 5377376 5440096 5502816 5565536 5628256 5690976 5753696 5816416 5879136 5941856 6004576 6067296 6130016 6192736 6255456 6318176 6380896 6443616 6506336 6569056 6631776 6694496 6757216 6819936 6882656 6945376 7008096 7070816 7133536 7196256 7258976 7321696 7384416 7447136 7509856 7572576 7635296 7698016 7760736 7823456 7886176 7948896 8011616 8074336 8137056 8199776 8262496 8325216 8387936 8450656 8513376 8576096 8638816 8701536 8764256 8826976 8889696 8952416 9015136 9077856 9140576 9203296 9266016 9328736 9391456 9454176 9516896 9579616 9642336 9705056 9767776 9830496 9893216 9955936 10018656 10081376 10144096 10206816 10269536 10332256 10394976 10457696 10520416"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (165, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// SubImage1.0x0115 (SamplesPerPixel/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0116 (RowsPerStrip/Long/1) "16"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (16, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0117 (StripByteCounts/Long/165) "62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 62720 54880"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 62720, 54880 }, (entry as LongArrayIFDEntry).Values);
			}
			// SubImage1.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x828D (CFARepeatPatternDim/Short/2) "2 2"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x828D
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x828D);
				Assert.IsNotNull (entry, "Entry 0x828D missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 2 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0x828E (CFAPattern/Byte/4) "0 1 1 2"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x828E
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x828E);
				Assert.IsNotNull (entry, "Entry 0x828E missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 1, 2 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// SubImage1.0xC618 (LinearizationTable/Short/256) "0 0 1 2 4 6 9 12 16 20 25 30 36 42 49 56 64 72 81 90 100 110 121 132 144 156 169 182 196 210 225 240 256 272 289 306 324 342 361 380 400 420 441 462 484 506 529 552 576 600 625 650 676 702 729 756 784 812 841 870 900 930 961 992 1024 1056 1089 1122 1156 1190 1225 1260 1296 1332 1369 1406 1444 1482 1521 1560 1600 1640 1681 1722 1764 1806 1849 1892 1936 1980 2025 2070 2116 2162 2209 2256 2304 2352 2401 2450 2500 2550 2601 2652 2704 2756 2809 2862 2916 2970 3025 3080 3136 3192 3249 3306 3364 3422 3481 3540 3600 3660 3721 3782 3844 3906 3969 4032 4096 4160 4225 4290 4356 4422 4489 4556 4624 4692 4761 4830 4900 4970 5041 5112 5184 5256 5329 5402 5476 5550 5625 5700 5776 5852 5929 6006 6084 6162 6241 6320 6400 6480 6561 6642 6724 6806 6889 6972 7056 7140 7225 7310 7396 7482 7569 7656 7744 7832 7921 8010 8100 8190 8281 8372 8464 8556 8649 8742 8836 8930 9025 9120 9216 9312 9409 9506 9604 9702 9801 9900 10000 10100 10201 10302 10404 10506 10609 10712 10816 10920 11025 11130 11236 11342 11449 11556 11664 11772 11881 11990 12100 12210 12321 12432 12544 12656 12769 12882 12996 13110 13225 13340 13456 13572 13689 13806 13924 14042 14161 14280 14400 14520 14641 14762 14884 15006 15129 15252 15376 15500 15625 15750 15876 16002 16129 16256"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.LinearizationTable);
				Assert.IsNotNull (entry, "Entry 0xC618 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 1, 2, 4, 6, 9, 12, 16, 20, 25, 30, 36, 42, 49, 56, 64, 72, 81, 90, 100, 110, 121, 132, 144, 156, 169, 182, 196, 210, 225, 240, 256, 272, 289, 306, 324, 342, 361, 380, 400, 420, 441, 462, 484, 506, 529, 552, 576, 600, 625, 650, 676, 702, 729, 756, 784, 812, 841, 870, 900, 930, 961, 992, 1024, 1056, 1089, 1122, 1156, 1190, 1225, 1260, 1296, 1332, 1369, 1406, 1444, 1482, 1521, 1560, 1600, 1640, 1681, 1722, 1764, 1806, 1849, 1892, 1936, 1980, 2025, 2070, 2116, 2162, 2209, 2256, 2304, 2352, 2401, 2450, 2500, 2550, 2601, 2652, 2704, 2756, 2809, 2862, 2916, 2970, 3025, 3080, 3136, 3192, 3249, 3306, 3364, 3422, 3481, 3540, 3600, 3660, 3721, 3782, 3844, 3906, 3969, 4032, 4096, 4160, 4225, 4290, 4356, 4422, 4489, 4556, 4624, 4692, 4761, 4830, 4900, 4970, 5041, 5112, 5184, 5256, 5329, 5402, 5476, 5550, 5625, 5700, 5776, 5852, 5929, 6006, 6084, 6162, 6241, 6320, 6400, 6480, 6561, 6642, 6724, 6806, 6889, 6972, 7056, 7140, 7225, 7310, 7396, 7482, 7569, 7656, 7744, 7832, 7921, 8010, 8100, 8190, 8281, 8372, 8464, 8556, 8649, 8742, 8836, 8930, 9025, 9120, 9216, 9312, 9409, 9506, 9604, 9702, 9801, 9900, 10000, 10100, 10201, 10302, 10404, 10506, 10609, 10712, 10816, 10920, 11025, 11130, 11236, 11342, 11449, 11556, 11664, 11772, 11881, 11990, 12100, 12210, 12321, 12432, 12544, 12656, 12769, 12882, 12996, 13110, 13225, 13340, 13456, 13572, 13689, 13806, 13924, 14042, 14161, 14280, 14400, 14520, 14641, 14762, 14884, 15006, 15129, 15252, 15376, 15500, 15625, 15750, 15876, 16002, 16129, 16256 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0xC61D (WhiteLevel/Long/1) "16383"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.WhiteLevel);
				Assert.IsNotNull (entry, "Entry 0xC61D missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (16383, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0xC61F (DefaultCropOrigin/Short/2) "2 2"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.DefaultCropOrigin);
				Assert.IsNotNull (entry, "Entry 0xC61F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 2 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0xC620 (DefaultCropSize/Short/2) "3916 2634"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.DefaultCropSize);
				Assert.IsNotNull (entry, "Entry 0xC620 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 3916, 2634 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0xC62D (BayerGreenSplit/Long/1) "500"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.BayerGreenSplit);
				Assert.IsNotNull (entry, "Entry 0xC62D missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (500, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0xC632 (AntiAliasStrength/Rational/1) "0/1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.AntiAliasStrength);
				Assert.IsNotNull (entry, "Entry 0xC632 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x8298 (Copyright/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Copyright);
				Assert.IsNotNull (entry, "Entry 0x8298 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "764"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "12000000/1000000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (12000000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "160"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (160, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2007:08:02 22:13:49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2007:08:02 22:13:49", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "-229376/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-229376, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "131072/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (131072, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "50000/1000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (50000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/220) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "0/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "67"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (67, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA420 (ImageUniqueID/Ascii/33) "00000000000000000000000000000147"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ImageUniqueID);
				Assert.IsNotNull (entry, "Entry 0xA420 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00000000000000000000000000000147", (entry as StringIFDEntry).Value);
			}
			// Image.0x882B (SelfTimerMode/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Image / 0x882B
				var entry = structure.GetEntry (0, (ushort) 0x882B);
				Assert.IsNotNull (entry, "Entry 0x882B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x9003 (DateTimeOriginal/Ascii/20) "2007:08:02 22:13:49"
			{
				var entry = structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2007:08:02 22:13:49", (entry as StringIFDEntry).Value);
			}
			// Image.0x920E (FocalPlaneXResolution/Rational/1) "3729/1"
			{
				// TODO: Unknown IFD tag: Image / 0x920E
				var entry = structure.GetEntry (0, (ushort) 0x920E);
				Assert.IsNotNull (entry, "Entry 0x920E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3729, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x920F (FocalPlaneYResolution/Rational/1) "3764/1"
			{
				// TODO: Unknown IFD tag: Image / 0x920F
				var entry = structure.GetEntry (0, (ushort) 0x920F);
				Assert.IsNotNull (entry, "Entry 0x920F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3764, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x9210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				// TODO: Unknown IFD tag: Image / 0x9210
				var entry = structure.GetEntry (0, (ushort) 0x9210);
				Assert.IsNotNull (entry, "Entry 0x9210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x9216 (TIFFEPStandardID/Byte/4) "0 0 0 1"
			{
				// TODO: Unknown IFD tag: Image / 0x9216
				var entry = structure.GetEntry (0, (ushort) 0x9216);
				Assert.IsNotNull (entry, "Entry 0x9216 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0xC612 (DNGVersion/Byte/4) "1 0 0 0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DNGVersion);
				Assert.IsNotNull (entry, "Entry 0xC612 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0xC614 (UniqueCameraModel/Ascii/18) "M8 Digital Camera"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.UniqueCameraModel);
				Assert.IsNotNull (entry, "Entry 0xC614 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("M8 Digital Camera", (entry as StringIFDEntry).Value);
			}
			// Image.0xC621 (ColorMatrix1/SRational/9) "10469/10000 -5314/10000 1280/10000 -4326/10000 12176/10000 2419/10000 -886/10000 2473/10000 7160/10000"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ColorMatrix1);
				Assert.IsNotNull (entry, "Entry 0xC621 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalArrayIFDEntry, "Entry is not a srational array!");
				var parts = (entry as SRationalArrayIFDEntry).Values;
				Assert.AreEqual (9, parts.Length);
				Assert.AreEqual (10469, parts[0].Numerator);
				Assert.AreEqual (10000, parts[0].Denominator);
				Assert.AreEqual (-5314, parts[1].Numerator);
				Assert.AreEqual (10000, parts[1].Denominator);
				Assert.AreEqual (1280, parts[2].Numerator);
				Assert.AreEqual (10000, parts[2].Denominator);
				Assert.AreEqual (-4326, parts[3].Numerator);
				Assert.AreEqual (10000, parts[3].Denominator);
				Assert.AreEqual (12176, parts[4].Numerator);
				Assert.AreEqual (10000, parts[4].Denominator);
				Assert.AreEqual (2419, parts[5].Numerator);
				Assert.AreEqual (10000, parts[5].Denominator);
				Assert.AreEqual (-886, parts[6].Numerator);
				Assert.AreEqual (10000, parts[6].Denominator);
				Assert.AreEqual (2473, parts[7].Numerator);
				Assert.AreEqual (10000, parts[7].Denominator);
				Assert.AreEqual (7160, parts[8].Numerator);
				Assert.AreEqual (10000, parts[8].Denominator);
			}
			// Image.0xC622 (ColorMatrix2/SRational/9) "7675/10000 -2195/10000 -305/10000 -5860/10000 14118/10000 1857/10000 -2425/10000 4007/10000 6578/10000"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ColorMatrix2);
				Assert.IsNotNull (entry, "Entry 0xC622 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalArrayIFDEntry, "Entry is not a srational array!");
				var parts = (entry as SRationalArrayIFDEntry).Values;
				Assert.AreEqual (9, parts.Length);
				Assert.AreEqual (7675, parts[0].Numerator);
				Assert.AreEqual (10000, parts[0].Denominator);
				Assert.AreEqual (-2195, parts[1].Numerator);
				Assert.AreEqual (10000, parts[1].Denominator);
				Assert.AreEqual (-305, parts[2].Numerator);
				Assert.AreEqual (10000, parts[2].Denominator);
				Assert.AreEqual (-5860, parts[3].Numerator);
				Assert.AreEqual (10000, parts[3].Denominator);
				Assert.AreEqual (14118, parts[4].Numerator);
				Assert.AreEqual (10000, parts[4].Denominator);
				Assert.AreEqual (1857, parts[5].Numerator);
				Assert.AreEqual (10000, parts[5].Denominator);
				Assert.AreEqual (-2425, parts[6].Numerator);
				Assert.AreEqual (10000, parts[6].Denominator);
				Assert.AreEqual (4007, parts[7].Numerator);
				Assert.AreEqual (10000, parts[7].Denominator);
				Assert.AreEqual (6578, parts[8].Numerator);
				Assert.AreEqual (10000, parts[8].Denominator);
			}
			// Image.0xC623 (CameraCalibration1/SRational/9) "1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.CameraCalibration1);
				Assert.IsNotNull (entry, "Entry 0xC623 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalArrayIFDEntry, "Entry is not a srational array!");
				var parts = (entry as SRationalArrayIFDEntry).Values;
				Assert.AreEqual (9, parts.Length);
				Assert.AreEqual (1, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (0, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (0, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
				Assert.AreEqual (1, parts[4].Numerator);
				Assert.AreEqual (1, parts[4].Denominator);
				Assert.AreEqual (0, parts[5].Numerator);
				Assert.AreEqual (1, parts[5].Denominator);
				Assert.AreEqual (0, parts[6].Numerator);
				Assert.AreEqual (1, parts[6].Denominator);
				Assert.AreEqual (0, parts[7].Numerator);
				Assert.AreEqual (1, parts[7].Denominator);
				Assert.AreEqual (1, parts[8].Numerator);
				Assert.AreEqual (1, parts[8].Denominator);
			}
			// Image.0xC624 (CameraCalibration2/SRational/9) "1/1 0/1 0/1 0/1 1/1 0/1 0/1 0/1 1/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.CameraCalibration2);
				Assert.IsNotNull (entry, "Entry 0xC624 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalArrayIFDEntry, "Entry is not a srational array!");
				var parts = (entry as SRationalArrayIFDEntry).Values;
				Assert.AreEqual (9, parts.Length);
				Assert.AreEqual (1, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (0, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (0, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
				Assert.AreEqual (1, parts[4].Numerator);
				Assert.AreEqual (1, parts[4].Denominator);
				Assert.AreEqual (0, parts[5].Numerator);
				Assert.AreEqual (1, parts[5].Denominator);
				Assert.AreEqual (0, parts[6].Numerator);
				Assert.AreEqual (1, parts[6].Denominator);
				Assert.AreEqual (0, parts[7].Numerator);
				Assert.AreEqual (1, parts[7].Denominator);
				Assert.AreEqual (1, parts[8].Numerator);
				Assert.AreEqual (1, parts[8].Denominator);
			}
			// Image.0xC628 (AsShotNeutral/Rational/3) "16384/34488 16384/16384 16384/20567"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.AsShotNeutral);
				Assert.IsNotNull (entry, "Entry 0xC628 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (3, parts.Length);
				Assert.AreEqual (16384, parts[0].Numerator);
				Assert.AreEqual (34488, parts[0].Denominator);
				Assert.AreEqual (16384, parts[1].Numerator);
				Assert.AreEqual (16384, parts[1].Denominator);
				Assert.AreEqual (16384, parts[2].Numerator);
				Assert.AreEqual (20567, parts[2].Denominator);
			}
			// Image.0xC62B (BaselineNoise/Rational/1) "1/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BaselineNoise);
				Assert.IsNotNull (entry, "Entry 0xC62B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0xC62C (BaselineSharpness/Rational/1) "1/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BaselineSharpness);
				Assert.IsNotNull (entry, "Entry 0xC62C missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0xC62F (CameraSerialNumber/Ascii/8) "3106091"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.CameraSerialNumber);
				Assert.IsNotNull (entry, "Entry 0xC62F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("3106091", (entry as StringIFDEntry).Value);
			}
			// Image.0xC65A (CalibrationIlluminant1/Short/1) "17"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.CalibrationIlluminant1);
				Assert.IsNotNull (entry, "Entry 0xC65A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (17, (entry as ShortIFDEntry).Value);
			}
			// Image.0xC65B (CalibrationIlluminant2/Short/1) "21"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.CalibrationIlluminant2);
				Assert.IsNotNull (entry, "Entry 0xC65B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (21, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/32) "Canon EOS 400D DIGITAL"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "350/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (350, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "350/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (350, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/28) "Digital Photo Professional"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Digital Photo Professional", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2009:08:09 19:12:44"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:08:09 19:12:44", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "236"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (200, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "63/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (63, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (400, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:08:09 19:12:44"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:08:09 19:12:44", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:08:09 19:12:44"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:08:09 19:12:44", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1, 2, 3, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "500948/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (500948, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "348042/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (348042, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "180/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/1072) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Canon, makernote.MakernoteType);

			// CanonCs.0x0000 (0x0000/Short/1) "94"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (94, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCs.0x0001 (Macro/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCs.0x0002 (Selftimer/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCs.0x0003 (Quality/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCs.0x0004 (FlashMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCs.0x0005 (DriveMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCs.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCs.0x0007 (FocusMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCs.0x0008 (0x0008/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCs.0x0009 (0x0009/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCs.0x000A (ImageSize/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCs.0x000B (EasyMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonCs.0x000C (DigitalZoom/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonCs.0x000D (Contrast/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonCs.0x000E (Saturation/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonCs.0x000F (Sharpness/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonCs.0x0010 (ISOSpeed/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonCs.0x0011 (MeteringMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonCs.0x0012 (FocusType/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonCs.0x0013 (AFPoint/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonCs.0x0014 (ExposureProgram/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonCs.0x0015 (0x0015/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonCs.0x0016 (LensType/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonCs.0x0017 (Lens/Short/3) "300 70 1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (300, (entry as ShortArrayIFDEntry).Values [23]);
				Assert.AreEqual (70, (entry as ShortArrayIFDEntry).Values [24]);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonCs.0x001A (MaxAperture/Short/1) "139"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (139, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonCs.0x001B (MinAperture/Short/1) "336"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (336, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonCs.0x001C (FlashActivity/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonCs.0x001D (FlashDetails/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonCs.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonCs.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonCs.0x0020 (FocusContinuous/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonCs.0x0021 (AESetting/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// CanonCs.0x0022 (ImageStabilization/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (35 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [34]);
			}
			// CanonCs.0x0023 (DisplayAperture/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (36 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [35]);
			}
			// CanonCs.0x0024 (ZoomSourceWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (37 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [36]);
			}
			// CanonCs.0x0025 (ZoomTargetWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (38 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [37]);
			}
			// CanonCs.0x0026 (0x0026/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (39 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [38]);
			}
			// CanonCs.0x0027 (0x0027/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (40 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [39]);
			}
			// CanonCs.0x0028 (PhotoEffect/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (41 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [40]);
			}
			// CanonCs.0x0029 (0x0029/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (42 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [41]);
			}
			// CanonCs.0x002A (ColorTone/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (43 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [42]);
			}
			// CanonCs.0x002B (0x002b/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (44 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [43]);
			}
			// CanonCs.0x002C (0x002c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (45 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [44]);
			}
			// CanonCs.0x002D (0x002d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (46 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [45]);
			}
			// CanonCs.0x002E (0x002e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (47 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [46]);
			}
			// Canon.0x0002 (0x0002/Short/4) "2 180 907 605"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 180, 907, 605 }, (entry as ShortArrayIFDEntry).Values);
			}
			// CanonSi.0x0000 (0x0000/Short/1) "66"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (66, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonSi.0x0001 (0x0001/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonSi.0x0002 (ISOSpeed/Short/1) "224"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (224, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonSi.0x0003 (0x0003/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonSi.0x0004 (TargetAperture/Short/1) "170"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (170, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonSi.0x0005 (TargetShutterSpeed/Short/1) "245"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (245, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonSi.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonSi.0x0007 (WhiteBalance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonSi.0x0008 (0x0008/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonSi.0x0009 (Sequence/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonSi.0x000A (0x000a/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonSi.0x000B (0x000b/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonSi.0x000C (0x000c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonSi.0x000D (0x000d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonSi.0x000E (AFPointUsed/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonSi.0x000F (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonSi.0x0010 (0x0010/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonSi.0x0011 (0x0011/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonSi.0x0012 (0x0012/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonSi.0x0013 (SubjectDistance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonSi.0x0014 (0x0014/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonSi.0x0015 (ApertureValue/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonSi.0x0016 (ShutterSpeedValue/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonSi.0x0017 (0x0017/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (24 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [23]);
			}
			// CanonSi.0x0018 (0x0018/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (25 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [24]);
			}
			// CanonSi.0x0019 (0x0019/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonSi.0x001A (0x001a/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonSi.0x001B (0x001b/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonSi.0x001C (0x001c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonSi.0x001D (0x001d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonSi.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonSi.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonSi.0x0020 (0x0020/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// Canon.0x0006 (ImageType/Ascii/32) "Canon EOS 400D DIGITAL"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageType);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0007 (FirmwareVersion/Ascii/32) "Firmware 1.1.0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Firmware 1.1.0", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0008 (ImageNumber/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageNumber);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0009 (OwnerName/Ascii/32) "Mike Gemuende"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.OwnerName);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Mike Gemuende", (entry as StringIFDEntry).Value);
			}
			// Canon.0x000C (SerialNumber/Long/1) "630363764"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumber);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (630363764, (entry as LongIFDEntry).Value);
			}
			// CanonCf.0x0000 (0x0000/Short/1) "24"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (24, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCf.0x0001 (NoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCf.0x0002 (ShutterAeLock/Short/1) "256"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (256, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCf.0x0003 (MirrorLockup/Short/1) "512"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (512, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCf.0x0004 (ExposureLevelIncrements/Short/1) "768"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (768, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCf.0x0005 (AFAssist/Short/1) "1024"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1024, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCf.0x0006 (FlashSyncSpeedAv/Short/1) "1280"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1280, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCf.0x0007 (AEBSequence/Short/1) "1536"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1536, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCf.0x0008 (ShutterCurtainSync/Short/1) "1792"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1792, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCf.0x0009 (LensAFStopButton/Short/1) "2048"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2048, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCf.0x000A (FillFlashAutoReduction/Short/1) "2304"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2304, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCf.0x000B (MenuButtonReturn/Short/1) "2560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2560, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// Canon.0x0010 (ModelID/Long/1) "2147484214"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ModelID);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2147484214, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0015 (0x0015/Long/1) "2684354560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumberFormat);
				Assert.IsNotNull (entry, "Entry 0x0015 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2684354560, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0016 (0x0016/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Canon / 0x0016
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0016);
				Assert.IsNotNull (entry, "Entry 0x0016 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0019 (0x0019/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Canon / 0x0019
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0019);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x0093 (0x0093/Short/17) "34 44371 96 0 0 0 65535 65535 0 0 0 0 0 0 0 0 101"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CanonFileInfo);
				Assert.IsNotNull (entry, "Entry 0x0093 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 34, 44371, 96, 0, 0, 0, 65535, 65535, 0, 0, 0, 0, 0, 0, 0, 0, 101 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0095 (0x0095/Ascii/64) "EF70-300mm f/4-5.6 IS USM"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.LensModel);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("EF70-300mm f/4-5.6 IS USM", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0096 (0x0096/Ascii/16) "H0733598"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialInfo);
				Assert.IsNotNull (entry, "Entry 0x0096 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("H0733598", (entry as StringIFDEntry).Value);
			}
			// Canon.0x00A0 (0x00a0/Short/14) "28 0 3 0 0 0 0 0 32768 5200 129 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ProcessingInfo);
				Assert.IsNotNull (entry, "Entry 0x00A0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 28, 0, 3, 0, 0, 0, 0, 0, 32768, 5200, 129, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00AA (0x00aa/Short/5) "10 468 1024 1024 228"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.MeasuredColor);
				Assert.IsNotNull (entry, "Entry 0x00AA missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 10, 468, 1024, 1024, 228 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00B4 (0x00b4/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0x00B4 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x00E0 (0x00e0/Short/17) "34 3948 2622 1 1 52 23 3939 2614 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SensorInfo);
				Assert.IsNotNull (entry, "Entry 0x00E0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 34, 3948, 2622, 1, 1, 52, 23, 3939, 2614, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4008 (0x4008/Short/3) "129 129 129"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.BlackLevel);
				Assert.IsNotNull (entry, "Entry 0x4008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 129, 129, 129 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4009 (0x4009/Short/3) "0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x4009
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4009);
				Assert.IsNotNull (entry, "Entry 0x4009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4010 (0x4010/Ascii/32) ""
			{
				// TODO: Unknown IFD tag: Canon / 0x4010
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4010);
				Assert.IsNotNull (entry, "Entry 0x4010 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Canon.0x4011 (0x4011/Undefined/252) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Canon / 0x4011
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4011);
				Assert.IsNotNull (entry, "Entry 0x4011 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9286 (UserComment/UserComment/264) "%test comment%"
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "19"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (19, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "41"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (41, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "1978"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Iop.0x1001 (RelatedImageWidth/Short/1) "19"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.RelatedImageWidth);
				Assert.IsNotNull (entry, "Entry 0x1001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (19, (entry as ShortIFDEntry).Value);
			}
			// Iop.0x1002 (RelatedImageLength/Short/1) "41"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.RelatedImageLength);
				Assert.IsNotNull (entry, "Entry 0x1002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (41, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "3888000/877"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3888000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (877, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "2592000/582"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2592000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (582, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "350/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (350, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "350/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (350, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "2142"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "2305"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2305, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
Esempio n. 7
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

			Assert.AreEqual (2000, file.Properties.PhotoWidth);
			Assert.AreEqual (3008, file.Properties.PhotoHeight);
			Assert.AreEqual (96, file.Properties.PhotoQuality);

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "NIKON D70"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D70", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/47) "Microsoft Windows Photo Gallery 6.0.6001.18000"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6001.18000", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2009:08:04 22:45:07"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:08:04 22:45:07", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x4746 (Rating/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Rating);
				Assert.IsNotNull (entry, "Entry 0x4746 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x4749 (RatingPercent/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RatingPercent);
				Assert.IsNotNull (entry, "Entry 0x4749 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "2318"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/1250"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1250, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "56/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (56, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:05:22 15:27:59"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:05:22 15:27:59", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:05:22 15:27:59"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:05:22 15:27:59", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1, 2, 3, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "44/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (44, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "290/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (290, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/26748) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Nikon3, makernote.MakernoteType);

			// Nikon3.0x0001 (Version/Undefined/4) "48 50 49 48 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Version);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 49, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0002 (ISOSpeed/Short/2) "0 800"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSpeed);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 800 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0004 (Quality/Ascii/8) "FINE   "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("FINE   ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0005 (WhiteBalance/Ascii/13) "AUTO        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0006 (Sharpening/Ascii/7) "AUTO  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Sharpening);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0007 (Focus/Ascii/7) "AF-S  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Focus);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AF-S  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0008 (FlashSetting/Ascii/13) "NORMAL      "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashSetting);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NORMAL      ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0009 (FlashDevice/Ascii/13) "            "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashDevice);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("            ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x000B (WhiteBalanceBias/SShort/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalanceBias);
				Assert.IsNotNull (entry, "Entry 0x000B missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (0, (entry as SShortIFDEntry).Value);
			}
			// Nikon3.0x000D (ProgramShift/Undefined/4) "0 1 6 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ProgramShift);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 6, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x000E (ExposureDiff/Undefined/4) "0 1 12 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureDiff);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 12, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0011 (Preview/SubIFD/1) "1430"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview);
				Assert.IsNotNull (entry, "Entry 0x0011 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var nikonpreview = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview) as SubIFDEntry;
			Assert.IsNotNull (nikonpreview, "Nikon preview tag not found");
			var nikonpreview_structure = nikonpreview.Structure;

			// NikonPreview.0x0103 (Compression/Short/1) "6"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x0103
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x0103);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x011A (XResolution/Rational/1) "300/1"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x011A
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x011A);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x011B (YResolution/Rational/1) "300/1"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x011B
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x011B);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x0128 (ResolutionUnit/Short/1) "2"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x0128
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x0128);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "1538"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x0201
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x0201);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// NikonPreview.0x0202 (JPEGInterchangeFormatLength/Long/1) "25199"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x0202
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x0202);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (25199, (entry as LongIFDEntry).Value);
			}
			// NikonPreview.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				// TODO: Unknown IFD tag: NikonPreview / 0x0213
				var entry = nikonpreview_structure.GetEntry (0, (ushort) 0x0213);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x0012 (FlashComp/Undefined/4) "253 1 6 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashComp);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 253, 1, 6, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0013 (ISOSettings/Short/2) "0 800"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSettings);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 800 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0016 (ImageBoundary/Short/4) "0 0 3008 2000"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageBoundary);
				Assert.IsNotNull (entry, "Entry 0x0016 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 3008, 2000 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0017 (0x0017/Undefined/4) "0 1 6 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown23);
				Assert.IsNotNull (entry, "Entry 0x0017 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 6, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0018 (FlashBracketComp/Undefined/4) "0 1 6 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 6, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0019 (ExposureBracketComp/SRational/1) "0/1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Nikon3.0x0081 (ToneComp/Ascii/9) "AUTO    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ToneComp);
				Assert.IsNotNull (entry, "Entry 0x0081 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0083 (LensType/Byte/1) "14 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x0083 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (14 , (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0084 (Lens/Rational/4) "180/10 550/10 35/10 56/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Lens);
				Assert.IsNotNull (entry, "Entry 0x0084 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (180, parts[0].Numerator);
				Assert.AreEqual (10, parts[0].Denominator);
				Assert.AreEqual (550, parts[1].Numerator);
				Assert.AreEqual (10, parts[1].Denominator);
				Assert.AreEqual (35, parts[2].Numerator);
				Assert.AreEqual (10, parts[2].Denominator);
				Assert.AreEqual (56, parts[3].Numerator);
				Assert.AreEqual (10, parts[3].Denominator);
			}
			// Nikon3.0x0087 (FlashMode/Byte/1) "0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashMode);
				Assert.IsNotNull (entry, "Entry 0x0087 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0 , (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0088 (AFFocusPos/Undefined/4) "1 0 0 1 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AFInfo);
				Assert.IsNotNull (entry, "Entry 0x0088 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1, 0, 0, 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0089 (ShootingMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x0089 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008A (AutoBracketRelease/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AutoBracketRelease);
				Assert.IsNotNull (entry, "Entry 0x008A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008B (LensFStops/Undefined/4) "64 1 12 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensFStops);
				Assert.IsNotNull (entry, "Entry 0x008B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 64, 1, 12, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x008D (ColorMode/Ascii/9) "MODE1a  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorHue);
				Assert.IsNotNull (entry, "Entry 0x008D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("MODE1a  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0090 (LightSource/Ascii/12) "COLORED    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x0090 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("COLORED    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0091 (0x0091/Undefined/465) "48 49 48 51 0 2 0 202 0 0 25 24 0 2 0 201 0 1 0 31 0 0 0 0 19 0 20 0 31 0 0 0 0 9 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 16 0 7 0 0 0 0 0 6 0 16 0 31 0 0 0 0 0 0 0 16 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 91 0 0 0 0 87 0 0 0 0 0 91 2 6 240 241 7 10 25 20 18 28 18 112 0 216 0 211 0 149 0 151 0 10 1 104 0 2 0 33 0 2 0 0 0 0 0 1 0 2 0 0 1 200 0 0 0 104 168 96 12 12 196 112 7 12 176 80 130 5 16 176 14 12 128 64 2 1 145 64 13 14 52 144 14 5 172 224 11 8 104 96 8 231 128 32 9 7 144 176 143 14 52 240 13 5 144 208 9 6 240 208 77 1 148 64 15 10 176 144 2 141 176 210 11 14 240 1 78 21 24 128 5 14 25 20 18 28 18 24 0 96 0 114 0 101 101 97 98 98 104 123 109 100 98 116 120 105 100 93 250 253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 30 96 0 9 1 78 226 1 0 96 42 30 42 0 0 0 198 17 169 128 255 8 56 209 0 237 0 128 16 0 0 183 105 222 61 9 225 112 196 255 255 254 135 17 187 0 0 27 146 255 255 254 138 255 255 254 135 17 187 0 0 0 0 3 2 2 0 38 61 192 197 108 194 139 193 255 255 254 163 255 255 254 135 255 255 254 139 255 255 254 143 255 127 255 127 255 127 255 127 26 103 17 187 17 42 16 172 23 1 33 0 0 0 0 96 248 22 52 135 0 34 79 61 154 64 45 83 44 60 156 53 15 95 29 98 131 0 0 1 2 4 7 2 0 0 0 0 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0091 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 51, 0, 2, 0, 202, 0, 0, 25, 24, 0, 2, 0, 201, 0, 1, 0, 31, 0, 0, 0, 0, 19, 0, 20, 0, 31, 0, 0, 0, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 16, 0, 7, 0, 0, 0, 0, 0, 6, 0, 16, 0, 31, 0, 0, 0, 0, 0, 0, 0, 16, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 91, 2, 6, 240, 241, 7, 10, 25, 20, 18, 28, 18, 112, 0, 216, 0, 211, 0, 149, 0, 151, 0, 10, 1, 104, 0, 2, 0, 33, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1, 200, 0, 0, 0, 104, 168, 96, 12, 12, 196, 112, 7, 12, 176, 80, 130, 5, 16, 176, 14, 12, 128, 64, 2, 1, 145, 64, 13, 14, 52, 144, 14, 5, 172, 224, 11, 8, 104, 96, 8, 231, 128, 32, 9, 7, 144, 176, 143, 14, 52, 240, 13, 5, 144, 208, 9, 6, 240, 208, 77, 1, 148, 64, 15, 10, 176, 144, 2, 141, 176, 210, 11, 14, 240, 1, 78, 21, 24, 128, 5, 14, 25, 20, 18, 28, 18, 24, 0, 96, 0, 114, 0, 101, 101, 97, 98, 98, 104, 123, 109, 100, 98, 116, 120, 105, 100, 93, 250, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 30, 96, 0, 9, 1, 78, 226, 1, 0, 96, 42, 30, 42, 0, 0, 0, 198, 17, 169, 128, 255, 8, 56, 209, 0, 237, 0, 128, 16, 0, 0, 183, 105, 222, 61, 9, 225, 112, 196, 255, 255, 254, 135, 17, 187, 0, 0, 27, 146, 255, 255, 254, 138, 255, 255, 254, 135, 17, 187, 0, 0, 0, 0, 3, 2, 2, 0, 38, 61, 192, 197, 108, 194, 139, 193, 255, 255, 254, 163, 255, 255, 254, 135, 255, 255, 254, 139, 255, 255, 254, 143, 255, 127, 255, 127, 255, 127, 255, 127, 26, 103, 17, 187, 17, 42, 16, 172, 23, 1, 33, 0, 0, 0, 0, 96, 248, 22, 52, 135, 0, 34, 79, 61, 154, 64, 45, 83, 44, 60, 156, 53, 15, 95, 29, 98, 131, 0, 0, 1, 2, 4, 7, 2, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0092 (HueAdjustment/SShort/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.HueAdjustment);
				Assert.IsNotNull (entry, "Entry 0x0092 missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (0, (entry as SShortIFDEntry).Value);
			}
			// Nikon3.0x0095 (NoiseReduction/Ascii/5) "OFF "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OFF ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0097 (ColorBalance2/Undefined/140) "48 49 48 51 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 2 0 1 0 1 181 1 0 0 0 1 8 1 0 0 0 0 0 0 112 0 12 0 24 0 3 1 102 255 162 255 248 255 208 1 118 255 186 255 255 255 204 1 53 255 255 255 255 255 255 128 0 0 0 0 0 0 0 0 0 10 0 0 0 2 128 0 0 3 0 0 0 2 128 0 0 0 0 22 22 0 255 0 255 0 77 0 150 0 29 255 190 255 203 0 119 0 147 255 140 255 225 0 0 2 4 6 25 160 176 0 14 2 91 2 28 53 31 0 18 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorBalance);
				Assert.IsNotNull (entry, "Entry 0x0097 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 51, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 1, 181, 1, 0, 0, 0, 1, 8, 1, 0, 0, 0, 0, 0, 0, 112, 0, 12, 0, 24, 0, 3, 1, 102, 255, 162, 255, 248, 255, 208, 1, 118, 255, 186, 255, 255, 255, 204, 1, 53, 255, 255, 255, 255, 255, 255, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 2, 128, 0, 0, 3, 0, 0, 0, 2, 128, 0, 0, 0, 0, 22, 22, 0, 255, 0, 255, 0, 77, 0, 150, 0, 29, 255, 190, 255, 203, 0, 119, 0, 147, 255, 140, 255, 225, 0, 0, 2, 4, 6, 25, 160, 176, 0, 14, 2, 91, 2, 28, 53, 31, 0, 18 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0098 (LensData/Undefined/31) "48 49 48 49 22 52 135 0 34 79 61 154 64 45 83 44 60 156 53 15 95 29 98 131 0 0 1 2 4 7 2 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensData);
				Assert.IsNotNull (entry, "Entry 0x0098 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 49, 22, 52, 135, 0, 34, 79, 61, 154, 64, 45, 83, 44, 60, 156, 53, 15, 95, 29, 98, 131, 0, 0, 1, 2, 4, 7, 2 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x009A (SensorPixelSize/Rational/2) "78/10 78/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SensorPixelSize);
				Assert.IsNotNull (entry, "Entry 0x009A missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (2, parts.Length);
				Assert.AreEqual (78, parts[0].Numerator);
				Assert.AreEqual (10, parts[0].Denominator);
				Assert.AreEqual (78, parts[1].Numerator);
				Assert.AreEqual (10, parts[1].Denominator);
			}
			// Nikon3.0x00A0 (SerialNO/Ascii/21) "NO= 000323f8        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SerialNO);
				Assert.IsNotNull (entry, "Entry 0x00A0 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NO= 000323f8        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00A2 (ImageDataSize/Long/1) "2380705"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageDataSize);
				Assert.IsNotNull (entry, "Entry 0x00A2 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2380705, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A3 (0x00a3/Byte/1) "0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown163);
				Assert.IsNotNull (entry, "Entry 0x00A3 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0 , (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x00A7 (ShutterCount/Long/1) "14545"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShutterCount);
				Assert.IsNotNull (entry, "Entry 0x00A7 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (14545, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A8 (0x00a8/Undefined/20) "48 49 48 48 0 78 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashInfo);
				Assert.IsNotNull (entry, "Entry 0x00A8 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00A9 (ImageOptimization/Ascii/16) "CUSTOM         "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageOptimization);
				Assert.IsNotNull (entry, "Entry 0x00A9 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("CUSTOM         ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00AA (Saturation/Ascii/16) "NORMAL         "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Saturation2);
				Assert.IsNotNull (entry, "Entry 0x00AA missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NORMAL         ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00AB (VariProgram/Ascii/16) "               "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.VariProgram);
				Assert.IsNotNull (entry, "Entry 0x00AB missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("               ", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9286 (UserComment/UserComment/44) "charset="Ascii"                                     "
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Photo.0x9290 (SubSecTime/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "2000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2000, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "3008"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3008, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "31756"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 3 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 2 1 1 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 2, 0, 2, 2, 1, 1, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "1/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "43"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (43, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xEA1C (0xea1c/Undefined/2060) "28 234 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Photo / 0xEA1C
				var entry = exif_structure.GetEntry (0, (ushort) 0xEA1C);
				Assert.IsNotNull (entry, "Entry 0xEA1C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 28, 234, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xEA1D (0xea1d/SLong/1) "38"
			{
				// TODO: Unknown IFD tag: Photo / 0xEA1D
				var entry = exif_structure.GetEntry (0, (ushort) 0xEA1D);
				Assert.IsNotNull (entry, "Entry 0xEA1D missing in IFD 0");
				Assert.IsNotNull (entry as SLongIFDEntry, "Entry is not a signed long!");
				Assert.AreEqual (38, (entry as SLongIFDEntry).Value);
			}
			// Image.0xEA1C (0xea1c/Undefined/2036) "28 234 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Image / 0xEA1C
				var entry = structure.GetEntry (0, (ushort) 0xEA1C);
				Assert.IsNotNull (entry, "Entry 0xEA1C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 28, 234, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "1/96"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "1/96"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "31896"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "4534"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4534, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.MicrosoftPhoto_1_.DateAcquired (XmpText/20) "2009-08-04T20:42:36Z"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.MS_PHOTO_NS, "DateAcquired");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2009-08-04T20:42:36Z", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.MicrosoftPhoto_1_.LastKeywordXMP (XmpBag/1) "Kirche Sulzbach"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.MS_PHOTO_NS, "LastKeywordXMP");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Bag, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("Kirche Sulzbach", node.Children [0].Value);
			}
			// Xmp.MicrosoftPhoto_1_.Rating (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.MS_PHOTO_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.creatortool (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6001.18000"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "creatortool");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6001.18000", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.Rating (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.software (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6001.18000"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "software");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6001.18000", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.dc.subject (XmpBag/1) "Kirche Sulzbach"
			//  --> Test removed because of TagKeywordsModificationValidator, value is checked there.

			//  ---------- End of XMP tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

			//  ---------- Start of ImageTag tests ----------

			var imagetag = file.ImageTag;
			Assert.IsNotNull (imagetag);
			Assert.AreEqual (String.Empty, imagetag.Comment, "Comment");
			Assert.AreEqual (new string [] {}, imagetag.Keywords, "Keywords");
			Assert.AreEqual (null, imagetag.Rating, "Rating");
			Assert.AreEqual (Image.ImageOrientation.LeftBottom, imagetag.Orientation, "Orientation");
			Assert.AreEqual ("K10D Ver 1.31          ", imagetag.Software, "Software");
			Assert.AreEqual (null, imagetag.Latitude, "Latitude");
			Assert.AreEqual (null, imagetag.Longitude, "Longitude");
			Assert.AreEqual (null, imagetag.Altitude, "Altitude");
			Assert.AreEqual ((double) 1/160, imagetag.ExposureTime, "ExposureTime");
			Assert.AreEqual (4.5, imagetag.FNumber, "FNumber");
			Assert.AreEqual (640, imagetag.ISOSpeedRatings, "ISOSpeedRatings");
			Assert.AreEqual (190, imagetag.FocalLength, "FocalLength");
			Assert.AreEqual (285, imagetag.FocalLengthIn35mmFilm, "FocalLengthIn35mmFilm");
			Assert.AreEqual ("PENTAX Corporation ", imagetag.Make, "Make");
			Assert.AreEqual ("PENTAX K10D        ", imagetag.Model, "Model");
			Assert.AreEqual (null, imagetag.Creator, "Creator");

			var properties = file.Properties;
			Assert.IsNotNull (properties);
			Assert.AreEqual (3936, properties.PhotoWidth, "PhotoWidth");
			Assert.AreEqual (2624, properties.PhotoHeight, "PhotoHeight");

			//  ---------- End of ImageTag tests ----------

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x0100 (ImageWidth/Long/1) "3936"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3936, (entry as LongIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Long/1) "2624"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2624, (entry as LongIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/1) "12"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (12, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0103 (Compression/Short/1) "65535"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "32803"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32803, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/20) "PENTAX Corporation "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("PENTAX Corporation ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/20) "PENTAX K10D        "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("PENTAX K10D        ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "84700"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Long/1) "2624"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2624, (entry as LongIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "9000666"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (9000666, (entry as LongIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/24) "K10D Ver 1.31          "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("K10D Ver 1.31          ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:07:04 11:24:09"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:07:04 11:24:09", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "342"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/160"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (160, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "45/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (45, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "4"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "640"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (640, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:07:04 11:24:09"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:07:04 11:24:09", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:07:04 11:24:09"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:07:04 11:24:09", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "19000/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (19000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/77824) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;

			// Pentax.0x0000 (Version/Byte/4) "3 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Version);
				Assert.IsNotNull (entry, "Entry 0x0000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 3, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0001 (Mode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Mode);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0002 (PreviewResolution/Short/2) "640 480"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.PreviewResolution);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 640, 480 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0003 (PreviewLength/Long/1) "24947"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.PreviewLength);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (24947, (entry as LongIFDEntry).Value);
			}
			// Pentax.0x0004 (PreviewOffset/Long/1) "32520"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.PreviewOffset);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (32520, (entry as LongIFDEntry).Value);
			}
			// Pentax.0x0005 (ModelID/Long/1) "76830"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ModelID);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (76830, (entry as LongIFDEntry).Value);
			}
			// Pentax.0x0006 (Date/Undefined/4) "7 218 7 4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Date);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 7, 218, 7, 4 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0007 (Time/Undefined/3) "11 24 9"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Time);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 11, 24, 9 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0008 (Quality/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x000C (Flash/Short/2) "1 63"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 1, 63 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x000D (Focus/Short/1) "16"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Focus);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x000E (AFPoint/Short/1) "65534"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AFPoint);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65534, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0012 (ExposureTime/Long/1) "625"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (625, (entry as LongIFDEntry).Value);
			}
			// Pentax.0x0013 (FNumber/Short/1) "45"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (45, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0014 (ISO/Short/1) "14"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ISO);
				Assert.IsNotNull (entry, "Entry 0x0014 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (14, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0016 (ExposureCompensation/Short/1) "50"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ExposureCompensation);
				Assert.IsNotNull (entry, "Entry 0x0016 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (50, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0017 (MeteringMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x0017 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0018 (AutoBracketing/Short/2) "0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AutoBracketing);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0019 (WhiteBallance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WhiteBallance);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x001A (WhiteBallanceMode/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WhiteBallanceMode);
				Assert.IsNotNull (entry, "Entry 0x001A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x001D (FocalLength/Long/1) "19000"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x001D missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (19000, (entry as LongIFDEntry).Value);
			}
			// Pentax.0x001F (Saturation/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0x001F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0020 (Contrast/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0x0020 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0021 (Sharpness/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0x0021 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0022 (Location/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Location);
				Assert.IsNotNull (entry, "Entry 0x0022 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0023 (Hometown/Short/1) "24"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Hometown);
				Assert.IsNotNull (entry, "Entry 0x0023 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (24, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0024 (Destination/Short/1) "24"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Destination);
				Assert.IsNotNull (entry, "Entry 0x0024 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (24, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0025 (HometownDST/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.HometownDST);
				Assert.IsNotNull (entry, "Entry 0x0025 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0026 (DestinationDST/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.DestinationDST);
				Assert.IsNotNull (entry, "Entry 0x0026 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0027 (DSPFirmwareVersion/Undefined/4) "254 224 255 236"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.DSPFirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0027 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 254, 224, 255, 236 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0028 (CPUFirmwareVersion/Undefined/4) "254 224 255 236"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.CPUFirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0028 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 254, 224, 255, 236 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x002D (EffectiveLV/Short/1) "9472"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.EffectiveLV);
				Assert.IsNotNull (entry, "Entry 0x002D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (9472, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0033 (PictureMode/Byte/3) "4 0 1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.PictureMode);
				Assert.IsNotNull (entry, "Entry 0x0033 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 4, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0034 (DriveMode/Byte/4) "0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.DriveMode);
				Assert.IsNotNull (entry, "Entry 0x0034 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0035 (0x0035/Short/2) "11894 7962"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0035
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0035);
				Assert.IsNotNull (entry, "Entry 0x0035 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 11894, 7962 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0037 (ColorSpace/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0x0037 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0038 (0x0038/Short/2) "8 8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ImageAreaOffset);
				Assert.IsNotNull (entry, "Entry 0x0038 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0039 (0x0039/Short/2) "3872 2592"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.RawImageSize);
				Assert.IsNotNull (entry, "Entry 0x0039 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 3872, 2592 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x003D (0x003d/Short/1) "8192"
			{
				// TODO: Unknown IFD tag: Pentax / 0x003D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003D);
				Assert.IsNotNull (entry, "Entry 0x003D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8192, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x003E (PreviewImageBorders/Byte/4) "26 26 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.PreviewImageBorders);
				Assert.IsNotNull (entry, "Entry 0x003E missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 26, 26, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x003F (LensType/Byte/3) "3 255 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x003F missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 3, 255, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0047 (Temperature/SByte/1) "23"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.Temperature);
				Assert.IsNotNull (entry, "Entry 0x0047 missing in IFD 0");
				Assert.IsNotNull (entry as SByteIFDEntry, "Entry is not a signed byte!");
				Assert.AreEqual (23, (entry as SByteIFDEntry).Value);
			}
			// Pentax.0x0048 (AELock/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AELock);
				Assert.IsNotNull (entry, "Entry 0x0048 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0049 (NoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x0049 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x004D (FlashExposureCompensation/SLong/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FlashExposureCompensation);
				Assert.IsNotNull (entry, "Entry 0x004D missing in IFD 0");
				Assert.IsNotNull (entry as SLongIFDEntry, "Entry is not a signed long!");
				Assert.AreEqual (0, (entry as SLongIFDEntry).Value);
			}
			// Pentax.0x004F (ImageTone/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ImageTone);
				Assert.IsNotNull (entry, "Entry 0x004F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0050 (ColorTemperature/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ColorTemperature);
				Assert.IsNotNull (entry, "Entry 0x0050 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0053 (0x0053/Undefined/4) "187 113 0 43"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0053
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0053);
				Assert.IsNotNull (entry, "Entry 0x0053 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 187, 113, 0, 43 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0054 (0x0054/Undefined/4) "176 134 0 26"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0054
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0054);
				Assert.IsNotNull (entry, "Entry 0x0054 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 176, 134, 0, 26 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0055 (0x0055/Undefined/4) "184 86 0 37"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0055
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0055);
				Assert.IsNotNull (entry, "Entry 0x0055 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 184, 86, 0, 37 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0056 (0x0056/Undefined/4) "196 157 0 50"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0056
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0056);
				Assert.IsNotNull (entry, "Entry 0x0056 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 196, 157, 0, 50 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0057 (0x0057/Undefined/4) "185 14 0 122"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0057
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0057);
				Assert.IsNotNull (entry, "Entry 0x0057 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 185, 14, 0, 122 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0058 (0x0058/Undefined/4) "189 16 0 67"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0058
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0058);
				Assert.IsNotNull (entry, "Entry 0x0058 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 189, 16, 0, 67 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0059 (0x0059/Undefined/4) "191 152 0 85"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0059
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0059);
				Assert.IsNotNull (entry, "Entry 0x0059 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 191, 152, 0, 85 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x005A (0x005a/Undefined/4) "186 154 0 0"
			{
				// TODO: Unknown IFD tag: Pentax / 0x005A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005A);
				Assert.IsNotNull (entry, "Entry 0x005A missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 186, 154, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x005C (ShakeReduction/Byte/4) "1 1 255 47"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ShakeReduction);
				Assert.IsNotNull (entry, "Entry 0x005C missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 1, 255, 47 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x005D (ShutterCount/Undefined/4) "243 61 210 115"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ShutterCount);
				Assert.IsNotNull (entry, "Entry 0x005D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 243, 61, 210, 115 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0062 (0x0062/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0062
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0062);
				Assert.IsNotNull (entry, "Entry 0x0062 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Pentax.0x0200 (BlackPoint/Short/4) "0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.BlackPoint);
				Assert.IsNotNull (entry, "Entry 0x0200 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0201 (WhitePoint/Short/4) "12960 8192 8192 9888"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WhitePoint);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 12960, 8192, 8192, 9888 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0205 (ShotInfo/Undefined/23) "4 32 1 33 0 32 32 0 3 0 0 0 0 4 0 156 1 230 127 116 40 64 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0205 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 4, 32, 1, 33, 0, 32, 32, 0, 3, 0, 0, 0, 0, 4, 0, 156, 1, 230, 127, 116, 40, 64, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0206 (AEInfo/Undefined/16) "127 104 53 64 0 164 2 4 0 104 104 144 16 64 0 110"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AEInfo);
				Assert.IsNotNull (entry, "Entry 0x0206 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 127, 104, 53, 64, 0, 164, 2, 4, 0, 104, 104, 144, 16, 64, 0, 110 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0207 (LensInfo/Undefined/69) "131 0 0 255 0 40 148 106 65 69 6 238 65 78 153 80 40 1 73 107 251 255 255 255 0 0 69 6 238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.LensInfo);
				Assert.IsNotNull (entry, "Entry 0x0207 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 131, 0, 0, 255, 0, 40, 148, 106, 65, 69, 6, 238, 65, 78, 153, 80, 40, 1, 73, 107, 251, 255, 255, 255, 0, 0, 69, 6, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0208 (FlashInfo/Undefined/27) "0 240 63 0 0 0 0 0 166 20 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FlashInfo);
				Assert.IsNotNull (entry, "Entry 0x0208 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 240, 63, 0, 0, 0, 0, 0, 166, 20, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0209 (AEMeteringSegments/Undefined/16) "114 114 113 104 114 105 111 110 112 107 108 107 110 105 107 109"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AEMeteringSegments);
				Assert.IsNotNull (entry, "Entry 0x0209 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 114, 114, 113, 104, 114, 105, 111, 110, 112, 107, 108, 107, 110, 105, 107, 109 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x020A (FlashADump/Undefined/16) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FlashADump);
				Assert.IsNotNull (entry, "Entry 0x020A missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x020B (FlashBDump/Undefined/16) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.FlashBDump);
				Assert.IsNotNull (entry, "Entry 0x020B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x020D (WB_RGGBLevelsDaylight/Short/4) "13600 8192 8192 8765"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsDaylight);
				Assert.IsNotNull (entry, "Entry 0x020D missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 13600, 8192, 8192, 8765 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x020E (WB_RGGBLevelsShade/Short/4) "16128 8192 8192 6635"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsShade);
				Assert.IsNotNull (entry, "Entry 0x020E missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 16128, 8192, 8192, 6635 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x020F (WB_RGGBLevelsCloudy/Short/4) "14560 8192 8192 7782"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsCloudy);
				Assert.IsNotNull (entry, "Entry 0x020F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 14560, 8192, 8192, 7782 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0210 (WB_RGGBLevelsTungsten/Short/4) "8192 8192 8192 20971"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsTungsten);
				Assert.IsNotNull (entry, "Entry 0x0210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8192, 8192, 8192, 20971 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0211 (WB_RGGBLevelsFluorescentD/Short/4) "17376 8192 8192 8847"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsFluorescentD);
				Assert.IsNotNull (entry, "Entry 0x0211 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 17376, 8192, 8192, 8847 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0212 (WB_RGGBLevelsFluorescentN/Short/4) "14528 8192 8192 10076"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsFluorescentN);
				Assert.IsNotNull (entry, "Entry 0x0212 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 14528, 8192, 8192, 10076 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0213 (WB_RGGBLevelsFluorescentW/Short/4) "13088 8192 8192 12206"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsFluorescentW);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 13088, 8192, 8192, 12206 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0214 (WB_RGGBLevelsFlash/Short/4) "13632 8192 8192 8601"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.WB_RGGBLevelsFlash);
				Assert.IsNotNull (entry, "Entry 0x0214 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 13632, 8192, 8192, 8601 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Pentax.0x0215 (CameraInfo/Long/5) "76830 20071221 2 1 8120852"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.CameraInfo);
				Assert.IsNotNull (entry, "Entry 0x0215 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 76830, 20071221, 2, 1, 8120852 }, (entry as LongArrayIFDEntry).Values);
			}
			// Pentax.0x0216 (BatteryInfo/Undefined/6) "2 68 177 173 181 166"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.BatteryInfo);
				Assert.IsNotNull (entry, "Entry 0x0216 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 2, 68, 177, 173, 181, 166 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021A (0x021a/Undefined/38) "0 5 0 1 0 2 0 3 0 128 0 129 0 2 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1"
			{
				// TODO: Unknown IFD tag: Pentax / 0x021A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x021A);
				Assert.IsNotNull (entry, "Entry 0x021A missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 5, 0, 1, 0, 2, 0, 3, 0, 128, 0, 129, 0, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021B (0x021b/Undefined/40) "0 0 0 2 49 32 240 224 254 0 252 128 44 64 247 64 255 160 247 224 40 128 54 96 238 128 251 32 251 64 49 192 243 0 255 96 246 32 42 128"
			{
				// TODO: Unknown IFD tag: Pentax / 0x021B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x021B);
				Assert.IsNotNull (entry, "Entry 0x021B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 2, 49, 32, 240, 224, 254, 0, 252, 128, 44, 64, 247, 64, 255, 160, 247, 224, 40, 128, 54, 96, 238, 128, 251, 32, 251, 64, 49, 192, 243, 0, 255, 96, 246, 32, 42, 128 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021C (0x021c/Undefined/18) "22 225 9 30 0 0 0 0 32 0 0 0 0 0 1 79 30 176"
			{
				// TODO: Unknown IFD tag: Pentax / 0x021C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x021C);
				Assert.IsNotNull (entry, "Entry 0x021C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 22, 225, 9, 30, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 1, 79, 30, 176 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021D (0x021d/Undefined/18) "54 128 238 192 250 192 250 64 53 224 239 224 0 128 245 0 42 128"
			{
				// TODO: Unknown IFD tag: Pentax / 0x021D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x021D);
				Assert.IsNotNull (entry, "Entry 0x021D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 54, 128, 238, 192, 250, 192, 250, 64, 53, 224, 239, 224, 0, 128, 245, 0, 42, 128 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021E (0x021e/Undefined/8) "35 168 32 0 32 42 43 46"
			{
				// TODO: Unknown IFD tag: Pentax / 0x021E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x021E);
				Assert.IsNotNull (entry, "Entry 0x021E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 35, 168, 32, 0, 32, 42, 43, 46 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x021F (AFInfo/Undefined/12) "0 32 96 32 0 1 0 11 31 31 13 5"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.AFInfo);
				Assert.IsNotNull (entry, "Entry 0x021F missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 32, 96, 32, 0, 1, 0, 11, 31, 31, 13, 5 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0220 (0x0220/Undefined/53) "0 1 0 0 0 22 0 60 0 171 0 189 0 212 15 0 12 0 8 0 0 0 4 0 10 0 14 0 15 128 15 192 15 224 15 240 15 248 15 252 5 3 3 2 2 3 4 6 7 8 9 10 10"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0220
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0220);
				Assert.IsNotNull (entry, "Entry 0x0220 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 0, 0, 0, 22, 0, 60, 0, 171, 0, 189, 0, 212, 15, 0, 12, 0, 8, 0, 0, 0, 4, 0, 10, 0, 14, 0, 15, 128, 15, 192, 15, 224, 15, 240, 15, 248, 15, 252, 5, 3, 3, 2, 2, 3, 4, 6, 7, 8, 9, 10, 10 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0221 (0x0221/Undefined/138) "0 17 187 113 0 0 52 163 36 46 198 2 0 0 27 131 78 17 197 128 0 0 29 86 72 112 196 234 0 0 31 69 67 61 196 74 0 0 33 84 62 112 195 140 0 0 35 133 57 245 194 196 0 0 37 216 53 212 193 212 0 0 40 79 49 253 192 188 0 0 42 233 46 107 191 124 0 0 45 166 43 30 190 0 0 0 48 126 40 17 188 62 0 0 51 116 37 61 186 14 0 0 54 124 34 158 183 92 0 0 57 139 32 56 179 226 0 0 60 150 30 5 175 60 0 0 63 139 28 5 168 182 0 0 66 88 26 53"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0221
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0221);
				Assert.IsNotNull (entry, "Entry 0x0221 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 17, 187, 113, 0, 0, 52, 163, 36, 46, 198, 2, 0, 0, 27, 131, 78, 17, 197, 128, 0, 0, 29, 86, 72, 112, 196, 234, 0, 0, 31, 69, 67, 61, 196, 74, 0, 0, 33, 84, 62, 112, 195, 140, 0, 0, 35, 133, 57, 245, 194, 196, 0, 0, 37, 216, 53, 212, 193, 212, 0, 0, 40, 79, 49, 253, 192, 188, 0, 0, 42, 233, 46, 107, 191, 124, 0, 0, 45, 166, 43, 30, 190, 0, 0, 0, 48, 126, 40, 17, 188, 62, 0, 0, 51, 116, 37, 61, 186, 14, 0, 0, 54, 124, 34, 158, 183, 92, 0, 0, 57, 139, 32, 56, 179, 226, 0, 0, 60, 150, 30, 5, 175, 60, 0, 0, 63, 139, 28, 5, 168, 182, 0, 0, 66, 88, 26, 53 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0222 (ColorInfo/Undefined/18) "32 131 31 100 31 125 32 156 33 72 32 246 31 51 31 10 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PentaxMakerNoteEntryTag.ColorInfo);
				Assert.IsNotNull (entry, "Entry 0x0222 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 32, 131, 31, 100, 31, 125, 32, 156, 33, 72, 32, 246, 31, 51, 31, 10, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0223 (0x0223/Undefined/198) "0 2 0 8 48 0 73 0 59 0 48 0 73 0 59 0 80 0 177 0 76 0 80 0 177 0 76 0 29 0 71 0 158 0 29 0 71 0 158 0 88 0 236 0 86 0 88 0 236 0 86 0 55 0 90 0 200 0 55 0 90 0 200 0 83 0 212 0 243 0 83 0 212 0 243 0 73 0 11 0 75 0 73 0 11 0 75 0 65 0 242 0 216 0 65 0 242 0 216 0 0 8 48 0 73 0 59 0 48 0 73 0 59 0 80 0 177 0 76 0 80 0 177 0 76 0 29 0 71 0 158 0 29 0 71 0 158 0 88 0 236 0 86 0 88 0 236 0 86 0 55 0 90 0 200 0 55 0 90 0 200 0 83 0 212 0 243 0 83 0 212 0 243 0 73 0 11 0 75 0 73 0 11 0 75 0 65 0 242 0 216 0 65 0 242 0 216 0"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0223
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0223);
				Assert.IsNotNull (entry, "Entry 0x0223 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 2, 0, 8, 48, 0, 73, 0, 59, 0, 48, 0, 73, 0, 59, 0, 80, 0, 177, 0, 76, 0, 80, 0, 177, 0, 76, 0, 29, 0, 71, 0, 158, 0, 29, 0, 71, 0, 158, 0, 88, 0, 236, 0, 86, 0, 88, 0, 236, 0, 86, 0, 55, 0, 90, 0, 200, 0, 55, 0, 90, 0, 200, 0, 83, 0, 212, 0, 243, 0, 83, 0, 212, 0, 243, 0, 73, 0, 11, 0, 75, 0, 73, 0, 11, 0, 75, 0, 65, 0, 242, 0, 216, 0, 65, 0, 242, 0, 216, 0, 0, 8, 48, 0, 73, 0, 59, 0, 48, 0, 73, 0, 59, 0, 80, 0, 177, 0, 76, 0, 80, 0, 177, 0, 76, 0, 29, 0, 71, 0, 158, 0, 29, 0, 71, 0, 158, 0, 88, 0, 236, 0, 86, 0, 88, 0, 236, 0, 86, 0, 55, 0, 90, 0, 200, 0, 55, 0, 90, 0, 200, 0, 83, 0, 212, 0, 243, 0, 83, 0, 212, 0, 243, 0, 73, 0, 11, 0, 75, 0, 73, 0, 11, 0, 75, 0, 65, 0, 242, 0, 216, 0, 65, 0, 242, 0, 216, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0224 (0x0224/Undefined/8) "1 1 12 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0224
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0224);
				Assert.IsNotNull (entry, "Entry 0x0224 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 1, 12, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x03FF (0x03ff/Undefined/32) "0 6 0 7 0 5 0 7 0 37 11 107 0 37 105 191 0 0 46 118 35 144 31 234 32 21 110 65 0 0 0 8"
			{
				// TODO: Unknown IFD tag: Pentax / 0x03FF
				var entry = makernote_structure.GetEntry (0, (ushort) 0x03FF);
				Assert.IsNotNull (entry, "Entry 0x03FF missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 6, 0, 7, 0, 5, 0, 7, 0, 37, 11, 107, 0, 37, 105, 191, 0, 0, 46, 118, 35, 144, 31, 234, 32, 21, 110, 65, 0, 0, 0, 8 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Pentax.0x0404 (0x0404/Undefined/8230) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0404
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0404);
				Assert.IsNotNull (entry, "Entry 0x0404 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("660abf1742145f8052492ccbabf9ce03", parsed_hash);
				Assert.AreEqual (8230, parsed_bytes.Length);
			}
			// Pentax.0x0405 (0x0405/Undefined/21608) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Pentax / 0x0405
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0405);
				Assert.IsNotNull (entry, "Entry 0x0405 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("b8893d586f313e16cbcdfd23bfaaa3ea", parsed_hash);
				Assert.AreEqual (21608, parsed_bytes.Length);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 0 1 1 2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 2, 0, 2, 0, 1, 1, 2 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "285"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (285, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0100 (ImageWidth/Long/1) "160"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (160, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0101 (ImageLength/Long/1) "120"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (120, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "78752"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "5945"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (5945, (entry as LongIFDEntry).Value);
			}
			// Image2.0x0100 (ImageWidth/Long/1) "3872"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 2");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3872, (entry as LongIFDEntry).Value);
			}
			// Image2.0x0101 (ImageLength/Long/1) "2592"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 2");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2592, (entry as LongIFDEntry).Value);
			}
			// Image2.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 2");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image2.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 2");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image2.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "9085368"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 2");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Image2.0x0202 (JPEGInterchangeFormatLength/Long/1) "1240997"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 2");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1240997, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x00FE (NewSubfileType/Long/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// Image.0x0100 (ImageWidth/Long/1) "160"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (160, (entry as LongIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Long/1) "120"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (120, (entry as LongIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "NIKON D90"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D90", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "126088"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Long/1) "120"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (120, (entry as LongIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "57600"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (57600, (entry as LongIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/10) "Ver.1.00 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Ver.1.00 ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2009:02:10 19:47:07"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:02:10 19:47:07", (entry as StringIFDEntry).Value);
			}

			var SubImage1_structure = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries [0];
			Assert.IsNotNull (SubImage1_structure, "SubImage1 structure not found");

			// SubImage1.0x00FE (NewSubfileType/Long/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0103 (Compression/Short/1) "6"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "184064"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// SubImage1.0x0202 (JPEGInterchangeFormatLength/Long/1) "1382859"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1382859, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			var SubImage2_structure = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries [1];
			Assert.IsNotNull (SubImage2_structure, "SubImage2 structure not found");

			// SubImage2.0x00FE (NewSubfileType/Long/1) "0"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// SubImage2.0x0100 (ImageWidth/Long/1) "4352"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4352, (entry as LongIFDEntry).Value);
			}
			// SubImage2.0x0101 (ImageLength/Long/1) "2868"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2868, (entry as LongIFDEntry).Value);
			}
			// SubImage2.0x0102 (BitsPerSample/Short/1) "12"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (12, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x0103 (Compression/Short/1) "34713"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (34713, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x0106 (PhotometricInterpretation/Short/1) "32803"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32803, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x0111 (StripOffsets/StripOffsets/1) "1566944"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// SubImage2.0x0115 (SamplesPerPixel/Short/1) "1"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x0116 (RowsPerStrip/Long/1) "2868"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2868, (entry as LongIFDEntry).Value);
			}
			// SubImage2.0x0117 (StripByteCounts/Long/1) "9441711"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (9441711, (entry as LongIFDEntry).Value);
			}
			// SubImage2.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage2.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage2.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = SubImage2_structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// SubImage2.0x828D (CFARepeatPatternDim/Short/2) "2 2"
			{
				// TODO: Unknown IFD tag: SubImage2 / 0x828D
				var entry = SubImage2_structure.GetEntry (0, (ushort) 0x828D);
				Assert.IsNotNull (entry, "Entry 0x828D missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 2 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage2.0x828E (CFAPattern/Byte/4) "1 2 0 1"
			{
				// TODO: Unknown IFD tag: SubImage2 / 0x828E
				var entry = SubImage2_structure.GetEntry (0, (ushort) 0x828E);
				Assert.IsNotNull (entry, "Entry 0x828E missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// SubImage2.0x9217 (SensingMethod/Short/1) "2"
			{
				// TODO: Unknown IFD tag: SubImage2 / 0x9217
				var entry = SubImage2_structure.GetEntry (0, (ushort) 0x9217);
				Assert.IsNotNull (entry, "Entry 0x9217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0214 (ReferenceBlackWhite/Rational/6) "0/1 255/1 0/1 255/1 0/1 255/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ReferenceBlackWhite);
				Assert.IsNotNull (entry, "Entry 0x0214 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (6, parts.Length);
				Assert.AreEqual (0, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (255, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (255, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
				Assert.AreEqual (0, parts[4].Numerator);
				Assert.AreEqual (1, parts[4].Denominator);
				Assert.AreEqual (255, parts[5].Numerator);
				Assert.AreEqual (1, parts[5].Denominator);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "480"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (600, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "35/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (35, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:02:10 19:47:07"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:02:10 19:47:07", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:02:10 19:47:07"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:02:10 19:47:07", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "10/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "15"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (15, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "500/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (500, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/125070) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Nikon3, makernote.MakernoteType);

			// Nikon3.0x0001 (Version/Undefined/4) "48 50 49 48"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Version);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 49, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0002 (ISOSpeed/Undefined/4) "0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSpeed);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0004 (Quality/Ascii/8) "RAW    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("RAW    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0005 (WhiteBalance/Ascii/13) "AUTO        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0007 (Focus/Ascii/7) "AF-S  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Focus);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AF-S  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0008 (FlashSetting/Ascii/13) "NORMAL      "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashSetting);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NORMAL      ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0009 (FlashDevice/Ascii/20) "Optional,TTL       "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashDevice);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Optional,TTL       ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x000B (WhiteBalanceBias/SShort/2) "0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalanceBias);
				Assert.IsNotNull (entry, "Entry 0x000B missing in IFD 0");
				Assert.IsNotNull (entry as SShortArrayIFDEntry, "Entry is not a signed short array!");
				Assert.AreEqual (new short [] { 0, 0 }, (entry as SShortArrayIFDEntry).Values);
			}
			// Nikon3.0x000C (WB_RBLevels/Rational/4) "475/256 319/256 256/256 256/256"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WB_RBLevels);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (475, parts[0].Numerator);
				Assert.AreEqual (256, parts[0].Denominator);
				Assert.AreEqual (319, parts[1].Numerator);
				Assert.AreEqual (256, parts[1].Denominator);
				Assert.AreEqual (256, parts[2].Numerator);
				Assert.AreEqual (256, parts[2].Denominator);
				Assert.AreEqual (256, parts[3].Numerator);
				Assert.AreEqual (256, parts[3].Denominator);
			}
			// Nikon3.0x000D (ProgramShift/Undefined/4) "226 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ProgramShift);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 226, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x000E (ExposureDiff/Undefined/4) "160 1 12 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureDiff);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 160, 1, 12, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0011 (Preview/SubIFD/1) "13954"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview);
				Assert.IsNotNull (entry, "Entry 0x0011 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var nikonpreview = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview) as SubIFDEntry;
			Assert.IsNotNull (nikonpreview, "Nikon preview tag not found");
			var nikonpreview_structure = nikonpreview.Structure;

			// NikonPreview.0x0103 (Compression/Short/1) "6"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "14062"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.PreviewImageStart);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// NikonPreview.0x0202 (JPEGInterchangeFormatLength/Long/1) "110997"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.PreviewImageLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (110997, (entry as LongIFDEntry).Value);
			}
			// NikonPreview.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x0012 (FlashComp/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashComp);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0013 (ISOSettings/Undefined/4) "0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSettings);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0017 (0x0017/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown23);
				Assert.IsNotNull (entry, "Entry 0x0017 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0018 (FlashBracketComp/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0019 (ExposureBracketComp/SRational/1) "0/6"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Nikon3.0x001B (CropHiSpeed/Short/7) "0 4352 2868 4352 2868 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.CropHiSpeed);
				Assert.IsNotNull (entry, "Entry 0x001B missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 4352, 2868, 4352, 2868, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x001C (0x001c/Undefined/3) "0 1 6"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x001C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001C);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x001D (SerialNumber/Ascii/8) "3002025"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SerialNumber);
				Assert.IsNotNull (entry, "Entry 0x001D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("3002025", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x001E (ColorSpace/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0x001E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x0022 (ActiveDLighting/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ActiveDLighting);
				Assert.IsNotNull (entry, "Entry 0x0022 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x002C (0x002c/Undefined/94) "48 49 48 48 5 0 1 100 0 236 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x002C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x002C);
				Assert.IsNotNull (entry, "Entry 0x002C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 5, 0, 1, 100, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0083 (LensType/Byte/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x0083 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (2, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0084 (Lens/Rational/4) "500/10 500/10 14/10 14/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Lens);
				Assert.IsNotNull (entry, "Entry 0x0084 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (500, parts[0].Numerator);
				Assert.AreEqual (10, parts[0].Denominator);
				Assert.AreEqual (500, parts[1].Numerator);
				Assert.AreEqual (10, parts[1].Denominator);
				Assert.AreEqual (14, parts[2].Numerator);
				Assert.AreEqual (10, parts[2].Denominator);
				Assert.AreEqual (14, parts[3].Numerator);
				Assert.AreEqual (10, parts[3].Denominator);
			}
			// Nikon3.0x0087 (FlashMode/Byte/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashMode);
				Assert.IsNotNull (entry, "Entry 0x0087 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (7, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0089 (ShootingMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x0089 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008A (AutoBracketRelease/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AutoBracketRelease);
				Assert.IsNotNull (entry, "Entry 0x008A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008B (LensFStops/Undefined/4) "84 1 12 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensFStops);
				Assert.IsNotNull (entry, "Entry 0x008B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 84, 1, 12, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x008C (ContrastCurve/Undefined/578) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ContrastCurve);
				Assert.IsNotNull (entry, "Entry 0x008C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("759eb15ba2e1894d0755d0db67212ec9", parsed_hash);
				Assert.AreEqual (578, parsed_bytes.Length);
			}
			// Nikon3.0x0093 (NEFCompression/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.NEFCompression);
				Assert.IsNotNull (entry, "Entry 0x0093 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x0095 (NoiseReduction/Ascii/5) "OFF "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OFF ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0096 (LinearizationTable/Undefined/624) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LinearizationTable);
				Assert.IsNotNull (entry, "Entry 0x0096 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("489ae56582af0b796cce2b7ce798a593", parsed_hash);
				Assert.AreEqual (624, parsed_bytes.Length);
			}
			// Nikon3.0x0097 (ColorBalance/Undefined/1302) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorBalance);
				Assert.IsNotNull (entry, "Entry 0x0097 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("39a042200a869c791a2c31d925f5d95a", parsed_hash);
				Assert.AreEqual (1302, parsed_bytes.Length);
			}
			// Nikon3.0x0099 (RawImageCenter/Short/2) "2176 1434"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.RawImageCenter);
				Assert.IsNotNull (entry, "Entry 0x0099 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2176, 1434 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x009E (RetouchHistory/Short/10) "0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.RetouchHistory);
				Assert.IsNotNull (entry, "Entry 0x009E missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x00A3 (0x00a3/Byte/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown163);
				Assert.IsNotNull (entry, "Entry 0x00A3 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x00A4 (0x00a4/Undefined/4) "48 50 48 48"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00A4
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00A4);
				Assert.IsNotNull (entry, "Entry 0x00A4 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00A7 (ShutterCount/Long/1) "2659"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShutterCount);
				Assert.IsNotNull (entry, "Entry 0x00A7 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2659, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A8 (FlashInfo/Undefined/22) "48 49 48 51 1 46 4 4 133 1 0 42 27 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashInfo);
				Assert.IsNotNull (entry, "Entry 0x00A8 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 51, 1, 46, 4, 4, 133, 1, 0, 42, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00AB (VariProgram/Ascii/16) "               "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.VariProgram);
				Assert.IsNotNull (entry, "Entry 0x00AB missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("               ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00B0 (MultiExposure/Undefined/16) "48 49 48 48 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.MultiExposure);
				Assert.IsNotNull (entry, "Entry 0x00B0 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B1 (HighISONoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.HighISONoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x00B1 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x00B6 (0x00b6/Undefined/8) "7 217 2 10 19 45 53 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00B6
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00B6);
				Assert.IsNotNull (entry, "Entry 0x00B6 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 7, 217, 2, 10, 19, 45, 53, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B7 (AFInfo2/Undefined/30) "48 49 48 48 0 8 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AFInfo2);
				Assert.IsNotNull (entry, "Entry 0x00B7 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 8, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B8 (FileInfo/Undefined/172) "48 49 48 48 0 0 0 100 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FileInfo);
				Assert.IsNotNull (entry, "Entry 0x00B8 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 0, 0, 100, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00BB (0x00bb/Undefined/6) "48 49 48 48 255 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00BB
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00BB);
				Assert.IsNotNull (entry, "Entry 0x00BB missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 255, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00BC (0x00bc/Undefined/3500) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00BC
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00BC);
				Assert.IsNotNull (entry, "Entry 0x00BC missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("47098865aca2b97ee0380d198fb88e6b", parsed_hash);
				Assert.AreEqual (3500, parsed_bytes.Length);
			}
			// Photo.0x9286 (UserComment/UserComment/44) "charset="Ascii"                                     "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0x9290 (SubSecTime/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 1 2 0 1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 2, 0, 2, 1, 2, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "1/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "75"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (75, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8825 (GPSTag/SubIFD/1) "126070"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD);
				Assert.IsNotNull (entry, "Entry 0x8825 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var gps = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD) as SubIFDEntry;
			Assert.IsNotNull (gps, "GPS tag not found");
			var gps_structure = gps.Structure;

			// GPSInfo.0x0000 (GPSVersionID/Byte/4) "2 2 0 0"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSVersionID);
				Assert.IsNotNull (entry, "Entry 0x0000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 2, 2, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0x9003 (DateTimeOriginal/Ascii/20) "2009:02:10 19:47:07"
			{
				var entry = structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:02:10 19:47:07", (entry as StringIFDEntry).Value);
			}
			// Image.0x9216 (TIFFEPStandardID/Byte/4) "1 0 0 0"
			{
				// TODO: Unknown IFD tag: Image / 0x9216
				var entry = structure.GetEntry (0, (ushort) 0x9216);
				Assert.IsNotNull (entry, "Entry 0x9216 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}

			//  ---------- End of IFD tests ----------

		}
Esempio n. 10
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x00FE (NewSubfileType/Long/1) "0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Image.0x0100 (ImageWidth/Short/1) "1360"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1360, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Short/1) "1060"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1060, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "5"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010D (DocumentName/Ascii/29) "/home/mike/sample_gimp1.tiff"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DocumentName);
				Assert.IsNotNull (entry, "Entry 0x010D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("/home/mike/sample_gimp1.tiff", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/17) "8 92872 183535 274522 365281 454644 534266 611421 690373 775508 867104 965719 1071407 1175890 1280880 1386423 1477280"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (17, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Short/1) "64"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (64, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/17) "92864 90663 90987 90759 89363 79622 77155 78952 85135 91596 98615 105688 104483 104990 105543 90857 44330"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 92864, 90663, 90987, 90759, 89363, 79622, 77155, 78952, 85135, 91596, 98615, 105688, 104483, 104990, 105543, 90857, 44330 }, (entry as LongArrayIFDEntry).Values);
			}
			// Image.0x011A (XResolution/Rational/1) "1207959552/16777216"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1207959552, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "1207959552/16777216"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1207959552, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x013D (0x013d/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Predictor);
				Assert.IsNotNull (entry, "Entry 0x013D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8773 (InterColorProfile/Undefined/3140) "0 0 12 68 85 67 67 77 2 64 0 0 109 110 116 114 82 71 66 32 88 89 90 32 7 211 0 4 0 4 0 0 0 0 0 0 97 99 115 112 77 83 70 84 0 0 0 0 67 65 78 79 90 48 48 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 214 0 1 0 0 0 0 211 45 67 65 78 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 114 84 82 67 0 0 1 44 0 0 8 12 103 84 82 67 0 0 1 44 0 0 8 12 98 84 82 67 0 0 1 44 0 0 8 12 114 88 89 90 0 0 9 56 0 0 0 20 103 88 89 90 0 0 9 76 0 0 0 20 98 88 89 90 0 0 9 96 0 0 0 20 99 104 97 100 0 0 9 116 0 0 0 44 99 112 114 116 0 0 9 160 0 0 0 64 100 109 110 100 0 0 9 224 0 0 0 124 100 109 100 100 0 0 10 92 0 0 0 148 119 116 112 116 0 0 10 240 0 0 0 20 116 101 99 104 0 0 11 4 0 0 0 12 100 101 115 99 0 0 10 92 0 0 0 148 117 99 109 73 0 0 11 16 0 0 1 52 99 117 114 118 0 0 0 0 0 0 4 0 0 0 0 4 0 9 0 14 0 19 0 24 0 29 0 34 0 39 0 44 0 49 0 54 0 59 0 64 0 69 0 74 0 79 0 84 0 89 0 94 0 99 0 104 0 109 0 114 0 118 0 123 0 128 0 133 0 138 0 143 0 148 0 153 0 158 0 163 0 168 0 173 0 178 0 183 0 188 0 193 0 198 0 203 0 208 0 213 0 218 0 223 0 229 0 234 0 240 0 245 0 251 1 1 1 6 1 12 1 18 1 24 1 30 1 36 1 43 1 49 1 55 1 62 1 68 1 75 1 82 1 89 1 95 1 102 1 109 1 117 1 124 1 131 1 138 1 146 1 153 1 161 1 169 1 176 1 184 1 192 1 200 1 208 1 216 1 225 1 233 1 241 1 250 2 2 2 11 2 20 2 29 2 38 2 47 2 56 2 65 2 74 2 83 2 93 2 102 2 112 2 122 2 131 2 141 2 151 2 161 2 172 2 182 2 192 2 202 2 213 2 224 2 234 2 245 3 0 3 11 3 22 3 33 3 44 3 55 3 67 3 78 3 90 3 102 3 113 3 125 3 137 3 149 3 161 3 173 3 186 3 198 3 211 3 223 3 236 3 249 4 6 4 19 4 32 4 45 4 58 4 71 4 85 4 98 4 112 4 126 4 140 4 154 4 168 4 182 4 196 4 210 4 225 4 239 4 254 5 13 5 27 5 42 5 57 5 72 5 88 5 103 5 118 5 134 5 149 5 165 5 181 5 197 5 213 5 229 5 245 6 5 6 22 6 38 6 55 6 72 6 88 6 105 6 122 6 139 6 157 6 174 6 191 6 209 6 227 6 244 7 6 7 24 7 42 7 60 7 79 7 97 7 115 7 134 7 153 7 171 7 190 7 209 7 228 7 248 8 11 8 30 8 50 8 69 8 89 8 109 8 129 8 149 8 169 8 190 8 210 8 230 8 251 9 16 9 36 9 57 9 78 9 100 9 121 9 142 9 164 9 185 9 207 9 229 9 251 10 17 10 39 10 61 10 83 10 106 10 128 10 151 10 174 10 197 10 220 10 243 11 10 11 33 11 57 11 80 11 104 11 128 11 152 11 176 11 200 11 224 11 249 12 17 12 42 12 66 12 91 12 116 12 141 12 166 12 192 12 217 12 242 13 12 13 38 13 64 13 90 13 116 13 142 13 168 13 195 13 221 13 248 14 19 14 46 14 73 14 100 14 127 14 154 14 182 14 209 14 237 15 9 15 37 15 65 15 93 15 121 15 150 15 178 15 207 15 236 16 9 16 38 16 67 16 96 16 125 16 155 16 185 16 214 16 244 17 18 17 48 17 78 17 109 17 139 17 170 17 200 17 231 18 6 18 37 18 68 18 100 18 131 18 163 18 194 18 226 19 2 19 34 19 66 19 99 19 131 19 164 19 196 19 229 20 6 20 39 20 72 20 105 20 139 20 172 20 206 20 240 21 17 21 52 21 86 21 120 21 154 21 189 21 223 22 2 22 37 22 72 22 107 22 143 22 178 22 213 22 249 23 29 23 65 23 101 23 137 23 173 23 210 23 246 24 27 24 64 24 101 24 138 24 175 24 212 24 250 25 31 25 69 25 107 25 145 25 183 25 221 26 3 26 42 26 80 26 119 26 158 26 197 26 236 27 19 27 59 27 98 27 138 27 177 27 217 28 1 28 41 28 82 28 122 28 163 28 203 28 244 29 29 29 70 29 111 29 153 29 194 29 236 30 22 30 63 30 105 30 147 30 190 30 232 31 19 31 61 31 104 31 147 31 190 31 233 32 21 32 64 32 108 32 151 32 195 32 239 33 27 33 72 33 116 33 161 33 205 33 250 34 39 34 84 34 129 34 175 34 220 35 10 35 55 35 101 35 147 35 194 35 240 36 30 36 77 36 124 36 170 36 217 37 8 37 56 37 103 37 151 37 198 37 246 38 38 38 86 38 134 38 183 38 231 39 24 39 73 39 121 39 170 39 220 40 13 40 62 40 112 40 162 40 212 41 6 41 56 41 106 41 157 41 207 42 2 42 53 42 104 42 155 42 206 43 1 43 53 43 105 43 157 43 209 44 5 44 57 44 109 44 162 44 215 45 11 45 64 45 117 45 171 45 224 46 22 46 75 46 129 46 183 46 237 47 35 47 90 47 144 47 199 47 254 48 53 48 108 48 163 48 218 49 18 49 74 49 129 49 185 49 241 50 42 50 98 50 155 50 211 51 12 51 69 51 126 51 183 51 241 52 42 52 100 52 158 52 216 53 18 53 76 53 135 53 193 53 252 54 55 54 114 54 173 54 232 55 36 55 95 55 155 55 215 56 19 56 79 56 140 56 200 57 5 57 65 57 126 57 187 57 249 58 54 58 115 58 177 58 239 59 45 59 107 59 169 59 231 60 38 60 101 60 164 60 227 61 34 61 97 61 160 61 224 62 32 62 96 62 160 62 224 63 32 63 97 63 161 63 226 64 35 64 100 64 165 64 231 65 40 65 106 65 172 65 238 66 48 66 114 66 180 66 247 67 58 67 125 67 192 68 3 68 70 68 138 68 205 69 17 69 85 69 153 69 221 70 34 70 102 70 171 70 240 71 53 71 122 71 191 72 5 72 74 72 144 72 214 73 28 73 98 73 169 73 239 74 54 74 125 74 196 75 11 75 82 75 154 75 225 76 41 76 113 76 185 77 2 77 74 77 146 77 219 78 36 78 109 78 182 79 0 79 73 79 147 79 220 80 38 80 112 80 187 81 5 81 80 81 154 81 229 82 48 82 124 82 199 83 18 83 94 83 170 83 246 84 66 84 142 84 219 85 39 85 116 85 193 86 14 86 91 86 169 86 246 87 68 87 146 87 224 88 46 88 124 88 203 89 26 89 104 89 183 90 7 90 86 90 165 90 245 91 69 91 149 91 229 92 53 92 133 92 214 93 39 93 119 93 201 94 26 94 107 94 189 95 14 95 96 95 178 96 4 96 87 96 169 96 252 97 79 97 162 97 245 98 72 98 155 98 239 99 67 99 151 99 235 100 63 100 148 100 232 101 61 101 146 101 231 102 60 102 146 102 231 103 61 103 147 103 233 104 63 104 149 104 236 105 67 105 153 105 240 106 72 106 159 106 247 107 78 107 166 107 254 108 86 108 175 109 7 109 96 109 185 110 17 110 107 110 196 111 29 111 119 111 209 112 43 112 133 112 223 113 58 113 148 113 239 114 74 114 165 115 1 115 92 115 184 116 19 116 111 116 204 117 40 117 132 117 225 118 62 118 155 118 248 119 85 119 179 120 16 120 110 120 204 121 42 121 136 121 231 122 69 122 164 123 3 123 98 123 193 124 33 124 129 124 224 125 64 125 160 126 1 126 97 126 194 127 35 127 132 127 229 128 70 128 168 129 9 129 107 129 205 130 47 130 145 130 244 131 87 131 185 132 28 132 128 132 227 133 70 133 170 134 14 134 114 134 214 135 58 135 159 136 4 136 104 136 205 137 51 137 152 137 254 138 99 138 201 139 47 139 149 139 252 140 98 140 201 141 48 141 151 141 254 142 102 142 205 143 53 143 157 144 5 144 109 144 214 145 63 145 167 146 16 146 121 146 227 147 76 147 182 148 32 148 138 148 244 149 94 149 201 150 51 150 158 151 9 151 117 151 224 152 76 152 183 153 35 153 143 153 251 154 104 154 213 155 65 155 174 156 27 156 137 156 246 157 100 157 210 158 64 158 174 159 28 159 139 159 249 160 104 160 215 161 70 161 182 162 37 162 149 163 5 163 117 163 229 164 86 164 198 165 55 165 168 166 25 166 139 166 252 167 110 167 224 168 82 168 196 169 54 169 169 170 28 170 142 171 2 171 117 171 232 172 92 172 208 173 68 173 184 174 44 174 161 175 21 175 138 175 255 176 116 176 234 177 95 177 213 178 75 178 193 179 55 179 174 180 36 180 155 181 18 181 137 182 1 182 120 182 240 183 104 183 224 184 88 184 209 185 73 185 194 186 59 186 180 187 45 187 167 188 33 188 154 189 20 189 143 190 9 190 132 190 254 191 121 191 244 192 112 192 235 193 103 193 227 194 95 194 219 195 87 195 212 196 81 196 205 197 75 197 200 198 69 198 195 199 65 199 191 200 61 200 187 201 58 201 185 202 56 202 183 203 54 203 181 204 53 204 181 205 53 205 181 206 53 206 182 207 55 207 184 208 57 208 186 209 59 209 189 210 63 210 193 211 67 211 197 212 72 212 203 213 78 213 209 214 84 214 216 215 91 215 223 216 99 216 231 217 108 217 240 218 117 218 250 219 127 220 4 220 138 221 16 221 150 222 28 222 162 223 40 223 175 224 54 224 189 225 68 225 203 226 83 226 218 227 98 227 234 228 115 228 251 229 132 230 13 230 150 231 31 231 168 232 50 232 188 233 70 233 208 234 90 234 229 235 111 235 250 236 133 237 16 237 156 238 39 238 179 239 63 239 203 240 88 240 228 241 113 241 254 242 139 243 25 243 166 244 52 244 194 245 80 245 222 246 108 246 251 247 138 248 25 248 168 249 55 249 199 250 87 250 231 251 119 252 7 252 152 253 40 253 185 254 74 254 219 255 109 255 255 88 89 90 32 0 0 0 0 0 0 111 160 0 0 56 242 0 0 3 143 88 89 90 32 0 0 0 0 0 0 98 150 0 0 183 138 0 0 24 218 88 89 90 32 0 0 0 0 0 0 36 160 0 0 15 133 0 0 182 196 115 102 51 50 0 0 0 0 0 1 12 63 0 0 5 220 255 255 243 39 0 0 7 144 0 0 253 146 255 255 251 162 255 255 253 163 0 0 3 220 0 0 192 113 116 101 120 116 0 0 0 0 67 111 112 121 114 105 103 104 116 32 40 99 41 32 50 48 48 51 44 32 67 97 110 111 110 32 73 110 99 46 32 32 65 108 108 32 114 105 103 104 116 115 32 114 101 115 101 114 118 101 100 46 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 11 67 97 110 111 110 32 73 110 99 46 0 0 0 0 0 0 0 0 10 0 67 0 97 0 110 0 111 0 110 0 32 0 73 0 110 0 99 0 46 0 0 11 67 97 110 111 110 32 73 110 99 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 19 115 82 71 66 32 118 49 46 51 49 32 40 67 97 110 111 110 41 0 0 0 0 0 0 0 0 18 0 115 0 82 0 71 0 66 0 32 0 118 0 49 0 46 0 51 0 49 0 32 0 40 0 67 0 97 0 110 0 111 0 110 0 41 0 0 19 115 82 71 66 32 118 49 46 51 49 32 40 67 97 110 111 110 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 89 90 32 0 0 0 0 0 0 246 214 0 1 0 0 0 0 211 45 115 105 103 32 0 0 0 0 67 82 84 32 117 99 109 73 67 83 73 71 0 0 1 40 1 8 0 0 1 8 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 86 73 84 32 76 97 98 111 114 97 116 111 114 121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 73 78 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 243 84 0 1 0 0 0 1 22 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 1 0 1 0 0 0 0 0 1 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ICCProfile);
				Assert.IsNotNull (entry, "Entry 0x8773 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 12, 68, 85, 67, 67, 77, 2, 64, 0, 0, 109, 110, 116, 114, 82, 71, 66, 32, 88, 89, 90, 32, 7, 211, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 97, 99, 115, 112, 77, 83, 70, 84, 0, 0, 0, 0, 67, 65, 78, 79, 90, 48, 48, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 67, 65, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 114, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 103, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 98, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 114, 88, 89, 90, 0, 0, 9, 56, 0, 0, 0, 20, 103, 88, 89, 90, 0, 0, 9, 76, 0, 0, 0, 20, 98, 88, 89, 90, 0, 0, 9, 96, 0, 0, 0, 20, 99, 104, 97, 100, 0, 0, 9, 116, 0, 0, 0, 44, 99, 112, 114, 116, 0, 0, 9, 160, 0, 0, 0, 64, 100, 109, 110, 100, 0, 0, 9, 224, 0, 0, 0, 124, 100, 109, 100, 100, 0, 0, 10, 92, 0, 0, 0, 148, 119, 116, 112, 116, 0, 0, 10, 240, 0, 0, 0, 20, 116, 101, 99, 104, 0, 0, 11, 4, 0, 0, 0, 12, 100, 101, 115, 99, 0, 0, 10, 92, 0, 0, 0, 148, 117, 99, 109, 73, 0, 0, 11, 16, 0, 0, 1, 52, 99, 117, 114, 118, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 9, 0, 14, 0, 19, 0, 24, 0, 29, 0, 34, 0, 39, 0, 44, 0, 49, 0, 54, 0, 59, 0, 64, 0, 69, 0, 74, 0, 79, 0, 84, 0, 89, 0, 94, 0, 99, 0, 104, 0, 109, 0, 114, 0, 118, 0, 123, 0, 128, 0, 133, 0, 138, 0, 143, 0, 148, 0, 153, 0, 158, 0, 163, 0, 168, 0, 173, 0, 178, 0, 183, 0, 188, 0, 193, 0, 198, 0, 203, 0, 208, 0, 213, 0, 218, 0, 223, 0, 229, 0, 234, 0, 240, 0, 245, 0, 251, 1, 1, 1, 6, 1, 12, 1, 18, 1, 24, 1, 30, 1, 36, 1, 43, 1, 49, 1, 55, 1, 62, 1, 68, 1, 75, 1, 82, 1, 89, 1, 95, 1, 102, 1, 109, 1, 117, 1, 124, 1, 131, 1, 138, 1, 146, 1, 153, 1, 161, 1, 169, 1, 176, 1, 184, 1, 192, 1, 200, 1, 208, 1, 216, 1, 225, 1, 233, 1, 241, 1, 250, 2, 2, 2, 11, 2, 20, 2, 29, 2, 38, 2, 47, 2, 56, 2, 65, 2, 74, 2, 83, 2, 93, 2, 102, 2, 112, 2, 122, 2, 131, 2, 141, 2, 151, 2, 161, 2, 172, 2, 182, 2, 192, 2, 202, 2, 213, 2, 224, 2, 234, 2, 245, 3, 0, 3, 11, 3, 22, 3, 33, 3, 44, 3, 55, 3, 67, 3, 78, 3, 90, 3, 102, 3, 113, 3, 125, 3, 137, 3, 149, 3, 161, 3, 173, 3, 186, 3, 198, 3, 211, 3, 223, 3, 236, 3, 249, 4, 6, 4, 19, 4, 32, 4, 45, 4, 58, 4, 71, 4, 85, 4, 98, 4, 112, 4, 126, 4, 140, 4, 154, 4, 168, 4, 182, 4, 196, 4, 210, 4, 225, 4, 239, 4, 254, 5, 13, 5, 27, 5, 42, 5, 57, 5, 72, 5, 88, 5, 103, 5, 118, 5, 134, 5, 149, 5, 165, 5, 181, 5, 197, 5, 213, 5, 229, 5, 245, 6, 5, 6, 22, 6, 38, 6, 55, 6, 72, 6, 88, 6, 105, 6, 122, 6, 139, 6, 157, 6, 174, 6, 191, 6, 209, 6, 227, 6, 244, 7, 6, 7, 24, 7, 42, 7, 60, 7, 79, 7, 97, 7, 115, 7, 134, 7, 153, 7, 171, 7, 190, 7, 209, 7, 228, 7, 248, 8, 11, 8, 30, 8, 50, 8, 69, 8, 89, 8, 109, 8, 129, 8, 149, 8, 169, 8, 190, 8, 210, 8, 230, 8, 251, 9, 16, 9, 36, 9, 57, 9, 78, 9, 100, 9, 121, 9, 142, 9, 164, 9, 185, 9, 207, 9, 229, 9, 251, 10, 17, 10, 39, 10, 61, 10, 83, 10, 106, 10, 128, 10, 151, 10, 174, 10, 197, 10, 220, 10, 243, 11, 10, 11, 33, 11, 57, 11, 80, 11, 104, 11, 128, 11, 152, 11, 176, 11, 200, 11, 224, 11, 249, 12, 17, 12, 42, 12, 66, 12, 91, 12, 116, 12, 141, 12, 166, 12, 192, 12, 217, 12, 242, 13, 12, 13, 38, 13, 64, 13, 90, 13, 116, 13, 142, 13, 168, 13, 195, 13, 221, 13, 248, 14, 19, 14, 46, 14, 73, 14, 100, 14, 127, 14, 154, 14, 182, 14, 209, 14, 237, 15, 9, 15, 37, 15, 65, 15, 93, 15, 121, 15, 150, 15, 178, 15, 207, 15, 236, 16, 9, 16, 38, 16, 67, 16, 96, 16, 125, 16, 155, 16, 185, 16, 214, 16, 244, 17, 18, 17, 48, 17, 78, 17, 109, 17, 139, 17, 170, 17, 200, 17, 231, 18, 6, 18, 37, 18, 68, 18, 100, 18, 131, 18, 163, 18, 194, 18, 226, 19, 2, 19, 34, 19, 66, 19, 99, 19, 131, 19, 164, 19, 196, 19, 229, 20, 6, 20, 39, 20, 72, 20, 105, 20, 139, 20, 172, 20, 206, 20, 240, 21, 17, 21, 52, 21, 86, 21, 120, 21, 154, 21, 189, 21, 223, 22, 2, 22, 37, 22, 72, 22, 107, 22, 143, 22, 178, 22, 213, 22, 249, 23, 29, 23, 65, 23, 101, 23, 137, 23, 173, 23, 210, 23, 246, 24, 27, 24, 64, 24, 101, 24, 138, 24, 175, 24, 212, 24, 250, 25, 31, 25, 69, 25, 107, 25, 145, 25, 183, 25, 221, 26, 3, 26, 42, 26, 80, 26, 119, 26, 158, 26, 197, 26, 236, 27, 19, 27, 59, 27, 98, 27, 138, 27, 177, 27, 217, 28, 1, 28, 41, 28, 82, 28, 122, 28, 163, 28, 203, 28, 244, 29, 29, 29, 70, 29, 111, 29, 153, 29, 194, 29, 236, 30, 22, 30, 63, 30, 105, 30, 147, 30, 190, 30, 232, 31, 19, 31, 61, 31, 104, 31, 147, 31, 190, 31, 233, 32, 21, 32, 64, 32, 108, 32, 151, 32, 195, 32, 239, 33, 27, 33, 72, 33, 116, 33, 161, 33, 205, 33, 250, 34, 39, 34, 84, 34, 129, 34, 175, 34, 220, 35, 10, 35, 55, 35, 101, 35, 147, 35, 194, 35, 240, 36, 30, 36, 77, 36, 124, 36, 170, 36, 217, 37, 8, 37, 56, 37, 103, 37, 151, 37, 198, 37, 246, 38, 38, 38, 86, 38, 134, 38, 183, 38, 231, 39, 24, 39, 73, 39, 121, 39, 170, 39, 220, 40, 13, 40, 62, 40, 112, 40, 162, 40, 212, 41, 6, 41, 56, 41, 106, 41, 157, 41, 207, 42, 2, 42, 53, 42, 104, 42, 155, 42, 206, 43, 1, 43, 53, 43, 105, 43, 157, 43, 209, 44, 5, 44, 57, 44, 109, 44, 162, 44, 215, 45, 11, 45, 64, 45, 117, 45, 171, 45, 224, 46, 22, 46, 75, 46, 129, 46, 183, 46, 237, 47, 35, 47, 90, 47, 144, 47, 199, 47, 254, 48, 53, 48, 108, 48, 163, 48, 218, 49, 18, 49, 74, 49, 129, 49, 185, 49, 241, 50, 42, 50, 98, 50, 155, 50, 211, 51, 12, 51, 69, 51, 126, 51, 183, 51, 241, 52, 42, 52, 100, 52, 158, 52, 216, 53, 18, 53, 76, 53, 135, 53, 193, 53, 252, 54, 55, 54, 114, 54, 173, 54, 232, 55, 36, 55, 95, 55, 155, 55, 215, 56, 19, 56, 79, 56, 140, 56, 200, 57, 5, 57, 65, 57, 126, 57, 187, 57, 249, 58, 54, 58, 115, 58, 177, 58, 239, 59, 45, 59, 107, 59, 169, 59, 231, 60, 38, 60, 101, 60, 164, 60, 227, 61, 34, 61, 97, 61, 160, 61, 224, 62, 32, 62, 96, 62, 160, 62, 224, 63, 32, 63, 97, 63, 161, 63, 226, 64, 35, 64, 100, 64, 165, 64, 231, 65, 40, 65, 106, 65, 172, 65, 238, 66, 48, 66, 114, 66, 180, 66, 247, 67, 58, 67, 125, 67, 192, 68, 3, 68, 70, 68, 138, 68, 205, 69, 17, 69, 85, 69, 153, 69, 221, 70, 34, 70, 102, 70, 171, 70, 240, 71, 53, 71, 122, 71, 191, 72, 5, 72, 74, 72, 144, 72, 214, 73, 28, 73, 98, 73, 169, 73, 239, 74, 54, 74, 125, 74, 196, 75, 11, 75, 82, 75, 154, 75, 225, 76, 41, 76, 113, 76, 185, 77, 2, 77, 74, 77, 146, 77, 219, 78, 36, 78, 109, 78, 182, 79, 0, 79, 73, 79, 147, 79, 220, 80, 38, 80, 112, 80, 187, 81, 5, 81, 80, 81, 154, 81, 229, 82, 48, 82, 124, 82, 199, 83, 18, 83, 94, 83, 170, 83, 246, 84, 66, 84, 142, 84, 219, 85, 39, 85, 116, 85, 193, 86, 14, 86, 91, 86, 169, 86, 246, 87, 68, 87, 146, 87, 224, 88, 46, 88, 124, 88, 203, 89, 26, 89, 104, 89, 183, 90, 7, 90, 86, 90, 165, 90, 245, 91, 69, 91, 149, 91, 229, 92, 53, 92, 133, 92, 214, 93, 39, 93, 119, 93, 201, 94, 26, 94, 107, 94, 189, 95, 14, 95, 96, 95, 178, 96, 4, 96, 87, 96, 169, 96, 252, 97, 79, 97, 162, 97, 245, 98, 72, 98, 155, 98, 239, 99, 67, 99, 151, 99, 235, 100, 63, 100, 148, 100, 232, 101, 61, 101, 146, 101, 231, 102, 60, 102, 146, 102, 231, 103, 61, 103, 147, 103, 233, 104, 63, 104, 149, 104, 236, 105, 67, 105, 153, 105, 240, 106, 72, 106, 159, 106, 247, 107, 78, 107, 166, 107, 254, 108, 86, 108, 175, 109, 7, 109, 96, 109, 185, 110, 17, 110, 107, 110, 196, 111, 29, 111, 119, 111, 209, 112, 43, 112, 133, 112, 223, 113, 58, 113, 148, 113, 239, 114, 74, 114, 165, 115, 1, 115, 92, 115, 184, 116, 19, 116, 111, 116, 204, 117, 40, 117, 132, 117, 225, 118, 62, 118, 155, 118, 248, 119, 85, 119, 179, 120, 16, 120, 110, 120, 204, 121, 42, 121, 136, 121, 231, 122, 69, 122, 164, 123, 3, 123, 98, 123, 193, 124, 33, 124, 129, 124, 224, 125, 64, 125, 160, 126, 1, 126, 97, 126, 194, 127, 35, 127, 132, 127, 229, 128, 70, 128, 168, 129, 9, 129, 107, 129, 205, 130, 47, 130, 145, 130, 244, 131, 87, 131, 185, 132, 28, 132, 128, 132, 227, 133, 70, 133, 170, 134, 14, 134, 114, 134, 214, 135, 58, 135, 159, 136, 4, 136, 104, 136, 205, 137, 51, 137, 152, 137, 254, 138, 99, 138, 201, 139, 47, 139, 149, 139, 252, 140, 98, 140, 201, 141, 48, 141, 151, 141, 254, 142, 102, 142, 205, 143, 53, 143, 157, 144, 5, 144, 109, 144, 214, 145, 63, 145, 167, 146, 16, 146, 121, 146, 227, 147, 76, 147, 182, 148, 32, 148, 138, 148, 244, 149, 94, 149, 201, 150, 51, 150, 158, 151, 9, 151, 117, 151, 224, 152, 76, 152, 183, 153, 35, 153, 143, 153, 251, 154, 104, 154, 213, 155, 65, 155, 174, 156, 27, 156, 137, 156, 246, 157, 100, 157, 210, 158, 64, 158, 174, 159, 28, 159, 139, 159, 249, 160, 104, 160, 215, 161, 70, 161, 182, 162, 37, 162, 149, 163, 5, 163, 117, 163, 229, 164, 86, 164, 198, 165, 55, 165, 168, 166, 25, 166, 139, 166, 252, 167, 110, 167, 224, 168, 82, 168, 196, 169, 54, 169, 169, 170, 28, 170, 142, 171, 2, 171, 117, 171, 232, 172, 92, 172, 208, 173, 68, 173, 184, 174, 44, 174, 161, 175, 21, 175, 138, 175, 255, 176, 116, 176, 234, 177, 95, 177, 213, 178, 75, 178, 193, 179, 55, 179, 174, 180, 36, 180, 155, 181, 18, 181, 137, 182, 1, 182, 120, 182, 240, 183, 104, 183, 224, 184, 88, 184, 209, 185, 73, 185, 194, 186, 59, 186, 180, 187, 45, 187, 167, 188, 33, 188, 154, 189, 20, 189, 143, 190, 9, 190, 132, 190, 254, 191, 121, 191, 244, 192, 112, 192, 235, 193, 103, 193, 227, 194, 95, 194, 219, 195, 87, 195, 212, 196, 81, 196, 205, 197, 75, 197, 200, 198, 69, 198, 195, 199, 65, 199, 191, 200, 61, 200, 187, 201, 58, 201, 185, 202, 56, 202, 183, 203, 54, 203, 181, 204, 53, 204, 181, 205, 53, 205, 181, 206, 53, 206, 182, 207, 55, 207, 184, 208, 57, 208, 186, 209, 59, 209, 189, 210, 63, 210, 193, 211, 67, 211, 197, 212, 72, 212, 203, 213, 78, 213, 209, 214, 84, 214, 216, 215, 91, 215, 223, 216, 99, 216, 231, 217, 108, 217, 240, 218, 117, 218, 250, 219, 127, 220, 4, 220, 138, 221, 16, 221, 150, 222, 28, 222, 162, 223, 40, 223, 175, 224, 54, 224, 189, 225, 68, 225, 203, 226, 83, 226, 218, 227, 98, 227, 234, 228, 115, 228, 251, 229, 132, 230, 13, 230, 150, 231, 31, 231, 168, 232, 50, 232, 188, 233, 70, 233, 208, 234, 90, 234, 229, 235, 111, 235, 250, 236, 133, 237, 16, 237, 156, 238, 39, 238, 179, 239, 63, 239, 203, 240, 88, 240, 228, 241, 113, 241, 254, 242, 139, 243, 25, 243, 166, 244, 52, 244, 194, 245, 80, 245, 222, 246, 108, 246, 251, 247, 138, 248, 25, 248, 168, 249, 55, 249, 199, 250, 87, 250, 231, 251, 119, 252, 7, 252, 152, 253, 40, 253, 185, 254, 74, 254, 219, 255, 109, 255, 255, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 111, 160, 0, 0, 56, 242, 0, 0, 3, 143, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 98, 150, 0, 0, 183, 138, 0, 0, 24, 218, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 36, 160, 0, 0, 15, 133, 0, 0, 182, 196, 115, 102, 51, 50, 0, 0, 0, 0, 0, 1, 12, 63, 0, 0, 5, 220, 255, 255, 243, 39, 0, 0, 7, 144, 0, 0, 253, 146, 255, 255, 251, 162, 255, 255, 253, 163, 0, 0, 3, 220, 0, 0, 192, 113, 116, 101, 120, 116, 0, 0, 0, 0, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40, 99, 41, 32, 50, 48, 48, 51, 44, 32, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 32, 32, 65, 108, 108, 32, 114, 105, 103, 104, 116, 115, 32, 114, 101, 115, 101, 114, 118, 101, 100, 46, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 11, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 67, 0, 97, 0, 110, 0, 111, 0, 110, 0, 32, 0, 73, 0, 110, 0, 99, 0, 46, 0, 0, 11, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 19, 115, 82, 71, 66, 32, 118, 49, 46, 51, 49, 32, 40, 67, 97, 110, 111, 110, 41, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 115, 0, 82, 0, 71, 0, 66, 0, 32, 0, 118, 0, 49, 0, 46, 0, 51, 0, 49, 0, 32, 0, 40, 0, 67, 0, 97, 0, 110, 0, 111, 0, 110, 0, 41, 0, 0, 19, 115, 82, 71, 66, 32, 118, 49, 46, 51, 49, 32, 40, 67, 97, 110, 111, 110, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 115, 105, 103, 32, 0, 0, 0, 0, 67, 82, 84, 32, 117, 99, 109, 73, 67, 83, 73, 71, 0, 0, 1, 40, 1, 8, 0, 0, 1, 8, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 84, 32, 76, 97, 98, 111, 114, 97, 116, 111, 114, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 73, 78, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 84, 0, 1, 0, 0, 0, 1, 22, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

			//  ---------- Start of ImageTag tests ----------

			var imagetag = file.ImageTag;
			Assert.IsNotNull (imagetag);
			Assert.AreEqual (String.Empty, imagetag.Comment, "Comment");
			Assert.AreEqual (new string [] {}, imagetag.Keywords, "Keywords");
			Assert.AreEqual (null, imagetag.Rating, "Rating");
			Assert.AreEqual (Image.ImageOrientation.TopLeft, imagetag.Orientation, "Orientation");
			Assert.AreEqual (null, imagetag.Software, "Software");
			Assert.AreEqual (null, imagetag.Latitude, "Latitude");
			Assert.AreEqual (null, imagetag.Longitude, "Longitude");
			Assert.AreEqual (null, imagetag.Altitude, "Altitude");
			Assert.AreEqual (0.0025, imagetag.ExposureTime, "ExposureTime");
			Assert.AreEqual (6.3, imagetag.FNumber, "FNumber");
			Assert.AreEqual (100, imagetag.ISOSpeedRatings, "ISOSpeedRatings");
			Assert.AreEqual (14, imagetag.FocalLength, "FocalLength");
			Assert.AreEqual (28, imagetag.FocalLengthIn35mmFilm, "FocalLengthIn35mmFilm");
			Assert.AreEqual ("Panasonic", imagetag.Make, "Make");
			Assert.AreEqual ("DMC-G1", imagetag.Model, "Model");
			Assert.AreEqual (null, imagetag.Creator, "Creator");

			var properties = file.Properties;
			Assert.IsNotNull (properties);
			Assert.AreEqual (4008, properties.PhotoWidth, "PhotoWidth");
			Assert.AreEqual (3004, properties.PhotoHeight, "PhotoHeight");

			//  ---------- End of ImageTag tests ----------

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var pana_structure = tag.Structure;

			var jpg_file = (file as TagLib.Tiff.Rw2.File).JpgFromRaw;
			Assert.IsNotNull (tag, "JpgFromRaw not found!");
			var jpg_tag = jpg_file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "Jpg has no Exif tag!");
			var structure = jpg_tag.Structure;
			// PanasonicRaw.0x0001 (Version/Undefined/4) "48 51 49 48"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0001
				var entry = pana_structure.GetEntry (0, (ushort) 0x0001);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 51, 49, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x0002 (SensorWidth/Short/1) "4060"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0002
				var entry = pana_structure.GetEntry (0, (ushort) 0x0002);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4060, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0003 (SensorHeight/Short/1) "3016"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0003
				var entry = pana_structure.GetEntry (0, (ushort) 0x0003);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3016, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0004 (SensorTopBorder/Short/1) "4"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0004
				var entry = pana_structure.GetEntry (0, (ushort) 0x0004);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0005 (SensorLeftBorder/Short/1) "8"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0005
				var entry = pana_structure.GetEntry (0, (ushort) 0x0005);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0006 (ImageHeight/Short/1) "3004"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0006
				var entry = pana_structure.GetEntry (0, (ushort) 0x0006);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3004, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0007 (ImageWidth/Short/1) "4008"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0007
				var entry = pana_structure.GetEntry (0, (ushort) 0x0007);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4008, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0008 (0x0008/Short/1) "1"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0008
				var entry = pana_structure.GetEntry (0, (ushort) 0x0008);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0009 (0x0009/Short/1) "3"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0009
				var entry = pana_structure.GetEntry (0, (ushort) 0x0009);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x000A (0x000a/Short/1) "12"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x000A
				var entry = pana_structure.GetEntry (0, (ushort) 0x000A);
				Assert.IsNotNull (entry, "Entry 0x000A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (12, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x000B (0x000b/Short/1) "34316"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x000B
				var entry = pana_structure.GetEntry (0, (ushort) 0x000B);
				Assert.IsNotNull (entry, "Entry 0x000B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (34316, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x000D (0x000d/Short/1) "1"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x000D
				var entry = pana_structure.GetEntry (0, (ushort) 0x000D);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x000E (0x000e/Short/1) "4095"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x000E
				var entry = pana_structure.GetEntry (0, (ushort) 0x000E);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4095, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x000F (0x000f/Short/1) "4095"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x000F
				var entry = pana_structure.GetEntry (0, (ushort) 0x000F);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4095, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0010 (0x0010/Short/1) "4095"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0010
				var entry = pana_structure.GetEntry (0, (ushort) 0x0010);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4095, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0017 (ISOSpeed/Short/1) "100"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0017
				var entry = pana_structure.GetEntry (0, (ushort) 0x0017);
				Assert.IsNotNull (entry, "Entry 0x0017 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0018 (0x0018/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0018
				var entry = pana_structure.GetEntry (0, (ushort) 0x0018);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0019 (0x0019/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0019
				var entry = pana_structure.GetEntry (0, (ushort) 0x0019);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x001A (0x001a/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x001A
				var entry = pana_structure.GetEntry (0, (ushort) 0x001A);
				Assert.IsNotNull (entry, "Entry 0x001A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x001B (0x001b/Undefined/42) "5 0 100 0 4 0 4 0 4 0 200 0 8 0 8 0 8 0 144 1 16 0 16 0 16 0 32 3 32 0 32 0 32 0 64 6 64 0 64 0 64 0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x001B
				var entry = pana_structure.GetEntry (0, (ushort) 0x001B);
				Assert.IsNotNull (entry, "Entry 0x001B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 5, 0, 100, 0, 4, 0, 4, 0, 4, 0, 200, 0, 8, 0, 8, 0, 8, 0, 144, 1, 16, 0, 16, 0, 16, 0, 32, 3, 32, 0, 32, 0, 32, 0, 64, 6, 64, 0, 64, 0, 64, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x001C (0x001c/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x001C
				var entry = pana_structure.GetEntry (0, (ushort) 0x001C);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x001D (0x001d/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x001D
				var entry = pana_structure.GetEntry (0, (ushort) 0x001D);
				Assert.IsNotNull (entry, "Entry 0x001D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x001E (0x001e/Short/1) "0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x001E
				var entry = pana_structure.GetEntry (0, (ushort) 0x001E);
				Assert.IsNotNull (entry, "Entry 0x001E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0024 (WBRedLevel/Short/1) "584"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0024
				var entry = pana_structure.GetEntry (0, (ushort) 0x0024);
				Assert.IsNotNull (entry, "Entry 0x0024 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (584, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0025 (WBGreenLevel/Short/1) "263"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0025
				var entry = pana_structure.GetEntry (0, (ushort) 0x0025);
				Assert.IsNotNull (entry, "Entry 0x0025 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (263, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0026 (WBBlueLevel/Short/1) "355"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0026
				var entry = pana_structure.GetEntry (0, (ushort) 0x0026);
				Assert.IsNotNull (entry, "Entry 0x0026 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (355, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0027 (0x0027/Undefined/58) "7 0 9 0 21 2 0 1 111 1 10 0 55 2 0 1 89 1 11 0 106 2 0 1 63 1 3 0 95 1 0 1 61 2 4 0 151 1 0 1 77 1 20 0 223 1 0 1 119 1 24 0 95 1 0 1 61 2"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0027
				var entry = pana_structure.GetEntry (0, (ushort) 0x0027);
				Assert.IsNotNull (entry, "Entry 0x0027 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 7, 0, 9, 0, 21, 2, 0, 1, 111, 1, 10, 0, 55, 2, 0, 1, 89, 1, 11, 0, 106, 2, 0, 1, 63, 1, 3, 0, 95, 1, 0, 1, 61, 2, 4, 0, 151, 1, 0, 1, 77, 1, 20, 0, 223, 1, 0, 1, 119, 1, 24, 0, 95, 1, 0, 1, 61, 2 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x0029 (0x0029/Undefined/36) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x0029
				var entry = pana_structure.GetEntry (0, (ushort) 0x0029);
				Assert.IsNotNull (entry, "Entry 0x0029 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x002A (0x002a/Undefined/32) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x002A
				var entry = pana_structure.GetEntry (0, (ushort) 0x002A);
				Assert.IsNotNull (entry, "Entry 0x002A missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x002B (0x002b/Undefined/16) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x002B
				var entry = pana_structure.GetEntry (0, (ushort) 0x002B);
				Assert.IsNotNull (entry, "Entry 0x002B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x002C (0x002c/Undefined/72) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x002C
				var entry = pana_structure.GetEntry (0, (ushort) 0x002C);
				Assert.IsNotNull (entry, "Entry 0x002C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x002D (0x002d/Short/1) "4"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x002D
				var entry = pana_structure.GetEntry (0, (ushort) 0x002D);
				Assert.IsNotNull (entry, "Entry 0x002D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x002E (PreviewImage/Undefined/687616) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: PanasonicRaw / 0x002E
				var entry = pana_structure.GetEntry (0, (ushort) 0x002E);
				Assert.IsNotNull (entry, "Entry 0x002E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("7770d7802a09f4b2f9854788720b01b9", parsed_hash);
				Assert.AreEqual (687616, parsed_bytes.Length);
			}
			// PanasonicRaw.0x010F (Make/Ascii/10) "Panasonic"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Panasonic", (entry as StringIFDEntry).Value);
			}
			// PanasonicRaw.0x0110 (Model/Ascii/7) "DMC-G1"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DMC-G1", (entry as StringIFDEntry).Value);
			}
			// PanasonicRaw.0x0111 (StripOffsets/StripOffsets/1) "689664"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// PanasonicRaw.0x0112 (Orientation/Short/1) "1"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0116 (RowsPerStrip/Short/1) "3016"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3016, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x0117 (StripByteCounts/Long/1) "0"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// PanasonicRaw.0x0118 (RawDataOffset/Long/1) "689664"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.MinSampleValue);
				Assert.IsNotNull (entry, "Entry 0x0118 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (689664, (entry as LongIFDEntry).Value);
			}
			// PanasonicRaw.0x0119 (0x0119/Undefined/32) "153 224 77 65 10 1 0 0 76 1 0 0 185 1 1 0 139 15 46 1 86 2 125 251 196 9 34 3 123 154 233 139"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.MaxSampleValue);
				Assert.IsNotNull (entry, "Entry 0x0119 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 153, 224, 77, 65, 10, 1, 0, 0, 76, 1, 0, 0, 185, 1, 1, 0, 139, 15, 46, 1, 86, 2, 125, 251, 196, 9, 34, 3, 123, 154, 233, 139 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x011A (0x011a/Short/1) "2"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// PanasonicRaw.0x011B (0x011b/Undefined/64) "76 105 30 27 36 25 136 248 52 8 64 2 0 155 237 31 190 254 16 6 23 253 216 9 204 254 255 255 0 1 168 8 144 6 72 3 48 40 128 17 74 250 0 0 0 12 132 254 144 143 132 254 216 253 6 255 0 72 46 250 250 44 247 88"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 76, 105, 30, 27, 36, 25, 136, 248, 52, 8, 64, 2, 0, 155, 237, 31, 190, 254, 16, 6, 23, 253, 216, 9, 204, 254, 255, 255, 0, 1, 168, 8, 144, 6, 72, 3, 48, 40, 128, 17, 74, 250, 0, 0, 0, 12, 132, 254, 144, 143, 132, 254, 216, 253, 6, 255, 0, 72, 46, 250, 250, 44, 247, 88 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// PanasonicRaw.0x8769 (ExifTag/SubIFD/1) "928"
			{
				var entry = pana_structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/4000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (4000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "63/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (63, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:12:10 15:06:33"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:12:10 15:06:33", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:12:10 15:06:33"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:12:10 15:06:33", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "-33/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-33, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "925/256"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (925, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (256, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "140/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (140, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0x010F (Make/Ascii/10) "Panasonic"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Panasonic", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/7) "DMC-G1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DMC-G1", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/10) "Ver.1.0  "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Ver.1.0  ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2008:12:10 15:06:33"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:12:10 15:06:33", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "570"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (10, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x927C (MakerNote/MakerNote/7292) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Panasonic, makernote.MakernoteType);

			// Panasonic.0x0001 (Quality/Short/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (7, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0002 (FirmwareVersion/Undefined/4) "0 1 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0003 (WhiteBalance/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0007 (FocusMode/Short/1) "6"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FocusMode);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x000F (AFMode/Byte/2) "32 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.AFMode);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 32, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x001A (ImageStabilization/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ImageStabilization);
				Assert.IsNotNull (entry, "Entry 0x001A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x001C (Macro/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Macro);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x001F (ShootingMode/Short/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x001F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (7, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0020 (Audio/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Audio);
				Assert.IsNotNull (entry, "Entry 0x0020 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0021 (DataDump/Undefined/6120) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.DataDump);
				Assert.IsNotNull (entry, "Entry 0x0021 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("3d168b9a433490cf9f4a54b5e46a8827", parsed_hash);
				Assert.AreEqual (6120, parsed_bytes.Length);
			}
			// Panasonic.0x0022 (0x0022/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown34);
				Assert.IsNotNull (entry, "Entry 0x0022 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0024 (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FlashBias);
				Assert.IsNotNull (entry, "Entry 0x0024 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0025 (InternalSerialNumber/Undefined/16) "70 57 53 48 56 49 49 48 52 48 48 52 55 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.InternalSerialNumber);
				Assert.IsNotNull (entry, "Entry 0x0025 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 70, 57, 53, 48, 56, 49, 49, 48, 52, 48, 48, 52, 55, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0026 (ExifVersion/Undefined/4) "48 50 55 48"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x0026 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 55, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0027 (0x0027/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown39);
				Assert.IsNotNull (entry, "Entry 0x0027 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0029 (TimeSincePowerOn/Long/1) "6572"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.TimeSincePowerOn);
				Assert.IsNotNull (entry, "Entry 0x0029 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (6572, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x002A (BurstMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BurstMode);
				Assert.IsNotNull (entry, "Entry 0x002A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002B (SequenceNumber/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.SequenceNumber);
				Assert.IsNotNull (entry, "Entry 0x002B missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x002E (SelfTimer/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.SelfTimer);
				Assert.IsNotNull (entry, "Entry 0x002E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002F (0x002f/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown47);
				Assert.IsNotNull (entry, "Entry 0x002F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0030 (Rotation/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Rotation);
				Assert.IsNotNull (entry, "Entry 0x0030 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0031 (0x0031/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown49);
				Assert.IsNotNull (entry, "Entry 0x0031 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0033 (BabyAge/Ascii/20) "9999:99:99 00:00:00"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BabyAge);
				Assert.IsNotNull (entry, "Entry 0x0033 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("9999:99:99 00:00:00", (entry as StringIFDEntry).Value);
			}
			// Panasonic.0x0035 (ConversionLens/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ConversionLens);
				Assert.IsNotNull (entry, "Entry 0x0035 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0036 (TravelDay/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.TravelDay);
				Assert.IsNotNull (entry, "Entry 0x0036 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0037 (0x0037/Short/1) "257"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0037
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0037);
				Assert.IsNotNull (entry, "Entry 0x0037 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (257, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0038 (0x0038/Short/1) "2"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0038
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0038);
				Assert.IsNotNull (entry, "Entry 0x0038 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003A (WorldTimeLocation/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WorldTimeLocation);
				Assert.IsNotNull (entry, "Entry 0x003A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003B (0x003b/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003B);
				Assert.IsNotNull (entry, "Entry 0x003B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003C (ProgramISO/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ProgramISO);
				Assert.IsNotNull (entry, "Entry 0x003C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003D (0x003d/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003D);
				Assert.IsNotNull (entry, "Entry 0x003D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003E (0x003e/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003E);
				Assert.IsNotNull (entry, "Entry 0x003E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003F (0x003f/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003F);
				Assert.IsNotNull (entry, "Entry 0x003F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0043 (0x0043/Short/1) "3"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0043
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0043);
				Assert.IsNotNull (entry, "Entry 0x0043 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0044 (0x0044/Short/1) "3400"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0044
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0044);
				Assert.IsNotNull (entry, "Entry 0x0044 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3400, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0045 (0x0045/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0045
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0045);
				Assert.IsNotNull (entry, "Entry 0x0045 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0046 (WBAdjustAB/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WBAdjustAB);
				Assert.IsNotNull (entry, "Entry 0x0046 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0047 (WBAdjustGM/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WBAdjustGM);
				Assert.IsNotNull (entry, "Entry 0x0047 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0048 (0x0048/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0048
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0048);
				Assert.IsNotNull (entry, "Entry 0x0048 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0049 (0x0049/Short/1) "2"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0049
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0049);
				Assert.IsNotNull (entry, "Entry 0x0049 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x004A (0x004a/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004A);
				Assert.IsNotNull (entry, "Entry 0x004A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x004B (0x004b/Long/1) "4000"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004B);
				Assert.IsNotNull (entry, "Entry 0x004B missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4000, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x004C (0x004c/Long/1) "3000"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004C);
				Assert.IsNotNull (entry, "Entry 0x004C missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3000, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x004D (0x004d/Rational/2) "128/256 128/256"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004D);
				Assert.IsNotNull (entry, "Entry 0x004D missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (2, parts.Length);
				Assert.AreEqual (128, parts[0].Numerator);
				Assert.AreEqual (256, parts[0].Denominator);
				Assert.AreEqual (128, parts[1].Numerator);
				Assert.AreEqual (256, parts[1].Denominator);
			}
			// Panasonic.0x004E (0x004e/Undefined/42) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004E);
				Assert.IsNotNull (entry, "Entry 0x004E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x004F (0x004f/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004F);
				Assert.IsNotNull (entry, "Entry 0x004F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0050 (0x0050/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0050
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0050);
				Assert.IsNotNull (entry, "Entry 0x0050 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0051 (LensType/Ascii/34) "LUMIX G VARIO 14-45/F3.5-5.6"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x0051 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("LUMIX G VARIO 14-45/F3.5-5.6", (entry as StringIFDEntry).Value);
			}
			// Panasonic.0x0052 (LensSerialNumber/Ascii/14) "08JG1201858"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.LensSerialNumber);
				Assert.IsNotNull (entry, "Entry 0x0052 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("08JG1201858", (entry as StringIFDEntry).Value);
			}
			// Panasonic.0x0053 (AccessoryType/Ascii/34) "NO-ACCESSORY"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.AccessoryType);
				Assert.IsNotNull (entry, "Entry 0x0053 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NO-ACCESSORY", (entry as StringIFDEntry).Value);
			}
			// Panasonic.0x0054 (0x0054/Ascii/14) "0000000"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0054
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0054);
				Assert.IsNotNull (entry, "Entry 0x0054 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("0000000", (entry as StringIFDEntry).Value);
			}
			// Panasonic.0x0055 (0x0055/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0055
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0055);
				Assert.IsNotNull (entry, "Entry 0x0055 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x005A (0x005a/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005A);
				Assert.IsNotNull (entry, "Entry 0x005A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x005B (0x005b/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005B);
				Assert.IsNotNull (entry, "Entry 0x005B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x005C (0x005c/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005C);
				Assert.IsNotNull (entry, "Entry 0x005C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x005D (0x005d/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005D);
				Assert.IsNotNull (entry, "Entry 0x005D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x005E (0x005e/Undefined/4) "0 0 0 1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005E);
				Assert.IsNotNull (entry, "Entry 0x005E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x005F (0x005f/Undefined/4) "0 0 0 0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x005F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x005F);
				Assert.IsNotNull (entry, "Entry 0x005F missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0060 (0x0060/Undefined/4) "0 1 0 0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0060
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0060);
				Assert.IsNotNull (entry, "Entry 0x0060 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x8000 (MakerNoteVersion/Undefined/4) "48 49 51 48"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.MakerNoteVersion);
				Assert.IsNotNull (entry, "Entry 0x8000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 51, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x8002 (0x8002/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8002
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8002);
				Assert.IsNotNull (entry, "Entry 0x8002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8003 (0x8003/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8003
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8003);
				Assert.IsNotNull (entry, "Entry 0x8003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8007 (0x8007/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8007
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8007);
				Assert.IsNotNull (entry, "Entry 0x8007 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8008 (0x8008/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8008
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8008);
				Assert.IsNotNull (entry, "Entry 0x8008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8009 (0x8009/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8009
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8009);
				Assert.IsNotNull (entry, "Entry 0x8009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8010 (BabyAge/Ascii/20) "9999:99:99 00:00:00"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BabyAge2);
				Assert.IsNotNull (entry, "Entry 0x8010 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("9999:99:99 00:00:00", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "8372"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "28"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (28, (entry as ShortIFDEntry).Value);
			}
			// Image.0xC6D2 (0xc6d2/Undefined/64) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Image / 0xC6D2
				var entry = structure.GetEntry (0, (ushort) 0xC6D2);
				Assert.IsNotNull (entry, "Entry 0xC6D2 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0xC6D3 (0xc6d3/Undefined/64) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Image / 0xC6D3
				var entry = structure.GetEntry (0, (ushort) 0xC6D3);
				Assert.IsNotNull (entry, "Entry 0xC6D3 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "8692"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "5768"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (5768, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
Esempio n. 12
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/16) "Hewlett-Packard"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Hewlett-Packard", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/28) "HP PhotoSmart C812 (V09.26)"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("HP PhotoSmart C812 (V09.26)", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "2984"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1666/100000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1666, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "260/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (260, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (200, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 49 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 49, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2002:01:02 05:00:30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2002:01:02 05:00:30", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2002:01:02 05:00:30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2002:01:02 05:00:30", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9203 (BrightnessValue/SRational/1) "-567/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.BrightnessValue);
				Assert.IsNotNull (entry, "Entry 0x9203 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-567, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9206 (SubjectDistance/Rational/1) "11691/1000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistance);
				Assert.IsNotNull (entry, "Entry 0x9206 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (11691, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9208 (LightSource/Short/1) "4"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "760/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (760, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "2272"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2272, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "1712"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1712, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "3378"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA20B (FlashEnergy/Rational/1) "1000/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashEnergy);
				Assert.IsNotNull (entry, "Entry 0xA20B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x92D6 (0x92d6/Undefined/0) ""
			{
				// TODO: Unknown IFD tag: Image / 0x92D6
				var entry = structure.GetEntry (0, (ushort) 0x92D6);
				Assert.IsNotNull (entry, "Entry 0x92D6 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] {  };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "3826"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "7591"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (7591, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

            Assert.IsTrue (file.PossiblyCorrupt);

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/22) "Canon PowerShot S2 IS"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon PowerShot S2 IS", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/21) "f-spot version 0.4.1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("f-spot version 0.4.1", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2007:11:02 17:13:24"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2007:11:02 17:13:24", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "220"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "3/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "27/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (27, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2005:12:22 22:39:11"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2005:12:22 22:39:11", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2005:12:22 23:39:11"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2005:12:22 23:39:11", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "5/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (5, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "56/32"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (56, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (32, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "92/32"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (92, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (32, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "92/32"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (92, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (32, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "6000/1000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (6000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/1192) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Canon, makernote.MakernoteType);

			// CanonCs.0x0000 (0x0000/Short/1) "92"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (92, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCs.0x0001 (Macro/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCs.0x0002 (Selftimer/Short/1) "20"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (20, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCs.0x0003 (Quality/Short/1) "5"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (5, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCs.0x0004 (FlashMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCs.0x0005 (DriveMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCs.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCs.0x0007 (FocusMode/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (4, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCs.0x0008 (0x0008/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCs.0x0009 (0x0009/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCs.0x000A (ImageSize/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCs.0x000B (EasyMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonCs.0x000C (DigitalZoom/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonCs.0x000D (Contrast/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonCs.0x000E (Saturation/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonCs.0x000F (Sharpness/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonCs.0x0010 (ISOSpeed/Short/1) "17"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (17, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonCs.0x0011 (MeteringMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonCs.0x0012 (FocusType/Short/1) "11"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (11, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonCs.0x0013 (AFPoint/Short/1) "8197"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8197, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonCs.0x0014 (ExposureProgram/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonCs.0x0015 (0x0015/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonCs.0x0016 (LensType/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonCs.0x0017 (Lens/Short/3) "7200 600 100"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (7200, (entry as ShortArrayIFDEntry).Values [23]);
				Assert.AreEqual (600, (entry as ShortArrayIFDEntry).Values [24]);
				Assert.AreEqual (100, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonCs.0x001A (MaxAperture/Short/1) "92"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (92, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonCs.0x001B (MinAperture/Short/1) "192"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (192, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonCs.0x001C (FlashActivity/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonCs.0x001D (FlashDetails/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonCs.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonCs.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonCs.0x0020 (FocusContinuous/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonCs.0x0021 (AESetting/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// CanonCs.0x0022 (ImageStabilization/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (35 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [34]);
			}
			// CanonCs.0x0023 (DisplayAperture/Short/1) "27"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (36 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (27, (entry as ShortArrayIFDEntry).Values [35]);
			}
			// CanonCs.0x0024 (ZoomSourceWidth/Short/1) "2592"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (37 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2592, (entry as ShortArrayIFDEntry).Values [36]);
			}
			// CanonCs.0x0025 (ZoomTargetWidth/Short/1) "2592"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (38 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2592, (entry as ShortArrayIFDEntry).Values [37]);
			}
			// CanonCs.0x0026 (0x0026/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (39 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [38]);
			}
			// CanonCs.0x0027 (0x0027/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (40 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [39]);
			}
			// CanonCs.0x0028 (PhotoEffect/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (41 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [40]);
			}
			// CanonCs.0x0029 (0x0029/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (42 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [41]);
			}
			// CanonCs.0x002A (ColorTone/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (43 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [42]);
			}
			// CanonCs.0x002B (0x002b/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (44 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [43]);
			}
			// CanonCs.0x002C (0x002c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (45 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [44]);
			}
			// CanonCs.0x002D (0x002d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (46 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [45]);
			}
			// Canon.0x0002 (FocalLength/Short/4) "2 600 230 172"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 600, 230, 172 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0003 (0x0003/Short/4) "0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.Unknown3);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// CanonSi.0x0000 (0x0000/Short/1) "68"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (68, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonSi.0x0001 (0x0001/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonSi.0x0002 (ISOSpeed/Short/1) "160"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (160, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonSi.0x0003 (0x0003/Short/1) "65495"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65495, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonSi.0x0004 (TargetAperture/Short/1) "92"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (92, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonSi.0x0005 (TargetShutterSpeed/Short/1) "56"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (56, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonSi.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonSi.0x0007 (WhiteBalance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonSi.0x0008 (0x0008/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonSi.0x0009 (Sequence/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonSi.0x000A (0x000a/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonSi.0x000B (0x000b/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonSi.0x000C (0x000c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonSi.0x000D (0x000d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonSi.0x000E (AFPointUsed/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonSi.0x000F (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonSi.0x0010 (0x0010/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonSi.0x0011 (0x0011/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonSi.0x0012 (0x0012/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonSi.0x0013 (SubjectDistance/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonSi.0x0014 (0x0014/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonSi.0x0015 (ApertureValue/Short/1) "94"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (94, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonSi.0x0016 (ShutterSpeedValue/Short/1) "50"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (50, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonSi.0x0017 (0x0017/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (24 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [23]);
			}
			// CanonSi.0x0018 (0x0018/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (25 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [24]);
			}
			// CanonSi.0x0019 (0x0019/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonSi.0x001A (0x001a/Short/1) "250"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (250, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonSi.0x001B (0x001b/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonSi.0x001C (0x001c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonSi.0x001D (0x001d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonSi.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonSi.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonSi.0x0020 (0x0020/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonSi.0x0021 (0x0021/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// CanonPi.0x0000 (0x0000/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonPi.0x0001 (0x0001/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonPi.0x0002 (ImageWidth/Short/1) "2592"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2592, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonPi.0x0003 (ImageHeight/Short/1) "1944"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1944, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonPi.0x0004 (ImageWidthAsShot/Short/1) "1296"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1296, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonPi.0x0005 (ImageHeightAsShot/Short/1) "242"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (242, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonPi.0x0006 (0x0006/Short/1) "233"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (233, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonPi.0x0007 (0x0007/Short/1) "44"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (44, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonPi.0x0008 (0x0008/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonPi.0x0009 (0x0009/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonPi.0x000A (0x000a/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonPi.0x000B (0x000b/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// Canon.0x0013 (0x0013/Short/4) "0 0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x0013
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0013);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0006 (ImageType/Ascii/25) "IMG:PowerShot S2 IS JPEG"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageType);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("IMG:PowerShot S2 IS JPEG", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0007 (FirmwareVersion/Ascii/22) "Firmware Version 1.00"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Firmware Version 1.00", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0008 (ImageNumber/Long/1) "1111185"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageNumber);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1111185, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0009 (OwnerName/Ascii/32) ""
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.OwnerName);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Canon.0x0010 (ModelID/Long/1) "23330816"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ModelID);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (23330816, (entry as LongIFDEntry).Value);
			}
			// Canon.0x000D (0x000d/Long/85) "0 1 0 4294967221 4294967200 4294967200 4294967291 0 0 0 9 10 4294967279 4294967231 283 10 4294967183 4294967269 460 0 0 0 0 0 0 0 0 0 79 641 199 0 0 0 0 0 0 376 0 583 183 0 0 1228 1535 583 182 114 1032 1481 2590 1032 1 480 283 4294967173 556 288 0 0 1 0 0 0 0 4756 0 0 0 0 0 0 0 5012 0 0 0 0 0 1 0 1 4736 23 13"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.Unknown13);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 0, 1, 0, 4294967221, 4294967200, 4294967200, 4294967291, 0, 0, 0, 9, 10, 4294967279, 4294967231, 283, 10, 4294967183, 4294967269, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 641, 199, 0, 0, 0, 0, 0, 0, 376, 0, 583, 183, 0, 0, 1228, 1535, 583, 182, 114, 1032, 1481, 2590, 1032, 1, 480, 283, 4294967173, 556, 288, 0, 0, 1, 0, 0, 0, 0, 4756, 0, 0, 0, 0, 0, 0, 0, 5012, 0, 0, 0, 0, 0, 1, 0, 1, 4736, 23, 13 }, (entry as LongArrayIFDEntry).Values);
			}
			// Canon.0x0018 (0x0018/Byte/256) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Canon / 0x0018
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0018);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Canon.0x0019 (0x0019/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Canon / 0x0019
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0019);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x001A (0x001a/Short/1) "2"
			{
				// TODO: Unknown IFD tag: Canon / 0x001A
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001A);
				Assert.IsNotNull (entry, "Entry 0x001A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x001C (0x001c/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Canon / 0x001C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001C);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x001D (0x001d/Short/16) "32 1 0 2 2 2 2 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x001D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001D);
				Assert.IsNotNull (entry, "Entry 0x001D missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 32, 1, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x001E (0x001e/Long/1) "16778496"
			{
				// TODO: Unknown IFD tag: Canon / 0x001E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001E);
				Assert.IsNotNull (entry, "Entry 0x001E missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (16778496, (entry as LongIFDEntry).Value);
			}
			// Photo.0x9286 (UserComment/UserComment/24) "charset="InvalidCharsetId" 5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
                // Commented, it's corrupt anyway.
				//Assert.AreEqual ("charset="InvalidCharsetId" 5", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "2592"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2592, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "1944"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1944, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "1942"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Iop.0x1001 (RelatedImageWidth/Short/1) "2592"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.RelatedImageWidth);
				Assert.IsNotNull (entry, "Entry 0x1001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2592, (entry as ShortIFDEntry).Value);
			}
			// Iop.0x1002 (RelatedImageLength/Short/1) "1944"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.RelatedImageLength);
				Assert.IsNotNull (entry, "Entry 0x1002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1944, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "2592000/225"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2592000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (225, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "1944000/168"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1944000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (168, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "2592/2592"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2592, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2592, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "2090"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "7866"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (7866, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.dc.subject (XmpBag/1) "Macro"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "subject");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Bag, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("Macro", node.Children [0].Value);
			}

			//  ---------- End of XMP tests ----------

		}
Esempio n. 14
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/21) "Canon EOS 5D Mark II"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 5D Mark II", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/23) "f-spot version 0.6.1.5"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("f-spot version 0.6.1.5", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:09:29 20:49:37"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:09:29 20:49:37", (entry as StringIFDEntry).Value);
			}
			// Image.0x013B (Artist/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Artist);
				Assert.IsNotNull (entry, "Entry 0x013B missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8298 (Copyright/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Copyright);
				Assert.IsNotNull (entry, "Entry 0x8298 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "258"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/125"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (125, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "1600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1600, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:05:16 20:37:35"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:05:16 20:37:35", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:05:16 18:58:35"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:05:16 18:58:35", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "458752/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (458752, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "262144/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (262144, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "9"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (9, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "95/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (95, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9286 (UserComment/UserComment/8) "charset="Ascii" "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0x9290 (SubSecTime/Ascii/3) "09"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("09", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "09"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("09", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "09"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("09", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "3253"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3253, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "4880"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4880, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "5616000/1459"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (5616000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1459, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "3744000/958"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3744000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (958, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8825 (GPSTag/SubIFD/1) "724"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD);
				Assert.IsNotNull (entry, "Entry 0x8825 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var gps = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD) as SubIFDEntry;
			Assert.IsNotNull (gps, "GPS tag not found");
			var gps_structure = gps.Structure;

			// GPSInfo.0x0000 (GPSVersionID/Byte/4) "2 2 0 0 "
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSVersionID);
				Assert.IsNotNull (entry, "Entry 0x0000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 2, 2, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "836"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "4463"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4463, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.tiff.Software (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Software");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.software (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "software");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.CreatorTool (XmpText/49) "Adobe Photoshop Elements for Windows, version 2.0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "CreatorTool");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Adobe Photoshop Elements for Windows, version 2.0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.creatortool (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "creatortool");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmpMM.DocumentID (XmpText/58) "adobe:docid:photoshop:f48fd669-42b3-11de-a9a9-b4912218066d"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_MM_NS, "DocumentID");
				Assert.IsNotNull (node);
				Assert.AreEqual ("adobe:docid:photoshop:f48fd669-42b3-11de-a9a9-b4912218066d", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.dc.subject (XmpBag/2) "TASI, 50v-juhlat"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "subject");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Bag, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (2, node.Children.Count);
				var children_array = new System.Collections.Generic.List<string> ();
				foreach (var child in node.Children)
				{
					children_array.Add (child.Value);
				}
				Assert.IsTrue (children_array.Contains ("TASI"));
				Assert.IsTrue (children_array.Contains ("50v-juhlat"));
			}

			//  ---------- End of XMP tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x0100 (ImageWidth/Short/1) "21"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (21, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Short/1) "32"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "NIKON D90"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D90", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "518"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "2016"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2016, (entry as LongIFDEntry).Value);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x02BC (XMLPacket/XMLPacket/1136) "60 120 58 120 109 112 109 101 116 97 32 120 109 108 110 115 58 120 61 34 97 100 111 98 101 58 110 115 58 109 101 116 97 47 34 32 120 58 120 109 112 116 107 61 34 88 77 80 32 67 111 114 101 32 52 46 52 46 48 34 62 10 32 60 114 100 102 58 82 68 70 32 120 109 108 110 115 58 114 100 102 61 34 104 116 116 112 58 47 47 119 119 119 46 119 51 46 111 114 103 47 49 57 57 57 47 48 50 47 50 50 45 114 100 102 45 115 121 110 116 97 120 45 110 115 35 34 62 10 32 32 60 114 100 102 58 68 101 115 99 114 105 112 116 105 111 110 32 114 100 102 58 97 98 111 117 116 61 34 34 10 32 32 32 32 120 109 108 110 115 58 116 105 102 102 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 116 105 102 102 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 101 120 105 102 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 101 120 105 102 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 112 104 111 116 111 115 104 111 112 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 112 104 111 116 111 115 104 111 112 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 120 109 112 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 120 97 112 47 49 46 48 47 34 10 32 32 32 116 105 102 102 58 77 111 100 101 108 61 34 78 73 75 79 78 32 68 57 48 34 10 32 32 32 116 105 102 102 58 77 97 107 101 61 34 78 73 75 79 78 32 67 79 82 80 79 82 65 84 73 79 78 34 10 32 32 32 116 105 102 102 58 73 109 97 103 101 87 105 100 116 104 61 34 52 50 57 48 34 10 32 32 32 116 105 102 102 58 73 109 97 103 101 76 101 110 103 116 104 61 34 50 56 54 48 34 10 32 32 32 116 105 102 102 58 70 78 117 109 98 101 114 61 34 53 51 47 49 48 34 10 32 32 32 116 105 102 102 58 88 82 101 115 111 108 117 116 105 111 110 61 34 49 53 48 47 49 34 10 32 32 32 116 105 102 102 58 89 82 101 115 111 108 117 116 105 111 110 61 34 49 53 48 47 49 34 10 32 32 32 116 105 102 102 58 82 101 115 111 108 117 116 105 111 110 85 110 105 116 61 34 50 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 80 114 111 103 114 97 109 61 34 51 34 10 32 32 32 101 120 105 102 58 77 101 116 101 114 105 110 103 77 111 100 101 61 34 53 34 10 32 32 32 101 120 105 102 58 76 105 103 104 116 83 111 117 114 99 101 61 34 48 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 77 111 100 101 61 34 48 34 10 32 32 32 101 120 105 102 58 87 104 105 116 101 66 97 108 97 110 99 101 61 34 48 34 10 32 32 32 101 120 105 102 58 70 111 99 97 108 76 101 110 103 116 104 73 110 51 53 109 109 70 105 108 109 61 34 49 56 48 34 10 32 32 32 101 120 105 102 58 83 99 101 110 101 67 97 112 116 117 114 101 84 121 112 101 61 34 48 34 10 32 32 32 101 120 105 102 58 67 111 110 116 114 97 115 116 61 34 48 34 10 32 32 32 101 120 105 102 58 83 97 116 117 114 97 116 105 111 110 61 34 48 34 10 32 32 32 101 120 105 102 58 83 104 97 114 112 110 101 115 115 61 34 48 34 10 32 32 32 101 120 105 102 58 83 117 98 106 101 99 116 68 105 115 116 97 110 99 101 82 97 110 103 101 61 34 48 34 10 32 32 32 101 120 105 102 58 73 83 79 83 112 101 101 100 82 97 116 105 110 103 61 34 50 48 48 34 10 32 32 32 101 120 105 102 58 70 108 97 115 104 61 34 48 34 10 32 32 32 101 120 105 102 58 77 97 120 65 112 101 114 116 117 114 101 86 97 108 117 101 61 34 52 57 47 49 48 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 84 105 109 101 61 34 49 48 47 54 48 48 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 66 105 97 115 86 97 108 117 101 61 34 48 47 54 34 10 32 32 32 101 120 105 102 58 70 111 99 97 108 76 101 110 103 116 104 61 34 49 50 48 48 47 49 48 34 10 32 32 32 112 104 111 116 111 115 104 111 112 58 68 97 116 101 67 114 101 97 116 101 100 61 34 50 48 49 48 45 48 49 45 48 50 84 49 51 58 52 53 58 52 57 46 48 48 48 90 34 10 32 32 32 120 109 112 58 82 97 116 105 110 103 61 34 48 34 47 62 10 32 60 47 114 100 102 58 82 68 70 62 10 60 47 120 58 120 109 112 109 101 116 97 62 10 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XMP);
				Assert.IsNotNull (entry, "Entry 0x02BC missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
			}
			// Image.0x83BB (IPTCNAA/IPTCNAA/20) "5898524 1193614083 540 470024194 134231810 808529970 842019120 3932700 875770118 3748917 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.IPTC);
				Assert.IsNotNull (entry, "Entry 0x83BB missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x010F (0x010f/Ascii/18) "NIKON CORPORATION"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0110 (0x0110/Ascii/10) "NIKON D90"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D90", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0132 (0x0132/Ascii/20) "2010:02:03 10:54:17"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:03 10:54:17", (entry as StringIFDEntry).Value);
			}
			// Photo.0x829A (ExposureTime/Rational/1) "10/600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (600, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "5557453/1048576"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (5557453, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1048576, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (200, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:01:02 13:45:49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:02 13:45:49", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:01:02 13:45:49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:02 13:45:49", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/Rational/1) "193557/32768"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (193557, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (32768, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "1261433/262144"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1261433, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (262144, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "49/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (49, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "120/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (120, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9290 (SubSecTime/Ascii/4) "481"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("481", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA217 (SensingMethod/Byte/1) "2 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (2 , (entry as ByteIFDEntry).Value);
			}
			// Photo.0xA301 (SceneType/Byte/1) "1 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (1 , (entry as ByteIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "180"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (180, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8773 (InterColorProfile/Undefined/3144) "0 0 12 72 76 105 110 111 2 16 0 0 109 110 116 114 82 71 66 32 88 89 90 32 7 206 0 2 0 9 0 6 0 49 0 0 97 99 115 112 77 83 70 84 0 0 0 0 73 69 67 32 115 82 71 66 0 0 0 0 0 0 0 0 0 0 0 1 0 0 246 214 0 1 0 0 0 0 211 45 72 80 32 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 99 112 114 116 0 0 1 80 0 0 0 51 100 101 115 99 0 0 1 132 0 0 0 108 119 116 112 116 0 0 1 240 0 0 0 20 98 107 112 116 0 0 2 4 0 0 0 20 114 88 89 90 0 0 2 24 0 0 0 20 103 88 89 90 0 0 2 44 0 0 0 20 98 88 89 90 0 0 2 64 0 0 0 20 100 109 110 100 0 0 2 84 0 0 0 112 100 109 100 100 0 0 2 196 0 0 0 136 118 117 101 100 0 0 3 76 0 0 0 134 118 105 101 119 0 0 3 212 0 0 0 36 108 117 109 105 0 0 3 248 0 0 0 20 109 101 97 115 0 0 4 12 0 0 0 36 116 101 99 104 0 0 4 48 0 0 0 12 114 84 82 67 0 0 4 60 0 0 8 12 103 84 82 67 0 0 4 60 0 0 8 12 98 84 82 67 0 0 4 60 0 0 8 12 116 101 120 116 0 0 0 0 67 111 112 121 114 105 103 104 116 32 40 99 41 32 49 57 57 56 32 72 101 119 108 101 116 116 45 80 97 99 107 97 114 100 32 67 111 109 112 97 110 121 0 0 100 101 115 99 0 0 0 0 0 0 0 18 115 82 71 66 32 73 69 67 54 49 57 54 54 45 50 46 49 0 0 0 0 0 0 0 0 0 0 0 18 115 82 71 66 32 73 69 67 54 49 57 54 54 45 50 46 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 89 90 32 0 0 0 0 0 0 243 81 0 1 0 0 0 1 22 204 88 89 90 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 89 90 32 0 0 0 0 0 0 111 162 0 0 56 245 0 0 3 144 88 89 90 32 0 0 0 0 0 0 98 153 0 0 183 133 0 0 24 218 88 89 90 32 0 0 0 0 0 0 36 160 0 0 15 132 0 0 182 207 100 101 115 99 0 0 0 0 0 0 0 22 73 69 67 32 104 116 116 112 58 47 47 119 119 119 46 105 101 99 46 99 104 0 0 0 0 0 0 0 0 0 0 0 22 73 69 67 32 104 116 116 112 58 47 47 119 119 119 46 105 101 99 46 99 104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 46 73 69 67 32 54 49 57 54 54 45 50 46 49 32 68 101 102 97 117 108 116 32 82 71 66 32 99 111 108 111 117 114 32 115 112 97 99 101 32 45 32 115 82 71 66 0 0 0 0 0 0 0 0 0 0 0 46 73 69 67 32 54 49 57 54 54 45 50 46 49 32 68 101 102 97 117 108 116 32 82 71 66 32 99 111 108 111 117 114 32 115 112 97 99 101 32 45 32 115 82 71 66 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 44 82 101 102 101 114 101 110 99 101 32 86 105 101 119 105 110 103 32 67 111 110 100 105 116 105 111 110 32 105 110 32 73 69 67 54 49 57 54 54 45 50 46 49 0 0 0 0 0 0 0 0 0 0 0 44 82 101 102 101 114 101 110 99 101 32 86 105 101 119 105 110 103 32 67 111 110 100 105 116 105 111 110 32 105 110 32 73 69 67 54 49 57 54 54 45 50 46 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 118 105 101 119 0 0 0 0 0 19 164 254 0 20 95 46 0 16 207 20 0 3 237 204 0 4 19 11 0 3 92 158 0 0 0 1 88 89 90 32 0 0 0 0 0 76 9 86 0 80 0 0 0 87 31 231 109 101 97 115 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 143 0 0 0 2 115 105 103 32 0 0 0 0 67 82 84 32 99 117 114 118 0 0 0 0 0 0 4 0 0 0 0 5 0 10 0 15 0 20 0 25 0 30 0 35 0 40 0 45 0 50 0 55 0 59 0 64 0 69 0 74 0 79 0 84 0 89 0 94 0 99 0 104 0 109 0 114 0 119 0 124 0 129 0 134 0 139 0 144 0 149 0 154 0 159 0 164 0 169 0 174 0 178 0 183 0 188 0 193 0 198 0 203 0 208 0 213 0 219 0 224 0 229 0 235 0 240 0 246 0 251 1 1 1 7 1 13 1 19 1 25 1 31 1 37 1 43 1 50 1 56 1 62 1 69 1 76 1 82 1 89 1 96 1 103 1 110 1 117 1 124 1 131 1 139 1 146 1 154 1 161 1 169 1 177 1 185 1 193 1 201 1 209 1 217 1 225 1 233 1 242 1 250 2 3 2 12 2 20 2 29 2 38 2 47 2 56 2 65 2 75 2 84 2 93 2 103 2 113 2 122 2 132 2 142 2 152 2 162 2 172 2 182 2 193 2 203 2 213 2 224 2 235 2 245 3 0 3 11 3 22 3 33 3 45 3 56 3 67 3 79 3 90 3 102 3 114 3 126 3 138 3 150 3 162 3 174 3 186 3 199 3 211 3 224 3 236 3 249 4 6 4 19 4 32 4 45 4 59 4 72 4 85 4 99 4 113 4 126 4 140 4 154 4 168 4 182 4 196 4 211 4 225 4 240 4 254 5 13 5 28 5 43 5 58 5 73 5 88 5 103 5 119 5 134 5 150 5 166 5 181 5 197 5 213 5 229 5 246 6 6 6 22 6 39 6 55 6 72 6 89 6 106 6 123 6 140 6 157 6 175 6 192 6 209 6 227 6 245 7 7 7 25 7 43 7 61 7 79 7 97 7 116 7 134 7 153 7 172 7 191 7 210 7 229 7 248 8 11 8 31 8 50 8 70 8 90 8 110 8 130 8 150 8 170 8 190 8 210 8 231 8 251 9 16 9 37 9 58 9 79 9 100 9 121 9 143 9 164 9 186 9 207 9 229 9 251 10 17 10 39 10 61 10 84 10 106 10 129 10 152 10 174 10 197 10 220 10 243 11 11 11 34 11 57 11 81 11 105 11 128 11 152 11 176 11 200 11 225 11 249 12 18 12 42 12 67 12 92 12 117 12 142 12 167 12 192 12 217 12 243 13 13 13 38 13 64 13 90 13 116 13 142 13 169 13 195 13 222 13 248 14 19 14 46 14 73 14 100 14 127 14 155 14 182 14 210 14 238 15 9 15 37 15 65 15 94 15 122 15 150 15 179 15 207 15 236 16 9 16 38 16 67 16 97 16 126 16 155 16 185 16 215 16 245 17 19 17 49 17 79 17 109 17 140 17 170 17 201 17 232 18 7 18 38 18 69 18 100 18 132 18 163 18 195 18 227 19 3 19 35 19 67 19 99 19 131 19 164 19 197 19 229 20 6 20 39 20 73 20 106 20 139 20 173 20 206 20 240 21 18 21 52 21 86 21 120 21 155 21 189 21 224 22 3 22 38 22 73 22 108 22 143 22 178 22 214 22 250 23 29 23 65 23 101 23 137 23 174 23 210 23 247 24 27 24 64 24 101 24 138 24 175 24 213 24 250 25 32 25 69 25 107 25 145 25 183 25 221 26 4 26 42 26 81 26 119 26 158 26 197 26 236 27 20 27 59 27 99 27 138 27 178 27 218 28 2 28 42 28 82 28 123 28 163 28 204 28 245 29 30 29 71 29 112 29 153 29 195 29 236 30 22 30 64 30 106 30 148 30 190 30 233 31 19 31 62 31 105 31 148 31 191 31 234 32 21 32 65 32 108 32 152 32 196 32 240 33 28 33 72 33 117 33 161 33 206 33 251 34 39 34 85 34 130 34 175 34 221 35 10 35 56 35 102 35 148 35 194 35 240 36 31 36 77 36 124 36 171 36 218 37 9 37 56 37 104 37 151 37 199 37 247 38 39 38 87 38 135 38 183 38 232 39 24 39 73 39 122 39 171 39 220 40 13 40 63 40 113 40 162 40 212 41 6 41 56 41 107 41 157 41 208 42 2 42 53 42 104 42 155 42 207 43 2 43 54 43 105 43 157 43 209 44 5 44 57 44 110 44 162 44 215 45 12 45 65 45 118 45 171 45 225 46 22 46 76 46 130 46 183 46 238 47 36 47 90 47 145 47 199 47 254 48 53 48 108 48 164 48 219 49 18 49 74 49 130 49 186 49 242 50 42 50 99 50 155 50 212 51 13 51 70 51 127 51 184 51 241 52 43 52 101 52 158 52 216 53 19 53 77 53 135 53 194 53 253 54 55 54 114 54 174 54 233 55 36 55 96 55 156 55 215 56 20 56 80 56 140 56 200 57 5 57 66 57 127 57 188 57 249 58 54 58 116 58 178 58 239 59 45 59 107 59 170 59 232 60 39 60 101 60 164 60 227 61 34 61 97 61 161 61 224 62 32 62 96 62 160 62 224 63 33 63 97 63 162 63 226 64 35 64 100 64 166 64 231 65 41 65 106 65 172 65 238 66 48 66 114 66 181 66 247 67 58 67 125 67 192 68 3 68 71 68 138 68 206 69 18 69 85 69 154 69 222 70 34 70 103 70 171 70 240 71 53 71 123 71 192 72 5 72 75 72 145 72 215 73 29 73 99 73 169 73 240 74 55 74 125 74 196 75 12 75 83 75 154 75 226 76 42 76 114 76 186 77 2 77 74 77 147 77 220 78 37 78 110 78 183 79 0 79 73 79 147 79 221 80 39 80 113 80 187 81 6 81 80 81 155 81 230 82 49 82 124 82 199 83 19 83 95 83 170 83 246 84 66 84 143 84 219 85 40 85 117 85 194 86 15 86 92 86 169 86 247 87 68 87 146 87 224 88 47 88 125 88 203 89 26 89 105 89 184 90 7 90 86 90 166 90 245 91 69 91 149 91 229 92 53 92 134 92 214 93 39 93 120 93 201 94 26 94 108 94 189 95 15 95 97 95 179 96 5 96 87 96 170 96 252 97 79 97 162 97 245 98 73 98 156 98 240 99 67 99 151 99 235 100 64 100 148 100 233 101 61 101 146 101 231 102 61 102 146 102 232 103 61 103 147 103 233 104 63 104 150 104 236 105 67 105 154 105 241 106 72 106 159 106 247 107 79 107 167 107 255 108 87 108 175 109 8 109 96 109 185 110 18 110 107 110 196 111 30 111 120 111 209 112 43 112 134 112 224 113 58 113 149 113 240 114 75 114 166 115 1 115 93 115 184 116 20 116 112 116 204 117 40 117 133 117 225 118 62 118 155 118 248 119 86 119 179 120 17 120 110 120 204 121 42 121 137 121 231 122 70 122 165 123 4 123 99 123 194 124 33 124 129 124 225 125 65 125 161 126 1 126 98 126 194 127 35 127 132 127 229 128 71 128 168 129 10 129 107 129 205 130 48 130 146 130 244 131 87 131 186 132 29 132 128 132 227 133 71 133 171 134 14 134 114 134 215 135 59 135 159 136 4 136 105 136 206 137 51 137 153 137 254 138 100 138 202 139 48 139 150 139 252 140 99 140 202 141 49 141 152 141 255 142 102 142 206 143 54 143 158 144 6 144 110 144 214 145 63 145 168 146 17 146 122 146 227 147 77 147 182 148 32 148 138 148 244 149 95 149 201 150 52 150 159 151 10 151 117 151 224 152 76 152 184 153 36 153 144 153 252 154 104 154 213 155 66 155 175 156 28 156 137 156 247 157 100 157 210 158 64 158 174 159 29 159 139 159 250 160 105 160 216 161 71 161 182 162 38 162 150 163 6 163 118 163 230 164 86 164 199 165 56 165 169 166 26 166 139 166 253 167 110 167 224 168 82 168 196 169 55 169 169 170 28 170 143 171 2 171 117 171 233 172 92 172 208 173 68 173 184 174 45 174 161 175 22 175 139 176 0 176 117 176 234 177 96 177 214 178 75 178 194 179 56 179 174 180 37 180 156 181 19 181 138 182 1 182 121 182 240 183 104 183 224 184 89 184 209 185 74 185 194 186 59 186 181 187 46 187 167 188 33 188 155 189 21 189 143 190 10 190 132 190 255 191 122 191 245 192 112 192 236 193 103 193 227 194 95 194 219 195 88 195 212 196 81 196 206 197 75 197 200 198 70 198 195 199 65 199 191 200 61 200 188 201 58 201 185 202 56 202 183 203 54 203 182 204 53 204 181 205 53 205 181 206 54 206 182 207 55 207 184 208 57 208 186 209 60 209 190 210 63 210 193 211 68 211 198 212 73 212 203 213 78 213 209 214 85 214 216 215 92 215 224 216 100 216 232 217 108 217 241 218 118 218 251 219 128 220 5 220 138 221 16 221 150 222 28 222 162 223 41 223 175 224 54 224 189 225 68 225 204 226 83 226 219 227 99 227 235 228 115 228 252 229 132 230 13 230 150 231 31 231 169 232 50 232 188 233 70 233 208 234 91 234 229 235 112 235 251 236 134 237 17 237 156 238 40 238 180 239 64 239 204 240 88 240 229 241 114 241 255 242 140 243 25 243 167 244 52 244 194 245 80 245 222 246 109 246 251 247 138 248 25 248 168 249 56 249 199 250 87 250 231 251 119 252 7 252 152 253 41 253 186 254 75 254 220 255 109 255 255 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ICCProfile);
				Assert.IsNotNull (entry, "Entry 0x8773 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 12, 72, 76, 105, 110, 111, 2, 16, 0, 0, 109, 110, 116, 114, 82, 71, 66, 32, 88, 89, 90, 32, 7, 206, 0, 2, 0, 9, 0, 6, 0, 49, 0, 0, 97, 99, 115, 112, 77, 83, 70, 84, 0, 0, 0, 0, 73, 69, 67, 32, 115, 82, 71, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 72, 80, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 99, 112, 114, 116, 0, 0, 1, 80, 0, 0, 0, 51, 100, 101, 115, 99, 0, 0, 1, 132, 0, 0, 0, 108, 119, 116, 112, 116, 0, 0, 1, 240, 0, 0, 0, 20, 98, 107, 112, 116, 0, 0, 2, 4, 0, 0, 0, 20, 114, 88, 89, 90, 0, 0, 2, 24, 0, 0, 0, 20, 103, 88, 89, 90, 0, 0, 2, 44, 0, 0, 0, 20, 98, 88, 89, 90, 0, 0, 2, 64, 0, 0, 0, 20, 100, 109, 110, 100, 0, 0, 2, 84, 0, 0, 0, 112, 100, 109, 100, 100, 0, 0, 2, 196, 0, 0, 0, 136, 118, 117, 101, 100, 0, 0, 3, 76, 0, 0, 0, 134, 118, 105, 101, 119, 0, 0, 3, 212, 0, 0, 0, 36, 108, 117, 109, 105, 0, 0, 3, 248, 0, 0, 0, 20, 109, 101, 97, 115, 0, 0, 4, 12, 0, 0, 0, 36, 116, 101, 99, 104, 0, 0, 4, 48, 0, 0, 0, 12, 114, 84, 82, 67, 0, 0, 4, 60, 0, 0, 8, 12, 103, 84, 82, 67, 0, 0, 4, 60, 0, 0, 8, 12, 98, 84, 82, 67, 0, 0, 4, 60, 0, 0, 8, 12, 116, 101, 120, 116, 0, 0, 0, 0, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40, 99, 41, 32, 49, 57, 57, 56, 32, 72, 101, 119, 108, 101, 116, 116, 45, 80, 97, 99, 107, 97, 114, 100, 32, 67, 111, 109, 112, 97, 110, 121, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 18, 115, 82, 71, 66, 32, 73, 69, 67, 54, 49, 57, 54, 54, 45, 50, 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 115, 82, 71, 66, 32, 73, 69, 67, 54, 49, 57, 54, 54, 45, 50, 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 243, 81, 0, 1, 0, 0, 0, 1, 22, 204, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 111, 162, 0, 0, 56, 245, 0, 0, 3, 144, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 98, 153, 0, 0, 183, 133, 0, 0, 24, 218, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 36, 160, 0, 0, 15, 132, 0, 0, 182, 207, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 22, 73, 69, 67, 32, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 105, 101, 99, 46, 99, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 73, 69, 67, 32, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 105, 101, 99, 46, 99, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 46, 73, 69, 67, 32, 54, 49, 57, 54, 54, 45, 50, 46, 49, 32, 68, 101, 102, 97, 117, 108, 116, 32, 82, 71, 66, 32, 99, 111, 108, 111, 117, 114, 32, 115, 112, 97, 99, 101, 32, 45, 32, 115, 82, 71, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 73, 69, 67, 32, 54, 49, 57, 54, 54, 45, 50, 46, 49, 32, 68, 101, 102, 97, 117, 108, 116, 32, 82, 71, 66, 32, 99, 111, 108, 111, 117, 114, 32, 115, 112, 97, 99, 101, 32, 45, 32, 115, 82, 71, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 44, 82, 101, 102, 101, 114, 101, 110, 99, 101, 32, 86, 105, 101, 119, 105, 110, 103, 32, 67, 111, 110, 100, 105, 116, 105, 111, 110, 32, 105, 110, 32, 73, 69, 67, 54, 49, 57, 54, 54, 45, 50, 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 82, 101, 102, 101, 114, 101, 110, 99, 101, 32, 86, 105, 101, 119, 105, 110, 103, 32, 67, 111, 110, 100, 105, 116, 105, 111, 110, 32, 105, 110, 32, 73, 69, 67, 54, 49, 57, 54, 54, 45, 50, 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118, 105, 101, 119, 0, 0, 0, 0, 0, 19, 164, 254, 0, 20, 95, 46, 0, 16, 207, 20, 0, 3, 237, 204, 0, 4, 19, 11, 0, 3, 92, 158, 0, 0, 0, 1, 88, 89, 90, 32, 0, 0, 0, 0, 0, 76, 9, 86, 0, 80, 0, 0, 0, 87, 31, 231, 109, 101, 97, 115, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 143, 0, 0, 0, 2, 115, 105, 103, 32, 0, 0, 0, 0, 67, 82, 84, 32, 99, 117, 114, 118, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 10, 0, 15, 0, 20, 0, 25, 0, 30, 0, 35, 0, 40, 0, 45, 0, 50, 0, 55, 0, 59, 0, 64, 0, 69, 0, 74, 0, 79, 0, 84, 0, 89, 0, 94, 0, 99, 0, 104, 0, 109, 0, 114, 0, 119, 0, 124, 0, 129, 0, 134, 0, 139, 0, 144, 0, 149, 0, 154, 0, 159, 0, 164, 0, 169, 0, 174, 0, 178, 0, 183, 0, 188, 0, 193, 0, 198, 0, 203, 0, 208, 0, 213, 0, 219, 0, 224, 0, 229, 0, 235, 0, 240, 0, 246, 0, 251, 1, 1, 1, 7, 1, 13, 1, 19, 1, 25, 1, 31, 1, 37, 1, 43, 1, 50, 1, 56, 1, 62, 1, 69, 1, 76, 1, 82, 1, 89, 1, 96, 1, 103, 1, 110, 1, 117, 1, 124, 1, 131, 1, 139, 1, 146, 1, 154, 1, 161, 1, 169, 1, 177, 1, 185, 1, 193, 1, 201, 1, 209, 1, 217, 1, 225, 1, 233, 1, 242, 1, 250, 2, 3, 2, 12, 2, 20, 2, 29, 2, 38, 2, 47, 2, 56, 2, 65, 2, 75, 2, 84, 2, 93, 2, 103, 2, 113, 2, 122, 2, 132, 2, 142, 2, 152, 2, 162, 2, 172, 2, 182, 2, 193, 2, 203, 2, 213, 2, 224, 2, 235, 2, 245, 3, 0, 3, 11, 3, 22, 3, 33, 3, 45, 3, 56, 3, 67, 3, 79, 3, 90, 3, 102, 3, 114, 3, 126, 3, 138, 3, 150, 3, 162, 3, 174, 3, 186, 3, 199, 3, 211, 3, 224, 3, 236, 3, 249, 4, 6, 4, 19, 4, 32, 4, 45, 4, 59, 4, 72, 4, 85, 4, 99, 4, 113, 4, 126, 4, 140, 4, 154, 4, 168, 4, 182, 4, 196, 4, 211, 4, 225, 4, 240, 4, 254, 5, 13, 5, 28, 5, 43, 5, 58, 5, 73, 5, 88, 5, 103, 5, 119, 5, 134, 5, 150, 5, 166, 5, 181, 5, 197, 5, 213, 5, 229, 5, 246, 6, 6, 6, 22, 6, 39, 6, 55, 6, 72, 6, 89, 6, 106, 6, 123, 6, 140, 6, 157, 6, 175, 6, 192, 6, 209, 6, 227, 6, 245, 7, 7, 7, 25, 7, 43, 7, 61, 7, 79, 7, 97, 7, 116, 7, 134, 7, 153, 7, 172, 7, 191, 7, 210, 7, 229, 7, 248, 8, 11, 8, 31, 8, 50, 8, 70, 8, 90, 8, 110, 8, 130, 8, 150, 8, 170, 8, 190, 8, 210, 8, 231, 8, 251, 9, 16, 9, 37, 9, 58, 9, 79, 9, 100, 9, 121, 9, 143, 9, 164, 9, 186, 9, 207, 9, 229, 9, 251, 10, 17, 10, 39, 10, 61, 10, 84, 10, 106, 10, 129, 10, 152, 10, 174, 10, 197, 10, 220, 10, 243, 11, 11, 11, 34, 11, 57, 11, 81, 11, 105, 11, 128, 11, 152, 11, 176, 11, 200, 11, 225, 11, 249, 12, 18, 12, 42, 12, 67, 12, 92, 12, 117, 12, 142, 12, 167, 12, 192, 12, 217, 12, 243, 13, 13, 13, 38, 13, 64, 13, 90, 13, 116, 13, 142, 13, 169, 13, 195, 13, 222, 13, 248, 14, 19, 14, 46, 14, 73, 14, 100, 14, 127, 14, 155, 14, 182, 14, 210, 14, 238, 15, 9, 15, 37, 15, 65, 15, 94, 15, 122, 15, 150, 15, 179, 15, 207, 15, 236, 16, 9, 16, 38, 16, 67, 16, 97, 16, 126, 16, 155, 16, 185, 16, 215, 16, 245, 17, 19, 17, 49, 17, 79, 17, 109, 17, 140, 17, 170, 17, 201, 17, 232, 18, 7, 18, 38, 18, 69, 18, 100, 18, 132, 18, 163, 18, 195, 18, 227, 19, 3, 19, 35, 19, 67, 19, 99, 19, 131, 19, 164, 19, 197, 19, 229, 20, 6, 20, 39, 20, 73, 20, 106, 20, 139, 20, 173, 20, 206, 20, 240, 21, 18, 21, 52, 21, 86, 21, 120, 21, 155, 21, 189, 21, 224, 22, 3, 22, 38, 22, 73, 22, 108, 22, 143, 22, 178, 22, 214, 22, 250, 23, 29, 23, 65, 23, 101, 23, 137, 23, 174, 23, 210, 23, 247, 24, 27, 24, 64, 24, 101, 24, 138, 24, 175, 24, 213, 24, 250, 25, 32, 25, 69, 25, 107, 25, 145, 25, 183, 25, 221, 26, 4, 26, 42, 26, 81, 26, 119, 26, 158, 26, 197, 26, 236, 27, 20, 27, 59, 27, 99, 27, 138, 27, 178, 27, 218, 28, 2, 28, 42, 28, 82, 28, 123, 28, 163, 28, 204, 28, 245, 29, 30, 29, 71, 29, 112, 29, 153, 29, 195, 29, 236, 30, 22, 30, 64, 30, 106, 30, 148, 30, 190, 30, 233, 31, 19, 31, 62, 31, 105, 31, 148, 31, 191, 31, 234, 32, 21, 32, 65, 32, 108, 32, 152, 32, 196, 32, 240, 33, 28, 33, 72, 33, 117, 33, 161, 33, 206, 33, 251, 34, 39, 34, 85, 34, 130, 34, 175, 34, 221, 35, 10, 35, 56, 35, 102, 35, 148, 35, 194, 35, 240, 36, 31, 36, 77, 36, 124, 36, 171, 36, 218, 37, 9, 37, 56, 37, 104, 37, 151, 37, 199, 37, 247, 38, 39, 38, 87, 38, 135, 38, 183, 38, 232, 39, 24, 39, 73, 39, 122, 39, 171, 39, 220, 40, 13, 40, 63, 40, 113, 40, 162, 40, 212, 41, 6, 41, 56, 41, 107, 41, 157, 41, 208, 42, 2, 42, 53, 42, 104, 42, 155, 42, 207, 43, 2, 43, 54, 43, 105, 43, 157, 43, 209, 44, 5, 44, 57, 44, 110, 44, 162, 44, 215, 45, 12, 45, 65, 45, 118, 45, 171, 45, 225, 46, 22, 46, 76, 46, 130, 46, 183, 46, 238, 47, 36, 47, 90, 47, 145, 47, 199, 47, 254, 48, 53, 48, 108, 48, 164, 48, 219, 49, 18, 49, 74, 49, 130, 49, 186, 49, 242, 50, 42, 50, 99, 50, 155, 50, 212, 51, 13, 51, 70, 51, 127, 51, 184, 51, 241, 52, 43, 52, 101, 52, 158, 52, 216, 53, 19, 53, 77, 53, 135, 53, 194, 53, 253, 54, 55, 54, 114, 54, 174, 54, 233, 55, 36, 55, 96, 55, 156, 55, 215, 56, 20, 56, 80, 56, 140, 56, 200, 57, 5, 57, 66, 57, 127, 57, 188, 57, 249, 58, 54, 58, 116, 58, 178, 58, 239, 59, 45, 59, 107, 59, 170, 59, 232, 60, 39, 60, 101, 60, 164, 60, 227, 61, 34, 61, 97, 61, 161, 61, 224, 62, 32, 62, 96, 62, 160, 62, 224, 63, 33, 63, 97, 63, 162, 63, 226, 64, 35, 64, 100, 64, 166, 64, 231, 65, 41, 65, 106, 65, 172, 65, 238, 66, 48, 66, 114, 66, 181, 66, 247, 67, 58, 67, 125, 67, 192, 68, 3, 68, 71, 68, 138, 68, 206, 69, 18, 69, 85, 69, 154, 69, 222, 70, 34, 70, 103, 70, 171, 70, 240, 71, 53, 71, 123, 71, 192, 72, 5, 72, 75, 72, 145, 72, 215, 73, 29, 73, 99, 73, 169, 73, 240, 74, 55, 74, 125, 74, 196, 75, 12, 75, 83, 75, 154, 75, 226, 76, 42, 76, 114, 76, 186, 77, 2, 77, 74, 77, 147, 77, 220, 78, 37, 78, 110, 78, 183, 79, 0, 79, 73, 79, 147, 79, 221, 80, 39, 80, 113, 80, 187, 81, 6, 81, 80, 81, 155, 81, 230, 82, 49, 82, 124, 82, 199, 83, 19, 83, 95, 83, 170, 83, 246, 84, 66, 84, 143, 84, 219, 85, 40, 85, 117, 85, 194, 86, 15, 86, 92, 86, 169, 86, 247, 87, 68, 87, 146, 87, 224, 88, 47, 88, 125, 88, 203, 89, 26, 89, 105, 89, 184, 90, 7, 90, 86, 90, 166, 90, 245, 91, 69, 91, 149, 91, 229, 92, 53, 92, 134, 92, 214, 93, 39, 93, 120, 93, 201, 94, 26, 94, 108, 94, 189, 95, 15, 95, 97, 95, 179, 96, 5, 96, 87, 96, 170, 96, 252, 97, 79, 97, 162, 97, 245, 98, 73, 98, 156, 98, 240, 99, 67, 99, 151, 99, 235, 100, 64, 100, 148, 100, 233, 101, 61, 101, 146, 101, 231, 102, 61, 102, 146, 102, 232, 103, 61, 103, 147, 103, 233, 104, 63, 104, 150, 104, 236, 105, 67, 105, 154, 105, 241, 106, 72, 106, 159, 106, 247, 107, 79, 107, 167, 107, 255, 108, 87, 108, 175, 109, 8, 109, 96, 109, 185, 110, 18, 110, 107, 110, 196, 111, 30, 111, 120, 111, 209, 112, 43, 112, 134, 112, 224, 113, 58, 113, 149, 113, 240, 114, 75, 114, 166, 115, 1, 115, 93, 115, 184, 116, 20, 116, 112, 116, 204, 117, 40, 117, 133, 117, 225, 118, 62, 118, 155, 118, 248, 119, 86, 119, 179, 120, 17, 120, 110, 120, 204, 121, 42, 121, 137, 121, 231, 122, 70, 122, 165, 123, 4, 123, 99, 123, 194, 124, 33, 124, 129, 124, 225, 125, 65, 125, 161, 126, 1, 126, 98, 126, 194, 127, 35, 127, 132, 127, 229, 128, 71, 128, 168, 129, 10, 129, 107, 129, 205, 130, 48, 130, 146, 130, 244, 131, 87, 131, 186, 132, 29, 132, 128, 132, 227, 133, 71, 133, 171, 134, 14, 134, 114, 134, 215, 135, 59, 135, 159, 136, 4, 136, 105, 136, 206, 137, 51, 137, 153, 137, 254, 138, 100, 138, 202, 139, 48, 139, 150, 139, 252, 140, 99, 140, 202, 141, 49, 141, 152, 141, 255, 142, 102, 142, 206, 143, 54, 143, 158, 144, 6, 144, 110, 144, 214, 145, 63, 145, 168, 146, 17, 146, 122, 146, 227, 147, 77, 147, 182, 148, 32, 148, 138, 148, 244, 149, 95, 149, 201, 150, 52, 150, 159, 151, 10, 151, 117, 151, 224, 152, 76, 152, 184, 153, 36, 153, 144, 153, 252, 154, 104, 154, 213, 155, 66, 155, 175, 156, 28, 156, 137, 156, 247, 157, 100, 157, 210, 158, 64, 158, 174, 159, 29, 159, 139, 159, 250, 160, 105, 160, 216, 161, 71, 161, 182, 162, 38, 162, 150, 163, 6, 163, 118, 163, 230, 164, 86, 164, 199, 165, 56, 165, 169, 166, 26, 166, 139, 166, 253, 167, 110, 167, 224, 168, 82, 168, 196, 169, 55, 169, 169, 170, 28, 170, 143, 171, 2, 171, 117, 171, 233, 172, 92, 172, 208, 173, 68, 173, 184, 174, 45, 174, 161, 175, 22, 175, 139, 176, 0, 176, 117, 176, 234, 177, 96, 177, 214, 178, 75, 178, 194, 179, 56, 179, 174, 180, 37, 180, 156, 181, 19, 181, 138, 182, 1, 182, 121, 182, 240, 183, 104, 183, 224, 184, 89, 184, 209, 185, 74, 185, 194, 186, 59, 186, 181, 187, 46, 187, 167, 188, 33, 188, 155, 189, 21, 189, 143, 190, 10, 190, 132, 190, 255, 191, 122, 191, 245, 192, 112, 192, 236, 193, 103, 193, 227, 194, 95, 194, 219, 195, 88, 195, 212, 196, 81, 196, 206, 197, 75, 197, 200, 198, 70, 198, 195, 199, 65, 199, 191, 200, 61, 200, 188, 201, 58, 201, 185, 202, 56, 202, 183, 203, 54, 203, 182, 204, 53, 204, 181, 205, 53, 205, 181, 206, 54, 206, 182, 207, 55, 207, 184, 208, 57, 208, 186, 209, 60, 209, 190, 210, 63, 210, 193, 211, 68, 211, 198, 212, 73, 212, 203, 213, 78, 213, 209, 214, 85, 214, 216, 215, 92, 215, 224, 216, 100, 216, 232, 217, 108, 217, 241, 218, 118, 218, 251, 219, 128, 220, 5, 220, 138, 221, 16, 221, 150, 222, 28, 222, 162, 223, 41, 223, 175, 224, 54, 224, 189, 225, 68, 225, 204, 226, 83, 226, 219, 227, 99, 227, 235, 228, 115, 228, 252, 229, 132, 230, 13, 230, 150, 231, 31, 231, 169, 232, 50, 232, 188, 233, 70, 233, 208, 234, 91, 234, 229, 235, 112, 235, 251, 236, 134, 237, 17, 237, 156, 238, 40, 238, 180, 239, 64, 239, 204, 240, 88, 240, 229, 241, 114, 241, 255, 242, 140, 243, 25, 243, 167, 244, 52, 244, 194, 245, 80, 245, 222, 246, 109, 246, 251, 247, 138, 248, 25, 248, 168, 249, 56, 249, 199, 250, 87, 250, 231, 251, 119, 252, 7, 252, 152, 253, 41, 253, 186, 254, 75, 254, 220, 255, 109, 255, 255 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.tiff.Model (XmpText/9) "NIKON D90"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Model");
				Assert.IsNotNull (node);
				Assert.AreEqual ("NIKON D90", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Make (XmpText/17) "NIKON CORPORATION"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Make");
				Assert.IsNotNull (node);
				Assert.AreEqual ("NIKON CORPORATION", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageWidth (XmpText/4) "4290"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageWidth");
				Assert.IsNotNull (node);
				Assert.AreEqual ("4290", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageLength (XmpText/4) "2860"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2860", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.FNumber (XmpText/5) "53/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "FNumber");
				Assert.IsNotNull (node);
				Assert.AreEqual ("53/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.XResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "XResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.YResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "YResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ResolutionUnit (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ResolutionUnit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureProgram (XmpText/1) "3"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureProgram");
				Assert.IsNotNull (node);
				Assert.AreEqual ("3", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MeteringMode (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MeteringMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.LightSource (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "LightSource");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureMode (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.WhiteBalance (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "WhiteBalance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLengthIn35mmFilm (XmpText/3) "180"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLengthIn35mmFilm");
				Assert.IsNotNull (node);
				Assert.AreEqual ("180", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.SceneCaptureType (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "SceneCaptureType");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Contrast (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Contrast");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Saturation (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Saturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Sharpness (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Sharpness");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.SubjectDistanceRange (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "SubjectDistanceRange");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ISOSpeedRating (XmpText/3) "200"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ISOSpeedRating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("200", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MaxApertureValue (XmpText/5) "49/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MaxApertureValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("49/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureTime (XmpText/6) "10/600"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureTime");
				Assert.IsNotNull (node);
				Assert.AreEqual ("10/600", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureBiasValue (XmpText/3) "0/6"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureBiasValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0/6", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLength (XmpText/7) "1200/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1200/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.DateCreated (XmpText/24) "2010-01-02T13:45:49.000Z"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "DateCreated");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2010-01-02T13:45:49.000Z", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.Rating (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}

			//  ---------- End of XMP tests ----------

		}
Esempio n. 16
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x00FE (NewSubfileType/Long/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// Image.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010E (ImageDescription/Ascii/9) "SONY DSC"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageDescription);
				Assert.IsNotNull (entry, "Entry 0x010E missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("SONY DSC", (entry as StringIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/6) "SONY "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("SONY ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "DSLR-A700"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DSLR-A700", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/14) "DSLR-A700 v03"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DSLR-A700 v03", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2008:01:01 15:29:46"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:01:01 15:29:46", (entry as StringIFDEntry).Value);
			}

			var SubImage1_structure = (structure.GetEntry (0, (ushort) IFDEntryTag.SubIFDs) as SubIFDArrayEntry).Entries [0];
			Assert.IsNotNull (SubImage1_structure, "SubImage1 structure not found");

			// SubImage1.0x00FE (NewSubfileType/Long/1) "0"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// SubImage1.0x0100 (ImageWidth/Short/1) "4288"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4288, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0101 (ImageLength/Short/1) "2856"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2856, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0102 (BitsPerSample/Short/1) "8"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (8, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0103 (Compression/Short/1) "32767"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32767, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0106 (PhotometricInterpretation/Short/1) "32803"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (32803, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0112 (Orientation/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0115 (SamplesPerPixel/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x011A (XResolution/Rational/1) "1/72"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x011B (YResolution/Rational/1) "1/72"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Denominator);
			}
			// SubImage1.0x0128 (ResolutionUnit/Short/1) "3"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x828D (CFARepeatPatternDim/Short/2) "2 2"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x828D
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x828D);
				Assert.IsNotNull (entry, "Entry 0x828D missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 2 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0x828E (CFAPattern/Byte/4) "0 1 1 2"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x828E
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x828E);
				Assert.IsNotNull (entry, "Entry 0x828E missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 1, 2 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// SubImage1.0x7000 (0x7000/Short/1) "2"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x7000
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x7000);
				Assert.IsNotNull (entry, "Entry 0x7000 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x7001 (0x7001/Short/1) "1"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x7001
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x7001);
				Assert.IsNotNull (entry, "Entry 0x7001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x7010 (0x7010/Short/4) "8000 10400 12900 14100"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x7010
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x7010);
				Assert.IsNotNull (entry, "Entry 0x7010 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8000, 10400, 12900, 14100 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0x7011 (0x7011/Short/4) "4000 7200 10050 12075"
			{
				// TODO: Unknown IFD tag: SubImage1 / 0x7011
				var entry = SubImage1_structure.GetEntry (0, (ushort) 0x7011);
				Assert.IsNotNull (entry, "Entry 0x7011 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 4000, 7200, 10050, 12075 }, (entry as ShortArrayIFDEntry).Values);
			}
			// SubImage1.0x0111 (StripOffsets/StripOffsets/1) "688128"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// SubImage1.0x0116 (RowsPerStrip/Short/1) "2856"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2856, (entry as ShortIFDEntry).Value);
			}
			// SubImage1.0x0117 (StripByteCounts/Long/1) "12246528"
			{
				var entry = SubImage1_structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (12246528, (entry as LongIFDEntry).Value);
			}
			// Image.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "155683"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Image.0x0202 (JPEGInterchangeFormatLength/Long/1) "502499"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (502499, (entry as LongIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "322"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/1000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "80/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (80, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "250"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (250, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:01:01 15:29:46"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:01:01 15:29:46", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:01:01 15:29:46"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:01:01 15:29:46", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "8/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (8, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9203 (BrightnessValue/SRational/1) "900/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.BrightnessValue);
				Assert.IsNotNull (entry, "Entry 0x9203 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (900, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "-8/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-8, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "531/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (531, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "2500/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2500, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/24448) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;

			// Sony.0x0010 (0x0010/Undefined/368) "0 1 2 24 53 80 0 99 2 1 4 3 6 5 8 7 64 114 128 0 1 0 48 2 8 8 8 6 17 11 255 44 255 160 255 110 255 96 255 6 128 0 255 222 0 135 255 37 255 44 254 227 128 0 255 99 254 186 255 87 255 56 128 0 128 0 0 205 255 93 255 177 255 130 255 131 128 0 1 148 4 47 4 24 1 189 0 255 1 80 2 33 2 134 1 236 1 243 4 185 2 86 1 128 3 45 1 53 1 37 1 100 2 4 2 52 1 51 1 87 2 163 0 0 0 0 1 227 2 14 2 224 3 121 15 14 1 187 2 62 2 45 0 192 2 77 4 134 255 255 4 56 0 0 20 28 43 195 29 45 27 162 1 77 2 162 16 35 15 238 13 106 14 178 20 147 6 115 6 245 26 83 21 232 0 245 1 77 23 253 18 145 4 167 17 67 37 113 0 0 0 0 2 74 9 133 3 63 1 162 4 213 1 93 2 66 2 192 1 250 3 204 2 109 1 168 3 173 0 0 132 16 0 65 128 16 255 193 255 255 255 255 0 8 0 128 0 128 0 128 0 128 0 128 0 128 68 128 71 255 97 255 0 255 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 0 128 147 128 20 2 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255"
			{
				// TODO: Unknown IFD tag: Sony / 0x0010
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0010);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 2, 24, 53, 80, 0, 99, 2, 1, 4, 3, 6, 5, 8, 7, 64, 114, 128, 0, 1, 0, 48, 2, 8, 8, 8, 6, 17, 11, 255, 44, 255, 160, 255, 110, 255, 96, 255, 6, 128, 0, 255, 222, 0, 135, 255, 37, 255, 44, 254, 227, 128, 0, 255, 99, 254, 186, 255, 87, 255, 56, 128, 0, 128, 0, 0, 205, 255, 93, 255, 177, 255, 130, 255, 131, 128, 0, 1, 148, 4, 47, 4, 24, 1, 189, 0, 255, 1, 80, 2, 33, 2, 134, 1, 236, 1, 243, 4, 185, 2, 86, 1, 128, 3, 45, 1, 53, 1, 37, 1, 100, 2, 4, 2, 52, 1, 51, 1, 87, 2, 163, 0, 0, 0, 0, 1, 227, 2, 14, 2, 224, 3, 121, 15, 14, 1, 187, 2, 62, 2, 45, 0, 192, 2, 77, 4, 134, 255, 255, 4, 56, 0, 0, 20, 28, 43, 195, 29, 45, 27, 162, 1, 77, 2, 162, 16, 35, 15, 238, 13, 106, 14, 178, 20, 147, 6, 115, 6, 245, 26, 83, 21, 232, 0, 245, 1, 77, 23, 253, 18, 145, 4, 167, 17, 67, 37, 113, 0, 0, 0, 0, 2, 74, 9, 133, 3, 63, 1, 162, 4, 213, 1, 93, 2, 66, 2, 192, 1, 250, 3, 204, 2, 109, 1, 168, 3, 173, 0, 0, 132, 16, 0, 65, 128, 16, 255, 193, 255, 255, 255, 255, 0, 8, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 68, 128, 71, 255, 97, 255, 0, 255, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 0, 128, 147, 128, 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x0018 (0x0018/Undefined/4096) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Sony / 0x0018
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0018);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("7777789ce0a4d6c76f66adbca9c58ebe", parsed_hash);
				Assert.AreEqual (4096, parsed_bytes.Length);
			}
			// Sony.0x0020 (0x0020/Undefined/19148) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Sony / 0x0020
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0020);
				Assert.IsNotNull (entry, "Entry 0x0020 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("c6dfa82a9b660630e64b64e39220fb98", parsed_hash);
				Assert.AreEqual (19148, parsed_bytes.Length);
			}
			// Sony.0x0102 (0x0102/Long/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (8, (entry as LongIFDEntry).Value);
			}
			// Sony.0x0104 (0x0104/SRational/1) "0/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.FlashExposureComp);
				Assert.IsNotNull (entry, "Entry 0x0104 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Sony.0x0105 (0x0105/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.Teleconverter);
				Assert.IsNotNull (entry, "Entry 0x0105 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0x0112 (0x0112/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.WhiteBalanceFineTune);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0x0114 (0x0114/Undefined/280) "0 129 0 56 0 0 0 96 0 7 0 2 0 0 0 55 0 0 0 0 0 0 0 0 0 55 0 0 0 0 0 2 0 1 0 0 0 1 0 4 0 128 0 1 0 58 0 0 0 0 0 3 0 1 0 0 0 10 0 9 0 9 0 10 0 10 0 10 0 10 0 0 0 80 0 56 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 80 0 56 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 0 0 0 0 0 1 0 100 0 112 0 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 1 0 0 0 0 0 6 0 94 0 0 0 1 0 1 0 1 0 35 0 6 0 33 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 2 0 0 0 1 0 1 0 0 0 1 0 0 0 53 0 23 0 8 0 0 0 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0114 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 129, 0, 56, 0, 0, 0, 96, 0, 7, 0, 2, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 1, 0, 4, 0, 128, 0, 1, 0, 58, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 10, 0, 9, 0, 9, 0, 10, 0, 10, 0, 10, 0, 10, 0, 0, 0, 80, 0, 56, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 80, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 100, 0, 112, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 1, 0, 0, 0, 0, 0, 6, 0, 94, 0, 0, 0, 1, 0, 1, 0, 1, 0, 35, 0, 6, 0, 33, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 53, 0, 23, 0, 8, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x0115 (0x0115/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0x2000 (0x2000/Undefined/1) "0"
			{
				// TODO: Unknown IFD tag: Sony / 0x2000
				var entry = makernote_structure.GetEntry (0, (ushort) 0x2000);
				Assert.IsNotNull (entry, "Entry 0x2000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x2002 (0x2002/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Sony / 0x2002
				var entry = makernote_structure.GetEntry (0, (ushort) 0x2002);
				Assert.IsNotNull (entry, "Entry 0x2002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0x2003 (0x2003/Ascii/256) ""
			{
				// TODO: Unknown IFD tag: Sony / 0x2003
				var entry = makernote_structure.GetEntry (0, (ushort) 0x2003);
				Assert.IsNotNull (entry, "Entry 0x2003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Sony.0xB000 (0xb000/Byte/4) "3 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.FileFormat);
				Assert.IsNotNull (entry, "Entry 0xB000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 3, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0xB001 (0xb001/Short/1) "258"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.SonyModelID);
				Assert.IsNotNull (entry, "Entry 0xB001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (258, (entry as ShortIFDEntry).Value);
			}
			// Sony.0xB020 (0xb020/Ascii/16) "Standard"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ColorReproduction);
				Assert.IsNotNull (entry, "Entry 0xB020 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Standard", (entry as StringIFDEntry).Value);
			}
			// Sony.0xB021 (0xb021/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ColorTemperature);
				Assert.IsNotNull (entry, "Entry 0xB021 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB022 (0xb022/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ColorCompensationFilter);
				Assert.IsNotNull (entry, "Entry 0xB022 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB023 (0xb023/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.SceneMode);
				Assert.IsNotNull (entry, "Entry 0xB023 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB024 (0xb024/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ZoneMatching);
				Assert.IsNotNull (entry, "Entry 0xB024 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB025 (0xb025/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.DynamicRangeOptimizer);
				Assert.IsNotNull (entry, "Entry 0xB025 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB026 (0xb026/Long/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ImageStabilization);
				Assert.IsNotNull (entry, "Entry 0xB026 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB027 (0xb027/Long/1) "50"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.LensID);
				Assert.IsNotNull (entry, "Entry 0xB027 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (50, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB029 (0xb029/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.ColorMode);
				Assert.IsNotNull (entry, "Entry 0xB029 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Sony.0xB02A (0xb02a/Byte/8) "1 0 24 2 80 53 99 0"
			{
				// TODO: Unknown IFD tag: Sony / 0xB02A
				var entry = makernote_structure.GetEntry (0, (ushort) 0xB02A);
				Assert.IsNotNull (entry, "Entry 0xB02A missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 0, 24, 2, 80, 53, 99, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0xB02B (0xb02b/Long/2) "2848 4272"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.FullImageSize);
				Assert.IsNotNull (entry, "Entry 0xB02B missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 2848, 4272 }, (entry as LongArrayIFDEntry).Values);
			}
			// Sony.0xB02C (0xb02c/Long/2) "1080 1616"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) SonyMakerNoteEntryTag.PreviewImageSize);
				Assert.IsNotNull (entry, "Entry 0xB02C missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 1080, 1616 }, (entry as LongArrayIFDEntry).Values);
			}
			// Photo.0x9286 (UserComment/UserComment/64) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "4288"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4288, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "2856"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2856, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "25440"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "0/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "375"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (375, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0xC634 (DNGPrivateData/Byte/4) "112 137 0 0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DNGPrivateData);
				Assert.IsNotNull (entry, "Entry 0xC634 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 112, 137, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x00FE (NewSubfileType/Long/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x010F (Make/Ascii/6) "SONY "
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 1");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("SONY ", (entry as StringIFDEntry).Value);
			}
			// Thumbnail.0x0110 (Model/Ascii/10) "DSLR-A700"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 1");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DSLR-A700", (entry as StringIFDEntry).Value);
			}
			// Thumbnail.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0132 (DateTime/Ascii/20) "2008:01:01 15:29:46"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 1");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:01:01 15:29:46", (entry as StringIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "32770"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "2414"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2414, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/23) "Canon EOS 400D DIGITAL"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "150/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (150, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "150/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (150, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/17) "Bibble 5 Pro 5.0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Bibble 5 Pro 5.0", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x010F (0x010f/Ascii/6) "Canon"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0110 (0x0110/Ascii/23) "Canon EOS 400D DIGITAL"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0132 (0x0132/Ascii/20) "2010:02:03 10:51:35"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:03 10:51:35", (entry as StringIFDEntry).Value);
			}
			// Photo.0x829A (ExposureTime/Rational/1) "1/200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (200, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "5/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (5, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:01:06 19:50:44"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:06 19:50:44", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:01:06 19:50:44"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:06 19:50:44", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/Rational/1) "500948/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (500948, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "304340/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (304340, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "85/32"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (85, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (32, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "9"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (9, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "21/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (21, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9290 (SubSecTime/Ascii/4) "976"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("976", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.tiff.Model (XmpText/22) "Canon EOS 400D DIGITAL"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Model");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Canon EOS 400D DIGITAL", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Make (XmpText/5) "Canon"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Make");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Canon", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageWidth (XmpText/4) "3888"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageWidth");
				Assert.IsNotNull (node);
				Assert.AreEqual ("3888", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageLength (XmpText/4) "2592"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2592", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.FNumber (XmpText/5) "50/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "FNumber");
				Assert.IsNotNull (node);
				Assert.AreEqual ("50/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.XResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "XResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.YResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "YResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ResolutionUnit (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ResolutionUnit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureProgram (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureProgram");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MeteringMode (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MeteringMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureMode (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.WhiteBalance (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "WhiteBalance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.SceneCaptureType (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "SceneCaptureType");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ISOSpeedRating (XmpText/3) "100"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ISOSpeedRating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("100", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash (XmpText/1) "9"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				Assert.AreEqual ("9", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ApertureValue (XmpText/12) "304340/65536"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ApertureValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("304340/65536", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ShutterSpeedValue (XmpText/12) "500948/65536"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ShutterSpeedValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("500948/65536", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureTime (XmpText/5) "1/200"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureTime");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1/200", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureBiasValue (XmpText/3) "0/3"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureBiasValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0/3", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLength (XmpText/4) "21/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("21/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.DateCreated (XmpText/24) "2010-01-06T19:50:44.000Z"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "DateCreated");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2010-01-06T19:50:44.000Z", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.Rating (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}

			//  ---------- End of XMP tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);

			Assert.AreEqual (64, file.Properties.PhotoWidth);
			Assert.AreEqual (40, file.Properties.PhotoHeight);
			Assert.AreEqual (98, file.Properties.PhotoQuality);

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/10) "Panasonic"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Panasonic", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/9) "DMC-FX35"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DMC-FX35", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/11) "GIMP 2.6.6"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("GIMP 2.6.6", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2009:10:27 19:45:56"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:10:27 19:45:56", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "422"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/800"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (800, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "28/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (28, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:06:26 12:58:30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:06:26 12:58:30", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2009:06:26 14:58:30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:06:26 14:58:30", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1, 2, 3, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "30/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (30, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "24"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (24, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "44/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (44, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/8964) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Panasonic, makernote.MakernoteType);

			// Panasonic.0x0001 (Quality/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0002 (FirmwareVersion/Undefined/4) "0 1 0 6 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 0, 6 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0003 (WhiteBalance/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0007 (FocusMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FocusMode);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x000F (SpotMode/Byte/2) "16 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.AFMode);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var bytes = new byte [] { 16, 0 };
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x001A (ImageStabilizer/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ImageStabilization);
				Assert.IsNotNull (entry, "Entry 0x001A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x001C (Macro/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Macro);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x001F (ShootingMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x001F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0020 (Audio/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Audio);
				Assert.IsNotNull (entry, "Entry 0x0020 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0021 (DataDump/Undefined/8200) "0 0 250 175 0 0 168 175 172 3 170 175 55 10 200 175 110 1 216 175 47 1 182 175 128 0 184 175 0 0 206 175 141 0 210 175 20 0 208 175 40 0 172 175 8 1 176 175 81 0 174 175 122 0 212 175 58 0 244 175 30 0 242 175 45 0 226 175 0 0 228 175 1 0 224 175 55 10 230 175 1 0 232 175 1 0 234 175 0 0 236 175 0 0 246 175 0 0 218 175 0 0 214 175 0 0 240 175 0 0 4 6 8 6 10 6 55 10 200 6 4 4 154 175 0 0 156 175 0 0 158 175 0 0 240 255 83 84 114 0 164 6 0 0 166 6 0 0 168 6 0 0 170 6 0 0 172 6 0 0 250 7 0 0 174 6 0 0 176 6 0 0 182 6 0 0 184 6 0 0 186 6 0 0 244 7 0 0 246 7 0 0 178 6 0 0 180 6 0 0 176 4 0 0 178 4 0 0 96 169 0 0 98 169 0 0 100 169 0 0 104 169 0 0 102 169 0 0 106 169 0 0 120 169 0 0 122 169 0 0 124 169 0 0 126 169 0 0 240 255 65 69 38 1 32 5 152 2 34 5 80 2 238 7 152 2 36 5 133 5 16 5 147 4 222 6 193 4 38 5 196 0 192 6 0 0 40 5 182 0 24 5 44 1 58 5 7 0 197 25 0 0 80 5 9 2 82 5 124 3 202 6 63 0 0 5 3 0 54 5 0 0 66 5 0 0 8 5 0 0 2 5 0 0 10 5 0 0 4 5 0 0 64 5 0 0 4 7 0 0 12 7 0 0 6 7 0 0 8 7 0 0 10 7 0 0 242 6 0 0 246 6 255 255 244 6 0 0 248 6 255 255 14 5 168 4 42 5 6 0 44 5 44 1 50 5 44 1 250 6 44 1 252 6 0 0 0 7 0 1 59 5 4 0 62 5 0 0 198 25 137 1 200 25 31 3 48 5 128 1 28 5 103 0 232 6 120 47 26 5 214 20 239 6 1 0 240 6 0 0 254 6 0 0 46 5 0 0 1 5 0 0 96 5 0 0 52 5 0 0 14 103 151 2 56 5 0 0 14 7 1 0 16 7 0 0 18 7 102 0 20 7 1 0 22 7 1 0 23 7 0 0 24 7 0 0 72 5 0 0 74 5 0 0 68 5 0 0 70 5 0 0 20 5 83 1 22 5 39 0 60 5 34 1 88 5 18 2 90 5 64 0 240 255 87 66 234 0 0 4 118 6 2 4 103 7 92 4 30 4 4 4 238 0 6 4 6 1 96 4 193 4 26 4 69 0 94 4 74 0 95 4 10 0 18 4 238 0 20 4 6 1 22 4 104 1 24 4 74 1 204 4 159 4 206 4 145 9 208 4 32 7 210 4 236 6 8 4 187 0 10 4 231 0 180 4 226 1 182 4 0 0 64 4 238 0 48 4 95 0 56 4 119 0 50 4 127 0 58 4 138 0 52 4 230 255 60 4 9 0 54 4 17 0 62 4 40 0 76 4 231 0 78 4 6 1 192 4 231 0 194 4 6 1 234 4 0 0 128 5 74 0 130 5 115 0 131 5 131 0 140 5 0 0 142 5 133 0 143 5 141 0 82 4 207 0 84 4 242 0 86 4 207 0 88 4 242 0 212 4 226 0 214 4 8 1 216 4 207 0 218 4 242 0 240 4 125 4 242 4 15 9 244 4 167 0 246 4 191 0 248 4 0 0 250 4 0 0 252 4 0 0 254 4 0 0 240 255 89 67 230 0 78 170 5 0 80 170 5 0 82 170 5 0 84 170 5 0 68 170 136 136 70 170 221 221 72 170 136 136 74 170 0 0 76 170 0 0 56 170 48 0 58 170 48 0 60 170 48 0 62 170 48 0 46 170 136 136 48 170 204 136 50 170 119 102 52 170 34 17 54 170 0 0 130 4 0 0 128 4 9 0 132 4 0 0 132 170 96 0 96 170 138 138 98 170 138 138 100 170 88 113 102 170 88 113 104 170 93 93 106 170 2 0 108 170 0 0 110 170 0 0 134 170 0 0 136 170 0 0 138 170 8 0 140 170 8 0 142 170 0 0 144 170 0 0 146 170 31 0 148 170 31 0 150 170 0 0 152 170 0 0 160 170 240 0 162 170 16 0 164 170 232 0 166 170 0 0 168 170 10 0 88 170 1 0 90 170 24 0 92 170 24 0 94 170 32 0 154 170 0 0 156 170 0 0 192 170 255 255 194 170 255 255 196 170 255 255 198 170 255 255 200 170 255 255 240 255 67 77 14 0 252 5 0 48 4 172 0 0 240 255 68 83 46 0 0 175 0 0 2 175 0 0 10 175 0 0 4 175 0 0 6 175 0 0 8 175 0 0 12 175 0 0 14 175 0 0 16 175 0 0 18 175 0 0 240 255 73 83 202 0 136 174 0 0 180 174 209 0 182 174 237 0 184 174 154 1 186 174 154 1 128 174 61 4 130 174 22 4 132 174 231 3 134 174 231 3 0 174 56 4 2 174 54 4 4 174 52 4 6 174 52 4 8 174 48 4 10 174 48 4 12 174 50 4 14 174 44 4 16 174 40 4 18 174 50 4 20 174 50 4 22 174 46 4 24 174 48 4 26 174 50 4 28 174 48 4 30 174 40 4 32 174 24 4 34 174 30 4 36 174 24 4 38 174 30 4 40 174 26 4 42 174 32 4 44 174 28 4 46 174 22 4 48 174 6 4 50 174 24 4 52 174 14 4 54 174 18 4 56 174 14 4 58 174 2 4 60 174 10 4 62 174 0 4 64 174 29 2 66 174 0 0 68 174 0 0 70 174 0 0 96 174 254 1 98 174 0 0 100 174 0 0 102 174 0 0 240 255 70 68 166 0 96 172 0 0 98 172 0 0 128 172 0 0 130 172 0 0 132 172 0 0 134 172 0 0 136 172 0 0 138 172 0 0 140 172 0 0 142 172 0 0 144 172 0 0 146 172 0 0 148 172 0 0 150 172 0 0 152 172 0 0 154 172 0 0 156 172 0 0 158 172 0 0 64 172 0 0 66 172 0 0 68 172 0 0 70 172 0 0 72 172 0 0 74 172 0 0 76 172 0 0 78 172 0 0 80 172 0 0 82 172 0 0 84 172 0 0 86 172 0 0 88 172 0 0 90 172 0 0 92 172 0 0 94 172 0 0 102 5 0 0 110 5 0 0 112 5 0 0 114 5 0 0 108 5 0 0 100 5 0 0 240 255 73 65 58 0 160 169 255 255 162 169 255 255 164 169 255 255 166 169 255 255 168 169 255 255 170 169 255 255 172 169 255 255 174 169 255 255 128 169 0 0 130 169 0 0 132 169 0 0 136 169 0 0 134 169 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 69 66 77 248 1 65 2 103 2 173 2 253 2 179 2 159 2 130 2 56 2 12 2 198 1 151 1 82 1 26 1 246 0 174 0 78 2 155 2 169 2 221 2 94 4 4 3 134 2 80 2 22 2 239 1 194 1 144 1 92 1 39 1 250 0 197 0 147 2 180 2 96 4 149 4 162 4 199 5 43 4 101 3 57 2 16 4 30 3 161 2 51 2 197 1 238 0 194 0 186 2 13 3 143 4 2 7 169 6 105 6 153 6 195 3 47 2 80 4 253 2 48 1 4 1 2 1 175 0 169 0 229 2 51 3 226 4 171 7 37 7 202 6 117 6 6 3 212 1 105 2 118 1 39 1 185 1 105 1 132 0 125 0 1 3 54 3 189 6 139 7 236 6 188 5 180 3 78 1 15 1 16 1 148 1 80 2 216 1 91 1 99 0 87 0 12 3 90 3 151 7 126 7 106 7 142 3 170 0 244 0 102 0 14 1 181 3 136 3 90 2 207 0 67 0 69 0 6 3 106 3 202 7 142 7 85 7 5 5 157 0 182 0 134 0 26 1 183 2 62 3 8 1 245 0 76 0 57 0 249 2 81 3 66 3 242 2 160 2 29 2 6 1 243 0 139 0 89 1 43 2 16 1 150 0 143 0 52 0 53 0 193 2 41 3 148 4 4 4 178 3 154 2 7 3 104 3 156 0 179 0 6 2 55 2 60 2 83 2 111 0 52 0 175 2 15 3 143 5 135 5 37 3 243 3 178 4 182 2 191 0 164 0 132 1 109 1 156 1 58 1 90 0 50 0 137 2 221 2 58 5 225 4 77 4 208 4 237 4 246 1 183 0 122 0 166 1 173 1 133 1 59 1 79 0 49 0 91 2 156 2 188 4 245 3 33 5 39 5 36 5 196 2 200 0 176 0 161 1 116 2 47 2 23 2 102 0 91 0 33 2 108 2 8 4 218 2 196 4 122 4 172 4 160 2 138 1 186 0 196 1 253 2 202 2 112 2 168 0 148 0 252 1 0 2 220 2 125 2 200 3 118 3 191 3 74 2 127 2 126 0 11 2 134 2 64 2 231 1 207 0 170 0 172 1 222 1 249 1 237 1 16 2 8 2 207 1 179 1 156 1 88 1 65 1 69 1 32 1 0 1 214 0 135 0 80 82 83 84 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 70 67 67 86 8 0 1 0 55 10 55 10 242 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 12 70 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 136 7 30 1 112 2 163 1 25 1 218 1 46 1 214 1 239 0 0 0 177 0 64 2 254 5 0 2 81 1 140 2 124 1 151 2 0 2 0 0 73 1 187 1 0 0 0 0 39 0 10 0 0 0 0 0 8 8 62 1 238 2 41 2 77 1 102 2 104 1 107 2 249 0 0 0 194 0 144 2 245 6 75 2 122 1 228 2 170 1 206 2 78 2 0 0 117 1 236 1 0 0 0 0 36 0 7 0 0 0 0 0 136 8 172 1 92 4 199 2 154 1 234 2 156 1 231 2 33 1 0 0 240 0 246 2 12 8 134 2 162 1 33 3 209 1 252 2 131 2 0 0 171 1 36 2 0 0 0 0 37 0 10 0 0 0 0 0 8 9 103 2 149 6 64 3 244 1 83 3 212 1 51 3 82 1 0 0 70 1 94 3 9 9 166 2 189 1 69 3 222 1 32 3 160 2 0 0 222 1 79 2 0 0 0 0 38 0 9 0 0 0 0 0 136 9 22 3 89 8 56 3 3 2 92 3 228 1 60 3 119 1 0 0 170 1 178 3 212 9 174 2 198 1 70 3 233 1 39 3 173 2 0 0 8 2 110 2 0 0 0 0 38 0 9 0 0 0 0 0 8 10 172 3 41 9 220 2 232 1 233 2 184 1 232 2 115 1 0 0 8 2 232 3 51 10 138 2 184 1 22 3 211 1 12 3 168 2 0 0 41 2 136 2 0 0 0 0 38 0 9 0 0 0 0 0 136 10 139 3 2 8 90 2 147 1 102 2 122 1 96 2 71 1 0 0 249 1 219 3 226 9 72 2 153 1 205 2 185 1 214 2 139 2 0 0 36 2 136 2 0 0 0 0 40 0 10 0 0 0 0 0 8 11 214 2 5 6 205 1 87 1 222 1 73 1 209 1 35 1 0 0 148 1 156 3 34 9 0 2 105 1 113 2 140 1 132 2 101 2 0 0 8 2 104 2 0 0 0 0 40 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 87 66 67 90 3 12 3 12 12 12 12 12 12 12 12 12 12 12 12 12 3 12 12 12 9 1 12 12 12 12 12 12 12 12 12 12 12 12 3 1 9 1 1 10 9 3 1 9 9 9 12 12 12 12 3 1 1 1 1 9 9 1 9 14 14 0 10 12 12 12 3 1 1 1 9 9 14 9 9 10 3 12 12 3 12 12 1 1 1 9 9 14 0 10 4 9 10 12 10 3 12 12 1 1 1 9 0 0 0 10 10 9 9 3 10 4 12 12 1 1 1 9 0 0 0 4 4 9 4 4 10 4 12 12 9 14 14 14 14 0 0 4 11 4 10 10 10 4 12 12 10 10 10 9 9 10 0 0 4 11 4 12 10 4 12 12 1 1 11 3 9 10 0 0 4 4 4 4 12 4 12 12 1 1 3 3 10 10 0 0 4 4 10 3 3 4 12 12 1 1 1 1 1 9 0 10 10 4 11 12 12 4 12 12 1 1 1 1 1 9 10 14 10 1 3 3 12 3 12 12 10 10 1 1 1 9 10 14 10 1 1 1 12 12 12 12 12 12 12 3 3 10 12 10 10 3 3 12 12 12 66 77 72 76 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 70 49 53 48 56 48 50 49 57 48 54 48 49 0 48 44 57 57 57 57 58 57 57 58 57 57 32 48 48 58 48 48 58 48 48 0 127 0 0 0 0 1 0 0 127 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.DataDump);
				Assert.IsNotNull (entry, "Entry 0x0021 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 250, 175, 0, 0, 168, 175, 172, 3, 170, 175, 55, 10, 200, 175, 110, 1, 216, 175, 47, 1, 182, 175, 128, 0, 184, 175, 0, 0, 206, 175, 141, 0, 210, 175, 20, 0, 208, 175, 40, 0, 172, 175, 8, 1, 176, 175, 81, 0, 174, 175, 122, 0, 212, 175, 58, 0, 244, 175, 30, 0, 242, 175, 45, 0, 226, 175, 0, 0, 228, 175, 1, 0, 224, 175, 55, 10, 230, 175, 1, 0, 232, 175, 1, 0, 234, 175, 0, 0, 236, 175, 0, 0, 246, 175, 0, 0, 218, 175, 0, 0, 214, 175, 0, 0, 240, 175, 0, 0, 4, 6, 8, 6, 10, 6, 55, 10, 200, 6, 4, 4, 154, 175, 0, 0, 156, 175, 0, 0, 158, 175, 0, 0, 240, 255, 83, 84, 114, 0, 164, 6, 0, 0, 166, 6, 0, 0, 168, 6, 0, 0, 170, 6, 0, 0, 172, 6, 0, 0, 250, 7, 0, 0, 174, 6, 0, 0, 176, 6, 0, 0, 182, 6, 0, 0, 184, 6, 0, 0, 186, 6, 0, 0, 244, 7, 0, 0, 246, 7, 0, 0, 178, 6, 0, 0, 180, 6, 0, 0, 176, 4, 0, 0, 178, 4, 0, 0, 96, 169, 0, 0, 98, 169, 0, 0, 100, 169, 0, 0, 104, 169, 0, 0, 102, 169, 0, 0, 106, 169, 0, 0, 120, 169, 0, 0, 122, 169, 0, 0, 124, 169, 0, 0, 126, 169, 0, 0, 240, 255, 65, 69, 38, 1, 32, 5, 152, 2, 34, 5, 80, 2, 238, 7, 152, 2, 36, 5, 133, 5, 16, 5, 147, 4, 222, 6, 193, 4, 38, 5, 196, 0, 192, 6, 0, 0, 40, 5, 182, 0, 24, 5, 44, 1, 58, 5, 7, 0, 197, 25, 0, 0, 80, 5, 9, 2, 82, 5, 124, 3, 202, 6, 63, 0, 0, 5, 3, 0, 54, 5, 0, 0, 66, 5, 0, 0, 8, 5, 0, 0, 2, 5, 0, 0, 10, 5, 0, 0, 4, 5, 0, 0, 64, 5, 0, 0, 4, 7, 0, 0, 12, 7, 0, 0, 6, 7, 0, 0, 8, 7, 0, 0, 10, 7, 0, 0, 242, 6, 0, 0, 246, 6, 255, 255, 244, 6, 0, 0, 248, 6, 255, 255, 14, 5, 168, 4, 42, 5, 6, 0, 44, 5, 44, 1, 50, 5, 44, 1, 250, 6, 44, 1, 252, 6, 0, 0, 0, 7, 0, 1, 59, 5, 4, 0, 62, 5, 0, 0, 198, 25, 137, 1, 200, 25, 31, 3, 48, 5, 128, 1, 28, 5, 103, 0, 232, 6, 120, 47, 26, 5, 214, 20, 239, 6, 1, 0, 240, 6, 0, 0, 254, 6, 0, 0, 46, 5, 0, 0, 1, 5, 0, 0, 96, 5, 0, 0, 52, 5, 0, 0, 14, 103, 151, 2, 56, 5, 0, 0, 14, 7, 1, 0, 16, 7, 0, 0, 18, 7, 102, 0, 20, 7, 1, 0, 22, 7, 1, 0, 23, 7, 0, 0, 24, 7, 0, 0, 72, 5, 0, 0, 74, 5, 0, 0, 68, 5, 0, 0, 70, 5, 0, 0, 20, 5, 83, 1, 22, 5, 39, 0, 60, 5, 34, 1, 88, 5, 18, 2, 90, 5, 64, 0, 240, 255, 87, 66, 234, 0, 0, 4, 118, 6, 2, 4, 103, 7, 92, 4, 30, 4, 4, 4, 238, 0, 6, 4, 6, 1, 96, 4, 193, 4, 26, 4, 69, 0, 94, 4, 74, 0, 95, 4, 10, 0, 18, 4, 238, 0, 20, 4, 6, 1, 22, 4, 104, 1, 24, 4, 74, 1, 204, 4, 159, 4, 206, 4, 145, 9, 208, 4, 32, 7, 210, 4, 236, 6, 8, 4, 187, 0, 10, 4, 231, 0, 180, 4, 226, 1, 182, 4, 0, 0, 64, 4, 238, 0, 48, 4, 95, 0, 56, 4, 119, 0, 50, 4, 127, 0, 58, 4, 138, 0, 52, 4, 230, 255, 60, 4, 9, 0, 54, 4, 17, 0, 62, 4, 40, 0, 76, 4, 231, 0, 78, 4, 6, 1, 192, 4, 231, 0, 194, 4, 6, 1, 234, 4, 0, 0, 128, 5, 74, 0, 130, 5, 115, 0, 131, 5, 131, 0, 140, 5, 0, 0, 142, 5, 133, 0, 143, 5, 141, 0, 82, 4, 207, 0, 84, 4, 242, 0, 86, 4, 207, 0, 88, 4, 242, 0, 212, 4, 226, 0, 214, 4, 8, 1, 216, 4, 207, 0, 218, 4, 242, 0, 240, 4, 125, 4, 242, 4, 15, 9, 244, 4, 167, 0, 246, 4, 191, 0, 248, 4, 0, 0, 250, 4, 0, 0, 252, 4, 0, 0, 254, 4, 0, 0, 240, 255, 89, 67, 230, 0, 78, 170, 5, 0, 80, 170, 5, 0, 82, 170, 5, 0, 84, 170, 5, 0, 68, 170, 136, 136, 70, 170, 221, 221, 72, 170, 136, 136, 74, 170, 0, 0, 76, 170, 0, 0, 56, 170, 48, 0, 58, 170, 48, 0, 60, 170, 48, 0, 62, 170, 48, 0, 46, 170, 136, 136, 48, 170, 204, 136, 50, 170, 119, 102, 52, 170, 34, 17, 54, 170, 0, 0, 130, 4, 0, 0, 128, 4, 9, 0, 132, 4, 0, 0, 132, 170, 96, 0, 96, 170, 138, 138, 98, 170, 138, 138, 100, 170, 88, 113, 102, 170, 88, 113, 104, 170, 93, 93, 106, 170, 2, 0, 108, 170, 0, 0, 110, 170, 0, 0, 134, 170, 0, 0, 136, 170, 0, 0, 138, 170, 8, 0, 140, 170, 8, 0, 142, 170, 0, 0, 144, 170, 0, 0, 146, 170, 31, 0, 148, 170, 31, 0, 150, 170, 0, 0, 152, 170, 0, 0, 160, 170, 240, 0, 162, 170, 16, 0, 164, 170, 232, 0, 166, 170, 0, 0, 168, 170, 10, 0, 88, 170, 1, 0, 90, 170, 24, 0, 92, 170, 24, 0, 94, 170, 32, 0, 154, 170, 0, 0, 156, 170, 0, 0, 192, 170, 255, 255, 194, 170, 255, 255, 196, 170, 255, 255, 198, 170, 255, 255, 200, 170, 255, 255, 240, 255, 67, 77, 14, 0, 252, 5, 0, 48, 4, 172, 0, 0, 240, 255, 68, 83, 46, 0, 0, 175, 0, 0, 2, 175, 0, 0, 10, 175, 0, 0, 4, 175, 0, 0, 6, 175, 0, 0, 8, 175, 0, 0, 12, 175, 0, 0, 14, 175, 0, 0, 16, 175, 0, 0, 18, 175, 0, 0, 240, 255, 73, 83, 202, 0, 136, 174, 0, 0, 180, 174, 209, 0, 182, 174, 237, 0, 184, 174, 154, 1, 186, 174, 154, 1, 128, 174, 61, 4, 130, 174, 22, 4, 132, 174, 231, 3, 134, 174, 231, 3, 0, 174, 56, 4, 2, 174, 54, 4, 4, 174, 52, 4, 6, 174, 52, 4, 8, 174, 48, 4, 10, 174, 48, 4, 12, 174, 50, 4, 14, 174, 44, 4, 16, 174, 40, 4, 18, 174, 50, 4, 20, 174, 50, 4, 22, 174, 46, 4, 24, 174, 48, 4, 26, 174, 50, 4, 28, 174, 48, 4, 30, 174, 40, 4, 32, 174, 24, 4, 34, 174, 30, 4, 36, 174, 24, 4, 38, 174, 30, 4, 40, 174, 26, 4, 42, 174, 32, 4, 44, 174, 28, 4, 46, 174, 22, 4, 48, 174, 6, 4, 50, 174, 24, 4, 52, 174, 14, 4, 54, 174, 18, 4, 56, 174, 14, 4, 58, 174, 2, 4, 60, 174, 10, 4, 62, 174, 0, 4, 64, 174, 29, 2, 66, 174, 0, 0, 68, 174, 0, 0, 70, 174, 0, 0, 96, 174, 254, 1, 98, 174, 0, 0, 100, 174, 0, 0, 102, 174, 0, 0, 240, 255, 70, 68, 166, 0, 96, 172, 0, 0, 98, 172, 0, 0, 128, 172, 0, 0, 130, 172, 0, 0, 132, 172, 0, 0, 134, 172, 0, 0, 136, 172, 0, 0, 138, 172, 0, 0, 140, 172, 0, 0, 142, 172, 0, 0, 144, 172, 0, 0, 146, 172, 0, 0, 148, 172, 0, 0, 150, 172, 0, 0, 152, 172, 0, 0, 154, 172, 0, 0, 156, 172, 0, 0, 158, 172, 0, 0, 64, 172, 0, 0, 66, 172, 0, 0, 68, 172, 0, 0, 70, 172, 0, 0, 72, 172, 0, 0, 74, 172, 0, 0, 76, 172, 0, 0, 78, 172, 0, 0, 80, 172, 0, 0, 82, 172, 0, 0, 84, 172, 0, 0, 86, 172, 0, 0, 88, 172, 0, 0, 90, 172, 0, 0, 92, 172, 0, 0, 94, 172, 0, 0, 102, 5, 0, 0, 110, 5, 0, 0, 112, 5, 0, 0, 114, 5, 0, 0, 108, 5, 0, 0, 100, 5, 0, 0, 240, 255, 73, 65, 58, 0, 160, 169, 255, 255, 162, 169, 255, 255, 164, 169, 255, 255, 166, 169, 255, 255, 168, 169, 255, 255, 170, 169, 255, 255, 172, 169, 255, 255, 174, 169, 255, 255, 128, 169, 0, 0, 130, 169, 0, 0, 132, 169, 0, 0, 136, 169, 0, 0, 134, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 69, 66, 77, 248, 1, 65, 2, 103, 2, 173, 2, 253, 2, 179, 2, 159, 2, 130, 2, 56, 2, 12, 2, 198, 1, 151, 1, 82, 1, 26, 1, 246, 0, 174, 0, 78, 2, 155, 2, 169, 2, 221, 2, 94, 4, 4, 3, 134, 2, 80, 2, 22, 2, 239, 1, 194, 1, 144, 1, 92, 1, 39, 1, 250, 0, 197, 0, 147, 2, 180, 2, 96, 4, 149, 4, 162, 4, 199, 5, 43, 4, 101, 3, 57, 2, 16, 4, 30, 3, 161, 2, 51, 2, 197, 1, 238, 0, 194, 0, 186, 2, 13, 3, 143, 4, 2, 7, 169, 6, 105, 6, 153, 6, 195, 3, 47, 2, 80, 4, 253, 2, 48, 1, 4, 1, 2, 1, 175, 0, 169, 0, 229, 2, 51, 3, 226, 4, 171, 7, 37, 7, 202, 6, 117, 6, 6, 3, 212, 1, 105, 2, 118, 1, 39, 1, 185, 1, 105, 1, 132, 0, 125, 0, 1, 3, 54, 3, 189, 6, 139, 7, 236, 6, 188, 5, 180, 3, 78, 1, 15, 1, 16, 1, 148, 1, 80, 2, 216, 1, 91, 1, 99, 0, 87, 0, 12, 3, 90, 3, 151, 7, 126, 7, 106, 7, 142, 3, 170, 0, 244, 0, 102, 0, 14, 1, 181, 3, 136, 3, 90, 2, 207, 0, 67, 0, 69, 0, 6, 3, 106, 3, 202, 7, 142, 7, 85, 7, 5, 5, 157, 0, 182, 0, 134, 0, 26, 1, 183, 2, 62, 3, 8, 1, 245, 0, 76, 0, 57, 0, 249, 2, 81, 3, 66, 3, 242, 2, 160, 2, 29, 2, 6, 1, 243, 0, 139, 0, 89, 1, 43, 2, 16, 1, 150, 0, 143, 0, 52, 0, 53, 0, 193, 2, 41, 3, 148, 4, 4, 4, 178, 3, 154, 2, 7, 3, 104, 3, 156, 0, 179, 0, 6, 2, 55, 2, 60, 2, 83, 2, 111, 0, 52, 0, 175, 2, 15, 3, 143, 5, 135, 5, 37, 3, 243, 3, 178, 4, 182, 2, 191, 0, 164, 0, 132, 1, 109, 1, 156, 1, 58, 1, 90, 0, 50, 0, 137, 2, 221, 2, 58, 5, 225, 4, 77, 4, 208, 4, 237, 4, 246, 1, 183, 0, 122, 0, 166, 1, 173, 1, 133, 1, 59, 1, 79, 0, 49, 0, 91, 2, 156, 2, 188, 4, 245, 3, 33, 5, 39, 5, 36, 5, 196, 2, 200, 0, 176, 0, 161, 1, 116, 2, 47, 2, 23, 2, 102, 0, 91, 0, 33, 2, 108, 2, 8, 4, 218, 2, 196, 4, 122, 4, 172, 4, 160, 2, 138, 1, 186, 0, 196, 1, 253, 2, 202, 2, 112, 2, 168, 0, 148, 0, 252, 1, 0, 2, 220, 2, 125, 2, 200, 3, 118, 3, 191, 3, 74, 2, 127, 2, 126, 0, 11, 2, 134, 2, 64, 2, 231, 1, 207, 0, 170, 0, 172, 1, 222, 1, 249, 1, 237, 1, 16, 2, 8, 2, 207, 1, 179, 1, 156, 1, 88, 1, 65, 1, 69, 1, 32, 1, 0, 1, 214, 0, 135, 0, 80, 82, 83, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 67, 67, 86, 8, 0, 1, 0, 55, 10, 55, 10, 242, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 12, 70, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 136, 7, 30, 1, 112, 2, 163, 1, 25, 1, 218, 1, 46, 1, 214, 1, 239, 0, 0, 0, 177, 0, 64, 2, 254, 5, 0, 2, 81, 1, 140, 2, 124, 1, 151, 2, 0, 2, 0, 0, 73, 1, 187, 1, 0, 0, 0, 0, 39, 0, 10, 0, 0, 0, 0, 0, 8, 8, 62, 1, 238, 2, 41, 2, 77, 1, 102, 2, 104, 1, 107, 2, 249, 0, 0, 0, 194, 0, 144, 2, 245, 6, 75, 2, 122, 1, 228, 2, 170, 1, 206, 2, 78, 2, 0, 0, 117, 1, 236, 1, 0, 0, 0, 0, 36, 0, 7, 0, 0, 0, 0, 0, 136, 8, 172, 1, 92, 4, 199, 2, 154, 1, 234, 2, 156, 1, 231, 2, 33, 1, 0, 0, 240, 0, 246, 2, 12, 8, 134, 2, 162, 1, 33, 3, 209, 1, 252, 2, 131, 2, 0, 0, 171, 1, 36, 2, 0, 0, 0, 0, 37, 0, 10, 0, 0, 0, 0, 0, 8, 9, 103, 2, 149, 6, 64, 3, 244, 1, 83, 3, 212, 1, 51, 3, 82, 1, 0, 0, 70, 1, 94, 3, 9, 9, 166, 2, 189, 1, 69, 3, 222, 1, 32, 3, 160, 2, 0, 0, 222, 1, 79, 2, 0, 0, 0, 0, 38, 0, 9, 0, 0, 0, 0, 0, 136, 9, 22, 3, 89, 8, 56, 3, 3, 2, 92, 3, 228, 1, 60, 3, 119, 1, 0, 0, 170, 1, 178, 3, 212, 9, 174, 2, 198, 1, 70, 3, 233, 1, 39, 3, 173, 2, 0, 0, 8, 2, 110, 2, 0, 0, 0, 0, 38, 0, 9, 0, 0, 0, 0, 0, 8, 10, 172, 3, 41, 9, 220, 2, 232, 1, 233, 2, 184, 1, 232, 2, 115, 1, 0, 0, 8, 2, 232, 3, 51, 10, 138, 2, 184, 1, 22, 3, 211, 1, 12, 3, 168, 2, 0, 0, 41, 2, 136, 2, 0, 0, 0, 0, 38, 0, 9, 0, 0, 0, 0, 0, 136, 10, 139, 3, 2, 8, 90, 2, 147, 1, 102, 2, 122, 1, 96, 2, 71, 1, 0, 0, 249, 1, 219, 3, 226, 9, 72, 2, 153, 1, 205, 2, 185, 1, 214, 2, 139, 2, 0, 0, 36, 2, 136, 2, 0, 0, 0, 0, 40, 0, 10, 0, 0, 0, 0, 0, 8, 11, 214, 2, 5, 6, 205, 1, 87, 1, 222, 1, 73, 1, 209, 1, 35, 1, 0, 0, 148, 1, 156, 3, 34, 9, 0, 2, 105, 1, 113, 2, 140, 1, 132, 2, 101, 2, 0, 0, 8, 2, 104, 2, 0, 0, 0, 0, 40, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 66, 67, 90, 3, 12, 3, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 3, 12, 12, 12, 9, 1, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 3, 1, 9, 1, 1, 10, 9, 3, 1, 9, 9, 9, 12, 12, 12, 12, 3, 1, 1, 1, 1, 9, 9, 1, 9, 14, 14, 0, 10, 12, 12, 12, 3, 1, 1, 1, 9, 9, 14, 9, 9, 10, 3, 12, 12, 3, 12, 12, 1, 1, 1, 9, 9, 14, 0, 10, 4, 9, 10, 12, 10, 3, 12, 12, 1, 1, 1, 9, 0, 0, 0, 10, 10, 9, 9, 3, 10, 4, 12, 12, 1, 1, 1, 9, 0, 0, 0, 4, 4, 9, 4, 4, 10, 4, 12, 12, 9, 14, 14, 14, 14, 0, 0, 4, 11, 4, 10, 10, 10, 4, 12, 12, 10, 10, 10, 9, 9, 10, 0, 0, 4, 11, 4, 12, 10, 4, 12, 12, 1, 1, 11, 3, 9, 10, 0, 0, 4, 4, 4, 4, 12, 4, 12, 12, 1, 1, 3, 3, 10, 10, 0, 0, 4, 4, 10, 3, 3, 4, 12, 12, 1, 1, 1, 1, 1, 9, 0, 10, 10, 4, 11, 12, 12, 4, 12, 12, 1, 1, 1, 1, 1, 9, 10, 14, 10, 1, 3, 3, 12, 3, 12, 12, 10, 10, 1, 1, 1, 9, 10, 14, 10, 1, 1, 1, 12, 12, 12, 12, 12, 12, 12, 3, 3, 10, 12, 10, 10, 3, 3, 12, 12, 12, 66, 77, 72, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70, 49, 53, 48, 56, 48, 50, 49, 57, 48, 54, 48, 49, 0, 48, 44, 57, 57, 57, 57, 58, 57, 57, 58, 57, 57, 32, 48, 48, 58, 48, 48, 58, 48, 48, 0, 127, 0, 0, 0, 0, 1, 0, 0, 127, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0022 (0x0022/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown34);
				Assert.IsNotNull (entry, "Entry 0x0022 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0023 (WhiteBalanceBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WhiteBalanceBias);
				Assert.IsNotNull (entry, "Entry 0x0023 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0024 (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.FlashBias);
				Assert.IsNotNull (entry, "Entry 0x0024 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0025 (SerialNumber/Undefined/16) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.InternalSerialNumber);
				Assert.IsNotNull (entry, "Entry 0x0025 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0026 (0x0026/Undefined/4) "48 50 54 48 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x0026 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 54, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x0027 (0x0027/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown39);
				Assert.IsNotNull (entry, "Entry 0x0027 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0028 (ColorEffect/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ColorEffect);
				Assert.IsNotNull (entry, "Entry 0x0028 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0029 (0x0029/Long/1) "2286"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.TimeSincePowerOn);
				Assert.IsNotNull (entry, "Entry 0x0029 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2286, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x002A (BurstMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BurstMode);
				Assert.IsNotNull (entry, "Entry 0x002A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002B (SequenceNumber/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.SequenceNumber);
				Assert.IsNotNull (entry, "Entry 0x002B missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Panasonic.0x002C (Contrast/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0x002C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002D (NoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x002D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002E (SelfTimer/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.SelfTimer);
				Assert.IsNotNull (entry, "Entry 0x002E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x002F (0x002f/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown47);
				Assert.IsNotNull (entry, "Entry 0x002F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0030 (Rotation/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Rotation);
				Assert.IsNotNull (entry, "Entry 0x0030 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0031 (0x0031/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.Unknown49);
				Assert.IsNotNull (entry, "Entry 0x0031 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0032 (ColorMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ColorMode);
				Assert.IsNotNull (entry, "Entry 0x0032 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0033 (0x0033/Ascii/20) ""
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BabyAge);
				Assert.IsNotNull (entry, "Entry 0x0033 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Panasonic.0x0034 (0x0034/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.OpticalZoomMode);
				Assert.IsNotNull (entry, "Entry 0x0034 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0035 (0x0035/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ConversionLens);
				Assert.IsNotNull (entry, "Entry 0x0035 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0036 (TravelDay/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.TravelDay);
				Assert.IsNotNull (entry, "Entry 0x0036 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0037 (0x0037/Short/1) "257"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0037
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0037);
				Assert.IsNotNull (entry, "Entry 0x0037 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (257, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x0038 (0x0038/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x0038
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0038);
				Assert.IsNotNull (entry, "Entry 0x0038 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003A (0x003a/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WorldTimeLocation);
				Assert.IsNotNull (entry, "Entry 0x003A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003B (0x003b/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003B
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003B);
				Assert.IsNotNull (entry, "Entry 0x003B missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003C (0x003c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.ProgramISO);
				Assert.IsNotNull (entry, "Entry 0x003C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003D (0x003d/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003D);
				Assert.IsNotNull (entry, "Entry 0x003D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003E (0x003e/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003E);
				Assert.IsNotNull (entry, "Entry 0x003E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x003F (0x003f/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x003F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x003F);
				Assert.IsNotNull (entry, "Entry 0x003F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x004D (0x004d/Rational/2) "976828730/807418169 808466992/3158074"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004D
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004D);
				Assert.IsNotNull (entry, "Entry 0x004D missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (2, parts.Length);
				Assert.AreEqual (976828730, parts[0].Numerator);
				Assert.AreEqual (807418169, parts[0].Denominator);
				Assert.AreEqual (808466992, parts[1].Numerator);
				Assert.AreEqual (3158074, parts[1].Denominator);
			}
			// Panasonic.0x004E (0x004e/Undefined/42) "65 83 67 73 73 0 0 0 0 0 0 0 10 0 0 0 2 0 1 0 2 0 4 0 0 0 82 57 56 0 2 0 7 0 4 0 0 0 48 49 48 48 "
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004E
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004E);
				Assert.IsNotNull (entry, "Entry 0x004E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 65, 83, 67, 73, 73, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 2, 0, 1, 0, 2, 0, 4, 0, 0, 0, 82, 57, 56, 0, 2, 0, 7, 0, 4, 0, 0, 0, 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x004F (0x004f/Short/1) "0"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x004F
				var entry = makernote_structure.GetEntry (0, (ushort) 0x004F);
				Assert.IsNotNull (entry, "Entry 0x004F missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8000 (0x8000/Undefined/4) "48 49 50 49 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.MakerNoteVersion);
				Assert.IsNotNull (entry, "Entry 0x8000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Panasonic.0x8001 (0x8001/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.SceneMode);
				Assert.IsNotNull (entry, "Entry 0x8001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8002 (0x8002/Short/1) "2"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8002
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8002);
				Assert.IsNotNull (entry, "Entry 0x8002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8003 (0x8003/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8003
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8003);
				Assert.IsNotNull (entry, "Entry 0x8003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8004 (0x8004/Short/1) "1654"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WBRedLevel);
				Assert.IsNotNull (entry, "Entry 0x8004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1654, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8005 (0x8005/Short/1) "1054"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WBGreenLevel);
				Assert.IsNotNull (entry, "Entry 0x8005 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1054, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8006 (0x8006/Short/1) "1895"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.WBBlueLevel);
				Assert.IsNotNull (entry, "Entry 0x8006 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1895, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8007 (0x8007/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8007
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8007);
				Assert.IsNotNull (entry, "Entry 0x8007 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8008 (0x8008/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8008
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8008);
				Assert.IsNotNull (entry, "Entry 0x8008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8009 (0x8009/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Panasonic / 0x8009
				var entry = makernote_structure.GetEntry (0, (ushort) 0x8009);
				Assert.IsNotNull (entry, "Entry 0x8009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Panasonic.0x8010 (0x8010/Ascii/20) ""
			{
				var entry = makernote_structure.GetEntry (0, (ushort) PanasonicMakerNoteEntryTag.BabyAge2);
				Assert.IsNotNull (entry, "Entry 0x8010 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Photo.0x9286 (UserComment/UserComment/8) "charset="Ascii" "
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "64"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (64, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "40"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (40, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "9916"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 3 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "25"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (25, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0xC4A5 (PrintImageMatching/Undefined/208) "80 114 105 110 116 73 77 0 48 50 53 48 0 0 14 0 1 0 22 0 22 0 2 0 0 0 0 0 3 0 100 0 0 0 7 0 0 0 0 0 8 0 0 0 0 0 9 0 0 0 0 0 10 0 0 0 0 0 11 0 172 0 0 0 12 0 0 0 0 0 13 0 0 0 0 0 14 0 196 0 0 0 0 1 5 0 0 0 1 1 1 0 0 0 16 1 128 0 0 0 9 17 0 0 16 39 0 0 11 15 0 0 16 39 0 0 151 5 0 0 16 39 0 0 176 8 0 0 16 39 0 0 1 28 0 0 16 39 0 0 94 2 0 0 16 39 0 0 139 0 0 0 16 39 0 0 203 3 0 0 16 39 0 0 229 27 0 0 16 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Image / 0xC4A5
				var entry = structure.GetEntry (0, (ushort) 0xC4A5);
				Assert.IsNotNull (entry, "Entry 0xC4A5 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 80, 114, 105, 110, 116, 73, 77, 0, 48, 50, 53, 48, 0, 0, 14, 0, 1, 0, 22, 0, 22, 0, 2, 0, 0, 0, 0, 0, 3, 0, 100, 0, 0, 0, 7, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 11, 0, 172, 0, 0, 0, 12, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 14, 0, 196, 0, 0, 0, 0, 1, 5, 0, 0, 0, 1, 1, 1, 0, 0, 0, 16, 1, 128, 0, 0, 0, 9, 17, 0, 0, 16, 39, 0, 0, 11, 15, 0, 0, 16, 39, 0, 0, 151, 5, 0, 0, 16, 39, 0, 0, 176, 8, 0, 0, 16, 39, 0, 0, 1, 28, 0, 0, 16, 39, 0, 0, 94, 2, 0, 0, 16, 39, 0, 0, 139, 0, 0, 0, 16, 39, 0, 0, 203, 3, 0, 0, 16, 39, 0, 0, 229, 27, 0, 0, 16, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "180/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (180, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "10064"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "668"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (668, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
Esempio n. 19
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x00FE (NewSubfileType/Long/1) "0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.NewSubfileType);
				Assert.IsNotNull (entry, "Entry 0x00FE missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Image.0x0100 (ImageWidth/Short/1) "10"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (10, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Short/1) "10"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (10, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "5"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010D (DocumentName/Ascii/30) "/home/ruben/Desktop/test.tiff"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DocumentName);
				Assert.IsNotNull (entry, "Entry 0x010D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("/home/ruben/Desktop/test.tiff", (entry as StringIFDEntry).Value);
			}
			// Image.0x010E (ImageDescription/Ascii/18) "Created with GIMP"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageDescription);
				Assert.IsNotNull (entry, "Entry 0x010E missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Created with GIMP", (entry as StringIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/26) "Canon DIGITAL IXUS 850 IS"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon DIGITAL IXUS 850 IS", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "6980"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Short/1) "64"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (64, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "49"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (49, (entry as LongIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "1207959552/16777216"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1207959552, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "1207959552/16777216"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1207959552, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/20) "CHDK ver. 0.9.8-782"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("CHDK ver. 0.9.8-782", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2009:07:05 19:33:52"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:07:05 19:33:52", (entry as StringIFDEntry).Value);
			}
			// Image.0x013D (0x013d/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Predictor);
				Assert.IsNotNull (entry, "Entry 0x013D missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x02BC (XMLPacket/XMLPacket/6285) "60 63 120 112 97 99 107 101 116 32 98 101 103 105 110 61 34 239 187 191 34 32 105 100 61 34 87 53 77 48 77 112 67 101 104 105 72 122 114 101 83 122 78 84 99 122 107 99 57 100 34 63 62 10 60 120 58 120 109 112 109 101 116 97 32 120 109 108 110 115 58 120 61 34 97 100 111 98 101 58 110 115 58 109 101 116 97 47 34 32 120 58 120 109 112 116 107 61 34 88 77 80 32 67 111 114 101 32 52 46 49 46 49 45 69 120 105 118 50 34 62 10 32 60 114 100 102 58 82 68 70 32 120 109 108 110 115 58 114 100 102 61 34 104 116 116 112 58 47 47 119 119 119 46 119 51 46 111 114 103 47 49 57 57 57 47 48 50 47 50 50 45 114 100 102 45 115 121 110 116 97 120 45 110 115 35 34 62 10 32 32 60 114 100 102 58 68 101 115 99 114 105 112 116 105 111 110 32 114 100 102 58 97 98 111 117 116 61 34 34 10 32 32 32 32 120 109 108 110 115 58 101 120 105 102 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 101 120 105 102 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 120 97 112 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 120 97 112 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 99 114 115 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 99 97 109 101 114 97 45 114 97 119 45 115 101 116 116 105 110 103 115 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 116 105 102 102 61 34 104 116 116 112 58 47 47 110 115 46 97 100 111 98 101 46 99 111 109 47 116 105 102 102 47 49 46 48 47 34 10 32 32 32 32 120 109 108 110 115 58 100 99 61 34 104 116 116 112 58 47 47 112 117 114 108 46 111 114 103 47 100 99 47 101 108 101 109 101 110 116 115 47 49 46 49 47 34 10 32 32 32 101 120 105 102 58 69 120 105 102 86 101 114 115 105 111 110 61 34 48 50 50 49 34 10 32 32 32 101 120 105 102 58 68 97 116 101 84 105 109 101 79 114 105 103 105 110 97 108 61 34 50 48 48 57 45 48 55 45 48 53 84 49 57 58 51 51 58 53 50 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 84 105 109 101 61 34 49 47 51 48 34 10 32 32 32 101 120 105 102 58 70 78 117 109 98 101 114 61 34 50 56 47 49 48 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 80 114 111 103 114 97 109 61 34 48 34 10 32 32 32 101 120 105 102 58 83 104 117 116 116 101 114 83 112 101 101 100 86 97 108 117 101 61 34 52 57 48 54 56 57 49 47 49 48 48 48 48 48 48 34 10 32 32 32 101 120 105 102 58 65 112 101 114 116 117 114 101 86 97 108 117 101 61 34 50 57 55 48 56 53 52 47 49 48 48 48 48 48 48 34 10 32 32 32 101 120 105 102 58 69 120 112 111 115 117 114 101 66 105 97 115 86 97 108 117 101 61 34 45 57 54 47 57 54 34 10 32 32 32 101 120 105 102 58 77 97 120 65 112 101 114 116 117 114 101 86 97 108 117 101 61 34 50 57 51 47 57 54 34 10 32 32 32 101 120 105 102 58 77 101 116 101 114 105 110 103 77 111 100 101 61 34 53 34 10 32 32 32 101 120 105 102 58 70 111 99 97 108 76 101 110 103 116 104 61 34 52 54 48 48 47 49 48 48 48 34 10 32 32 32 101 120 105 102 58 70 111 99 97 108 76 101 110 103 116 104 73 110 51 53 109 109 70 105 108 109 61 34 50 55 34 10 32 32 32 120 97 112 58 77 111 100 105 102 121 68 97 116 101 61 34 50 48 48 57 45 48 55 45 48 53 84 49 57 58 51 51 58 53 50 43 48 51 58 48 48 34 10 32 32 32 120 97 112 58 67 114 101 97 116 111 114 84 111 111 108 61 34 67 72 68 75 32 118 101 114 46 32 48 46 57 46 56 45 55 56 50 34 10 32 32 32 120 97 112 58 82 97 116 105 110 103 61 34 48 34 10 32 32 32 99 114 115 58 86 101 114 115 105 111 110 61 34 51 46 55 34 10 32 32 32 99 114 115 58 87 104 105 116 101 66 97 108 97 110 99 101 61 34 67 117 115 116 111 109 34 10 32 32 32 99 114 115 58 84 101 109 112 101 114 97 116 117 114 101 61 34 54 53 53 48 34 10 32 32 32 99 114 115 58 84 105 110 116 61 34 43 49 53 48 34 10 32 32 32 99 114 115 58 69 120 112 111 115 117 114 101 61 34 48 46 48 48 34 10 32 32 32 99 114 115 58 83 104 97 100 111 119 115 61 34 53 34 10 32 32 32 99 114 115 58 66 114 105 103 104 116 110 101 115 115 61 34 43 53 48 34 10 32 32 32 99 114 115 58 67 111 110 116 114 97 115 116 61 34 43 50 53 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 61 34 48 34 10 32 32 32 99 114 115 58 83 104 97 114 112 110 101 115 115 61 34 50 53 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 83 109 111 111 116 104 105 110 103 61 34 51 49 34 10 32 32 32 99 114 115 58 67 111 108 111 114 78 111 105 115 101 82 101 100 117 99 116 105 111 110 61 34 49 57 34 10 32 32 32 99 114 115 58 67 104 114 111 109 97 116 105 99 65 98 101 114 114 97 116 105 111 110 82 61 34 48 34 10 32 32 32 99 114 115 58 67 104 114 111 109 97 116 105 99 65 98 101 114 114 97 116 105 111 110 66 61 34 48 34 10 32 32 32 99 114 115 58 86 105 103 110 101 116 116 101 65 109 111 117 110 116 61 34 48 34 10 32 32 32 99 114 115 58 83 104 97 100 111 119 84 105 110 116 61 34 43 49 48 48 34 10 32 32 32 99 114 115 58 82 101 100 72 117 101 61 34 43 51 51 34 10 32 32 32 99 114 115 58 82 101 100 83 97 116 117 114 97 116 105 111 110 61 34 45 51 51 34 10 32 32 32 99 114 115 58 71 114 101 101 110 72 117 101 61 34 45 49 48 48 34 10 32 32 32 99 114 115 58 71 114 101 101 110 83 97 116 117 114 97 116 105 111 110 61 34 45 49 48 48 34 10 32 32 32 99 114 115 58 66 108 117 101 72 117 101 61 34 43 49 48 48 34 10 32 32 32 99 114 115 58 66 108 117 101 83 97 116 117 114 97 116 105 111 110 61 34 43 51 51 34 10 32 32 32 99 114 115 58 70 105 108 108 76 105 103 104 116 61 34 48 34 10 32 32 32 99 114 115 58 86 105 98 114 97 110 99 101 61 34 48 34 10 32 32 32 99 114 115 58 72 105 103 104 108 105 103 104 116 82 101 99 111 118 101 114 121 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 82 101 100 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 79 114 97 110 103 101 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 89 101 108 108 111 119 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 71 114 101 101 110 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 65 113 117 97 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 66 108 117 101 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 80 117 114 112 108 101 61 34 48 34 10 32 32 32 99 114 115 58 72 117 101 65 100 106 117 115 116 109 101 110 116 77 97 103 101 110 116 97 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 82 101 100 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 79 114 97 110 103 101 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 89 101 108 108 111 119 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 71 114 101 101 110 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 65 113 117 97 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 66 108 117 101 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 80 117 114 112 108 101 61 34 48 34 10 32 32 32 99 114 115 58 83 97 116 117 114 97 116 105 111 110 65 100 106 117 115 116 109 101 110 116 77 97 103 101 110 116 97 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 82 101 100 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 79 114 97 110 103 101 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 89 101 108 108 111 119 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 71 114 101 101 110 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 65 113 117 97 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 66 108 117 101 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 80 117 114 112 108 101 61 34 48 34 10 32 32 32 99 114 115 58 76 117 109 105 110 97 110 99 101 65 100 106 117 115 116 109 101 110 116 77 97 103 101 110 116 97 61 34 48 34 10 32 32 32 99 114 115 58 83 112 108 105 116 84 111 110 105 110 103 83 104 97 100 111 119 72 117 101 61 34 48 34 10 32 32 32 99 114 115 58 83 112 108 105 116 84 111 110 105 110 103 83 104 97 100 111 119 83 97 116 117 114 97 116 105 111 110 61 34 48 34 10 32 32 32 99 114 115 58 83 112 108 105 116 84 111 110 105 110 103 72 105 103 104 108 105 103 104 116 72 117 101 61 34 48 34 10 32 32 32 99 114 115 58 83 112 108 105 116 84 111 110 105 110 103 72 105 103 104 108 105 103 104 116 83 97 116 117 114 97 116 105 111 110 61 34 48 34 10 32 32 32 99 114 115 58 83 112 108 105 116 84 111 110 105 110 103 66 97 108 97 110 99 101 61 34 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 83 104 97 100 111 119 115 61 34 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 68 97 114 107 115 61 34 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 76 105 103 104 116 115 61 34 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 72 105 103 104 108 105 103 104 116 115 61 34 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 83 104 97 100 111 119 83 112 108 105 116 61 34 50 53 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 77 105 100 116 111 110 101 83 112 108 105 116 61 34 53 48 34 10 32 32 32 99 114 115 58 80 97 114 97 109 101 116 114 105 99 72 105 103 104 108 105 103 104 116 83 112 108 105 116 61 34 55 53 34 10 32 32 32 99 114 115 58 67 111 110 118 101 114 116 84 111 71 114 97 121 115 99 97 108 101 61 34 70 97 108 115 101 34 10 32 32 32 99 114 115 58 84 111 110 101 67 117 114 118 101 78 97 109 101 61 34 67 117 115 116 111 109 34 10 32 32 32 99 114 115 58 67 97 109 101 114 97 80 114 111 102 105 108 101 61 34 69 109 98 101 100 100 101 100 34 10 32 32 32 99 114 115 58 72 97 115 83 101 116 116 105 110 103 115 61 34 84 114 117 101 34 10 32 32 32 99 114 115 58 72 97 115 67 114 111 112 61 34 70 97 108 115 101 34 10 32 32 32 99 114 115 58 65 108 114 101 97 100 121 65 112 112 108 105 101 100 61 34 70 97 108 115 101 34 10 32 32 32 116 105 102 102 58 73 109 97 103 101 87 105 100 116 104 61 34 50 53 54 34 10 32 32 32 116 105 102 102 58 73 109 97 103 101 76 101 110 103 116 104 61 34 49 57 50 34 10 32 32 32 116 105 102 102 58 67 111 109 112 114 101 115 115 105 111 110 61 34 49 34 10 32 32 32 116 105 102 102 58 80 104 111 116 111 109 101 116 114 105 99 73 110 116 101 114 112 114 101 116 97 116 105 111 110 61 34 50 34 10 32 32 32 116 105 102 102 58 79 114 105 101 110 116 97 116 105 111 110 61 34 49 34 10 32 32 32 116 105 102 102 58 83 97 109 112 108 101 115 80 101 114 80 105 120 101 61 34 51 34 10 32 32 32 116 105 102 102 58 80 108 97 110 97 114 67 111 110 102 105 103 117 114 97 116 105 111 110 61 34 49 34 10 32 32 32 116 105 102 102 58 68 97 116 101 84 105 109 101 61 34 50 48 48 57 45 48 55 45 48 53 84 49 57 58 51 51 58 53 50 34 10 32 32 32 116 105 102 102 58 77 97 107 101 61 34 67 97 110 111 110 34 10 32 32 32 116 105 102 102 58 77 111 100 101 108 61 34 67 97 110 111 110 32 68 73 71 73 84 65 76 32 73 88 85 83 32 56 53 48 32 73 83 34 10 32 32 32 116 105 102 102 58 83 111 102 116 119 97 114 101 61 34 67 72 68 75 32 118 101 114 46 32 48 46 57 46 56 45 55 56 50 34 62 10 32 32 32 60 101 120 105 102 58 70 108 97 115 104 10 32 32 32 32 101 120 105 102 58 70 105 114 101 100 61 34 70 97 108 115 101 34 10 32 32 32 32 101 120 105 102 58 82 101 116 117 114 110 61 34 48 34 10 32 32 32 32 101 120 105 102 58 77 111 100 101 61 34 50 34 10 32 32 32 32 101 120 105 102 58 70 117 110 99 116 105 111 110 61 34 70 97 108 115 101 34 10 32 32 32 32 101 120 105 102 58 82 101 100 69 121 101 77 111 100 101 61 34 70 97 108 115 101 34 47 62 10 32 32 32 60 101 120 105 102 58 73 83 79 83 112 101 101 100 82 97 116 105 110 103 115 62 10 32 32 32 32 60 114 100 102 58 83 101 113 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 52 48 48 60 47 114 100 102 58 108 105 62 10 32 32 32 32 60 47 114 100 102 58 83 101 113 62 10 32 32 32 60 47 101 120 105 102 58 73 83 79 83 112 101 101 100 82 97 116 105 110 103 115 62 10 32 32 32 60 99 114 115 58 84 111 110 101 67 117 114 118 101 62 10 32 32 32 32 60 114 100 102 58 83 101 113 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 48 44 32 48 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 51 53 44 32 49 53 52 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 54 52 44 32 53 54 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 57 55 44 32 49 56 52 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 49 51 52 44 32 49 56 50 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 49 53 49 44 32 49 56 57 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 49 56 49 44 32 49 55 55 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 49 57 50 44 32 49 57 54 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 50 48 50 44 32 50 52 48 60 47 114 100 102 58 108 105 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 50 53 53 44 32 50 53 53 60 47 114 100 102 58 108 105 62 10 32 32 32 32 60 47 114 100 102 58 83 101 113 62 10 32 32 32 60 47 99 114 115 58 84 111 110 101 67 117 114 118 101 62 10 32 32 32 60 116 105 102 102 58 66 105 116 115 80 101 114 83 97 109 112 108 101 62 10 32 32 32 32 60 114 100 102 58 83 101 113 62 10 32 32 32 32 32 60 114 100 102 58 108 105 62 56 32 56 32 56 60 47 114 100 102 58 108 105 62 10 32 32 32 32 60 47 114 100 102 58 83 101 113 62 10 32 32 32 60 47 116 105 102 102 58 66 105 116 115 80 101 114 83 97 109 112 108 101 62 10 32 32 32 60 100 99 58 100 101 115 99 114 105 112 116 105 111 110 62 10 32 32 32 32 60 114 100 102 58 65 108 116 62 10 32 32 32 32 32 60 114 100 102 58 108 105 32 120 109 108 58 108 97 110 103 61 34 120 45 100 101 102 97 117 108 116 34 62 84 101 115 116 60 47 114 100 102 58 108 105 62 10 32 32 32 32 60 47 114 100 102 58 65 108 116 62 10 32 32 32 60 47 100 99 58 100 101 115 99 114 105 112 116 105 111 110 62 10 32 32 60 47 114 100 102 58 68 101 115 99 114 105 112 116 105 111 110 62 10 32 60 47 114 100 102 58 82 68 70 62 10 60 47 120 58 120 109 112 109 101 116 97 62 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 60 63 120 112 97 99 107 101 116 32 101 110 100 61 34 119 34 63 62 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XMP);
				Assert.IsNotNull (entry, "Entry 0x02BC missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "6730"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (30, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "28/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (28, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (400, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2009:07:05 19:33:52"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2009:07:05 19:33:52", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "4906891/1000000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (4906891, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000000, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "2970854/1000000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2970854, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "-96/96"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-96, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "293/96"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (293, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "4600/1000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4600, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "27"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (27, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.exif.ExifVersion (XmpText/4) "0221"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExifVersion");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0221", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.DateTimeOriginal (XmpText/19) "2009-07-05T19:33:52"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "DateTimeOriginal");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2009-07-05T19:33:52", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureTime (XmpText/4) "1/30"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureTime");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1/30", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FNumber (XmpText/5) "28/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FNumber");
				Assert.IsNotNull (node);
				Assert.AreEqual ("28/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureProgram (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureProgram");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ShutterSpeedValue (XmpText/15) "4906891/1000000"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ShutterSpeedValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("4906891/1000000", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ApertureValue (XmpText/15) "2970854/1000000"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ApertureValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2970854/1000000", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureBiasValue (XmpText/6) "-96/96"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureBiasValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("-96/96", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MaxApertureValue (XmpText/6) "293/96"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MaxApertureValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("293/96", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MeteringMode (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MeteringMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLength (XmpText/9) "4600/1000"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("4600/1000", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLengthIn35mmFilm (XmpText/2) "27"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLengthIn35mmFilm");
				Assert.IsNotNull (node);
				Assert.AreEqual ("27", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash (XmpText/0) "type="Struct""
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
			}
			// Xmp.exif.Flash/exif:Fired (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.EXIF_NS, "Fired");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash/exif:Return (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.EXIF_NS, "Return");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash/exif:Mode (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.EXIF_NS, "Mode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash/exif:Function (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.EXIF_NS, "Function");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Flash/exif:RedEyeMode (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Flash");
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.EXIF_NS, "RedEyeMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ISOSpeedRatings (XmpSeq/1) "400"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ISOSpeedRatings");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Seq, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("400", node.Children [0].Value);
			}
			// Xmp.xmp.ModifyDate (XmpText/25) "2009-07-05T19:33:52+03:00"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "ModifyDate");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2009-07-05T19:33:52+03:00", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.CreatorTool (XmpText/19) "CHDK ver. 0.9.8-782"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "CreatorTool");
				Assert.IsNotNull (node);
				Assert.AreEqual ("CHDK ver. 0.9.8-782", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.Rating (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Version (XmpText/3) "3.7"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Version");
				Assert.IsNotNull (node);
				Assert.AreEqual ("3.7", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.WhiteBalance (XmpText/6) "Custom"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "WhiteBalance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Custom", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Temperature (XmpText/4) "6550"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Temperature");
				Assert.IsNotNull (node);
				Assert.AreEqual ("6550", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Tint (XmpText/4) "+150"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Tint");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+150", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Exposure (XmpText/4) "0.00"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Exposure");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0.00", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Shadows (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Shadows");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Brightness (XmpText/3) "+50"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Brightness");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+50", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Contrast (XmpText/3) "+25"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Contrast");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+25", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Saturation (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Saturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Sharpness (XmpText/2) "25"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Sharpness");
				Assert.IsNotNull (node);
				Assert.AreEqual ("25", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceSmoothing (XmpText/2) "31"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceSmoothing");
				Assert.IsNotNull (node);
				Assert.AreEqual ("31", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ColorNoiseReduction (XmpText/2) "19"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ColorNoiseReduction");
				Assert.IsNotNull (node);
				Assert.AreEqual ("19", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ChromaticAberrationR (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ChromaticAberrationR");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ChromaticAberrationB (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ChromaticAberrationB");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.VignetteAmount (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "VignetteAmount");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ShadowTint (XmpText/4) "+100"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ShadowTint");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+100", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.RedHue (XmpText/3) "+33"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "RedHue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+33", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.RedSaturation (XmpText/3) "-33"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "RedSaturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("-33", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.GreenHue (XmpText/4) "-100"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "GreenHue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("-100", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.GreenSaturation (XmpText/4) "-100"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "GreenSaturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("-100", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.BlueHue (XmpText/4) "+100"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "BlueHue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+100", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.BlueSaturation (XmpText/3) "+33"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "BlueSaturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("+33", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.FillLight (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "FillLight");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.Vibrance (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "Vibrance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HighlightRecovery (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HighlightRecovery");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentRed (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentRed");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentOrange (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentOrange");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentYellow (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentYellow");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentGreen (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentGreen");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentAqua (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentAqua");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentBlue (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentBlue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentPurple (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentPurple");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HueAdjustmentMagenta (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HueAdjustmentMagenta");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentRed (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentRed");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentOrange (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentOrange");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentYellow (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentYellow");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentGreen (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentGreen");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentAqua (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentAqua");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentBlue (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentBlue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentPurple (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentPurple");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SaturationAdjustmentMagenta (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SaturationAdjustmentMagenta");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentRed (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentRed");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentOrange (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentOrange");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentYellow (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentYellow");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentGreen (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentGreen");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentAqua (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentAqua");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentBlue (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentBlue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentPurple (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentPurple");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.LuminanceAdjustmentMagenta (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "LuminanceAdjustmentMagenta");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SplitToningShadowHue (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SplitToningShadowHue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SplitToningShadowSaturation (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SplitToningShadowSaturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SplitToningHighlightHue (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SplitToningHighlightHue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SplitToningHighlightSaturation (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SplitToningHighlightSaturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.SplitToningBalance (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "SplitToningBalance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricShadows (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricShadows");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricDarks (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricDarks");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricLights (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricLights");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricHighlights (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricHighlights");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricShadowSplit (XmpText/2) "25"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricShadowSplit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("25", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricMidtoneSplit (XmpText/2) "50"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricMidtoneSplit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("50", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ParametricHighlightSplit (XmpText/2) "75"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ParametricHighlightSplit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("75", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ConvertToGrayscale (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ConvertToGrayscale");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ToneCurveName (XmpText/6) "Custom"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ToneCurveName");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Custom", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.CameraProfile (XmpText/8) "Embedded"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "CameraProfile");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Embedded", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HasSettings (XmpText/4) "True"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HasSettings");
				Assert.IsNotNull (node);
				Assert.AreEqual ("True", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.HasCrop (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "HasCrop");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.AlreadyApplied (XmpText/5) "False"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "AlreadyApplied");
				Assert.IsNotNull (node);
				Assert.AreEqual ("False", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.crs.ToneCurve (XmpSeq/10) "0, 0, 35, 154, 64, 56, 97, 184, 134, 182, 151, 189, 181, 177, 192, 196, 202, 240, 255, 255"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.CRS_NS, "ToneCurve");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Seq, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (10, node.Children.Count);
				Assert.AreEqual ("0, 0", node.Children [0].Value);
				Assert.AreEqual ("35, 154", node.Children [1].Value);
				Assert.AreEqual ("64, 56", node.Children [2].Value);
				Assert.AreEqual ("97, 184", node.Children [3].Value);
				Assert.AreEqual ("134, 182", node.Children [4].Value);
				Assert.AreEqual ("151, 189", node.Children [5].Value);
				Assert.AreEqual ("181, 177", node.Children [6].Value);
				Assert.AreEqual ("192, 196", node.Children [7].Value);
				Assert.AreEqual ("202, 240", node.Children [8].Value);
				Assert.AreEqual ("255, 255", node.Children [9].Value);
			}
			// Xmp.tiff.ImageWidth (XmpText/3) "256"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageWidth");
				Assert.IsNotNull (node);
				Assert.AreEqual ("256", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageLength (XmpText/3) "192"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("192", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Compression (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Compression");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.PhotometricInterpretation (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "PhotometricInterpretation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.SamplesPerPixe (XmpText/1) "3"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "SamplesPerPixe");
				Assert.IsNotNull (node);
				Assert.AreEqual ("3", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.PlanarConfiguration (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "PlanarConfiguration");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.DateTime (XmpText/19) "2009-07-05T19:33:52"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "DateTime");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2009-07-05T19:33:52", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Make (XmpText/5) "Canon"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Make");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Canon", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Model (XmpText/25) "Canon DIGITAL IXUS 850 IS"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Model");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Canon DIGITAL IXUS 850 IS", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Software (XmpText/19) "CHDK ver. 0.9.8-782"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Software");
				Assert.IsNotNull (node);
				Assert.AreEqual ("CHDK ver. 0.9.8-782", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.BitsPerSample (XmpSeq/1) "8 8 8"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "BitsPerSample");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Seq, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("8 8 8", node.Children [0].Value);
			}
			// Xmp.dc.description (LangAlt/1) "lang="x-default" Test"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "description");
				Assert.IsNotNull (node);
				Assert.AreEqual ("x-default", node.Children [0].GetQualifier (XmpTag.XML_NS, "lang").Value);
				Assert.AreEqual ("Test", node.Children [0].Value);
			}

			//  ---------- End of XMP tests ----------

		}
Esempio n. 20
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010E (ImageDescription/Ascii/32) "                               "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageDescription);
				Assert.IsNotNull (entry, "Entry 0x010E missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("                               ", (entry as StringIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/5) "SONY"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("SONY", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/7) "DSC-P8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("DSC-P8", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "6"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/22) "f-spot version 0.1.11"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("f-spot version 0.1.11", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2006:06:12 13:30:01"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2006:06:12 13:30:01", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "250"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (80, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "28/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (28, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "320"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (320, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2006:06:12 13:28:25"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2006:06:12 13:28:25", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2006:06:12 13:28:25"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2006:06:12 13:28:25", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "48/16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (48, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "60/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (60, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/1504) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;

			// Sony.0x9001 (0x9001/Undefined/148) "0 55 0 0 0 8 0 136 147 53 0 194 66 169 0 125 23 0 0 0 0 203 0 0 0 0 0 0 0 203 0 1 91 213 255 0 0 216 0 0 105 4 149 0 255 106 224 125 64 220 14 136 255 74 255 240 0 0 0 74 136 0 136 125 5 74 136 0 136 125 5 74 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 140"
			{
				// TODO: Unknown IFD tag: Sony / 0x9001
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9001);
				Assert.IsNotNull (entry, "Entry 0x9001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 55, 0, 0, 0, 8, 0, 136, 147, 53, 0, 194, 66, 169, 0, 125, 23, 0, 0, 0, 0, 203, 0, 0, 0, 0, 0, 0, 0, 203, 0, 1, 91, 213, 255, 0, 0, 216, 0, 0, 105, 4, 149, 0, 255, 106, 224, 125, 64, 220, 14, 136, 255, 74, 255, 240, 0, 0, 0, 74, 136, 0, 136, 125, 5, 74, 136, 0, 136, 125, 5, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 140 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9002 (0x9002/Undefined/200) "2 239 0 140 2 239 0 0 0 125 0 0 0 0 0 0 0 0 0 0 0 0 205 0 0 0 0 0 112 0 112 42 14 172 205 0 0 0 0 0 0 0 0 0 112 143 138 95 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 182 8 92 0 125 0 182 0 0 0 4 0 63 63 0 112 170 112 170 112 42 64 0 0 0 220 220 115 70 0 79"
			{
				// TODO: Unknown IFD tag: Sony / 0x9002
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9002);
				Assert.IsNotNull (entry, "Entry 0x9002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 2, 239, 0, 140, 2, 239, 0, 0, 0, 125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 0, 0, 0, 0, 0, 112, 0, 112, 42, 14, 172, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 143, 138, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 182, 8, 92, 0, 125, 0, 182, 0, 0, 0, 4, 0, 63, 63, 0, 112, 170, 112, 170, 112, 42, 64, 0, 0, 0, 220, 220, 115, 70, 0, 79 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9003 (0x9003/Undefined/200) "0 239 0 110 0 91 0 50 0 43 0 219 0 115 57 131 26 208 135 188 26 208 26 177 234 34 125 13 163 57 219 57 219 57 219 7 148 194 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 1 217 0 91 0 147 216 8 48 136 0 0 48 136 1 238 1 139 1 1 0 255 231 253 231 168 123 219 60 123 0 0 75 234 187 7 207 27 146 131 2 11 92 82 121 97 7 238 7 133 16 171 1 42 58 253 185 174 154 252 5 92 140 45 40 130 108 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 32 8 27 0 1 220 220 188 95 16 0 0 8 231 8 182"
			{
				// TODO: Unknown IFD tag: Sony / 0x9003
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9003);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 239, 0, 110, 0, 91, 0, 50, 0, 43, 0, 219, 0, 115, 57, 131, 26, 208, 135, 188, 26, 208, 26, 177, 234, 34, 125, 13, 163, 57, 219, 57, 219, 57, 219, 7, 148, 194, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 1, 217, 0, 91, 0, 147, 216, 8, 48, 136, 0, 0, 48, 136, 1, 238, 1, 139, 1, 1, 0, 255, 231, 253, 231, 168, 123, 219, 60, 123, 0, 0, 75, 234, 187, 7, 207, 27, 146, 131, 2, 11, 92, 82, 121, 97, 7, 238, 7, 133, 16, 171, 1, 42, 58, 253, 185, 174, 154, 252, 5, 92, 140, 45, 40, 130, 108, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 32, 8, 27, 0, 1, 220, 220, 188, 95, 16, 0, 0, 8, 231, 8, 182 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9004 (0x9004/Undefined/26) "8 234 8 138 0 227 0 150 0 227 0 227 0 0 0 0 0 1 0 0 1 1 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Sony / 0x9004
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9004);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 8, 234, 8, 138, 0, 227, 0, 150, 0, 227, 0, 227, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9005 (0x9005/Undefined/120) "0 14 0 0 0 0 0 58 0 0 0 0 0 0 0 216 0 0 0 0 0 27 0 0 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 8 0 0 0 0 14 4 234 234 136 108 149 129 86 125 8 0 0 0 0 0 0 187 182 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 0 64 0 64 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Sony / 0x9005
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9005);
				Assert.IsNotNull (entry, "Entry 0x9005 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 14, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 216, 0, 0, 0, 0, 0, 27, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 8, 0, 0, 0, 0, 14, 4, 234, 234, 136, 108, 149, 129, 86, 125, 8, 0, 0, 0, 0, 0, 0, 187, 182, 0, 0, 0, 0, 255, 255, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 64, 0, 64, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9006 (0x9006/Undefined/252) "236 109 0 0 190 132 0 0 190 70 0 0 190 216 0 0 182 150 0 0 138 148 0 0 32 216 0 0 48 131 0 0 105 103 0 0 105 139 0 0 105 102 0 0 112 88 0 0 112 84 0 0 32 20 0 0 136 243 0 0 105 85 0 0 215 44 0 0 129 198 0 0 136 157 0 0 136 144 0 0 129 124 0 0 182 35 0 0 138 119 0 0 136 3 0 0 136 120 0 0 182 175 0 0 105 81 0 0 48 76 0 0 138 216 0 0 5 106 0 0 182 63 0 0 105 210 0 0 138 128 0 0 182 45 0 0 48 234 0 0 5 236 0 0 205 117 0 0 182 9 0 0 136 149 0 0 112 189 0 0 112 234 0 0 182 54 0 0 205 172 0 0 4 117 0 0 234 174 0 0 138 125 0 0 205 15 0 0 234 99 0 0 234 181 194 127 246 246 246 127 194 194 127 246 246 246 127 194 127 246 238 56 238 246 127 246 238 208 131 208 238 246 246 56 131 74 131 56 246 246 238 208 131 208 238 246 127 246 238 56 238 246 127 0 0 0 0 0 234 93 234 189"
			{
				// TODO: Unknown IFD tag: Sony / 0x9006
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9006);
				Assert.IsNotNull (entry, "Entry 0x9006 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 236, 109, 0, 0, 190, 132, 0, 0, 190, 70, 0, 0, 190, 216, 0, 0, 182, 150, 0, 0, 138, 148, 0, 0, 32, 216, 0, 0, 48, 131, 0, 0, 105, 103, 0, 0, 105, 139, 0, 0, 105, 102, 0, 0, 112, 88, 0, 0, 112, 84, 0, 0, 32, 20, 0, 0, 136, 243, 0, 0, 105, 85, 0, 0, 215, 44, 0, 0, 129, 198, 0, 0, 136, 157, 0, 0, 136, 144, 0, 0, 129, 124, 0, 0, 182, 35, 0, 0, 138, 119, 0, 0, 136, 3, 0, 0, 136, 120, 0, 0, 182, 175, 0, 0, 105, 81, 0, 0, 48, 76, 0, 0, 138, 216, 0, 0, 5, 106, 0, 0, 182, 63, 0, 0, 105, 210, 0, 0, 138, 128, 0, 0, 182, 45, 0, 0, 48, 234, 0, 0, 5, 236, 0, 0, 205, 117, 0, 0, 182, 9, 0, 0, 136, 149, 0, 0, 112, 189, 0, 0, 112, 234, 0, 0, 182, 54, 0, 0, 205, 172, 0, 0, 4, 117, 0, 0, 234, 174, 0, 0, 138, 125, 0, 0, 205, 15, 0, 0, 234, 99, 0, 0, 234, 181, 194, 127, 246, 246, 246, 127, 194, 194, 127, 246, 246, 246, 127, 194, 127, 246, 238, 56, 238, 246, 127, 246, 238, 208, 131, 208, 238, 246, 246, 56, 131, 74, 131, 56, 246, 246, 238, 208, 131, 208, 238, 246, 127, 246, 238, 56, 238, 246, 127, 0, 0, 0, 0, 0, 234, 93, 234, 189 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9007 (0x9007/Undefined/200) "205 208 5 136 5 253 112 229 105 211 136 29 48 131 190 134 0 163 112 161 182 88 105 28 136 132 48 116 215 21 187 90 12 90 236 140 108 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 183 64 187 27 253 64 234 64 105 64 90 64 53 125 12 125 29 216 13 0 163 64 53 64 144 64 254 125 138 125 196 125 58 216 36 94 36 14 249 4 114 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 199 231 0 14 13 14 67 231 26 231 84 231 74 4 26 4 58 86 194 0 163 138 95 138 233 138 107 138 201 112 234 112 172 112 65 112 204 112 133 112 143 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Sony / 0x9007
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9007);
				Assert.IsNotNull (entry, "Entry 0x9007 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 205, 208, 5, 136, 5, 253, 112, 229, 105, 211, 136, 29, 48, 131, 190, 134, 0, 163, 112, 161, 182, 88, 105, 28, 136, 132, 48, 116, 215, 21, 187, 90, 12, 90, 236, 140, 108, 109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 183, 64, 187, 27, 253, 64, 234, 64, 105, 64, 90, 64, 53, 125, 12, 125, 29, 216, 13, 0, 163, 64, 53, 64, 144, 64, 254, 125, 138, 125, 196, 125, 58, 216, 36, 94, 36, 14, 249, 4, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 199, 231, 0, 14, 13, 14, 67, 231, 26, 231, 84, 231, 74, 4, 26, 4, 58, 86, 194, 0, 163, 138, 95, 138, 233, 138, 107, 138, 201, 112, 234, 112, 172, 112, 65, 112, 204, 112, 133, 112, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Sony.0x9008 (0x9008/Undefined/200) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 1 0 2 0"
			{
				// TODO: Unknown IFD tag: Sony / 0x9008
				var entry = makernote_structure.GetEntry (0, (ushort) 0x9008);
				Assert.IsNotNull (entry, "Entry 0x9008 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 2, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010E (ImageDescription/Ascii/32) "OLYMPUS DIGITAL CAMERA         "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageDescription);
				Assert.IsNotNull (entry, "Entry 0x010E missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OLYMPUS DIGITAL CAMERA         ", (entry as StringIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/24) "OLYMPUS IMAGING CORP.  "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OLYMPUS IMAGING CORP.  ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/17) "u740,S740       "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("u740,S740       ", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "314/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (314, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "314/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (314, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/47) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2008:10:04 22:00:22"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:10:04 22:00:22", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "316"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/50"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (50, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "38/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (38, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (100, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:10:04 18:33:50"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:10:04 18:33:50", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:10:04 18:33:50"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:10:04 18:33:50", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "344/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (344, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "25"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (25, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "886/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (886, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/1622) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "1536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1536, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "2048"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2048, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "2534"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "100/100"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (100, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xEA1D (0xea1d/SLong/1) "34"
			{
				// TODO: Unknown IFD tag: Photo / 0xEA1D
				var entry = exif_structure.GetEntry (0, (ushort) 0xEA1D);
				Assert.IsNotNull (entry, "Entry 0xEA1D missing in IFD 0");
				Assert.IsNotNull (entry as SLongIFDEntry, "Entry is not a signed long!");
				Assert.AreEqual (34, (entry as SLongIFDEntry).Value);
			}
			// Image.0xC4A5 (PrintImageMatching/Undefined/528) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Image / 0xC4A5
				var entry = structure.GetEntry (0, (ushort) 0xC4A5);
				Assert.IsNotNull (entry, "Entry 0xC4A5 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("785d55d75dffafdef5947fb2bfd6c84b", parsed_hash);
				Assert.AreEqual (528, parsed_bytes.Length);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "1/96"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "1/96"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (96, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "3194"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "5804"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (5804, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.xmp.creatortool (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "creatortool");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.software (XmpText/46) "Microsoft Windows Photo Gallery 6.0.6000.16386"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "software");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Microsoft Windows Photo Gallery 6.0.6000.16386", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}

			//  ---------- End of XMP tests ----------

		}
Esempio n. 22
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
            Assert.IsTrue (file.PossiblyCorrupt);

			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x0100 (ImageWidth/Short/1) "3456"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3456, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Short/1) "2304"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2304, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/27) "Canon EOS DIGITAL REBEL XT"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS DIGITAL REBEL XT", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "9728"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "2887781"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2887781, (entry as LongIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:10:13 02:16:29"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:10:13 02:16:29", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "270"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/15"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (15, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "50/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (50, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (400, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:10:13 02:16:29"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:10:13 02:16:29", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:10:13 02:16:29"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:10:13 02:16:29", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "0 0 0 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "256042/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (256042, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "304340/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (304340, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "16"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (16, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "38/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (38, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/8340) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Canon, makernote.MakernoteType);

			// CanonCs.0x0000 (0x0000/Short/1) "92"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (92, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCs.0x0001 (Macro/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCs.0x0002 (Selftimer/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCs.0x0003 (Quality/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (4, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCs.0x0004 (FlashMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCs.0x0005 (DriveMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCs.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCs.0x0007 (FocusMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCs.0x0008 (0x0008/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCs.0x0009 (0x0009/Short/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (7, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCs.0x000A (ImageSize/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCs.0x000B (EasyMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonCs.0x000C (DigitalZoom/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonCs.0x000D (Contrast/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonCs.0x000E (Saturation/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonCs.0x000F (Sharpness/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonCs.0x0010 (ISOSpeed/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonCs.0x0011 (MeteringMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonCs.0x0012 (FocusType/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonCs.0x0013 (AFPoint/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonCs.0x0014 (ExposureProgram/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonCs.0x0015 (0x0015/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonCs.0x0016 (LensType/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonCs.0x0017 (Lens/Short/3) "85 17 1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (85, (entry as ShortArrayIFDEntry).Values [23]);
				Assert.AreEqual (17, (entry as ShortArrayIFDEntry).Values [24]);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonCs.0x001A (MaxAperture/Short/1) "139"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (139, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonCs.0x001B (MinAperture/Short/1) "304"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (304, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonCs.0x001C (FlashActivity/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonCs.0x001D (FlashDetails/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonCs.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonCs.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonCs.0x0020 (FocusContinuous/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonCs.0x0021 (AESetting/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// CanonCs.0x0022 (ImageStabilization/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (35 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [34]);
			}
			// CanonCs.0x0023 (DisplayAperture/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (36 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [35]);
			}
			// CanonCs.0x0024 (ZoomSourceWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (37 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [36]);
			}
			// CanonCs.0x0025 (ZoomTargetWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (38 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [37]);
			}
			// CanonCs.0x0026 (0x0026/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (39 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [38]);
			}
			// CanonCs.0x0027 (0x0027/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (40 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [39]);
			}
			// CanonCs.0x0028 (PhotoEffect/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (41 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [40]);
			}
			// CanonCs.0x0029 (0x0029/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (42 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [41]);
			}
			// CanonCs.0x002A (ColorTone/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (43 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [42]);
			}
			// CanonCs.0x002B (0x002b/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (44 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [43]);
			}
			// CanonCs.0x002C (0x002c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (45 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [44]);
			}
			// CanonCs.0x002D (0x002d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (46 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [45]);
			}
			// Canon.0x0002 (FocalLength/Short/4) "2 38 907 605"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 38, 907, 605 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0003 (0x0003/Short/4) "100 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.Unknown3);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 100, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// CanonSi.0x0000 (0x0000/Short/1) "68"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (68, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonSi.0x0001 (0x0001/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonSi.0x0002 (ISOSpeed/Short/1) "224"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (224, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonSi.0x0003 (0x0003/Short/1) "60"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (60, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonSi.0x0004 (TargetAperture/Short/1) "149"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (149, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonSi.0x0005 (TargetShutterSpeed/Short/1) "125"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (125, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonSi.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonSi.0x0007 (WhiteBalance/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonSi.0x0008 (0x0008/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonSi.0x0009 (Sequence/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonSi.0x000A (0x000a/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonSi.0x000B (0x000b/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonSi.0x000C (0x000c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonSi.0x000D (0x000d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonSi.0x000E (AFPointUsed/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonSi.0x000F (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonSi.0x0010 (0x0010/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonSi.0x0011 (0x0011/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonSi.0x0012 (0x0012/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonSi.0x0013 (SubjectDistance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonSi.0x0014 (0x0014/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonSi.0x0015 (ApertureValue/Short/1) "152"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (152, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonSi.0x0016 (ShutterSpeedValue/Short/1) "292"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (292, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonSi.0x0017 (0x0017/Short/1) "103"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (24 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (103, (entry as ShortArrayIFDEntry).Values [23]);
			}
			// CanonSi.0x0018 (0x0018/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (25 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [24]);
			}
			// CanonSi.0x0019 (0x0019/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonSi.0x001A (0x001a/Short/1) "252"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (252, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonSi.0x001B (0x001b/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonSi.0x001C (0x001c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonSi.0x001D (0x001d/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonSi.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonSi.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonSi.0x0020 (0x0020/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonSi.0x0021 (0x0021/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// Canon.0x0006 (ImageType/Ascii/32) "Canon EOS DIGITAL REBEL XT"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageType);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS DIGITAL REBEL XT", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0007 (FirmwareVersion/Ascii/32) "Firmware 1.0.3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Firmware 1.0.3", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0009 (OwnerName/Ascii/32) "unknown"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.OwnerName);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("unknown", (entry as StringIFDEntry).Value);
			}
			// Canon.0x000C (SerialNumber/Long/1) "2220701995"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumber);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2220701995, (entry as LongIFDEntry).Value);
			}
			// Canon.0x000D (0x000d/Undefined/1024) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.Unknown13);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("0f343b0931126a20f133d67c2b018a3b", parsed_hash);
				Assert.AreEqual (1024, parsed_bytes.Length);
			}
			// CanonCf.0x0000 (0x0000/Short/1) "20"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (20, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCf.0x0001 (NoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCf.0x0002 (ShutterAeLock/Short/1) "256"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (256, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCf.0x0003 (MirrorLockup/Short/1) "512"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (512, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCf.0x0004 (ExposureLevelIncrements/Short/1) "768"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (768, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCf.0x0005 (AFAssist/Short/1) "1024"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1024, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCf.0x0006 (FlashSyncSpeedAv/Short/1) "1280"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1280, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCf.0x0007 (AEBSequence/Short/1) "1536"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1536, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCf.0x0008 (ShutterCurtainSync/Short/1) "1792"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1792, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCf.0x0009 (LensAFStopButton/Short/1) "2048"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2048, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// Canon.0x0010 (ModelID/Long/1) "2147484041"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ModelID);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2147484041, (entry as LongIFDEntry).Value);
			}
			// CanonPi.0x0000 (0x0000/Short/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (7, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonPi.0x0001 (0x0001/Short/1) "7"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (7, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonPi.0x0002 (ImageWidth/Short/1) "3456"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3456, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonPi.0x0003 (ImageHeight/Short/1) "2304"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2304, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonPi.0x0004 (ImageWidthAsShot/Short/1) "3456"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3456, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonPi.0x0005 (ImageHeightAsShot/Short/1) "2304"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2304, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonPi.0x0006 (0x0006/Short/1) "189"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (189, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonPi.0x0007 (0x0007/Short/1) "188"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (188, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonPi.0x0008 (0x0008/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonPi.0x0009 (0x0009/Short/1) "64299"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (64299, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonPi.0x000A (0x000a/Short/1) "64794"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (64794, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonPi.0x000B (0x000b/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonPi.0x000C (0x000c/Short/1) "742"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (742, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonPi.0x000D (0x000d/Short/1) "1237"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1237, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonPi.0x000E (0x000e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonPi.0x000F (0x000f/Short/1) "64919"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (64919, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonPi.0x0010 (0x0010/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonPi.0x0011 (0x0011/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonPi.0x0012 (0x0012/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonPi.0x0013 (0x0013/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonPi.0x0014 (0x0014/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonPi.0x0015 (0x0015/Short/1) "617"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (617, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonPi.0x0016 (AFPointsUsed/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonPi.0x0017 (0x0017/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.PictureInfo);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (24 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [23]);
			}
			// Canon.0x0013 (0x0013/Short/4) "0 159 7 112"
			{
				// TODO: Unknown IFD tag: Canon / 0x0013
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0013);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 159, 7, 112 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0015 (0x0015/Long/1) "2684354560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumberFormat);
				Assert.IsNotNull (entry, "Entry 0x0015 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2684354560, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0019 (0x0019/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Canon / 0x0019
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0019);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x0083 (0x0083/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Canon / 0x0083
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0083);
				Assert.IsNotNull (entry, "Entry 0x0083 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0093 (0x0093/Short/16) "32 13315 89 0 0 0 3 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CanonFileInfo);
				Assert.IsNotNull (entry, "Entry 0x0093 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 32, 13315, 89, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00A0 (0x00a0/Short/14) "28 0 0 0 0 0 0 0 32771 5200 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ProcessingInfo);
				Assert.IsNotNull (entry, "Entry 0x00A0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 28, 0, 0, 0, 0, 0, 0, 0, 32771, 5200, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00AA (0x00aa/Short/5) "10 913 1024 1024 232"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.MeasuredColor);
				Assert.IsNotNull (entry, "Entry 0x00AA missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 10, 913, 1024, 1024, 232 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00D0 (0x00d0/Long/1) "0"
			{
				// TODO: Unknown IFD tag: Canon / 0x00D0
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00D0);
				Assert.IsNotNull (entry, "Entry 0x00D0 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Canon.0x00E0 (0x00e0/Short/17) "34 3516 2328 1 1 52 19 3507 2322 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SensorInfo);
				Assert.IsNotNull (entry, "Entry 0x00E0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 34, 3516, 2328, 1, 1, 52, 19, 3507, 2322, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4001 (0x4001/Short/582) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Canon / 0x4001
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4001);
				Assert.IsNotNull (entry, "Entry 0x4001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 1164, 791, 1024, 1024, 349, 495, 1024, 1024, 508, 329, 1024, 1024, 723, 241, 296, 293, 103, 185, 350, 347, 176, 133, 374, 371, 269, 1611, 1131, 1140, 2679, 3199, 1684, 1019, 1027, 2224, 2718, 2142, 1019, 1027, 1534, 5200, 2518, 1019, 1027, 1274, 7000, 2333, 1019, 1027, 1387, 6000, 1445, 1019, 1027, 2403, 3199, 1812, 1019, 1027, 2046, 3901, 2419, 1019, 1027, 1338, 6442, 1459, 1019, 1027, 2824, 3014, 2142, 1019, 1027, 1534, 5200, 358, 988, 65156, 11109, 372, 939, 65191, 9523, 392, 875, 65238, 8000, 416, 822, 65283, 7000, 449, 755, 65344, 6000, 466, 722, 65374, 5600, 489, 683, 65413, 5200, 520, 637, 65462, 4749, 558, 588, 65517, 4312, 588, 555, 21, 4023, 634, 509, 80, 3696, 714, 442, 173, 3250, 757, 416, 216, 3051, 806, 386, 265, 2871, 982, 317, 406, 2413, 500, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 2069, 2087, 256, 256, 256, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 82, 92, 117, 93, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115, 69, 106, 99, 108, 78, 73, 0, 0, 293, 42, 0, 86, 175, 61, 50, 58, 60, 68, 62, 81, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 90, 101, 128, 96, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 79, 125, 114, 126, 87, 78, 0, 0, 304, 46, 0, 99, 199, 70, 61, 72, 75, 86, 78, 107, 117, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 113, 124, 152, 111, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177, 102, 151, 136, 145, 93, 81, 0, 0, 536, 82, 0, 154, 311, 106, 87, 95, 95, 103, 91, 116, 118, 111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 37, 41, 52, 35, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 34, 52, 45, 50, 31, 25, 0, 0, 215, 23, 0, 46, 81, 29, 26, 29, 29, 33, 28, 40, 40, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 15, 10, 7, 133, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6, 6, 8, 15, 523, 22, 0, 0, 1, 4, 0, 2, 1, 8, 6, 26, 42, 64, 45, 157, 27710, 2884, 678, 427, 444, 669, 354, 855, 0, 286, 305, 304, 72, 1023, 1024, 1024, 0, 0, 0, 0, 0, 0, 0, 0, 1211, 1024, 1024, 2727, 4011, 6737 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4002 (0x4002/Short/2676) "(Value ommitted)"
			{
				// TODO: Unknown IFD tag: Canon / 0x4002
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4002);
				Assert.IsNotNull (entry, "Entry 0x4002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 5352, 0, 0, 0, 5657, 65535, 65280, 41984, 1297, 65535, 400, 0, 28673, 794, 4058, 316, 196, 48, 464, 3821, 3207, 0, 38565, 38550, 64, 64, 64, 0, 29590, 28815, 50703, 0, 0, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 0, 118, 578, 1869, 0, 4589, 1951, 95, 4383, 2004, 146, 12794, 2001, 192, 12535, 2032, 224, 1100, 12462, 2038, 238, 1520, 32809, 0, 252, 1040, 1040, 1040, 0, 17, 19, 1331, 28, 58, 128, 817, 8, 18, 0, 32, 32, 32, 0, 1, 0, 2, 192, 19335, 511, 512, 512, 512, 1, 1, 78, 151, 28, 0, 768, 0, 0, 768, 0, 0, 2054, 2827, 17, 32, 0, 17151, 1, 2816, 512, 21862, 2672, 63, 9, 29, 6, 26, 133, 63, 13, 32, 5, 15, 67, 63, 10, 41, 5, 21, 68, 63, 21, 36, 16, 28, 102, 63, 13, 32, 10, 27, 118, 40, 512, 202, 132, 0, 1311, 0, 40, 384, 144, 88, 0, 1048, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 560, 400, 3080, 1099, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0, 0, 0, 0, 0, 0, 0, 256, 256, 32, 4353, 256, 256, 0, 0, 0, 0, 0, 0, 400, 400, 400, 4496, 4496, 38565, 38550, 38550, 29590, 38565, 38550, 38550, 29590, 38565, 38550, 38550, 29590, 38565, 38550, 38550, 29590, 38565, 38550, 38550, 29590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 0, 28, 58, 20, 40, 64, 64, 50, 0, 62, 55, 10, 35, 64, 35, 48, 70, 46, 55, 30, 64, 52, 32, 64, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 3996, 481, 13, 929, 120, 502, 406, 0, 300, 444, 94, 4411, 473, 153, 8533, 489, 207, 12713, 475, 254, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 1270, 32854, 0, 286, 0, 118, 644, 1826, 0, 4561, 1941, 101, 8669, 1973, 147, 12700, 2027, 185, 12582, 2036, 215, 990, 12550, 2034, 226, 1500, 32816, 0, 251, 0, 118, 598, 1867, 0, 262, 1978, 99, 8643, 1992, 148, 12787, 2008, 187, 12566, 2029, 220, 990, 12515, 2034, 230, 1500, 32816, 0, 251, 0, 118, 578, 1869, 0, 4589, 1951, 95, 4383, 2004, 146, 12794, 2001, 192, 12535, 2032, 224, 1100, 12462, 2038, 238, 1520, 32809, 0, 252, 0, 118, 492, 1954, 0, 316, 1970, 93, 4397, 2006, 154, 8488, 2012, 204, 12473, 2022, 237, 990, 12406, 2040, 243, 1235, 32796, 0, 249, 0, 118, 349, 17, 0, 380, 1953, 84, 4452, 1993, 157, 8504, 2008, 214, 12465, 1989, 248, 990, 12313, 2045, 252, 1217, 32777, 0, 253, 0, 118, 643, 1827, 0, 4564, 1938, 101, 8662, 1982, 147, 12748, 2014, 186, 12557, 2016, 217, 990, 12474, 2043, 226, 1500, 32826, 0, 246, 0, 118, 598, 1867, 0, 262, 1978, 99, 8643, 1992, 148, 12787, 2008, 187, 12566, 2009, 220, 990, 12465, 2041, 229, 1500, 32819, 0, 247, 0, 118, 578, 1870, 0, 4590, 1950, 95, 4382, 2005, 146, 12798, 2000, 192, 12531, 2027, 224, 1100, 12436, 2040, 237, 1520, 32809, 0, 249, 0, 118, 512, 1936, 0, 304, 1978, 94, 4406, 2001, 154, 8471, 2018, 204, 12507, 1996, 237, 990, 12373, 2046, 243, 1250, 32793, 0, 248, 0, 118, 349, 17, 0, 380, 1953, 84, 4452, 1993, 157, 8504, 2008, 214, 12465, 1989, 248, 990, 12313, 2045, 252, 1217, 32777, 0, 253, 0, 118, 643, 1827, 0, 4564, 1938, 101, 8662, 1982, 147, 12748, 2014, 186, 12557, 2016, 217, 990, 12474, 2043, 226, 1500, 32833, 0, 246, 0, 118, 598, 1867, 0, 262, 1978, 99, 8643, 1992, 148, 12787, 2008, 187, 12566, 2009, 220, 990, 12465, 2041, 229, 1500, 32819, 0, 247, 0, 118, 578, 1870, 0, 4590, 1950, 95, 4382, 2005, 146, 12798, 2000, 192, 12531, 2027, 224, 1100, 12436, 2040, 237, 1520, 32814, 0, 249, 0, 118, 512, 1936, 0, 304, 1978, 94, 4406, 2001, 154, 8471, 2018, 204, 12507, 1996, 237, 990, 12373, 2046, 243, 1250, 32795, 0, 248, 0, 118, 349, 17, 0, 380, 1953, 84, 4452, 1993, 157, 8504, 2008, 214, 12465, 1989, 248, 990, 12313, 2045, 252, 1217, 32777, 0, 253, 0, 118, 643, 1827, 0, 4564, 1938, 101, 8662, 1982, 147, 12748, 2018, 186, 12581, 2017, 218, 990, 12501, 2038, 228, 1500, 32827, 0, 249, 0, 118, 598, 1867, 0, 262, 1978, 99, 8643, 1992, 148, 12787, 2013, 187, 12590, 2010, 221, 990, 12492, 2038, 231, 1500, 32807, 0, 251, 0, 118, 578, 1870, 0, 4590, 1950, 95, 4382, 2005, 146, 12798, 2000, 192, 12531, 2034, 224, 1100, 12466, 2034, 238, 1515, 32810, 0, 251, 0, 118, 512, 1936, 0, 304, 1978, 94, 4406, 2001, 154, 8471, 2018, 204, 12507, 1996, 237, 990, 12373, 2046, 243, 1250, 32799, 0, 248, 0, 118, 349, 17, 0, 380, 1953, 84, 4452, 1993, 157, 8504, 2008, 214, 12465, 1989, 248, 990, 12313, 2045, 252, 1217, 32777, 0, 253, 0, 118, 643, 1827, 0, 4564, 1938, 101, 8662, 1982, 147, 12748, 2018, 186, 12581, 2017, 218, 990, 12501, 2038, 228, 1500, 32827, 0, 249, 0, 118, 598, 1867, 0, 262, 1978, 99, 8643, 1992, 148, 12787, 2013, 187, 12590, 2010, 221, 990, 12492, 2038, 231, 1500, 32807, 0, 251, 0, 118, 578, 1870, 0, 4590, 1950, 95, 4382, 2005, 146, 12798, 2000, 192, 12531, 2034, 224, 1100, 12466, 2034, 238, 1515, 32810, 0, 251, 0, 118, 512, 1936, 0, 304, 1978, 94, 4406, 2001, 154, 8471, 2018, 204, 12507, 1996, 237, 990, 12373, 2046, 243, 1250, 32799, 0, 248, 0, 118, 349, 17, 0, 380, 1953, 84, 4452, 1993, 157, 8504, 2008, 214, 12465, 1989, 248, 990, 12313, 2045, 252, 1217, 32777, 0, 253, 0, 2056, 8, 8, 8, 80, 25703, 8500, 80, 25703, 8500, 80, 25703, 8500, 84, 25703, 8500, 84, 25703, 8500, 78, 151, 28, 98, 158, 1, 138, 118, 1, 254, 1, 1, 1, 254, 1, 2054, 2827, 17, 32, 2054, 2827, 17, 32, 2054, 2827, 17, 32, 4104, 6678, 292, 32, 6666, 10019, 312, 32, 63, 21, 36, 16, 28, 102, 63, 13, 32, 10, 27, 118, 63, 21, 36, 16, 28, 102, 63, 13, 32, 10, 27, 118, 63, 21, 36, 8, 14, 51, 63, 13, 32, 10, 27, 118, 63, 0, 0, 0, 0, 0, 63, 13, 32, 10, 27, 118, 63, 0, 0, 0, 0, 0, 63, 13, 32, 10, 27, 118, 38, 43, 48, 58, 67, 128, 128, 128, 128, 128, 128, 128, 128, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 5000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 7000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 3000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 5000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 7000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 3000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 5000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 7000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 3000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 5000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 7000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 3000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 5000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 7000, 794, 64742, 38, 65498, 316, 196, 48, 464, 65261, 275, 889, 64647, 3000, 702, 64834, 15, 65521, 343, 169, 13, 499, 65298, 238, 921, 64615, 5000, 702, 64834, 15, 65521, 343, 169, 13, 499, 65298, 238, 921, 64615, 7000, 702, 64834, 15, 65521, 343, 169, 13, 499, 65298, 238, 921, 64615, 3000, 696, 64840, 26, 65510, 340, 172, 37, 475, 65298, 238, 921, 64615, 5000, 696, 64840, 26, 65510, 340, 172, 37, 475, 65298, 238, 921, 64615, 7000, 696, 64840, 26, 65510, 340, 172, 37, 475, 65298, 238, 921, 64615, 3000, 697, 64839, 14, 65522, 344, 168, 34, 478, 65296, 240, 913, 64623, 5000, 697, 64839, 14, 65522, 344, 168, 34, 478, 65296, 240, 913, 64623, 7000, 697, 64839, 14, 65522, 344, 168, 34, 478, 65296, 240, 913, 64623, 3000, 714, 64822, 11, 65525, 388, 124, 22, 490, 65286, 250, 900, 64636, 5000, 714, 64822, 11, 65525, 388, 124, 22, 490, 65286, 250, 900, 64636, 7000, 714, 64822, 11, 65525, 388, 124, 22, 490, 65286, 250, 900, 64636, 3000, 680, 64856, 15, 65521, 403, 109, 1, 511, 65302, 234, 880, 64656, 5000, 680, 64856, 15, 65521, 403, 109, 1, 511, 65302, 234, 880, 64656, 7000, 680, 64856, 15, 65521, 403, 109, 1, 511, 65302, 234, 880, 64656, 3000, 65524, 65524, 14, 0, 5000, 65524, 65524, 14, 0, 7000, 65524, 65524, 14, 0, 3000, 65530, 65530, 7, 0, 5000, 65530, 65530, 7, 0, 7000, 65530, 65530, 7, 0, 3000, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 7000, 0, 0, 0, 0, 3000, 6, 6, 65529, 0, 5000, 6, 6, 65529, 0, 7000, 6, 6, 65529, 0, 3000, 12, 12, 65522, 0, 5000, 12, 12, 65522, 0, 7000, 12, 12, 65522, 0, 3000, 65522, 65522, 15, 0, 5000, 65522, 65522, 15, 0, 7000, 65522, 65522, 15, 0, 3000, 65530, 65530, 7, 0, 5000, 65530, 65530, 7, 0, 7000, 65530, 65530, 7, 0, 3000, 0, 0, 0, 0, 5000, 0, 0, 0, 0, 7000, 0, 0, 0, 0, 3000, 6, 6, 65529, 0, 5000, 6, 6, 65529, 0, 7000, 6, 6, 65529, 0, 3000, 13, 12, 65522, 0, 5000, 13, 12, 65522, 0, 7000, 13, 12, 65522, 0, 110, 100, 135, 4, 5, 200, 6, 110, 100, 135, 4, 5, 200, 6, 110, 100, 135, 4, 5, 200, 6, 110, 100, 135, 4, 5, 200, 6, 110, 100, 135, 4, 5, 200, 6, 125, 110, 122, 4, 6, 190, 9, 125, 110, 122, 4, 6, 190, 9, 125, 110, 122, 4, 6, 190, 9, 125, 110, 122, 4, 6, 190, 9, 125, 110, 122, 4, 6, 190, 9, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 178, 124, 125, 12, 11, 150, 17, 178, 124, 125, 12, 11, 150, 17, 178, 124, 125, 12, 11, 150, 17, 178, 124, 125, 12, 11, 150, 17, 178, 124, 125, 12, 11, 150, 17, 100, 90, 181, 5, 2, 180, 5, 100, 90, 181, 5, 2, 180, 5, 100, 90, 181, 5, 2, 180, 5, 100, 90, 181, 5, 2, 180, 5, 100, 90, 181, 5, 2, 180, 5, 110, 100, 135, 5, 5, 200, 6, 110, 100, 135, 5, 5, 200, 6, 110, 100, 135, 5, 5, 200, 6, 110, 100, 135, 5, 5, 200, 6, 110, 100, 135, 5, 5, 200, 6, 125, 110, 123, 4, 6, 190, 9, 125, 110, 123, 4, 6, 190, 9, 125, 110, 123, 4, 6, 190, 9, 125, 110, 123, 4, 6, 190, 9, 125, 110, 123, 4, 6, 190, 9, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 143, 112, 115, 9, 6, 198, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 162, 122, 119, 10, 9, 158, 15, 2, 65535, 144, 142, 146, 0, 2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46, 50, 54, 58, 62, 66, 70, 74, 78, 82, 86, 90, 94, 98, 102, 106, 110, 114, 118, 122, 126, 130, 134, 138, 142, 146, 150, 154, 158, 162, 166, 170, 174, 178, 182, 186, 190, 194, 198, 202, 206, 210, 214, 218, 222, 226, 230, 234, 238, 242, 246, 250, 254, 258, 262, 266, 270, 274, 278, 282, 286, 290, 294, 298, 304, 308, 312, 316, 320, 324, 328, 332, 336, 340, 346, 350, 354, 360, 364, 368, 374, 378, 384, 388, 394, 400, 404, 410, 416, 420, 426, 432, 438, 444, 452, 458, 464, 472, 478, 486, 494, 500, 510, 518, 526, 534, 542, 552, 560, 568, 578, 586, 596, 604, 614, 624, 632, 642, 652, 662, 672, 682, 692, 704, 714, 726, 736, 748, 758, 770, 782, 794, 806, 820, 834, 846, 860, 874, 888, 904, 920, 936, 952, 970, 988, 1004, 1022, 1040, 1058, 1076, 1094, 1112, 1130, 1148, 1166, 1184, 1202, 1222, 1240, 1258, 1276, 1296, 1314, 1334, 1352, 1372, 1390, 1410, 1428, 1448, 1468, 1488, 1506, 1526, 1546, 1566, 1586, 1606, 1626, 1646, 1668, 1688, 1708, 1730, 1752, 1772, 1794, 1816, 1840, 1862, 1886, 1908, 1932, 1956, 1982, 2006, 2032, 2058, 2084, 2110, 2138, 2166, 2194, 2222, 2250, 2280, 2310, 2340, 2370, 2400, 2430, 2462, 2492, 2524, 2554, 2586, 2618, 2650, 2682, 2714, 2746, 2780, 2812, 2846, 2880, 2914, 2948, 2982, 3018, 3052, 3088, 3124, 3160, 3196, 3232, 3270, 3306, 3344, 3382, 3420, 3460, 3498, 3538, 3578 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4003 (0x4003/Short/22) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x4003
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4003);
				Assert.IsNotNull (entry, "Entry 0x4003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Photo.0x9286 (UserComment/UserComment/264) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "3456"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3456, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "2304"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2304, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "9304"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "3456000/874"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (3456000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (874, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "2304000/582"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (2304000, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (582, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "2898021"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "6632"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (6632, (entry as LongIFDEntry).Value);
			}
			// Image2.0x0100 (ImageWidth/Short/1) "384"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (384, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0101 (ImageLength/Short/1) "256"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (256, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 2");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image2.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0111 (StripOffsets/StripOffsets/1) "2905165"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 2");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image2.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0116 (RowsPerStrip/Short/1) "256"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (256, (entry as ShortIFDEntry).Value);
			}
			// Image2.0x0117 (StripByteCounts/Long/1) "294912"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 2");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (294912, (entry as LongIFDEntry).Value);
			}
			// Image2.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (2, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 2");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image2.0xC5D9 (0xc5d9/Long/1) "2"
			{
				// TODO: Unknown IFD tag: Image2 / 0xC5D9
				var entry = structure.GetEntry (2, (ushort) 0xC5D9);
				Assert.IsNotNull (entry, "Entry 0xC5D9 missing in IFD 2");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "NIKON D90"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D90", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/21) "f-spot version 0.7.1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("f-spot version 0.7.1", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:07:01 22:19:26"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:07:01 22:19:26", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "232"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/450"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (450, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "33/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (33, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (200, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:06:28 20:05:39"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:06:28 20:05:39", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:06:28 20:05:39"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:06:28 20:05:39", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "16/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (16, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "350/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (350, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/9191) "(Value ommitted)"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Nikon3, makernote.MakernoteType);

			// Nikon3.0x0001 (Version/Undefined/4) "48 50 49 48"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Version);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 49, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0002 (ISOSpeed/Short/2) "0 200"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSpeed);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 200 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0004 (Quality/Ascii/8) "FINE   "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("FINE   ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0005 (WhiteBalance/Ascii/13) "AUTO        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0007 (Focus/Ascii/7) "AF-S  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Focus);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AF-S  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0008 (FlashSetting/Ascii/13) "NORMAL      "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashSetting);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NORMAL      ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0009 (FlashDevice/Ascii/20) "                   "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashDevice);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("                   ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x000B (WhiteBalanceBias/SShort/2) "0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalanceBias);
				Assert.IsNotNull (entry, "Entry 0x000B missing in IFD 0");
				Assert.IsNotNull (entry as SShortArrayIFDEntry, "Entry is not a signed short array!");
				Assert.AreEqual (new short [] { 0, 0 }, (entry as SShortArrayIFDEntry).Values);
			}
			// Nikon3.0x000C (WB_RBLevels/Rational/4) "522/256 290/256 256/256 256/256"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WB_RBLevels);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (522, parts[0].Numerator);
				Assert.AreEqual (256, parts[0].Denominator);
				Assert.AreEqual (290, parts[1].Numerator);
				Assert.AreEqual (256, parts[1].Denominator);
				Assert.AreEqual (256, parts[2].Numerator);
				Assert.AreEqual (256, parts[2].Denominator);
				Assert.AreEqual (256, parts[3].Numerator);
				Assert.AreEqual (256, parts[3].Denominator);
			}
			// Nikon3.0x000D (ProgramShift/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ProgramShift);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x000E (ExposureDiff/Undefined/4) "0 1 12 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureDiff);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 12, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0011 (Preview/SubIFD/1) "9210"
			//   --> Removed because we don't parse this one, it's corrupt.
			// Nikon3.0x0012 (FlashComp/Undefined/4) "244 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashComp);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 244, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0013 (ISOSettings/Short/2) "0 200"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSettings);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 200 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0016 (ImageBoundary/Short/4) "0 0 4288 2848"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageBoundary);
				Assert.IsNotNull (entry, "Entry 0x0016 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 4288, 2848 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0017 (0x0017/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown23);
				Assert.IsNotNull (entry, "Entry 0x0017 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0018 (FlashBracketComp/Undefined/4) "0 1 6 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0018 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0019 (ExposureBracketComp/SRational/1) "0/6"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Nikon3.0x001B (CropHiSpeed/Short/7) "0 4352 2868 4352 2868 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.CropHiSpeed);
				Assert.IsNotNull (entry, "Entry 0x001B missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 4352, 2868, 4352, 2868, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x001C (0x001c/Undefined/3) "0 1 6"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x001C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x001C);
				Assert.IsNotNull (entry, "Entry 0x001C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 1, 6 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x001D (SerialNumber/Ascii/8) "6004417"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SerialNumber);
				Assert.IsNotNull (entry, "Entry 0x001D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("6004417", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x001E (ColorSpace/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0x001E missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x0022 (ActiveDLighting/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ActiveDLighting);
				Assert.IsNotNull (entry, "Entry 0x0022 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (65535, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x002C (0x002c/Undefined/94) "48 49 48 48 5 0 1 100 0 236 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x002C
				var entry = makernote_structure.GetEntry (0, (ushort) 0x002C);
				Assert.IsNotNull (entry, "Entry 0x002C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 5, 0, 1, 100, 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0083 (LensType/Byte/1) "6"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x0083 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (6, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0084 (Lens/Rational/4) "350/10 350/10 18/10 18/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Lens);
				Assert.IsNotNull (entry, "Entry 0x0084 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (350, parts[0].Numerator);
				Assert.AreEqual (10, parts[0].Denominator);
				Assert.AreEqual (350, parts[1].Numerator);
				Assert.AreEqual (10, parts[1].Denominator);
				Assert.AreEqual (18, parts[2].Numerator);
				Assert.AreEqual (10, parts[2].Denominator);
				Assert.AreEqual (18, parts[3].Numerator);
				Assert.AreEqual (10, parts[3].Denominator);
			}
			// Nikon3.0x0087 (FlashMode/Byte/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashMode);
				Assert.IsNotNull (entry, "Entry 0x0087 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0089 (ShootingMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x0089 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008A (AutoBracketRelease/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AutoBracketRelease);
				Assert.IsNotNull (entry, "Entry 0x008A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008B (LensFStops/Undefined/4) "88 1 12 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensFStops);
				Assert.IsNotNull (entry, "Entry 0x008B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 88, 1, 12, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0095 (NoiseReduction/Ascii/5) "OFF "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OFF ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0097 (ColorBalance/Undefined/1302) "(Value ommitted)"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorBalance);
				Assert.IsNotNull (entry, "Entry 0x0097 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var parsed_hash = Utils.Md5Encode (parsed_bytes);
				Assert.AreEqual ("7c55759a885d8e977bc21e1a1a4bb011", parsed_hash);
				Assert.AreEqual (1302, parsed_bytes.Length);
			}
			// Nikon3.0x009E (RetouchHistory/Short/10) "0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.RetouchHistory);
				Assert.IsNotNull (entry, "Entry 0x009E missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x00A2 (ImageDataSize/Long/1) "4020390"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageDataSize);
				Assert.IsNotNull (entry, "Entry 0x00A2 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (4020390, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A3 (0x00a3/Byte/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Unknown163);
				Assert.IsNotNull (entry, "Entry 0x00A3 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0, (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x00A7 (ShutterCount/Long/1) "6292"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShutterCount);
				Assert.IsNotNull (entry, "Entry 0x00A7 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (6292, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A8 (FlashInfo/Undefined/22) "48 49 48 51 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashInfo);
				Assert.IsNotNull (entry, "Entry 0x00A8 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 51, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00AB (VariProgram/Ascii/16) "               "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.VariProgram);
				Assert.IsNotNull (entry, "Entry 0x00AB missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("               ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00B0 (MultiExposure/Undefined/16) "48 49 48 48 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.MultiExposure);
				Assert.IsNotNull (entry, "Entry 0x00B0 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B1 (HighISONoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.HighISONoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x00B1 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x00B6 (0x00b6/Undefined/8) "7 218 6 28 20 5 31 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00B6
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00B6);
				Assert.IsNotNull (entry, "Entry 0x00B6 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 7, 218, 6, 28, 20, 5, 31, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B7 (AFInfo2/Undefined/30) "48 49 48 48 0 10 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AFInfo2);
				Assert.IsNotNull (entry, "Entry 0x00B7 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 10, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00B8 (FileInfo/Undefined/172) "48 49 48 48 0 0 0 100 22 226 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FileInfo);
				Assert.IsNotNull (entry, "Entry 0x00B8 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 0, 0, 0, 100, 22, 226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00BB (0x00bb/Undefined/6) "48 49 48 48 255 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00BB
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00BB);
				Assert.IsNotNull (entry, "Entry 0x00BB missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48, 255, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9286 (UserComment/UserComment/8) "charset="Ascii" "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0x9290 (SubSecTime/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "00"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("00", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "4288"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4288, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "2848"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2848, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "10022"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0001 (InteroperabilityIndex/Ascii/4) "R98"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityIndex);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("R98", (entry as StringIFDEntry).Value);
			}
			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 1 2 0 1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 2, 0, 2, 1, 2, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "1/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "52"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (52, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8825 (GPSTag/SubIFD/1) "10052"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD);
				Assert.IsNotNull (entry, "Entry 0x8825 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var gps = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD) as SubIFDEntry;
			Assert.IsNotNull (gps, "GPS tag not found");
			var gps_structure = gps.Structure;

			// GPSInfo.0x0000 (GPSVersionID/Byte/4) "2 2 0 0"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSVersionID);
				Assert.IsNotNull (entry, "Entry 0x0000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				var bytes = new byte [] { 2, 2, 0, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "10176"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "9661"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (9661, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
Esempio n. 24
0
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010E (ImageDescription/Ascii/15) "Communications"
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Image.0x010F (Make/Ascii/9) "FUJIFILM"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("FUJIFILM", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/13) "FinePixS1Pro"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("FinePixS1Pro", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/20) "Adobe Photoshop 7.0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Adobe Photoshop 7.0", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2002:07:19 13:28:10"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2002:07:19 13:28:10", (entry as StringIFDEntry).Value);
			}
			// Image.0x013B (Artist/Ascii/12) "Ian Britton"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Artist);
				Assert.IsNotNull (entry, "Entry 0x013B missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Ian Britton", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0214 (ReferenceBlackWhite/Rational/6) "0/1 255/1 128/1 255/1 128/1 255/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ReferenceBlackWhite);
				Assert.IsNotNull (entry, "Entry 0x0214 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (6, parts.Length);
				Assert.AreEqual (0, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (255, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (128, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (255, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
				Assert.AreEqual (128, parts[4].Numerator);
				Assert.AreEqual (1, parts[4].Denominator);
				Assert.AreEqual (255, parts[5].Numerator);
				Assert.AreEqual (1, parts[5].Denominator);
			}
			// Image.0x8298 (Copyright/Ascii/27) "ian Britton - FreeFoto.com"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Copyright);
				Assert.IsNotNull (entry, "Entry 0x8298 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("ian Britton - FreeFoto.com", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "376"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829D (FNumber/Rational/1) "1074135040/1677721600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1074135040, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1677721600, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "4"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (4, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2002:07:13 15:58:28"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2002:07:13 15:58:28", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2002:07:13 15:58:28"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2002:07:13 15:58:28", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1, 2, 3, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "1275068416/134217728"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (1275068416, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (134217728, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "1610612736/201326592"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1610612736, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (201326592, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9203 (BrightnessValue/SRational/1) "436469760/1677721600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.BrightnessValue);
				Assert.IsNotNull (entry, "Entry 0x9203 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (436469760, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1677721600, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "-1090519041/1677721600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (-1090519041, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1677721600, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "0/16777216"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (0, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Long/1) "2400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2400, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Long/1) "1600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (1600, (entry as LongIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "202178560/16777216"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (202178560, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "202178560/16777216"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (202178560, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (16777216, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Image.0x8825 (GPSTag/SubIFD/1) "776"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD);
				Assert.IsNotNull (entry, "Entry 0x8825 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var gps = structure.GetEntry (0, (ushort) IFDEntryTag.GPSIFD) as SubIFDEntry;
			Assert.IsNotNull (gps, "GPS tag not found");
			var gps_structure = gps.Structure;

			// GPSInfo.0x0000 (GPSVersionID/Byte/4) "2 0 0 0 "
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSVersionID);
				Assert.IsNotNull (entry, "Entry 0x0000 missing in IFD 0");
				Assert.IsNotNull (entry as ByteVectorIFDEntry, "Entry is not a byte array!");
				var bytes = new byte [] { 2, 0, 0, 0 };
				var parsed_bytes = (entry as ByteVectorIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// GPSInfo.0x0001 (GPSLatitudeRef/Ascii/2) "N"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSLatitudeRef);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("N", (entry as StringIFDEntry).Value);
			}
			// GPSInfo.0x0002 (GPSLatitude/Rational/3) "54/1 5938/100 0/1"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSLatitude);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (3, parts.Length);
				Assert.AreEqual (54, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (5938, parts[1].Numerator);
				Assert.AreEqual (100, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
			}
			// GPSInfo.0x0003 (GPSLongitudeRef/Ascii/2) "W"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSLongitudeRef);
				Assert.IsNotNull (entry, "Entry 0x0003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("W", (entry as StringIFDEntry).Value);
			}
			// GPSInfo.0x0004 (GPSLongitude/Rational/3) "1/1 5485/100 0/1"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSLongitude);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (3, parts.Length);
				Assert.AreEqual (1, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (5485, parts[1].Numerator);
				Assert.AreEqual (100, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
			}
			// GPSInfo.0x0007 (GPSTimeStamp/Rational/3) "14/1 58/1 24/1"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSTimeStamp);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (3, parts.Length);
				Assert.AreEqual (14, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (58, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (24, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
			}
			// GPSInfo.0x0012 (GPSMapDatum/Ascii/6) "WGS84"
			{
				var entry = gps_structure.GetEntry (0, (ushort) GPSEntryTag.GPSMapDatum);
				Assert.IsNotNull (entry, "Entry 0x0012 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("WGS84", (entry as StringIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "72/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (72, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "1038"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "3662"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (3662, (entry as LongIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.photoshop.CaptionWriter (XmpText/11) "Ian Britton"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "CaptionWriter");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Ian Britton", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Headline (XmpText/14) "Communications"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Headline");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Communications", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.AuthorsPosition (XmpText/12) "Photographer"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "AuthorsPosition");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Photographer", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Credit (XmpText/11) "Ian Britton"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Credit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Ian Britton", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Source (XmpText/12) "FreeFoto.com"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Source");
				Assert.IsNotNull (node);
				Assert.AreEqual ("FreeFoto.com", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.City (XmpText/1) ""
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "City");
				Assert.IsNotNull (node);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.State (XmpText/1) ""
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "State");
				Assert.IsNotNull (node);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Country (XmpText/14) "Ubited Kingdom"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Country");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Ubited Kingdom", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Category (XmpText/3) "BUS"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Category");
				Assert.IsNotNull (node);
				Assert.AreEqual ("BUS", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.DateCreated (XmpText/10) "2002-06-20"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "DateCreated");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2002-06-20", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.Urgency (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "Urgency");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.SupplementalCategories (XmpBag/1) "Communications"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "SupplementalCategories");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Bag, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("Communications", node.Children [0].Value);
			}
			// Xmp.xmpBJ.JobRef (XmpText/0) "type="Bag""
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_BJ_NS, "JobRef");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Bag, node.Type);
			}
			// Xmp.xmpBJ.JobRef[1] (XmpText/0) "type="Struct""
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_BJ_NS, "JobRef");
				Assert.IsNotNull (node);
				node = node.Children [0];
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Struct, node.Type);
			}
			// Xmp.xmpBJ.JobRef[1]/stJob:name (XmpText/12) "Photographer"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_BJ_NS, "JobRef");
				Assert.IsNotNull (node);
				node = node.Children [0];
				Assert.IsNotNull (node);
				node = node.GetChild (XmpTag.JOB_NS, "name");
				Assert.IsNotNull (node);
				Assert.AreEqual ("Photographer", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmpMM.DocumentID (XmpText/58) "adobe:docid:photoshop:84d4dba8-9b11-11d6-895d-c4d063a70fb0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_MM_NS, "DocumentID");
				Assert.IsNotNull (node);
				Assert.AreEqual ("adobe:docid:photoshop:84d4dba8-9b11-11d6-895d-c4d063a70fb0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmpRights.WebStatement (XmpText/16) "www.freefoto.com"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_RIGHTS_NS, "WebStatement");
				Assert.IsNotNull (node);
				Assert.AreEqual ("www.freefoto.com", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmpRights.Marked (XmpText/4) "True"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_RIGHTS_NS, "Marked");
				Assert.IsNotNull (node);
				Assert.AreEqual ("True", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
			}
			// Xmp.dc.description (LangAlt/1) "lang="x-default" Communications"
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Xmp.dc.creator (XmpSeq/1) "Ian Britton"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "creator");
				Assert.IsNotNull (node);
				Assert.AreEqual (XmpNodeType.Seq, node.Type);
				Assert.AreEqual ("", node.Value);
				Assert.AreEqual (1, node.Children.Count);
				Assert.AreEqual ("Ian Britton", node.Children [0].Value);
			}
			// Xmp.dc.title (LangAlt/1) "lang="x-default" Communications"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "title");
				Assert.IsNotNull (node);
				Assert.AreEqual ("x-default", node.Children [0].GetQualifier (XmpTag.XML_NS, "lang").Value);
				Assert.AreEqual ("Communications", node.Children [0].Value);
			}
			// Xmp.dc.rights (LangAlt/1) "lang="x-default" ian Britton - FreeFoto.com"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.DC_NS, "rights");
				Assert.IsNotNull (node);
				Assert.AreEqual ("x-default", node.Children [0].GetQualifier (XmpTag.XML_NS, "lang").Value);
				Assert.AreEqual ("ian Britton - FreeFoto.com", node.Children [0].Value);
			}
			// Xmp.dc.subject (XmpBag/1) "Communications"
			//  --> Test removed because of KeywordsModificationValidator, value is checked there.

			//  ---------- End of XMP tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x0100 (ImageWidth/Short/1) "66"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (66, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Short/1) "42"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (42, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010E (ImageDescription/Ascii/1) ""
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Image.0x010F (Make/Ascii/6) "Canon"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/23) "Canon EOS 400D DIGITAL"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/42) "125834 126032 126230 126428 126626 126824 127022 127220 127418 127616 127814 128012 128210 128408 128606 128804 129002 129200 129398 129596 129794 129992 130190 130388 130586 130784 130982 131180 131378 131576 131774 131972 132170 132368 132566 132764 132962 133160 133358 133556 133754 133952"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (42, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/42) "198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198 }, (entry as LongArrayIFDEntry).Values);
			}
			// Image.0x011A (XResolution/Rational/1) "734003200/2097152"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (734003200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2097152, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "734003200/2097152"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (734003200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2097152, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/27) "Digital Photo Professional"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Digital Photo Professional", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:01:31 15:16:46"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:31 15:16:46", (entry as StringIFDEntry).Value);
			}
			// Image.0x013B (Artist/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Artist);
				Assert.IsNotNull (entry, "Entry 0x013B missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Image.0x8298 (Copyright/Ascii/1) ""
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Copyright);
				Assert.IsNotNull (entry, "Entry 0x8298 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "122432"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "1/60"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (60, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "50/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (50, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "200"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (200, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 49 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2010:01:31 15:16:46"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:31 15:16:46", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2010:01:31 15:16:46"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:01:31 15:16:46", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9201 (ShutterSpeedValue/SRational/1) "387114/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ShutterSpeedValue);
				Assert.IsNotNull (entry, "Entry 0x9201 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (387114, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9202 (ApertureValue/Rational/1) "304340/65536"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9202 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (304340, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (65536, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9209 (Flash/Short/1) "9"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (9, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "55/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (55, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/2764) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Canon, makernote.MakernoteType);

			// CanonCs.0x0000 (0x0000/Short/1) "94"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (94, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCs.0x0001 (Macro/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCs.0x0002 (Selftimer/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCs.0x0003 (Quality/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCs.0x0004 (FlashMode/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCs.0x0005 (DriveMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCs.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCs.0x0007 (FocusMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCs.0x0008 (0x0008/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCs.0x0009 (0x0009/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCs.0x000A (ImageSize/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCs.0x000B (EasyMode/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonCs.0x000C (DigitalZoom/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonCs.0x000D (Contrast/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonCs.0x000E (Saturation/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonCs.0x000F (Sharpness/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonCs.0x0010 (ISOSpeed/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonCs.0x0011 (MeteringMode/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonCs.0x0012 (FocusType/Short/1) "2"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonCs.0x0013 (AFPoint/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonCs.0x0014 (ExposureProgram/Short/1) "4"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (4, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonCs.0x0015 (0x0015/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonCs.0x0016 (LensType/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonCs.0x0017 (Lens/Short/3) "55 17 1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (55, (entry as ShortArrayIFDEntry).Values [23]);
				Assert.AreEqual (17, (entry as ShortArrayIFDEntry).Values [24]);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonCs.0x001A (MaxAperture/Short/1) "95"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (95, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonCs.0x001B (MinAperture/Short/1) "285"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (285, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonCs.0x001C (FlashActivity/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonCs.0x001D (FlashDetails/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonCs.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonCs.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonCs.0x0020 (FocusContinuous/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// CanonCs.0x0021 (AESetting/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (34 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [33]);
			}
			// CanonCs.0x0022 (ImageStabilization/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (35 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [34]);
			}
			// CanonCs.0x0023 (DisplayAperture/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (36 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [35]);
			}
			// CanonCs.0x0024 (ZoomSourceWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (37 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [36]);
			}
			// CanonCs.0x0025 (ZoomTargetWidth/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (38 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [37]);
			}
			// CanonCs.0x0026 (0x0026/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (39 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [38]);
			}
			// CanonCs.0x0027 (0x0027/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (40 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [39]);
			}
			// CanonCs.0x0028 (PhotoEffect/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (41 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [40]);
			}
			// CanonCs.0x0029 (0x0029/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (42 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [41]);
			}
			// CanonCs.0x002A (ColorTone/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (43 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [42]);
			}
			// CanonCs.0x002B (0x002b/Short/1) "32767"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (44 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (32767, (entry as ShortArrayIFDEntry).Values [43]);
			}
			// CanonCs.0x002C (0x002c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (45 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [44]);
			}
			// CanonCs.0x002D (0x002d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (46 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [45]);
			}
			// CanonCs.0x002E (0x002e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CameraSettings);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (47 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [46]);
			}
			// Canon.0x0002 (FocalLength/Short/4) "2 55 907 605"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 2, 55, 907, 605 }, (entry as ShortArrayIFDEntry).Values);
			}
			// CanonSi.0x0000 (0x0000/Short/1) "66"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (66, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonSi.0x0001 (0x0001/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonSi.0x0002 (ISOSpeed/Short/1) "192"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (192, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonSi.0x0003 (0x0003/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonSi.0x0004 (TargetAperture/Short/1) "149"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (149, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonSi.0x0005 (TargetShutterSpeed/Short/1) "189"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (189, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonSi.0x0006 (0x0006/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonSi.0x0007 (WhiteBalance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonSi.0x0008 (0x0008/Short/1) "3"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (3, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonSi.0x0009 (Sequence/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonSi.0x000A (0x000a/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonSi.0x000B (0x000b/Short/1) "8"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (8, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// CanonSi.0x000C (0x000c/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (13 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [12]);
			}
			// CanonSi.0x000D (0x000d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (14 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [13]);
			}
			// CanonSi.0x000E (AFPointUsed/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (15 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [14]);
			}
			// CanonSi.0x000F (FlashBias/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (16 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [15]);
			}
			// CanonSi.0x0010 (0x0010/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (17 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [16]);
			}
			// CanonSi.0x0011 (0x0011/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (18 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [17]);
			}
			// CanonSi.0x0012 (0x0012/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (19 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [18]);
			}
			// CanonSi.0x0013 (SubjectDistance/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (20 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [19]);
			}
			// CanonSi.0x0014 (0x0014/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (21 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [20]);
			}
			// CanonSi.0x0015 (ApertureValue/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (22 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [21]);
			}
			// CanonSi.0x0016 (ShutterSpeedValue/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (23 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [22]);
			}
			// CanonSi.0x0017 (0x0017/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (24 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [23]);
			}
			// CanonSi.0x0018 (0x0018/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (25 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [24]);
			}
			// CanonSi.0x0019 (0x0019/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (26 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [25]);
			}
			// CanonSi.0x001A (0x001a/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (27 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [26]);
			}
			// CanonSi.0x001B (0x001b/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (28 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [27]);
			}
			// CanonSi.0x001C (0x001c/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (29 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [28]);
			}
			// CanonSi.0x001D (0x001d/Short/1) "65535"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (30 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (65535, (entry as ShortArrayIFDEntry).Values [29]);
			}
			// CanonSi.0x001E (0x001e/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (31 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [30]);
			}
			// CanonSi.0x001F (0x001f/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (32 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [31]);
			}
			// CanonSi.0x0020 (0x0020/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (33 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [32]);
			}
			// Canon.0x0006 (ImageType/Ascii/32) "Canon EOS 400D DIGITAL"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageType);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Canon EOS 400D DIGITAL", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0007 (FirmwareVersion/Ascii/32) "Firmware 1.1.0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.FirmwareVersion);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Firmware 1.1.0", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0008 (ImageNumber/Long/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ImageNumber);
				Assert.IsNotNull (entry, "Entry 0x0008 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (0, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0009 (OwnerName/Ascii/32) "Mike Gemuende"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.OwnerName);
				Assert.IsNotNull (entry, "Entry 0x0009 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Mike Gemuende", (entry as StringIFDEntry).Value);
			}
			// Canon.0x000C (SerialNumber/Long/1) "630363764"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumber);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (630363764, (entry as LongIFDEntry).Value);
			}
			// CanonCf.0x0000 (0x0000/Short/1) "24"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (1 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (24, (entry as ShortArrayIFDEntry).Values [0]);
			}
			// CanonCf.0x0001 (NoiseReduction/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (2 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (0, (entry as ShortArrayIFDEntry).Values [1]);
			}
			// CanonCf.0x0002 (ShutterAeLock/Short/1) "256"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (3 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (256, (entry as ShortArrayIFDEntry).Values [2]);
			}
			// CanonCf.0x0003 (MirrorLockup/Short/1) "512"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (4 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (512, (entry as ShortArrayIFDEntry).Values [3]);
			}
			// CanonCf.0x0004 (ExposureLevelIncrements/Short/1) "768"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (5 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (768, (entry as ShortArrayIFDEntry).Values [4]);
			}
			// CanonCf.0x0005 (AFAssist/Short/1) "1024"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (6 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1024, (entry as ShortArrayIFDEntry).Values [5]);
			}
			// CanonCf.0x0006 (FlashSyncSpeedAv/Short/1) "1280"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (7 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1280, (entry as ShortArrayIFDEntry).Values [6]);
			}
			// CanonCf.0x0007 (AEBSequence/Short/1) "1536"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (8 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1536, (entry as ShortArrayIFDEntry).Values [7]);
			}
			// CanonCf.0x0008 (ShutterCurtainSync/Short/1) "1792"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (9 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (1792, (entry as ShortArrayIFDEntry).Values [8]);
			}
			// CanonCf.0x0009 (LensAFStopButton/Short/1) "2048"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (10 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2048, (entry as ShortArrayIFDEntry).Values [9]);
			}
			// CanonCf.0x000A (FillFlashAutoReduction/Short/1) "2304"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (11 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2304, (entry as ShortArrayIFDEntry).Values [10]);
			}
			// CanonCf.0x000B (MenuButtonReturn/Short/1) "2560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CustomFunctions);
				Assert.IsNotNull (entry, "Entry 0x000F missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.IsTrue (12 <= (entry as ShortArrayIFDEntry).Values.Length);
				Assert.AreEqual (2560, (entry as ShortArrayIFDEntry).Values [11]);
			}
			// Canon.0x0010 (ModelID/Long/1) "2147484214"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ModelID);
				Assert.IsNotNull (entry, "Entry 0x0010 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2147484214, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0015 (0x0015/Long/1) "2684354560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialNumberFormat);
				Assert.IsNotNull (entry, "Entry 0x0015 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (2684354560, (entry as LongIFDEntry).Value);
			}
			// Canon.0x0019 (0x0019/Short/1) "1"
			{
				// TODO: Unknown IFD tag: Canon / 0x0019
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0019);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x0026 (0x0026/Short/48) "96 0 9 9 66 42 66 42 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 65503 65503 65503 65503 65503 65503 65503 65503 65503 21 21 21 21 21 21 21 21 21 16 0 511 65535"
			{
				// TODO: Unknown IFD tag: Canon / 0x0026
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0026);
				Assert.IsNotNull (entry, "Entry 0x0026 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 96, 0, 9, 9, 66, 42, 66, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 65503, 65503, 65503, 65503, 65503, 65503, 65503, 65503, 65503, 21, 21, 21, 21, 21, 21, 21, 21, 21, 16, 0, 511, 65535 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0093 (0x0093/Short/17) "34 44545 144 0 0 0 3 0 0 0 0 0 0 0 0 0 54"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.CanonFileInfo);
				Assert.IsNotNull (entry, "Entry 0x0093 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 34, 44545, 144, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x0095 (0x0095/Ascii/64) "EF-S17-55mm f/2.8 IS USM"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.LensModel);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("EF-S17-55mm f/2.8 IS USM", (entry as StringIFDEntry).Value);
			}
			// Canon.0x0096 (0x0096/Ascii/16) "H0733598"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SerialInfo);
				Assert.IsNotNull (entry, "Entry 0x0096 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("H0733598", (entry as StringIFDEntry).Value);
			}
			// Canon.0x00A0 (0x00a0/Short/14) "28 0 3 0 0 0 0 0 32768 5200 129 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ProcessingInfo);
				Assert.IsNotNull (entry, "Entry 0x00A0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 28, 0, 3, 0, 0, 0, 0, 0, 32768, 5200, 129, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00AA (0x00aa/Short/5) "10 485 1024 1024 649"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.MeasuredColor);
				Assert.IsNotNull (entry, "Entry 0x00AA missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 10, 485, 1024, 1024, 649 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x00B4 (0x00b4/Short/1) "1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0x00B4 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Canon.0x00E0 (0x00e0/Short/17) "34 3948 2622 1 1 52 23 3939 2614 0 0 0 0 0 0 0 0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.SensorInfo);
				Assert.IsNotNull (entry, "Entry 0x00E0 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 34, 3948, 2622, 1, 1, 52, 23, 3939, 2614, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4001 (0x4001/Short/796) "1 863 1024 1024 365 570 1024 1024 525 372 1024 1024 767 224 284 285 101 165 320 320 164 117 345 345 256 0 0 146 143 149 0 427 1030 1024 617 231 48 48 4 422 811 813 124 27 240 239 391 427 1006 1003 609 236 51 51 4 418 785 787 114 29 235 233 390 2668 1024 1024 1378 6430 2668 1024 1024 1378 6430 2666 1023 1024 1378 6430 2341 1024 1024 1560 5200 2731 1024 1024 1304 7000 2539 1024 1024 1419 6000 1689 1102 1102 2606 3200 2000 1043 1043 2189 3769 2341 1024 1024 1560 5189 2781 1024 1024 1367 6689 512 1024 1024 8191 4799 512 1024 1024 8191 4799 512 1024 1024 8191 4799 1613 1052 1052 1823 3689 65155 336 953 10900 65173 344 928 10000 65219 362 867 8300 65268 384 804 7000 65326 413 739 6000 65355 429 708 5600 65390 448 672 5200 65440 479 624 4700 65500 521 572 4200 27 568 523 3800 84 613 481 3500 151 668 433 3200 199 713 403 3000 257 770 369 2800 382 925 305 2400 500 2070 2085 256 255 256 256 20 23 20 21 30 18 17 23 25 22 28 27 26 37 33 39 31 35 37 21 26 26 29 26 29 27 31 41 32 35 34 40 48 58 56 108 24 24 26 25 27 24 32 33 33 29 63 0 55 63 117 152 34 29 29 27 29 40 45 58 67 70 66 58 64 74 66 57 79 36 43 49 54 39 48 46 43 60 56 55 120 120 120 50 64 62 74 55 62 49 55 72 57 57 56 59 180 198 176 276 58 55 59 52 56 47 56 63 59 59 103 0 160 180 310 397 76 64 63 58 61 79 87 110 125 126 115 100 55 63 54 49 67 35 36 45 47 37 45 41 39 53 43 44 100 103 104 48 58 56 65 52 57 48 54 66 51 53 47 47 155 177 160 275 55 53 56 52 55 45 56 57 53 47 90 0 165 183 316 397 78 66 64 58 61 78 85 104 116 118 101 78 61 69 59 46 59 26 30 33 35 24 28 26 23 31 28 25 109 107 103 37 44 42 49 35 38 28 30 38 29 28 26 24 161 170 144 208 39 36 37 32 32 26 29 32 28 30 45 0 133 145 237 295 46 38 37 33 34 40 42 51 55 54 46 37 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 7 9 36 70 4 15 4 12 20 9 21 9 3 6 19 3 20 40 93 486 83 109 69 51 115 25 41 25 11 10 34 2 13 28 92 4670 216 132 117 106 145 34 44 20 8 5 12 0 99 209 1456 33005 644 949 1486 2096 2303 297 215 117 61 48 162 12 144 192 6885 1113 0 1152 1024 1024 2729 3958 7000 1 4001 210 65394 3861 4185 65308 154 4337 4023 3890 4128 65510 65483 65519 3908 3739 3978 65510 31 59 4313 4064 56 17 4487 4218 65502 65474 0 514 512 257 259 0 1 257 259 3082 2305 0 11 1539 1284 8 519 0 0 0 0 0 256 0 27358 0 62069 0 62002 0 39069 1024 1024 5 1024 0 0 0 0 0 8191 512 8191 512 1024 1024 718 433 480 678 387 865 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x4001
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4001);
				Assert.IsNotNull (entry, "Entry 0x4001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 1, 863, 1024, 1024, 365, 570, 1024, 1024, 525, 372, 1024, 1024, 767, 224, 284, 285, 101, 165, 320, 320, 164, 117, 345, 345, 256, 0, 0, 146, 143, 149, 0, 427, 1030, 1024, 617, 231, 48, 48, 4, 422, 811, 813, 124, 27, 240, 239, 391, 427, 1006, 1003, 609, 236, 51, 51, 4, 418, 785, 787, 114, 29, 235, 233, 390, 2668, 1024, 1024, 1378, 6430, 2668, 1024, 1024, 1378, 6430, 2666, 1023, 1024, 1378, 6430, 2341, 1024, 1024, 1560, 5200, 2731, 1024, 1024, 1304, 7000, 2539, 1024, 1024, 1419, 6000, 1689, 1102, 1102, 2606, 3200, 2000, 1043, 1043, 2189, 3769, 2341, 1024, 1024, 1560, 5189, 2781, 1024, 1024, 1367, 6689, 512, 1024, 1024, 8191, 4799, 512, 1024, 1024, 8191, 4799, 512, 1024, 1024, 8191, 4799, 1613, 1052, 1052, 1823, 3689, 65155, 336, 953, 10900, 65173, 344, 928, 10000, 65219, 362, 867, 8300, 65268, 384, 804, 7000, 65326, 413, 739, 6000, 65355, 429, 708, 5600, 65390, 448, 672, 5200, 65440, 479, 624, 4700, 65500, 521, 572, 4200, 27, 568, 523, 3800, 84, 613, 481, 3500, 151, 668, 433, 3200, 199, 713, 403, 3000, 257, 770, 369, 2800, 382, 925, 305, 2400, 500, 2070, 2085, 256, 255, 256, 256, 20, 23, 20, 21, 30, 18, 17, 23, 25, 22, 28, 27, 26, 37, 33, 39, 31, 35, 37, 21, 26, 26, 29, 26, 29, 27, 31, 41, 32, 35, 34, 40, 48, 58, 56, 108, 24, 24, 26, 25, 27, 24, 32, 33, 33, 29, 63, 0, 55, 63, 117, 152, 34, 29, 29, 27, 29, 40, 45, 58, 67, 70, 66, 58, 64, 74, 66, 57, 79, 36, 43, 49, 54, 39, 48, 46, 43, 60, 56, 55, 120, 120, 120, 50, 64, 62, 74, 55, 62, 49, 55, 72, 57, 57, 56, 59, 180, 198, 176, 276, 58, 55, 59, 52, 56, 47, 56, 63, 59, 59, 103, 0, 160, 180, 310, 397, 76, 64, 63, 58, 61, 79, 87, 110, 125, 126, 115, 100, 55, 63, 54, 49, 67, 35, 36, 45, 47, 37, 45, 41, 39, 53, 43, 44, 100, 103, 104, 48, 58, 56, 65, 52, 57, 48, 54, 66, 51, 53, 47, 47, 155, 177, 160, 275, 55, 53, 56, 52, 55, 45, 56, 57, 53, 47, 90, 0, 165, 183, 316, 397, 78, 66, 64, 58, 61, 78, 85, 104, 116, 118, 101, 78, 61, 69, 59, 46, 59, 26, 30, 33, 35, 24, 28, 26, 23, 31, 28, 25, 109, 107, 103, 37, 44, 42, 49, 35, 38, 28, 30, 38, 29, 28, 26, 24, 161, 170, 144, 208, 39, 36, 37, 32, 32, 26, 29, 32, 28, 30, 45, 0, 133, 145, 237, 295, 46, 38, 37, 33, 34, 40, 42, 51, 55, 54, 46, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 36, 70, 4, 15, 4, 12, 20, 9, 21, 9, 3, 6, 19, 3, 20, 40, 93, 486, 83, 109, 69, 51, 115, 25, 41, 25, 11, 10, 34, 2, 13, 28, 92, 4670, 216, 132, 117, 106, 145, 34, 44, 20, 8, 5, 12, 0, 99, 209, 1456, 33005, 644, 949, 1486, 2096, 2303, 297, 215, 117, 61, 48, 162, 12, 144, 192, 6885, 1113, 0, 1152, 1024, 1024, 2729, 3958, 7000, 1, 4001, 210, 65394, 3861, 4185, 65308, 154, 4337, 4023, 3890, 4128, 65510, 65483, 65519, 3908, 3739, 3978, 65510, 31, 59, 4313, 4064, 56, 17, 4487, 4218, 65502, 65474, 0, 514, 512, 257, 259, 0, 1, 257, 259, 3082, 2305, 0, 11, 1539, 1284, 8, 519, 0, 0, 0, 0, 0, 256, 0, 27358, 0, 62069, 0, 62002, 0, 39069, 1024, 1024, 5, 1024, 0, 0, 0, 0, 0, 8191, 512, 8191, 512, 1024, 1024, 718, 433, 480, 678, 387, 865, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4008 (0x4008/Short/3) "129 129 129"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) CanonMakerNoteEntryTag.BlackLevel);
				Assert.IsNotNull (entry, "Entry 0x4008 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 129, 129, 129 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4009 (0x4009/Short/3) "0 0 0"
			{
				// TODO: Unknown IFD tag: Canon / 0x4009
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4009);
				Assert.IsNotNull (entry, "Entry 0x4009 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Canon.0x4010 (0x4010/Ascii/32) ""
			{
				// TODO: Unknown IFD tag: Canon / 0x4010
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4010);
				Assert.IsNotNull (entry, "Entry 0x4010 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("", (entry as StringIFDEntry).Value.Trim ());
			}
			// Canon.0x4011 (0x4011/Undefined/252) "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
			{
				// TODO: Unknown IFD tag: Canon / 0x4011
				var entry = makernote_structure.GetEntry (0, (ushort) 0x4011);
				Assert.IsNotNull (entry, "Entry 0x4011 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9286 (UserComment/UserComment/264) ""
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA20E (FocalPlaneXResolution/Rational/1) "1162161792/262144"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneXResolution);
				Assert.IsNotNull (entry, "Entry 0xA20E missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1162161792, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (262144, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA20F (FocalPlaneYResolution/Rational/1) "1167486720/262144"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneYResolution);
				Assert.IsNotNull (entry, "Entry 0xA20F missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1167486720, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (262144, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA210 (FocalPlaneResolutionUnit/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalPlaneResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0xA210 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8773 (InterColorProfile/Undefined/3140) "0 0 12 68 85 67 67 77 2 64 0 0 109 110 116 114 82 71 66 32 88 89 90 32 7 211 0 4 0 4 0 0 0 0 0 0 97 99 115 112 77 83 70 84 0 0 0 0 67 65 78 79 90 48 48 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 214 0 1 0 0 0 0 211 45 67 65 78 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 114 84 82 67 0 0 1 44 0 0 8 12 103 84 82 67 0 0 1 44 0 0 8 12 98 84 82 67 0 0 1 44 0 0 8 12 114 88 89 90 0 0 9 56 0 0 0 20 103 88 89 90 0 0 9 76 0 0 0 20 98 88 89 90 0 0 9 96 0 0 0 20 99 104 97 100 0 0 9 116 0 0 0 44 99 112 114 116 0 0 9 160 0 0 0 64 100 109 110 100 0 0 9 224 0 0 0 124 100 109 100 100 0 0 10 92 0 0 0 148 119 116 112 116 0 0 10 240 0 0 0 20 116 101 99 104 0 0 11 4 0 0 0 12 100 101 115 99 0 0 10 92 0 0 0 148 117 99 109 73 0 0 11 16 0 0 1 52 99 117 114 118 0 0 0 0 0 0 4 0 0 0 0 4 0 9 0 14 0 19 0 24 0 29 0 34 0 39 0 44 0 49 0 54 0 59 0 64 0 69 0 74 0 79 0 84 0 89 0 94 0 99 0 104 0 109 0 114 0 118 0 123 0 128 0 133 0 138 0 143 0 148 0 153 0 158 0 163 0 168 0 173 0 178 0 183 0 188 0 193 0 198 0 203 0 208 0 213 0 218 0 223 0 229 0 234 0 240 0 245 0 251 1 1 1 6 1 12 1 18 1 24 1 30 1 36 1 43 1 49 1 55 1 62 1 68 1 75 1 82 1 89 1 95 1 102 1 109 1 117 1 124 1 131 1 138 1 146 1 153 1 161 1 169 1 176 1 184 1 192 1 200 1 208 1 216 1 225 1 233 1 241 1 250 2 2 2 11 2 20 2 29 2 38 2 47 2 56 2 65 2 74 2 83 2 93 2 102 2 112 2 122 2 131 2 141 2 151 2 161 2 172 2 182 2 192 2 202 2 213 2 224 2 234 2 245 3 0 3 11 3 22 3 33 3 44 3 55 3 67 3 78 3 90 3 102 3 113 3 125 3 137 3 149 3 161 3 173 3 186 3 198 3 211 3 223 3 236 3 249 4 6 4 19 4 32 4 45 4 58 4 71 4 85 4 98 4 112 4 126 4 140 4 154 4 168 4 182 4 196 4 210 4 225 4 239 4 254 5 13 5 27 5 42 5 57 5 72 5 88 5 103 5 118 5 134 5 149 5 165 5 181 5 197 5 213 5 229 5 245 6 5 6 22 6 38 6 55 6 72 6 88 6 105 6 122 6 139 6 157 6 174 6 191 6 209 6 227 6 244 7 6 7 24 7 42 7 60 7 79 7 97 7 115 7 134 7 153 7 171 7 190 7 209 7 228 7 248 8 11 8 30 8 50 8 69 8 89 8 109 8 129 8 149 8 169 8 190 8 210 8 230 8 251 9 16 9 36 9 57 9 78 9 100 9 121 9 142 9 164 9 185 9 207 9 229 9 251 10 17 10 39 10 61 10 83 10 106 10 128 10 151 10 174 10 197 10 220 10 243 11 10 11 33 11 57 11 80 11 104 11 128 11 152 11 176 11 200 11 224 11 249 12 17 12 42 12 66 12 91 12 116 12 141 12 166 12 192 12 217 12 242 13 12 13 38 13 64 13 90 13 116 13 142 13 168 13 195 13 221 13 248 14 19 14 46 14 73 14 100 14 127 14 154 14 182 14 209 14 237 15 9 15 37 15 65 15 93 15 121 15 150 15 178 15 207 15 236 16 9 16 38 16 67 16 96 16 125 16 155 16 185 16 214 16 244 17 18 17 48 17 78 17 109 17 139 17 170 17 200 17 231 18 6 18 37 18 68 18 100 18 131 18 163 18 194 18 226 19 2 19 34 19 66 19 99 19 131 19 164 19 196 19 229 20 6 20 39 20 72 20 105 20 139 20 172 20 206 20 240 21 17 21 52 21 86 21 120 21 154 21 189 21 223 22 2 22 37 22 72 22 107 22 143 22 178 22 213 22 249 23 29 23 65 23 101 23 137 23 173 23 210 23 246 24 27 24 64 24 101 24 138 24 175 24 212 24 250 25 31 25 69 25 107 25 145 25 183 25 221 26 3 26 42 26 80 26 119 26 158 26 197 26 236 27 19 27 59 27 98 27 138 27 177 27 217 28 1 28 41 28 82 28 122 28 163 28 203 28 244 29 29 29 70 29 111 29 153 29 194 29 236 30 22 30 63 30 105 30 147 30 190 30 232 31 19 31 61 31 104 31 147 31 190 31 233 32 21 32 64 32 108 32 151 32 195 32 239 33 27 33 72 33 116 33 161 33 205 33 250 34 39 34 84 34 129 34 175 34 220 35 10 35 55 35 101 35 147 35 194 35 240 36 30 36 77 36 124 36 170 36 217 37 8 37 56 37 103 37 151 37 198 37 246 38 38 38 86 38 134 38 183 38 231 39 24 39 73 39 121 39 170 39 220 40 13 40 62 40 112 40 162 40 212 41 6 41 56 41 106 41 157 41 207 42 2 42 53 42 104 42 155 42 206 43 1 43 53 43 105 43 157 43 209 44 5 44 57 44 109 44 162 44 215 45 11 45 64 45 117 45 171 45 224 46 22 46 75 46 129 46 183 46 237 47 35 47 90 47 144 47 199 47 254 48 53 48 108 48 163 48 218 49 18 49 74 49 129 49 185 49 241 50 42 50 98 50 155 50 211 51 12 51 69 51 126 51 183 51 241 52 42 52 100 52 158 52 216 53 18 53 76 53 135 53 193 53 252 54 55 54 114 54 173 54 232 55 36 55 95 55 155 55 215 56 19 56 79 56 140 56 200 57 5 57 65 57 126 57 187 57 249 58 54 58 115 58 177 58 239 59 45 59 107 59 169 59 231 60 38 60 101 60 164 60 227 61 34 61 97 61 160 61 224 62 32 62 96 62 160 62 224 63 32 63 97 63 161 63 226 64 35 64 100 64 165 64 231 65 40 65 106 65 172 65 238 66 48 66 114 66 180 66 247 67 58 67 125 67 192 68 3 68 70 68 138 68 205 69 17 69 85 69 153 69 221 70 34 70 102 70 171 70 240 71 53 71 122 71 191 72 5 72 74 72 144 72 214 73 28 73 98 73 169 73 239 74 54 74 125 74 196 75 11 75 82 75 154 75 225 76 41 76 113 76 185 77 2 77 74 77 146 77 219 78 36 78 109 78 182 79 0 79 73 79 147 79 220 80 38 80 112 80 187 81 5 81 80 81 154 81 229 82 48 82 124 82 199 83 18 83 94 83 170 83 246 84 66 84 142 84 219 85 39 85 116 85 193 86 14 86 91 86 169 86 246 87 68 87 146 87 224 88 46 88 124 88 203 89 26 89 104 89 183 90 7 90 86 90 165 90 245 91 69 91 149 91 229 92 53 92 133 92 214 93 39 93 119 93 201 94 26 94 107 94 189 95 14 95 96 95 178 96 4 96 87 96 169 96 252 97 79 97 162 97 245 98 72 98 155 98 239 99 67 99 151 99 235 100 63 100 148 100 232 101 61 101 146 101 231 102 60 102 146 102 231 103 61 103 147 103 233 104 63 104 149 104 236 105 67 105 153 105 240 106 72 106 159 106 247 107 78 107 166 107 254 108 86 108 175 109 7 109 96 109 185 110 17 110 107 110 196 111 29 111 119 111 209 112 43 112 133 112 223 113 58 113 148 113 239 114 74 114 165 115 1 115 92 115 184 116 19 116 111 116 204 117 40 117 132 117 225 118 62 118 155 118 248 119 85 119 179 120 16 120 110 120 204 121 42 121 136 121 231 122 69 122 164 123 3 123 98 123 193 124 33 124 129 124 224 125 64 125 160 126 1 126 97 126 194 127 35 127 132 127 229 128 70 128 168 129 9 129 107 129 205 130 47 130 145 130 244 131 87 131 185 132 28 132 128 132 227 133 70 133 170 134 14 134 114 134 214 135 58 135 159 136 4 136 104 136 205 137 51 137 152 137 254 138 99 138 201 139 47 139 149 139 252 140 98 140 201 141 48 141 151 141 254 142 102 142 205 143 53 143 157 144 5 144 109 144 214 145 63 145 167 146 16 146 121 146 227 147 76 147 182 148 32 148 138 148 244 149 94 149 201 150 51 150 158 151 9 151 117 151 224 152 76 152 183 153 35 153 143 153 251 154 104 154 213 155 65 155 174 156 27 156 137 156 246 157 100 157 210 158 64 158 174 159 28 159 139 159 249 160 104 160 215 161 70 161 182 162 37 162 149 163 5 163 117 163 229 164 86 164 198 165 55 165 168 166 25 166 139 166 252 167 110 167 224 168 82 168 196 169 54 169 169 170 28 170 142 171 2 171 117 171 232 172 92 172 208 173 68 173 184 174 44 174 161 175 21 175 138 175 255 176 116 176 234 177 95 177 213 178 75 178 193 179 55 179 174 180 36 180 155 181 18 181 137 182 1 182 120 182 240 183 104 183 224 184 88 184 209 185 73 185 194 186 59 186 180 187 45 187 167 188 33 188 154 189 20 189 143 190 9 190 132 190 254 191 121 191 244 192 112 192 235 193 103 193 227 194 95 194 219 195 87 195 212 196 81 196 205 197 75 197 200 198 69 198 195 199 65 199 191 200 61 200 187 201 58 201 185 202 56 202 183 203 54 203 181 204 53 204 181 205 53 205 181 206 53 206 182 207 55 207 184 208 57 208 186 209 59 209 189 210 63 210 193 211 67 211 197 212 72 212 203 213 78 213 209 214 84 214 216 215 91 215 223 216 99 216 231 217 108 217 240 218 117 218 250 219 127 220 4 220 138 221 16 221 150 222 28 222 162 223 40 223 175 224 54 224 189 225 68 225 203 226 83 226 218 227 98 227 234 228 115 228 251 229 132 230 13 230 150 231 31 231 168 232 50 232 188 233 70 233 208 234 90 234 229 235 111 235 250 236 133 237 16 237 156 238 39 238 179 239 63 239 203 240 88 240 228 241 113 241 254 242 139 243 25 243 166 244 52 244 194 245 80 245 222 246 108 246 251 247 138 248 25 248 168 249 55 249 199 250 87 250 231 251 119 252 7 252 152 253 40 253 185 254 74 254 219 255 109 255 255 88 89 90 32 0 0 0 0 0 0 111 160 0 0 56 242 0 0 3 143 88 89 90 32 0 0 0 0 0 0 98 150 0 0 183 138 0 0 24 218 88 89 90 32 0 0 0 0 0 0 36 160 0 0 15 133 0 0 182 196 115 102 51 50 0 0 0 0 0 1 12 63 0 0 5 220 255 255 243 39 0 0 7 144 0 0 253 146 255 255 251 162 255 255 253 163 0 0 3 220 0 0 192 113 116 101 120 116 0 0 0 0 67 111 112 121 114 105 103 104 116 32 40 99 41 32 50 48 48 51 44 32 67 97 110 111 110 32 73 110 99 46 32 32 65 108 108 32 114 105 103 104 116 115 32 114 101 115 101 114 118 101 100 46 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 11 67 97 110 111 110 32 73 110 99 46 0 0 0 0 0 0 0 0 10 0 67 0 97 0 110 0 111 0 110 0 32 0 73 0 110 0 99 0 46 0 0 11 67 97 110 111 110 32 73 110 99 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 101 115 99 0 0 0 0 0 0 0 19 115 82 71 66 32 118 49 46 51 49 32 40 67 97 110 111 110 41 0 0 0 0 0 0 0 0 18 0 115 0 82 0 71 0 66 0 32 0 118 0 49 0 46 0 51 0 49 0 32 0 40 0 67 0 97 0 110 0 111 0 110 0 41 0 0 19 115 82 71 66 32 118 49 46 51 49 32 40 67 97 110 111 110 41 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 89 90 32 0 0 0 0 0 0 246 214 0 1 0 0 0 0 211 45 115 105 103 32 0 0 0 0 67 82 84 32 117 99 109 73 67 83 73 71 0 0 1 40 1 8 0 0 1 8 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 86 73 84 32 76 97 98 111 114 97 116 111 114 121 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 73 78 67 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 243 84 0 1 0 0 0 1 22 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 1 0 1 0 0 0 0 0 1 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ICCProfile);
				Assert.IsNotNull (entry, "Entry 0x8773 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 12, 68, 85, 67, 67, 77, 2, 64, 0, 0, 109, 110, 116, 114, 82, 71, 66, 32, 88, 89, 90, 32, 7, 211, 0, 4, 0, 4, 0, 0, 0, 0, 0, 0, 97, 99, 115, 112, 77, 83, 70, 84, 0, 0, 0, 0, 67, 65, 78, 79, 90, 48, 48, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 67, 65, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 114, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 103, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 98, 84, 82, 67, 0, 0, 1, 44, 0, 0, 8, 12, 114, 88, 89, 90, 0, 0, 9, 56, 0, 0, 0, 20, 103, 88, 89, 90, 0, 0, 9, 76, 0, 0, 0, 20, 98, 88, 89, 90, 0, 0, 9, 96, 0, 0, 0, 20, 99, 104, 97, 100, 0, 0, 9, 116, 0, 0, 0, 44, 99, 112, 114, 116, 0, 0, 9, 160, 0, 0, 0, 64, 100, 109, 110, 100, 0, 0, 9, 224, 0, 0, 0, 124, 100, 109, 100, 100, 0, 0, 10, 92, 0, 0, 0, 148, 119, 116, 112, 116, 0, 0, 10, 240, 0, 0, 0, 20, 116, 101, 99, 104, 0, 0, 11, 4, 0, 0, 0, 12, 100, 101, 115, 99, 0, 0, 10, 92, 0, 0, 0, 148, 117, 99, 109, 73, 0, 0, 11, 16, 0, 0, 1, 52, 99, 117, 114, 118, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 4, 0, 9, 0, 14, 0, 19, 0, 24, 0, 29, 0, 34, 0, 39, 0, 44, 0, 49, 0, 54, 0, 59, 0, 64, 0, 69, 0, 74, 0, 79, 0, 84, 0, 89, 0, 94, 0, 99, 0, 104, 0, 109, 0, 114, 0, 118, 0, 123, 0, 128, 0, 133, 0, 138, 0, 143, 0, 148, 0, 153, 0, 158, 0, 163, 0, 168, 0, 173, 0, 178, 0, 183, 0, 188, 0, 193, 0, 198, 0, 203, 0, 208, 0, 213, 0, 218, 0, 223, 0, 229, 0, 234, 0, 240, 0, 245, 0, 251, 1, 1, 1, 6, 1, 12, 1, 18, 1, 24, 1, 30, 1, 36, 1, 43, 1, 49, 1, 55, 1, 62, 1, 68, 1, 75, 1, 82, 1, 89, 1, 95, 1, 102, 1, 109, 1, 117, 1, 124, 1, 131, 1, 138, 1, 146, 1, 153, 1, 161, 1, 169, 1, 176, 1, 184, 1, 192, 1, 200, 1, 208, 1, 216, 1, 225, 1, 233, 1, 241, 1, 250, 2, 2, 2, 11, 2, 20, 2, 29, 2, 38, 2, 47, 2, 56, 2, 65, 2, 74, 2, 83, 2, 93, 2, 102, 2, 112, 2, 122, 2, 131, 2, 141, 2, 151, 2, 161, 2, 172, 2, 182, 2, 192, 2, 202, 2, 213, 2, 224, 2, 234, 2, 245, 3, 0, 3, 11, 3, 22, 3, 33, 3, 44, 3, 55, 3, 67, 3, 78, 3, 90, 3, 102, 3, 113, 3, 125, 3, 137, 3, 149, 3, 161, 3, 173, 3, 186, 3, 198, 3, 211, 3, 223, 3, 236, 3, 249, 4, 6, 4, 19, 4, 32, 4, 45, 4, 58, 4, 71, 4, 85, 4, 98, 4, 112, 4, 126, 4, 140, 4, 154, 4, 168, 4, 182, 4, 196, 4, 210, 4, 225, 4, 239, 4, 254, 5, 13, 5, 27, 5, 42, 5, 57, 5, 72, 5, 88, 5, 103, 5, 118, 5, 134, 5, 149, 5, 165, 5, 181, 5, 197, 5, 213, 5, 229, 5, 245, 6, 5, 6, 22, 6, 38, 6, 55, 6, 72, 6, 88, 6, 105, 6, 122, 6, 139, 6, 157, 6, 174, 6, 191, 6, 209, 6, 227, 6, 244, 7, 6, 7, 24, 7, 42, 7, 60, 7, 79, 7, 97, 7, 115, 7, 134, 7, 153, 7, 171, 7, 190, 7, 209, 7, 228, 7, 248, 8, 11, 8, 30, 8, 50, 8, 69, 8, 89, 8, 109, 8, 129, 8, 149, 8, 169, 8, 190, 8, 210, 8, 230, 8, 251, 9, 16, 9, 36, 9, 57, 9, 78, 9, 100, 9, 121, 9, 142, 9, 164, 9, 185, 9, 207, 9, 229, 9, 251, 10, 17, 10, 39, 10, 61, 10, 83, 10, 106, 10, 128, 10, 151, 10, 174, 10, 197, 10, 220, 10, 243, 11, 10, 11, 33, 11, 57, 11, 80, 11, 104, 11, 128, 11, 152, 11, 176, 11, 200, 11, 224, 11, 249, 12, 17, 12, 42, 12, 66, 12, 91, 12, 116, 12, 141, 12, 166, 12, 192, 12, 217, 12, 242, 13, 12, 13, 38, 13, 64, 13, 90, 13, 116, 13, 142, 13, 168, 13, 195, 13, 221, 13, 248, 14, 19, 14, 46, 14, 73, 14, 100, 14, 127, 14, 154, 14, 182, 14, 209, 14, 237, 15, 9, 15, 37, 15, 65, 15, 93, 15, 121, 15, 150, 15, 178, 15, 207, 15, 236, 16, 9, 16, 38, 16, 67, 16, 96, 16, 125, 16, 155, 16, 185, 16, 214, 16, 244, 17, 18, 17, 48, 17, 78, 17, 109, 17, 139, 17, 170, 17, 200, 17, 231, 18, 6, 18, 37, 18, 68, 18, 100, 18, 131, 18, 163, 18, 194, 18, 226, 19, 2, 19, 34, 19, 66, 19, 99, 19, 131, 19, 164, 19, 196, 19, 229, 20, 6, 20, 39, 20, 72, 20, 105, 20, 139, 20, 172, 20, 206, 20, 240, 21, 17, 21, 52, 21, 86, 21, 120, 21, 154, 21, 189, 21, 223, 22, 2, 22, 37, 22, 72, 22, 107, 22, 143, 22, 178, 22, 213, 22, 249, 23, 29, 23, 65, 23, 101, 23, 137, 23, 173, 23, 210, 23, 246, 24, 27, 24, 64, 24, 101, 24, 138, 24, 175, 24, 212, 24, 250, 25, 31, 25, 69, 25, 107, 25, 145, 25, 183, 25, 221, 26, 3, 26, 42, 26, 80, 26, 119, 26, 158, 26, 197, 26, 236, 27, 19, 27, 59, 27, 98, 27, 138, 27, 177, 27, 217, 28, 1, 28, 41, 28, 82, 28, 122, 28, 163, 28, 203, 28, 244, 29, 29, 29, 70, 29, 111, 29, 153, 29, 194, 29, 236, 30, 22, 30, 63, 30, 105, 30, 147, 30, 190, 30, 232, 31, 19, 31, 61, 31, 104, 31, 147, 31, 190, 31, 233, 32, 21, 32, 64, 32, 108, 32, 151, 32, 195, 32, 239, 33, 27, 33, 72, 33, 116, 33, 161, 33, 205, 33, 250, 34, 39, 34, 84, 34, 129, 34, 175, 34, 220, 35, 10, 35, 55, 35, 101, 35, 147, 35, 194, 35, 240, 36, 30, 36, 77, 36, 124, 36, 170, 36, 217, 37, 8, 37, 56, 37, 103, 37, 151, 37, 198, 37, 246, 38, 38, 38, 86, 38, 134, 38, 183, 38, 231, 39, 24, 39, 73, 39, 121, 39, 170, 39, 220, 40, 13, 40, 62, 40, 112, 40, 162, 40, 212, 41, 6, 41, 56, 41, 106, 41, 157, 41, 207, 42, 2, 42, 53, 42, 104, 42, 155, 42, 206, 43, 1, 43, 53, 43, 105, 43, 157, 43, 209, 44, 5, 44, 57, 44, 109, 44, 162, 44, 215, 45, 11, 45, 64, 45, 117, 45, 171, 45, 224, 46, 22, 46, 75, 46, 129, 46, 183, 46, 237, 47, 35, 47, 90, 47, 144, 47, 199, 47, 254, 48, 53, 48, 108, 48, 163, 48, 218, 49, 18, 49, 74, 49, 129, 49, 185, 49, 241, 50, 42, 50, 98, 50, 155, 50, 211, 51, 12, 51, 69, 51, 126, 51, 183, 51, 241, 52, 42, 52, 100, 52, 158, 52, 216, 53, 18, 53, 76, 53, 135, 53, 193, 53, 252, 54, 55, 54, 114, 54, 173, 54, 232, 55, 36, 55, 95, 55, 155, 55, 215, 56, 19, 56, 79, 56, 140, 56, 200, 57, 5, 57, 65, 57, 126, 57, 187, 57, 249, 58, 54, 58, 115, 58, 177, 58, 239, 59, 45, 59, 107, 59, 169, 59, 231, 60, 38, 60, 101, 60, 164, 60, 227, 61, 34, 61, 97, 61, 160, 61, 224, 62, 32, 62, 96, 62, 160, 62, 224, 63, 32, 63, 97, 63, 161, 63, 226, 64, 35, 64, 100, 64, 165, 64, 231, 65, 40, 65, 106, 65, 172, 65, 238, 66, 48, 66, 114, 66, 180, 66, 247, 67, 58, 67, 125, 67, 192, 68, 3, 68, 70, 68, 138, 68, 205, 69, 17, 69, 85, 69, 153, 69, 221, 70, 34, 70, 102, 70, 171, 70, 240, 71, 53, 71, 122, 71, 191, 72, 5, 72, 74, 72, 144, 72, 214, 73, 28, 73, 98, 73, 169, 73, 239, 74, 54, 74, 125, 74, 196, 75, 11, 75, 82, 75, 154, 75, 225, 76, 41, 76, 113, 76, 185, 77, 2, 77, 74, 77, 146, 77, 219, 78, 36, 78, 109, 78, 182, 79, 0, 79, 73, 79, 147, 79, 220, 80, 38, 80, 112, 80, 187, 81, 5, 81, 80, 81, 154, 81, 229, 82, 48, 82, 124, 82, 199, 83, 18, 83, 94, 83, 170, 83, 246, 84, 66, 84, 142, 84, 219, 85, 39, 85, 116, 85, 193, 86, 14, 86, 91, 86, 169, 86, 246, 87, 68, 87, 146, 87, 224, 88, 46, 88, 124, 88, 203, 89, 26, 89, 104, 89, 183, 90, 7, 90, 86, 90, 165, 90, 245, 91, 69, 91, 149, 91, 229, 92, 53, 92, 133, 92, 214, 93, 39, 93, 119, 93, 201, 94, 26, 94, 107, 94, 189, 95, 14, 95, 96, 95, 178, 96, 4, 96, 87, 96, 169, 96, 252, 97, 79, 97, 162, 97, 245, 98, 72, 98, 155, 98, 239, 99, 67, 99, 151, 99, 235, 100, 63, 100, 148, 100, 232, 101, 61, 101, 146, 101, 231, 102, 60, 102, 146, 102, 231, 103, 61, 103, 147, 103, 233, 104, 63, 104, 149, 104, 236, 105, 67, 105, 153, 105, 240, 106, 72, 106, 159, 106, 247, 107, 78, 107, 166, 107, 254, 108, 86, 108, 175, 109, 7, 109, 96, 109, 185, 110, 17, 110, 107, 110, 196, 111, 29, 111, 119, 111, 209, 112, 43, 112, 133, 112, 223, 113, 58, 113, 148, 113, 239, 114, 74, 114, 165, 115, 1, 115, 92, 115, 184, 116, 19, 116, 111, 116, 204, 117, 40, 117, 132, 117, 225, 118, 62, 118, 155, 118, 248, 119, 85, 119, 179, 120, 16, 120, 110, 120, 204, 121, 42, 121, 136, 121, 231, 122, 69, 122, 164, 123, 3, 123, 98, 123, 193, 124, 33, 124, 129, 124, 224, 125, 64, 125, 160, 126, 1, 126, 97, 126, 194, 127, 35, 127, 132, 127, 229, 128, 70, 128, 168, 129, 9, 129, 107, 129, 205, 130, 47, 130, 145, 130, 244, 131, 87, 131, 185, 132, 28, 132, 128, 132, 227, 133, 70, 133, 170, 134, 14, 134, 114, 134, 214, 135, 58, 135, 159, 136, 4, 136, 104, 136, 205, 137, 51, 137, 152, 137, 254, 138, 99, 138, 201, 139, 47, 139, 149, 139, 252, 140, 98, 140, 201, 141, 48, 141, 151, 141, 254, 142, 102, 142, 205, 143, 53, 143, 157, 144, 5, 144, 109, 144, 214, 145, 63, 145, 167, 146, 16, 146, 121, 146, 227, 147, 76, 147, 182, 148, 32, 148, 138, 148, 244, 149, 94, 149, 201, 150, 51, 150, 158, 151, 9, 151, 117, 151, 224, 152, 76, 152, 183, 153, 35, 153, 143, 153, 251, 154, 104, 154, 213, 155, 65, 155, 174, 156, 27, 156, 137, 156, 246, 157, 100, 157, 210, 158, 64, 158, 174, 159, 28, 159, 139, 159, 249, 160, 104, 160, 215, 161, 70, 161, 182, 162, 37, 162, 149, 163, 5, 163, 117, 163, 229, 164, 86, 164, 198, 165, 55, 165, 168, 166, 25, 166, 139, 166, 252, 167, 110, 167, 224, 168, 82, 168, 196, 169, 54, 169, 169, 170, 28, 170, 142, 171, 2, 171, 117, 171, 232, 172, 92, 172, 208, 173, 68, 173, 184, 174, 44, 174, 161, 175, 21, 175, 138, 175, 255, 176, 116, 176, 234, 177, 95, 177, 213, 178, 75, 178, 193, 179, 55, 179, 174, 180, 36, 180, 155, 181, 18, 181, 137, 182, 1, 182, 120, 182, 240, 183, 104, 183, 224, 184, 88, 184, 209, 185, 73, 185, 194, 186, 59, 186, 180, 187, 45, 187, 167, 188, 33, 188, 154, 189, 20, 189, 143, 190, 9, 190, 132, 190, 254, 191, 121, 191, 244, 192, 112, 192, 235, 193, 103, 193, 227, 194, 95, 194, 219, 195, 87, 195, 212, 196, 81, 196, 205, 197, 75, 197, 200, 198, 69, 198, 195, 199, 65, 199, 191, 200, 61, 200, 187, 201, 58, 201, 185, 202, 56, 202, 183, 203, 54, 203, 181, 204, 53, 204, 181, 205, 53, 205, 181, 206, 53, 206, 182, 207, 55, 207, 184, 208, 57, 208, 186, 209, 59, 209, 189, 210, 63, 210, 193, 211, 67, 211, 197, 212, 72, 212, 203, 213, 78, 213, 209, 214, 84, 214, 216, 215, 91, 215, 223, 216, 99, 216, 231, 217, 108, 217, 240, 218, 117, 218, 250, 219, 127, 220, 4, 220, 138, 221, 16, 221, 150, 222, 28, 222, 162, 223, 40, 223, 175, 224, 54, 224, 189, 225, 68, 225, 203, 226, 83, 226, 218, 227, 98, 227, 234, 228, 115, 228, 251, 229, 132, 230, 13, 230, 150, 231, 31, 231, 168, 232, 50, 232, 188, 233, 70, 233, 208, 234, 90, 234, 229, 235, 111, 235, 250, 236, 133, 237, 16, 237, 156, 238, 39, 238, 179, 239, 63, 239, 203, 240, 88, 240, 228, 241, 113, 241, 254, 242, 139, 243, 25, 243, 166, 244, 52, 244, 194, 245, 80, 245, 222, 246, 108, 246, 251, 247, 138, 248, 25, 248, 168, 249, 55, 249, 199, 250, 87, 250, 231, 251, 119, 252, 7, 252, 152, 253, 40, 253, 185, 254, 74, 254, 219, 255, 109, 255, 255, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 111, 160, 0, 0, 56, 242, 0, 0, 3, 143, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 98, 150, 0, 0, 183, 138, 0, 0, 24, 218, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 36, 160, 0, 0, 15, 133, 0, 0, 182, 196, 115, 102, 51, 50, 0, 0, 0, 0, 0, 1, 12, 63, 0, 0, 5, 220, 255, 255, 243, 39, 0, 0, 7, 144, 0, 0, 253, 146, 255, 255, 251, 162, 255, 255, 253, 163, 0, 0, 3, 220, 0, 0, 192, 113, 116, 101, 120, 116, 0, 0, 0, 0, 67, 111, 112, 121, 114, 105, 103, 104, 116, 32, 40, 99, 41, 32, 50, 48, 48, 51, 44, 32, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 32, 32, 65, 108, 108, 32, 114, 105, 103, 104, 116, 115, 32, 114, 101, 115, 101, 114, 118, 101, 100, 46, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 11, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 67, 0, 97, 0, 110, 0, 111, 0, 110, 0, 32, 0, 73, 0, 110, 0, 99, 0, 46, 0, 0, 11, 67, 97, 110, 111, 110, 32, 73, 110, 99, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 19, 115, 82, 71, 66, 32, 118, 49, 46, 51, 49, 32, 40, 67, 97, 110, 111, 110, 41, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 115, 0, 82, 0, 71, 0, 66, 0, 32, 0, 118, 0, 49, 0, 46, 0, 51, 0, 49, 0, 32, 0, 40, 0, 67, 0, 97, 0, 110, 0, 111, 0, 110, 0, 41, 0, 0, 19, 115, 82, 71, 66, 32, 118, 49, 46, 51, 49, 32, 40, 67, 97, 110, 111, 110, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 115, 105, 103, 32, 0, 0, 0, 0, 67, 82, 84, 32, 117, 99, 109, 73, 67, 83, 73, 71, 0, 0, 1, 40, 1, 8, 0, 0, 1, 8, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 73, 84, 32, 76, 97, 98, 111, 114, 97, 116, 111, 114, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 73, 78, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 84, 0, 1, 0, 0, 0, 1, 22, 207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0100 (ImageWidth/Short/1) "252"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (252, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0101 (ImageLength/Short/1) "160"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (160, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 1");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0111 (StripOffsets/StripOffsets/160) "8 764 1520 2276 3032 3788 4544 5300 6056 6812 7568 8324 9080 9836 10592 11348 12104 12860 13616 14372 15128 15884 16640 17396 18152 18908 19664 20420 21176 21932 22688 23444 24200 24956 25712 26468 27224 27980 28736 29492 30248 31004 31760 32516 33272 34028 34784 35540 36296 37052 37808 38564 39320 40076 40832 41588 42344 43100 43856 44612 45368 46124 46880 47636 48392 49148 49904 50660 51416 52172 52928 53684 54440 55196 55952 56708 57464 58220 58976 59732 60488 61244 62000 62756 63512 64268 65024 65780 66536 67292 68048 68804 69560 70316 71072 71828 72584 73340 74096 74852 75608 76364 77120 77876 78632 79388 80144 80900 81656 82412 83168 83924 84680 85436 86192 86948 87704 88460 89216 89972 90728 91484 92240 92996 93752 94508 95264 96020 96776 97532 98288 99044 99800 100556 101312 102068 102824 103580 104336 105092 105848 106604 107360 108116 108872 109628 110384 111140 111896 112652 113408 114164 114920 115676 116432 117188 117944 118700 119456 120212"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 1");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (160, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Thumbnail.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0116 (RowsPerStrip/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0117 (StripByteCounts/Long/160) "756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756 756"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 1");
				Assert.IsNotNull (entry as LongArrayIFDEntry, "Entry is not a long array!");
				Assert.AreEqual (new long [] { 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756, 756 }, (entry as LongArrayIFDEntry).Values);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "734003200/2097152"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (734003200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2097152, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "734003200/2097152"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (734003200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (2097152, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/11) "NIKON D70s"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D70s", (entry as StringIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "150/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (150, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "150/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (150, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/17) "Bibble 5 Pro 5.0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Bibble 5 Pro 5.0", (entry as StringIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x010F (0x010f/Ascii/18) "NIKON CORPORATION"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0110 (0x0110/Ascii/11) "NIKON D70s"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D70s", (entry as StringIFDEntry).Value);
			}
			// Photo.0x0132 (0x0132/Ascii/20) "2010:02:03 11:02:18"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:03 11:02:18", (entry as StringIFDEntry).Value);
			}
			// Photo.0x829A (ExposureTime/Rational/1) "10/7500"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (7500, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "13/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (13, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "1600"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1600, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2007:02:15 17:07:48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2007:02:15 17:07:48", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2007:02:15 17:07:48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2007:02:15 17:07:48", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "50/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (50, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "50/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (50, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9290 (SubSecTime/Ascii/4) "889"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("889", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/4) "800"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("800", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/4) "800"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("800", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "75"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (75, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------


			//  ---------- Start of XMP tests ----------

			XmpTag xmp = file.GetTag (TagTypes.XMP) as XmpTag;
			// Xmp.tiff.Model (XmpText/10) "NIKON D70s"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Model");
				Assert.IsNotNull (node);
				Assert.AreEqual ("NIKON D70s", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.Make (XmpText/17) "NIKON CORPORATION"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "Make");
				Assert.IsNotNull (node);
				Assert.AreEqual ("NIKON CORPORATION", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageWidth (XmpText/4) "3024"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageWidth");
				Assert.IsNotNull (node);
				Assert.AreEqual ("3024", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ImageLength (XmpText/4) "1998"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ImageLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1998", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.FNumber (XmpText/6) "130/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "FNumber");
				Assert.IsNotNull (node);
				Assert.AreEqual ("130/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.XResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "XResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.YResolution (XmpText/5) "150/1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "YResolution");
				Assert.IsNotNull (node);
				Assert.AreEqual ("150/1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.tiff.ResolutionUnit (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.TIFF_NS, "ResolutionUnit");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureProgram (XmpText/1) "2"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureProgram");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MeteringMode (XmpText/1) "5"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MeteringMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("5", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.LightSource (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "LightSource");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureMode (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureMode");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.WhiteBalance (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "WhiteBalance");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLengthIn35mmFilm (XmpText/2) "75"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLengthIn35mmFilm");
				Assert.IsNotNull (node);
				Assert.AreEqual ("75", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.SceneCaptureType (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "SceneCaptureType");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Contrast (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Contrast");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Saturation (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Saturation");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.Sharpness (XmpText/1) "1"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "Sharpness");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.SubjectDistanceRange (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "SubjectDistanceRange");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ISOSpeedRating (XmpText/4) "1600"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ISOSpeedRating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("1600", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.MaxApertureValue (XmpText/5) "50/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "MaxApertureValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("50/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureTime (XmpText/7) "10/7500"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureTime");
				Assert.IsNotNull (node);
				Assert.AreEqual ("10/7500", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.ExposureBiasValue (XmpText/3) "0/6"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "ExposureBiasValue");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0/6", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.exif.FocalLength (XmpText/6) "500/10"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.EXIF_NS, "FocalLength");
				Assert.IsNotNull (node);
				Assert.AreEqual ("500/10", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.photoshop.DateCreated (XmpText/24) "2007-02-15T17:07:48.800Z"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.PHOTOSHOP_NS, "DateCreated");
				Assert.IsNotNull (node);
				Assert.AreEqual ("2007-02-15T17:07:48.800Z", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}
			// Xmp.xmp.Rating (XmpText/1) "0"
			{
				var node = xmp.NodeTree;
				node = node.GetChild (XmpTag.XAP_NS, "Rating");
				Assert.IsNotNull (node);
				Assert.AreEqual ("0", node.Value);
				Assert.AreEqual (XmpNodeType.Simple, node.Type);
				Assert.AreEqual (0, node.Children.Count);
			}

			//  ---------- End of XMP tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x0100 (ImageWidth/Long/1) "320"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (320, (entry as LongIFDEntry).Value);
			}
			// Image.0x0101 (ImageLength/Long/1) "213"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (213, (entry as LongIFDEntry).Value);
			}
			// Image.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Image.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/11) "NIKON D70s"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D70s", (entry as StringIFDEntry).Value);
			}
			// Image.0x0111 (StripOffsets/StripOffsets/1) "88388"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 0");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0116 (RowsPerStrip/Long/1) "213"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (213, (entry as LongIFDEntry).Value);
			}
			// Image.0x0117 (StripByteCounts/Long/1) "204480"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (204480, (entry as LongIFDEntry).Value);
			}
			// Image.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/13) "ViewNX 1.5 W"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("ViewNX 1.5 W", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2010:02:03 10:35:55"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2010:02:03 10:35:55", (entry as StringIFDEntry).Value);
			}
			// Image.0x0214 (ReferenceBlackWhite/Rational/6) "0/1 255/1 0/1 255/1 0/1 255/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ReferenceBlackWhite);
				Assert.IsNotNull (entry, "Entry 0x0214 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (6, parts.Length);
				Assert.AreEqual (0, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (255, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (0, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (255, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
				Assert.AreEqual (0, parts[4].Numerator);
				Assert.AreEqual (1, parts[4].Denominator);
				Assert.AreEqual (255, parts[5].Numerator);
				Assert.AreEqual (1, parts[5].Denominator);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "9036"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "4/3000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (3000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "67/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (67, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 50, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:10:10 12:21:31"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:10:10 12:21:31", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:10:10 12:21:31"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:10:10 12:21:31", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "0/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "5/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (5, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "200/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x927C (MakerNote/MakerNote/5566) ""
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote);
				Assert.IsNotNull (entry, "Entry 0x927C missing in IFD 0");
				Assert.IsNotNull (entry as MakernoteIFDEntry, "Entry is not a makernote IFD!");
			}

			var makernote = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MakerNote) as MakernoteIFDEntry;
			Assert.IsNotNull (makernote, "MakerNote tag not found");
			var makernote_structure = makernote.Structure;


			Assert.AreEqual (MakernoteType.Nikon3, makernote.MakernoteType);

			// Nikon3.0x0001 (Version/Undefined/4) "48 50 49 48 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Version);
				Assert.IsNotNull (entry, "Entry 0x0001 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 50, 49, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0002 (ISOSpeed/Short/2) "0 200"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSpeed);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 200 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0004 (Quality/Ascii/8) "RAW    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Quality);
				Assert.IsNotNull (entry, "Entry 0x0004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("RAW    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0005 (WhiteBalance/Ascii/13) "AUTO        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0x0005 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0006 (Sharpening/Ascii/7) "NONE  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Sharpening);
				Assert.IsNotNull (entry, "Entry 0x0006 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NONE  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0007 (Focus/Ascii/7) "AF-S  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Focus);
				Assert.IsNotNull (entry, "Entry 0x0007 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AF-S  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x000B (WhiteBalanceBias/SShort/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WhiteBalanceBias);
				Assert.IsNotNull (entry, "Entry 0x000B missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (0, (entry as SShortIFDEntry).Value);
			}
			// Nikon3.0x000C (ColorBalance1/Rational/4) "19453125/10000000 170703125/100000000 1/1 1/1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.WB_RBLevels);
				Assert.IsNotNull (entry, "Entry 0x000C missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (19453125, parts[0].Numerator);
				Assert.AreEqual (10000000, parts[0].Denominator);
				Assert.AreEqual (170703125, parts[1].Numerator);
				Assert.AreEqual (100000000, parts[1].Denominator);
				Assert.AreEqual (1, parts[2].Numerator);
				Assert.AreEqual (1, parts[2].Denominator);
				Assert.AreEqual (1, parts[3].Numerator);
				Assert.AreEqual (1, parts[3].Denominator);
			}
			// Nikon3.0x000D (ProgramShift/Undefined/4) "0 1 6 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ProgramShift);
				Assert.IsNotNull (entry, "Entry 0x000D missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 6, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x000E (ExposureDiff/Undefined/4) "0 1 12 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureDiff);
				Assert.IsNotNull (entry, "Entry 0x000E missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 1, 12, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0011 (Preview/SubIFD/1) "5560"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview);
				Assert.IsNotNull (entry, "Entry 0x0011 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var nikonpreview = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Preview) as SubIFDEntry;
			Assert.IsNotNull (nikonpreview, "Nikon preview tag not found");
			var nikonpreview_structure = nikonpreview.Structure;

			// NikonPreview.0x0103 (Compression/Short/1) "6"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// NikonPreview.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// NikonPreview.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "57216"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.PreviewImageStart);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 0");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// NikonPreview.0x0202 (JPEGInterchangeFormatLength/Long/1) "21572"
			{
				var entry = nikonpreview_structure.GetEntry (0, (ushort) NikonPreviewMakerNoteEntryTag.PreviewImageLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (21572, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x0013 (ISOSettings/Short/2) "0 200"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ISOSettings);
				Assert.IsNotNull (entry, "Entry 0x0013 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 0, 200 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x0019 (ExposureBracketComp/SRational/1) "0/1"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ExposureBracketComp);
				Assert.IsNotNull (entry, "Entry 0x0019 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (0, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Nikon3.0x0081 (ToneComp/Ascii/9) "AUTO    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ToneComp);
				Assert.IsNotNull (entry, "Entry 0x0081 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("AUTO    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0083 (LensType/Byte/1) "14 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensType);
				Assert.IsNotNull (entry, "Entry 0x0083 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (14 , (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0084 (Lens/Rational/4) "18/1 200/1 35/10 56/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Lens);
				Assert.IsNotNull (entry, "Entry 0x0084 missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (4, parts.Length);
				Assert.AreEqual (18, parts[0].Numerator);
				Assert.AreEqual (1, parts[0].Denominator);
				Assert.AreEqual (200, parts[1].Numerator);
				Assert.AreEqual (1, parts[1].Denominator);
				Assert.AreEqual (35, parts[2].Numerator);
				Assert.AreEqual (10, parts[2].Denominator);
				Assert.AreEqual (56, parts[3].Numerator);
				Assert.AreEqual (10, parts[3].Denominator);
			}
			// Nikon3.0x0087 (FlashMode/Byte/1) "0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.FlashMode);
				Assert.IsNotNull (entry, "Entry 0x0087 missing in IFD 0");
				Assert.IsNotNull (entry as ByteIFDEntry, "Entry is not a byte!");
				Assert.AreEqual (0 , (entry as ByteIFDEntry).Value);
			}
			// Nikon3.0x0088 (AFFocusPos/Undefined/4) "0 3 0 8 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.AFInfo);
				Assert.IsNotNull (entry, "Entry 0x0088 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 3, 0, 8 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0089 (ShootingMode/Short/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShootingMode);
				Assert.IsNotNull (entry, "Entry 0x0089 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Nikon3.0x008B (LensFStops/Undefined/4) "64 1 12 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensFStops);
				Assert.IsNotNull (entry, "Entry 0x008B missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 64, 1, 12, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x008C (ToneCurve/Undefined/4160) "73 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8 8 8 9 9 9 9 10 10 10 10 11 11 11 11 12 12 12 12 13 13 13 13 14 14 14 14 15 15 15 15 16 16 16 16 17 17 17 17 18 18 18 18 19 19 19 19 20 20 20 20 21 21 21 21 22 22 22 22 23 23 23 23 24 24 24 24 25 25 25 25 26 26 26 26 27 27 27 27 28 28 28 28 29 29 29 29 30 30 30 30 31 31 32 32 32 32 33 33 33 33 34 34 34 34 35 35 35 35 36 36 36 36 37 37 37 37 38 38 38 38 39 39 39 39 40 40 40 40 41 41 41 41 42 42 42 42 43 43 43 43 44 44 44 44 45 45 45 45 46 46 46 46 47 47 47 47 48 48 48 48 49 49 49 49 50 50 50 50 51 51 51 51 52 52 52 52 53 53 53 53 54 54 54 54 55 55 55 55 56 56 56 56 57 57 57 57 58 58 58 58 59 59 59 59 60 60 60 60 60 60 61 61 61 61 62 62 62 62 63 63 63 63 64 64 64 64 65 65 65 65 65 65 66 66 66 66 67 67 67 67 68 68 68 68 68 68 69 69 69 69 70 70 70 70 70 70 71 71 71 71 72 72 72 72 72 72 73 73 73 73 73 73 74 74 74 74 75 75 75 75 75 75 76 76 76 76 76 76 77 77 77 77 77 77 78 78 78 78 78 78 79 79 79 79 79 79 80 80 80 80 80 80 81 81 81 81 81 81 82 82 82 82 82 82 83 83 83 83 83 83 84 84 84 84 84 84 85 85 85 85 85 85 85 85 86 86 86 86 86 86 87 87 87 87 87 87 88 88 88 88 88 88 89 89 89 89 89 89 90 90 90 90 90 90 90 90 91 91 91 91 91 91 92 92 92 92 92 92 93 93 93 93 93 93 93 93 94 94 94 94 94 94 95 95 95 95 95 95 96 96 96 96 96 96 96 96 97 97 97 97 97 97 98 98 98 98 98 98 98 98 99 99 99 99 99 99 100 100 100 100 100 100 100 100 101 101 101 101 101 101 102 102 102 102 102 102 102 102 103 103 103 103 103 103 103 103 104 104 104 104 104 104 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106 106 107 107 107 107 107 107 108 108 108 108 108 108 108 108 109 109 109 109 109 109 109 109 110 110 110 110 110 110 110 110 111 111 111 111 111 111 112 112 112 112 112 112 112 112 113 113 113 113 113 113 113 113 114 114 114 114 114 114 114 114 115 115 115 115 115 115 115 115 116 116 116 116 116 116 116 116 117 117 117 117 117 117 117 117 118 118 118 118 118 118 118 118 119 119 119 119 119 119 119 119 120 120 120 120 120 120 120 120 121 121 121 121 121 121 121 121 122 122 122 122 122 122 122 122 123 123 123 123 123 123 123 123 124 124 124 124 124 124 124 124 124 124 125 125 125 125 125 125 125 125 126 126 126 126 126 126 126 126 127 127 127 127 127 127 127 127 128 128 128 128 128 128 128 128 128 128 129 129 129 129 129 129 129 129 130 130 130 130 130 130 130 130 131 131 131 131 131 131 131 131 132 132 132 132 132 132 132 132 132 132 133 133 133 133 133 133 133 133 133 133 134 134 134 134 134 134 134 134 134 134 135 135 135 135 135 135 135 135 135 135 136 136 136 136 136 136 136 136 136 136 137 137 137 137 137 137 137 137 137 137 138 138 138 138 138 138 138 138 138 138 138 138 139 139 139 139 139 139 139 139 139 139 140 140 140 140 140 140 140 140 140 140 140 140 141 141 141 141 141 141 141 141 141 141 141 141 142 142 142 142 142 142 142 142 142 142 143 143 143 143 143 143 143 143 143 143 143 143 144 144 144 144 144 144 144 144 144 144 144 144 145 145 145 145 145 145 145 145 145 145 145 145 146 146 146 146 146 146 146 146 146 146 146 146 147 147 147 147 147 147 147 147 147 147 147 147 147 147 148 148 148 148 148 148 148 148 148 148 148 148 149 149 149 149 149 149 149 149 149 149 149 149 150 150 150 150 150 150 150 150 150 150 150 150 150 150 151 151 151 151 151 151 151 151 151 151 151 151 151 151 152 152 152 152 152 152 152 152 152 152 152 152 153 153 153 153 153 153 153 153 153 153 153 153 153 153 154 154 154 154 154 154 154 154 154 154 154 154 154 154 155 155 155 155 155 155 155 155 155 155 155 155 155 155 156 156 156 156 156 156 156 156 156 156 156 156 156 156 157 157 157 157 157 157 157 157 157 157 157 157 157 157 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 158 159 159 159 159 159 159 159 159 159 159 159 159 159 159 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 160 161 161 161 161 161 161 161 161 161 161 161 161 161 161 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 162 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 163 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 164 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 165 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 166 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 167 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 168 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 169 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 171 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 172 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 173 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 174 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 175 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 176 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 177 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 178 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 179 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 180 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 181 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 182 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 183 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 184 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 185 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 186 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 187 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 188 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 189 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 190 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 191 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 192 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 193 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 194 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 195 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 196 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 197 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 198 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 199 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 201 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 202 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 203 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 205 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 206 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 207 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 208 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 209 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 210 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 211 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 212 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 213 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 214 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 215 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 216 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 217 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 218 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 219 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 220 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 222 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 223 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 224 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 225 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 226 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 227 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 228 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 229 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 230 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 231 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 232 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 233 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 234 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 235 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 236 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 237 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 238 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 239 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 240 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 241 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 242 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 243 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 244 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 245 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 246 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 247 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 248 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 249 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 251 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 252 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 253 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ContrastCurve);
				Assert.IsNotNull (entry, "Entry 0x008C missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 73, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 83, 84, 84, 84, 84, 84, 84, 85, 85, 85, 85, 85, 85, 85, 85, 86, 86, 86, 86, 86, 86, 87, 87, 87, 87, 87, 87, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, 89, 89, 90, 90, 90, 90, 90, 90, 90, 90, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 94, 94, 94, 94, 95, 95, 95, 95, 95, 95, 96, 96, 96, 96, 96, 96, 96, 96, 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 101, 101, 101, 101, 101, 101, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 103, 103, 103, 103, 103, 103, 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, 105, 105, 105, 105, 106, 106, 106, 106, 106, 106, 106, 106, 107, 107, 107, 107, 107, 107, 108, 108, 108, 108, 108, 108, 108, 108, 109, 109, 109, 109, 109, 109, 109, 109, 110, 110, 110, 110, 110, 110, 110, 110, 111, 111, 111, 111, 111, 111, 112, 112, 112, 112, 112, 112, 112, 112, 113, 113, 113, 113, 113, 113, 113, 113, 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, 115, 115, 115, 115, 115, 115, 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, 117, 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, 122, 122, 122, 122, 122, 123, 123, 123, 123, 123, 123, 123, 123, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 125, 125, 125, 125, 125, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129, 129, 129, 129, 129, 130, 130, 130, 130, 130, 130, 130, 130, 131, 131, 131, 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, 136, 136, 136, 136, 136, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 171, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 182, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 184, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 201, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 202, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 204, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 243, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 245, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 247, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 252, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x008D (ColorMode/Ascii/9) "MODE1a  "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorHue);
				Assert.IsNotNull (entry, "Entry 0x008D missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("MODE1a  ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0090 (LightSource/Ascii/12) "NATURAL    "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x0090 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NATURAL    ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0091 (ShotInfo/Undefined/465) "48 49 48 51 0 3 0 252 0 0 0 0 0 0 0 201 0 1 0 31 0 0 0 0 19 0 20 0 31 0 0 0 0 9 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 32 0 1 0 0 0 63 0 0 0 248 0 0 0 0 0 0 0 0 0 248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 0 0 0 0 87 0 0 0 98 0 97 1 100 6 32 11 64 59 52 59 55 62 4 0 218 0 218 0 158 0 162 0 25 0 134 0 3 0 3 0 0 0 0 0 0 0 3 0 3 0 0 4 13 0 0 0 104 195 48 8 24 32 0 17 16 8 65 144 145 147 116 172 20 176 213 130 83 168 0 128 68 4 5 0 0 99 2 15 80 0 8 36 15 216 33 33 0 120 5 0 36 34 64 177 65 8 0 128 140 0 80 199 120 144 33 2 33 40 1 128 0 161 1 148 1 128 212 8 33 168 215 8 168 59 52 59 55 62 53 0 92 0 106 0 164 163 177 177 172 157 166 181 183 184 153 175 183 185 185 251 251 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 33 72 0 8 104 78 226 1 0 72 56 33 57 0 0 0 196 16 130 5 75 8 28 54 1 156 0 128 64 0 0 12 84 159 61 6 31 208 195 255 255 255 205 96 178 0 0 101 139 255 255 255 204 255 255 255 205 96 178 0 0 0 0 3 0 0 0 136 198 0 61 222 61 152 194 255 255 255 203 255 255 255 203 255 255 255 207 255 255 255 194 255 127 255 127 255 127 255 127 100 127 96 178 96 99 95 92 26 1 32 0 3 0 0 72 248 18 61 142 0 51 94 128 139 64 45 128 44 60 253 60 18 109 22 108 0 0 0 3 3 7 4 6 0 0 0 0 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShotInfo);
				Assert.IsNotNull (entry, "Entry 0x0091 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 51, 0, 3, 0, 252, 0, 0, 0, 0, 0, 0, 0, 201, 0, 1, 0, 31, 0, 0, 0, 0, 19, 0, 20, 0, 31, 0, 0, 0, 0, 9, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 32, 0, 1, 0, 0, 0, 63, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 87, 0, 0, 0, 98, 0, 97, 1, 100, 6, 32, 11, 64, 59, 52, 59, 55, 62, 4, 0, 218, 0, 218, 0, 158, 0, 162, 0, 25, 0, 134, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 4, 13, 0, 0, 0, 104, 195, 48, 8, 24, 32, 0, 17, 16, 8, 65, 144, 145, 147, 116, 172, 20, 176, 213, 130, 83, 168, 0, 128, 68, 4, 5, 0, 0, 99, 2, 15, 80, 0, 8, 36, 15, 216, 33, 33, 0, 120, 5, 0, 36, 34, 64, 177, 65, 8, 0, 128, 140, 0, 80, 199, 120, 144, 33, 2, 33, 40, 1, 128, 0, 161, 1, 148, 1, 128, 212, 8, 33, 168, 215, 8, 168, 59, 52, 59, 55, 62, 53, 0, 92, 0, 106, 0, 164, 163, 177, 177, 172, 157, 166, 181, 183, 184, 153, 175, 183, 185, 185, 251, 251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57, 33, 72, 0, 8, 104, 78, 226, 1, 0, 72, 56, 33, 57, 0, 0, 0, 196, 16, 130, 5, 75, 8, 28, 54, 1, 156, 0, 128, 64, 0, 0, 12, 84, 159, 61, 6, 31, 208, 195, 255, 255, 255, 205, 96, 178, 0, 0, 101, 139, 255, 255, 255, 204, 255, 255, 255, 205, 96, 178, 0, 0, 0, 0, 3, 0, 0, 0, 136, 198, 0, 61, 222, 61, 152, 194, 255, 255, 255, 203, 255, 255, 255, 203, 255, 255, 255, 207, 255, 255, 255, 194, 255, 127, 255, 127, 255, 127, 255, 127, 100, 127, 96, 178, 96, 99, 95, 92, 26, 1, 32, 0, 3, 0, 0, 72, 248, 18, 61, 142, 0, 51, 94, 128, 139, 64, 45, 128, 44, 60, 253, 60, 18, 109, 22, 108, 0, 0, 0, 3, 3, 7, 4, 6, 0, 0, 0, 0, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0092 (HueAdjustment/SShort/1) "0"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.HueAdjustment);
				Assert.IsNotNull (entry, "Entry 0x0092 missing in IFD 0");
				Assert.IsNotNull (entry as SShortIFDEntry, "Entry is not a signed short!");
				Assert.AreEqual (0, (entry as SShortIFDEntry).Value);
			}
			// Nikon3.0x0095 (NoiseReduction/Ascii/5) "OFF "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.NoiseReduction);
				Assert.IsNotNull (entry, "Entry 0x0095 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("OFF ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0097 (ColorBalance2/Undefined/140) "48 49 48 51 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 242 1 0 1 181 1 0 1 0 0 8 1 0 1 0 0 0 0 112 0 12 0 24 0 3 0 140 1 132 255 240 255 227 255 90 1 195 255 255 255 220 255 37 1 255 255 255 255 255 255 0 128 0 0 0 0 0 0 0 0 0 10 0 0 128 2 0 0 0 3 0 0 128 2 0 0 0 0 0 0 255 0 255 0 77 0 150 0 29 0 199 255 178 255 135 0 147 0 131 255 234 255 0 0 3 0 0 10 26 68 164 84 3 97 1 101 248 248 0 0 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ColorBalance);
				Assert.IsNotNull (entry, "Entry 0x0097 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 51, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 242, 1, 0, 1, 181, 1, 0, 1, 0, 0, 8, 1, 0, 1, 0, 0, 0, 0, 112, 0, 12, 0, 24, 0, 3, 0, 140, 1, 132, 255, 240, 255, 227, 255, 90, 1, 195, 255, 255, 255, 220, 255, 37, 1, 255, 255, 255, 255, 255, 255, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 128, 2, 0, 0, 0, 3, 0, 0, 128, 2, 0, 0, 0, 0, 0, 0, 255, 0, 255, 0, 77, 0, 150, 0, 29, 0, 199, 255, 178, 255, 135, 0, 147, 0, 131, 255, 234, 255, 0, 0, 3, 0, 0, 10, 26, 68, 164, 84, 3, 97, 1, 101, 248, 248, 0, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0098 (LensData/Undefined/31) "48 49 48 49 18 61 142 0 51 94 128 139 64 45 128 44 60 253 60 18 109 22 108 0 0 0 3 3 7 4 6 "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.LensData);
				Assert.IsNotNull (entry, "Entry 0x0098 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 49, 18, 61, 142, 0, 51, 94, 128, 139, 64, 45, 128, 44, 60, 253, 60, 18, 109, 22, 108, 0, 0, 0, 3, 3, 7, 4, 6 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x0099 (RawImageCenter/Short/2) "1520 1008"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.RawImageCenter);
				Assert.IsNotNull (entry, "Entry 0x0099 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 1520, 1008 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Nikon3.0x009A (SensorPixelSize/Rational/2) "78/10 78/10"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SensorPixelSize);
				Assert.IsNotNull (entry, "Entry 0x009A missing in IFD 0");
				Assert.IsNotNull (entry as RationalArrayIFDEntry, "Entry is not a rational array!");
				var parts = (entry as RationalArrayIFDEntry).Values;
				Assert.AreEqual (2, parts.Length);
				Assert.AreEqual (78, parts[0].Numerator);
				Assert.AreEqual (10, parts[0].Denominator);
				Assert.AreEqual (78, parts[1].Numerator);
				Assert.AreEqual (10, parts[1].Denominator);
			}
			// Nikon3.0x00A0 (SerialNO/Ascii/21) "NO= 200659a2        "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.SerialNO);
				Assert.IsNotNull (entry, "Entry 0x00A0 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NO= 200659a2        ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00A1 (0x00a1/Undefined/56) "196 230 2 0 48 0 0 0 82 74 66 84 77 69 83 76 68 86 80 72 89 82 75 91 85 78 90 83 77 94 90 83 91 87 80 91 86 80 93 87 80 93 89 83 93 90 84 96 94 87 94 89 83 95 90 84 "
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x00A1
				var entry = makernote_structure.GetEntry (0, (ushort) 0x00A1);
				Assert.IsNotNull (entry, "Entry 0x00A1 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 196, 230, 2, 0, 48, 0, 0, 0, 82, 74, 66, 84, 77, 69, 83, 76, 68, 86, 80, 72, 89, 82, 75, 91, 85, 78, 90, 83, 77, 94, 90, 83, 91, 87, 80, 91, 86, 80, 93, 87, 80, 93, 89, 83, 93, 90, 84, 96, 94, 87, 94, 89, 83, 95, 90, 84 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Nikon3.0x00A7 (ShutterCount/Long/1) "7222"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ShutterCount);
				Assert.IsNotNull (entry, "Entry 0x00A7 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (7222, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x00A9 (ImageOptimization/Ascii/7) "CUSTOM"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ImageOptimization);
				Assert.IsNotNull (entry, "Entry 0x00A9 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("CUSTOM", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00AA (Saturation/Ascii/7) "NORMAL"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.Saturation2);
				Assert.IsNotNull (entry, "Entry 0x00AA missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NORMAL", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x00AB (VariProgram/Ascii/2) " "
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.VariProgram);
				Assert.IsNotNull (entry, "Entry 0x00AB missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual (" ", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0E09 (CaptureVersion/Ascii/13) "ViewNX 1.5 W"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.CaptureVersion);
				Assert.IsNotNull (entry, "Entry 0x0E09 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("ViewNX 1.5 W", (entry as StringIFDEntry).Value);
			}
			// Nikon3.0x0E10 (ScanIFD/Long/1) "5654"
			{
				var entry = makernote_structure.GetEntry (0, (ushort) Nikon3MakerNoteEntryTag.ScanIFD);
				Assert.IsNotNull (entry, "Entry 0x0E10 missing in IFD 0");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (5654, (entry as LongIFDEntry).Value);
			}
			// Nikon3.0x0E22 (0x0e22/Short/4) "12 0 0 0"
			{
				// TODO: Unknown IFD tag: Nikon3 / 0x0E22
				var entry = makernote_structure.GetEntry (0, (ushort) 0x0E22);
				Assert.IsNotNull (entry, "Entry 0x0E22 missing in IFD 0");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 12, 0, 0, 0 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Photo.0x9286 (UserComment/UserComment/44) "charset="Ascii"                                     "
			//  --> Test removed because of CommentModificationValidator, value is checked there.
			// Photo.0x9290 (SubSecTime/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "80"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("80", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 48, 49, 48, 48 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 3 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 1 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 2 1 1 0 "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 2, 0, 2, 2, 1, 1, 0 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "1/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "300"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (300, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8773 (InterColorProfile/Undefined/8636) "0 0 33 188 78 75 79 78 2 32 0 0 109 110 116 114 82 71 66 32 88 89 90 32 7 210 0 10 0 25 0 13 0 32 0 16 97 99 115 112 65 80 80 76 0 0 0 0 110 111 110 101 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 246 214 0 1 0 0 0 0 211 45 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 100 101 115 99 0 0 0 240 0 0 0 67 114 88 89 90 0 0 1 52 0 0 0 20 103 88 89 90 0 0 1 72 0 0 0 20 98 88 89 90 0 0 1 92 0 0 0 20 119 116 112 116 0 0 1 112 0 0 0 20 99 112 114 116 0 0 1 132 0 0 0 44 114 84 82 67 0 0 1 176 0 0 32 12 103 84 82 67 0 0 1 176 0 0 32 12 98 84 82 67 0 0 1 176 0 0 32 12 100 101 115 99 0 0 0 0 0 0 0 22 78 105 107 111 110 32 115 82 71 66 32 52 46 48 46 48 46 51 48 48 49 0 0 0 0 0 0 0 0 0 0 0 22 78 105 107 111 110 32 115 82 71 66 32 52 46 48 46 48 46 51 48 48 49 0 0 88 89 90 32 0 0 0 0 0 0 111 162 0 0 56 246 0 0 3 144 88 89 90 32 0 0 0 0 0 0 98 148 0 0 183 133 0 0 24 217 88 89 90 32 0 0 0 0 0 0 36 159 0 0 15 132 0 0 182 200 88 89 90 32 0 0 0 0 0 0 243 84 0 1 0 0 0 1 22 207 116 101 120 116 0 0 0 0 78 105 107 111 110 32 73 110 99 46 32 38 32 78 105 107 111 110 32 67 111 114 112 111 114 97 116 105 111 110 32 50 48 48 50 0 99 117 114 118 0 0 0 0 0 0 16 0 0 0 0 1 0 2 0 3 0 4 0 6 0 7 0 8 0 9 0 11 0 12 0 13 0 14 0 16 0 17 0 18 0 19 0 21 0 22 0 23 0 24 0 26 0 27 0 28 0 29 0 30 0 32 0 33 0 34 0 35 0 37 0 38 0 39 0 40 0 42 0 43 0 44 0 45 0 47 0 48 0 49 0 50 0 52 0 53 0 54 0 55 0 56 0 58 0 59 0 60 0 61 0 63 0 64 0 65 0 66 0 68 0 69 0 70 0 71 0 73 0 74 0 75 0 76 0 78 0 79 0 80 0 81 0 82 0 84 0 85 0 86 0 87 0 89 0 90 0 91 0 92 0 94 0 95 0 96 0 97 0 99 0 100 0 101 0 102 0 104 0 105 0 106 0 107 0 109 0 110 0 111 0 112 0 113 0 115 0 116 0 117 0 118 0 120 0 121 0 122 0 123 0 125 0 126 0 127 0 128 0 130 0 131 0 132 0 133 0 135 0 136 0 137 0 138 0 139 0 141 0 142 0 143 0 144 0 146 0 147 0 148 0 149 0 151 0 152 0 153 0 154 0 156 0 157 0 158 0 159 0 161 0 162 0 163 0 164 0 165 0 167 0 168 0 169 0 170 0 172 0 173 0 174 0 175 0 177 0 178 0 179 0 180 0 182 0 183 0 184 0 185 0 187 0 188 0 189 0 190 0 191 0 193 0 194 0 195 0 196 0 198 0 199 0 200 0 201 0 203 0 204 0 205 0 206 0 208 0 209 0 210 0 211 0 213 0 214 0 215 0 217 0 218 0 219 0 221 0 222 0 223 0 225 0 226 0 227 0 229 0 230 0 231 0 233 0 234 0 235 0 237 0 238 0 239 0 241 0 242 0 244 0 245 0 246 0 248 0 249 0 251 0 252 0 254 0 255 1 0 1 2 1 3 1 5 1 6 1 8 1 9 1 11 1 12 1 13 1 15 1 16 1 18 1 19 1 21 1 22 1 24 1 25 1 27 1 29 1 30 1 32 1 33 1 35 1 36 1 38 1 39 1 41 1 42 1 44 1 46 1 47 1 49 1 50 1 52 1 54 1 55 1 57 1 58 1 60 1 62 1 63 1 65 1 67 1 68 1 70 1 71 1 73 1 75 1 76 1 78 1 80 1 81 1 83 1 85 1 87 1 88 1 90 1 92 1 93 1 95 1 97 1 99 1 100 1 102 1 104 1 106 1 107 1 109 1 111 1 113 1 114 1 116 1 118 1 120 1 122 1 123 1 125 1 127 1 129 1 131 1 132 1 134 1 136 1 138 1 140 1 142 1 144 1 145 1 147 1 149 1 151 1 153 1 155 1 157 1 159 1 160 1 162 1 164 1 166 1 168 1 170 1 172 1 174 1 176 1 178 1 180 1 182 1 184 1 186 1 188 1 190 1 192 1 194 1 196 1 198 1 200 1 202 1 204 1 206 1 208 1 210 1 212 1 214 1 216 1 218 1 220 1 222 1 224 1 226 1 228 1 230 1 232 1 234 1 237 1 239 1 241 1 243 1 245 1 247 1 249 1 251 1 254 2 0 2 2 2 4 2 6 2 8 2 10 2 13 2 15 2 17 2 19 2 21 2 24 2 26 2 28 2 30 2 32 2 35 2 37 2 39 2 41 2 44 2 46 2 48 2 50 2 53 2 55 2 57 2 60 2 62 2 64 2 67 2 69 2 71 2 73 2 76 2 78 2 80 2 83 2 85 2 87 2 90 2 92 2 95 2 97 2 99 2 102 2 104 2 107 2 109 2 111 2 114 2 116 2 119 2 121 2 123 2 126 2 128 2 131 2 133 2 136 2 138 2 141 2 143 2 146 2 148 2 151 2 153 2 156 2 158 2 161 2 163 2 166 2 168 2 171 2 173 2 176 2 178 2 181 2 184 2 186 2 189 2 191 2 194 2 196 2 199 2 202 2 204 2 207 2 209 2 212 2 215 2 217 2 220 2 223 2 225 2 228 2 231 2 233 2 236 2 239 2 241 2 244 2 247 2 249 2 252 2 255 3 2 3 4 3 7 3 10 3 13 3 15 3 18 3 21 3 24 3 26 3 29 3 32 3 35 3 38 3 40 3 43 3 46 3 49 3 52 3 54 3 57 3 60 3 63 3 66 3 69 3 72 3 74 3 77 3 80 3 83 3 86 3 89 3 92 3 95 3 98 3 100 3 103 3 106 3 109 3 112 3 115 3 118 3 121 3 124 3 127 3 130 3 133 3 136 3 139 3 142 3 145 3 148 3 151 3 154 3 157 3 160 3 163 3 166 3 169 3 172 3 175 3 178 3 182 3 185 3 188 3 191 3 194 3 197 3 200 3 203 3 206 3 209 3 213 3 216 3 219 3 222 3 225 3 228 3 232 3 235 3 238 3 241 3 244 3 247 3 251 3 254 4 1 4 4 4 8 4 11 4 14 4 17 4 21 4 24 4 27 4 30 4 34 4 37 4 40 4 43 4 47 4 50 4 53 4 57 4 60 4 63 4 67 4 70 4 73 4 77 4 80 4 84 4 87 4 90 4 94 4 97 4 100 4 104 4 107 4 111 4 114 4 117 4 121 4 124 4 128 4 131 4 135 4 138 4 142 4 145 4 149 4 152 4 156 4 159 4 163 4 166 4 170 4 173 4 177 4 180 4 184 4 187 4 191 4 194 4 198 4 202 4 205 4 209 4 212 4 216 4 219 4 223 4 227 4 230 4 234 4 238 4 241 4 245 4 249 4 252 5 0 5 4 5 7 5 11 5 15 5 18 5 22 5 26 5 29 5 33 5 37 5 41 5 44 5 48 5 52 5 56 5 59 5 63 5 67 5 71 5 74 5 78 5 82 5 86 5 90 5 93 5 97 5 101 5 105 5 109 5 113 5 116 5 120 5 124 5 128 5 132 5 136 5 140 5 144 5 147 5 151 5 155 5 159 5 163 5 167 5 171 5 175 5 179 5 183 5 187 5 191 5 195 5 199 5 203 5 207 5 211 5 215 5 219 5 223 5 227 5 231 5 235 5 239 5 243 5 247 5 251 5 255 6 3 6 7 6 12 6 16 6 20 6 24 6 28 6 32 6 36 6 40 6 44 6 49 6 53 6 57 6 61 6 65 6 69 6 74 6 78 6 82 6 86 6 90 6 95 6 99 6 103 6 107 6 112 6 116 6 120 6 124 6 129 6 133 6 137 6 142 6 146 6 150 6 154 6 159 6 163 6 167 6 172 6 176 6 180 6 185 6 189 6 193 6 198 6 202 6 207 6 211 6 215 6 220 6 224 6 229 6 233 6 237 6 242 6 246 6 251 6 255 7 4 7 8 7 13 7 17 7 22 7 26 7 31 7 35 7 40 7 44 7 49 7 53 7 58 7 62 7 67 7 71 7 76 7 81 7 85 7 90 7 94 7 99 7 104 7 108 7 113 7 117 7 122 7 127 7 131 7 136 7 141 7 145 7 150 7 155 7 159 7 164 7 169 7 173 7 178 7 183 7 188 7 192 7 197 7 202 7 207 7 211 7 216 7 221 7 226 7 230 7 235 7 240 7 245 7 250 7 254 8 3 8 8 8 13 8 18 8 23 8 27 8 32 8 37 8 42 8 47 8 52 8 57 8 62 8 67 8 71 8 76 8 81 8 86 8 91 8 96 8 101 8 106 8 111 8 116 8 121 8 126 8 131 8 136 8 141 8 146 8 151 8 156 8 161 8 166 8 171 8 176 8 181 8 186 8 191 8 197 8 202 8 207 8 212 8 217 8 222 8 227 8 232 8 237 8 243 8 248 8 253 9 2 9 7 9 12 9 18 9 23 9 28 9 33 9 38 9 44 9 49 9 54 9 59 9 65 9 70 9 75 9 80 9 86 9 91 9 96 9 102 9 107 9 112 9 117 9 123 9 128 9 133 9 139 9 144 9 149 9 155 9 160 9 166 9 171 9 176 9 182 9 187 9 193 9 198 9 203 9 209 9 214 9 220 9 225 9 231 9 236 9 242 9 247 9 252 10 2 10 7 10 13 10 18 10 24 10 30 10 35 10 41 10 46 10 52 10 57 10 63 10 68 10 74 10 80 10 85 10 91 10 96 10 102 10 108 10 113 10 119 10 125 10 130 10 136 10 142 10 147 10 153 10 159 10 164 10 170 10 176 10 181 10 187 10 193 10 199 10 204 10 210 10 216 10 222 10 227 10 233 10 239 10 245 10 250 11 0 11 6 11 12 11 18 11 24 11 29 11 35 11 41 11 47 11 53 11 59 11 65 11 70 11 76 11 82 11 88 11 94 11 100 11 106 11 112 11 118 11 124 11 130 11 136 11 142 11 148 11 154 11 160 11 166 11 172 11 178 11 184 11 190 11 196 11 202 11 208 11 214 11 220 11 226 11 232 11 238 11 244 11 250 12 0 12 7 12 13 12 19 12 25 12 31 12 37 12 43 12 50 12 56 12 62 12 68 12 74 12 80 12 87 12 93 12 99 12 105 12 112 12 118 12 124 12 130 12 137 12 143 12 149 12 155 12 162 12 168 12 174 12 181 12 187 12 193 12 200 12 206 12 212 12 219 12 225 12 231 12 238 12 244 12 250 13 1 13 7 13 14 13 20 13 27 13 33 13 39 13 46 13 52 13 59 13 65 13 72 13 78 13 85 13 91 13 98 13 104 13 111 13 117 13 124 13 130 13 137 13 143 13 150 13 157 13 163 13 170 13 176 13 183 13 190 13 196 13 203 13 209 13 216 13 223 13 229 13 236 13 243 13 249 14 0 14 7 14 13 14 20 14 27 14 34 14 40 14 47 14 54 14 60 14 67 14 74 14 81 14 87 14 94 14 101 14 108 14 115 14 121 14 128 14 135 14 142 14 149 14 156 14 162 14 169 14 176 14 183 14 190 14 197 14 204 14 211 14 218 14 225 14 231 14 238 14 245 14 252 15 3 15 10 15 17 15 24 15 31 15 38 15 45 15 52 15 59 15 66 15 73 15 80 15 87 15 94 15 101 15 108 15 116 15 123 15 130 15 137 15 144 15 151 15 158 15 165 15 172 15 180 15 187 15 194 15 201 15 208 15 215 15 223 15 230 15 237 15 244 15 251 16 3 16 10 16 17 16 24 16 32 16 39 16 46 16 53 16 61 16 68 16 75 16 83 16 90 16 97 16 105 16 112 16 119 16 127 16 134 16 141 16 149 16 156 16 163 16 171 16 178 16 186 16 193 16 200 16 208 16 215 16 223 16 230 16 238 16 245 16 253 17 4 17 12 17 19 17 27 17 34 17 42 17 49 17 57 17 64 17 72 17 79 17 87 17 95 17 102 17 110 17 117 17 125 17 133 17 140 17 148 17 155 17 163 17 171 17 178 17 186 17 194 17 201 17 209 17 217 17 224 17 232 17 240 17 248 17 255 18 7 18 15 18 23 18 30 18 38 18 46 18 54 18 62 18 69 18 77 18 85 18 93 18 101 18 108 18 116 18 124 18 132 18 140 18 148 18 156 18 164 18 171 18 179 18 187 18 195 18 203 18 211 18 219 18 227 18 235 18 243 18 251 19 3 19 11 19 19 19 27 19 35 19 43 19 51 19 59 19 67 19 75 19 83 19 91 19 99 19 107 19 115 19 124 19 132 19 140 19 148 19 156 19 164 19 172 19 180 19 189 19 197 19 205 19 213 19 221 19 230 19 238 19 246 19 254 20 6 20 15 20 23 20 31 20 39 20 48 20 56 20 64 20 73 20 81 20 89 20 97 20 106 20 114 20 122 20 131 20 139 20 148 20 156 20 164 20 173 20 181 20 189 20 198 20 206 20 215 20 223 20 232 20 240 20 248 21 1 21 9 21 18 21 26 21 35 21 43 21 52 21 60 21 69 21 77 21 86 21 95 21 103 21 112 21 120 21 129 21 137 21 146 21 155 21 163 21 172 21 180 21 189 21 198 21 206 21 215 21 224 21 232 21 241 21 250 22 2 22 11 22 20 22 29 22 37 22 46 22 55 22 64 22 72 22 81 22 90 22 99 22 107 22 116 22 125 22 134 22 143 22 152 22 160 22 169 22 178 22 187 22 196 22 205 22 214 22 222 22 231 22 240 22 249 23 2 23 11 23 20 23 29 23 38 23 47 23 56 23 65 23 74 23 83 23 92 23 101 23 110 23 119 23 128 23 137 23 146 23 155 23 164 23 173 23 182 23 191 23 200 23 210 23 219 23 228 23 237 23 246 23 255 24 8 24 18 24 27 24 36 24 45 24 54 24 63 24 73 24 82 24 91 24 100 24 110 24 119 24 128 24 137 24 147 24 156 24 165 24 175 24 184 24 193 24 202 24 212 24 221 24 231 24 240 24 249 25 3 25 12 25 21 25 31 25 40 25 50 25 59 25 68 25 78 25 87 25 97 25 106 25 116 25 125 25 135 25 144 25 154 25 163 25 173 25 182 25 192 25 201 25 211 25 220 25 230 25 239 25 249 26 3 26 12 26 22 26 31 26 41 26 51 26 60 26 70 26 80 26 89 26 99 26 109 26 118 26 128 26 138 26 147 26 157 26 167 26 177 26 186 26 196 26 206 26 216 26 225 26 235 26 245 26 255 27 9 27 18 27 28 27 38 27 48 27 58 27 68 27 77 27 87 27 97 27 107 27 117 27 127 27 137 27 147 27 157 27 167 27 177 27 186 27 196 27 206 27 216 27 226 27 236 27 246 28 0 28 10 28 20 28 30 28 40 28 51 28 61 28 71 28 81 28 91 28 101 28 111 28 121 28 131 28 141 28 151 28 162 28 172 28 182 28 192 28 202 28 212 28 223 28 233 28 243 28 253 29 7 29 18 29 28 29 38 29 48 29 59 29 69 29 79 29 90 29 100 29 110 29 120 29 131 29 141 29 151 29 162 29 172 29 183 29 193 29 203 29 214 29 224 29 234 29 245 29 255 30 10 30 20 30 31 30 41 30 51 30 62 30 72 30 83 30 93 30 104 30 114 30 125 30 135 30 146 30 157 30 167 30 178 30 188 30 199 30 209 30 220 30 231 30 241 30 252 31 6 31 17 31 28 31 38 31 49 31 60 31 70 31 81 31 92 31 102 31 113 31 124 31 135 31 145 31 156 31 167 31 178 31 188 31 199 31 210 31 221 31 232 31 242 31 253 32 8 32 19 32 30 32 41 32 51 32 62 32 73 32 84 32 95 32 106 32 117 32 128 32 139 32 149 32 160 32 171 32 182 32 193 32 204 32 215 32 226 32 237 32 248 33 3 33 14 33 25 33 36 33 47 33 58 33 70 33 81 33 92 33 103 33 114 33 125 33 136 33 147 33 158 33 170 33 181 33 192 33 203 33 214 33 225 33 237 33 248 34 3 34 14 34 25 34 37 34 48 34 59 34 70 34 82 34 93 34 104 34 116 34 127 34 138 34 150 34 161 34 172 34 184 34 195 34 206 34 218 34 229 34 240 34 252 35 7 35 19 35 30 35 41 35 53 35 64 35 76 35 87 35 99 35 110 35 122 35 133 35 145 35 156 35 168 35 179 35 191 35 202 35 214 35 226 35 237 35 249 36 4 36 16 36 28 36 39 36 51 36 62 36 74 36 86 36 97 36 109 36 121 36 132 36 144 36 156 36 168 36 179 36 191 36 203 36 214 36 226 36 238 36 250 37 6 37 17 37 29 37 41 37 53 37 65 37 76 37 88 37 100 37 112 37 124 37 136 37 148 37 159 37 171 37 183 37 195 37 207 37 219 37 231 37 243 37 255 38 11 38 23 38 35 38 47 38 59 38 71 38 83 38 95 38 107 38 119 38 131 38 143 38 155 38 167 38 179 38 191 38 204 38 216 38 228 38 240 38 252 39 8 39 20 39 33 39 45 39 57 39 69 39 81 39 93 39 106 39 118 39 130 39 142 39 155 39 167 39 179 39 191 39 204 39 216 39 228 39 241 39 253 40 9 40 22 40 34 40 46 40 59 40 71 40 83 40 96 40 108 40 121 40 133 40 146 40 158 40 170 40 183 40 195 40 208 40 220 40 233 40 245 41 2 41 14 41 27 41 39 41 52 41 64 41 77 41 90 41 102 41 115 41 127 41 140 41 152 41 165 41 178 41 190 41 203 41 216 41 228 41 241 41 254 42 10 42 23 42 36 42 48 42 61 42 74 42 87 42 99 42 112 42 125 42 138 42 151 42 163 42 176 42 189 42 202 42 215 42 227 42 240 42 253 43 10 43 23 43 36 43 49 43 61 43 74 43 87 43 100 43 113 43 126 43 139 43 152 43 165 43 178 43 191 43 204 43 217 43 230 43 243 44 0 44 13 44 26 44 39 44 52 44 65 44 78 44 91 44 105 44 118 44 131 44 144 44 157 44 170 44 183 44 197 44 210 44 223 44 236 44 249 45 6 45 20 45 33 45 46 45 59 45 73 45 86 45 99 45 112 45 126 45 139 45 152 45 166 45 179 45 192 45 206 45 219 45 232 45 246 46 3 46 16 46 30 46 43 46 57 46 70 46 83 46 97 46 110 46 124 46 137 46 151 46 164 46 178 46 191 46 205 46 218 46 232 46 245 47 3 47 16 47 30 47 43 47 57 47 71 47 84 47 98 47 111 47 125 47 139 47 152 47 166 47 180 47 193 47 207 47 221 47 234 47 248 48 6 48 20 48 33 48 47 48 61 48 74 48 88 48 102 48 116 48 130 48 143 48 157 48 171 48 185 48 199 48 213 48 226 48 240 48 254 49 12 49 26 49 40 49 54 49 68 49 82 49 96 49 109 49 123 49 137 49 151 49 165 49 179 49 193 49 207 49 221 49 235 49 249 50 7 50 21 50 36 50 50 50 64 50 78 50 92 50 106 50 120 50 134 50 148 50 162 50 177 50 191 50 205 50 219 50 233 50 248 51 6 51 20 51 34 51 48 51 63 51 77 51 91 51 105 51 120 51 134 51 148 51 163 51 177 51 191 51 206 51 220 51 234 51 249 52 7 52 21 52 36 52 50 52 65 52 79 52 93 52 108 52 122 52 137 52 151 52 166 52 180 52 195 52 209 52 224 52 238 52 253 53 11 53 26 53 40 53 55 53 69 53 84 53 99 53 113 53 128 53 142 53 157 53 172 53 186 53 201 53 216 53 230 53 245 54 4 54 18 54 33 54 48 54 62 54 77 54 92 54 107 54 121 54 136 54 151 54 166 54 180 54 195 54 210 54 225 54 240 54 255 55 13 55 28 55 43 55 58 55 73 55 88 55 103 55 118 55 133 55 147 55 162 55 177 55 192 55 207 55 222 55 237 55 252 56 11 56 26 56 41 56 56 56 71 56 86 56 101 56 117 56 132 56 147 56 162 56 177 56 192 56 207 56 222 56 237 56 253 57 12 57 27 57 42 57 57 57 72 57 88 57 103 57 118 57 133 57 149 57 164 57 179 57 194 57 210 57 225 57 240 58 0 58 15 58 30 58 46 58 61 58 76 58 92 58 107 58 122 58 138 58 153 58 169 58 184 58 199 58 215 58 230 58 246 59 5 59 21 59 36 59 52 59 67 59 83 59 98 59 114 59 129 59 145 59 160 59 176 59 192 59 207 59 223 59 238 59 254 60 14 60 29 60 45 60 60 60 76 60 92 60 107 60 123 60 139 60 155 60 170 60 186 60 202 60 217 60 233 60 249 61 9 61 25 61 40 61 56 61 72 61 88 61 104 61 119 61 135 61 151 61 167 61 183 61 199 61 215 61 231 61 246 62 6 62 22 62 38 62 54 62 70 62 86 62 102 62 118 62 134 62 150 62 166 62 182 62 198 62 214 62 230 62 246 63 6 63 22 63 38 63 55 63 71 63 87 63 103 63 119 63 135 63 151 63 168 63 184 63 200 63 216 63 232 63 248 64 9 64 25 64 41 64 57 64 74 64 90 64 106 64 122 64 139 64 155 64 171 64 188 64 204 64 220 64 237 64 253 65 13 65 30 65 46 65 63 65 79 65 95 65 112 65 128 65 145 65 161 65 178 65 194 65 211 65 227 65 244 66 4 66 21 66 37 66 54 66 70 66 87 66 103 66 120 66 136 66 153 66 170 66 186 66 203 66 220 66 236 66 253 67 14 67 30 67 47 67 64 67 80 67 97 67 114 67 130 67 147 67 164 67 181 67 197 67 214 67 231 67 248 68 9 68 25 68 42 68 59 68 76 68 93 68 110 68 126 68 143 68 160 68 177 68 194 68 211 68 228 68 245 69 6 69 23 69 40 69 57 69 74 69 91 69 108 69 125 69 142 69 159 69 176 69 193 69 210 69 227 69 244 70 5 70 22 70 39 70 56 70 73 70 91 70 108 70 125 70 142 70 159 70 176 70 194 70 211 70 228 70 245 71 6 71 24 71 41 71 58 71 75 71 93 71 110 71 127 71 145 71 162 71 179 71 197 71 214 71 231 71 249 72 10 72 27 72 45 72 62 72 80 72 97 72 114 72 132 72 149 72 167 72 184 72 202 72 219 72 237 72 254 73 16 73 33 73 51 73 68 73 86 73 103 73 121 73 139 73 156 73 174 73 191 73 209 73 227 73 244 74 6 74 24 74 41 74 59 74 77 74 94 74 112 74 130 74 147 74 165 74 183 74 201 74 218 74 236 74 254 75 16 75 34 75 51 75 69 75 87 75 105 75 123 75 141 75 159 75 176 75 194 75 212 75 230 75 248 76 10 76 28 76 46 76 64 76 82 76 100 76 118 76 136 76 154 76 172 76 190 76 208 76 226 76 244 77 6 77 24 77 42 77 60 77 78 77 96 77 115 77 133 77 151 77 169 77 187 77 205 77 223 77 242 78 4 78 22 78 40 78 59 78 77 78 95 78 113 78 132 78 150 78 168 78 186 78 205 78 223 78 241 79 4 79 22 79 40 79 59 79 77 79 95 79 114 79 132 79 151 79 169 79 188 79 206 79 224 79 243 80 5 80 24 80 42 80 61 80 79 80 98 80 116 80 135 80 153 80 172 80 191 80 209 80 228 80 246 81 9 81 28 81 46 81 65 81 83 81 102 81 121 81 139 81 158 81 177 81 196 81 214 81 233 81 252 82 14 82 33 82 52 82 71 82 90 82 108 82 127 82 146 82 165 82 184 82 202 82 221 82 240 83 3 83 22 83 41 83 60 83 79 83 97 83 116 83 135 83 154 83 173 83 192 83 211 83 230 83 249 84 12 84 31 84 50 84 69 84 88 84 107 84 126 84 146 84 165 84 184 84 203 84 222 84 241 85 4 85 23 85 42 85 62 85 81 85 100 85 119 85 138 85 158 85 177 85 196 85 215 85 235 85 254 86 17 86 36 86 56 86 75 86 94 86 114 86 133 86 152 86 172 86 191 86 210 86 230 86 249 87 13 87 32 87 51 87 71 87 90 87 110 87 129 87 149 87 168 87 188 87 207 87 227 87 246 88 10 88 29 88 49 88 68 88 88 88 107 88 127 88 147 88 166 88 186 88 205 88 225 88 245 89 8 89 28 89 48 89 67 89 87 89 107 89 127 89 146 89 166 89 186 89 206 89 225 89 245 90 9 90 29 90 48 90 68 90 88 90 108 90 128 90 148 90 167 90 187 90 207 90 227 90 247 91 11 91 31 91 51 91 71 91 91 91 111 91 131 91 151 91 171 91 191 91 211 91 231 91 251 92 15 92 35 92 55 92 75 92 95 92 115 92 135 92 155 92 175 92 196 92 216 92 236 93 0 93 20 93 40 93 61 93 81 93 101 93 121 93 141 93 162 93 182 93 202 93 222 93 243 94 7 94 27 94 48 94 68 94 88 94 109 94 129 94 149 94 170 94 190 94 211 94 231 94 251 95 16 95 36 95 57 95 77 95 98 95 118 95 139 95 159 95 180 95 200 95 221 95 241 96 6 96 26 96 47 96 67 96 88 96 108 96 129 96 150 96 170 96 191 96 212 96 232 96 253 97 18 97 38 97 59 97 80 97 100 97 121 97 142 97 163 97 183 97 204 97 225 97 246 98 10 98 31 98 52 98 73 98 94 98 115 98 135 98 156 98 177 98 198 98 219 98 240 99 5 99 26 99 47 99 68 99 89 99 109 99 130 99 151 99 172 99 193 99 214 99 235 100 1 100 22 100 43 100 64 100 85 100 106 100 127 100 148 100 169 100 190 100 211 100 233 100 254 101 19 101 40 101 61 101 82 101 104 101 125 101 146 101 167 101 189 101 210 101 231 101 252 102 18 102 39 102 60 102 82 102 103 102 124 102 146 102 167 102 188 102 210 102 231 102 253 103 18 103 39 103 61 103 82 103 104 103 125 103 147 103 168 103 190 103 211 103 233 103 254 104 20 104 41 104 63 104 84 104 106 104 127 104 149 104 171 104 192 104 214 104 235 105 1 105 23 105 44 105 66 105 88 105 110 105 131 105 153 105 175 105 196 105 218 105 240 106 6 106 27 106 49 106 71 106 93 106 115 106 136 106 158 106 180 106 202 106 224 106 246 107 12 107 34 107 55 107 77 107 99 107 121 107 143 107 165 107 187 107 209 107 231 107 253 108 19 108 41 108 63 108 85 108 107 108 129 108 151 108 173 108 196 108 218 108 240 109 6 109 28 109 50 109 72 109 94 109 117 109 139 109 161 109 183 109 205 109 228 109 250 110 16 110 38 110 61 110 83 110 105 110 127 110 150 110 172 110 194 110 217 110 239 111 5 111 28 111 50 111 73 111 95 111 117 111 140 111 162 111 185 111 207 111 230 111 252 112 19 112 41 112 64 112 86 112 109 112 131 112 154 112 176 112 199 112 221 112 244 113 11 113 33 113 56 113 78 113 101 113 124 113 146 113 169 113 192 113 214 113 237 114 4 114 27 114 49 114 72 114 95 114 117 114 140 114 163 114 186 114 209 114 231 114 254 115 21 115 44 115 67 115 90 115 113 115 135 115 158 115 181 115 204 115 227 115 250 116 17 116 40 116 63 116 86 116 109 116 132 116 155 116 178 116 201 116 224 116 247 117 14 117 37 117 60 117 83 117 106 117 129 117 153 117 176 117 199 117 222 117 245 118 12 118 36 118 59 118 82 118 105 118 128 118 152 118 175 118 198 118 221 118 245 119 12 119 35 119 59 119 82 119 105 119 129 119 152 119 175 119 199 119 222 119 245 120 13 120 36 120 60 120 83 120 106 120 130 120 153 120 177 120 200 120 224 120 247 121 15 121 38 121 62 121 85 121 109 121 133 121 156 121 180 121 203 121 227 121 251 122 18 122 42 122 66 122 89 122 113 122 137 122 160 122 184 122 208 122 231 122 255 123 23 123 47 123 70 123 94 123 118 123 142 123 166 123 189 123 213 123 237 124 5 124 29 124 53 124 76 124 100 124 124 124 148 124 172 124 196 124 220 124 244 125 12 125 36 125 60 125 84 125 108 125 132 125 156 125 180 125 204 125 228 125 252 126 20 126 44 126 68 126 93 126 117 126 141 126 165 126 189 126 213 126 237 127 6 127 30 127 54 127 78 127 102 127 127 127 151 127 175 127 199 127 224 127 248 128 16 128 41 128 65 128 89 128 114 128 138 128 162 128 187 128 211 128 236 129 4 129 28 129 53 129 77 129 102 129 126 129 151 129 175 129 200 129 224 129 249 130 17 130 42 130 66 130 91 130 115 130 140 130 164 130 189 130 214 130 238 131 7 131 32 131 56 131 81 131 105 131 130 131 155 131 180 131 204 131 229 131 254 132 22 132 47 132 72 132 97 132 122 132 146 132 171 132 196 132 221 132 246 133 14 133 39 133 64 133 89 133 114 133 139 133 164 133 189 133 214 133 239 134 8 134 33 134 57 134 82 134 107 134 132 134 158 134 183 134 208 134 233 135 2 135 27 135 52 135 77 135 102 135 127 135 152 135 177 135 203 135 228 135 253 136 22 136 47 136 72 136 98 136 123 136 148 136 173 136 199 136 224 136 249 137 18 137 44 137 69 137 94 137 120 137 145 137 170 137 196 137 221 137 246 138 16 138 41 138 67 138 92 138 117 138 143 138 168 138 194 138 219 138 245 139 14 139 40 139 65 139 91 139 116 139 142 139 168 139 193 139 219 139 244 140 14 140 39 140 65 140 91 140 116 140 142 140 168 140 193 140 219 140 245 141 14 141 40 141 66 141 92 141 117 141 143 141 169 141 195 141 221 141 246 142 16 142 42 142 68 142 94 142 120 142 145 142 171 142 197 142 223 142 249 143 19 143 45 143 71 143 97 143 123 143 149 143 175 143 201 143 227 143 253 144 23 144 49 144 75 144 101 144 127 144 153 144 179 144 205 144 231 145 2 145 28 145 54 145 80 145 106 145 132 145 159 145 185 145 211 145 237 146 7 146 34 146 60 146 86 146 112 146 139 146 165 146 191 146 218 146 244 147 14 147 41 147 67 147 93 147 120 147 146 147 173 147 199 147 225 147 252 148 22 148 49 148 75 148 102 148 128 148 155 148 181 148 208 148 234 149 5 149 31 149 58 149 85 149 111 149 138 149 164 149 191 149 218 149 244 150 15 150 42 150 68 150 95 150 122 150 148 150 175 150 202 150 229 150 255 151 26 151 53 151 80 151 106 151 133 151 160 151 187 151 214 151 241 152 11 152 38 152 65 152 92 152 119 152 146 152 173 152 200 152 227 152 254 153 25 153 52 153 79 153 106 153 133 153 160 153 187 153 214 153 241 154 12 154 39 154 66 154 93 154 120 154 147 154 174 154 202 154 229 155 0 155 27 155 54 155 81 155 109 155 136 155 163 155 190 155 218 155 245 156 16 156 43 156 71 156 98 156 125 156 153 156 180 156 207 156 235 157 6 157 33 157 61 157 88 157 116 157 143 157 171 157 198 157 225 157 253 158 24 158 52 158 79 158 107 158 134 158 162 158 189 158 217 158 245 159 16 159 44 159 71 159 99 159 127 159 154 159 182 159 210 159 237 160 9 160 37 160 64 160 92 160 120 160 147 160 175 160 203 160 231 161 2 161 30 161 58 161 86 161 114 161 141 161 169 161 197 161 225 161 253 162 25 162 53 162 81 162 108 162 136 162 164 162 192 162 220 162 248 163 20 163 48 163 76 163 104 163 132 163 160 163 188 163 216 163 244 164 17 164 45 164 73 164 101 164 129 164 157 164 185 164 213 164 242 165 14 165 42 165 70 165 98 165 127 165 155 165 183 165 211 165 240 166 12 166 40 166 68 166 97 166 125 166 153 166 182 166 210 166 238 167 11 167 39 167 68 167 96 167 124 167 153 167 181 167 210 167 238 168 11 168 39 168 68 168 96 168 125 168 153 168 182 168 210 168 239 169 11 169 40 169 69 169 97 169 126 169 154 169 183 169 212 169 240 170 13 170 42 170 70 170 99 170 128 170 157 170 185 170 214 170 243 171 16 171 44 171 73 171 102 171 131 171 160 171 188 171 217 171 246 172 19 172 48 172 77 172 106 172 135 172 164 172 193 172 221 172 250 173 23 173 52 173 81 173 110 173 139 173 168 173 197 173 227 174 0 174 29 174 58 174 87 174 116 174 145 174 174 174 203 174 232 175 6 175 35 175 64 175 93 175 122 175 152 175 181 175 210 175 239 176 13 176 42 176 71 176 100 176 130 176 159 176 188 176 218 176 247 177 20 177 50 177 79 177 108 177 138 177 167 177 197 177 226 178 0 178 29 178 59 178 88 178 118 178 147 178 177 178 206 178 236 179 9 179 39 179 68 179 98 179 127 179 157 179 187 179 216 179 246 180 20 180 49 180 79 180 109 180 138 180 168 180 198 180 227 181 1 181 31 181 61 181 90 181 120 181 150 181 180 181 210 181 239 182 13 182 43 182 73 182 103 182 133 182 163 182 193 182 222 182 252 183 26 183 56 183 86 183 116 183 146 183 176 183 206 183 236 184 10 184 40 184 70 184 100 184 130 184 160 184 191 184 221 184 251 185 25 185 55 185 85 185 115 185 146 185 176 185 206 185 236 186 10 186 41 186 71 186 101 186 131 186 162 186 192 186 222 186 252 187 27 187 57 187 87 187 118 187 148 187 179 187 209 187 239 188 14 188 44 188 75 188 105 188 135 188 166 188 196 188 227 189 1 189 32 189 62 189 93 189 123 189 154 189 185 189 215 189 246 190 20 190 51 190 82 190 112 190 143 190 173 190 204 190 235 191 10 191 40 191 71 191 102 191 132 191 163 191 194 191 225 191 255 192 30 192 61 192 92 192 123 192 153 192 184 192 215 192 246 193 21 193 52 193 83 193 114 193 145 193 175 193 206 193 237 194 12 194 43 194 74 194 105 194 136 194 167 194 198 194 229 195 4 195 36 195 67 195 98 195 129 195 160 195 191 195 222 195 253 196 29 196 60 196 91 196 122 196 153 196 184 196 216 196 247 197 22 197 53 197 85 197 116 197 147 197 179 197 210 197 241 198 17 198 48 198 79 198 111 198 142 198 173 198 205 198 236 199 12 199 43 199 75 199 106 199 138 199 169 199 201 199 232 200 8 200 39 200 71 200 102 200 134 200 165 200 197 200 229 201 4 201 36 201 67 201 99 201 131 201 162 201 194 201 226 202 1 202 33 202 65 202 97 202 128 202 160 202 192 202 224 203 0 203 31 203 63 203 95 203 127 203 159 203 191 203 222 203 254 204 30 204 62 204 94 204 126 204 158 204 190 204 222 204 254 205 30 205 62 205 94 205 126 205 158 205 190 205 222 205 254 206 30 206 62 206 94 206 126 206 158 206 191 206 223 206 255 207 31 207 63 207 95 207 128 207 160 207 192 207 224 208 1 208 33 208 65 208 97 208 130 208 162 208 194 208 227 209 3 209 35 209 68 209 100 209 132 209 165 209 197 209 230 210 6 210 39 210 71 210 103 210 136 210 168 210 201 210 233 211 10 211 42 211 75 211 108 211 140 211 173 211 205 211 238 212 15 212 47 212 80 212 112 212 145 212 178 212 210 212 243 213 20 213 53 213 85 213 118 213 151 213 184 213 216 213 249 214 26 214 59 214 92 214 124 214 157 214 190 214 223 215 0 215 33 215 66 215 99 215 131 215 164 215 197 215 230 216 7 216 40 216 73 216 106 216 139 216 172 216 205 216 238 217 15 217 48 217 82 217 115 217 148 217 181 217 214 217 247 218 24 218 57 218 91 218 124 218 157 218 190 218 223 219 1 219 34 219 67 219 100 219 134 219 167 219 200 219 234 220 11 220 44 220 78 220 111 220 144 220 178 220 211 220 245 221 22 221 55 221 89 221 122 221 156 221 189 221 223 222 0 222 34 222 67 222 101 222 134 222 168 222 201 222 235 223 13 223 46 223 80 223 113 223 147 223 181 223 214 223 248 224 26 224 59 224 93 224 127 224 161 224 194 224 228 225 6 225 40 225 73 225 107 225 141 225 175 225 209 225 242 226 20 226 54 226 88 226 122 226 156 226 190 226 224 227 2 227 36 227 70 227 104 227 138 227 171 227 206 227 240 228 18 228 52 228 86 228 120 228 154 228 188 228 222 229 0 229 34 229 68 229 102 229 137 229 171 229 205 229 239 230 17 230 52 230 86 230 120 230 154 230 189 230 223 231 1 231 35 231 70 231 104 231 138 231 173 231 207 231 241 232 20 232 54 232 89 232 123 232 157 232 192 232 226 233 5 233 39 233 74 233 108 233 143 233 177 233 212 233 246 234 25 234 59 234 94 234 129 234 163 234 198 234 232 235 11 235 46 235 80 235 115 235 150 235 184 235 219 235 254 236 32 236 67 236 102 236 137 236 171 236 206 236 241 237 20 237 55 237 90 237 124 237 159 237 194 237 229 238 8 238 43 238 78 238 113 238 148 238 182 238 217 238 252 239 31 239 66 239 101 239 136 239 171 239 206 239 241 240 21 240 56 240 91 240 126 240 161 240 196 240 231 241 10 241 45 241 81 241 116 241 151 241 186 241 221 242 1 242 36 242 71 242 106 242 142 242 177 242 212 242 248 243 27 243 62 243 98 243 133 243 168 243 204 243 239 244 18 244 54 244 89 244 125 244 160 244 196 244 231 245 11 245 46 245 82 245 117 245 153 245 188 245 224 246 3 246 39 246 74 246 110 246 146 246 181 246 217 246 253 247 32 247 68 247 104 247 139 247 175 247 211 247 246 248 26 248 62 248 98 248 134 248 169 248 205 248 241 249 21 249 57 249 92 249 128 249 164 249 200 249 236 250 16 250 52 250 88 250 124 250 160 250 196 250 232 251 11 251 47 251 84 251 120 251 156 251 192 251 228 252 8 252 44 252 80 252 116 252 152 252 188 252 224 253 5 253 41 253 77 253 113 253 149 253 186 253 222 254 2 254 38 254 74 254 111 254 147 254 183 254 220 255 0 255 36 255 73 255 109 255 145 255 182 255 218 255 255 "
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ICCProfile);
				Assert.IsNotNull (entry, "Entry 0x8773 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var bytes = new byte [] { 0, 0, 33, 188, 78, 75, 79, 78, 2, 32, 0, 0, 109, 110, 116, 114, 82, 71, 66, 32, 88, 89, 90, 32, 7, 210, 0, 10, 0, 25, 0, 13, 0, 32, 0, 16, 97, 99, 115, 112, 65, 80, 80, 76, 0, 0, 0, 0, 110, 111, 110, 101, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 214, 0, 1, 0, 0, 0, 0, 211, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 100, 101, 115, 99, 0, 0, 0, 240, 0, 0, 0, 67, 114, 88, 89, 90, 0, 0, 1, 52, 0, 0, 0, 20, 103, 88, 89, 90, 0, 0, 1, 72, 0, 0, 0, 20, 98, 88, 89, 90, 0, 0, 1, 92, 0, 0, 0, 20, 119, 116, 112, 116, 0, 0, 1, 112, 0, 0, 0, 20, 99, 112, 114, 116, 0, 0, 1, 132, 0, 0, 0, 44, 114, 84, 82, 67, 0, 0, 1, 176, 0, 0, 32, 12, 103, 84, 82, 67, 0, 0, 1, 176, 0, 0, 32, 12, 98, 84, 82, 67, 0, 0, 1, 176, 0, 0, 32, 12, 100, 101, 115, 99, 0, 0, 0, 0, 0, 0, 0, 22, 78, 105, 107, 111, 110, 32, 115, 82, 71, 66, 32, 52, 46, 48, 46, 48, 46, 51, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 78, 105, 107, 111, 110, 32, 115, 82, 71, 66, 32, 52, 46, 48, 46, 48, 46, 51, 48, 48, 49, 0, 0, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 111, 162, 0, 0, 56, 246, 0, 0, 3, 144, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 98, 148, 0, 0, 183, 133, 0, 0, 24, 217, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 36, 159, 0, 0, 15, 132, 0, 0, 182, 200, 88, 89, 90, 32, 0, 0, 0, 0, 0, 0, 243, 84, 0, 1, 0, 0, 0, 1, 22, 207, 116, 101, 120, 116, 0, 0, 0, 0, 78, 105, 107, 111, 110, 32, 73, 110, 99, 46, 32, 38, 32, 78, 105, 107, 111, 110, 32, 67, 111, 114, 112, 111, 114, 97, 116, 105, 111, 110, 32, 50, 48, 48, 50, 0, 99, 117, 114, 118, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 6, 0, 7, 0, 8, 0, 9, 0, 11, 0, 12, 0, 13, 0, 14, 0, 16, 0, 17, 0, 18, 0, 19, 0, 21, 0, 22, 0, 23, 0, 24, 0, 26, 0, 27, 0, 28, 0, 29, 0, 30, 0, 32, 0, 33, 0, 34, 0, 35, 0, 37, 0, 38, 0, 39, 0, 40, 0, 42, 0, 43, 0, 44, 0, 45, 0, 47, 0, 48, 0, 49, 0, 50, 0, 52, 0, 53, 0, 54, 0, 55, 0, 56, 0, 58, 0, 59, 0, 60, 0, 61, 0, 63, 0, 64, 0, 65, 0, 66, 0, 68, 0, 69, 0, 70, 0, 71, 0, 73, 0, 74, 0, 75, 0, 76, 0, 78, 0, 79, 0, 80, 0, 81, 0, 82, 0, 84, 0, 85, 0, 86, 0, 87, 0, 89, 0, 90, 0, 91, 0, 92, 0, 94, 0, 95, 0, 96, 0, 97, 0, 99, 0, 100, 0, 101, 0, 102, 0, 104, 0, 105, 0, 106, 0, 107, 0, 109, 0, 110, 0, 111, 0, 112, 0, 113, 0, 115, 0, 116, 0, 117, 0, 118, 0, 120, 0, 121, 0, 122, 0, 123, 0, 125, 0, 126, 0, 127, 0, 128, 0, 130, 0, 131, 0, 132, 0, 133, 0, 135, 0, 136, 0, 137, 0, 138, 0, 139, 0, 141, 0, 142, 0, 143, 0, 144, 0, 146, 0, 147, 0, 148, 0, 149, 0, 151, 0, 152, 0, 153, 0, 154, 0, 156, 0, 157, 0, 158, 0, 159, 0, 161, 0, 162, 0, 163, 0, 164, 0, 165, 0, 167, 0, 168, 0, 169, 0, 170, 0, 172, 0, 173, 0, 174, 0, 175, 0, 177, 0, 178, 0, 179, 0, 180, 0, 182, 0, 183, 0, 184, 0, 185, 0, 187, 0, 188, 0, 189, 0, 190, 0, 191, 0, 193, 0, 194, 0, 195, 0, 196, 0, 198, 0, 199, 0, 200, 0, 201, 0, 203, 0, 204, 0, 205, 0, 206, 0, 208, 0, 209, 0, 210, 0, 211, 0, 213, 0, 214, 0, 215, 0, 217, 0, 218, 0, 219, 0, 221, 0, 222, 0, 223, 0, 225, 0, 226, 0, 227, 0, 229, 0, 230, 0, 231, 0, 233, 0, 234, 0, 235, 0, 237, 0, 238, 0, 239, 0, 241, 0, 242, 0, 244, 0, 245, 0, 246, 0, 248, 0, 249, 0, 251, 0, 252, 0, 254, 0, 255, 1, 0, 1, 2, 1, 3, 1, 5, 1, 6, 1, 8, 1, 9, 1, 11, 1, 12, 1, 13, 1, 15, 1, 16, 1, 18, 1, 19, 1, 21, 1, 22, 1, 24, 1, 25, 1, 27, 1, 29, 1, 30, 1, 32, 1, 33, 1, 35, 1, 36, 1, 38, 1, 39, 1, 41, 1, 42, 1, 44, 1, 46, 1, 47, 1, 49, 1, 50, 1, 52, 1, 54, 1, 55, 1, 57, 1, 58, 1, 60, 1, 62, 1, 63, 1, 65, 1, 67, 1, 68, 1, 70, 1, 71, 1, 73, 1, 75, 1, 76, 1, 78, 1, 80, 1, 81, 1, 83, 1, 85, 1, 87, 1, 88, 1, 90, 1, 92, 1, 93, 1, 95, 1, 97, 1, 99, 1, 100, 1, 102, 1, 104, 1, 106, 1, 107, 1, 109, 1, 111, 1, 113, 1, 114, 1, 116, 1, 118, 1, 120, 1, 122, 1, 123, 1, 125, 1, 127, 1, 129, 1, 131, 1, 132, 1, 134, 1, 136, 1, 138, 1, 140, 1, 142, 1, 144, 1, 145, 1, 147, 1, 149, 1, 151, 1, 153, 1, 155, 1, 157, 1, 159, 1, 160, 1, 162, 1, 164, 1, 166, 1, 168, 1, 170, 1, 172, 1, 174, 1, 176, 1, 178, 1, 180, 1, 182, 1, 184, 1, 186, 1, 188, 1, 190, 1, 192, 1, 194, 1, 196, 1, 198, 1, 200, 1, 202, 1, 204, 1, 206, 1, 208, 1, 210, 1, 212, 1, 214, 1, 216, 1, 218, 1, 220, 1, 222, 1, 224, 1, 226, 1, 228, 1, 230, 1, 232, 1, 234, 1, 237, 1, 239, 1, 241, 1, 243, 1, 245, 1, 247, 1, 249, 1, 251, 1, 254, 2, 0, 2, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 13, 2, 15, 2, 17, 2, 19, 2, 21, 2, 24, 2, 26, 2, 28, 2, 30, 2, 32, 2, 35, 2, 37, 2, 39, 2, 41, 2, 44, 2, 46, 2, 48, 2, 50, 2, 53, 2, 55, 2, 57, 2, 60, 2, 62, 2, 64, 2, 67, 2, 69, 2, 71, 2, 73, 2, 76, 2, 78, 2, 80, 2, 83, 2, 85, 2, 87, 2, 90, 2, 92, 2, 95, 2, 97, 2, 99, 2, 102, 2, 104, 2, 107, 2, 109, 2, 111, 2, 114, 2, 116, 2, 119, 2, 121, 2, 123, 2, 126, 2, 128, 2, 131, 2, 133, 2, 136, 2, 138, 2, 141, 2, 143, 2, 146, 2, 148, 2, 151, 2, 153, 2, 156, 2, 158, 2, 161, 2, 163, 2, 166, 2, 168, 2, 171, 2, 173, 2, 176, 2, 178, 2, 181, 2, 184, 2, 186, 2, 189, 2, 191, 2, 194, 2, 196, 2, 199, 2, 202, 2, 204, 2, 207, 2, 209, 2, 212, 2, 215, 2, 217, 2, 220, 2, 223, 2, 225, 2, 228, 2, 231, 2, 233, 2, 236, 2, 239, 2, 241, 2, 244, 2, 247, 2, 249, 2, 252, 2, 255, 3, 2, 3, 4, 3, 7, 3, 10, 3, 13, 3, 15, 3, 18, 3, 21, 3, 24, 3, 26, 3, 29, 3, 32, 3, 35, 3, 38, 3, 40, 3, 43, 3, 46, 3, 49, 3, 52, 3, 54, 3, 57, 3, 60, 3, 63, 3, 66, 3, 69, 3, 72, 3, 74, 3, 77, 3, 80, 3, 83, 3, 86, 3, 89, 3, 92, 3, 95, 3, 98, 3, 100, 3, 103, 3, 106, 3, 109, 3, 112, 3, 115, 3, 118, 3, 121, 3, 124, 3, 127, 3, 130, 3, 133, 3, 136, 3, 139, 3, 142, 3, 145, 3, 148, 3, 151, 3, 154, 3, 157, 3, 160, 3, 163, 3, 166, 3, 169, 3, 172, 3, 175, 3, 178, 3, 182, 3, 185, 3, 188, 3, 191, 3, 194, 3, 197, 3, 200, 3, 203, 3, 206, 3, 209, 3, 213, 3, 216, 3, 219, 3, 222, 3, 225, 3, 228, 3, 232, 3, 235, 3, 238, 3, 241, 3, 244, 3, 247, 3, 251, 3, 254, 4, 1, 4, 4, 4, 8, 4, 11, 4, 14, 4, 17, 4, 21, 4, 24, 4, 27, 4, 30, 4, 34, 4, 37, 4, 40, 4, 43, 4, 47, 4, 50, 4, 53, 4, 57, 4, 60, 4, 63, 4, 67, 4, 70, 4, 73, 4, 77, 4, 80, 4, 84, 4, 87, 4, 90, 4, 94, 4, 97, 4, 100, 4, 104, 4, 107, 4, 111, 4, 114, 4, 117, 4, 121, 4, 124, 4, 128, 4, 131, 4, 135, 4, 138, 4, 142, 4, 145, 4, 149, 4, 152, 4, 156, 4, 159, 4, 163, 4, 166, 4, 170, 4, 173, 4, 177, 4, 180, 4, 184, 4, 187, 4, 191, 4, 194, 4, 198, 4, 202, 4, 205, 4, 209, 4, 212, 4, 216, 4, 219, 4, 223, 4, 227, 4, 230, 4, 234, 4, 238, 4, 241, 4, 245, 4, 249, 4, 252, 5, 0, 5, 4, 5, 7, 5, 11, 5, 15, 5, 18, 5, 22, 5, 26, 5, 29, 5, 33, 5, 37, 5, 41, 5, 44, 5, 48, 5, 52, 5, 56, 5, 59, 5, 63, 5, 67, 5, 71, 5, 74, 5, 78, 5, 82, 5, 86, 5, 90, 5, 93, 5, 97, 5, 101, 5, 105, 5, 109, 5, 113, 5, 116, 5, 120, 5, 124, 5, 128, 5, 132, 5, 136, 5, 140, 5, 144, 5, 147, 5, 151, 5, 155, 5, 159, 5, 163, 5, 167, 5, 171, 5, 175, 5, 179, 5, 183, 5, 187, 5, 191, 5, 195, 5, 199, 5, 203, 5, 207, 5, 211, 5, 215, 5, 219, 5, 223, 5, 227, 5, 231, 5, 235, 5, 239, 5, 243, 5, 247, 5, 251, 5, 255, 6, 3, 6, 7, 6, 12, 6, 16, 6, 20, 6, 24, 6, 28, 6, 32, 6, 36, 6, 40, 6, 44, 6, 49, 6, 53, 6, 57, 6, 61, 6, 65, 6, 69, 6, 74, 6, 78, 6, 82, 6, 86, 6, 90, 6, 95, 6, 99, 6, 103, 6, 107, 6, 112, 6, 116, 6, 120, 6, 124, 6, 129, 6, 133, 6, 137, 6, 142, 6, 146, 6, 150, 6, 154, 6, 159, 6, 163, 6, 167, 6, 172, 6, 176, 6, 180, 6, 185, 6, 189, 6, 193, 6, 198, 6, 202, 6, 207, 6, 211, 6, 215, 6, 220, 6, 224, 6, 229, 6, 233, 6, 237, 6, 242, 6, 246, 6, 251, 6, 255, 7, 4, 7, 8, 7, 13, 7, 17, 7, 22, 7, 26, 7, 31, 7, 35, 7, 40, 7, 44, 7, 49, 7, 53, 7, 58, 7, 62, 7, 67, 7, 71, 7, 76, 7, 81, 7, 85, 7, 90, 7, 94, 7, 99, 7, 104, 7, 108, 7, 113, 7, 117, 7, 122, 7, 127, 7, 131, 7, 136, 7, 141, 7, 145, 7, 150, 7, 155, 7, 159, 7, 164, 7, 169, 7, 173, 7, 178, 7, 183, 7, 188, 7, 192, 7, 197, 7, 202, 7, 207, 7, 211, 7, 216, 7, 221, 7, 226, 7, 230, 7, 235, 7, 240, 7, 245, 7, 250, 7, 254, 8, 3, 8, 8, 8, 13, 8, 18, 8, 23, 8, 27, 8, 32, 8, 37, 8, 42, 8, 47, 8, 52, 8, 57, 8, 62, 8, 67, 8, 71, 8, 76, 8, 81, 8, 86, 8, 91, 8, 96, 8, 101, 8, 106, 8, 111, 8, 116, 8, 121, 8, 126, 8, 131, 8, 136, 8, 141, 8, 146, 8, 151, 8, 156, 8, 161, 8, 166, 8, 171, 8, 176, 8, 181, 8, 186, 8, 191, 8, 197, 8, 202, 8, 207, 8, 212, 8, 217, 8, 222, 8, 227, 8, 232, 8, 237, 8, 243, 8, 248, 8, 253, 9, 2, 9, 7, 9, 12, 9, 18, 9, 23, 9, 28, 9, 33, 9, 38, 9, 44, 9, 49, 9, 54, 9, 59, 9, 65, 9, 70, 9, 75, 9, 80, 9, 86, 9, 91, 9, 96, 9, 102, 9, 107, 9, 112, 9, 117, 9, 123, 9, 128, 9, 133, 9, 139, 9, 144, 9, 149, 9, 155, 9, 160, 9, 166, 9, 171, 9, 176, 9, 182, 9, 187, 9, 193, 9, 198, 9, 203, 9, 209, 9, 214, 9, 220, 9, 225, 9, 231, 9, 236, 9, 242, 9, 247, 9, 252, 10, 2, 10, 7, 10, 13, 10, 18, 10, 24, 10, 30, 10, 35, 10, 41, 10, 46, 10, 52, 10, 57, 10, 63, 10, 68, 10, 74, 10, 80, 10, 85, 10, 91, 10, 96, 10, 102, 10, 108, 10, 113, 10, 119, 10, 125, 10, 130, 10, 136, 10, 142, 10, 147, 10, 153, 10, 159, 10, 164, 10, 170, 10, 176, 10, 181, 10, 187, 10, 193, 10, 199, 10, 204, 10, 210, 10, 216, 10, 222, 10, 227, 10, 233, 10, 239, 10, 245, 10, 250, 11, 0, 11, 6, 11, 12, 11, 18, 11, 24, 11, 29, 11, 35, 11, 41, 11, 47, 11, 53, 11, 59, 11, 65, 11, 70, 11, 76, 11, 82, 11, 88, 11, 94, 11, 100, 11, 106, 11, 112, 11, 118, 11, 124, 11, 130, 11, 136, 11, 142, 11, 148, 11, 154, 11, 160, 11, 166, 11, 172, 11, 178, 11, 184, 11, 190, 11, 196, 11, 202, 11, 208, 11, 214, 11, 220, 11, 226, 11, 232, 11, 238, 11, 244, 11, 250, 12, 0, 12, 7, 12, 13, 12, 19, 12, 25, 12, 31, 12, 37, 12, 43, 12, 50, 12, 56, 12, 62, 12, 68, 12, 74, 12, 80, 12, 87, 12, 93, 12, 99, 12, 105, 12, 112, 12, 118, 12, 124, 12, 130, 12, 137, 12, 143, 12, 149, 12, 155, 12, 162, 12, 168, 12, 174, 12, 181, 12, 187, 12, 193, 12, 200, 12, 206, 12, 212, 12, 219, 12, 225, 12, 231, 12, 238, 12, 244, 12, 250, 13, 1, 13, 7, 13, 14, 13, 20, 13, 27, 13, 33, 13, 39, 13, 46, 13, 52, 13, 59, 13, 65, 13, 72, 13, 78, 13, 85, 13, 91, 13, 98, 13, 104, 13, 111, 13, 117, 13, 124, 13, 130, 13, 137, 13, 143, 13, 150, 13, 157, 13, 163, 13, 170, 13, 176, 13, 183, 13, 190, 13, 196, 13, 203, 13, 209, 13, 216, 13, 223, 13, 229, 13, 236, 13, 243, 13, 249, 14, 0, 14, 7, 14, 13, 14, 20, 14, 27, 14, 34, 14, 40, 14, 47, 14, 54, 14, 60, 14, 67, 14, 74, 14, 81, 14, 87, 14, 94, 14, 101, 14, 108, 14, 115, 14, 121, 14, 128, 14, 135, 14, 142, 14, 149, 14, 156, 14, 162, 14, 169, 14, 176, 14, 183, 14, 190, 14, 197, 14, 204, 14, 211, 14, 218, 14, 225, 14, 231, 14, 238, 14, 245, 14, 252, 15, 3, 15, 10, 15, 17, 15, 24, 15, 31, 15, 38, 15, 45, 15, 52, 15, 59, 15, 66, 15, 73, 15, 80, 15, 87, 15, 94, 15, 101, 15, 108, 15, 116, 15, 123, 15, 130, 15, 137, 15, 144, 15, 151, 15, 158, 15, 165, 15, 172, 15, 180, 15, 187, 15, 194, 15, 201, 15, 208, 15, 215, 15, 223, 15, 230, 15, 237, 15, 244, 15, 251, 16, 3, 16, 10, 16, 17, 16, 24, 16, 32, 16, 39, 16, 46, 16, 53, 16, 61, 16, 68, 16, 75, 16, 83, 16, 90, 16, 97, 16, 105, 16, 112, 16, 119, 16, 127, 16, 134, 16, 141, 16, 149, 16, 156, 16, 163, 16, 171, 16, 178, 16, 186, 16, 193, 16, 200, 16, 208, 16, 215, 16, 223, 16, 230, 16, 238, 16, 245, 16, 253, 17, 4, 17, 12, 17, 19, 17, 27, 17, 34, 17, 42, 17, 49, 17, 57, 17, 64, 17, 72, 17, 79, 17, 87, 17, 95, 17, 102, 17, 110, 17, 117, 17, 125, 17, 133, 17, 140, 17, 148, 17, 155, 17, 163, 17, 171, 17, 178, 17, 186, 17, 194, 17, 201, 17, 209, 17, 217, 17, 224, 17, 232, 17, 240, 17, 248, 17, 255, 18, 7, 18, 15, 18, 23, 18, 30, 18, 38, 18, 46, 18, 54, 18, 62, 18, 69, 18, 77, 18, 85, 18, 93, 18, 101, 18, 108, 18, 116, 18, 124, 18, 132, 18, 140, 18, 148, 18, 156, 18, 164, 18, 171, 18, 179, 18, 187, 18, 195, 18, 203, 18, 211, 18, 219, 18, 227, 18, 235, 18, 243, 18, 251, 19, 3, 19, 11, 19, 19, 19, 27, 19, 35, 19, 43, 19, 51, 19, 59, 19, 67, 19, 75, 19, 83, 19, 91, 19, 99, 19, 107, 19, 115, 19, 124, 19, 132, 19, 140, 19, 148, 19, 156, 19, 164, 19, 172, 19, 180, 19, 189, 19, 197, 19, 205, 19, 213, 19, 221, 19, 230, 19, 238, 19, 246, 19, 254, 20, 6, 20, 15, 20, 23, 20, 31, 20, 39, 20, 48, 20, 56, 20, 64, 20, 73, 20, 81, 20, 89, 20, 97, 20, 106, 20, 114, 20, 122, 20, 131, 20, 139, 20, 148, 20, 156, 20, 164, 20, 173, 20, 181, 20, 189, 20, 198, 20, 206, 20, 215, 20, 223, 20, 232, 20, 240, 20, 248, 21, 1, 21, 9, 21, 18, 21, 26, 21, 35, 21, 43, 21, 52, 21, 60, 21, 69, 21, 77, 21, 86, 21, 95, 21, 103, 21, 112, 21, 120, 21, 129, 21, 137, 21, 146, 21, 155, 21, 163, 21, 172, 21, 180, 21, 189, 21, 198, 21, 206, 21, 215, 21, 224, 21, 232, 21, 241, 21, 250, 22, 2, 22, 11, 22, 20, 22, 29, 22, 37, 22, 46, 22, 55, 22, 64, 22, 72, 22, 81, 22, 90, 22, 99, 22, 107, 22, 116, 22, 125, 22, 134, 22, 143, 22, 152, 22, 160, 22, 169, 22, 178, 22, 187, 22, 196, 22, 205, 22, 214, 22, 222, 22, 231, 22, 240, 22, 249, 23, 2, 23, 11, 23, 20, 23, 29, 23, 38, 23, 47, 23, 56, 23, 65, 23, 74, 23, 83, 23, 92, 23, 101, 23, 110, 23, 119, 23, 128, 23, 137, 23, 146, 23, 155, 23, 164, 23, 173, 23, 182, 23, 191, 23, 200, 23, 210, 23, 219, 23, 228, 23, 237, 23, 246, 23, 255, 24, 8, 24, 18, 24, 27, 24, 36, 24, 45, 24, 54, 24, 63, 24, 73, 24, 82, 24, 91, 24, 100, 24, 110, 24, 119, 24, 128, 24, 137, 24, 147, 24, 156, 24, 165, 24, 175, 24, 184, 24, 193, 24, 202, 24, 212, 24, 221, 24, 231, 24, 240, 24, 249, 25, 3, 25, 12, 25, 21, 25, 31, 25, 40, 25, 50, 25, 59, 25, 68, 25, 78, 25, 87, 25, 97, 25, 106, 25, 116, 25, 125, 25, 135, 25, 144, 25, 154, 25, 163, 25, 173, 25, 182, 25, 192, 25, 201, 25, 211, 25, 220, 25, 230, 25, 239, 25, 249, 26, 3, 26, 12, 26, 22, 26, 31, 26, 41, 26, 51, 26, 60, 26, 70, 26, 80, 26, 89, 26, 99, 26, 109, 26, 118, 26, 128, 26, 138, 26, 147, 26, 157, 26, 167, 26, 177, 26, 186, 26, 196, 26, 206, 26, 216, 26, 225, 26, 235, 26, 245, 26, 255, 27, 9, 27, 18, 27, 28, 27, 38, 27, 48, 27, 58, 27, 68, 27, 77, 27, 87, 27, 97, 27, 107, 27, 117, 27, 127, 27, 137, 27, 147, 27, 157, 27, 167, 27, 177, 27, 186, 27, 196, 27, 206, 27, 216, 27, 226, 27, 236, 27, 246, 28, 0, 28, 10, 28, 20, 28, 30, 28, 40, 28, 51, 28, 61, 28, 71, 28, 81, 28, 91, 28, 101, 28, 111, 28, 121, 28, 131, 28, 141, 28, 151, 28, 162, 28, 172, 28, 182, 28, 192, 28, 202, 28, 212, 28, 223, 28, 233, 28, 243, 28, 253, 29, 7, 29, 18, 29, 28, 29, 38, 29, 48, 29, 59, 29, 69, 29, 79, 29, 90, 29, 100, 29, 110, 29, 120, 29, 131, 29, 141, 29, 151, 29, 162, 29, 172, 29, 183, 29, 193, 29, 203, 29, 214, 29, 224, 29, 234, 29, 245, 29, 255, 30, 10, 30, 20, 30, 31, 30, 41, 30, 51, 30, 62, 30, 72, 30, 83, 30, 93, 30, 104, 30, 114, 30, 125, 30, 135, 30, 146, 30, 157, 30, 167, 30, 178, 30, 188, 30, 199, 30, 209, 30, 220, 30, 231, 30, 241, 30, 252, 31, 6, 31, 17, 31, 28, 31, 38, 31, 49, 31, 60, 31, 70, 31, 81, 31, 92, 31, 102, 31, 113, 31, 124, 31, 135, 31, 145, 31, 156, 31, 167, 31, 178, 31, 188, 31, 199, 31, 210, 31, 221, 31, 232, 31, 242, 31, 253, 32, 8, 32, 19, 32, 30, 32, 41, 32, 51, 32, 62, 32, 73, 32, 84, 32, 95, 32, 106, 32, 117, 32, 128, 32, 139, 32, 149, 32, 160, 32, 171, 32, 182, 32, 193, 32, 204, 32, 215, 32, 226, 32, 237, 32, 248, 33, 3, 33, 14, 33, 25, 33, 36, 33, 47, 33, 58, 33, 70, 33, 81, 33, 92, 33, 103, 33, 114, 33, 125, 33, 136, 33, 147, 33, 158, 33, 170, 33, 181, 33, 192, 33, 203, 33, 214, 33, 225, 33, 237, 33, 248, 34, 3, 34, 14, 34, 25, 34, 37, 34, 48, 34, 59, 34, 70, 34, 82, 34, 93, 34, 104, 34, 116, 34, 127, 34, 138, 34, 150, 34, 161, 34, 172, 34, 184, 34, 195, 34, 206, 34, 218, 34, 229, 34, 240, 34, 252, 35, 7, 35, 19, 35, 30, 35, 41, 35, 53, 35, 64, 35, 76, 35, 87, 35, 99, 35, 110, 35, 122, 35, 133, 35, 145, 35, 156, 35, 168, 35, 179, 35, 191, 35, 202, 35, 214, 35, 226, 35, 237, 35, 249, 36, 4, 36, 16, 36, 28, 36, 39, 36, 51, 36, 62, 36, 74, 36, 86, 36, 97, 36, 109, 36, 121, 36, 132, 36, 144, 36, 156, 36, 168, 36, 179, 36, 191, 36, 203, 36, 214, 36, 226, 36, 238, 36, 250, 37, 6, 37, 17, 37, 29, 37, 41, 37, 53, 37, 65, 37, 76, 37, 88, 37, 100, 37, 112, 37, 124, 37, 136, 37, 148, 37, 159, 37, 171, 37, 183, 37, 195, 37, 207, 37, 219, 37, 231, 37, 243, 37, 255, 38, 11, 38, 23, 38, 35, 38, 47, 38, 59, 38, 71, 38, 83, 38, 95, 38, 107, 38, 119, 38, 131, 38, 143, 38, 155, 38, 167, 38, 179, 38, 191, 38, 204, 38, 216, 38, 228, 38, 240, 38, 252, 39, 8, 39, 20, 39, 33, 39, 45, 39, 57, 39, 69, 39, 81, 39, 93, 39, 106, 39, 118, 39, 130, 39, 142, 39, 155, 39, 167, 39, 179, 39, 191, 39, 204, 39, 216, 39, 228, 39, 241, 39, 253, 40, 9, 40, 22, 40, 34, 40, 46, 40, 59, 40, 71, 40, 83, 40, 96, 40, 108, 40, 121, 40, 133, 40, 146, 40, 158, 40, 170, 40, 183, 40, 195, 40, 208, 40, 220, 40, 233, 40, 245, 41, 2, 41, 14, 41, 27, 41, 39, 41, 52, 41, 64, 41, 77, 41, 90, 41, 102, 41, 115, 41, 127, 41, 140, 41, 152, 41, 165, 41, 178, 41, 190, 41, 203, 41, 216, 41, 228, 41, 241, 41, 254, 42, 10, 42, 23, 42, 36, 42, 48, 42, 61, 42, 74, 42, 87, 42, 99, 42, 112, 42, 125, 42, 138, 42, 151, 42, 163, 42, 176, 42, 189, 42, 202, 42, 215, 42, 227, 42, 240, 42, 253, 43, 10, 43, 23, 43, 36, 43, 49, 43, 61, 43, 74, 43, 87, 43, 100, 43, 113, 43, 126, 43, 139, 43, 152, 43, 165, 43, 178, 43, 191, 43, 204, 43, 217, 43, 230, 43, 243, 44, 0, 44, 13, 44, 26, 44, 39, 44, 52, 44, 65, 44, 78, 44, 91, 44, 105, 44, 118, 44, 131, 44, 144, 44, 157, 44, 170, 44, 183, 44, 197, 44, 210, 44, 223, 44, 236, 44, 249, 45, 6, 45, 20, 45, 33, 45, 46, 45, 59, 45, 73, 45, 86, 45, 99, 45, 112, 45, 126, 45, 139, 45, 152, 45, 166, 45, 179, 45, 192, 45, 206, 45, 219, 45, 232, 45, 246, 46, 3, 46, 16, 46, 30, 46, 43, 46, 57, 46, 70, 46, 83, 46, 97, 46, 110, 46, 124, 46, 137, 46, 151, 46, 164, 46, 178, 46, 191, 46, 205, 46, 218, 46, 232, 46, 245, 47, 3, 47, 16, 47, 30, 47, 43, 47, 57, 47, 71, 47, 84, 47, 98, 47, 111, 47, 125, 47, 139, 47, 152, 47, 166, 47, 180, 47, 193, 47, 207, 47, 221, 47, 234, 47, 248, 48, 6, 48, 20, 48, 33, 48, 47, 48, 61, 48, 74, 48, 88, 48, 102, 48, 116, 48, 130, 48, 143, 48, 157, 48, 171, 48, 185, 48, 199, 48, 213, 48, 226, 48, 240, 48, 254, 49, 12, 49, 26, 49, 40, 49, 54, 49, 68, 49, 82, 49, 96, 49, 109, 49, 123, 49, 137, 49, 151, 49, 165, 49, 179, 49, 193, 49, 207, 49, 221, 49, 235, 49, 249, 50, 7, 50, 21, 50, 36, 50, 50, 50, 64, 50, 78, 50, 92, 50, 106, 50, 120, 50, 134, 50, 148, 50, 162, 50, 177, 50, 191, 50, 205, 50, 219, 50, 233, 50, 248, 51, 6, 51, 20, 51, 34, 51, 48, 51, 63, 51, 77, 51, 91, 51, 105, 51, 120, 51, 134, 51, 148, 51, 163, 51, 177, 51, 191, 51, 206, 51, 220, 51, 234, 51, 249, 52, 7, 52, 21, 52, 36, 52, 50, 52, 65, 52, 79, 52, 93, 52, 108, 52, 122, 52, 137, 52, 151, 52, 166, 52, 180, 52, 195, 52, 209, 52, 224, 52, 238, 52, 253, 53, 11, 53, 26, 53, 40, 53, 55, 53, 69, 53, 84, 53, 99, 53, 113, 53, 128, 53, 142, 53, 157, 53, 172, 53, 186, 53, 201, 53, 216, 53, 230, 53, 245, 54, 4, 54, 18, 54, 33, 54, 48, 54, 62, 54, 77, 54, 92, 54, 107, 54, 121, 54, 136, 54, 151, 54, 166, 54, 180, 54, 195, 54, 210, 54, 225, 54, 240, 54, 255, 55, 13, 55, 28, 55, 43, 55, 58, 55, 73, 55, 88, 55, 103, 55, 118, 55, 133, 55, 147, 55, 162, 55, 177, 55, 192, 55, 207, 55, 222, 55, 237, 55, 252, 56, 11, 56, 26, 56, 41, 56, 56, 56, 71, 56, 86, 56, 101, 56, 117, 56, 132, 56, 147, 56, 162, 56, 177, 56, 192, 56, 207, 56, 222, 56, 237, 56, 253, 57, 12, 57, 27, 57, 42, 57, 57, 57, 72, 57, 88, 57, 103, 57, 118, 57, 133, 57, 149, 57, 164, 57, 179, 57, 194, 57, 210, 57, 225, 57, 240, 58, 0, 58, 15, 58, 30, 58, 46, 58, 61, 58, 76, 58, 92, 58, 107, 58, 122, 58, 138, 58, 153, 58, 169, 58, 184, 58, 199, 58, 215, 58, 230, 58, 246, 59, 5, 59, 21, 59, 36, 59, 52, 59, 67, 59, 83, 59, 98, 59, 114, 59, 129, 59, 145, 59, 160, 59, 176, 59, 192, 59, 207, 59, 223, 59, 238, 59, 254, 60, 14, 60, 29, 60, 45, 60, 60, 60, 76, 60, 92, 60, 107, 60, 123, 60, 139, 60, 155, 60, 170, 60, 186, 60, 202, 60, 217, 60, 233, 60, 249, 61, 9, 61, 25, 61, 40, 61, 56, 61, 72, 61, 88, 61, 104, 61, 119, 61, 135, 61, 151, 61, 167, 61, 183, 61, 199, 61, 215, 61, 231, 61, 246, 62, 6, 62, 22, 62, 38, 62, 54, 62, 70, 62, 86, 62, 102, 62, 118, 62, 134, 62, 150, 62, 166, 62, 182, 62, 198, 62, 214, 62, 230, 62, 246, 63, 6, 63, 22, 63, 38, 63, 55, 63, 71, 63, 87, 63, 103, 63, 119, 63, 135, 63, 151, 63, 168, 63, 184, 63, 200, 63, 216, 63, 232, 63, 248, 64, 9, 64, 25, 64, 41, 64, 57, 64, 74, 64, 90, 64, 106, 64, 122, 64, 139, 64, 155, 64, 171, 64, 188, 64, 204, 64, 220, 64, 237, 64, 253, 65, 13, 65, 30, 65, 46, 65, 63, 65, 79, 65, 95, 65, 112, 65, 128, 65, 145, 65, 161, 65, 178, 65, 194, 65, 211, 65, 227, 65, 244, 66, 4, 66, 21, 66, 37, 66, 54, 66, 70, 66, 87, 66, 103, 66, 120, 66, 136, 66, 153, 66, 170, 66, 186, 66, 203, 66, 220, 66, 236, 66, 253, 67, 14, 67, 30, 67, 47, 67, 64, 67, 80, 67, 97, 67, 114, 67, 130, 67, 147, 67, 164, 67, 181, 67, 197, 67, 214, 67, 231, 67, 248, 68, 9, 68, 25, 68, 42, 68, 59, 68, 76, 68, 93, 68, 110, 68, 126, 68, 143, 68, 160, 68, 177, 68, 194, 68, 211, 68, 228, 68, 245, 69, 6, 69, 23, 69, 40, 69, 57, 69, 74, 69, 91, 69, 108, 69, 125, 69, 142, 69, 159, 69, 176, 69, 193, 69, 210, 69, 227, 69, 244, 70, 5, 70, 22, 70, 39, 70, 56, 70, 73, 70, 91, 70, 108, 70, 125, 70, 142, 70, 159, 70, 176, 70, 194, 70, 211, 70, 228, 70, 245, 71, 6, 71, 24, 71, 41, 71, 58, 71, 75, 71, 93, 71, 110, 71, 127, 71, 145, 71, 162, 71, 179, 71, 197, 71, 214, 71, 231, 71, 249, 72, 10, 72, 27, 72, 45, 72, 62, 72, 80, 72, 97, 72, 114, 72, 132, 72, 149, 72, 167, 72, 184, 72, 202, 72, 219, 72, 237, 72, 254, 73, 16, 73, 33, 73, 51, 73, 68, 73, 86, 73, 103, 73, 121, 73, 139, 73, 156, 73, 174, 73, 191, 73, 209, 73, 227, 73, 244, 74, 6, 74, 24, 74, 41, 74, 59, 74, 77, 74, 94, 74, 112, 74, 130, 74, 147, 74, 165, 74, 183, 74, 201, 74, 218, 74, 236, 74, 254, 75, 16, 75, 34, 75, 51, 75, 69, 75, 87, 75, 105, 75, 123, 75, 141, 75, 159, 75, 176, 75, 194, 75, 212, 75, 230, 75, 248, 76, 10, 76, 28, 76, 46, 76, 64, 76, 82, 76, 100, 76, 118, 76, 136, 76, 154, 76, 172, 76, 190, 76, 208, 76, 226, 76, 244, 77, 6, 77, 24, 77, 42, 77, 60, 77, 78, 77, 96, 77, 115, 77, 133, 77, 151, 77, 169, 77, 187, 77, 205, 77, 223, 77, 242, 78, 4, 78, 22, 78, 40, 78, 59, 78, 77, 78, 95, 78, 113, 78, 132, 78, 150, 78, 168, 78, 186, 78, 205, 78, 223, 78, 241, 79, 4, 79, 22, 79, 40, 79, 59, 79, 77, 79, 95, 79, 114, 79, 132, 79, 151, 79, 169, 79, 188, 79, 206, 79, 224, 79, 243, 80, 5, 80, 24, 80, 42, 80, 61, 80, 79, 80, 98, 80, 116, 80, 135, 80, 153, 80, 172, 80, 191, 80, 209, 80, 228, 80, 246, 81, 9, 81, 28, 81, 46, 81, 65, 81, 83, 81, 102, 81, 121, 81, 139, 81, 158, 81, 177, 81, 196, 81, 214, 81, 233, 81, 252, 82, 14, 82, 33, 82, 52, 82, 71, 82, 90, 82, 108, 82, 127, 82, 146, 82, 165, 82, 184, 82, 202, 82, 221, 82, 240, 83, 3, 83, 22, 83, 41, 83, 60, 83, 79, 83, 97, 83, 116, 83, 135, 83, 154, 83, 173, 83, 192, 83, 211, 83, 230, 83, 249, 84, 12, 84, 31, 84, 50, 84, 69, 84, 88, 84, 107, 84, 126, 84, 146, 84, 165, 84, 184, 84, 203, 84, 222, 84, 241, 85, 4, 85, 23, 85, 42, 85, 62, 85, 81, 85, 100, 85, 119, 85, 138, 85, 158, 85, 177, 85, 196, 85, 215, 85, 235, 85, 254, 86, 17, 86, 36, 86, 56, 86, 75, 86, 94, 86, 114, 86, 133, 86, 152, 86, 172, 86, 191, 86, 210, 86, 230, 86, 249, 87, 13, 87, 32, 87, 51, 87, 71, 87, 90, 87, 110, 87, 129, 87, 149, 87, 168, 87, 188, 87, 207, 87, 227, 87, 246, 88, 10, 88, 29, 88, 49, 88, 68, 88, 88, 88, 107, 88, 127, 88, 147, 88, 166, 88, 186, 88, 205, 88, 225, 88, 245, 89, 8, 89, 28, 89, 48, 89, 67, 89, 87, 89, 107, 89, 127, 89, 146, 89, 166, 89, 186, 89, 206, 89, 225, 89, 245, 90, 9, 90, 29, 90, 48, 90, 68, 90, 88, 90, 108, 90, 128, 90, 148, 90, 167, 90, 187, 90, 207, 90, 227, 90, 247, 91, 11, 91, 31, 91, 51, 91, 71, 91, 91, 91, 111, 91, 131, 91, 151, 91, 171, 91, 191, 91, 211, 91, 231, 91, 251, 92, 15, 92, 35, 92, 55, 92, 75, 92, 95, 92, 115, 92, 135, 92, 155, 92, 175, 92, 196, 92, 216, 92, 236, 93, 0, 93, 20, 93, 40, 93, 61, 93, 81, 93, 101, 93, 121, 93, 141, 93, 162, 93, 182, 93, 202, 93, 222, 93, 243, 94, 7, 94, 27, 94, 48, 94, 68, 94, 88, 94, 109, 94, 129, 94, 149, 94, 170, 94, 190, 94, 211, 94, 231, 94, 251, 95, 16, 95, 36, 95, 57, 95, 77, 95, 98, 95, 118, 95, 139, 95, 159, 95, 180, 95, 200, 95, 221, 95, 241, 96, 6, 96, 26, 96, 47, 96, 67, 96, 88, 96, 108, 96, 129, 96, 150, 96, 170, 96, 191, 96, 212, 96, 232, 96, 253, 97, 18, 97, 38, 97, 59, 97, 80, 97, 100, 97, 121, 97, 142, 97, 163, 97, 183, 97, 204, 97, 225, 97, 246, 98, 10, 98, 31, 98, 52, 98, 73, 98, 94, 98, 115, 98, 135, 98, 156, 98, 177, 98, 198, 98, 219, 98, 240, 99, 5, 99, 26, 99, 47, 99, 68, 99, 89, 99, 109, 99, 130, 99, 151, 99, 172, 99, 193, 99, 214, 99, 235, 100, 1, 100, 22, 100, 43, 100, 64, 100, 85, 100, 106, 100, 127, 100, 148, 100, 169, 100, 190, 100, 211, 100, 233, 100, 254, 101, 19, 101, 40, 101, 61, 101, 82, 101, 104, 101, 125, 101, 146, 101, 167, 101, 189, 101, 210, 101, 231, 101, 252, 102, 18, 102, 39, 102, 60, 102, 82, 102, 103, 102, 124, 102, 146, 102, 167, 102, 188, 102, 210, 102, 231, 102, 253, 103, 18, 103, 39, 103, 61, 103, 82, 103, 104, 103, 125, 103, 147, 103, 168, 103, 190, 103, 211, 103, 233, 103, 254, 104, 20, 104, 41, 104, 63, 104, 84, 104, 106, 104, 127, 104, 149, 104, 171, 104, 192, 104, 214, 104, 235, 105, 1, 105, 23, 105, 44, 105, 66, 105, 88, 105, 110, 105, 131, 105, 153, 105, 175, 105, 196, 105, 218, 105, 240, 106, 6, 106, 27, 106, 49, 106, 71, 106, 93, 106, 115, 106, 136, 106, 158, 106, 180, 106, 202, 106, 224, 106, 246, 107, 12, 107, 34, 107, 55, 107, 77, 107, 99, 107, 121, 107, 143, 107, 165, 107, 187, 107, 209, 107, 231, 107, 253, 108, 19, 108, 41, 108, 63, 108, 85, 108, 107, 108, 129, 108, 151, 108, 173, 108, 196, 108, 218, 108, 240, 109, 6, 109, 28, 109, 50, 109, 72, 109, 94, 109, 117, 109, 139, 109, 161, 109, 183, 109, 205, 109, 228, 109, 250, 110, 16, 110, 38, 110, 61, 110, 83, 110, 105, 110, 127, 110, 150, 110, 172, 110, 194, 110, 217, 110, 239, 111, 5, 111, 28, 111, 50, 111, 73, 111, 95, 111, 117, 111, 140, 111, 162, 111, 185, 111, 207, 111, 230, 111, 252, 112, 19, 112, 41, 112, 64, 112, 86, 112, 109, 112, 131, 112, 154, 112, 176, 112, 199, 112, 221, 112, 244, 113, 11, 113, 33, 113, 56, 113, 78, 113, 101, 113, 124, 113, 146, 113, 169, 113, 192, 113, 214, 113, 237, 114, 4, 114, 27, 114, 49, 114, 72, 114, 95, 114, 117, 114, 140, 114, 163, 114, 186, 114, 209, 114, 231, 114, 254, 115, 21, 115, 44, 115, 67, 115, 90, 115, 113, 115, 135, 115, 158, 115, 181, 115, 204, 115, 227, 115, 250, 116, 17, 116, 40, 116, 63, 116, 86, 116, 109, 116, 132, 116, 155, 116, 178, 116, 201, 116, 224, 116, 247, 117, 14, 117, 37, 117, 60, 117, 83, 117, 106, 117, 129, 117, 153, 117, 176, 117, 199, 117, 222, 117, 245, 118, 12, 118, 36, 118, 59, 118, 82, 118, 105, 118, 128, 118, 152, 118, 175, 118, 198, 118, 221, 118, 245, 119, 12, 119, 35, 119, 59, 119, 82, 119, 105, 119, 129, 119, 152, 119, 175, 119, 199, 119, 222, 119, 245, 120, 13, 120, 36, 120, 60, 120, 83, 120, 106, 120, 130, 120, 153, 120, 177, 120, 200, 120, 224, 120, 247, 121, 15, 121, 38, 121, 62, 121, 85, 121, 109, 121, 133, 121, 156, 121, 180, 121, 203, 121, 227, 121, 251, 122, 18, 122, 42, 122, 66, 122, 89, 122, 113, 122, 137, 122, 160, 122, 184, 122, 208, 122, 231, 122, 255, 123, 23, 123, 47, 123, 70, 123, 94, 123, 118, 123, 142, 123, 166, 123, 189, 123, 213, 123, 237, 124, 5, 124, 29, 124, 53, 124, 76, 124, 100, 124, 124, 124, 148, 124, 172, 124, 196, 124, 220, 124, 244, 125, 12, 125, 36, 125, 60, 125, 84, 125, 108, 125, 132, 125, 156, 125, 180, 125, 204, 125, 228, 125, 252, 126, 20, 126, 44, 126, 68, 126, 93, 126, 117, 126, 141, 126, 165, 126, 189, 126, 213, 126, 237, 127, 6, 127, 30, 127, 54, 127, 78, 127, 102, 127, 127, 127, 151, 127, 175, 127, 199, 127, 224, 127, 248, 128, 16, 128, 41, 128, 65, 128, 89, 128, 114, 128, 138, 128, 162, 128, 187, 128, 211, 128, 236, 129, 4, 129, 28, 129, 53, 129, 77, 129, 102, 129, 126, 129, 151, 129, 175, 129, 200, 129, 224, 129, 249, 130, 17, 130, 42, 130, 66, 130, 91, 130, 115, 130, 140, 130, 164, 130, 189, 130, 214, 130, 238, 131, 7, 131, 32, 131, 56, 131, 81, 131, 105, 131, 130, 131, 155, 131, 180, 131, 204, 131, 229, 131, 254, 132, 22, 132, 47, 132, 72, 132, 97, 132, 122, 132, 146, 132, 171, 132, 196, 132, 221, 132, 246, 133, 14, 133, 39, 133, 64, 133, 89, 133, 114, 133, 139, 133, 164, 133, 189, 133, 214, 133, 239, 134, 8, 134, 33, 134, 57, 134, 82, 134, 107, 134, 132, 134, 158, 134, 183, 134, 208, 134, 233, 135, 2, 135, 27, 135, 52, 135, 77, 135, 102, 135, 127, 135, 152, 135, 177, 135, 203, 135, 228, 135, 253, 136, 22, 136, 47, 136, 72, 136, 98, 136, 123, 136, 148, 136, 173, 136, 199, 136, 224, 136, 249, 137, 18, 137, 44, 137, 69, 137, 94, 137, 120, 137, 145, 137, 170, 137, 196, 137, 221, 137, 246, 138, 16, 138, 41, 138, 67, 138, 92, 138, 117, 138, 143, 138, 168, 138, 194, 138, 219, 138, 245, 139, 14, 139, 40, 139, 65, 139, 91, 139, 116, 139, 142, 139, 168, 139, 193, 139, 219, 139, 244, 140, 14, 140, 39, 140, 65, 140, 91, 140, 116, 140, 142, 140, 168, 140, 193, 140, 219, 140, 245, 141, 14, 141, 40, 141, 66, 141, 92, 141, 117, 141, 143, 141, 169, 141, 195, 141, 221, 141, 246, 142, 16, 142, 42, 142, 68, 142, 94, 142, 120, 142, 145, 142, 171, 142, 197, 142, 223, 142, 249, 143, 19, 143, 45, 143, 71, 143, 97, 143, 123, 143, 149, 143, 175, 143, 201, 143, 227, 143, 253, 144, 23, 144, 49, 144, 75, 144, 101, 144, 127, 144, 153, 144, 179, 144, 205, 144, 231, 145, 2, 145, 28, 145, 54, 145, 80, 145, 106, 145, 132, 145, 159, 145, 185, 145, 211, 145, 237, 146, 7, 146, 34, 146, 60, 146, 86, 146, 112, 146, 139, 146, 165, 146, 191, 146, 218, 146, 244, 147, 14, 147, 41, 147, 67, 147, 93, 147, 120, 147, 146, 147, 173, 147, 199, 147, 225, 147, 252, 148, 22, 148, 49, 148, 75, 148, 102, 148, 128, 148, 155, 148, 181, 148, 208, 148, 234, 149, 5, 149, 31, 149, 58, 149, 85, 149, 111, 149, 138, 149, 164, 149, 191, 149, 218, 149, 244, 150, 15, 150, 42, 150, 68, 150, 95, 150, 122, 150, 148, 150, 175, 150, 202, 150, 229, 150, 255, 151, 26, 151, 53, 151, 80, 151, 106, 151, 133, 151, 160, 151, 187, 151, 214, 151, 241, 152, 11, 152, 38, 152, 65, 152, 92, 152, 119, 152, 146, 152, 173, 152, 200, 152, 227, 152, 254, 153, 25, 153, 52, 153, 79, 153, 106, 153, 133, 153, 160, 153, 187, 153, 214, 153, 241, 154, 12, 154, 39, 154, 66, 154, 93, 154, 120, 154, 147, 154, 174, 154, 202, 154, 229, 155, 0, 155, 27, 155, 54, 155, 81, 155, 109, 155, 136, 155, 163, 155, 190, 155, 218, 155, 245, 156, 16, 156, 43, 156, 71, 156, 98, 156, 125, 156, 153, 156, 180, 156, 207, 156, 235, 157, 6, 157, 33, 157, 61, 157, 88, 157, 116, 157, 143, 157, 171, 157, 198, 157, 225, 157, 253, 158, 24, 158, 52, 158, 79, 158, 107, 158, 134, 158, 162, 158, 189, 158, 217, 158, 245, 159, 16, 159, 44, 159, 71, 159, 99, 159, 127, 159, 154, 159, 182, 159, 210, 159, 237, 160, 9, 160, 37, 160, 64, 160, 92, 160, 120, 160, 147, 160, 175, 160, 203, 160, 231, 161, 2, 161, 30, 161, 58, 161, 86, 161, 114, 161, 141, 161, 169, 161, 197, 161, 225, 161, 253, 162, 25, 162, 53, 162, 81, 162, 108, 162, 136, 162, 164, 162, 192, 162, 220, 162, 248, 163, 20, 163, 48, 163, 76, 163, 104, 163, 132, 163, 160, 163, 188, 163, 216, 163, 244, 164, 17, 164, 45, 164, 73, 164, 101, 164, 129, 164, 157, 164, 185, 164, 213, 164, 242, 165, 14, 165, 42, 165, 70, 165, 98, 165, 127, 165, 155, 165, 183, 165, 211, 165, 240, 166, 12, 166, 40, 166, 68, 166, 97, 166, 125, 166, 153, 166, 182, 166, 210, 166, 238, 167, 11, 167, 39, 167, 68, 167, 96, 167, 124, 167, 153, 167, 181, 167, 210, 167, 238, 168, 11, 168, 39, 168, 68, 168, 96, 168, 125, 168, 153, 168, 182, 168, 210, 168, 239, 169, 11, 169, 40, 169, 69, 169, 97, 169, 126, 169, 154, 169, 183, 169, 212, 169, 240, 170, 13, 170, 42, 170, 70, 170, 99, 170, 128, 170, 157, 170, 185, 170, 214, 170, 243, 171, 16, 171, 44, 171, 73, 171, 102, 171, 131, 171, 160, 171, 188, 171, 217, 171, 246, 172, 19, 172, 48, 172, 77, 172, 106, 172, 135, 172, 164, 172, 193, 172, 221, 172, 250, 173, 23, 173, 52, 173, 81, 173, 110, 173, 139, 173, 168, 173, 197, 173, 227, 174, 0, 174, 29, 174, 58, 174, 87, 174, 116, 174, 145, 174, 174, 174, 203, 174, 232, 175, 6, 175, 35, 175, 64, 175, 93, 175, 122, 175, 152, 175, 181, 175, 210, 175, 239, 176, 13, 176, 42, 176, 71, 176, 100, 176, 130, 176, 159, 176, 188, 176, 218, 176, 247, 177, 20, 177, 50, 177, 79, 177, 108, 177, 138, 177, 167, 177, 197, 177, 226, 178, 0, 178, 29, 178, 59, 178, 88, 178, 118, 178, 147, 178, 177, 178, 206, 178, 236, 179, 9, 179, 39, 179, 68, 179, 98, 179, 127, 179, 157, 179, 187, 179, 216, 179, 246, 180, 20, 180, 49, 180, 79, 180, 109, 180, 138, 180, 168, 180, 198, 180, 227, 181, 1, 181, 31, 181, 61, 181, 90, 181, 120, 181, 150, 181, 180, 181, 210, 181, 239, 182, 13, 182, 43, 182, 73, 182, 103, 182, 133, 182, 163, 182, 193, 182, 222, 182, 252, 183, 26, 183, 56, 183, 86, 183, 116, 183, 146, 183, 176, 183, 206, 183, 236, 184, 10, 184, 40, 184, 70, 184, 100, 184, 130, 184, 160, 184, 191, 184, 221, 184, 251, 185, 25, 185, 55, 185, 85, 185, 115, 185, 146, 185, 176, 185, 206, 185, 236, 186, 10, 186, 41, 186, 71, 186, 101, 186, 131, 186, 162, 186, 192, 186, 222, 186, 252, 187, 27, 187, 57, 187, 87, 187, 118, 187, 148, 187, 179, 187, 209, 187, 239, 188, 14, 188, 44, 188, 75, 188, 105, 188, 135, 188, 166, 188, 196, 188, 227, 189, 1, 189, 32, 189, 62, 189, 93, 189, 123, 189, 154, 189, 185, 189, 215, 189, 246, 190, 20, 190, 51, 190, 82, 190, 112, 190, 143, 190, 173, 190, 204, 190, 235, 191, 10, 191, 40, 191, 71, 191, 102, 191, 132, 191, 163, 191, 194, 191, 225, 191, 255, 192, 30, 192, 61, 192, 92, 192, 123, 192, 153, 192, 184, 192, 215, 192, 246, 193, 21, 193, 52, 193, 83, 193, 114, 193, 145, 193, 175, 193, 206, 193, 237, 194, 12, 194, 43, 194, 74, 194, 105, 194, 136, 194, 167, 194, 198, 194, 229, 195, 4, 195, 36, 195, 67, 195, 98, 195, 129, 195, 160, 195, 191, 195, 222, 195, 253, 196, 29, 196, 60, 196, 91, 196, 122, 196, 153, 196, 184, 196, 216, 196, 247, 197, 22, 197, 53, 197, 85, 197, 116, 197, 147, 197, 179, 197, 210, 197, 241, 198, 17, 198, 48, 198, 79, 198, 111, 198, 142, 198, 173, 198, 205, 198, 236, 199, 12, 199, 43, 199, 75, 199, 106, 199, 138, 199, 169, 199, 201, 199, 232, 200, 8, 200, 39, 200, 71, 200, 102, 200, 134, 200, 165, 200, 197, 200, 229, 201, 4, 201, 36, 201, 67, 201, 99, 201, 131, 201, 162, 201, 194, 201, 226, 202, 1, 202, 33, 202, 65, 202, 97, 202, 128, 202, 160, 202, 192, 202, 224, 203, 0, 203, 31, 203, 63, 203, 95, 203, 127, 203, 159, 203, 191, 203, 222, 203, 254, 204, 30, 204, 62, 204, 94, 204, 126, 204, 158, 204, 190, 204, 222, 204, 254, 205, 30, 205, 62, 205, 94, 205, 126, 205, 158, 205, 190, 205, 222, 205, 254, 206, 30, 206, 62, 206, 94, 206, 126, 206, 158, 206, 191, 206, 223, 206, 255, 207, 31, 207, 63, 207, 95, 207, 128, 207, 160, 207, 192, 207, 224, 208, 1, 208, 33, 208, 65, 208, 97, 208, 130, 208, 162, 208, 194, 208, 227, 209, 3, 209, 35, 209, 68, 209, 100, 209, 132, 209, 165, 209, 197, 209, 230, 210, 6, 210, 39, 210, 71, 210, 103, 210, 136, 210, 168, 210, 201, 210, 233, 211, 10, 211, 42, 211, 75, 211, 108, 211, 140, 211, 173, 211, 205, 211, 238, 212, 15, 212, 47, 212, 80, 212, 112, 212, 145, 212, 178, 212, 210, 212, 243, 213, 20, 213, 53, 213, 85, 213, 118, 213, 151, 213, 184, 213, 216, 213, 249, 214, 26, 214, 59, 214, 92, 214, 124, 214, 157, 214, 190, 214, 223, 215, 0, 215, 33, 215, 66, 215, 99, 215, 131, 215, 164, 215, 197, 215, 230, 216, 7, 216, 40, 216, 73, 216, 106, 216, 139, 216, 172, 216, 205, 216, 238, 217, 15, 217, 48, 217, 82, 217, 115, 217, 148, 217, 181, 217, 214, 217, 247, 218, 24, 218, 57, 218, 91, 218, 124, 218, 157, 218, 190, 218, 223, 219, 1, 219, 34, 219, 67, 219, 100, 219, 134, 219, 167, 219, 200, 219, 234, 220, 11, 220, 44, 220, 78, 220, 111, 220, 144, 220, 178, 220, 211, 220, 245, 221, 22, 221, 55, 221, 89, 221, 122, 221, 156, 221, 189, 221, 223, 222, 0, 222, 34, 222, 67, 222, 101, 222, 134, 222, 168, 222, 201, 222, 235, 223, 13, 223, 46, 223, 80, 223, 113, 223, 147, 223, 181, 223, 214, 223, 248, 224, 26, 224, 59, 224, 93, 224, 127, 224, 161, 224, 194, 224, 228, 225, 6, 225, 40, 225, 73, 225, 107, 225, 141, 225, 175, 225, 209, 225, 242, 226, 20, 226, 54, 226, 88, 226, 122, 226, 156, 226, 190, 226, 224, 227, 2, 227, 36, 227, 70, 227, 104, 227, 138, 227, 171, 227, 206, 227, 240, 228, 18, 228, 52, 228, 86, 228, 120, 228, 154, 228, 188, 228, 222, 229, 0, 229, 34, 229, 68, 229, 102, 229, 137, 229, 171, 229, 205, 229, 239, 230, 17, 230, 52, 230, 86, 230, 120, 230, 154, 230, 189, 230, 223, 231, 1, 231, 35, 231, 70, 231, 104, 231, 138, 231, 173, 231, 207, 231, 241, 232, 20, 232, 54, 232, 89, 232, 123, 232, 157, 232, 192, 232, 226, 233, 5, 233, 39, 233, 74, 233, 108, 233, 143, 233, 177, 233, 212, 233, 246, 234, 25, 234, 59, 234, 94, 234, 129, 234, 163, 234, 198, 234, 232, 235, 11, 235, 46, 235, 80, 235, 115, 235, 150, 235, 184, 235, 219, 235, 254, 236, 32, 236, 67, 236, 102, 236, 137, 236, 171, 236, 206, 236, 241, 237, 20, 237, 55, 237, 90, 237, 124, 237, 159, 237, 194, 237, 229, 238, 8, 238, 43, 238, 78, 238, 113, 238, 148, 238, 182, 238, 217, 238, 252, 239, 31, 239, 66, 239, 101, 239, 136, 239, 171, 239, 206, 239, 241, 240, 21, 240, 56, 240, 91, 240, 126, 240, 161, 240, 196, 240, 231, 241, 10, 241, 45, 241, 81, 241, 116, 241, 151, 241, 186, 241, 221, 242, 1, 242, 36, 242, 71, 242, 106, 242, 142, 242, 177, 242, 212, 242, 248, 243, 27, 243, 62, 243, 98, 243, 133, 243, 168, 243, 204, 243, 239, 244, 18, 244, 54, 244, 89, 244, 125, 244, 160, 244, 196, 244, 231, 245, 11, 245, 46, 245, 82, 245, 117, 245, 153, 245, 188, 245, 224, 246, 3, 246, 39, 246, 74, 246, 110, 246, 146, 246, 181, 246, 217, 246, 253, 247, 32, 247, 68, 247, 104, 247, 139, 247, 175, 247, 211, 247, 246, 248, 26, 248, 62, 248, 98, 248, 134, 248, 169, 248, 205, 248, 241, 249, 21, 249, 57, 249, 92, 249, 128, 249, 164, 249, 200, 249, 236, 250, 16, 250, 52, 250, 88, 250, 124, 250, 160, 250, 196, 250, 232, 251, 11, 251, 47, 251, 84, 251, 120, 251, 156, 251, 192, 251, 228, 252, 8, 252, 44, 252, 80, 252, 116, 252, 152, 252, 188, 252, 224, 253, 5, 253, 41, 253, 77, 253, 113, 253, 149, 253, 186, 253, 222, 254, 2, 254, 38, 254, 74, 254, 111, 254, 147, 254, 183, 254, 220, 255, 0, 255, 36, 255, 73, 255, 109, 255, 145, 255, 182, 255, 218, 255, 255 };
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Thumbnail.0x0100 (ImageWidth/Long/1) "160"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageWidth);
				Assert.IsNotNull (entry, "Entry 0x0100 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (160, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0101 (ImageLength/Long/1) "107"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ImageLength);
				Assert.IsNotNull (entry, "Entry 0x0101 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (107, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0102 (BitsPerSample/Short/3) "8 8 8"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.BitsPerSample);
				Assert.IsNotNull (entry, "Entry 0x0102 missing in IFD 1");
				Assert.IsNotNull (entry as ShortArrayIFDEntry, "Entry is not a short array!");
				Assert.AreEqual (new ushort [] { 8, 8, 8 }, (entry as ShortArrayIFDEntry).Values);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0106 (PhotometricInterpretation/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.PhotometricInterpretation);
				Assert.IsNotNull (entry, "Entry 0x0106 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0111 (StripOffsets/StripOffsets/1) "15456"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.StripOffsets);
				Assert.IsNotNull (entry, "Entry 0x0111 missing in IFD 1");
				Assert.IsNotNull (entry as StripOffsetsIFDEntry, "Entry is not a strip offsets entry!");
				Assert.AreEqual (1, (entry as StripOffsetsIFDEntry).Values.Length);
			}
			// Thumbnail.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0115 (SamplesPerPixel/Short/1) "3"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.SamplesPerPixel);
				Assert.IsNotNull (entry, "Entry 0x0115 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0116 (RowsPerStrip/Long/1) "107"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.RowsPerStrip);
				Assert.IsNotNull (entry, "Entry 0x0116 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (107, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0117 (StripByteCounts/Long/1) "51360"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.StripByteCounts);
				Assert.IsNotNull (entry, "Entry 0x0117 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (51360, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011C (PlanarConfiguration/Short/1) "1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.PlanarConfiguration);
				Assert.IsNotNull (entry, "Entry 0x011C missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}
		public void ValidateMetadataInvariants (Image.File file)
		{
			Assert.IsNotNull (file);
			//  ---------- Start of IFD tests ----------

			var tag = file.GetTag (TagTypes.TiffIFD) as IFDTag;
			Assert.IsNotNull (tag, "IFD tag not found");

			var structure = tag.Structure;

			// Image.0x010F (Make/Ascii/18) "NIKON CORPORATION"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Make);
				Assert.IsNotNull (entry, "Entry 0x010F missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON CORPORATION", (entry as StringIFDEntry).Value);
			}
			// Image.0x0110 (Model/Ascii/10) "NIKON D80"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Model);
				Assert.IsNotNull (entry, "Entry 0x0110 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("NIKON D80", (entry as StringIFDEntry).Value);
			}
			// Image.0x0112 (Orientation/Short/1) "1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Orientation);
				Assert.IsNotNull (entry, "Entry 0x0112 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Image.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Image.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x0131 (Software/Ascii/11) "Picasa 3.0"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.Software);
				Assert.IsNotNull (entry, "Entry 0x0131 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("Picasa 3.0", (entry as StringIFDEntry).Value);
			}
			// Image.0x0132 (DateTime/Ascii/20) "2008:04:06 16:07:52"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.DateTime);
				Assert.IsNotNull (entry, "Entry 0x0132 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:04:06 16:07:52", (entry as StringIFDEntry).Value);
			}
			// Image.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Image.0x8769 (ExifTag/SubIFD/1) "210"
			{
				var entry = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD);
				Assert.IsNotNull (entry, "Entry 0x8769 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var exif = structure.GetEntry (0, (ushort) IFDEntryTag.ExifIFD) as SubIFDEntry;
			Assert.IsNotNull (exif, "Exif tag not found");
			var exif_structure = exif.Structure;

			// Photo.0x829A (ExposureTime/Rational/1) "10/5000"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureTime);
				Assert.IsNotNull (entry, "Entry 0x829A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (5000, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x829D (FNumber/Rational/1) "110/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FNumber);
				Assert.IsNotNull (entry, "Entry 0x829D missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (110, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x8822 (ExposureProgram/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureProgram);
				Assert.IsNotNull (entry, "Entry 0x8822 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x8827 (ISOSpeedRatings/Short/1) "400"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ISOSpeedRatings);
				Assert.IsNotNull (entry, "Entry 0x8827 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (400, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9000 (ExifVersion/Undefined/4) "48 50 50 49"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExifVersion);
				Assert.IsNotNull (entry, "Entry 0x9000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 50, 50, 49 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9003 (DateTimeOriginal/Ascii/20) "2008:04:06 16:07:52"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9003 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:04:06 16:07:52", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9004 (DateTimeDigitized/Ascii/20) "2008:04:06 16:07:52"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DateTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9004 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("2008:04:06 16:07:52", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9101 (ComponentsConfiguration/Undefined/4) "1 2 3 0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ComponentsConfiguration);
				Assert.IsNotNull (entry, "Entry 0x9101 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1, 2, 3, 0 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0x9102 (CompressedBitsPerPixel/Rational/1) "4/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CompressedBitsPerPixel);
				Assert.IsNotNull (entry, "Entry 0x9102 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (4, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9204 (ExposureBiasValue/SRational/1) "2/6"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureBiasValue);
				Assert.IsNotNull (entry, "Entry 0x9204 missing in IFD 0");
				Assert.IsNotNull (entry as SRationalIFDEntry, "Entry is not a srational!");
				Assert.AreEqual (2, (entry as SRationalIFDEntry).Value.Numerator);
				Assert.AreEqual (6, (entry as SRationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9205 (MaxApertureValue/Rational/1) "37/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MaxApertureValue);
				Assert.IsNotNull (entry, "Entry 0x9205 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (37, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9207 (MeteringMode/Short/1) "5"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.MeteringMode);
				Assert.IsNotNull (entry, "Entry 0x9207 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (5, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9208 (LightSource/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.LightSource);
				Assert.IsNotNull (entry, "Entry 0x9208 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x9209 (Flash/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Flash);
				Assert.IsNotNull (entry, "Entry 0x9209 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0x920A (FocalLength/Rational/1) "200/10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLength);
				Assert.IsNotNull (entry, "Entry 0x920A missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (200, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (10, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0x9286 (UserComment/UserComment/44) "charset="Ascii"                                     "
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.UserComment);
				Assert.IsNotNull (entry, "Entry 0x9286 missing in IFD 0");
				Assert.IsNotNull (entry as UserCommentIFDEntry, "Entry is not a user comment!");
				Assert.AreEqual ("", (entry as UserCommentIFDEntry).Value.Trim ());
			}
			// Photo.0x9290 (SubSecTime/Ascii/3) "10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTime);
				Assert.IsNotNull (entry, "Entry 0x9290 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("10", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9291 (SubSecTimeOriginal/Ascii/3) "10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeOriginal);
				Assert.IsNotNull (entry, "Entry 0x9291 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("10", (entry as StringIFDEntry).Value);
			}
			// Photo.0x9292 (SubSecTimeDigitized/Ascii/3) "10"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubsecTimeDigitized);
				Assert.IsNotNull (entry, "Entry 0x9292 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("10", (entry as StringIFDEntry).Value);
			}
			// Photo.0xA000 (FlashpixVersion/Undefined/4) "48 49 48 48"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FlashpixVersion);
				Assert.IsNotNull (entry, "Entry 0xA000 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA001 (ColorSpace/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ColorSpace);
				Assert.IsNotNull (entry, "Entry 0xA001 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA002 (PixelXDimension/Short/1) "3872"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelXDimension);
				Assert.IsNotNull (entry, "Entry 0xA002 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (3872, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA003 (PixelYDimension/Short/1) "2592"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.PixelYDimension);
				Assert.IsNotNull (entry, "Entry 0xA003 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2592, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA005 (InteroperabilityTag/SubIFD/1) "878"
			{
				var entry = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD);
				Assert.IsNotNull (entry, "Entry 0xA005 missing in IFD 0");
				Assert.IsNotNull (entry as SubIFDEntry, "Entry is not a sub IFD!");
			}

			var iop = exif_structure.GetEntry (0, (ushort) IFDEntryTag.InteroperabilityIFD) as SubIFDEntry;
			Assert.IsNotNull (iop, "Iop tag not found");
			var iop_structure = iop.Structure;

			// Iop.0x0002 (InteroperabilityVersion/Undefined/4) "48 49 48 48"
			{
				var entry = iop_structure.GetEntry (0, (ushort) IOPEntryTag.InteroperabilityVersion);
				Assert.IsNotNull (entry, "Entry 0x0002 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 48, 49, 48, 48 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA217 (SensingMethod/Short/1) "2"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SensingMethod);
				Assert.IsNotNull (entry, "Entry 0xA217 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA300 (FileSource/Undefined/1) "3"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FileSource);
				Assert.IsNotNull (entry, "Entry 0xA300 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 3 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA301 (SceneType/Undefined/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneType);
				Assert.IsNotNull (entry, "Entry 0xA301 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA302 (CFAPattern/Undefined/8) "0 2 0 2 1 2 0 1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CFAPattern2);
				Assert.IsNotNull (entry, "Entry 0xA302 missing in IFD 0");
				Assert.IsNotNull (entry as UndefinedIFDEntry, "Entry is not an undefined IFD entry!");
				var parsed_bytes = (entry as UndefinedIFDEntry).Data.Data;
				var bytes = new byte [] { 0, 2, 0, 2, 1, 2, 0, 1 };
				Assert.AreEqual (bytes, parsed_bytes);
			}
			// Photo.0xA401 (CustomRendered/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.CustomRendered);
				Assert.IsNotNull (entry, "Entry 0xA401 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA402 (ExposureMode/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ExposureMode);
				Assert.IsNotNull (entry, "Entry 0xA402 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA403 (WhiteBalance/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.WhiteBalance);
				Assert.IsNotNull (entry, "Entry 0xA403 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA404 (DigitalZoomRatio/Rational/1) "1/1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.DigitalZoomRatio);
				Assert.IsNotNull (entry, "Entry 0xA404 missing in IFD 0");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Photo.0xA405 (FocalLengthIn35mmFilm/Short/1) "30"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.FocalLengthIn35mmFilm);
				Assert.IsNotNull (entry, "Entry 0xA405 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (30, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA406 (SceneCaptureType/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SceneCaptureType);
				Assert.IsNotNull (entry, "Entry 0xA406 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA407 (GainControl/Short/1) "1"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.GainControl);
				Assert.IsNotNull (entry, "Entry 0xA407 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (1, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA408 (Contrast/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Contrast);
				Assert.IsNotNull (entry, "Entry 0xA408 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA409 (Saturation/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Saturation);
				Assert.IsNotNull (entry, "Entry 0xA409 missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40A (Sharpness/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.Sharpness);
				Assert.IsNotNull (entry, "Entry 0xA40A missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA40C (SubjectDistanceRange/Short/1) "0"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.SubjectDistanceRange);
				Assert.IsNotNull (entry, "Entry 0xA40C missing in IFD 0");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (0, (entry as ShortIFDEntry).Value);
			}
			// Photo.0xA420 (ImageUniqueID/Ascii/33) "dcf14c4dffe0b08900c88aae23f46199"
			{
				var entry = exif_structure.GetEntry (0, (ushort) ExifEntryTag.ImageUniqueID);
				Assert.IsNotNull (entry, "Entry 0xA420 missing in IFD 0");
				Assert.IsNotNull (entry as StringIFDEntry, "Entry is not a string!");
				Assert.AreEqual ("dcf14c4dffe0b08900c88aae23f46199", (entry as StringIFDEntry).Value);
			}
			// Thumbnail.0x0103 (Compression/Short/1) "6"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.Compression);
				Assert.IsNotNull (entry, "Entry 0x0103 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (6, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x011A (XResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.XResolution);
				Assert.IsNotNull (entry, "Entry 0x011A missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x011B (YResolution/Rational/1) "300/1"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YResolution);
				Assert.IsNotNull (entry, "Entry 0x011B missing in IFD 1");
				Assert.IsNotNull (entry as RationalIFDEntry, "Entry is not a rational!");
				Assert.AreEqual (300, (entry as RationalIFDEntry).Value.Numerator);
				Assert.AreEqual (1, (entry as RationalIFDEntry).Value.Denominator);
			}
			// Thumbnail.0x0128 (ResolutionUnit/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.ResolutionUnit);
				Assert.IsNotNull (entry, "Entry 0x0128 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}
			// Thumbnail.0x0201 (JPEGInterchangeFormat/ThumbnailDataIFD/1) "1014"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormat);
				Assert.IsNotNull (entry, "Entry 0x0201 missing in IFD 1");
				Assert.IsNotNull (entry as ThumbnailDataIFDEntry, "Entry is not a thumbnail IFD!");
			}
			// Thumbnail.0x0202 (JPEGInterchangeFormatLength/Long/1) "9624"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.JPEGInterchangeFormatLength);
				Assert.IsNotNull (entry, "Entry 0x0202 missing in IFD 1");
				Assert.IsNotNull (entry as LongIFDEntry, "Entry is not a long!");
				Assert.AreEqual (9624, (entry as LongIFDEntry).Value);
			}
			// Thumbnail.0x0213 (YCbCrPositioning/Short/1) "2"
			{
				var entry = structure.GetEntry (1, (ushort) IFDEntryTag.YCbCrPositioning);
				Assert.IsNotNull (entry, "Entry 0x0213 missing in IFD 1");
				Assert.IsNotNull (entry as ShortIFDEntry, "Entry is not a short!");
				Assert.AreEqual (2, (entry as ShortIFDEntry).Value);
			}

			//  ---------- End of IFD tests ----------

		}