exiftool_vendored 9.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (864) hide show
  1. checksums.yaml +15 -0
  2. data/bin/Image-ExifTool-9.33/Changes +6241 -0
  3. data/bin/Image-ExifTool-9.33/MANIFEST +859 -0
  4. data/bin/Image-ExifTool-9.33/META.yml +27 -0
  5. data/bin/Image-ExifTool-9.33/Makefile.PL +41 -0
  6. data/bin/Image-ExifTool-9.33/README +227 -0
  7. data/bin/Image-ExifTool-9.33/arg_files/exif2iptc.args +24 -0
  8. data/bin/Image-ExifTool-9.33/arg_files/exif2xmp.args +38 -0
  9. data/bin/Image-ExifTool-9.33/arg_files/gps2xmp.args +20 -0
  10. data/bin/Image-ExifTool-9.33/arg_files/iptc2exif.args +17 -0
  11. data/bin/Image-ExifTool-9.33/arg_files/iptc2xmp.args +53 -0
  12. data/bin/Image-ExifTool-9.33/arg_files/iptcCore.args +172 -0
  13. data/bin/Image-ExifTool-9.33/arg_files/pdf2xmp.args +23 -0
  14. data/bin/Image-ExifTool-9.33/arg_files/xmp2exif.args +39 -0
  15. data/bin/Image-ExifTool-9.33/arg_files/xmp2gps.args +24 -0
  16. data/bin/Image-ExifTool-9.33/arg_files/xmp2iptc.args +62 -0
  17. data/bin/Image-ExifTool-9.33/arg_files/xmp2pdf.args +23 -0
  18. data/bin/Image-ExifTool-9.33/config_files/ExifTool_config +299 -0
  19. data/bin/Image-ExifTool-9.33/config_files/convert_regions.config +81 -0
  20. data/bin/Image-ExifTool-9.33/exiftool +5715 -0
  21. data/bin/Image-ExifTool-9.33/fmt_files/gpx.fmt +29 -0
  22. data/bin/Image-ExifTool-9.33/fmt_files/gpx_wpt.fmt +33 -0
  23. data/bin/Image-ExifTool-9.33/fmt_files/kml.fmt +53 -0
  24. data/bin/Image-ExifTool-9.33/html/ExifTool.html +1959 -0
  25. data/bin/Image-ExifTool-9.33/html/MIE1.1-20070121.pdf +0 -0
  26. data/bin/Image-ExifTool-9.33/html/Shift.html +173 -0
  27. data/bin/Image-ExifTool-9.33/html/TagNames/AFCP.html +53 -0
  28. data/bin/Image-ExifTool-9.33/html/TagNames/AIFF.html +146 -0
  29. data/bin/Image-ExifTool-9.33/html/TagNames/APE.html +149 -0
  30. data/bin/Image-ExifTool-9.33/html/TagNames/APP12.html +188 -0
  31. data/bin/Image-ExifTool-9.33/html/TagNames/ASF.html +1066 -0
  32. data/bin/Image-ExifTool-9.33/html/TagNames/BMP.html +110 -0
  33. data/bin/Image-ExifTool-9.33/html/TagNames/Canon.html +8062 -0
  34. data/bin/Image-ExifTool-9.33/html/TagNames/CanonCustom.html +2044 -0
  35. data/bin/Image-ExifTool-9.33/html/TagNames/CanonRaw.html +561 -0
  36. data/bin/Image-ExifTool-9.33/html/TagNames/CanonVRD.html +1222 -0
  37. data/bin/Image-ExifTool-9.33/html/TagNames/Casio.html +1569 -0
  38. data/bin/Image-ExifTool-9.33/html/TagNames/Composite.html +665 -0
  39. data/bin/Image-ExifTool-9.33/html/TagNames/DICOM.html +15762 -0
  40. data/bin/Image-ExifTool-9.33/html/TagNames/DNG.html +273 -0
  41. data/bin/Image-ExifTool-9.33/html/TagNames/DV.html +75 -0
  42. data/bin/Image-ExifTool-9.33/html/TagNames/DarwinCore.html +1445 -0
  43. data/bin/Image-ExifTool-9.33/html/TagNames/DjVu.html +313 -0
  44. data/bin/Image-ExifTool-9.33/html/TagNames/EXE.html +697 -0
  45. data/bin/Image-ExifTool-9.33/html/TagNames/EXIF.html +3244 -0
  46. data/bin/Image-ExifTool-9.33/html/TagNames/Extra.html +301 -0
  47. data/bin/Image-ExifTool-9.33/html/TagNames/FLAC.html +183 -0
  48. data/bin/Image-ExifTool-9.33/html/TagNames/FLIR.html +931 -0
  49. data/bin/Image-ExifTool-9.33/html/TagNames/Flash.html +419 -0
  50. data/bin/Image-ExifTool-9.33/html/TagNames/FlashPix.html +1435 -0
  51. data/bin/Image-ExifTool-9.33/html/TagNames/Font.html +485 -0
  52. data/bin/Image-ExifTool-9.33/html/TagNames/FotoStation.html +103 -0
  53. data/bin/Image-ExifTool-9.33/html/TagNames/FujiFilm.html +637 -0
  54. data/bin/Image-ExifTool-9.33/html/TagNames/GE.html +40 -0
  55. data/bin/Image-ExifTool-9.33/html/TagNames/GIF.html +116 -0
  56. data/bin/Image-ExifTool-9.33/html/TagNames/GIMP.html +140 -0
  57. data/bin/Image-ExifTool-9.33/html/TagNames/GPS.html +222 -0
  58. data/bin/Image-ExifTool-9.33/html/TagNames/GeoTiff.html +2177 -0
  59. data/bin/Image-ExifTool-9.33/html/TagNames/H264.html +393 -0
  60. data/bin/Image-ExifTool-9.33/html/TagNames/HP.html +155 -0
  61. data/bin/Image-ExifTool-9.33/html/TagNames/HTML.html +666 -0
  62. data/bin/Image-ExifTool-9.33/html/TagNames/ICC_Profile.html +710 -0
  63. data/bin/Image-ExifTool-9.33/html/TagNames/ID3.html +1473 -0
  64. data/bin/Image-ExifTool-9.33/html/TagNames/IPTC.html +895 -0
  65. data/bin/Image-ExifTool-9.33/html/TagNames/ITC.html +90 -0
  66. data/bin/Image-ExifTool-9.33/html/TagNames/JFIF.html +61 -0
  67. data/bin/Image-ExifTool-9.33/html/TagNames/JPEG.html +523 -0
  68. data/bin/Image-ExifTool-9.33/html/TagNames/JVC.html +56 -0
  69. data/bin/Image-ExifTool-9.33/html/TagNames/Jpeg2000.html +464 -0
  70. data/bin/Image-ExifTool-9.33/html/TagNames/Kodak.html +1759 -0
  71. data/bin/Image-ExifTool-9.33/html/TagNames/KyoceraRaw.html +92 -0
  72. data/bin/Image-ExifTool-9.33/html/TagNames/LNK.html +478 -0
  73. data/bin/Image-ExifTool-9.33/html/TagNames/Leaf.html +870 -0
  74. data/bin/Image-ExifTool-9.33/html/TagNames/M2TS.html +133 -0
  75. data/bin/Image-ExifTool-9.33/html/TagNames/MIE.html +1026 -0
  76. data/bin/Image-ExifTool-9.33/html/TagNames/MIFF.html +196 -0
  77. data/bin/Image-ExifTool-9.33/html/TagNames/MNG.html +847 -0
  78. data/bin/Image-ExifTool-9.33/html/TagNames/MPC.html +97 -0
  79. data/bin/Image-ExifTool-9.33/html/TagNames/MPEG.html +249 -0
  80. data/bin/Image-ExifTool-9.33/html/TagNames/MPF.html +199 -0
  81. data/bin/Image-ExifTool-9.33/html/TagNames/MWG.html +563 -0
  82. data/bin/Image-ExifTool-9.33/html/TagNames/MXF.html +6673 -0
  83. data/bin/Image-ExifTool-9.33/html/TagNames/Matroska.html +1069 -0
  84. data/bin/Image-ExifTool-9.33/html/TagNames/Microsoft.html +2066 -0
  85. data/bin/Image-ExifTool-9.33/html/TagNames/Minolta.html +2555 -0
  86. data/bin/Image-ExifTool-9.33/html/TagNames/MinoltaRaw.html +326 -0
  87. data/bin/Image-ExifTool-9.33/html/TagNames/Nikon.html +4467 -0
  88. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCapture.html +776 -0
  89. data/bin/Image-ExifTool-9.33/html/TagNames/NikonCustom.html +3835 -0
  90. data/bin/Image-ExifTool-9.33/html/TagNames/OOXML.html +280 -0
  91. data/bin/Image-ExifTool-9.33/html/TagNames/Ogg.html +44 -0
  92. data/bin/Image-ExifTool-9.33/html/TagNames/Olympus.html +3386 -0
  93. data/bin/Image-ExifTool-9.33/html/TagNames/OpenEXR.html +222 -0
  94. data/bin/Image-ExifTool-9.33/html/TagNames/PDF.html +745 -0
  95. data/bin/Image-ExifTool-9.33/html/TagNames/PGF.html +80 -0
  96. data/bin/Image-ExifTool-9.33/html/TagNames/PICT.html +753 -0
  97. data/bin/Image-ExifTool-9.33/html/TagNames/PLIST.html +86 -0
  98. data/bin/Image-ExifTool-9.33/html/TagNames/PNG.html +515 -0
  99. data/bin/Image-ExifTool-9.33/html/TagNames/PSP.html +160 -0
  100. data/bin/Image-ExifTool-9.33/html/TagNames/Panasonic.html +1452 -0
  101. data/bin/Image-ExifTool-9.33/html/TagNames/PanasonicRaw.html +214 -0
  102. data/bin/Image-ExifTool-9.33/html/TagNames/Pentax.html +4332 -0
  103. data/bin/Image-ExifTool-9.33/html/TagNames/PhaseOne.html +258 -0
  104. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoCD.html +402 -0
  105. data/bin/Image-ExifTool-9.33/html/TagNames/PhotoMechanic.html +196 -0
  106. data/bin/Image-ExifTool-9.33/html/TagNames/Photoshop.html +555 -0
  107. data/bin/Image-ExifTool-9.33/html/TagNames/PostScript.html +125 -0
  108. data/bin/Image-ExifTool-9.33/html/TagNames/PrintIM.html +31 -0
  109. data/bin/Image-ExifTool-9.33/html/TagNames/Qualcomm.html +4778 -0
  110. data/bin/Image-ExifTool-9.33/html/TagNames/QuickTime.html +3104 -0
  111. data/bin/Image-ExifTool-9.33/html/TagNames/RIFF.html +1164 -0
  112. data/bin/Image-ExifTool-9.33/html/TagNames/RSRC.html +74 -0
  113. data/bin/Image-ExifTool-9.33/html/TagNames/RTF.html +150 -0
  114. data/bin/Image-ExifTool-9.33/html/TagNames/Radiance.html +87 -0
  115. data/bin/Image-ExifTool-9.33/html/TagNames/Rawzor.html +45 -0
  116. data/bin/Image-ExifTool-9.33/html/TagNames/Real.html +780 -0
  117. data/bin/Image-ExifTool-9.33/html/TagNames/Reconyx.html +132 -0
  118. data/bin/Image-ExifTool-9.33/html/TagNames/Ricoh.html +456 -0
  119. data/bin/Image-ExifTool-9.33/html/TagNames/Samsung.html +419 -0
  120. data/bin/Image-ExifTool-9.33/html/TagNames/Sanyo.html +366 -0
  121. data/bin/Image-ExifTool-9.33/html/TagNames/Shortcuts.html +237 -0
  122. data/bin/Image-ExifTool-9.33/html/TagNames/Sigma.html +372 -0
  123. data/bin/Image-ExifTool-9.33/html/TagNames/SigmaRaw.html +403 -0
  124. data/bin/Image-ExifTool-9.33/html/TagNames/Sony.html +4279 -0
  125. data/bin/Image-ExifTool-9.33/html/TagNames/SonyIDC.html +267 -0
  126. data/bin/Image-ExifTool-9.33/html/TagNames/Stim.html +200 -0
  127. data/bin/Image-ExifTool-9.33/html/TagNames/Theora.html +102 -0
  128. data/bin/Image-ExifTool-9.33/html/TagNames/Unknown.html +31 -0
  129. data/bin/Image-ExifTool-9.33/html/TagNames/Vorbis.html +228 -0
  130. data/bin/Image-ExifTool-9.33/html/TagNames/XMP.html +7234 -0
  131. data/bin/Image-ExifTool-9.33/html/TagNames/ZIP.html +204 -0
  132. data/bin/Image-ExifTool-9.33/html/TagNames/iWork.html +49 -0
  133. data/bin/Image-ExifTool-9.33/html/TagNames/index.html +192 -0
  134. data/bin/Image-ExifTool-9.33/html/TagNames/style.css +31 -0
  135. data/bin/Image-ExifTool-9.33/html/ancient_history.html +6727 -0
  136. data/bin/Image-ExifTool-9.33/html/canon_raw.html +366 -0
  137. data/bin/Image-ExifTool-9.33/html/commentary.html +319 -0
  138. data/bin/Image-ExifTool-9.33/html/config.html +312 -0
  139. data/bin/Image-ExifTool-9.33/html/data_members.html +265 -0
  140. data/bin/Image-ExifTool-9.33/html/exiftool_pod.html +2338 -0
  141. data/bin/Image-ExifTool-9.33/html/faq.html +1434 -0
  142. data/bin/Image-ExifTool-9.33/html/filename.html +281 -0
  143. data/bin/Image-ExifTool-9.33/html/geotag.html +642 -0
  144. data/bin/Image-ExifTool-9.33/html/history.html +358 -0
  145. data/bin/Image-ExifTool-9.33/html/htmldump.html +732 -0
  146. data/bin/Image-ExifTool-9.33/html/idiosyncracies.html +251 -0
  147. data/bin/Image-ExifTool-9.33/html/index.html +1271 -0
  148. data/bin/Image-ExifTool-9.33/html/install.html +239 -0
  149. data/bin/Image-ExifTool-9.33/html/metafiles.html +266 -0
  150. data/bin/Image-ExifTool-9.33/html/overview.png +0 -0
  151. data/bin/Image-ExifTool-9.33/html/standards.html +277 -0
  152. data/bin/Image-ExifTool-9.33/html/struct.html +342 -0
  153. data/bin/Image-ExifTool-9.33/html/style.css +31 -0
  154. data/bin/Image-ExifTool-9.33/html/under.html +124 -0
  155. data/bin/Image-ExifTool-9.33/html/verbose.html +195 -0
  156. data/bin/Image-ExifTool-9.33/html/writing.html +239 -0
  157. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pm +378 -0
  158. data/bin/Image-ExifTool-9.33/lib/File/RandomAccess.pod +231 -0
  159. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pm +6815 -0
  160. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool.pod +2385 -0
  161. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AES.pm +501 -0
  162. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AFCP.pm +284 -0
  163. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/AIFF.pm +271 -0
  164. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APE.pm +262 -0
  165. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/APP12.pm +322 -0
  166. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ASF.pm +884 -0
  167. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BMP.pm +179 -0
  168. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BZZ.pm +472 -0
  169. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BigTIFF.pm +282 -0
  170. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/BuildTagLookup.pm +2400 -0
  171. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Canon.pm +7794 -0
  172. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonCustom.pm +2523 -0
  173. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonRaw.pm +931 -0
  174. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CanonVRD.pm +1481 -0
  175. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/CaptureOne.pm +235 -0
  176. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Casio.pm +2013 -0
  177. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset.pm +396 -0
  178. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Arabic.pm +39 -0
  179. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Baltic.pm +35 -0
  180. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Cyrillic.pm +45 -0
  181. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Greek.pm +40 -0
  182. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Hebrew.pm +36 -0
  183. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/JIS.pm +1735 -0
  184. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin.pm +24 -0
  185. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Latin2.pm +36 -0
  186. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacArabic.pm +47 -0
  187. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseCN.pm +2088 -0
  188. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacChineseTW.pm +3623 -0
  189. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCroatian.pm +43 -0
  190. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacCyrillic.pm +47 -0
  191. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacGreek.pm +45 -0
  192. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacHebrew.pm +47 -0
  193. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacIceland.pm +42 -0
  194. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacJapanese.pm +1933 -0
  195. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacKorean.pm +2720 -0
  196. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacLatin2.pm +44 -0
  197. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRSymbol.pm +2087 -0
  198. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRoman.pm +42 -0
  199. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacRomanian.pm +42 -0
  200. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacThai.pm +49 -0
  201. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/MacTurkish.pm +42 -0
  202. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/PDFDoc.pm +28 -0
  203. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/ShiftJIS.pm +1835 -0
  204. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Symbol.pm +54 -0
  205. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Thai.pm +41 -0
  206. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Turkish.pm +25 -0
  207. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Charset/Vietnam.pm +27 -0
  208. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DICOM.pm +3835 -0
  209. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DNG.pm +835 -0
  210. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DV.pm +319 -0
  211. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DarwinCore.pm +317 -0
  212. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/DjVu.pm +376 -0
  213. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/EXE.pm +1228 -0
  214. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Exif.pm +4542 -0
  215. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLAC.pm +296 -0
  216. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FLIR.pm +972 -0
  217. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Fixup.pm +354 -0
  218. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Flash.pm +755 -0
  219. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FlashPix.pm +1882 -0
  220. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Font.pm +643 -0
  221. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FotoStation.pm +258 -0
  222. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/FujiFilm.pm +1020 -0
  223. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GE.pm +80 -0
  224. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIF.pm +542 -0
  225. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GIMP.pm +258 -0
  226. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GPS.pm +511 -0
  227. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/GeoTiff.pm +2187 -0
  228. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Geotag.pm +1173 -0
  229. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/H264.pm +1102 -0
  230. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HP.pm +262 -0
  231. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HTML.pm +576 -0
  232. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/HtmlDump.pm +895 -0
  233. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ICC_Profile.pm +999 -0
  234. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ID3.pm +1532 -0
  235. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/IPTC.pm +1244 -0
  236. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ITC.pm +215 -0
  237. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Import.pm +308 -0
  238. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/InDesign.pm +277 -0
  239. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEG.pm +588 -0
  240. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JPEGDigest.pm +2511 -0
  241. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/JVC.pm +130 -0
  242. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Jpeg2000.pm +881 -0
  243. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Kodak.pm +2014 -0
  244. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/KyoceraRaw.pm +173 -0
  245. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/LNK.pm +723 -0
  246. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/cs.pm +1586 -0
  247. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/de.pm +7356 -0
  248. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_ca.pm +557 -0
  249. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/en_gb.pm +572 -0
  250. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/es.pm +4016 -0
  251. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fi.pm +2856 -0
  252. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/fr.pm +4720 -0
  253. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/it.pm +7917 -0
  254. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ja.pm +5815 -0
  255. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ko.pm +2332 -0
  256. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/nl.pm +3220 -0
  257. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/pl.pm +1140 -0
  258. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/ru.pm +769 -0
  259. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/sv.pm +639 -0
  260. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/tr.pm +544 -0
  261. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_cn.pm +1329 -0
  262. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Lang/zh_tw.pm +802 -0
  263. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Leaf.pm +515 -0
  264. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/M2TS.pm +729 -0
  265. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIE.pm +2561 -0
  266. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIEUnits.pod +377 -0
  267. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MIFF.pm +279 -0
  268. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MNG.pm +684 -0
  269. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPC.pm +156 -0
  270. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPEG.pm +736 -0
  271. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MPF.pm +289 -0
  272. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MWG.pm +736 -0
  273. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MXF.pm +3032 -0
  274. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MakerNotes.pm +1573 -0
  275. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Matroska.pm +891 -0
  276. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Microsoft.pm +879 -0
  277. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Minolta.pm +2833 -0
  278. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/MinoltaRaw.pm +534 -0
  279. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Nikon.pm +6116 -0
  280. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCapture.pm +911 -0
  281. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/NikonCustom.pm +4405 -0
  282. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OOXML.pm +409 -0
  283. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ogg.pm +237 -0
  284. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Olympus.pm +3582 -0
  285. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/OpenEXR.pm +324 -0
  286. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PDF.pm +2327 -0
  287. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PGF.pm +143 -0
  288. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PICT.pm +1260 -0
  289. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PLIST.pm +449 -0
  290. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PNG.pm +1100 -0
  291. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PPM.pm +169 -0
  292. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PSP.pm +305 -0
  293. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Panasonic.pm +1995 -0
  294. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PanasonicRaw.pm +535 -0
  295. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Pentax.pm +5489 -0
  296. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhaseOne.pm +557 -0
  297. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoCD.pm +507 -0
  298. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PhotoMechanic.pm +256 -0
  299. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Photoshop.pm +629 -0
  300. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PostScript.pm +693 -0
  301. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/PrintIM.pm +125 -0
  302. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Qualcomm.pm +1344 -0
  303. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/QuickTime.pm +3519 -0
  304. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/README +944 -0
  305. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RIFF.pm +1322 -0
  306. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RSRC.pm +241 -0
  307. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/RTF.pm +383 -0
  308. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Radiance.pm +144 -0
  309. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Rawzor.pm +190 -0
  310. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Real.pm +736 -0
  311. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Reconyx.pm +190 -0
  312. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Ricoh.pm +741 -0
  313. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Samsung.pm +820 -0
  314. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sanyo.pm +439 -0
  315. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shift.pl +594 -0
  316. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Shortcuts.pm +291 -0
  317. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sigma.pm +574 -0
  318. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SigmaRaw.pm +649 -0
  319. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Sony.pm +5722 -0
  320. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/SonyIDC.pm +330 -0
  321. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Stim.pm +196 -0
  322. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagInfoXML.pm +792 -0
  323. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagLookup.pm +8005 -0
  324. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/TagNames.pod +25950 -0
  325. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Theora.pm +145 -0
  326. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Unknown.pm +66 -0
  327. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Vorbis.pm +237 -0
  328. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteCanonRaw.pl +637 -0
  329. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteExif.pl +3674 -0
  330. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteIPTC.pl +702 -0
  331. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePDF.pl +759 -0
  332. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePNG.pl +330 -0
  333. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePhotoshop.pl +266 -0
  334. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WritePostScript.pl +777 -0
  335. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/WriteXMP.pl +1318 -0
  336. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/Writer.pl +5779 -0
  337. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP.pm +3634 -0
  338. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMP2.pl +1298 -0
  339. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/XMPStruct.pl +813 -0
  340. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/ZIP.pm +623 -0
  341. data/bin/Image-ExifTool-9.33/lib/Image/ExifTool/iWork.pm +223 -0
  342. data/bin/Image-ExifTool-9.33/perl-Image-ExifTool.spec +104 -0
  343. data/bin/Image-ExifTool-9.33/t/AFCP.t +44 -0
  344. data/bin/Image-ExifTool-9.33/t/AFCP_2.out +37 -0
  345. data/bin/Image-ExifTool-9.33/t/AFCP_3.out +20 -0
  346. data/bin/Image-ExifTool-9.33/t/AIFF.t +28 -0
  347. data/bin/Image-ExifTool-9.33/t/AIFF_2.out +31 -0
  348. data/bin/Image-ExifTool-9.33/t/APE.t +38 -0
  349. data/bin/Image-ExifTool-9.33/t/APE_2.out +28 -0
  350. data/bin/Image-ExifTool-9.33/t/APE_3.out +57 -0
  351. data/bin/Image-ExifTool-9.33/t/ASF.t +28 -0
  352. data/bin/Image-ExifTool-9.33/t/ASF_2.out +54 -0
  353. data/bin/Image-ExifTool-9.33/t/BMP.t +28 -0
  354. data/bin/Image-ExifTool-9.33/t/BMP_2.out +21 -0
  355. data/bin/Image-ExifTool-9.33/t/BigTIFF.t +28 -0
  356. data/bin/Image-ExifTool-9.33/t/BigTIFF_2.out +19 -0
  357. data/bin/Image-ExifTool-9.33/t/Canon.t +41 -0
  358. data/bin/Image-ExifTool-9.33/t/CanonRaw.t +126 -0
  359. data/bin/Image-ExifTool-9.33/t/CanonRaw_2.out +165 -0
  360. data/bin/Image-ExifTool-9.33/t/CanonRaw_4.out +217 -0
  361. data/bin/Image-ExifTool-9.33/t/CanonRaw_5.out +207 -0
  362. data/bin/Image-ExifTool-9.33/t/CanonRaw_6.out +231 -0
  363. data/bin/Image-ExifTool-9.33/t/CanonRaw_7.out +247 -0
  364. data/bin/Image-ExifTool-9.33/t/CanonVRD.t +129 -0
  365. data/bin/Image-ExifTool-9.33/t/CanonVRD_11.out +118 -0
  366. data/bin/Image-ExifTool-9.33/t/CanonVRD_12.out +12 -0
  367. data/bin/Image-ExifTool-9.33/t/CanonVRD_2.out +116 -0
  368. data/bin/Image-ExifTool-9.33/t/CanonVRD_3.out +116 -0
  369. data/bin/Image-ExifTool-9.33/t/CanonVRD_4.out +2 -0
  370. data/bin/Image-ExifTool-9.33/t/CanonVRD_5.out +3 -0
  371. data/bin/Image-ExifTool-9.33/t/CanonVRD_6.out +3 -0
  372. data/bin/Image-ExifTool-9.33/t/CanonVRD_7.out +2 -0
  373. data/bin/Image-ExifTool-9.33/t/CanonVRD_8.out +2 -0
  374. data/bin/Image-ExifTool-9.33/t/CanonVRD_9.out +1 -0
  375. data/bin/Image-ExifTool-9.33/t/Canon_2.out +350 -0
  376. data/bin/Image-ExifTool-9.33/t/Canon_3.out +3 -0
  377. data/bin/Image-ExifTool-9.33/t/Casio.t +54 -0
  378. data/bin/Image-ExifTool-9.33/t/Casio_2.out +70 -0
  379. data/bin/Image-ExifTool-9.33/t/Casio_3.out +100 -0
  380. data/bin/Image-ExifTool-9.33/t/Casio_4.out +26 -0
  381. data/bin/Image-ExifTool-9.33/t/Casio_5.out +78 -0
  382. data/bin/Image-ExifTool-9.33/t/Casio_6.out +115 -0
  383. data/bin/Image-ExifTool-9.33/t/DICOM.t +28 -0
  384. data/bin/Image-ExifTool-9.33/t/DICOM_2.out +108 -0
  385. data/bin/Image-ExifTool-9.33/t/DNG.t +39 -0
  386. data/bin/Image-ExifTool-9.33/t/DNG_2.out +326 -0
  387. data/bin/Image-ExifTool-9.33/t/DNG_3.out +4 -0
  388. data/bin/Image-ExifTool-9.33/t/DV.t +27 -0
  389. data/bin/Image-ExifTool-9.33/t/DV_2.out +24 -0
  390. data/bin/Image-ExifTool-9.33/t/DjVu.t +28 -0
  391. data/bin/Image-ExifTool-9.33/t/DjVu_2.out +44 -0
  392. data/bin/Image-ExifTool-9.33/t/EXE.t +31 -0
  393. data/bin/Image-ExifTool-9.33/t/EXE_2.out +40 -0
  394. data/bin/Image-ExifTool-9.33/t/EXE_3.out +15 -0
  395. data/bin/Image-ExifTool-9.33/t/EXE_4.out +14 -0
  396. data/bin/Image-ExifTool-9.33/t/ExifTool.t +284 -0
  397. data/bin/Image-ExifTool-9.33/t/ExifTool_16.out +180 -0
  398. data/bin/Image-ExifTool-9.33/t/ExifTool_17.out +594 -0
  399. data/bin/Image-ExifTool-9.33/t/ExifTool_2.out +399 -0
  400. data/bin/Image-ExifTool-9.33/t/ExifTool_20.out +1 -0
  401. data/bin/Image-ExifTool-9.33/t/ExifTool_21.out +1 -0
  402. data/bin/Image-ExifTool-9.33/t/ExifTool_22.out +1 -0
  403. data/bin/Image-ExifTool-9.33/t/ExifTool_23.out +6 -0
  404. data/bin/Image-ExifTool-9.33/t/ExifTool_24.out +3 -0
  405. data/bin/Image-ExifTool-9.33/t/ExifTool_25.out +13 -0
  406. data/bin/Image-ExifTool-9.33/t/ExifTool_26.out +12 -0
  407. data/bin/Image-ExifTool-9.33/t/ExifTool_3.out +87 -0
  408. data/bin/Image-ExifTool-9.33/t/ExifTool_4.out +41 -0
  409. data/bin/Image-ExifTool-9.33/t/ExifTool_5.out +6 -0
  410. data/bin/Image-ExifTool-9.33/t/ExifTool_6.out +68 -0
  411. data/bin/Image-ExifTool-9.33/t/ExifTool_7.out +125 -0
  412. data/bin/Image-ExifTool-9.33/t/ExifTool_8.out +125 -0
  413. data/bin/Image-ExifTool-9.33/t/ExifTool_9.out +33 -0
  414. data/bin/Image-ExifTool-9.33/t/FLAC.t +37 -0
  415. data/bin/Image-ExifTool-9.33/t/FLAC_2.out +25 -0
  416. data/bin/Image-ExifTool-9.33/t/FLAC_3.out +19 -0
  417. data/bin/Image-ExifTool-9.33/t/FLIR.t +30 -0
  418. data/bin/Image-ExifTool-9.33/t/FLIR_2.out +104 -0
  419. data/bin/Image-ExifTool-9.33/t/FLIR_3.out +47 -0
  420. data/bin/Image-ExifTool-9.33/t/Flash.t +37 -0
  421. data/bin/Image-ExifTool-9.33/t/FlashPix.t +30 -0
  422. data/bin/Image-ExifTool-9.33/t/FlashPix_2.out +48 -0
  423. data/bin/Image-ExifTool-9.33/t/Flash_2.out +20 -0
  424. data/bin/Image-ExifTool-9.33/t/Flash_3.out +53 -0
  425. data/bin/Image-ExifTool-9.33/t/Font.t +30 -0
  426. data/bin/Image-ExifTool-9.33/t/Font_2.out +23 -0
  427. data/bin/Image-ExifTool-9.33/t/Font_3.out +35 -0
  428. data/bin/Image-ExifTool-9.33/t/Font_4.out +26 -0
  429. data/bin/Image-ExifTool-9.33/t/Font_5.out +26 -0
  430. data/bin/Image-ExifTool-9.33/t/Font_6.out +36 -0
  431. data/bin/Image-ExifTool-9.33/t/Font_7.out +36 -0
  432. data/bin/Image-ExifTool-9.33/t/FotoStation.t +38 -0
  433. data/bin/Image-ExifTool-9.33/t/FotoStation_2.out +39 -0
  434. data/bin/Image-ExifTool-9.33/t/FotoStation_3.out +3 -0
  435. data/bin/Image-ExifTool-9.33/t/FujiFilm.t +78 -0
  436. data/bin/Image-ExifTool-9.33/t/FujiFilm_2.out +87 -0
  437. data/bin/Image-ExifTool-9.33/t/FujiFilm_3.out +88 -0
  438. data/bin/Image-ExifTool-9.33/t/FujiFilm_4.out +117 -0
  439. data/bin/Image-ExifTool-9.33/t/FujiFilm_5.out +1 -0
  440. data/bin/Image-ExifTool-9.33/t/GE.t +46 -0
  441. data/bin/Image-ExifTool-9.33/t/GE_2.out +84 -0
  442. data/bin/Image-ExifTool-9.33/t/GE_3.out +84 -0
  443. data/bin/Image-ExifTool-9.33/t/GIF.t +83 -0
  444. data/bin/Image-ExifTool-9.33/t/GIF_2.out +40 -0
  445. data/bin/Image-ExifTool-9.33/t/GIF_3.out +41 -0
  446. data/bin/Image-ExifTool-9.33/t/GIF_4.out +16 -0
  447. data/bin/Image-ExifTool-9.33/t/GIMP.t +27 -0
  448. data/bin/Image-ExifTool-9.33/t/GIMP_2.out +63 -0
  449. data/bin/Image-ExifTool-9.33/t/GPS.t +42 -0
  450. data/bin/Image-ExifTool-9.33/t/GPS_2.out +94 -0
  451. data/bin/Image-ExifTool-9.33/t/GPS_3.out +96 -0
  452. data/bin/Image-ExifTool-9.33/t/GeoTiff.t +36 -0
  453. data/bin/Image-ExifTool-9.33/t/GeoTiff_2.out +36 -0
  454. data/bin/Image-ExifTool-9.33/t/GeoTiff_3.out +36 -0
  455. data/bin/Image-ExifTool-9.33/t/Geotag.t +164 -0
  456. data/bin/Image-ExifTool-9.33/t/Geotag_2.out +9 -0
  457. data/bin/Image-ExifTool-9.33/t/Geotag_3.out +6 -0
  458. data/bin/Image-ExifTool-9.33/t/Geotag_5.out +1 -0
  459. data/bin/Image-ExifTool-9.33/t/Geotag_6.out +9 -0
  460. data/bin/Image-ExifTool-9.33/t/Geotag_7.out +53 -0
  461. data/bin/Image-ExifTool-9.33/t/Geotag_8.out +15 -0
  462. data/bin/Image-ExifTool-9.33/t/HTML.t +28 -0
  463. data/bin/Image-ExifTool-9.33/t/HTML_2.out +68 -0
  464. data/bin/Image-ExifTool-9.33/t/IPTC.t +157 -0
  465. data/bin/Image-ExifTool-9.33/t/IPTC_2.out +58 -0
  466. data/bin/Image-ExifTool-9.33/t/IPTC_4.out +56 -0
  467. data/bin/Image-ExifTool-9.33/t/IPTC_5.out +1 -0
  468. data/bin/Image-ExifTool-9.33/t/IPTC_6.out +2 -0
  469. data/bin/Image-ExifTool-9.33/t/IPTC_7.out +1 -0
  470. data/bin/Image-ExifTool-9.33/t/IPTC_8.out +20 -0
  471. data/bin/Image-ExifTool-9.33/t/ITC.t +28 -0
  472. data/bin/Image-ExifTool-9.33/t/ITC_2.out +19 -0
  473. data/bin/Image-ExifTool-9.33/t/InDesign.t +61 -0
  474. data/bin/Image-ExifTool-9.33/t/InDesign_2.out +19 -0
  475. data/bin/Image-ExifTool-9.33/t/InDesign_3.out +21 -0
  476. data/bin/Image-ExifTool-9.33/t/InDesign_4.out +11 -0
  477. data/bin/Image-ExifTool-9.33/t/JVC.t +36 -0
  478. data/bin/Image-ExifTool-9.33/t/JVC_2.out +3 -0
  479. data/bin/Image-ExifTool-9.33/t/JVC_3.out +3 -0
  480. data/bin/Image-ExifTool-9.33/t/Jpeg2000.t +49 -0
  481. data/bin/Image-ExifTool-9.33/t/Jpeg2000_2.out +63 -0
  482. data/bin/Image-ExifTool-9.33/t/Jpeg2000_3.out +51 -0
  483. data/bin/Image-ExifTool-9.33/t/Jpeg2000_4.out +15 -0
  484. data/bin/Image-ExifTool-9.33/t/Kodak.t +40 -0
  485. data/bin/Image-ExifTool-9.33/t/Kodak_2.out +109 -0
  486. data/bin/Image-ExifTool-9.33/t/Kodak_3.out +119 -0
  487. data/bin/Image-ExifTool-9.33/t/KyoceraRaw.t +28 -0
  488. data/bin/Image-ExifTool-9.33/t/KyoceraRaw_2.out +27 -0
  489. data/bin/Image-ExifTool-9.33/t/LNK.t +28 -0
  490. data/bin/Image-ExifTool-9.33/t/LNK_2.out +45 -0
  491. data/bin/Image-ExifTool-9.33/t/Lang.t +40 -0
  492. data/bin/Image-ExifTool-9.33/t/Lang_1.out +1 -0
  493. data/bin/Image-ExifTool-9.33/t/Lang_10.out +46 -0
  494. data/bin/Image-ExifTool-9.33/t/Lang_11.out +46 -0
  495. data/bin/Image-ExifTool-9.33/t/Lang_12.out +46 -0
  496. data/bin/Image-ExifTool-9.33/t/Lang_13.out +46 -0
  497. data/bin/Image-ExifTool-9.33/t/Lang_14.out +46 -0
  498. data/bin/Image-ExifTool-9.33/t/Lang_15.out +46 -0
  499. data/bin/Image-ExifTool-9.33/t/Lang_16.out +46 -0
  500. data/bin/Image-ExifTool-9.33/t/Lang_17.out +46 -0
  501. data/bin/Image-ExifTool-9.33/t/Lang_18.out +46 -0
  502. data/bin/Image-ExifTool-9.33/t/Lang_2.out +46 -0
  503. data/bin/Image-ExifTool-9.33/t/Lang_3.out +46 -0
  504. data/bin/Image-ExifTool-9.33/t/Lang_4.out +46 -0
  505. data/bin/Image-ExifTool-9.33/t/Lang_5.out +46 -0
  506. data/bin/Image-ExifTool-9.33/t/Lang_6.out +46 -0
  507. data/bin/Image-ExifTool-9.33/t/Lang_7.out +46 -0
  508. data/bin/Image-ExifTool-9.33/t/Lang_8.out +46 -0
  509. data/bin/Image-ExifTool-9.33/t/Lang_9.out +46 -0
  510. data/bin/Image-ExifTool-9.33/t/M2TS.t +29 -0
  511. data/bin/Image-ExifTool-9.33/t/M2TS_2.out +27 -0
  512. data/bin/Image-ExifTool-9.33/t/MIE.t +82 -0
  513. data/bin/Image-ExifTool-9.33/t/MIE_2.out +67 -0
  514. data/bin/Image-ExifTool-9.33/t/MIE_3.out +134 -0
  515. data/bin/Image-ExifTool-9.33/t/MIE_5.out +1 -0
  516. data/bin/Image-ExifTool-9.33/t/MIE_6.out +1 -0
  517. data/bin/Image-ExifTool-9.33/t/MIFF.t +28 -0
  518. data/bin/Image-ExifTool-9.33/t/MIFF_2.out +108 -0
  519. data/bin/Image-ExifTool-9.33/t/MP3.t +29 -0
  520. data/bin/Image-ExifTool-9.33/t/MP3_2.out +45 -0
  521. data/bin/Image-ExifTool-9.33/t/MWG.t +72 -0
  522. data/bin/Image-ExifTool-9.33/t/MWG_2.out +13 -0
  523. data/bin/Image-ExifTool-9.33/t/MWG_3.out +8 -0
  524. data/bin/Image-ExifTool-9.33/t/MWG_4.out +5 -0
  525. data/bin/Image-ExifTool-9.33/t/MWG_5.out +22 -0
  526. data/bin/Image-ExifTool-9.33/t/MXF.t +27 -0
  527. data/bin/Image-ExifTool-9.33/t/MXF_2.out +78 -0
  528. data/bin/Image-ExifTool-9.33/t/Matroska.t +29 -0
  529. data/bin/Image-ExifTool-9.33/t/Matroska_2.out +64 -0
  530. data/bin/Image-ExifTool-9.33/t/Minolta.t +50 -0
  531. data/bin/Image-ExifTool-9.33/t/Minolta_2.out +133 -0
  532. data/bin/Image-ExifTool-9.33/t/Minolta_3.out +146 -0
  533. data/bin/Image-ExifTool-9.33/t/Minolta_4.out +148 -0
  534. data/bin/Image-ExifTool-9.33/t/Nikon.t +114 -0
  535. data/bin/Image-ExifTool-9.33/t/Nikon_2.out +82 -0
  536. data/bin/Image-ExifTool-9.33/t/Nikon_3.out +98 -0
  537. data/bin/Image-ExifTool-9.33/t/Nikon_4.out +174 -0
  538. data/bin/Image-ExifTool-9.33/t/Nikon_5.out +167 -0
  539. data/bin/Image-ExifTool-9.33/t/Nikon_7.out +260 -0
  540. data/bin/Image-ExifTool-9.33/t/Nikon_8.out +4 -0
  541. data/bin/Image-ExifTool-9.33/t/Olympus.t +85 -0
  542. data/bin/Image-ExifTool-9.33/t/Olympus_2.out +79 -0
  543. data/bin/Image-ExifTool-9.33/t/Olympus_3.out +81 -0
  544. data/bin/Image-ExifTool-9.33/t/Olympus_4.out +192 -0
  545. data/bin/Image-ExifTool-9.33/t/Olympus_5.out +264 -0
  546. data/bin/Image-ExifTool-9.33/t/Olympus_6.out +151 -0
  547. data/bin/Image-ExifTool-9.33/t/Olympus_7.out +482 -0
  548. data/bin/Image-ExifTool-9.33/t/OpenEXR.t +28 -0
  549. data/bin/Image-ExifTool-9.33/t/OpenEXR_2.out +23 -0
  550. data/bin/Image-ExifTool-9.33/t/PDF.t +295 -0
  551. data/bin/Image-ExifTool-9.33/t/PDF_10.out +10 -0
  552. data/bin/Image-ExifTool-9.33/t/PDF_11.out +10 -0
  553. data/bin/Image-ExifTool-9.33/t/PDF_12.out +9 -0
  554. data/bin/Image-ExifTool-9.33/t/PDF_14.out +5 -0
  555. data/bin/Image-ExifTool-9.33/t/PDF_15.out +6 -0
  556. data/bin/Image-ExifTool-9.33/t/PDF_16.out +4 -0
  557. data/bin/Image-ExifTool-9.33/t/PDF_17.out +4 -0
  558. data/bin/Image-ExifTool-9.33/t/PDF_18.out +5 -0
  559. data/bin/Image-ExifTool-9.33/t/PDF_19.out +6 -0
  560. data/bin/Image-ExifTool-9.33/t/PDF_2.out +117 -0
  561. data/bin/Image-ExifTool-9.33/t/PDF_20.out +4 -0
  562. data/bin/Image-ExifTool-9.33/t/PDF_22.out +3 -0
  563. data/bin/Image-ExifTool-9.33/t/PDF_4.out +12 -0
  564. data/bin/Image-ExifTool-9.33/t/PDF_5.out +8 -0
  565. data/bin/Image-ExifTool-9.33/t/PDF_6.out +9 -0
  566. data/bin/Image-ExifTool-9.33/t/PDF_7.out +11 -0
  567. data/bin/Image-ExifTool-9.33/t/PDF_8.out +9 -0
  568. data/bin/Image-ExifTool-9.33/t/PDF_9.out +9 -0
  569. data/bin/Image-ExifTool-9.33/t/PGF.t +28 -0
  570. data/bin/Image-ExifTool-9.33/t/PGF_2.out +32 -0
  571. data/bin/Image-ExifTool-9.33/t/PICT.t +28 -0
  572. data/bin/Image-ExifTool-9.33/t/PICT_2.out +15 -0
  573. data/bin/Image-ExifTool-9.33/t/PLIST.t +31 -0
  574. data/bin/Image-ExifTool-9.33/t/PLIST_2.out +20 -0
  575. data/bin/Image-ExifTool-9.33/t/PLIST_3.out +20 -0
  576. data/bin/Image-ExifTool-9.33/t/PNG.t +75 -0
  577. data/bin/Image-ExifTool-9.33/t/PNG_2.out +22 -0
  578. data/bin/Image-ExifTool-9.33/t/PNG_3.out +118 -0
  579. data/bin/Image-ExifTool-9.33/t/PNG_4.out +12 -0
  580. data/bin/Image-ExifTool-9.33/t/PPM.t +40 -0
  581. data/bin/Image-ExifTool-9.33/t/PPM_2.out +15 -0
  582. data/bin/Image-ExifTool-9.33/t/PPM_3.out +9 -0
  583. data/bin/Image-ExifTool-9.33/t/PSP.t +28 -0
  584. data/bin/Image-ExifTool-9.33/t/PSP_2.out +32 -0
  585. data/bin/Image-ExifTool-9.33/t/Panasonic.t +60 -0
  586. data/bin/Image-ExifTool-9.33/t/Panasonic_2.out +99 -0
  587. data/bin/Image-ExifTool-9.33/t/Panasonic_3.out +119 -0
  588. data/bin/Image-ExifTool-9.33/t/Panasonic_4.out +177 -0
  589. data/bin/Image-ExifTool-9.33/t/Panasonic_5.out +228 -0
  590. data/bin/Image-ExifTool-9.33/t/Pentax.t +50 -0
  591. data/bin/Image-ExifTool-9.33/t/Pentax_2.out +219 -0
  592. data/bin/Image-ExifTool-9.33/t/Pentax_3.out +262 -0
  593. data/bin/Image-ExifTool-9.33/t/Pentax_4.out +123 -0
  594. data/bin/Image-ExifTool-9.33/t/PhotoCD.t +28 -0
  595. data/bin/Image-ExifTool-9.33/t/PhotoCD_2.out +35 -0
  596. data/bin/Image-ExifTool-9.33/t/PhotoMechanic.t +38 -0
  597. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_2.out +81 -0
  598. data/bin/Image-ExifTool-9.33/t/PhotoMechanic_3.out +2 -0
  599. data/bin/Image-ExifTool-9.33/t/Photoshop.t +42 -0
  600. data/bin/Image-ExifTool-9.33/t/Photoshop_2.out +96 -0
  601. data/bin/Image-ExifTool-9.33/t/Photoshop_3.out +108 -0
  602. data/bin/Image-ExifTool-9.33/t/PostScript.t +49 -0
  603. data/bin/Image-ExifTool-9.33/t/PostScript_2.out +64 -0
  604. data/bin/Image-ExifTool-9.33/t/PostScript_3.out +132 -0
  605. data/bin/Image-ExifTool-9.33/t/QuickTime.t +31 -0
  606. data/bin/Image-ExifTool-9.33/t/QuickTime_2.out +128 -0
  607. data/bin/Image-ExifTool-9.33/t/QuickTime_3.out +69 -0
  608. data/bin/Image-ExifTool-9.33/t/RIFF.t +31 -0
  609. data/bin/Image-ExifTool-9.33/t/RIFF_2.out +24 -0
  610. data/bin/Image-ExifTool-9.33/t/RIFF_3.out +52 -0
  611. data/bin/Image-ExifTool-9.33/t/RIFF_4.out +16 -0
  612. data/bin/Image-ExifTool-9.33/t/RTF.t +27 -0
  613. data/bin/Image-ExifTool-9.33/t/RTF_2.out +20 -0
  614. data/bin/Image-ExifTool-9.33/t/Radiance.t +28 -0
  615. data/bin/Image-ExifTool-9.33/t/Radiance_2.out +22 -0
  616. data/bin/Image-ExifTool-9.33/t/Real.t +46 -0
  617. data/bin/Image-ExifTool-9.33/t/Real_2.out +68 -0
  618. data/bin/Image-ExifTool-9.33/t/Real_3.out +18 -0
  619. data/bin/Image-ExifTool-9.33/t/Real_4.out +11 -0
  620. data/bin/Image-ExifTool-9.33/t/Ricoh.t +47 -0
  621. data/bin/Image-ExifTool-9.33/t/Ricoh_2.out +70 -0
  622. data/bin/Image-ExifTool-9.33/t/Ricoh_3.out +98 -0
  623. data/bin/Image-ExifTool-9.33/t/Ricoh_4.out +112 -0
  624. data/bin/Image-ExifTool-9.33/t/Sanyo.t +39 -0
  625. data/bin/Image-ExifTool-9.33/t/Sanyo_2.out +101 -0
  626. data/bin/Image-ExifTool-9.33/t/Sanyo_3.out +111 -0
  627. data/bin/Image-ExifTool-9.33/t/Sigma.t +60 -0
  628. data/bin/Image-ExifTool-9.33/t/Sigma_2.out +91 -0
  629. data/bin/Image-ExifTool-9.33/t/Sigma_3.out +94 -0
  630. data/bin/Image-ExifTool-9.33/t/Sigma_4.out +63 -0
  631. data/bin/Image-ExifTool-9.33/t/Sigma_5.out +192 -0
  632. data/bin/Image-ExifTool-9.33/t/Sony.t +62 -0
  633. data/bin/Image-ExifTool-9.33/t/Sony_2.out +84 -0
  634. data/bin/Image-ExifTool-9.33/t/Sony_3.out +85 -0
  635. data/bin/Image-ExifTool-9.33/t/Sony_5.out +32 -0
  636. data/bin/Image-ExifTool-9.33/t/TestLib.pm +417 -0
  637. data/bin/Image-ExifTool-9.33/t/Unknown.t +36 -0
  638. data/bin/Image-ExifTool-9.33/t/Unknown_2.out +90 -0
  639. data/bin/Image-ExifTool-9.33/t/Unknown_3.out +90 -0
  640. data/bin/Image-ExifTool-9.33/t/Vorbis.t +28 -0
  641. data/bin/Image-ExifTool-9.33/t/Vorbis_2.out +28 -0
  642. data/bin/Image-ExifTool-9.33/t/Writer.t +913 -0
  643. data/bin/Image-ExifTool-9.33/t/Writer_10.out +240 -0
  644. data/bin/Image-ExifTool-9.33/t/Writer_11.out +37 -0
  645. data/bin/Image-ExifTool-9.33/t/Writer_13.out +160 -0
  646. data/bin/Image-ExifTool-9.33/t/Writer_14.out +67 -0
  647. data/bin/Image-ExifTool-9.33/t/Writer_15.out +171 -0
  648. data/bin/Image-ExifTool-9.33/t/Writer_16.out +1 -0
  649. data/bin/Image-ExifTool-9.33/t/Writer_17.out +1 -0
  650. data/bin/Image-ExifTool-9.33/t/Writer_18.out +3 -0
  651. data/bin/Image-ExifTool-9.33/t/Writer_19.out +34 -0
  652. data/bin/Image-ExifTool-9.33/t/Writer_2.out +168 -0
  653. data/bin/Image-ExifTool-9.33/t/Writer_22.out +4 -0
  654. data/bin/Image-ExifTool-9.33/t/Writer_24.out +1 -0
  655. data/bin/Image-ExifTool-9.33/t/Writer_25.out +38 -0
  656. data/bin/Image-ExifTool-9.33/t/Writer_26.out +32 -0
  657. data/bin/Image-ExifTool-9.33/t/Writer_27.out +14 -0
  658. data/bin/Image-ExifTool-9.33/t/Writer_28.out +1 -0
  659. data/bin/Image-ExifTool-9.33/t/Writer_29.out +2 -0
  660. data/bin/Image-ExifTool-9.33/t/Writer_30.out +2 -0
  661. data/bin/Image-ExifTool-9.33/t/Writer_31.out +97 -0
  662. data/bin/Image-ExifTool-9.33/t/Writer_32.out +3 -0
  663. data/bin/Image-ExifTool-9.33/t/Writer_33.out +3 -0
  664. data/bin/Image-ExifTool-9.33/t/Writer_34.out +3 -0
  665. data/bin/Image-ExifTool-9.33/t/Writer_35.out +187 -0
  666. data/bin/Image-ExifTool-9.33/t/Writer_36.out +2 -0
  667. data/bin/Image-ExifTool-9.33/t/Writer_37.out +2 -0
  668. data/bin/Image-ExifTool-9.33/t/Writer_38.out +62 -0
  669. data/bin/Image-ExifTool-9.33/t/Writer_39.out +4 -0
  670. data/bin/Image-ExifTool-9.33/t/Writer_4.out +85 -0
  671. data/bin/Image-ExifTool-9.33/t/Writer_40.out +4 -0
  672. data/bin/Image-ExifTool-9.33/t/Writer_41.out +3 -0
  673. data/bin/Image-ExifTool-9.33/t/Writer_42.out +5 -0
  674. data/bin/Image-ExifTool-9.33/t/Writer_43.out +5 -0
  675. data/bin/Image-ExifTool-9.33/t/Writer_44.out +2 -0
  676. data/bin/Image-ExifTool-9.33/t/Writer_45.out +1 -0
  677. data/bin/Image-ExifTool-9.33/t/Writer_46.out +77 -0
  678. data/bin/Image-ExifTool-9.33/t/Writer_47.out +56 -0
  679. data/bin/Image-ExifTool-9.33/t/Writer_48.out +29 -0
  680. data/bin/Image-ExifTool-9.33/t/Writer_50.out +3 -0
  681. data/bin/Image-ExifTool-9.33/t/Writer_51.out +386 -0
  682. data/bin/Image-ExifTool-9.33/t/Writer_6.out +182 -0
  683. data/bin/Image-ExifTool-9.33/t/Writer_7.out +149 -0
  684. data/bin/Image-ExifTool-9.33/t/Writer_9.out +237 -0
  685. data/bin/Image-ExifTool-9.33/t/XMP.t +521 -0
  686. data/bin/Image-ExifTool-9.33/t/XMP_10.out +33 -0
  687. data/bin/Image-ExifTool-9.33/t/XMP_11.out +59 -0
  688. data/bin/Image-ExifTool-9.33/t/XMP_12.out +4 -0
  689. data/bin/Image-ExifTool-9.33/t/XMP_13.out +5 -0
  690. data/bin/Image-ExifTool-9.33/t/XMP_14.out +3 -0
  691. data/bin/Image-ExifTool-9.33/t/XMP_15.out +3 -0
  692. data/bin/Image-ExifTool-9.33/t/XMP_16.out +5 -0
  693. data/bin/Image-ExifTool-9.33/t/XMP_17.out +6 -0
  694. data/bin/Image-ExifTool-9.33/t/XMP_18.out +10 -0
  695. data/bin/Image-ExifTool-9.33/t/XMP_19.out +35 -0
  696. data/bin/Image-ExifTool-9.33/t/XMP_2.out +138 -0
  697. data/bin/Image-ExifTool-9.33/t/XMP_20.out +35 -0
  698. data/bin/Image-ExifTool-9.33/t/XMP_21.out +38 -0
  699. data/bin/Image-ExifTool-9.33/t/XMP_22.out +38 -0
  700. data/bin/Image-ExifTool-9.33/t/XMP_23.out +9 -0
  701. data/bin/Image-ExifTool-9.33/t/XMP_24.out +31 -0
  702. data/bin/Image-ExifTool-9.33/t/XMP_25.out +28 -0
  703. data/bin/Image-ExifTool-9.33/t/XMP_26.out +52 -0
  704. data/bin/Image-ExifTool-9.33/t/XMP_27.out +93 -0
  705. data/bin/Image-ExifTool-9.33/t/XMP_28.out +44 -0
  706. data/bin/Image-ExifTool-9.33/t/XMP_29.out +24 -0
  707. data/bin/Image-ExifTool-9.33/t/XMP_3.out +136 -0
  708. data/bin/Image-ExifTool-9.33/t/XMP_30.out +90 -0
  709. data/bin/Image-ExifTool-9.33/t/XMP_31.out +19 -0
  710. data/bin/Image-ExifTool-9.33/t/XMP_32.out +2 -0
  711. data/bin/Image-ExifTool-9.33/t/XMP_34.out +2 -0
  712. data/bin/Image-ExifTool-9.33/t/XMP_36.out +18 -0
  713. data/bin/Image-ExifTool-9.33/t/XMP_37.out +35 -0
  714. data/bin/Image-ExifTool-9.33/t/XMP_39.out +44 -0
  715. data/bin/Image-ExifTool-9.33/t/XMP_40.out +3 -0
  716. data/bin/Image-ExifTool-9.33/t/XMP_41.out +175 -0
  717. data/bin/Image-ExifTool-9.33/t/XMP_5.out +29 -0
  718. data/bin/Image-ExifTool-9.33/t/XMP_6.out +87 -0
  719. data/bin/Image-ExifTool-9.33/t/XMP_7.out +118 -0
  720. data/bin/Image-ExifTool-9.33/t/XMP_8.out +17 -0
  721. data/bin/Image-ExifTool-9.33/t/XMP_9.out +36 -0
  722. data/bin/Image-ExifTool-9.33/t/ZIP.t +69 -0
  723. data/bin/Image-ExifTool-9.33/t/ZIP_2.out +18 -0
  724. data/bin/Image-ExifTool-9.33/t/ZIP_3.out +17 -0
  725. data/bin/Image-ExifTool-9.33/t/ZIP_4.out +213 -0
  726. data/bin/Image-ExifTool-9.33/t/ZIP_5.out +134 -0
  727. data/bin/Image-ExifTool-9.33/t/ZIP_6.out +49 -0
  728. data/bin/Image-ExifTool-9.33/t/ZIP_7.out +28 -0
  729. data/bin/Image-ExifTool-9.33/t/images/AFCP.jpg +0 -0
  730. data/bin/Image-ExifTool-9.33/t/images/AIFF.aif +0 -0
  731. data/bin/Image-ExifTool-9.33/t/images/APE.ape +0 -0
  732. data/bin/Image-ExifTool-9.33/t/images/APE.mpc +0 -0
  733. data/bin/Image-ExifTool-9.33/t/images/ASF.wmv +0 -0
  734. data/bin/Image-ExifTool-9.33/t/images/BMP.bmp +0 -0
  735. data/bin/Image-ExifTool-9.33/t/images/BigTIFF.btf +0 -0
  736. data/bin/Image-ExifTool-9.33/t/images/Canon.jpg +0 -0
  737. data/bin/Image-ExifTool-9.33/t/images/Canon1DmkIII.jpg +0 -0
  738. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.cr2 +0 -0
  739. data/bin/Image-ExifTool-9.33/t/images/CanonRaw.crw +0 -0
  740. data/bin/Image-ExifTool-9.33/t/images/CanonVRD.vrd +0 -0
  741. data/bin/Image-ExifTool-9.33/t/images/CaptureOne.eip +0 -0
  742. data/bin/Image-ExifTool-9.33/t/images/Casio.jpg +0 -0
  743. data/bin/Image-ExifTool-9.33/t/images/Casio2.jpg +0 -0
  744. data/bin/Image-ExifTool-9.33/t/images/CasioQVCI.jpg +0 -0
  745. data/bin/Image-ExifTool-9.33/t/images/DICOM.dcm +0 -0
  746. data/bin/Image-ExifTool-9.33/t/images/DNG.dng +0 -0
  747. data/bin/Image-ExifTool-9.33/t/images/DV.dv +0 -0
  748. data/bin/Image-ExifTool-9.33/t/images/DjVu.djvu +0 -0
  749. data/bin/Image-ExifTool-9.33/t/images/EXE.elf +0 -0
  750. data/bin/Image-ExifTool-9.33/t/images/EXE.exe +0 -0
  751. data/bin/Image-ExifTool-9.33/t/images/EXE.macho +0 -0
  752. data/bin/Image-ExifTool-9.33/t/images/ExifTool.jpg +0 -0
  753. data/bin/Image-ExifTool-9.33/t/images/ExifTool.tif +0 -0
  754. data/bin/Image-ExifTool-9.33/t/images/ExtendedXMP.jpg +0 -0
  755. data/bin/Image-ExifTool-9.33/t/images/FLAC.flac +0 -0
  756. data/bin/Image-ExifTool-9.33/t/images/FLAC.ogg +0 -0
  757. data/bin/Image-ExifTool-9.33/t/images/FLIR.fpf +0 -0
  758. data/bin/Image-ExifTool-9.33/t/images/FLIR.jpg +0 -0
  759. data/bin/Image-ExifTool-9.33/t/images/Flash.flv +0 -0
  760. data/bin/Image-ExifTool-9.33/t/images/Flash.swf +0 -0
  761. data/bin/Image-ExifTool-9.33/t/images/FlashPix.ppt +0 -0
  762. data/bin/Image-ExifTool-9.33/t/images/Font.afm +28 -0
  763. data/bin/Image-ExifTool-9.33/t/images/Font.dfont +0 -0
  764. data/bin/Image-ExifTool-9.33/t/images/Font.pfa +38 -0
  765. data/bin/Image-ExifTool-9.33/t/images/Font.pfb +0 -0
  766. data/bin/Image-ExifTool-9.33/t/images/Font.pfm +0 -0
  767. data/bin/Image-ExifTool-9.33/t/images/Font.ttf +0 -0
  768. data/bin/Image-ExifTool-9.33/t/images/FotoStation.jpg +0 -0
  769. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.jpg +0 -0
  770. data/bin/Image-ExifTool-9.33/t/images/FujiFilm.raf +0 -0
  771. data/bin/Image-ExifTool-9.33/t/images/GE.jpg +0 -0
  772. data/bin/Image-ExifTool-9.33/t/images/GIF.gif +0 -0
  773. data/bin/Image-ExifTool-9.33/t/images/GIMP.xcf +0 -0
  774. data/bin/Image-ExifTool-9.33/t/images/GPS.jpg +0 -0
  775. data/bin/Image-ExifTool-9.33/t/images/GeoTiff.tif +0 -0
  776. data/bin/Image-ExifTool-9.33/t/images/Geotag.gpx +23 -0
  777. data/bin/Image-ExifTool-9.33/t/images/Geotag.igc +24 -0
  778. data/bin/Image-ExifTool-9.33/t/images/Geotag.log +13 -0
  779. data/bin/Image-ExifTool-9.33/t/images/Geotag.xml +23 -0
  780. data/bin/Image-ExifTool-9.33/t/images/Geotag2.log +7 -0
  781. data/bin/Image-ExifTool-9.33/t/images/HTML.html +77 -0
  782. data/bin/Image-ExifTool-9.33/t/images/IPTC.jpg +0 -0
  783. data/bin/Image-ExifTool-9.33/t/images/ITC.itc +0 -0
  784. data/bin/Image-ExifTool-9.33/t/images/InDesign.indd +0 -0
  785. data/bin/Image-ExifTool-9.33/t/images/JVC.jpg +0 -0
  786. data/bin/Image-ExifTool-9.33/t/images/JVC2.jpg +0 -0
  787. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.j2c +0 -0
  788. data/bin/Image-ExifTool-9.33/t/images/Jpeg2000.jp2 +0 -0
  789. data/bin/Image-ExifTool-9.33/t/images/Kodak.jpg +0 -0
  790. data/bin/Image-ExifTool-9.33/t/images/KyoceraRaw.raw +0 -0
  791. data/bin/Image-ExifTool-9.33/t/images/LNK.lnk +0 -0
  792. data/bin/Image-ExifTool-9.33/t/images/M2TS.mts +0 -0
  793. data/bin/Image-ExifTool-9.33/t/images/MIE.mie +0 -0
  794. data/bin/Image-ExifTool-9.33/t/images/MIFF.miff +0 -0
  795. data/bin/Image-ExifTool-9.33/t/images/MP3.mp3 +0 -0
  796. data/bin/Image-ExifTool-9.33/t/images/MWG.jpg +0 -0
  797. data/bin/Image-ExifTool-9.33/t/images/MXF.mxf +0 -0
  798. data/bin/Image-ExifTool-9.33/t/images/Matroska.mkv +0 -0
  799. data/bin/Image-ExifTool-9.33/t/images/Minolta.jpg +0 -0
  800. data/bin/Image-ExifTool-9.33/t/images/Minolta.mrw +0 -0
  801. data/bin/Image-ExifTool-9.33/t/images/Nikon.jpg +0 -0
  802. data/bin/Image-ExifTool-9.33/t/images/Nikon.nef +0 -0
  803. data/bin/Image-ExifTool-9.33/t/images/NikonD2Hs.jpg +0 -0
  804. data/bin/Image-ExifTool-9.33/t/images/NikonD70.jpg +0 -0
  805. data/bin/Image-ExifTool-9.33/t/images/OOXML.docx +0 -0
  806. data/bin/Image-ExifTool-9.33/t/images/Olympus.jpg +0 -0
  807. data/bin/Image-ExifTool-9.33/t/images/Olympus2.jpg +0 -0
  808. data/bin/Image-ExifTool-9.33/t/images/OlympusE1.jpg +0 -0
  809. data/bin/Image-ExifTool-9.33/t/images/OpenDoc.ods +0 -0
  810. data/bin/Image-ExifTool-9.33/t/images/OpenEXR.exr +0 -0
  811. data/bin/Image-ExifTool-9.33/t/images/PDF.pdf +0 -0
  812. data/bin/Image-ExifTool-9.33/t/images/PDF2.pdf +0 -0
  813. data/bin/Image-ExifTool-9.33/t/images/PGF.pgf +0 -0
  814. data/bin/Image-ExifTool-9.33/t/images/PICT.pict +0 -0
  815. data/bin/Image-ExifTool-9.33/t/images/PLIST-bin.plist +0 -0
  816. data/bin/Image-ExifTool-9.33/t/images/PLIST-xml.plist +35 -0
  817. data/bin/Image-ExifTool-9.33/t/images/PNG.png +0 -0
  818. data/bin/Image-ExifTool-9.33/t/images/PPM.ppm +5 -0
  819. data/bin/Image-ExifTool-9.33/t/images/PSP.psp +0 -0
  820. data/bin/Image-ExifTool-9.33/t/images/Panasonic.jpg +0 -0
  821. data/bin/Image-ExifTool-9.33/t/images/Panasonic.rw2 +0 -0
  822. data/bin/Image-ExifTool-9.33/t/images/Pentax.avi +0 -0
  823. data/bin/Image-ExifTool-9.33/t/images/Pentax.jpg +0 -0
  824. data/bin/Image-ExifTool-9.33/t/images/PhotoCD.pcd +0 -0
  825. data/bin/Image-ExifTool-9.33/t/images/PhotoMechanic.jpg +0 -0
  826. data/bin/Image-ExifTool-9.33/t/images/Photoshop.psd +0 -0
  827. data/bin/Image-ExifTool-9.33/t/images/PostScript.eps +108 -0
  828. data/bin/Image-ExifTool-9.33/t/images/QuickTime.m4a +0 -0
  829. data/bin/Image-ExifTool-9.33/t/images/QuickTime.mov +0 -0
  830. data/bin/Image-ExifTool-9.33/t/images/RIFF.avi +0 -0
  831. data/bin/Image-ExifTool-9.33/t/images/RIFF.wav +0 -0
  832. data/bin/Image-ExifTool-9.33/t/images/RIFF.webp +0 -0
  833. data/bin/Image-ExifTool-9.33/t/images/RTF.rtf +25 -0
  834. data/bin/Image-ExifTool-9.33/t/images/Radiance.hdr +0 -0
  835. data/bin/Image-ExifTool-9.33/t/images/Real.ra +0 -0
  836. data/bin/Image-ExifTool-9.33/t/images/Real.ram +1 -0
  837. data/bin/Image-ExifTool-9.33/t/images/Real.rm +0 -0
  838. data/bin/Image-ExifTool-9.33/t/images/Ricoh.jpg +0 -0
  839. data/bin/Image-ExifTool-9.33/t/images/Ricoh2.jpg +0 -0
  840. data/bin/Image-ExifTool-9.33/t/images/Sanyo.jpg +0 -0
  841. data/bin/Image-ExifTool-9.33/t/images/Sigma.jpg +0 -0
  842. data/bin/Image-ExifTool-9.33/t/images/Sigma.x3f +0 -0
  843. data/bin/Image-ExifTool-9.33/t/images/SigmaDP2.x3f +0 -0
  844. data/bin/Image-ExifTool-9.33/t/images/Sony.jpg +0 -0
  845. data/bin/Image-ExifTool-9.33/t/images/Sony.pmp +0 -0
  846. data/bin/Image-ExifTool-9.33/t/images/Unknown.jpg +0 -0
  847. data/bin/Image-ExifTool-9.33/t/images/Vorbis.ogg +0 -0
  848. data/bin/Image-ExifTool-9.33/t/images/Writer.jpg +0 -0
  849. data/bin/Image-ExifTool-9.33/t/images/XMP.inx +108 -0
  850. data/bin/Image-ExifTool-9.33/t/images/XMP.jpg +0 -0
  851. data/bin/Image-ExifTool-9.33/t/images/XMP.svg +33 -0
  852. data/bin/Image-ExifTool-9.33/t/images/XMP.xml +98 -0
  853. data/bin/Image-ExifTool-9.33/t/images/XMP.xmp +99 -0
  854. data/bin/Image-ExifTool-9.33/t/images/XMP2.xmp +25 -0
  855. data/bin/Image-ExifTool-9.33/t/images/XMP3.xmp +43 -0
  856. data/bin/Image-ExifTool-9.33/t/images/XMP4.xmp +93 -0
  857. data/bin/Image-ExifTool-9.33/t/images/XMP5.xmp +158 -0
  858. data/bin/Image-ExifTool-9.33/t/images/ZIP.gz +0 -0
  859. data/bin/Image-ExifTool-9.33/t/images/ZIP.zip +0 -0
  860. data/bin/Image-ExifTool-9.33/t/images/iWork.numbers +0 -0
  861. data/lib/exiftool_vendored.rb +10 -0
  862. data/lib/exiftool_vendored/version.rb +3 -0
  863. data/lib/exiftool_vendored/version_extractor.rb +17 -0
  864. metadata +977 -0
@@ -0,0 +1,1318 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: WriteXMP.pl
3
+ #
4
+ # Description: Write XMP meta information
5
+ #
6
+ # Revisions: 12/19/2004 - P. Harvey Created
7
+ #------------------------------------------------------------------------------
8
+ package Image::ExifTool::XMP;
9
+
10
+ use strict;
11
+ use vars qw(%specialStruct %dateTimeInfo $xlatNamespace);
12
+
13
+ use Image::ExifTool qw(:DataAccess :Utils);
14
+
15
+ sub CheckXMP($$$);
16
+ sub CaptureXMP($$$;$);
17
+ sub SetPropertyPath($$;$$$$);
18
+
19
+ my $debug = 0;
20
+ my $numPadLines = 24; # number of blank padding lines
21
+
22
+ # when writing extended XMP, resources bigger than this get placed in their own
23
+ # rdf:Description so they can be moved to the extended segments if necessary
24
+ my $newDescThresh = 10240; # 10 kB
25
+
26
+ # individual resources and namespaces to place last in separate rdf:Description's
27
+ # so they can be moved to extended XMP segments if required (see Oct. 2008 XMP spec)
28
+ my %extendedRes = (
29
+ 'photoshop:History' => 1,
30
+ 'xap:Thumbnails' => 1,
31
+ 'xmp:Thumbnails' => 1,
32
+ 'crs' => 1,
33
+ 'crss' => 1,
34
+ );
35
+
36
+ my $rdfDesc = 'rdf:Description';
37
+ #
38
+ # packet/xmp/rdf headers and trailers
39
+ #
40
+ my $pktOpen = "<?xpacket begin='\xef\xbb\xbf' id='W5M0MpCehiHzreSzNTczkc9d'?>\n";
41
+ my $xmlOpen = "<?xml version='1.0' encoding='UTF-8'?>\n";
42
+ my $xmpOpenPrefix = "<x:xmpmeta xmlns:x='$nsURI{x}'";
43
+ my $rdfOpen = "<rdf:RDF xmlns:rdf='$nsURI{rdf}'>\n";
44
+ my $rdfClose = "</rdf:RDF>\n";
45
+ my $xmpClose = "</x:xmpmeta>\n";
46
+ my $pktCloseW = "<?xpacket end='w'?>"; # writable by default
47
+ my $pktCloseR = "<?xpacket end='r'?>";
48
+
49
+ #------------------------------------------------------------------------------
50
+ # Get XMP opening tag (and set x:xmptk appropriately)
51
+ # Inputs: 0) ExifTool object ref
52
+ # Returns: x:xmpmeta opening tag
53
+ sub XMPOpen($)
54
+ {
55
+ my $exifTool = shift;
56
+ my $nv = $exifTool->{NEW_VALUE}->{$Image::ExifTool::XMP::x{xmptk}};
57
+ my $tk;
58
+ if (defined $nv) {
59
+ $tk = $exifTool->GetNewValues($nv);
60
+ $exifTool->VerboseValue(($tk ? '+' : '-') . ' XMP-x:XMPToolkit', $tk);
61
+ ++$exifTool->{CHANGED};
62
+ } else {
63
+ $tk = "Image::ExifTool $Image::ExifTool::VERSION";
64
+ }
65
+ my $str = $tk ? (" x:xmptk='" . EscapeXML($tk) . "'") : '';
66
+ return "$xmpOpenPrefix$str>\n";
67
+ }
68
+
69
+ #------------------------------------------------------------------------------
70
+ # Validate XMP packet and set read or read/write mode
71
+ # Inputs: 0) XMP data reference, 1) 'r' = read only, 'w' or undef = read/write
72
+ # Returns: true if XMP is good (and adds packet header/trailer if necessary)
73
+ sub ValidateXMP($;$)
74
+ {
75
+ my ($xmpPt, $mode) = @_;
76
+ unless ($$xmpPt =~ /^\0*<\0*\?\0*x\0*p\0*a\0*c\0*k\0*e\0*t/) {
77
+ return '' unless $$xmpPt =~ /^<x(mp)?:x[ma]pmeta/;
78
+ # add required xpacket header/trailer
79
+ $$xmpPt = $pktOpen . $$xmpPt . $pktCloseW;
80
+ }
81
+ $mode = 'w' unless $mode;
82
+ my $end = substr($$xmpPt, -32, 32);
83
+ # check for proper xpacket trailer and set r/w mode if necessary
84
+ return '' unless $end =~ s/(e\0*n\0*d\0*=\0*['"]\0*)([rw])(\0*['"]\0*\?\0*>)/$1$mode$3/;
85
+ substr($$xmpPt, -32, 32) = $end if $2 ne $mode;
86
+ return 1;
87
+ }
88
+
89
+ #------------------------------------------------------------------------------
90
+ # Check XMP date values for validity and format accordingly
91
+ # Inputs: 1) date string
92
+ # Returns: XMP date/time string (or undef on error)
93
+ sub FormatXMPDate($)
94
+ {
95
+ my $val = shift;
96
+ my ($y, $m, $d, $t, $tz);
97
+ if ($val =~ /(\d{4}):(\d{2}):(\d{2}) (\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)/) {
98
+ ($y, $m, $d, $t, $tz) = ($1, $2, $3, $4, $5);
99
+ $val = "$y-$m-${d}T$t";
100
+ } elsif ($val =~ /^\s*\d{4}(:\d{2}){0,2}\s*$/) {
101
+ # this is just a date (YYYY, YYYY-mm or YYYY-mm-dd)
102
+ $val =~ tr/:/-/;
103
+ } elsif ($val =~ /^\s*(\d{2}:\d{2}(?::\d{2}(?:\.\d*)?)?)(.*)\s*$/) {
104
+ # this is just a time
105
+ ($t, $tz) = ($1, $2);
106
+ $val = $t;
107
+ } else {
108
+ return undef;
109
+ }
110
+ if ($tz) {
111
+ $tz =~ /^(Z|[+-]\d{2}:\d{2})$/ or return undef;
112
+ $val .= $tz;
113
+ }
114
+ return $val;
115
+ }
116
+
117
+ #------------------------------------------------------------------------------
118
+ # Check XMP values for validity and format accordingly
119
+ # Inputs: 0) ExifTool object ref, 1) tagInfo hash ref, 2) raw value ref
120
+ # Returns: error string or undef (and may change value) on success
121
+ # Note: copies structured information to avoid conflicts with calling code
122
+ sub CheckXMP($$$)
123
+ {
124
+ my ($exifTool, $tagInfo, $valPtr) = @_;
125
+
126
+ if ($$tagInfo{Struct}) {
127
+ require 'Image/ExifTool/XMPStruct.pl';
128
+ my ($item, $err, $w, $warn);
129
+ unless (ref $$valPtr) {
130
+ ($$valPtr, $warn) = InflateStruct($valPtr);
131
+ # expect a structure HASH ref or ARRAY of structures
132
+ ref $$valPtr or return 'Improperly formed structure';
133
+ }
134
+ if (ref $$valPtr eq 'ARRAY') {
135
+ return 'Not a list tag' unless $$tagInfo{List};
136
+ my @copy = ( @{$$valPtr} ); # copy the list for ExifTool to use
137
+ $$valPtr = \@copy; # return the copy
138
+ foreach $item (@copy) {
139
+ unless (ref $item eq 'HASH') {
140
+ ($item, $w) = InflateStruct(\$item); # deserialize structure
141
+ $w and $warn = $w;
142
+ next if ref $item eq 'HASH';
143
+ $err = 'Improperly formed structure';
144
+ last;
145
+ }
146
+ ($item, $err) = CheckStruct($exifTool, $item, $$tagInfo{Struct});
147
+ last if $err;
148
+ }
149
+ } else {
150
+ ($$valPtr, $err) = CheckStruct($exifTool, $$valPtr, $$tagInfo{Struct});
151
+ }
152
+ $warn and $$exifTool{CHECK_WARN} = $warn;
153
+ return $err;
154
+ }
155
+ my $format = $tagInfo->{Writable};
156
+ # (if no format specified, value is a simple string)
157
+ if (not $format or $format eq 'string' or $format eq 'lang-alt') {
158
+ # convert value to UTF8 if necessary
159
+ if ($exifTool->{OPTIONS}->{Charset} ne 'UTF8') {
160
+ if ($$valPtr =~ /[\x80-\xff]/) {
161
+ # convert from Charset to UTF-8
162
+ $$valPtr = $exifTool->Encode($$valPtr,'UTF8');
163
+ }
164
+ } else {
165
+ # translate invalid XML characters to "."
166
+ $$valPtr =~ tr/\0-\x08\x0b\x0c\x0e-\x1f/./;
167
+ # fix any malformed UTF-8 characters
168
+ if (FixUTF8($valPtr) and not $$exifTool{WarnBadUTF8}) {
169
+ $exifTool->Warn('Malformed UTF-8 character(s)');
170
+ $$exifTool{WarnBadUTF8} = 1;
171
+ }
172
+ }
173
+ return undef; # success
174
+ }
175
+ if ($format eq 'rational' or $format eq 'real') {
176
+ # make sure the value is a valid floating point number
177
+ unless (Image::ExifTool::IsFloat($$valPtr) or
178
+ # allow 'inf' and 'undef' rational values
179
+ ($format eq 'rational' and ($$valPtr eq 'inf' or
180
+ $$valPtr eq 'undef' or Image::ExifTool::IsRational($$valPtr))))
181
+ {
182
+ return 'Not a floating point number'
183
+ }
184
+ if ($format eq 'rational') {
185
+ $$valPtr = join('/', Image::ExifTool::Rationalize($$valPtr));
186
+ }
187
+ } elsif ($format eq 'integer') {
188
+ # make sure the value is integer
189
+ if (Image::ExifTool::IsInt($$valPtr)) {
190
+ # no conversion required (converting to 'int' would remove leading '+')
191
+ } elsif (Image::ExifTool::IsHex($$valPtr)) {
192
+ $$valPtr = hex($$valPtr);
193
+ } else {
194
+ return 'Not an integer';
195
+ }
196
+ } elsif ($format eq 'date') {
197
+ my $newDate = FormatXMPDate($$valPtr);
198
+ return "Invalid date/time (use YYYY:mm:dd HH:MM:SS[.ss][+/-HH:MM|Z])" unless $newDate;
199
+ $$valPtr = $newDate;
200
+ } elsif ($format eq 'boolean') {
201
+ if (not $$valPtr or $$valPtr =~ /false/i or $$valPtr =~ /^no$/i) {
202
+ $$valPtr = 'False';
203
+ } else {
204
+ $$valPtr = 'True';
205
+ }
206
+ } elsif ($format eq '1') {
207
+ # this is the entire XMP data block
208
+ return 'Invalid XMP data' unless ValidateXMP($valPtr);
209
+ } else {
210
+ return "Unknown XMP format: $format";
211
+ }
212
+ return undef; # success!
213
+ }
214
+
215
+ #------------------------------------------------------------------------------
216
+ # Get PropertyPath for specified tagInfo
217
+ # Inputs: 0) tagInfo reference
218
+ # Returns: PropertyPath string
219
+ sub GetPropertyPath($)
220
+ {
221
+ my $tagInfo = shift;
222
+ SetPropertyPath($$tagInfo{Table}, $$tagInfo{TagID}) unless $$tagInfo{PropertyPath};
223
+ return $$tagInfo{PropertyPath};
224
+ }
225
+
226
+ #------------------------------------------------------------------------------
227
+ # Set PropertyPath for specified tag (also for associated flattened tags and structure elements)
228
+ # Inputs: 0) tagTable reference, 1) tagID, 2) tagID of parent structure,
229
+ # 3) structure definition ref (or undef), 4) property list up to this point (or undef),
230
+ # 5) flag set if any containing structure has a TYPE
231
+ # Notes: also generates flattened tags if they don't already exist
232
+ sub SetPropertyPath($$;$$$$)
233
+ {
234
+ my ($tagTablePtr, $tagID, $parentID, $structPtr, $propList, $isType) = @_;
235
+ my $table = $structPtr || $tagTablePtr;
236
+ my $tagInfo = $$table{$tagID};
237
+
238
+ return if ref($tagInfo) ne 'HASH' or $$tagInfo{PropertyPath};
239
+
240
+ # don't override existing main table entry if already set by a Struct
241
+ if ($structPtr) {
242
+ $isType = 1 if $$structPtr{TYPE};
243
+ } else {
244
+ # use property path from original tagInfo if this is an alternate-language tag
245
+ my $srcInfo = $$tagInfo{SrcTagInfo};
246
+ $$tagInfo{PropertyPath} = GetPropertyPath($srcInfo) if $srcInfo;
247
+ return if $$tagInfo{PropertyPath};
248
+ # set property path for all flattened tags in structure if necessary
249
+ if ($$tagInfo{RootTagInfo}) {
250
+ SetPropertyPath($tagTablePtr, $$tagInfo{RootTagInfo}{TagID});
251
+ return if $$tagInfo{PropertyPath};
252
+ warn "Internal Error: Didn't set path from root for $tagID\n";
253
+ }
254
+ }
255
+ my $ns = $$tagInfo{Namespace} || $$table{NAMESPACE};
256
+ $ns or warn("No namespace for $tagID\n"), return;
257
+ my (@propList, $listType);
258
+ $propList and @propList = @$propList;
259
+ push @propList, "$ns:$tagID";
260
+ # lang-alt lists are handled specially, signified by Writable='lang-alt'
261
+ if ($$tagInfo{Writable} and $$tagInfo{Writable} eq 'lang-alt') {
262
+ $listType = 'Alt';
263
+ # remove language code from property path if it exists
264
+ $propList[-1] =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
265
+ # handle lists of lang-alt lists (ie. XMP-plus:Custom tags)
266
+ if ($$tagInfo{List} and $$tagInfo{List} ne '1') {
267
+ push @propList, "rdf:$$tagInfo{List}", 'rdf:li 10';
268
+ }
269
+ } else {
270
+ $listType = $$tagInfo{List};
271
+ }
272
+ # add required properties if this is a list
273
+ push @propList, "rdf:$listType", 'rdf:li 10' if $listType and $listType ne '1';
274
+ # set PropertyPath for all flattened tags of this structure if necessary
275
+ # (note: don't do this for variable-namespace structures (undef NAMESPACE))
276
+ my $strTable = $$tagInfo{Struct};
277
+ if ($strTable and $$strTable{NAMESPACE} and not ($parentID and
278
+ # must test NoSubStruct flag to avoid infinite recursion
279
+ (($$tagTablePtr{$parentID} and $$tagTablePtr{$parentID}{NoSubStruct}) or
280
+ length $parentID > 500))) # avoid deep recursion
281
+ {
282
+ # make sure the structure namespace has been registered
283
+ # (user-defined namespaces may not have been)
284
+ RegisterNamespace($strTable) if ref $$strTable{NAMESPACE};
285
+ my $tag;
286
+ foreach $tag (keys %$strTable) {
287
+ # ignore special fields and any lang-alt fields we may have added
288
+ next if $specialStruct{$tag} or $$strTable{$tag}{LangCode};
289
+ my $fullID = $parentID ? $parentID . ucfirst($tagID) : $tagID;
290
+ SetPropertyPath($tagTablePtr, $tag, $fullID, $strTable, \@propList, $isType);
291
+ }
292
+ }
293
+ # if this was a structure field and not a normal tag,
294
+ # we set PropertyPath in the corresponding flattened tag
295
+ if ($structPtr) {
296
+ my $flatID = $parentID . ucfirst($tagID);
297
+ $tagInfo = $$tagTablePtr{$flatID};
298
+ # create flattened tag now if necessary
299
+ # (could happen if we were just writing a structure)
300
+ unless ($tagInfo) {
301
+ $tagInfo = { Name => ucfirst($flatID), Flat => 1 };
302
+ AddTagToTable($tagTablePtr, $flatID, $tagInfo);
303
+ }
304
+ # set StructType flag if any containing structure has a TYPE
305
+ $$tagInfo{StructType} = 1 if $isType;
306
+ }
307
+ # set property path for tagInfo in main table
308
+ $$tagInfo{PropertyPath} = join '/', @propList;
309
+ }
310
+
311
+ #------------------------------------------------------------------------------
312
+ # Save XMP property name/value for rewriting
313
+ # Inputs: 0) ExifTool object reference
314
+ # 1) reference to array of XMP property path (last is current property)
315
+ # 2) property value, 3) optional reference to hash of property attributes
316
+ sub CaptureXMP($$$;$)
317
+ {
318
+ my ($exifTool, $propList, $val, $attrs) = @_;
319
+ return unless defined $val and @$propList > 2;
320
+ if ($$propList[0] =~ /^x:x[ma]pmeta$/ and
321
+ $$propList[1] eq 'rdf:RDF' and
322
+ $$propList[2] =~ /$rdfDesc( |$)/)
323
+ {
324
+ # no properties to save yet if this is just the description
325
+ return unless @$propList > 3;
326
+ # ignore empty list properties
327
+ if ($$propList[-1] =~ /^rdf:(Bag|Seq|Alt)$/) {
328
+ $exifTool->Warn("Ignored empty $$propList[-1] list for $$propList[-2]", 1);
329
+ return;
330
+ }
331
+ # save information about this property
332
+ my $capture = $exifTool->{XMP_CAPTURE};
333
+ my $path = join('/', @$propList[3..$#$propList]);
334
+ if (defined $$capture{$path}) {
335
+ $exifTool->{XMP_ERROR} = "Duplicate XMP property: $path";
336
+ } else {
337
+ $$capture{$path} = [$val, $attrs || { }];
338
+ }
339
+ } elsif ($$propList[0] eq 'rdf:RDF' and
340
+ $$propList[1] =~ /$rdfDesc( |$)/)
341
+ {
342
+ # set flag so we don't write x:xmpmeta element
343
+ $exifTool->{XMP_NO_XMPMETA} = 1;
344
+ # add missing x:xmpmeta element and try again
345
+ unshift @$propList, 'x:xmpmeta';
346
+ CaptureXMP($exifTool, $propList, $val, $attrs);
347
+ } else {
348
+ $exifTool->{XMP_ERROR} = 'Improperly enclosed XMP property: ' . join('/',@$propList);
349
+ }
350
+ }
351
+
352
+ #------------------------------------------------------------------------------
353
+ # Save information about resource containing blank node with nodeID
354
+ # Inputs: 0) reference to blank node information hash
355
+ # 1) reference to property list
356
+ # 2) property value
357
+ # 3) [optional] reference to attribute hash
358
+ # Notes: This routine and ProcessBlankInfo() are also used for reading information, but
359
+ # are uncommon so are put in this file to reduce compile time for the common case
360
+ sub SaveBlankInfo($$$;$)
361
+ {
362
+ my ($blankInfo, $propListPt, $val, $attrs) = @_;
363
+
364
+ my $propPath = join '/', @$propListPt;
365
+ my @ids = ($propPath =~ m{ #([^ /]*)}g);
366
+ my $id;
367
+ # split the property path at each nodeID
368
+ foreach $id (@ids) {
369
+ my ($pre, $prop, $post) = ($propPath =~ m{^(.*?)/([^/]*) #$id((/.*)?)$});
370
+ defined $pre or warn("internal error parsing nodeID's"), next;
371
+ # the element with the nodeID should be in the path prefix for subject
372
+ # nodes and the path suffix for object nodes
373
+ unless ($prop eq $rdfDesc) {
374
+ if ($post) {
375
+ $post = "/$prop$post";
376
+ } else {
377
+ $pre = "$pre/$prop";
378
+ }
379
+ }
380
+ $blankInfo->{Prop}->{$id}->{Pre}->{$pre} = 1;
381
+ if ((defined $post and length $post) or (defined $val and length $val)) {
382
+ # save the property value and attributes for each unique path suffix
383
+ $blankInfo->{Prop}->{$id}->{Post}->{$post} = [ $val, $attrs, $propPath ];
384
+ }
385
+ }
386
+ }
387
+
388
+ #------------------------------------------------------------------------------
389
+ # Process blank-node information
390
+ # Inputs: 0) ExifTool object ref, 1) tag table ref,
391
+ # 2) blank node information hash ref, 3) flag set for writing
392
+ sub ProcessBlankInfo($$$;$)
393
+ {
394
+ my ($exifTool, $tagTablePtr, $blankInfo, $isWriting) = @_;
395
+ $exifTool->VPrint(1, " [Elements with nodeID set:]\n") unless $isWriting;
396
+ my ($id, $pre, $post);
397
+ # handle each nodeID separately
398
+ foreach $id (sort keys %{$$blankInfo{Prop}}) {
399
+ my $path = $blankInfo->{Prop}->{$id};
400
+ # flag all resource names so we can warn later if some are unused
401
+ my %unused;
402
+ foreach $post (keys %{$path->{Post}}) {
403
+ $unused{$post} = 1;
404
+ }
405
+ # combine property paths for all possible paths through this node
406
+ foreach $pre (sort keys %{$path->{Pre}}) {
407
+ # there will be no description for the object of a blank node
408
+ next unless $pre =~ m{/$rdfDesc/};
409
+ foreach $post (sort keys %{$path->{Post}}) {
410
+ my @propList = split m{/}, "$pre$post";
411
+ my ($val, $attrs) = @{$path->{Post}->{$post}};
412
+ if ($isWriting) {
413
+ CaptureXMP($exifTool, \@propList, $val, $attrs);
414
+ } else {
415
+ FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
416
+ }
417
+ delete $unused{$post};
418
+ }
419
+ }
420
+ # save information from unused properties (if RDF is malformed like f-spot output)
421
+ if (%unused) {
422
+ $exifTool->Options('Verbose') and $exifTool->Warn('An XMP resource is about nothing');
423
+ foreach $post (sort keys %unused) {
424
+ my ($val, $attrs, $propPath) = @{$path->{Post}->{$post}};
425
+ my @propList = split m{/}, $propPath;
426
+ if ($isWriting) {
427
+ CaptureXMP($exifTool, \@propList, $val, $attrs);
428
+ } else {
429
+ FoundXMP($exifTool, $tagTablePtr, \@propList, $val);
430
+ }
431
+ }
432
+ }
433
+ }
434
+ }
435
+
436
+ #------------------------------------------------------------------------------
437
+ # Convert path to namespace used in file (this is a pain, but the XMP
438
+ # spec only suggests 'preferred' namespace prefixes...)
439
+ # Inputs: 0) ExifTool object reference, 1) property path
440
+ # Returns: conforming property path
441
+ sub ConformPathToNamespace($$)
442
+ {
443
+ my ($exifTool, $path) = @_;
444
+ my @propList = split('/',$path);
445
+ my $nsUsed = $exifTool->{XMP_NS};
446
+ my $prop;
447
+ foreach $prop (@propList) {
448
+ my ($ns, $tag) = $prop =~ /(.+?):(.*)/;
449
+ next if $$nsUsed{$ns};
450
+ my $uri = $nsURI{$ns};
451
+ unless ($uri) {
452
+ warn "No URI for namepace prefix $ns!\n";
453
+ next;
454
+ }
455
+ my $ns2;
456
+ foreach $ns2 (keys %$nsUsed) {
457
+ next unless $$nsUsed{$ns2} eq $uri;
458
+ # use the existing namespace prefix instead of ours
459
+ $prop = "$ns2:$tag";
460
+ last;
461
+ }
462
+ }
463
+ return join('/',@propList);
464
+ }
465
+
466
+ #------------------------------------------------------------------------------
467
+ # Add necessary rdf:type element when writing structure
468
+ # Inputs: 0) ExifTool ref, 1) tag table ref, 2) capture hash ref, 3) path string
469
+ # 4) optional base path (already conformed to namespace) for elements in
470
+ # variable-namespace structures
471
+ sub AddStructType($$$$;$)
472
+ {
473
+ my ($exifTool, $tagTablePtr, $capture, $path, $basePath) = @_;
474
+ my @props = split '/', $path;
475
+ my %doneID;
476
+ for (;;) {
477
+ pop @props;
478
+ last unless @props;
479
+ my $tagID = GetXMPTagID(\@props);
480
+ next if $doneID{$tagID};
481
+ $doneID{$tagID} = 1;
482
+ my $tagInfo = $$tagTablePtr{$tagID};
483
+ last unless ref $tagInfo eq 'HASH';
484
+ if ($$tagInfo{Struct}) {
485
+ my $type = $$tagInfo{Struct}{TYPE};
486
+ if ($type) {
487
+ my $pat = $$tagInfo{PropertyPath};
488
+ $pat or warn("Missing PropertyPath in AddStructType\n"), last;
489
+ $pat = ConformPathToNamespace($exifTool, $pat);
490
+ $pat =~ s/ \d+/ \\d\+/g;
491
+ $path =~ /^($pat)/ or warn("Wrong path in AddStructType\n"), last;
492
+ my $p = $1 . '/rdf:type';
493
+ $p = "$basePath/$p" if $basePath;
494
+ $$capture{$p} = [ '', { 'rdf:resource' => $type } ] unless $$capture{$p};
495
+ }
496
+ }
497
+ last unless $$tagInfo{StructType};
498
+ }
499
+ }
500
+
501
+ #------------------------------------------------------------------------------
502
+ # Utility routine to encode data in base64
503
+ # Inputs: 0) binary data string
504
+ # Returns: base64-encoded string
505
+ sub EncodeBase64($)
506
+ {
507
+ # encode the data in 45-byte chunks
508
+ my $chunkSize = 45;
509
+ my $len = length $_[0];
510
+ my $str = '';
511
+ my $i;
512
+ for ($i=0; $i<$len; $i+=$chunkSize) {
513
+ my $n = $len - $i;
514
+ $n = $chunkSize if $n > $chunkSize;
515
+ # add uuencoded data to output (minus size byte, but including trailing newline)
516
+ $str .= substr(pack('u', substr($_[0], $i, $n)), 1);
517
+ }
518
+ # convert to base64 (remember that "\0" may be encoded as ' ' or '`')
519
+ $str =~ tr/` -_/AA-Za-z0-9+\//;
520
+ # convert pad characters at the end (remember to account for trailing newline)
521
+ my $pad = 3 - ($len % 3);
522
+ substr($str, -$pad-1, $pad) = ('=' x $pad) if $pad < 3;
523
+ return $str;
524
+ }
525
+
526
+ #------------------------------------------------------------------------------
527
+ # sort tagInfo hash references by tag name
528
+ sub ByTagName
529
+ {
530
+ return $$a{Name} cmp $$b{Name};
531
+ }
532
+
533
+ #------------------------------------------------------------------------------
534
+ # sort alphabetically, but with rdf:type first in the structure
535
+ sub TypeFirst
536
+ {
537
+ if ($a =~ /rdf:type$/) {
538
+ return substr($a, 0, -8) cmp $b unless $b =~ /rdf:type$/;
539
+ } elsif ($b =~ /rdf:type$/) {
540
+ return $a cmp substr($b, 0, -8);
541
+ }
542
+ return $a cmp $b;
543
+ }
544
+
545
+ #------------------------------------------------------------------------------
546
+ # Limit size of XMP
547
+ # Inputs: 0) ExifTool object ref, 1) XMP data ref (written up to start of $rdfClose),
548
+ # 2) max XMP len, 3) rdf:about string, 4) list ref for description start offsets
549
+ # 5) start offset of first description recommended for extended XMP
550
+ # Returns: 0) extended XMP ref, 1) GUID and updates $$dataPt (or undef if no extended XMP)
551
+ sub LimitXMPSize($$$$$$)
552
+ {
553
+ my ($exifTool, $dataPt, $maxLen, $about, $startPt, $extStart) = @_;
554
+
555
+ # return straight away if it isn't too big
556
+ return undef if length($$dataPt) < $maxLen;
557
+
558
+ push @$startPt, length($$dataPt); # add end offset to list
559
+ my $newData = substr($$dataPt, 0, $$startPt[0]);
560
+ my $guid = '0' x 32;
561
+ # write the required xmpNote:HasExtendedXMP property
562
+ $newData .= "\n <$rdfDesc rdf:about='$about'\n xmlns:xmpNote='$nsURI{xmpNote}'>\n" .
563
+ " <xmpNote:HasExtendedXMP>$guid</xmpNote:HasExtendedXMP>\n" .
564
+ " </$rdfDesc>\n";
565
+
566
+ my ($i, %descSize, $start);
567
+ # calculate all description block sizes
568
+ for ($i=1; $i<@$startPt; ++$i) {
569
+ $descSize{$$startPt[$i-1]} = $$startPt[$i] - $$startPt[$i-1];
570
+ }
571
+ pop @$startPt; # remove end offset
572
+ # write the descriptions from smallest to largest, as many in main XMP as possible
573
+ my @descStart = sort { $descSize{$a} <=> $descSize{$b} } @$startPt;
574
+ my $extData = XMPOpen($exifTool) . $rdfOpen;
575
+ for ($i=0; $i<2; ++$i) {
576
+ foreach $start (@descStart) {
577
+ # write main XMP first (in order of size), then extended XMP afterwards (in order)
578
+ next if $i xor $start >= $extStart;
579
+ my $pt = (length($newData) + $descSize{$start} > $maxLen) ? \$extData : \$newData;
580
+ $$pt .= substr($$dataPt, $start, $descSize{$start});
581
+ }
582
+ }
583
+ $extData .= $rdfClose . $xmpClose; # close rdf:RDF and x:xmpmeta
584
+ # calculate GUID from MD5 of extended XMP data
585
+ if (eval 'require Digest::MD5') {
586
+ $guid = uc unpack('H*', Digest::MD5::md5($extData));
587
+ $newData =~ s/0{32}/$guid/; # update GUID in main XMP segment
588
+ }
589
+ $exifTool->VerboseValue('+ XMP-xmpNote:HasExtendedXMP', $guid);
590
+ $$dataPt = $newData; # return main XMP block
591
+ return (\$extData, $guid); # return extended XMP and its GUID
592
+ }
593
+
594
+ #------------------------------------------------------------------------------
595
+ # Write XMP information
596
+ # Inputs: 0) ExifTool object reference, 1) source dirInfo reference,
597
+ # 2) [optional] tag table reference
598
+ # Returns: with tag table: new XMP data (may be empty if no XMP data) or undef on error
599
+ # without tag table: 1 on success, 0 if not valid XMP file, -1 on write error
600
+ # Notes: May set dirInfo InPlace flag to rewrite with specified DirLen
601
+ # May set dirInfo ReadOnly flag to write as read-only XMP ('r' mode and no padding)
602
+ # May set dirInfo Compact flag to force compact (drops 2kB of padding)
603
+ # May set dirInfo MaxDataLen to limit output data length -- this causes ExtendedXMP
604
+ # and ExtendedGUID to be returned in dirInfo if extended XMP was required
605
+ sub WriteXMP($$;$)
606
+ {
607
+ my ($exifTool, $dirInfo, $tagTablePtr) = @_;
608
+ $exifTool or return 1; # allow dummy access to autoload this package
609
+ my $dataPt = $$dirInfo{DataPt};
610
+ my (%capture, %nsUsed, $xmpErr, $tagInfo, $about);
611
+ my $changed = 0;
612
+ my $xmpFile = (not $tagTablePtr); # this is an XMP data file if no $tagTablePtr
613
+ # prefer XMP over other metadata formats in some types of files
614
+ my $preferred = $xmpFile || ($$exifTool{PreferredGroup} and $$exifTool{PreferredGroup} eq 'XMP');
615
+ my $verbose = $exifTool->Options('Verbose');
616
+ my $dirLen = $$dirInfo{DirLen};
617
+ $dirLen = length($$dataPt) if not defined $dirLen and $dataPt;
618
+ #
619
+ # extract existing XMP information into %capture hash
620
+ #
621
+ # define hash in ExifTool object to capture XMP information (also causes
622
+ # CaptureXMP() instead of FoundXMP() to be called from ParseXMPElement())
623
+ #
624
+ # The %capture hash is keyed on the complete property path beginning after
625
+ # rdf:RDF/rdf:Description/. The values are array references with the
626
+ # following entries: 0) value, 1) attribute hash reference.
627
+ $exifTool->{XMP_CAPTURE} = \%capture;
628
+ $exifTool->{XMP_NS} = \%nsUsed;
629
+ delete $exifTool->{XMP_NO_XMPMETA};
630
+ delete $exifTool->{XMP_NO_XPACKET};
631
+ delete $exifTool->{XMP_IS_XML};
632
+ delete $exifTool->{XMP_IS_SVG};
633
+
634
+ if ($xmpFile or $dirLen) {
635
+ delete $exifTool->{XMP_ERROR};
636
+ delete $exifTool->{XMP_ABOUT};
637
+ # extract all existing XMP information (to the XMP_CAPTURE hash)
638
+ my $success = ProcessXMP($exifTool, $dirInfo, $tagTablePtr);
639
+ # don't continue if there is nothing to parse or if we had a parsing error
640
+ unless ($success and not $exifTool->{XMP_ERROR}) {
641
+ my $err = $exifTool->{XMP_ERROR} || 'Error parsing XMP';
642
+ # may ignore this error only if we were successful
643
+ if ($xmpFile) {
644
+ my $raf = $$dirInfo{RAF};
645
+ # allow empty XMP data so we can create something from nothing
646
+ if ($success or not $raf->Seek(0,2) or $raf->Tell()) {
647
+ # no error message if not an XMP file
648
+ return 0 unless $exifTool->{XMP_ERROR};
649
+ if ($exifTool->Error($err, $success)) {
650
+ delete $exifTool->{XMP_CAPTURE};
651
+ return 0;
652
+ }
653
+ }
654
+ } else {
655
+ if ($exifTool->Warn($err, $success)) {
656
+ delete $exifTool->{XMP_CAPTURE};
657
+ return undef;
658
+ }
659
+ }
660
+ }
661
+ $tagInfo = $Image::ExifTool::XMP::rdf{about};
662
+ if (defined $exifTool->{NEW_VALUE}->{$tagInfo}) {
663
+ $about = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo}) || '';
664
+ if ($verbose > 1) {
665
+ my $wasAbout = $exifTool->{XMP_ABOUT};
666
+ $exifTool->VerboseValue('- XMP-rdf:About', UnescapeXML($wasAbout)) if defined $wasAbout;
667
+ $exifTool->VerboseValue('+ XMP-rdf:About', $about);
668
+ }
669
+ $about = EscapeXML($about); # must escape for XML
670
+ ++$changed;
671
+ } else {
672
+ $about = $exifTool->{XMP_ABOUT} || '';
673
+ }
674
+ delete $exifTool->{XMP_ERROR};
675
+ delete $exifTool->{XMP_ABOUT};
676
+ } else {
677
+ $about = '';
678
+ }
679
+ #
680
+ # handle writing XMP as a block to XMP file
681
+ #
682
+ if ($xmpFile) {
683
+ $tagInfo = $Image::ExifTool::Extra{XMP};
684
+ if ($tagInfo and $exifTool->{NEW_VALUE}->{$tagInfo}) {
685
+ my $rtnVal = 1;
686
+ my $newVal = $exifTool->GetNewValues($exifTool->{NEW_VALUE}->{$tagInfo});
687
+ if (defined $newVal and length $newVal) {
688
+ $exifTool->VPrint(0, " Writing XMP as a block\n");
689
+ ++$exifTool->{CHANGED};
690
+ Write($$dirInfo{OutFile}, $newVal) or $rtnVal = -1;
691
+ }
692
+ delete $exifTool->{XMP_CAPTURE};
693
+ return $rtnVal;
694
+ }
695
+ }
696
+ #
697
+ # delete groups in family 1 if requested
698
+ #
699
+ if (%{$exifTool->{DEL_GROUP}} and (grep /^XMP-.+$/, keys %{$exifTool->{DEL_GROUP}} or
700
+ # (logic is a bit more complex for group names in exiftool XML files)
701
+ grep m{^http://ns.exiftool.ca/}, values %nsUsed))
702
+ {
703
+ my $del = $exifTool->{DEL_GROUP};
704
+ my $path;
705
+ foreach $path (keys %capture) {
706
+ my @propList = split('/',$path); # get property list
707
+ my ($tag, $ns) = GetXMPTagID(\@propList);
708
+ # translate namespace if necessary
709
+ $ns = $$xlatNamespace{$ns} if $$xlatNamespace{$ns};
710
+ my ($grp, @g);
711
+ # no "XMP-" added to most groups in exiftool RDF/XML output file
712
+ if ($nsUsed{$ns} and (@g = ($nsUsed{$ns} =~ m{^http://ns.exiftool.ca/(.*?)/(.*?)/}))) {
713
+ if ($g[1] =~ /^\d/) {
714
+ $grp = "XML-$g[0]";
715
+ #(all XML-* groups stored as uppercase DEL_GROUP key)
716
+ my $ucg = uc $grp;
717
+ next unless $$del{$ucg} or ($$del{'XML-*'} and not $$del{"-$ucg"});
718
+ } else {
719
+ $grp = $g[1];
720
+ next unless $$del{$grp} or ($$del{$g[0]} and not $$del{"-$grp"});
721
+ }
722
+ } else {
723
+ $grp = "XMP-$ns";
724
+ my $ucg = uc $grp;
725
+ next unless $$del{$ucg} or ($$del{'XMP-*'} and not $$del{"-$ucg"});
726
+ }
727
+ $exifTool->VerboseValue("- $grp:$tag", $capture{$path}->[0]);
728
+ delete $capture{$path};
729
+ ++$changed;
730
+ }
731
+ }
732
+ # delete HasExtendedXMP tag (we create it as needed)
733
+ my $hasExtTag = 'xmpNote:HasExtendedXMP';
734
+ if ($capture{$hasExtTag}) {
735
+ $exifTool->VerboseValue("- XMP-$hasExtTag", $capture{$hasExtTag}->[0]);
736
+ delete $capture{$hasExtTag};
737
+ }
738
+ # set $xmpOpen now to to handle xmptk tag first
739
+ my $xmpOpen = $exifTool->{XMP_NO_XMPMETA} ? '' : XMPOpen($exifTool);
740
+ #
741
+ # add, delete or change information as specified
742
+ #
743
+ # get hash of all information we want to change
744
+ # (sorted by tag name so alternate languages come last)
745
+ my @tagInfoList = sort ByTagName $exifTool->GetNewTagInfoList();
746
+ foreach $tagInfo (@tagInfoList) {
747
+ next unless $exifTool->GetGroup($tagInfo, 0) eq 'XMP';
748
+ next if $$tagInfo{Name} eq 'XMP'; # (ignore full XMP block if we didn't write it already)
749
+ my $tag = $$tagInfo{TagID};
750
+ my $path = GetPropertyPath($tagInfo);
751
+ unless ($path) {
752
+ $exifTool->Warn("Can't write XMP:$tag (namespace unknown)");
753
+ next;
754
+ }
755
+ # skip tags that were handled specially
756
+ if ($path eq 'rdf:about' or $path eq 'x:xmptk') {
757
+ ++$changed;
758
+ next;
759
+ }
760
+ my $isStruct = $$tagInfo{Struct};
761
+ # change our property path namespace prefixes to conform
762
+ # to the ones used in this file
763
+ $path = ConformPathToNamespace($exifTool, $path);
764
+ # find existing property
765
+ my $cap = $capture{$path};
766
+ # MicrosoftPhoto screws up the case of some tags, and some other software,
767
+ # including Adobe software, has been known to write the wrong list type or
768
+ # not properly enclose properties in a list, so we check for this
769
+ # (NOTE: we don't currently do these tests when writing structures!
770
+ # --> add this to DeleteStruct() below if it turns out to be a problem)
771
+ unless ($cap or $isStruct) {
772
+ my $regex = quotemeta $path;
773
+ # also allow for missing structure fields in lists of structures
774
+ $regex =~ s/ \d+/ \\d\+/g;
775
+ my $ok = $regex; # regular expression to match standard property names
776
+ my $ok2;
777
+ # also check for incorrect list types which can cause problems
778
+ if ($regex =~ s{\\/rdf\\:(Bag|Seq|Alt)\\/}{/rdf:(Bag|Seq|Alt)/}g) {
779
+ # also look for missing bottom-level list
780
+ $regex =~ s{/rdf:\(Bag\|Seq\|Alt\)\/rdf\\:li\\ \\d\+$}{(/.*)?};
781
+ } else {
782
+ $ok2 = $regex;
783
+ # check for properties in lists that shouldn't be
784
+ # (ref http://u88.n24.queensu.ca/exiftool/forum/index.php/topic,4325.0.html)
785
+ $regex .= '(/rdf:(Bag|Seq|Alt)/rdf:li \d+)?';
786
+ }
787
+ my @matches = sort grep m{^$regex$}i, keys %capture;
788
+ if (@matches) {
789
+ if ($matches[0] =~ /^$ok$/) {
790
+ $path = $matches[0]; # use existing property path
791
+ $cap = $capture{$path};
792
+ } else {
793
+ # property list was wrong, so issue a warning and fix it
794
+ my ($match, @fixed, %fixed, $err);
795
+ foreach $match (@matches) {
796
+ my $fixed = $path;
797
+ # set list indices
798
+ while ($match =~ / (\d+)/g) {
799
+ my $idx = $1;
800
+ # insert leading "X" so we don't replace this one again
801
+ $fixed =~ s/ \d+/ X$idx/;
802
+ }
803
+ $fixed =~ s/ X/ /g if $fixed ne $path; # remove "X"s
804
+ $err = 1 if $capture{$fixed} or $fixed{$fixed};
805
+ push @fixed, $fixed;
806
+ $fixed{$fixed} = 1;
807
+ }
808
+ my $tg = $exifTool->GetGroup($tagInfo, 1) . ':' . $$tagInfo{Name};
809
+ my $wrn = lc($path) eq lc($matches[0]) ? 'tag ID case' : 'list type';
810
+ if ($err) {
811
+ $exifTool->Warn("Incorrect $wrn for existing $tg (not changed)");
812
+ } else {
813
+ # fix the incorrect property paths for all values of this tag
814
+ foreach $match (@matches) {
815
+ my $fixed = shift @fixed;
816
+ $capture{$fixed} = $capture{$match};
817
+ delete $capture{$match};
818
+ # remove xml:lang attribute from incorrect lang-alt list if necessary
819
+ delete $capture{$fixed}[1]{'xml:lang'} if $ok2 and $match !~ /^$ok2$/;
820
+ }
821
+ $cap = $capture{$path} || $capture{$fixed[0]};
822
+ $exifTool->Warn("Fixed incorrect $wrn for $tg", 1);
823
+ }
824
+ }
825
+ }
826
+ }
827
+ my $nvHash = $exifTool->GetNewValueHash($tagInfo);
828
+ my $overwrite = $exifTool->IsOverwriting($nvHash);
829
+ my $writable = $$tagInfo{Writable} || '';
830
+ my (%attrs, $deleted, $added, $existed);
831
+ # delete existing entry if necessary
832
+ if ($isStruct) {
833
+ require 'Image/ExifTool/XMPStruct.pl';
834
+ ($deleted, $added, $existed) = DeleteStruct($exifTool, \%capture, \$path, $nvHash, \$changed);
835
+ next unless $deleted or $added or $exifTool->IsOverwriting($nvHash);
836
+ next if $existed and $$nvHash{CreateOnly};
837
+ } elsif ($cap) {
838
+ next if $$nvHash{CreateOnly}; # (necessary for List-type tags)
839
+ # take attributes from old values if they exist
840
+ %attrs = %{$$cap[1]};
841
+ if ($overwrite) {
842
+ my ($delPath, $oldLang, $delLang, $addLang, @matchingPaths);
843
+ # check to see if this is an indexed list item
844
+ if ($path =~ / /) {
845
+ my $pp;
846
+ ($pp = $path) =~ s/ \d+/ \\d\+/g;
847
+ @matchingPaths = sort grep(/^$pp$/, keys %capture);
848
+ } else {
849
+ push @matchingPaths, $path;
850
+ }
851
+ foreach $path (@matchingPaths) {
852
+ my ($val, $attrs) = @{$capture{$path}};
853
+ if ($writable eq 'lang-alt') {
854
+ unless (defined $addLang) {
855
+ # add to lang-alt list by default if creating this tag from scratch
856
+ $addLang = $$nvHash{IsCreating} ? 1 : 0;
857
+ }
858
+ # get original language code (lc for comparisons)
859
+ $oldLang = lc($$attrs{'xml:lang'} || 'x-default');
860
+ if ($overwrite < 0) {
861
+ my $newLang = lc($$tagInfo{LangCode} || 'x-default');
862
+ next unless $oldLang eq $newLang;
863
+ # only add new tag if we are overwriting this one
864
+ # (note: this won't match if original XML contains CDATA!)
865
+ $addLang = $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
866
+ next unless $addLang;
867
+ }
868
+ # delete all if deleting "x-default" and writing with no LangCode
869
+ # (XMP spec requires x-default language exist and be first in list)
870
+ if ($oldLang eq 'x-default' and not $$tagInfo{LangCode}) {
871
+ $delLang = 1; # delete all languages
872
+ $overwrite = 1; # force overwrite
873
+ } elsif ($$tagInfo{LangCode} and not $delLang) {
874
+ # only overwrite specified language
875
+ next unless lc($$tagInfo{LangCode}) eq $oldLang;
876
+ }
877
+ } elsif ($overwrite < 0) {
878
+ # only overwrite specific values
879
+ if ($$nvHash{Shift}) {
880
+ # values to be shifted are checked (hence re-formatted) late,
881
+ # so we must un-format the to-be-shifted value for IsOverwriting()
882
+ my $fmt = $$tagInfo{Writable} || '';
883
+ if ($fmt eq 'rational') {
884
+ ConvertRational($val);
885
+ } elsif ($fmt eq 'date') {
886
+ $val = ConvertXMPDate($val);
887
+ }
888
+ }
889
+ # (note: this won't match if original XML contains CDATA!)
890
+ next unless $exifTool->IsOverwriting($nvHash, UnescapeXML($val));
891
+ }
892
+ if ($verbose > 1) {
893
+ my $grp = $exifTool->GetGroup($tagInfo, 1);
894
+ my $tagName = $$tagInfo{Name};
895
+ $tagName =~ s/-$$tagInfo{LangCode}$// if $$tagInfo{LangCode};
896
+ $tagName .= '-' . $$attrs{'xml:lang'} if $$attrs{'xml:lang'};
897
+ $exifTool->VerboseValue("- $grp:$tagName", $val);
898
+ }
899
+ # save attributes and path from first deleted property
900
+ # so we can replace it exactly
901
+ unless ($delPath) {
902
+ %attrs = %$attrs;
903
+ $delPath = $path;
904
+ }
905
+ # delete this tag
906
+ delete $capture{$path};
907
+ ++$changed;
908
+ # delete rdf:type tag if it is the only thing left in this structure
909
+ if ($path =~ /^(.*)\// and $capture{"$1/rdf:type"}) {
910
+ my $pp = $1;
911
+ my @a = grep /^\Q$pp\E\/[^\/]+/, keys %capture;
912
+ delete $capture{"$pp/rdf:type"} if @a == 1;
913
+ }
914
+ }
915
+ next unless $delPath or $$tagInfo{List} or $addLang;
916
+ if ($delPath) {
917
+ $path = $delPath;
918
+ $deleted = 1;
919
+ } else {
920
+ # don't change tag if we couldn't delete old copy
921
+ # unless this is a list or an lang-alt tag
922
+ next unless $$tagInfo{List} or $oldLang;
923
+ # (match last index to put in same lang-alt list for Bag of lang-alt items)
924
+ $path =~ m/.* (\d+)/g or warn "Internal error: no list index!\n", next;
925
+ $added = $1;
926
+ }
927
+ } else {
928
+ # we are never overwriting, so we must be adding to a list
929
+ # match the last index unless this is a list of lang-alt lists
930
+ my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
931
+ if ($path =~ m/$pat/g) {
932
+ $added = $1;
933
+ # set position to end of matching index number
934
+ pos($path) = pos($path) - length($2) if $2;
935
+ }
936
+ }
937
+ if (defined $added) {
938
+ my $len = length $added;
939
+ my $pos = pos($path) - $len;
940
+ my $nxt = substr($added, 1) + 1;
941
+ # always insert x-default lang-alt entry first (as per XMP spec)
942
+ # (need to test $overwrite because this will be a new lang-alt entry otherwise)
943
+ if ($overwrite and $writable eq 'lang-alt' and (not $$tagInfo{LangCode} or
944
+ $$tagInfo{LangCode} eq 'x-default'))
945
+ {
946
+ my $saveCap = $capture{$path};
947
+ for (;;) {
948
+ my $p = $path;
949
+ substr($p, $pos, $len) = length($nxt) . $nxt;
950
+ # increment index in the path of the existing item
951
+ my $nextCap = $capture{$p};
952
+ $capture{$p} = $saveCap;
953
+ last unless $nextCap;
954
+ $saveCap = $nextCap;
955
+ ++$nxt;
956
+ }
957
+ } else {
958
+ # add to end of list
959
+ for (;;) {
960
+ my $try = length($nxt) . $nxt;
961
+ substr($path, $pos, $len) = $try;
962
+ last unless $capture{$path};
963
+ $len = length $try;
964
+ ++$nxt;
965
+ }
966
+ }
967
+ }
968
+ }
969
+ # check to see if we want to create this tag
970
+ # (create non-avoided tags in XMP data files by default)
971
+ my $isCreating = ($$nvHash{IsCreating} or (($isStruct or
972
+ ($preferred and not $$tagInfo{Avoid} and
973
+ not defined $$nvHash{Shift})) and not $$nvHash{EditOnly}));
974
+
975
+ # don't add new values unless...
976
+ # ...tag existed before and was deleted, or we added it to a list
977
+ next unless $deleted or defined $added or
978
+ # ...tag didn't exist before and we are creating it
979
+ (not $cap and $isCreating);
980
+
981
+ # get list of new values (all done if no new values specified)
982
+ my @newValues = $exifTool->GetNewValues($nvHash) or next;
983
+
984
+ # set language attribute for lang-alt lists
985
+ $attrs{'xml:lang'} = $$tagInfo{LangCode} || 'x-default' if $writable eq 'lang-alt';
986
+
987
+ # add new value(s) to %capture hash
988
+ my $subIdx;
989
+ for (;;) {
990
+ my $newValue = shift @newValues;
991
+ if ($isStruct) {
992
+ ++$changed if AddNewStruct($exifTool, $tagInfo, \%capture,
993
+ $path, $newValue, $$tagInfo{Struct});
994
+ } else {
995
+ $newValue = EscapeXML($newValue);
996
+ for (;;) { # (a cheap 'goto')
997
+ if ($$tagInfo{Resource}) {
998
+ # only store as a resource if it doesn't contain any illegal characters
999
+ if ($newValue !~ /[^a-z0-9\:\/\?\#\[\]\@\!\$\&\'\(\)\*\+\,\;\=\.\-\_\~]/i) {
1000
+ $capture{$path} = [ '', { %attrs, 'rdf:resource' => $newValue } ];
1001
+ last;
1002
+ }
1003
+ my $grp = $exifTool->GetGroup($tagInfo, 1);
1004
+ $exifTool->Warn("$grp:$$tagInfo{Name} written as a literal because value is not a valid URI", 1);
1005
+ # fall through to write as a string literal
1006
+ }
1007
+ delete $attrs{'rdf:resource'}; # (remove existing resource if necessary)
1008
+ $capture{$path} = [ $newValue, \%attrs ];
1009
+ last;
1010
+ }
1011
+ if ($verbose > 1) {
1012
+ my $grp = $exifTool->GetGroup($tagInfo, 1);
1013
+ $exifTool->VerboseValue("+ $grp:$$tagInfo{Name}", $newValue);
1014
+ }
1015
+ ++$changed;
1016
+ # add rdf:type if necessary
1017
+ if ($$tagInfo{StructType}) {
1018
+ AddStructType($exifTool, $$tagInfo{Table}, \%capture, $path);
1019
+ }
1020
+ }
1021
+ last unless @newValues;
1022
+ # match last index except for lang-alt items where we want to put each
1023
+ # item in a different lang-alt list (so match the 2nd-last for these)
1024
+ my $pat = $writable eq 'lang-alt' ? '.* (\d+)(.*? \d+)' : '.* (\d+)';
1025
+ $path =~ m/$pat/g or warn("Internal error: no list index for $tag!\n"), next;
1026
+ my $idx = $1;
1027
+ my $len = length $1;
1028
+ my $pos = pos($path) - $len - ($2 ? length $2 : 0);
1029
+ # generate unique list sub-indices to store additional values in sequence
1030
+ if ($subIdx) {
1031
+ $idx = substr($idx, 0, -length($subIdx)); # remove old sub-index
1032
+ $subIdx = substr($subIdx, 1) + 1;
1033
+ $subIdx = length($subIdx) . $subIdx;
1034
+ } else {
1035
+ $subIdx = '10';
1036
+ }
1037
+ substr($path, $pos, $len) = $idx . $subIdx;
1038
+ }
1039
+ # make sure any empty structures are deleted
1040
+ # (ExifTool shouldn't write these, but other software may)
1041
+ if (defined $$tagInfo{Flat}) {
1042
+ my $p = $path;
1043
+ while ($p =~ s/\/[^\/]+$//) {
1044
+ next unless $capture{$p};
1045
+ # it is an error if this property has a value
1046
+ $exifTool->Error("Improperly structured XMP ($p)",1) if $capture{$p}[0] =~ /\S/;
1047
+ delete $capture{$p}; # delete the (hopefully) empty structure
1048
+ }
1049
+ }
1050
+ }
1051
+ # remove the ExifTool members we created
1052
+ delete $exifTool->{XMP_CAPTURE};
1053
+ delete $exifTool->{XMP_NS};
1054
+
1055
+ my $maxDataLen = $$dirInfo{MaxDataLen};
1056
+ # get DataPt again because it may have been set by ProcessXMP
1057
+ $dataPt = $$dirInfo{DataPt};
1058
+ # return now if we didn't change anything
1059
+ unless ($changed or ($maxDataLen and $dataPt and defined $$dataPt and
1060
+ length($$dataPt) > $maxDataLen))
1061
+ {
1062
+ return undef unless $xmpFile; # just rewrite original XMP
1063
+ Write($$dirInfo{OutFile}, $$dataPt) or return -1 if $dataPt and defined $$dataPt;
1064
+ return 1;
1065
+ }
1066
+ #
1067
+ # write out the new XMP information (serialize it)
1068
+ #
1069
+ # start writing the XMP data
1070
+ my $newData = '';
1071
+ if ($$exifTool{XMP_NO_XPACKET}) {
1072
+ # write BOM if flag is set
1073
+ $newData .= "\xef\xbb\xbf" if $$exifTool{XMP_NO_XPACKET} == 2;
1074
+ } else {
1075
+ $newData .= $pktOpen;
1076
+ }
1077
+ $newData .= $xmlOpen if $$exifTool{XMP_IS_XML};
1078
+ $newData .= $xmpOpen . $rdfOpen;
1079
+
1080
+ # initialize current property path list
1081
+ my (@curPropList, @writeLast, @descStart, $extStart);
1082
+ my (%nsCur, $prop, $n, $path);
1083
+ my @pathList = sort TypeFirst keys %capture;
1084
+ # order properties to write large values last if we have a MaxDataLen limit
1085
+ if ($maxDataLen and @pathList) {
1086
+ my @pathTmp;
1087
+ my ($lastProp, $lastNS, $propSize) = ('', '', 0);
1088
+ my @pathLoop = (@pathList, ''); # add empty path to end of list for loop
1089
+ undef @pathList;
1090
+ foreach $path (@pathLoop) {
1091
+ $path =~ /^((\w*)[^\/]*)/; # get path element ($1) and ns ($2)
1092
+ if ($1 eq $lastProp) {
1093
+ push @pathTmp, $path; # accumulate all paths with same root
1094
+ } else {
1095
+ # put in list to write last if recommended or values are too large
1096
+ if ($extendedRes{$lastProp} or $extendedRes{$lastNS} or
1097
+ $propSize > $newDescThresh)
1098
+ {
1099
+ push @writeLast, @pathTmp;
1100
+ } else {
1101
+ push @pathList, @pathTmp;
1102
+ }
1103
+ last unless $path; # all done if we hit empty path
1104
+ @pathTmp = ( $path );
1105
+ ($lastProp, $lastNS, $propSize) = ($1, $2, 0);
1106
+ }
1107
+ $propSize += length $capture{$path}->[0];
1108
+ }
1109
+ }
1110
+
1111
+ # write out all properties
1112
+ for (;;) {
1113
+ my (%nsNew, $newDesc);
1114
+ unless (@pathList) {
1115
+ last unless @writeLast;
1116
+ @pathList = @writeLast;
1117
+ undef @writeLast;
1118
+ $extStart = length $newData;
1119
+ $newDesc = 1; # start with a new description
1120
+ }
1121
+ $path = shift @pathList;
1122
+ my @propList = split('/',$path); # get property list
1123
+ # must open/close rdf:Description too
1124
+ unshift @propList, $rdfDesc;
1125
+ # make sure we have defined all necessary namespaces
1126
+ foreach $prop (@propList) {
1127
+ $prop =~ /(.*):/ or next;
1128
+ $1 eq 'rdf' and next; # rdf namespace already defined
1129
+ my $uri = $nsUsed{$1};
1130
+ unless ($uri) {
1131
+ $uri = $nsURI{$1}; # we must have added a namespace
1132
+ $uri or $xmpErr = "Undefined XMP namespace: $1", next;
1133
+ }
1134
+ $nsNew{$1} = $uri;
1135
+ # need a new description if any new namespaces
1136
+ $newDesc = 1 unless $nsCur{$1};
1137
+ }
1138
+ my $closeTo = 0;
1139
+ if ($newDesc) {
1140
+ # look forward to see if we will want to also open other namespaces
1141
+ # at this level (this is necessary to keep lists and structures from
1142
+ # being broken if a property introduces a new namespace; plus it
1143
+ # improves formatting)
1144
+ my ($path2, $ns2);
1145
+ foreach $path2 (@pathList) {
1146
+ my @ns2s = ($path2 =~ m{(?:^|/)([^/]+?):}g);
1147
+ my $opening = 0;
1148
+ foreach $ns2 (@ns2s) {
1149
+ next if $ns2 eq 'rdf';
1150
+ $nsNew{$ns2} and ++$opening, next;
1151
+ last unless $opening;
1152
+ # get URI for this existing or new namespace
1153
+ my $uri = $nsUsed{$ns2} || $nsURI{$ns2} or last;
1154
+ $nsNew{$ns2} = $uri; # also open this namespace
1155
+ }
1156
+ last unless $opening;
1157
+ }
1158
+ } else {
1159
+ # find first property where the current path differs from the new path
1160
+ for ($closeTo=0; $closeTo<@curPropList; ++$closeTo) {
1161
+ last unless $closeTo < @propList;
1162
+ last unless $propList[$closeTo] eq $curPropList[$closeTo];
1163
+ }
1164
+ }
1165
+ # close out properties down to the common base path
1166
+ while (@curPropList > $closeTo) {
1167
+ ($prop = pop @curPropList) =~ s/ .*//;
1168
+ $newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
1169
+ }
1170
+ if ($newDesc) {
1171
+ # save rdf:Description start positions so we can reorder them if necessary
1172
+ push @descStart, length($newData) if $maxDataLen;
1173
+ # open the new description
1174
+ $prop = $rdfDesc;
1175
+ %nsCur = %nsNew; # save current namespaces
1176
+ $newData .= "\n <$prop rdf:about='$about'";
1177
+ my @ns = sort keys %nsCur;
1178
+ # generate et:toolkit attribute if this is an exiftool RDF/XML output file
1179
+ if (@ns and $nsCur{$ns[0]} =~ m{^http://ns.exiftool.ca/}) {
1180
+ $newData .= "\n xmlns:et='http://ns.exiftool.ca/1.0/'" .
1181
+ " et:toolkit='Image::ExifTool $Image::ExifTool::VERSION'";
1182
+ }
1183
+ foreach (@ns) {
1184
+ $newData .= "\n xmlns:$_='$nsCur{$_}'";
1185
+ }
1186
+ $newData .= ">\n";
1187
+ push @curPropList, $prop;
1188
+ }
1189
+ # loop over all values for this new property
1190
+ my ($val, $attrs) = @{$capture{$path}};
1191
+ $debug and print "$path = $val\n";
1192
+ # open new properties
1193
+ my $attr;
1194
+ for ($n=@curPropList; $n<$#propList; ++$n) {
1195
+ $prop = $propList[$n];
1196
+ push @curPropList, $prop;
1197
+ # remove list index if it exists
1198
+ $prop =~ s/ .*//;
1199
+ $attr = '';
1200
+ if ($prop ne $rdfDesc and ($propList[$n+1] !~ /^rdf:/ or
1201
+ ($propList[$n+1] eq 'rdf:type' and $n+1 == $#propList)))
1202
+ {
1203
+ # need parseType='Resource' to avoid new 'rdf:Description'
1204
+ $attr = " rdf:parseType='Resource'";
1205
+ }
1206
+ $newData .= (' ' x scalar(@curPropList)) . "<$prop$attr>\n";
1207
+ }
1208
+ my $prop2 = pop @propList; # get new property name
1209
+ $prop2 =~ s/ .*//; # remove list index if it exists
1210
+ $newData .= (' ' x scalar(@curPropList)) . " <$prop2";
1211
+ # write out attributes
1212
+ foreach $attr (sort keys %$attrs) {
1213
+ my $attrVal = $$attrs{$attr};
1214
+ my $quot = ($attrVal =~ /'/) ? '"' : "'";
1215
+ $newData .= " $attr=$quot$attrVal$quot";
1216
+ }
1217
+ $newData .= length $val ? ">$val</$prop2>\n" : "/>\n";
1218
+ }
1219
+ # close off any open elements
1220
+ while ($prop = pop @curPropList) {
1221
+ $prop =~ s/ .*//; # remove list index if it exists
1222
+ $newData .= (' ' x scalar(@curPropList)) . " </$prop>\n";
1223
+ }
1224
+ # limit XMP length and re-arrange if necessary to fit inside specified size
1225
+ my $compact = $$dirInfo{Compact} || $exifTool->Options('Compact');
1226
+ if ($maxDataLen) {
1227
+ # adjust maxDataLen to allow room for closing elements
1228
+ $maxDataLen -= length($rdfClose) + length($xmpClose) + length($pktCloseW);
1229
+ $extStart or $extStart = length $newData;
1230
+ my @rtn = LimitXMPSize($exifTool, \$newData, $maxDataLen, $about, \@descStart, $extStart);
1231
+ # return extended XMP information in $dirInfo
1232
+ $$dirInfo{ExtendedXMP} = $rtn[0];
1233
+ $$dirInfo{ExtendedGUID} = $rtn[1];
1234
+ # compact if necessary to fit
1235
+ $compact = 1 if length($newData) + 101 * $numPadLines > $maxDataLen;
1236
+ }
1237
+ #
1238
+ # close out the XMP, clean up, and return our data
1239
+ #
1240
+ $newData .= $rdfClose;
1241
+ $newData .= $xmpClose unless $exifTool->{XMP_NO_XMPMETA};
1242
+
1243
+ # remove the ExifTool members we created
1244
+ delete $exifTool->{XMP_CAPTURE};
1245
+ delete $exifTool->{XMP_NS};
1246
+ delete $exifTool->{XMP_NO_XMPMETA};
1247
+
1248
+ # (the XMP standard recommends writing 2k-4k of white space before the
1249
+ # packet trailer, with a newline every 100 characters)
1250
+ unless ($$exifTool{XMP_NO_XPACKET}) {
1251
+ my $pad = (' ' x 100) . "\n";
1252
+ if ($$dirInfo{InPlace}) {
1253
+ # pad to specified DirLen
1254
+ my $len = length($newData) + length($pktCloseW);
1255
+ if ($len > $dirLen) {
1256
+ $exifTool->Warn('Not enough room to edit XMP in place');
1257
+ return undef;
1258
+ }
1259
+ my $num = int(($dirLen - $len) / length($pad));
1260
+ if ($num) {
1261
+ $newData .= $pad x $num;
1262
+ $len += length($pad) * $num;
1263
+ }
1264
+ $len < $dirLen and $newData .= (' ' x ($dirLen - $len - 1)) . "\n";
1265
+ } elsif (not $compact and not $xmpFile and not $$dirInfo{ReadOnly}) {
1266
+ $newData .= $pad x $numPadLines;
1267
+ }
1268
+ $newData .= ($$dirInfo{ReadOnly} ? $pktCloseR : $pktCloseW);
1269
+ }
1270
+ # return empty data if no properties exist and this is allowed
1271
+ unless (%capture or $xmpFile or $$dirInfo{InPlace} or $$dirInfo{NoDelete}) {
1272
+ $newData = '';
1273
+ }
1274
+ if ($xmpErr) {
1275
+ if ($xmpFile) {
1276
+ $exifTool->Error($xmpErr);
1277
+ return -1;
1278
+ }
1279
+ $exifTool->Warn($xmpErr);
1280
+ return undef;
1281
+ }
1282
+ $exifTool->{CHANGED} += $changed;
1283
+ $debug > 1 and $newData and print $newData,"\n";
1284
+ return $newData unless $xmpFile;
1285
+ Write($$dirInfo{OutFile}, $newData) or return -1;
1286
+ return 1;
1287
+ }
1288
+
1289
+
1290
+ 1; # end
1291
+
1292
+ __END__
1293
+
1294
+ =head1 NAME
1295
+
1296
+ Image::ExifTool::WriteXMP.pl - Write XMP meta information
1297
+
1298
+ =head1 SYNOPSIS
1299
+
1300
+ These routines are autoloaded by Image::ExifTool::XMP.
1301
+
1302
+ =head1 DESCRIPTION
1303
+
1304
+ This file contains routines to write XMP metadata.
1305
+
1306
+ =head1 AUTHOR
1307
+
1308
+ Copyright 2003-2013, Phil Harvey (phil at owl.phy.queensu.ca)
1309
+
1310
+ This library is free software; you can redistribute it and/or modify it
1311
+ under the same terms as Perl itself.
1312
+
1313
+ =head1 SEE ALSO
1314
+
1315
+ L<Image::ExifTool::XMP(3pm)|Image::ExifTool::XMP>,
1316
+ L<Image::ExifTool(3pm)|Image::ExifTool>
1317
+
1318
+ =cut