Coverage Report

Created: 2026-08-11 07:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/exiv2/src/properties.cpp
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
3
// included header files
4
#include "properties.hpp"
5
#include "config.h"
6
#include "error.hpp"
7
#include "i18n.h"  // NLS support.
8
#include "image_int.hpp"
9
#include "tags.hpp"
10
#include "tags_int.hpp"
11
#include "types.hpp"
12
#include "value.hpp"
13
#include "xmp_exiv2.hpp"
14
15
#include <iostream>
16
17
namespace {
18
//! Struct used in the lookup table for pretty print functions
19
struct XmpPrintInfo {
20
  //! Comparison operator for key
21
0
  bool operator==(const std::string& key) const {
22
0
    return key == key_;
23
0
  }
24
25
  std::string_view key_;      //!< XMP key
26
  Exiv2::PrintFct printFct_;  //!< Print function
27
};
28
29
}  // namespace
30
31
// *****************************************************************************
32
// class member definitions
33
namespace Exiv2 {
34
using namespace Internal;
35
36
//! @cond IGNORE
37
extern const XmpPropertyInfo xmpDcInfo[];
38
extern const XmpPropertyInfo xmpDigikamInfo[];
39
extern const XmpPropertyInfo xmpKipiInfo[];
40
extern const XmpPropertyInfo xmpXmpInfo[];
41
extern const XmpPropertyInfo xmpXmpRightsInfo[];
42
extern const XmpPropertyInfo xmpXmpMMInfo[];
43
extern const XmpPropertyInfo xmpXmpBJInfo[];
44
extern const XmpPropertyInfo xmpXmpTPgInfo[];
45
extern const XmpPropertyInfo xmpXmpDMInfo[];
46
extern const XmpPropertyInfo xmpMicrosoftInfo[];
47
extern const XmpPropertyInfo xmpPdfInfo[];
48
extern const XmpPropertyInfo xmpPhotoshopInfo[];
49
extern const XmpPropertyInfo xmpCrsInfo[];
50
extern const XmpPropertyInfo xmpCrssInfo[];
51
extern const XmpPropertyInfo xmpTiffInfo[];
52
extern const XmpPropertyInfo xmpExifInfo[];
53
extern const XmpPropertyInfo xmpExifEXInfo[];
54
extern const XmpPropertyInfo xmpAuxInfo[];
55
extern const XmpPropertyInfo xmpIptcInfo[];
56
extern const XmpPropertyInfo xmpIptcExtInfo[];
57
extern const XmpPropertyInfo xmpPlusInfo[];
58
extern const XmpPropertyInfo xmpMediaProInfo[];
59
extern const XmpPropertyInfo xmpExpressionMediaInfo[];
60
extern const XmpPropertyInfo xmpMicrosoftPhotoInfo[];
61
extern const XmpPropertyInfo xmpMicrosoftPhotoRegionInfoInfo[];
62
extern const XmpPropertyInfo xmpMicrosoftPhotoRegionInfo[];
63
extern const XmpPropertyInfo xmpMWGRegionsInfo[];
64
extern const XmpPropertyInfo xmpMWGKeywordInfo[];
65
extern const XmpPropertyInfo xmpVideoInfo[];
66
extern const XmpPropertyInfo xmpAudioInfo[];
67
extern const XmpPropertyInfo xmpDwCInfo[];
68
extern const XmpPropertyInfo xmpDctermsInfo[];
69
extern const XmpPropertyInfo xmpLrInfo[];
70
extern const XmpPropertyInfo xmpAcdseeInfo[];
71
extern const XmpPropertyInfo xmpGPanoInfo[];
72
73
constexpr XmpNsInfo xmpNsInfo[] = {
74
    // Schemas   -   NOTE: Schemas which the XMP-SDK doesn't know must be registered in XmpToolkitLifetimeManager -
75
    // Todo: Automate this
76
    {"http://purl.org/dc/elements/1.1/", "dc", xmpDcInfo, N_("Dublin Core schema")},
77
    {"http://www.digikam.org/ns/1.0/", "digiKam", xmpDigikamInfo, N_("digiKam Photo Management schema")},
78
    {"http://www.digikam.org/ns/kipi/1.0/", "kipi", xmpKipiInfo, N_("KDE Image Program Interface schema")},
79
    {"http://ns.adobe.com/xap/1.0/", "xmp", xmpXmpInfo, N_("XMP Basic schema")},
80
    {"http://ns.adobe.com/xap/1.0/rights/", "xmpRights", xmpXmpRightsInfo, N_("XMP Rights Management schema")},
81
    {"http://ns.adobe.com/xap/1.0/mm/", "xmpMM", xmpXmpMMInfo, N_("XMP Media Management schema")},
82
    {"http://ns.adobe.com/xap/1.0/bj/", "xmpBJ", xmpXmpBJInfo, N_("XMP Basic Job Ticket schema")},
83
    {"http://ns.adobe.com/xap/1.0/t/pg/", "xmpTPg", xmpXmpTPgInfo, N_("XMP Paged-Text schema")},
84
    {"http://ns.adobe.com/xmp/1.0/DynamicMedia/", "xmpDM", xmpXmpDMInfo, N_("XMP Dynamic Media schema")},
85
    {"http://ns.microsoft.com/photo/1.0/", "MicrosoftPhoto", xmpMicrosoftInfo, N_("Microsoft Photo schema")},
86
    {"http://ns.adobe.com/lightroom/1.0/", "lr", xmpLrInfo, N_("Adobe Lightroom schema")},
87
    {"http://ns.adobe.com/pdf/1.3/", "pdf", xmpPdfInfo, N_("Adobe PDF schema")},
88
    {"http://ns.adobe.com/photoshop/1.0/", "photoshop", xmpPhotoshopInfo, N_("Adobe photoshop schema")},
89
    {"http://ns.adobe.com/camera-raw-settings/1.0/", "crs", xmpCrsInfo, N_("Camera Raw schema")},
90
    {"http://ns.adobe.com/camera-raw-saved-settings/1.0/", "crss", xmpCrssInfo, N_("Camera Raw Saved Settings")},
91
    {"http://ns.adobe.com/tiff/1.0/", "tiff", xmpTiffInfo, N_("Exif Schema for TIFF Properties")},
92
    {"http://ns.adobe.com/exif/1.0/", "exif", xmpExifInfo, N_("Exif schema for Exif-specific Properties")},
93
    {"http://cipa.jp/exif/1.0/", "exifEX", xmpExifEXInfo, N_("Exif 2.3 metadata for XMP")},
94
    {"http://ns.adobe.com/exif/1.0/aux/", "aux", xmpAuxInfo, N_("Exif schema for Additional Exif Properties")},
95
    {"http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "iptc", xmpIptcInfo,
96
     N_("IPTC Core schema")},  // NOTE: 'Iptc4xmpCore' is just too long, so make 'iptc'
97
    {"http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "Iptc4xmpCore", xmpIptcInfo,
98
     N_("IPTC Core schema")},  // the default prefix. But provide the official one too.
99
    {"http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", xmpIptcExtInfo,
100
     N_("IPTC Extension schema")},  // NOTE: It really should be 'Iptc4xmpExt' but following
101
    {"http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "Iptc4xmpExt", xmpIptcExtInfo,
102
     N_("IPTC Extension schema")},  // example above, 'iptcExt' is the default, Iptc4xmpExt works too.
103
    {"http://ns.useplus.org/ldf/xmp/1.0/", "plus", xmpPlusInfo, N_("PLUS License Data Format schema")},
104
    {"http://ns.iview-multimedia.com/mediapro/1.0/", "mediapro", xmpMediaProInfo, N_("iView Media Pro schema")},
105
    {"http://ns.microsoft.com/expressionmedia/1.0/", "expressionmedia", xmpExpressionMediaInfo,
106
     N_("Expression Media schema")},
107
    {"http://ns.microsoft.com/photo/1.2/", "MP", xmpMicrosoftPhotoInfo, N_("Microsoft Photo 1.2 schema")},
108
    {"http://ns.microsoft.com/photo/1.2/t/RegionInfo#", "MPRI", xmpMicrosoftPhotoRegionInfoInfo,
109
     N_("Microsoft Photo RegionInfo schema")},
110
    {"http://ns.microsoft.com/photo/1.2/t/Region#", "MPReg", xmpMicrosoftPhotoRegionInfo,
111
     N_("Microsoft Photo Region schema")},
112
    {"http://www.metadataworkinggroup.com/schemas/regions/", "mwg-rs", xmpMWGRegionsInfo,
113
     N_("Metadata Working Group Regions schema")},
114
    {"http://www.metadataworkinggroup.com/schemas/keywords/", "mwg-kw", xmpMWGKeywordInfo,
115
     N_("Metadata Working Group Keywords schema")},
116
    {"http://www.video/", "video", xmpVideoInfo, N_("XMP Extended Video schema")},
117
    {"http://www.audio/", "audio", xmpAudioInfo, N_("XMP Extended Audio schema")},
118
    {"http://rs.tdwg.org/dwc/index.htm", "dwc", xmpDwCInfo, N_("XMP Darwin Core schema")},
119
    {"http://purl.org/dc/terms/", "dcterms", xmpDctermsInfo,
120
     N_("Qualified Dublin Core schema")},  // Note: used as properties under dwc:record
121
    {"http://ns.acdsee.com/iptc/1.0/", "acdsee", xmpAcdseeInfo, N_("ACDSee XMP schema")},
122
    {"http://ns.google.com/photos/1.0/panorama/", "GPano", xmpGPanoInfo, N_("Google Photo Sphere XMP schema")},
123
124
    // Structures
125
    {"http://ns.adobe.com/xap/1.0/g/", "xmpG", nullptr, N_("Colorant structure")},
126
    {"http://ns.adobe.com/xap/1.0/g/img/", "xmpGImg", nullptr, N_("Thumbnail structure")},
127
    {"http://ns.adobe.com/xap/1.0/sType/Dimensions#", "stDim", nullptr, N_("Dimensions structure")},
128
    {"http://ns.adobe.com/xap/1.0/sType/Font#", "stFnt", nullptr, N_("Font structure")},
129
    {"http://ns.adobe.com/xap/1.0/sType/ResourceEvent#", "stEvt", nullptr, N_("Resource Event structure")},
130
    {"http://ns.adobe.com/xap/1.0/sType/ResourceRef#", "stRef", nullptr, N_("ResourceRef structure")},
131
    {"http://ns.adobe.com/xap/1.0/sType/Version#", "stVer", nullptr, N_("Version structure")},
132
    {"http://ns.adobe.com/xap/1.0/sType/Job#", "stJob", nullptr, N_("Basic Job/Workflow structure")},
133
    {"http://ns.adobe.com/xmp/sType/Area#", "stArea", nullptr, N_("Area structure")},
134
135
    // Qualifiers
136
    {"http://ns.adobe.com/xmp/Identifier/qual/1.0/", "xmpidq", nullptr, N_("Qualifier for xmp:Identifier")},
137
};
138
139
const XmpPropertyInfo xmpDcInfo[] = {
140
    {"contributor", N_("Contributor"), "bag ProperName", xmpBag, xmpExternal,
141
     N_("Contributors to the resource (other than the authors).")},
142
    {"coverage", N_("Coverage"), "Text", xmpText, xmpExternal,
143
     N_("The spatial or temporal topic of the resource, the spatial applicability of the "
144
        "resource, or the jurisdiction under which the resource is relevant.")},
145
    {"creator", N_("Creator"), "seq ProperName", xmpSeq, xmpExternal,
146
     N_("The authors of the resource (listed in order of precedence, if significant).")},
147
    {"date", N_("Date"), "seq Date", xmpSeq, xmpExternal,
148
     N_("Date(s) that something interesting happened to the resource.")},
149
    {"description", N_("Description"), "Lang Alt", langAlt, xmpExternal,
150
     N_("A textual description of the content of the resource. Multiple values may be "
151
        "present for different languages.")},
152
    {"format", N_("Format"), "MIMEType", xmpText, xmpInternal,
153
     N_("The file format used when saving the resource. Tools and applications should set "
154
        "this property to the save format of the data. It may include appropriate qualifiers.")},
155
    {"identifier", N_("Identifier"), "Text", xmpText, xmpExternal,
156
     N_("Unique identifier of the resource. Recommended best practice is to identify the "
157
        "resource by means of a string conforming to a formal identification system.")},
158
    {"language", N_("Language"), "bag Locale", xmpBag, xmpInternal,
159
     N_("An unordered array specifying the languages used in the resource.")},
160
    {"publisher", N_("Publisher"), "bag ProperName", xmpBag, xmpExternal,
161
     N_("An entity responsible for making the resource available. Examples of a Publisher "
162
        "include a person, an organization, or a service. Typically, the name of a Publisher "
163
        "should be used to indicate the entity.")},
164
    {"relation", N_("Relation"), "bag Text", xmpBag, xmpInternal,
165
     N_("Relationships to other documents. Recommended best practice is to identify the "
166
        "related resource by means of a string conforming to a formal identification system.")},
167
    {"rights", N_("Rights"), "Lang Alt", langAlt, xmpExternal,
168
     N_("Informal rights statement, selected by language. Typically, rights information "
169
        "includes a statement about various property rights associated with the resource, "
170
        "including intellectual property rights.")},
171
    {"source", N_("Source"), "Text", xmpText, xmpExternal,
172
     N_("Unique identifier of the work from which this resource was derived.")},
173
    {"subject", N_("Subject"), "bag Text", xmpBag, xmpExternal,
174
     N_("An unordered array of descriptive phrases or keywords that specify the topic of the "
175
        "content of the resource.")},
176
    {"title", N_("Title"), "Lang Alt", langAlt, xmpExternal,
177
     N_("The title of the document, or the name given to the resource. Typically, it will be "
178
        "a name by which the resource is formally known.")},
179
    {"type", N_("Type"), "bag open Choice", xmpBag, xmpExternal,
180
     N_("A document type; for example, novel, poem, or working paper.")},
181
    // End of list marker
182
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
183
};
184
185
const XmpPropertyInfo xmpDigikamInfo[] = {
186
    {"TagsList", N_("Tags List"), "seq Text", xmpSeq, xmpExternal,
187
     N_("The list of complete tags path as string. The path hierarchy is separated by '/' character (ex.: "
188
        "\"City/Paris/Monument/Eiffel Tower\".")},
189
    {"CaptionsAuthorNames", N_("Captions Author Names"), "Lang Alt", langAlt, xmpExternal,
190
     N_("The list of all captions author names for each language alternative captions set in standard XMP tags.")},
191
    {"CaptionsDateTimeStamps", N_("Captions Date Time Stamps"), "Lang Alt", langAlt, xmpExternal,
192
     N_("The list of all captions date time stamps for each language alternative captions set in standard XMP "
193
        "tags.")},
194
    {"ImageHistory", N_("Image History"), "Text", xmpText, xmpExternal,
195
     N_("An XML based content to list all action processed on this image with image editor (as crop, rotate, color "
196
        "corrections, adjustments, etc.).")},
197
    {"LensCorrectionSettings", N_("Lens Correction Settings"), "Text", xmpText, xmpExternal,
198
     N_("The list of Lens Correction tools settings used to fix lens distortion. This include Batch Queue Manager "
199
        "and Image editor tools based on LensFun library.")},
200
    {"ColorLabel", N_("Color Label"), "Text", xmpText, xmpExternal,
201
     N_("The color label assigned to this item. Possible values are \"0\": no label; \"1\": Red; \"2\": Orange; "
202
        "\"3\": Yellow; \"4\": Green; \"5\": Blue; \"6\": Magenta; \"7\": Gray; \"8\": Black; \"9\": White.")},
203
    {"PickLabel", N_("Pick Label"), "Text", xmpText, xmpExternal,
204
     N_("The pick label assigned to this item. Possible values are \"0\": no label; \"1\": item rejected; \"2\": "
205
        "item in pending validation; \"3\": item accepted.")},
206
    {"Preview", N_("JPEG preview"), "Text", xmpText, xmpExternal,
207
     N_("Reduced size JPEG preview image encoded as base64 for a fast screen rendering.")},
208
    // End of list marker
209
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
210
};
211
212
const XmpPropertyInfo xmpKipiInfo[] = {
213
    {"PanoramaInputFiles", N_("Panorama Input Files"), "Text", xmpText, xmpExternal,
214
     N_("The list of files processed with Hugin program through Panorama tool.")},
215
    {"EnfuseInputFiles", N_("Enfuse Input Files"), "Text", xmpText, xmpExternal,
216
     N_("The list of files processed with Enfuse program through ExpoBlending tool.")},
217
    {"EnfuseSettings", N_("Enfuse Settings"), "Text", xmpText, xmpExternal,
218
     N_("The list of Enfuse settings used to blend image stack with ExpoBlending tool.")},
219
    {"picasawebGPhotoId", N_("PicasaWeb Item ID"), "Text", xmpText, xmpExternal,
220
     N_("Item ID from PicasaWeb web service.")},
221
    {"yandexGPhotoId", N_("Yandex Fotki Item ID"), "Text", xmpText, xmpExternal,
222
     N_("Item ID from Yandex Fotki web service.")},
223
    // End of list marker
224
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
225
};
226
227
const XmpPropertyInfo xmpXmpInfo[] = {
228
    {"Advisory", N_("Advisory"), "bag XPath", xmpBag, xmpExternal,
229
     N_("An unordered array specifying properties that were edited outside the authoring "
230
        "application. Each item should contain a single namespace and XPath separated by "
231
        "one ASCII space (U+0020).")},
232
    {"BaseURL", N_("Base URL"), "URL", xmpText, xmpInternal,
233
     N_("The base URL for relative URLs in the document content. If this document contains "
234
        "Internet links, and those links are relative, they are relative to this base URL. "
235
        "This property provides a standard way for embedded relative URLs to be interpreted "
236
        "by tools. Web authoring tools should set the value based on their notion of where "
237
        "URLs will be interpreted.")},
238
    {"CreateDate", N_("Create Date"), "Date", xmpText, xmpExternal,
239
     N_("The date and time the resource was originally created.")},
240
    {"CreatorTool", N_("Creator Tool"), "AgentName", xmpText, xmpInternal,
241
     N_("The name of the first known tool used to create the resource. If history is "
242
        "present in the metadata, this value should be equivalent to that of "
243
        "xmpMM:History's softwareAgent property.")},
244
    {"Identifier", N_("Identifier"), "bag Text", xmpBag, xmpExternal,
245
     N_("An unordered array of text strings that unambiguously identify the resource within "
246
        "a given context. An array item may be qualified with xmpidq:Scheme to denote the "
247
        "formal identification system to which that identifier conforms. Note: The "
248
        "dc:identifier property is not used because it lacks a defined scheme qualifier and "
249
        "has been defined in the XMP Specification as a simple (single-valued) property.")},
250
    {"Label", N_("Label"), "Text", xmpText, xmpExternal,
251
     N_("A word or short phrase that identifies a document as a member of a user-defined "
252
        "collection. Used to organize documents in a file browser.")},
253
    {"MetadataDate", N_("Metadata Date"), "Date", xmpText, xmpInternal,
254
     N_("The date and time that any metadata for this resource was last changed. It should "
255
        "be the same as or more recent than xmp:ModifyDate.")},
256
    {"ModifyDate", N_("Modify Date"), "Date", xmpText, xmpInternal,
257
     N_("The date and time the resource was last modified. Note: The value of this property "
258
        "is not necessarily the same as the file's system modification date because it is "
259
        "set before the file is saved.")},
260
    {"Nickname", N_("Nickname"), "Text", xmpText, xmpExternal, N_("A short informal name for the resource.")},
261
    {"Rating", N_("Rating"), "Closed Choice of Real", xmpText, xmpExternal,
262
     N_("A number that indicates a document's status relative to other documents, "
263
        "used to organize documents in a file browser. Values are user-defined within an "
264
        "application-defined range.")},
265
    {"Thumbnails", N_("Thumbnails"), "alt Thumbnail", xmpText, xmpInternal,
266
     N_("An alternative array of thumbnail images for a file, which can differ in "
267
        "characteristics such as size or image encoding.")},
268
    // End of list marker
269
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
270
};
271
272
const XmpPropertyInfo xmpXmpRightsInfo[] = {
273
    {"Certificate", N_("Certificate"), "URL", xmpText, xmpExternal, N_("Online rights management certificate.")},
274
    {"Marked", N_("Marked"), "Boolean", xmpText, xmpExternal, N_("Indicates that this is a rights-managed resource.")},
275
    {"Owner", N_("Owner"), "bag ProperName", xmpBag, xmpExternal,
276
     N_("An unordered array specifying the legal owner(s) of a resource.")},
277
    {"UsageTerms", N_("Usage Terms"), "Lang Alt", langAlt, xmpExternal,
278
     N_("Text instructions on how a resource can be legally used.")},
279
    {"WebStatement", N_("Web Statement"), "URL", xmpText, xmpExternal,
280
     N_("The location of a web page describing the owner and/or rights statement for this resource.")},
281
    // End of list marker
282
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
283
};
284
285
const XmpPropertyInfo xmpXmpMMInfo[] = {
286
    {"DerivedFrom", N_("Derived From"), "ResourceRef", xmpText, xmpInternal,
287
     N_("A reference to the original document from which this one is derived. It is a "
288
        "minimal reference; missing components can be assumed to be unchanged. For example, "
289
        "a new version might only need to specify the instance ID and version number of the "
290
        "previous version, or a rendition might only need to specify the instance ID and "
291
        "rendition class of the original.")},
292
    {"DocumentID", N_("Document ID"), "URI", xmpText, xmpInternal,
293
     N_("The common identifier for all versions and renditions of a document. It should be "
294
        "based on a UUID; see Document and Instance IDs below.")},
295
    {"History", N_("History"), "seq ResourceEvent", xmpSeq, xmpInternal,
296
     N_("An ordered array of high-level user actions that resulted in this resource. It is "
297
        "intended to give human readers a general indication of the steps taken to make the "
298
        "changes from the previous version to this one. The list should be at an abstract "
299
        "level; it is not intended to be an exhaustive keystroke or other detailed history.")},
300
    {"Ingredients", N_("Ingredients"), "bag ResourceRef", xmpBag, xmpInternal,
301
     N_("References to resources that were incorporated, by inclusion or reference, into this resource.")},
302
    {"InstanceID", N_("Instance ID"), "URI", xmpText, xmpInternal,
303
     N_("An identifier for a specific incarnation of a document, updated each time a file "
304
        "is saved. It should be based on a UUID; see Document and Instance IDs below.")},
305
    {"ManagedFrom", N_("Managed From"), "ResourceRef", xmpText, xmpInternal,
306
     N_("A reference to the document as it was prior to becoming managed. It is set when a "
307
        "managed document is introduced to an asset management system that does not "
308
        "currently own it. It may or may not include references to different management systems.")},
309
    {"Manager", N_("Manager"), "AgentName", xmpText, xmpInternal,
310
     N_("The name of the asset management system that manages this resource. Along with "
311
        "xmpMM: ManagerVariant, it tells applications which asset management system to "
312
        "contact concerning this document.")},
313
    {"ManageTo", N_("Manage To"), "URI", xmpText, xmpInternal,
314
     N_("A URI identifying the managed resource to the asset management system; the presence "
315
        "of this property is the formal indication that this resource is managed. The form "
316
        "and content of this URI is private to the asset management system.")},
317
    {"ManageUI", N_("Manage UI"), "URI", xmpText, xmpInternal,
318
     N_("A URI that can be used to access information about the managed resource through a "
319
        "web browser. It might require a custom browser plug-in.")},
320
    {"ManagerVariant", N_("Manager Variant"), "Text", xmpText, xmpInternal,
321
     N_("Specifies a particular variant of the asset management system. The format of this "
322
        "property is private to the specific asset management system.")},
323
    {"OriginalDocumentID", N_("Original Document ID"), "URI", xmpText, xmpInternal,
324
     N_("Refer to Part 1, Data Model, Serialization, and Core "
325
        "Properties, for definition.")},
326
    {"Pantry", N_("Pantry"), "bag struct", xmpText, xmpInternal,
327
     N_("Each array item has a structure value with a potentially "
328
        "unique set of fields, containing extracted XMP from a "
329
        "component. Each field is a property from the XMP of a "
330
        "contained resource component, with all substructure "
331
        "preserved. "
332
        "Each pantry entry shall contain an xmpMM:InstanceID. "
333
        "Only one copy of the pantry entry for any given "
334
        "xmpMM:InstanceID shall be retained in the pantry. "
335
        "Nested pantry items shall be removed from the individual "
336
        "pantry item and promoted to the top level of the pantry.")},
337
    {"RenditionClass", N_("Rendition Class"), "RenditionClass", xmpText, xmpInternal,
338
     N_("The rendition class name for this resource. This property should be absent or set "
339
        "to default for a document version that is not a derived rendition.")},
340
    {"RenditionParams", N_("Rendition Params"), "Text", xmpText, xmpInternal,
341
     N_("Can be used to provide additional rendition parameters that are too complex or "
342
        "verbose to encode in xmpMM: RenditionClass.")},
343
    {"VersionID", N_("Version ID"), "Text", xmpText, xmpInternal,
344
     N_("The document version identifier for this resource. Each version of a document gets "
345
        "a new identifier, usually simply by incrementing integers 1, 2, 3 . . . and so on. "
346
        "Media management systems can have other conventions or support branching which "
347
        "requires a more complex scheme.")},
348
    {"Versions", N_("Versions"), "seq Version", xmpText, xmpInternal,
349
     N_("The version history associated with this resource. Entry [1] is the oldest known "
350
        "version for this document, entry [last()] is the most recent version. Typically, a "
351
        "media management system would fill in the version information in the metadata on "
352
        "check-in. It is not guaranteed that a complete history  versions from the first to "
353
        "this one will be present in the xmpMM:Versions property. Interior version information "
354
        "can be compressed or eliminated and the version history can be truncated at some point.")},
355
    {"LastURL", N_("Last URL"), "URL", xmpText, xmpInternal, N_("Deprecated for privacy protection.")},
356
    {"RenditionOf", N_("Rendition Of"), "ResourceRef", xmpText, xmpInternal,
357
     N_("Deprecated in favor of xmpMM:DerivedFrom. A reference to the document of which this is "
358
        "a rendition.")},
359
    {"SaveID", N_("Save ID"), "Integer", xmpText, xmpInternal,
360
     N_("Deprecated. Previously used only to support the xmpMM:LastURL property.")},
361
    // End of list marker
362
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
363
};
364
365
const XmpPropertyInfo xmpXmpBJInfo[] = {
366
    {"JobRef", N_("Job Reference"), "bag Job", xmpText, xmpExternal,
367
     N_("References an external job management file for a job process in which the document is being used. Use of "
368
        "job "
369
        "names is under user control. Typical use would be to identify all documents that are part of a particular "
370
        "job or contract. "
371
        "There are multiple values because there can be more than one job using a particular document at any time, "
372
        "and it can "
373
        "also be useful to keep historical information about what jobs a document was part of previously.")},
374
    // End of list marker
375
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
376
};
377
378
const XmpPropertyInfo xmpXmpTPgInfo[] = {
379
    {"MaxPageSize", N_("Maximum Page Size"), "Dimensions", xmpText, xmpInternal,
380
     N_("The size of the largest page in the document (including any in contained documents).")},
381
    {"NPages", N_("Number of Pages"), "Integer", xmpText, xmpInternal,
382
     N_("The number of pages in the document (including any in contained documents).")},
383
    {"Fonts", N_("Fonts"), "bag Font", xmpText, xmpInternal,
384
     N_("An unordered array of fonts that are used in the document (including any in contained documents).")},
385
    {"Colorants", N_("Colorants"), "seq Colorant", xmpText, xmpInternal,
386
     N_("An ordered array of colorants (swatches) that are used in the document (including any in contained "
387
        "documents).")},
388
    {"PlateNames", N_("Plate Names"), "seq Text", xmpSeq, xmpInternal,
389
     N_("An ordered array of plate names that are needed to print the document (including any in contained "
390
        "documents).")},
391
    // End of list marker
392
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
393
};
394
395
const XmpPropertyInfo xmpXmpDMInfo[] = {
396
    {"absPeakAudioFilePath", N_("Absolute Peak Audio File Path"), "URI", xmpText, xmpInternal,
397
     N_("The absolute path to the file's peak audio file. If empty, no peak file exists.")},
398
    {"album", N_("Album"), "Text", xmpText, xmpExternal, N_("The name of the album.")},
399
    {"altTapeName", N_("Alternative Tape Name"), "Text", xmpText, xmpExternal,
400
     N_("An alternative tape name, set via the project window or timecode dialog in Premiere. "
401
        "If an alternative name has been set and has not been reverted, that name is displayed.")},
402
    {"altTimecode", N_("Alternative Time code"), "Timecode", xmpText, xmpExternal,
403
     N_("A timecode set by the user. When specified, it is used instead of the startTimecode.")},
404
    {"artist", N_("Artist"), "Text", xmpText, xmpExternal, N_("The name of the artist or artists.")},
405
    {"audioModDate", N_("Audio Modified Date"), "Date", xmpText, xmpInternal,
406
     N_("(deprecated) The date and time when the audio was last modified.")},
407
    {"audioChannelType", N_("Audio Channel Type"), "closed Choice of Text", xmpText, xmpInternal,
408
     N_("The audio channel type. One of: Mono, Stereo, 5.1, 7.1, 16 Channel, Other.")},
409
    {"audioCompressor", N_("Audio Compressor"), "Text", xmpText, xmpInternal,
410
     N_("The audio compression used. For example, MP3.")},
411
    {"audioSampleRate", N_("Audio Sample Rate"), "Integer", xmpText, xmpInternal,
412
     N_("The audio sample rate. Can be any value, but commonly 32000, 44100, or 48000.")},
413
    {"audioSampleType", N_("Audio Sample Type"), "closed Choice of Text", xmpText, xmpInternal,
414
     N_("The audio sample type. One of: 8Int, 16Int, 24Int, 32Int, 32Float, Compressed, Packed, Other.")},
415
    {"beatSpliceParams", N_("Beat Splice Parameters"), "beatSpliceStretch", xmpText, xmpInternal,
416
     N_("Additional parameters for Beat Splice stretch mode.")},
417
    {"cameraAngle", N_("Camera Angle"), "open Choice of Text", xmpText, xmpExternal,
418
     N_("The orientation of the camera to the subject in a static shot, from a fixed set of industry standard "
419
        "terminology. Predefined values include:Low Angle, Eye Level, High Angle, Overhead Shot, Birds Eye Shot, "
420
        "Dutch Angle, POV, Over the Shoulder, Reaction Shot.")},
421
    {"cameraLabel", N_("Camera Label"), "Text", xmpText, xmpExternal,
422
     N_("A description of the camera used for a shoot. Can be any string, but is usually simply a number, for "
423
        "example \"1\", \"2\", or more explicitly \"Camera 1\".")},
424
    {"cameraModel", N_("Camera Model"), "Text", xmpText, xmpExternal,
425
     N_("The make and model of the camera used for a shoot.")},
426
    {"cameraMove", N_("Camera Move"), "open Choice of Text", xmpText, xmpExternal,
427
     N_("The movement of the camera during the shot, from a fixed set of industry standard terminology. Predefined "
428
        "values include: Aerial, Boom Up, Boom Down, Crane Up, Crane Down, Dolly In, Dolly Out, Pan Left, Pan "
429
        "Right, Pedestal Up, Pedestal Down, Tilt Up, Tilt Down, Tracking, Truck Left, Truck Right, Zoom In, Zoom "
430
        "Out.")},
431
    {"client", N_("Client"), "Text", xmpText, xmpExternal,
432
     N_("The client for the job of which this shot or take is a part.")},
433
    {"comment", N_("Comment"), "Text", xmpText, xmpExternal, N_("A user's comments.")},
434
    {"composer", N_("Composer"), "Text", xmpText, xmpExternal, N_("The composer's name.")},
435
    {"contributedMedia", N_("Contributed Media"), "bag Media", xmpBag, xmpInternal,
436
     N_("An unordered list of all media used to create this media.")},
437
    {"copyright", N_("Copyright"), "Text", xmpText, xmpExternal,
438
     N_("(Deprecated in favour of dc:rights.) The copyright information.")},
439
    {"director", N_("Director"), "Text", xmpText, xmpExternal, N_("The director of the scene.")},
440
    {"directorPhotography", N_("Director Photography"), "Text", xmpText, xmpExternal,
441
     N_("The director of photography for the scene.")},
442
    {"duration", N_("Duration"), "Time", xmpText, xmpInternal, N_("The duration of the media file.")},
443
    {"engineer", N_("Engineer"), "Text", xmpText, xmpExternal, N_("The engineer's name.")},
444
    {"fileDataRate", N_("File Data Rate"), "Rational", xmpText, xmpInternal,
445
     N_("The file data rate in megabytes per second. For example: \"36/10\" = 3.6 MB/sec")},
446
    {"genre", N_("Genre"), "Text", xmpText, xmpExternal, N_("The name of the genre.")},
447
    {"good", N_("Good"), "Boolean", xmpText, xmpExternal, N_("A checkbox for tracking whether a shot is a keeper.")},
448
    {"instrument", N_("Instrument"), "Text", xmpText, xmpExternal, N_("The musical instrument.")},
449
    {"introTime", N_("Intro Time"), "Time", xmpText, xmpInternal, N_("The duration of lead time for queuing music.")},
450
    {"key", N_("Key"), "closed Choice of Text", xmpText, xmpInternal,
451
     N_("The audio's musical key. One of: C, C#, D, D#, E, F, F#, G, G#, A, A#, B.")},
452
    {"logComment", N_("Log Comment"), "Text", xmpText, xmpExternal, N_("User's log comments.")},
453
    {"loop", N_("Loop"), "Boolean", xmpText, xmpInternal, N_("When true, the clip can be looped seamlessly.")},
454
    {"numberOfBeats", N_("Number Of Beats"), "Real", xmpText, xmpInternal, N_("The number of beats.")},
455
    {"markers", N_("Markers"), "seq Marker", xmpSeq, xmpInternal, N_("An ordered list of markers")},
456
    {"metadataModDate", N_("Metadata Modified Date"), "Date", xmpText, xmpInternal,
457
     N_("(deprecated) The date and time when the metadata was last modified.")},
458
    {"outCue", N_("Out Cue"), "Time", xmpText, xmpInternal, N_("The time at which to fade out.")},
459
    {"projectName", N_("Project Name"), "Text", xmpText, xmpExternal,
460
     N_("The name of the project of which this file is a part.")},
461
    {"projectRef", N_("Project Reference"), "ProjectLink", xmpText, xmpInternal,
462
     N_("A reference to the project that created this file.")},
463
    {"pullDown", N_("Pull Down"), "closed Choice of Text", xmpText, xmpInternal,
464
     N_("The sampling phase of film to be converted to video (pull-down). One of: "
465
        "WSSWW, SSWWW, SWWWS, WWWSS, WWSSW, WSSWW_24p, SSWWW_24p, SWWWS_24p, WWWSS_24p, WWSSW_24p.")},
466
    {"relativePeakAudioFilePath", N_("Relative Peak Audio File Path"), "URI", xmpText, xmpInternal,
467
     N_("The relative path to the file's peak audio file. If empty, no peak file exists.")},
468
    {"relativeTimestamp", N_("Relative Timestamp"), "Time", xmpText, xmpInternal,
469
     N_("The start time of the media inside the audio project.")},
470
    {"releaseDate", N_("Release Date"), "Date", xmpText, xmpExternal, N_("The date the title was released.")},
471
    {"resampleParams", N_("Resample Parameters"), "resampleStretch", xmpText, xmpInternal,
472
     N_("Additional parameters for Resample stretch mode.")},
473
    {"scaleType", N_("Scale Type"), "closed Choice of Text", xmpText, xmpInternal,
474
     N_("The musical scale used in the music. One of: Major, Minor, Both, Neither.")},
475
    {"scene", N_("Scene"), "Text", xmpText, xmpExternal, N_("The name of the scene.")},
476
    {"shotDate", N_("Shot Date"), "Date", xmpText, xmpExternal, N_("The date and time when the video was shot.")},
477
    {"shotDay", N_("Shot Day"), "Text", xmpText, xmpExternal,
478
     N_("The day in a multiday shoot. For example: \"Day 2\", \"Friday\".")},
479
    {"shotLocation", N_("Shot Location"), "Text", xmpText, xmpExternal,
480
     N_("The name of the location where the video was shot. For example: \"Oktoberfest, Munich Germany\" "
481
        "For more accurate positioning, use the EXIF GPS values.")},
482
    {"shotName", N_("Shot Name"), "Text", xmpText, xmpExternal, N_("The name of the shot or take.")},
483
    {"shotNumber", N_("Shot Number"), "Text", xmpText, xmpExternal,
484
     N_("The position of the shot in a script or production, relative to other shots. For example: 1, 2, 1a, 1b, "
485
        "1.1, 1.2.")},
486
    {"shotSize", N_("Shot Size"), "open Choice of Text", xmpText, xmpExternal,
487
     N_("The size or scale of the shot framing, from a fixed set of industry standard terminology. Predefined "
488
        "values include: "
489
        "ECU --extreme close-up, MCU -- medium close-up. CU -- close-up, MS -- medium shot, "
490
        "WS -- wide shot, MWS -- medium wide shot, EWS -- extreme wide shot.")},
491
    {"speakerPlacement", N_("Speaker Placement"), "Text", xmpText, xmpExternal,
492
     N_("A description of the speaker angles from center front in degrees. For example: "
493
        "\"Left = -30, Right = 30, Center = 0, LFE = 45, Left Surround = -110, Right Surround = 110\"")},
494
    {"startTimecode", N_("Start Time Code"), "Timecode", xmpText, xmpInternal,
495
     N_("The timecode of the first frame of video in the file, as obtained from the device control.")},
496
    {"stretchMode", N_("Stretch Mode"), "closed Choice of Text", xmpText, xmpInternal,
497
     N_("The audio stretch mode. One of: Fixed length, Time-Scale, Resample, Beat Splice, Hybrid.")},
498
    {"takeNumber", N_("Take Number"), "Integer", xmpText, xmpExternal,
499
     N_("A numeric value indicating the absolute number of a take.")},
500
    {"tapeName", N_("Tape Name"), "Text", xmpText, xmpExternal,
501
     N_("The name of the tape from which the clip was captured, as set during the capture process.")},
502
    {"tempo", N_("Tempo"), "Real", xmpText, xmpInternal, N_("The audio's tempo.")},
503
    {"timeScaleParams", N_("Time Scale Parameters"), "timeScaleStretch", xmpText, xmpInternal,
504
     N_("Additional parameters for Time-Scale stretch mode.")},
505
    {"timeSignature", N_("Time Signature"), "closed Choice of Text", xmpText, xmpInternal,
506
     N_("The time signature of the music. One of: 2/4, 3/4, 4/4, 5/4, 7/4, 6/8, 9/8, 12/8, other.")},
507
    {"trackNumber", N_("Track Number"), "Integer", xmpText, xmpExternal,
508
     N_("A numeric value indicating the order of the audio file within its original recording.")},
509
    {"tracks", N_("Tracks"), "bag Track", xmpBag, xmpInternal,
510
     N_("An unordered list of tracks. A track is a named set of markers, which can specify a frame rate for all "
511
        "markers in the set. See also xmpDM:markers.")},
512
    {"videoAlphaMode", N_("Video Alpha Mode"), "closed Choice of Text", xmpText, xmpExternal,
513
     N_("The alpha mode. One of: straight, pre-multiplied.")},
514
    {"videoAlphaPremultipleColor", N_("Video Alpha Premultiple Color"), "Colorant", xmpText, xmpExternal,
515
     N_("A color in CMYK or RGB to be used as the pre-multiple color when "
516
        "alpha mode is pre-multiplied.")},
517
    {"videoAlphaUnityIsTransparent", N_("Video Alpha Unity Is Transparent"), "Boolean", xmpText, xmpInternal,
518
     N_("When true, unity is clear, when false, it is opaque.")},
519
    {"videoColorSpace", N_("Video Color Space"), "closed Choice of Text", xmpText, xmpInternal,
520
     N_("The color space. One of: sRGB (used by Photoshop), CCIR-601 (used for NTSC), "
521
        "CCIR-709 (used for HD).")},
522
    {"videoCompressor", N_("Video Compressor"), "Text", xmpText, xmpInternal,
523
     N_("Video compression used. For example, jpeg.")},
524
    {"videoFieldOrder", N_("Video Field Order"), "closed Choice of Text", xmpText, xmpInternal,
525
     N_("The field order for video. One of: Upper, Lower, Progressive.")},
526
    {"videoFrameRate", N_("Video Frame Rate"), "open Choice of Text", xmpText, xmpInternal,
527
     N_("The video frame rate. One of: 24, NTSC, PAL.")},
528
    {"videoFrameSize", N_("Video Frame Size"), "Dimensions", xmpText, xmpInternal,
529
     N_("The frame size. For example: w:720, h: 480, unit:pixels")},
530
    {"videoModDate", N_("Video Modified Date"), "Date", xmpText, xmpInternal,
531
     N_("(deprecated) The date and time when the video was last modified.")},
532
    {"videoPixelDepth", N_("Video Pixel Depth"), "closed Choice of Text", xmpText, xmpInternal,
533
     N_("The size in bits of each color component of a pixel. Standard Windows 32-bit "
534
        "pixels have 8 bits per component. One of: 8Int, 16Int, 32Int, 32Float.")},
535
    {"videoPixelAspectRatio", N_("Video Pixel Aspect Ratio"), "Rational", xmpText, xmpInternal,
536
     N_("The aspect ratio, expressed as ht/wd. For example: \"648/720\" = 0.9")},
537
    {"partOfCompilation", N_("Part Of Compilation"), "Boolean", xmpText, xmpExternal, N_("Part of compilation.")},
538
    {"lyrics", N_("Lyrics"), "Text", xmpText, xmpExternal, N_("Lyrics text. No association with timecode.")},
539
    {"discNumber", N_("Disc Number"), "Text", xmpText, xmpExternal,
540
     N_("If in a multi-disc set, might contain total number of discs. For example: 2/3.")},
541
542
    // End of list marker
543
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
544
};
545
546
const XmpPropertyInfo xmpMicrosoftInfo[] = {
547
    {"CameraSerialNumber", N_("Camera Serial Number"), "Text", xmpText, xmpExternal, N_("Camera Serial Number.")},
548
    {"DateAcquired", N_("Date Acquired"), "Date", xmpText, xmpExternal, N_("Date Acquired.")},
549
    {"FlashManufacturer", N_("Flash Manufacturer"), "Text", xmpText, xmpExternal, N_("Flash Manufacturer.")},
550
    {"FlashModel", N_("Flash Model"), "Text", xmpText, xmpExternal, N_("Flash Model.")},
551
    {"LastKeywordIPTC", N_("Last Keyword IPTC"), "bag Text", xmpBag, xmpExternal, N_("Last Keyword IPTC.")},
552
    {"LastKeywordXMP", N_("Last Keyword XMP"), "bag Text", xmpBag, xmpExternal, N_("Last Keyword XMP.")},
553
    {"LensManufacturer", N_("Lens Manufacturer"), "Text", xmpText, xmpExternal, N_("Lens Manufacturer.")},
554
    {"LensModel", N_("Lens Model"), "Text", xmpText, xmpExternal, N_("Lens Model.")},
555
    {"Rating", N_("Rating Percent"), "Text", xmpText, xmpExternal, N_("Rating Percent.")},
556
    // End of list marker
557
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
558
};
559
560
const XmpPropertyInfo xmpLrInfo[] = {
561
    {"hierarchicalSubject", N_("Hierarchical Subject"), "bag Text", xmpBag, xmpExternal,
562
     N_("Adobe Lightroom hierarchical keywords.")},
563
    {"privateRTKInfo", N_("Private RTK Info"), "Text", xmpText, xmpExternal, N_("Adobe Lightroom private RTK info.")},
564
    // End of list marker
565
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
566
};
567
568
const XmpPropertyInfo xmpPdfInfo[] = {
569
    {"Keywords", N_("Keywords"), "Text", xmpText, xmpExternal, N_("Keywords.")},
570
    {"PDFVersion", N_("PDF Version"), "Text", xmpText, xmpInternal,
571
     N_("The PDF file version (for example: 1.0, 1.3, and so on).")},
572
    {"Producer", N_("Producer"), "AgentName", xmpText, xmpInternal,
573
     N_("The name of the tool that created the PDF document.")},
574
    {"Trapped", N_("Trapped"), "Boolean", xmpText, xmpExternal, N_("True when the document has been trapped.")},
575
    // End of list marker
576
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
577
};
578
579
const XmpPropertyInfo xmpPhotoshopInfo[] = {
580
    {"DateCreated", N_("Date Created"), "Date", xmpText, xmpExternal,
581
     N_("The date the intellectual content of the document was created (rather than the creation "
582
        "date of the physical representation), following IIM conventions. For example, a photo "
583
        "taken during the American Civil War would have a creation date during that epoch "
584
        "(1861-1865) rather than the date the photo was digitized for archiving.")},
585
    {"Headline", N_("Headline"), "Text", xmpText, xmpExternal, N_("Headline.")},
586
    {"Country", N_("Country"), "Text", xmpText, xmpExternal, N_("Country/primary location.")},
587
    {"State", N_("State"), "Text", xmpText, xmpExternal, N_("Province/state.")},
588
    {"City", N_("City"), "Text", xmpText, xmpExternal, N_("City.")},
589
    {"Credit", N_("Credit"), "Text", xmpText, xmpExternal, N_("Credit.")},
590
    {"AuthorsPosition", N_("Authors Position"), "Text", xmpText, xmpExternal, N_("By-line title.")},
591
    {"CaptionWriter", N_("Caption Writer"), "Text", xmpText, xmpExternal, N_("Writer/editor.")},
592
    {"Category", N_("Category"), "Text", xmpText, xmpExternal, N_("Category. Limited to 3 7-bit ASCII characters.")},
593
    {"Instructions", N_("Instructions"), "Text", xmpText, xmpExternal, N_("Special instructions.")},
594
    {"Source", N_("Source"), "Text", xmpText, xmpExternal, N_("Source.")},
595
    {"SupplementalCategories", N_("Supplemental Categories"), "bag Text", xmpBag, xmpExternal,
596
     N_("Supplemental category.")},
597
    {"TransmissionReference", N_("Transmission Reference"), "Text", xmpText, xmpExternal,
598
     N_("Original transmission reference.")},
599
    {"Urgency", N_("Urgency"), "Integer", xmpText, xmpExternal, N_("Urgency. Valid range is 1-8.")},
600
    {"ICCProfile", N_("ICC Profile"), "Text", xmpText, xmpInternal,
601
     N_("The colour profile, such as AppleRGB, AdobeRGB1998.")},
602
    {"ColorMode", N_("Color Mode"), "Closed Choice of Integer", xmpText, xmpInternal,
603
     N_("The colour mode. One of: 0 = Bitmap, 1 = Grayscale, 2 = Indexed, 3 = RGB, 4 = CMYK, 7 = Multichannel, 8 = "
604
        "Duotone, 9 = Lab.")},
605
    {"AncestorID", N_("Ancestor ID"), "URI", xmpText, xmpExternal, N_("The unique identifier of a document.")},
606
    {"DocumentAncestors", N_("Document Ancestors"), "bag Ancestor", xmpBag, xmpExternal,
607
     N_("If the source document for a copy-and-paste or place operation has a document ID, that ID is added to "
608
        "this list in the destination document's XMP.")},
609
    {"History", N_("History"), "Text", xmpText, xmpExternal,
610
     N_("The history that appears in the FileInfo panel, if activated in the application preferences.")},
611
    {"TextLayers", N_("Text Layers"), "seq Layer", xmpSeq, xmpExternal,
612
     N_("If a document has text layers, this property caches the text for each layer.")},
613
    {"LayerName", N_("Layer Name"), "Text", xmpText, xmpExternal, N_("The identifying name of the text layer.")},
614
    {"LayerText", N_("Layer Text"), "Text", xmpText, xmpExternal, N_("The text content of the text layer.")},
615
    {"EmbeddedXMPDigest", N_("Embedded XMP Digest"), "Text", xmpText, xmpExternal, N_("Embedded XMP Digest.")},
616
    {"LegacyIPTCDigest", N_("Legacy IPTC Digest"), "Text", xmpText, xmpExternal, N_("Legacy IPTC Digest.")},
617
    {"SidecarForExtension", N_("Sidecar F or Extension"), "Text", xmpText, xmpExternal,
618
     N_("Filename extension of associated image file.")},
619
620
    // End of list marker
621
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
622
};
623
624
//! XMP crs:CropUnits
625
constexpr TagDetails crsCropUnits[] = {
626
    {0, N_("pixels")},
627
    {1, N_("inches")},
628
    {2, N_("cm")},
629
};
630
631
const XmpPropertyInfo xmpCrssInfo[] = {
632
    {"SavedSettings", N_("Saved Settings"), "SavedSettings", xmpText, xmpInternal,
633
     N_("*Main structure* Camera Raw Saved Settings.")},
634
    {"Name", N_("Name"), "Text", xmpText, xmpExternal, N_("Camera Raw Saved Settings Name.")},
635
    {"Type", N_("Type"), "Text", xmpText, xmpExternal, N_("Camera Raw Saved Settings Type.")},
636
    {"Parameters", N_("Parameters"), "Parameters", xmpText, xmpInternal,
637
     N_("*Main structure* Camera Raw Saved Settings Parameters.")},
638
    // End of list marker
639
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
640
};
641
642
const XmpPropertyInfo xmpCrsInfo[] = {
643
    {"AutoBrightness", N_("Auto Brightness"), "Boolean", xmpText, xmpInternal,
644
     N_("When true, \"Brightness\" is automatically adjusted.")},
645
    {"AutoContrast", N_("Auto Contrast"), "Boolean", xmpText, xmpInternal,
646
     N_("When true, \"Contrast\" is automatically adjusted.")},
647
    {"AutoExposure", N_("Auto Exposure"), "Boolean", xmpText, xmpInternal,
648
     N_("When true, \"Exposure\" is automatically adjusted.")},
649
    {"AutoShadows", N_("Auto Shadows"), "Boolean", xmpText, xmpInternal,
650
     N_("When true,\"Shadows\" is automatically adjusted.")},
651
    {"BlueHue", N_("Blue Hue"), "Integer", xmpText, xmpInternal, N_("\"Blue Hue\" setting. Range -100 to 100.")},
652
    {"BlueSaturation", N_("Blue Saturation"), "Integer", xmpText, xmpInternal,
653
     N_("\"Blue Saturation\" setting. Range -100 to +100.")},
654
    {"Brightness", N_("Brightness"), "Integer", xmpText, xmpInternal, N_("\"Brightness\" setting. Range 0 to +150.")},
655
    {"CameraProfile", N_("Camera Profile"), "Text", xmpText, xmpInternal, N_("\"Camera Profile\" setting.")},
656
    {"ChromaticAberrationB", N_("Chromatic Aberration Blue"), "Integer", xmpText, xmpInternal,
657
     N_("\"Chromatic Aberration, Fix Blue/Yellow Fringe\" setting. Range -100 to +100.")},
658
    {"ChromaticAberrationR", N_("Chromatic Aberration Red"), "Integer", xmpText, xmpInternal,
659
     N_("\"Chromatic Aberration, Fix Red/Cyan Fringe\" setting. Range -100 to +100.")},
660
    {"ColorNoiseReduction", N_("Color Noise Reduction"), "Integer", xmpText, xmpInternal,
661
     N_("\"Color Noise Reduction\" setting. Range 0 to +100.")},
662
    {"Contrast", N_("Contrast"), "Integer", xmpText, xmpInternal, N_("\"Contrast\" setting. Range -50 to +100.")},
663
    {"CropTop", N_("Crop Top"), "Real", xmpText, xmpInternal, N_("When \"Has Crop\" is true, top of crop rectangle")},
664
    {"CropLeft", N_("Crop Left"), "Real", xmpText, xmpInternal,
665
     N_("When \"Has Crop\" is true, left of crop rectangle.")},
666
    {"CropBottom", N_("Crop Bottom"), "Real", xmpText, xmpInternal,
667
     N_("When \"Has Crop\" is true, bottom of crop rectangle.")},
668
    {"CropRight", N_("Crop Right"), "Real", xmpText, xmpInternal,
669
     N_("When \"Has Crop\" is true, right of crop rectangle.")},
670
    {"CropAngle", N_("Crop Angle"), "Real", xmpText, xmpInternal,
671
     N_("When \"Has Crop\" is true, angle of crop rectangle.")},
672
    {"CropWidth", N_("Crop Width"), "Real", xmpText, xmpInternal,
673
     N_("Width of resulting cropped image in CropUnits units.")},
674
    {"CropHeight", N_("Crop Height"), "Real", xmpText, xmpInternal,
675
     N_("Height of resulting cropped image in CropUnits units.")},
676
    {"CropUnits", N_("Crop Units"), "Integer", xmpText, xmpInternal,
677
     N_("Units for CropWidth and CropHeight. 0=pixels, 1=inches, 2=cm")},
678
    {"Exposure", N_("Exposure"), "Real", xmpText, xmpInternal, N_("\"Exposure\" setting. Range -4.0 to +4.0.")},
679
    {"GreenHue", N_("Green Hue"), "Integer", xmpText, xmpInternal, N_("\"Green Hue\" setting. Range -100 to +100.")},
680
    {"GreenSaturation", N_("Green Saturation"), "Integer", xmpText, xmpInternal,
681
     N_("\"Green Saturation\" setting. Range -100 to +100.")},
682
    {"HasCrop", N_("Has Crop"), "Boolean", xmpText, xmpInternal, N_("When true, image has a cropping rectangle.")},
683
    {"HasSettings", N_("Has Settings"), "Boolean", xmpText, xmpInternal,
684
     N_("When true, non-default camera raw settings.")},
685
    {"LuminanceSmoothing", N_("Luminance Smoothing"), "Integer", xmpText, xmpInternal,
686
     N_("\"Luminance Smoothing\" setting. Range 0 to +100.")},
687
    {"RawFileName", N_("Raw File Name"), "Text", xmpText, xmpInternal,
688
     N_("File name of raw file (not a complete path).")},
689
    {"RedHue", N_("Red Hue"), "Integer", xmpText, xmpInternal, N_("\"Red Hue\" setting. Range -100 to +100.")},
690
    {"RedSaturation", N_("Red Saturation"), "Integer", xmpText, xmpInternal,
691
     N_("\"Red Saturation\" setting. Range -100 to +100.")},
692
    {"Saturation", N_("Saturation"), "Integer", xmpText, xmpInternal,
693
     N_("\"Saturation\" setting. Range -100 to +100.")},
694
    {"Shadows", N_("Shadows"), "Integer", xmpText, xmpInternal, N_("\"Shadows\" setting. Range 0 to +100.")},
695
    {"ShadowTint", N_("Shadow Tint"), "Integer", xmpText, xmpInternal,
696
     N_("\"Shadow Tint\" setting. Range -100 to +100.")},
697
    {"Sharpness", N_("Sharpness"), "Integer", xmpText, xmpInternal, N_("\"Sharpness\" setting. Range 0 to +100.")},
698
    {"Temperature", N_("Temperature"), "Integer", xmpText, xmpInternal,
699
     N_("\"Temperature\" setting. Range 2000 to 50000.")},
700
    {"Tint", N_("Tint"), "Integer", xmpText, xmpInternal, N_("\"Tint\" setting. Range -150 to +150.")},
701
    {"ToneCurve", N_("Tone Curve"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
702
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
703
    {"ToneCurveName", N_("Tone Curve Name"), "Choice Text", xmpText, xmpInternal,
704
     N_("The name of the Tone Curve described by ToneCurve. One of: Linear, Medium Contrast, "
705
        "Strong Contrast, Custom or a user-defined preset name.")},
706
    {"Version", N_("Version"), "Text", xmpText, xmpInternal, N_("Version of Camera Raw plugin.")},
707
    {"VignetteAmount", N_("Vignette Amount"), "Integer", xmpText, xmpInternal,
708
     N_("\"Vignetting Amount\" setting. Range -100 to +100.")},
709
    {"VignetteMidpoint", N_("Vignette Midpoint"), "Integer", xmpText, xmpInternal,
710
     N_("\"Vignetting Midpoint\" setting. Range 0 to +100.")},
711
    {"WhiteBalance", N_("White Balance"), "Closed Choice Text", xmpText, xmpInternal,
712
     N_("\"White Balance\" setting. One of: As Shot, Auto, Daylight, Cloudy, Shade, Tungsten, "
713
        "Fluorescent, Flash, Custom")},
714
    // The following properties are not in the XMP specification. They are found in sample files from Adobe
715
    // applications and in exiftool.
716
    {"AlreadyApplied", N_("Already Applied"), "Boolean", xmpText, xmpInternal,
717
     N_("Not in XMP Specification. Found in sample files.")},
718
    {"Converter", N_("Converter"), "Text", xmpText, xmpInternal,
719
     N_("Not in XMP Specification. Found in sample files.")},
720
    {"MoireFilter", N_("Moire Filter"), "Text", xmpText, xmpInternal,
721
     N_("Not in XMP Specification. Found in sample files.")},
722
    {"Smoothness", N_("Smoothness"), "Integer", xmpText, xmpInternal,
723
     N_("Not in XMP Specification. Found in sample files.")},
724
    {"CameraProfileDigest", N_("Camera Profile Digest"), "Text", xmpText, xmpInternal,
725
     N_("Not in XMP Specification. Found in sample files.")},
726
    {"Clarity", N_("Clarity"), "Integer", xmpText, xmpInternal, N_("Not in XMP Specification. Found in sample files.")},
727
    {"ConvertToGrayscale", N_("Convert To Grayscale"), "Boolean", xmpText, xmpInternal,
728
     N_("Not in XMP Specification. Found in sample files.")},
729
    {"Defringe", N_("Defringe"), "Integer", xmpText, xmpInternal,
730
     N_("Not in XMP Specification. Found in sample files.")},
731
    {"FillLight", N_("Fill Light"), "Integer", xmpText, xmpInternal,
732
     N_("Not in XMP Specification. Found in sample files.")},
733
    {"HighlightRecovery", N_("Highlight Recovery"), "Integer", xmpText, xmpInternal,
734
     N_("Not in XMP Specification. Found in sample files.")},
735
    {"HueAdjustmentAqua", N_("Hue Adjustment Aqua"), "Integer", xmpText, xmpInternal,
736
     N_("Not in XMP Specification. Found in sample files.")},
737
    {"HueAdjustmentBlue", N_("Hue Adjustment Blue"), "Integer", xmpText, xmpInternal,
738
     N_("Not in XMP Specification. Found in sample files.")},
739
    {"HueAdjustmentGreen", N_("Hue Adjustment Green"), "Integer", xmpText, xmpInternal,
740
     N_("Not in XMP Specification. Found in sample files.")},
741
    {"HueAdjustmentMagenta", N_("Hue Adjustment Magenta"), "Integer", xmpText, xmpInternal,
742
     N_("Not in XMP Specification. Found in sample files.")},
743
    {"HueAdjustmentOrange", N_("Hue Adjustment Orange"), "Integer", xmpText, xmpInternal,
744
     N_("Not in XMP Specification. Found in sample files.")},
745
    {"HueAdjustmentPurple", N_("Hue Adjustment Purple"), "Integer", xmpText, xmpInternal,
746
     N_("Not in XMP Specification. Found in sample files.")},
747
    {"HueAdjustmentRed", N_("Hue Adjustment Red"), "Integer", xmpText, xmpInternal,
748
     N_("Not in XMP Specification. Found in sample files.")},
749
    {"HueAdjustmentYellow", N_("Hue Adjustment Yellow"), "Integer", xmpText, xmpInternal,
750
     N_("Not in XMP Specification. Found in sample files.")},
751
    {"IncrementalTemperature", N_("Incremental Temperature"), "Integer", xmpText, xmpInternal,
752
     N_("Not in XMP Specification. Found in sample files.")},
753
    {"IncrementalTint", N_("Incremental Tint"), "Integer", xmpText, xmpInternal,
754
     N_("Not in XMP Specification. Found in sample files.")},
755
    {"LuminanceAdjustmentAqua", N_("Luminance Adjustment Aqua"), "Integer", xmpText, xmpInternal,
756
     N_("Not in XMP Specification. Found in sample files.")},
757
    {"LuminanceAdjustmentBlue", N_("Luminance Adjustment Blue"), "Integer", xmpText, xmpInternal,
758
     N_("Not in XMP Specification. Found in sample files.")},
759
    {"LuminanceAdjustmentGreen", N_("Luminance Adjustment Green"), "Integer", xmpText, xmpInternal,
760
     N_("Not in XMP Specification. Found in sample files.")},
761
    {"LuminanceAdjustmentMagenta", N_("Luminance Adjustment Magenta"), "Integer", xmpText, xmpInternal,
762
     N_("Not in XMP Specification. Found in sample files.")},
763
    {"LuminanceAdjustmentOrange", N_("Luminance Adjustment Orange"), "Integer", xmpText, xmpInternal,
764
     N_("Not in XMP Specification. Found in sample files.")},
765
    {"LuminanceAdjustmentPurple", N_("Luminance Adjustment Purple"), "Integer", xmpText, xmpInternal,
766
     N_("Not in XMP Specification. Found in sample files.")},
767
    {"LuminanceAdjustmentRed", N_("Luminance Adjustment Red"), "Integer", xmpText, xmpInternal,
768
     N_("Not in XMP Specification. Found in sample files.")},
769
    {"LuminanceAdjustmentYellow", N_("Luminance Adjustment Yellow"), "Integer", xmpText, xmpInternal,
770
     N_("Not in XMP Specification. Found in sample files.")},
771
    {"ParametricDarks", N_("Parametric Darks"), "Integer", xmpText, xmpInternal,
772
     N_("Not in XMP Specification. Found in sample files.")},
773
    {"ParametricHighlights", N_("Parametric Highlights"), "Integer", xmpText, xmpInternal,
774
     N_("Not in XMP Specification. Found in sample files.")},
775
    {"ParametricHighlightSplit", N_("Parametric Highlight Split"), "Integer", xmpText, xmpInternal,
776
     N_("Not in XMP Specification. Found in sample files.")},
777
    {"ParametricLights", N_("Parametric Lights"), "Integer", xmpText, xmpInternal,
778
     N_("Not in XMP Specification. Found in sample files.")},
779
    {"ParametricMidtoneSplit", N_("Parametric Midtone Split"), "Integer", xmpText, xmpInternal,
780
     N_("Not in XMP Specification. Found in sample files.")},
781
    {"ParametricShadows", N_("Parametric Shadows"), "Integer", xmpText, xmpInternal,
782
     N_("Not in XMP Specification. Found in sample files.")},
783
    {"ParametricShadowSplit", N_("Parametric Shadow Split"), "Integer", xmpText, xmpInternal,
784
     N_("Not in XMP Specification. Found in sample files.")},
785
    {"SaturationAdjustmentAqua", N_("Saturation Adjustment Aqua"), "Integer", xmpText, xmpInternal,
786
     N_("Not in XMP Specification. Found in sample files.")},
787
    {"SaturationAdjustmentBlue", N_("Saturation Adjustment Blue"), "Integer", xmpText, xmpInternal,
788
     N_("Not in XMP Specification. Found in sample files.")},
789
    {"SaturationAdjustmentGreen", N_("Saturation Adjustment Green"), "Integer", xmpText, xmpInternal,
790
     N_("Not in XMP Specification. Found in sample files.")},
791
    {"SaturationAdjustmentMagenta", N_("Saturation Adjustment Magenta"), "Integer", xmpText, xmpInternal,
792
     N_("Not in XMP Specification. Found in sample files.")},
793
    {"SaturationAdjustmentOrange", N_("Saturation Adjustment Orange"), "Integer", xmpText, xmpInternal,
794
     N_("Not in XMP Specification. Found in sample files.")},
795
    {"SaturationAdjustmentPurple", N_("Saturation Adjustment Purple"), "Integer", xmpText, xmpInternal,
796
     N_("Not in XMP Specification. Found in sample files.")},
797
    {"SaturationAdjustmentRed", N_("Saturation Adjustment Red"), "Integer", xmpText, xmpInternal,
798
     N_("Not in XMP Specification. Found in sample files.")},
799
    {"SaturationAdjustmentYellow", N_("Saturation Adjustment Yellow"), "Integer", xmpText, xmpInternal,
800
     N_("Not in XMP Specification. Found in sample files.")},
801
    {"SharpenDetail", N_("Sharpen Detail"), "Integer", xmpText, xmpInternal,
802
     N_("Not in XMP Specification. Found in sample files.")},
803
    {"SharpenEdgeMasking", N_("Sharpen Edge Masking"), "Integer", xmpText, xmpInternal,
804
     N_("Not in XMP Specification. Found in sample files.")},
805
    {"SharpenRadius", N_("Sharpen Radius"), "Real", xmpText, xmpInternal,
806
     N_("Not in XMP Specification. Found in sample files.")},
807
    {"SplitToningBalance", N_("Split Toning Balance"), "Integer", xmpText, xmpInternal,
808
     N_("Not in XMP Specification. Found in sample files.")},
809
    {"SplitToningHighlightHue", N_("Split Toning Highlight Hue"), "Integer", xmpText, xmpInternal,
810
     N_("Not in XMP Specification. Found in sample files.")},
811
    {"SplitToningHighlightSaturation", N_("Split Toning Highlight Saturation"), "Integer", xmpText, xmpInternal,
812
     N_("Not in XMP Specification. Found in sample files.")},
813
    {"SplitToningShadowHue", N_("Split Toning Shadow Hue"), "Integer", xmpText, xmpInternal,
814
     N_("Not in XMP Specification. Found in sample files.")},
815
    {"SplitToningShadowSaturation", N_("Split Toning Shadow Saturation"), "Integer", xmpText, xmpInternal,
816
     N_("Not in XMP Specification. Found in sample files.")},
817
    {"Vibrance", N_("Vibrance"), "Integer", xmpText, xmpInternal,
818
     N_("Not in XMP Specification. Found in sample files.")},
819
    {"GrayMixerRed", N_("Gray Mixer Red"), "Integer", xmpText, xmpInternal,
820
     N_("Not in XMP Specification. Found in sample files.")},
821
    {"GrayMixerOrange", N_("Gray Mixer Orange"), "Integer", xmpText, xmpInternal,
822
     N_("Not in XMP Specification. Found in sample files.")},
823
    {"GrayMixerYellow", N_("Gray Mixer Yellow"), "Integer", xmpText, xmpInternal,
824
     N_("Not in XMP Specification. Found in sample files.")},
825
    {"GrayMixerGreen", N_("Gray Mixer Green"), "Integer", xmpText, xmpInternal,
826
     N_("Not in XMP Specification. Found in sample files.")},
827
    {"GrayMixerAqua", N_("Gray Mixer Aqua"), "Integer", xmpText, xmpInternal,
828
     N_("Not in XMP Specification. Found in sample files.")},
829
    {"GrayMixerBlue", N_("Gray Mixer Blue"), "Integer", xmpText, xmpInternal,
830
     N_("Not in XMP Specification. Found in sample files.")},
831
    {"GrayMixerPurple", N_("Gray Mixer Purple"), "Integer", xmpText, xmpInternal,
832
     N_("Not in XMP Specification. Found in sample files.")},
833
    {"GrayMixerMagenta", N_("Gray Mixer Magenta"), "Integer", xmpText, xmpInternal,
834
     N_("Not in XMP Specification. Found in sample files.")},
835
    {"RetouchInfo", N_("Retouch Info"), "bag Text", xmpBag, xmpInternal,
836
     N_("Not in XMP Specification. Found in sample files.")},
837
    {"RedEyeInfo", N_("Red Eye Info"), "bag Text", xmpBag, xmpInternal,
838
     N_("Not in XMP Specification. Found in sample files.")},
839
    {"CropUnit", N_("Crop Unit"), "Integer", xmpText, xmpInternal,
840
     N_("Not in XMP Specification. Found in sample files.")},
841
    {"PostCropVignetteAmount", N_("Post Crop Vignette Amount"), "Integer", xmpText, xmpInternal,
842
     N_("Not in XMP Specification. Found in sample files.")},
843
    {"PostCropVignetteMidpoint", N_("Post Crop Vignette Midpoint"), "Integer", xmpText, xmpInternal,
844
     N_("Not in XMP Specification. Found in sample files.")},
845
    {"PostCropVignetteFeather", N_("Post Crop Vignette Feather"), "Integer", xmpText, xmpInternal,
846
     N_("Not in XMP Specification. Found in sample files.")},
847
    {"PostCropVignetteRoundness", N_("Post Crop Vignette Roundness"), "Integer", xmpText, xmpInternal,
848
     N_("Not in XMP Specification. Found in sample files.")},
849
    {"PostCropVignetteStyle", N_("Post Crop Vignette Style"), "Integer", xmpText, xmpInternal,
850
     N_("Not in XMP Specification. Found in sample files.")},
851
    {"ProcessVersion", N_("Process Version"), "Text", xmpText, xmpInternal,
852
     N_("Not in XMP Specification. Found in sample files.")},
853
    {"LensProfileEnable", N_("Lens Profile Enable"), "Integer", xmpText, xmpInternal,
854
     N_("Not in XMP Specification. Found in sample files.")},
855
    {"LensProfileSetup", N_("Lens Profile Setup"), "Text", xmpText, xmpInternal,
856
     N_("Not in XMP Specification. Found in sample files.")},
857
    {"LensProfileName", N_("Lens Profile Name"), "Text", xmpText, xmpInternal,
858
     N_("Not in XMP Specification. Found in sample files.")},
859
    {"LensProfileFilename", N_("Lens Profile Filename"), "Text", xmpText, xmpInternal,
860
     N_("Not in XMP Specification. Found in sample files.")},
861
    {"LensProfileDigest", N_("Lens Profile Digest"), "Text", xmpText, xmpInternal,
862
     N_("Not in XMP Specification. Found in sample files.")},
863
    {"LensProfileDistortionScale", N_("Lens Profile Distortion Scale"), "Integer", xmpText, xmpInternal,
864
     N_("Not in XMP Specification. Found in sample files.")},
865
    {"LensProfileChromaticAberrationScale", N_("Lens Profile Chromatic Aberration Scale"), "Integer", xmpText,
866
     xmpInternal, N_("Not in XMP Specification. Found in sample files.")},
867
    {"LensProfileVignettingScale", N_("Lens Profile Vignetting Scale"), "Integer", xmpText, xmpInternal,
868
     N_("Not in XMP Specification. Found in sample files.")},
869
    {"LensManualDistortionAmount", N_("Lens Manual Distortion Amount"), "Integer", xmpText, xmpInternal,
870
     N_("Not in XMP Specification. Found in sample files.")},
871
    {"PerspectiveVertical", N_("Perspective Vertical"), "Integer", xmpText, xmpInternal,
872
     N_("Not in XMP Specification. Found in sample files.")},
873
    {"PerspectiveHorizontal", N_("Perspective Horizontal"), "Integer", xmpText, xmpInternal,
874
     N_("Not in XMP Specification. Found in sample files.")},
875
    {"PerspectiveRotate", N_("Perspective Rotate"), "Real", xmpText, xmpInternal,
876
     N_("Not in XMP Specification. Found in sample files.")},
877
    {"PerspectiveScale", N_("Perspective Scale"), "Integer", xmpText, xmpInternal,
878
     N_("Not in XMP Specification. Found in sample files.")},
879
    {"CropConstrainToWarp", N_("Crop Constrain To Warp"), "Integer", xmpText, xmpInternal,
880
     N_("Not in XMP Specification. Found in sample files.")},
881
    {"LuminanceNoiseReductionDetail", N_("Luminance Noise Reduction Detail"), "Integer", xmpText, xmpInternal,
882
     N_("Not in XMP Specification. Found in sample files.")},
883
    {"LuminanceNoiseReductionContrast", N_("Luminance Noise Reduction Contrast"), "Integer", xmpText, xmpInternal,
884
     N_("Not in XMP Specification. Found in sample files.")},
885
    {"ColorNoiseReductionDetail", N_("Color Noise Reduction Detail"), "Integer", xmpText, xmpInternal,
886
     N_("Not in XMP Specification. Found in sample files.")},
887
    {"GrainAmount", N_("Grain Amount"), "Integer", xmpText, xmpInternal,
888
     N_("Not in XMP Specification. Found in sample files.")},
889
    {"GrainSize", N_("Grain Size"), "Integer", xmpText, xmpInternal,
890
     N_("Not in XMP Specification. Found in sample files.")},
891
    {"GrainFrequency", N_("GrainFrequency"), "Integer", xmpText, xmpInternal,
892
     N_("Not in XMP Specification. Found in sample files.")},
893
    {"AutoLateralCA", N_("Auto Lateral CA"), "Integer", xmpText, xmpInternal,
894
     N_("Not in XMP Specification. Found in sample files.")},
895
    {"Exposure2012", N_("Exposure 2012"), "Real", xmpText, xmpInternal,
896
     N_("Not in XMP Specification. Found in sample files.")},
897
    {"Contrast2012", N_("Contrast 2012"), "Integer", xmpText, xmpInternal,
898
     N_("Not in XMP Specification. Found in sample files.")},
899
    {"Highlights2012", N_("Highlights 2012"), "Integer", xmpText, xmpInternal,
900
     N_("Not in XMP Specification. Found in sample files.")},
901
    {"Shadows2012", N_("Shadows 2012"), "Integer", xmpText, xmpInternal,
902
     N_("Not in XMP Specification. Found in sample files.")},
903
    {"Whites2012", N_("Whites 2012"), "Integer", xmpText, xmpInternal,
904
     N_("Not in XMP Specification. Found in sample files.")},
905
    {"Blacks2012", N_("Blacks 2012"), "Integer", xmpText, xmpInternal,
906
     N_("Not in XMP Specification. Found in sample files.")},
907
    {"Clarity2012", N_("Clarity 2012"), "Integer", xmpText, xmpInternal,
908
     N_("Not in XMP Specification. Found in sample files.")},
909
    {"PostCropVignetteHighlightContrast", N_("Post Crop Vignette Highlight Contrast"), "Integer", xmpText, xmpInternal,
910
     N_("Not in XMP Specification. Found in sample files.")},
911
    {"ToneCurveName2012", N_("Tone Curve Name 2012"), "Text", xmpText, xmpInternal,
912
     N_("Values: Linear, Medium Contrast, Strong Contrast, Custom. Not in XMP Specification. Found in sample "
913
        "files.")},
914
    {"ToneCurveRed", N_("Tone Curve Red"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
915
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
916
    {"ToneCurveGreen", N_("Tone Curve Green"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
917
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
918
    {"ToneCurveBlue", N_("Tone Curve Blue"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
919
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
920
    {"ToneCurvePV2012", N_("Tone Curve PV 2012"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
921
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
922
    {"ToneCurvePV2012Red", N_("Tone Curve PV 2012 Red"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
923
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
924
    {"ToneCurvePV2012Green", N_("Tone Curve PV 2012 Green"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
925
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
926
    {"ToneCurvePV2012Blue", N_("Tone Curve PV 2012 Blue"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
927
     N_("Array of points (Integer, Integer) defining a \"Tone Curve\".")},
928
    {"DefringePurpleAmount", N_("Defringe Purple Amount"), "Integer", xmpText, xmpInternal,
929
     N_("Not in XMP Specification. Found in sample files.")},
930
    {"DefringePurpleHueLo", N_("Defringe Purple Hue Lo"), "Integer", xmpText, xmpInternal,
931
     N_("Not in XMP Specification. Found in sample files.")},
932
    {"DefringePurpleHueHi", N_("Defringe Purple Hue Hi"), "Integer", xmpText, xmpInternal,
933
     N_("Not in XMP Specification. Found in sample files.")},
934
    {"DefringeGreenAmount", N_("Defringe Green Amount"), "Integer", xmpText, xmpInternal,
935
     N_("Not in XMP Specification. Found in sample files.")},
936
    {"DefringeGreenHueLo", N_("Defringe Green Hue Lo"), "Integer", xmpText, xmpInternal,
937
     N_("Not in XMP Specification. Found in sample files.")},
938
    {"DefringeGreenHueHi", N_("Defringe Green Hue Hi"), "Integer", xmpText, xmpInternal,
939
     N_("Not in XMP Specification. Found in sample files.")},
940
    {"AutoWhiteVersion", N_("Defringe Green Hue Hi"), "Integer", xmpText, xmpInternal,
941
     N_("Not in XMP Specification. Found in sample files.")},
942
    {"ColorNoiseReductionSmoothness", N_("Color Noise Reduction Smoothness"), "Integer", xmpText, xmpInternal,
943
     N_("Not in XMP Specification. Found in sample files.")},
944
    {"PerspectiveAspect", N_("Perspective Aspect"), "Integer", xmpText, xmpInternal,
945
     N_("Not in XMP Specification. Found in sample files.")},
946
    {"PerspectiveUpright", N_("Perspective Upright"), "Integer", xmpText, xmpInternal,
947
     N_("Not in XMP Specification. Found in sample files.")},
948
    {"UprightVersion", N_("Upright Version"), "Integer", xmpText, xmpInternal,
949
     N_("Not in XMP Specification. Found in sample files.")},
950
    {"UprightCenterMode", N_("Upright Center Mode"), "Integer", xmpText, xmpInternal,
951
     N_("Not in XMP Specification. Found in sample files.")},
952
    {"UprightCenterNormX", N_("Upright Center Norm X"), "Real", xmpText, xmpInternal,
953
     N_("Not in XMP Specification. Found in sample files.")},
954
    {"UprightCenterNormY", N_("Upright Center Norm Y"), "Real", xmpText, xmpInternal,
955
     N_("Not in XMP Specification. Found in sample files.")},
956
    {"UprightFocalMode", N_("Upright Focal Mode"), "Integer", xmpText, xmpInternal,
957
     N_("Not in XMP Specification. Found in sample files.")},
958
    {"UprightFocalLength35mm", N_("Upright Focal Length 35mm"), "Real", xmpText, xmpInternal,
959
     N_("Not in XMP Specification. Found in sample files.")},
960
    {"UprightPreview", N_("Upright Preview"), "Boolean", xmpText, xmpInternal,
961
     N_("Not in XMP Specification. Found in sample files.")},
962
    {"UprightTransformCount", N_("Upright TransformCount"), "Integer", xmpText, xmpInternal,
963
     N_("Not in XMP Specification. Found in sample files.")},
964
    {"UprightDependentDigest", N_("Upright DependentDigest"), "Text", xmpText, xmpInternal,
965
     N_("Not in XMP Specification. Found in sample files.")},
966
    {"UprightTransform_0", N_("Upright Transform_0"), "Text", xmpText, xmpInternal,
967
     N_("Not in XMP Specification. Found in sample files.")},
968
    {"UprightTransform_1", N_("Upright Transform_1"), "Text", xmpText, xmpInternal,
969
     N_("Not in XMP Specification. Found in sample files.")},
970
    {"UprightTransform_2", N_("Upright Transform_2"), "Text", xmpText, xmpInternal,
971
     N_("Not in XMP Specification. Found in sample files.")},
972
    {"UprightTransform_3", N_("Upright Transform_3"), "Text", xmpText, xmpInternal,
973
     N_("Not in XMP Specification. Found in sample files.")},
974
    {"UprightTransform_4", N_("Upright Transform_4"), "Text", xmpText, xmpInternal,
975
     N_("Not in XMP Specification. Found in sample files.")},
976
    {"LensProfileMatchKeyExifMake", N_("Lens Profile Match Key Exif Make"), "Text", xmpText, xmpInternal,
977
     N_("Not in XMP Specification. Found in sample files.")},
978
    {"LensProfileMatchKeyExifModel", N_("Lens Profile Match Key Exif Model"), "Text", xmpText, xmpInternal,
979
     N_("Not in XMP Specification. Found in sample files.")},
980
    {"LensProfileMatchKeyCameraModelName", N_("Lens Profile Match Key Camera Model Name"), "Text", xmpText, xmpInternal,
981
     N_("Not in XMP Specification. Found in sample files.")},
982
    {"LensProfileMatchKeyLensInfo", N_("Lens Profile Match Key Lens Info"), "Text", xmpText, xmpInternal,
983
     N_("Not in XMP Specification. Found in sample files.")},
984
    {"LensProfileMatchKeyLensID", N_("Lens Profile Match Key Lens ID"), "Text", xmpText, xmpInternal,
985
     N_("Not in XMP Specification. Found in sample files.")},
986
    {"LensProfileMatchKeyLensName", N_("Lens Profile Match Key Lens Name"), "Text", xmpText, xmpInternal,
987
     N_("Not in XMP Specification. Found in sample files.")},
988
    {"LensProfileMatchKeyIsRaw", N_("Lens Profile Match Key Is Raw"), "Boolean", xmpText, xmpInternal,
989
     N_("Not in XMP Specification. Found in sample files.")},
990
    {"LensProfileMatchKeySensorFormatFactor", N_("Lens Profile Match Key Sensor Format Factor"), "Real", xmpText,
991
     xmpInternal, N_("Not in XMP Specification. Found in sample files.")},
992
    {"DefaultAutoTone", N_("Default Auto Tone"), "Boolean", xmpText, xmpInternal,
993
     N_("Not in XMP Specification. Found in sample files.")},
994
    {"DefaultAutoGray", N_("DefaultAuto Gray"), "Boolean", xmpText, xmpInternal,
995
     N_("Not in XMP Specification. Found in sample files.")},
996
    {"DefaultsSpecificToSerial", N_("Defaults Specific To Serial"), "Boolean", xmpText, xmpInternal,
997
     N_("Not in XMP Specification. Found in sample files.")},
998
    {"DefaultsSpecificToISO", N_("Defaults Specific To ISO"), "Boolean", xmpText, xmpInternal,
999
     N_("Not in XMP Specification. Found in sample files.")},
1000
    {"DNGIgnoreSidecars", N_("DNG IgnoreSidecars"), "Boolean", xmpText, xmpInternal,
1001
     N_("Not in XMP Specification. Found in sample files.")},
1002
    {"NegativeCachePath", N_("Negative Cache Path"), "Text", xmpText, xmpInternal,
1003
     N_("Not in XMP Specification. Found in sample files.")},
1004
    {"NegativeCacheMaximumSize", N_("Negative Cache Maximum Size"), "Real", xmpText, xmpInternal,
1005
     N_("Not in XMP Specification. Found in sample files.")},
1006
    {"NegativeCacheLargePreviewSize", N_("Negative Cache Large Preview Size"), "Integer", xmpText, xmpInternal,
1007
     N_("Not in XMP Specification. Found in sample files.")},
1008
    {"JPEGHandling", N_("JPEG Handling"), "Text", xmpText, xmpInternal,
1009
     N_("Not in XMP Specification. Found in sample files.")},
1010
    {"TIFFHandling", N_("TIFF Handling"), "Text", xmpText, xmpInternal,
1011
     N_("Not in XMP Specification. Found in sample files.")},
1012
    // Corrections root structure properties
1013
    {"CircularGradientBasedCorrections", N_("CircularGradientBasedCorrections"), "CircularGradientBasedCorrections",
1014
     xmpText, xmpInternal, N_("*Root structure* ")},
1015
    {"PaintBasedCorrections", N_("PaintBasedCorrections"), "PaintBasedCorrections", xmpText, xmpInternal,
1016
     N_("*Root structure* ")},
1017
    {"CorrectionMasks", N_("CorrectionMasks"), "CorrectionMasks", xmpText, xmpInternal, N_("*sub Root structure* ")},
1018
    // Corrections child properties
1019
    {"What", N_("What"), "Text", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1020
    {"MaskValue", N_("Mask Value"), "Real", xmpText, xmpExternal,
1021
     N_("Not in XMP Specification. Found in sample files.")},
1022
    {"Radius", N_("Radius"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1023
    {"Flow", N_("Flow"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1024
    {"CenterWeight", N_("Center Weight"), "Real", xmpText, xmpExternal,
1025
     N_("Not in XMP Specification. Found in sample files.")},
1026
    {"Dabs", N_("Dabs"), "Seq of points (Integer, Integer)", xmpText, xmpInternal,
1027
     N_("Array of points (Integer, Integer).")},
1028
    {"ZeroX", N_("Zero X"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1029
    {"ZeroY", N_("Zero Y"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1030
    {"FullX", N_("Full X"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1031
    {"FullY", N_("Full Y"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1032
    {"Top", N_("Top"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1033
    {"Left", N_("Left"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1034
    {"Bottom", N_("Bottom"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1035
    {"Right", N_("Right"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1036
    {"Angle", N_("Angle"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1037
    {"Midpoint", N_("Midpoint"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1038
    {"Roundness", N_("Roundness"), "Real", xmpText, xmpExternal,
1039
     N_("Not in XMP Specification. Found in sample files.")},
1040
    {"Feather", N_("Feather"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1041
    {"Flipped", N_("Flipped"), "Boolean", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1042
    {"Version", N_("Version"), "Integer", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1043
    {"SizeX", N_("Size X"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1044
    {"SizeY", N_("Size Y"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1045
    {"X", N_("X"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1046
    {"Y", N_("Y"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1047
    {"Alpha", N_("Alpha"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1048
    {"CenterValue", N_("Center Value"), "Real", xmpText, xmpExternal,
1049
     N_("Not in XMP Specification. Found in sample files.")},
1050
    {"PerimeterValue", N_("Perimeter Value"), "Real", xmpText, xmpExternal,
1051
     N_("Not in XMP Specification. Found in sample files.")},
1052
    // Retouch root structure properties
1053
    {"RetouchAreas", N_("RetouchAreas"), "RetouchAreas", xmpText, xmpInternal, N_("*Root structure* ")},
1054
    // Retouch child properties
1055
    {"SpotType", N_("Spot Type"), "Text", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1056
    {"SourceState", N_("Source State"), "Text", xmpText, xmpExternal,
1057
     N_("Not in XMP Specification. Found in sample files.")},
1058
    {"Method", N_("Method"), "Text", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1059
    {"SourceX", N_("Source X"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1060
    {"OffsetY", N_("Offset Y"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1061
    {"Opacity", N_("Opacity"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1062
    {"Feather", N_("Feather"), "Real", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1063
    {"Seed", N_("Seed"), "Integer", xmpText, xmpExternal, N_("Not in XMP Specification. Found in sample files.")},
1064
    // End of list marker
1065
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1066
};
1067
1068
const XmpPropertyInfo xmpTiffInfo[] = {
1069
    {"ImageWidth", N_("Image Width"), "Integer", xmpText, xmpInternal,
1070
     N_("TIFF tag 256, 0x100. Image width in pixels.")},
1071
    {"ImageLength", N_("Image Length"), "Integer", xmpText, xmpInternal,
1072
     N_("TIFF tag 257, 0x101. Image height in pixels.")},
1073
    {"BitsPerSample", N_("Bits Per Sample"), "seq Integer", xmpSeq, xmpInternal,
1074
     N_("TIFF tag 258, 0x102. Number of bits per component in each channel.")},
1075
    {"Compression", N_("Compression"), "Closed Choice of Integer", xmpText, xmpInternal,
1076
     N_("TIFF tag 259, 0x103. Compression scheme: 1 = uncompressed; 6 = JPEG.")},
1077
    {"PhotometricInterpretation", N_("Photometric Interpretation"), "Closed Choice of Integer", xmpText, xmpInternal,
1078
     N_("TIFF tag 262, 0x106. Pixel Composition: 2 = RGB; 6 = YCbCr.")},
1079
    {"Orientation", N_("Orientation"), "Closed Choice of Integer", xmpText, xmpInternal,
1080
     N_("TIFF tag 274, 0x112. Orientation:"
1081
        "1 = 0th row at top, 0th column at left "
1082
        "2 = 0th row at top, 0th column at right "
1083
        "3 = 0th row at bottom, 0th column at right "
1084
        "4 = 0th row at bottom, 0th column at left "
1085
        "5 = 0th row at left, 0th column at top "
1086
        "6 = 0th row at right, 0th column at top "
1087
        "7 = 0th row at right, 0th column at bottom "
1088
        "8 = 0th row at left, 0th column at bottom")},
1089
    {"SamplesPerPixel", N_("Samples Per Pixel"), "Integer", xmpText, xmpInternal,
1090
     N_("TIFF tag 277, 0x115. Number of components per pixel.")},
1091
    {"PlanarConfiguration", N_("Planar Configuration"), "Closed Choice of Integer", xmpText, xmpInternal,
1092
     N_("TIFF tag 284, 0x11C. Data layout:1 = chunky; 2 = planar.")},
1093
    {"YCbCrSubSampling", N_("YCbCr Sub Sampling"), "Closed Choice of seq Integer", xmpSeq, xmpInternal,
1094
     N_("TIFF tag 530, 0x212. Sampling ratio of chrominance "
1095
        "components: [2, 1] = YCbCr4:2:2; [2, 2] = YCbCr4:2:0")},
1096
    {"YCbCrPositioning", N_("YCbCr Positioning"), "Closed Choice of Integer", xmpText, xmpInternal,
1097
     N_("TIFF tag 531, 0x213. Position of chrominance vs. "
1098
        "luminance components: 1 = centered; 2 = co-sited.")},
1099
    {"XResolution", N_("X Resolution"), "Rational", xmpText, xmpInternal,
1100
     N_("TIFF tag 282, 0x11A. Horizontal resolution in pixels per unit.")},
1101
    {"YResolution", N_("Y Resolution"), "Rational", xmpText, xmpInternal,
1102
     N_("TIFF tag 283, 0x11B. Vertical resolution in pixels per unit.")},
1103
    {"ResolutionUnit", N_("Resolution Unit"), "Closed Choice of Integer", xmpText, xmpInternal,
1104
     N_("TIFF tag 296, 0x128. Unit used for XResolution and "
1105
        "YResolution. Value is one of: 2 = inches; 3 = centimeters.")},
1106
    {"TransferFunction", N_("Transfer Function"), "seq Integer", xmpSeq, xmpInternal,
1107
     N_("TIFF tag 301, 0x12D. Transfer function for image "
1108
        "described in tabular style with 3 * 256 entries.")},
1109
    {"WhitePoint", N_("White Point"), "seq Rational", xmpSeq, xmpInternal,
1110
     N_("TIFF tag 318, 0x13E. Chromaticity of white point.")},
1111
    {"PrimaryChromaticities", N_("Primary Chromaticities"), "seq Rational", xmpSeq, xmpInternal,
1112
     N_("TIFF tag 319, 0x13F. Chromaticity of the three primary colors.")},
1113
    {"YCbCrCoefficients", N_("YCbCr Coefficients"), "seq Rational", xmpSeq, xmpInternal,
1114
     N_("TIFF tag 529, 0x211. Matrix coefficients for RGB to YCbCr transformation.")},
1115
    {"ReferenceBlackWhite", N_("Reference Black White"), "seq Rational", xmpSeq, xmpInternal,
1116
     N_("TIFF tag 532, 0x214. Reference black and white point values.")},
1117
    {"DateTime", N_("Date and Time"), "Date", xmpText, xmpInternal,
1118
     N_("TIFF tag 306, 0x132 (primary) and EXIF tag 37520, "
1119
        "0x9290 (subseconds). Date and time of image creation "
1120
        "(no time zone in EXIF), stored in ISO 8601 format, not "
1121
        "the original EXIF format. This property includes the "
1122
        "value for the EXIF SubSecTime attribute. "
1123
        "NOTE: This property is stored in XMP as xmp:ModifyDate.")},
1124
    {"ImageDescription", N_("Image Description"), "Lang Alt", langAlt, xmpExternal,
1125
     N_("TIFF tag 270, 0x10E. Description of the image. Note: This property is stored in XMP as dc:description.")},
1126
    {"Make", N_("Make"), "ProperName", xmpText, xmpInternal,
1127
     N_("TIFF tag 271, 0x10F. Manufacturer of recording equipment.")},
1128
    {"Model", N_("Model"), "ProperName", xmpText, xmpInternal,
1129
     N_("TIFF tag 272, 0x110. Model name or number of equipment.")},
1130
    {"Software", N_("Software"), "AgentName", xmpText, xmpInternal,
1131
     N_("TIFF tag 305, 0x131. Software or firmware used to generate image. "
1132
        "Note: This property is stored in XMP as xmp:CreatorTool.")},
1133
    {"Artist", N_("Artist"), "ProperName", xmpText, xmpExternal,
1134
     N_("TIFF tag 315, 0x13B. Camera owner, photographer or image creator. "
1135
        "Note: This property is stored in XMP as the first item in the dc:creator array.")},
1136
    {"Copyright", N_("Copyright"), "Lang Alt", langAlt, xmpExternal,
1137
     N_("TIFF tag 33432, 0x8298. Copyright information. "
1138
        "Note: This property is stored in XMP as dc:rights.")},
1139
    // End of list marker
1140
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1141
};
1142
1143
const XmpPropertyInfo xmpExifInfo[] = {
1144
    {"ExifVersion", N_("Exif Version"), "Closed Choice of Text", xmpText, xmpInternal,
1145
     N_("EXIF tag 36864, 0x9000. EXIF version number.")},
1146
    {"FlashpixVersion", N_("Flashpix Version"), "Closed Choice of Text", xmpText, xmpInternal,
1147
     N_("EXIF tag 40960, 0xA000. Version of FlashPix.")},
1148
    {"ColorSpace", N_("Color Space"), "Closed Choice of Integer", xmpText, xmpInternal,
1149
     N_("EXIF tag 40961, 0xA001. Color space information")},
1150
    {"ComponentsConfiguration", N_("Components Configuration"), "Closed Choice of seq Integer", xmpSeq, xmpInternal,
1151
     N_("EXIF tag 37121, 0x9101. Configuration of components in data: 4 5 6 0 (if RGB compressed data), "
1152
        "1 2 3 0 (other cases).")},
1153
    {"CompressedBitsPerPixel", N_("Compressed Bits Per Pixel"), "Rational", xmpText, xmpInternal,
1154
     N_("EXIF tag 37122, 0x9102. Compression mode used for a compressed image is indicated "
1155
        "in unit bits per pixel.")},
1156
    {"PixelXDimension", N_("Pixel X Dimension"), "Integer", xmpText, xmpInternal,
1157
     N_("EXIF tag 40962, 0xA002. Valid image width, in pixels.")},
1158
    {"PixelYDimension", N_("Pixel Y Dimension"), "Integer", xmpText, xmpInternal,
1159
     N_("EXIF tag 40963, 0xA003. Valid image height, in pixels.")},
1160
    {"UserComment", N_("User Comment"), "Lang Alt", langAlt, xmpExternal,
1161
     N_("EXIF tag 37510, 0x9286. Comments from user.")},
1162
    {"RelatedSoundFile", N_("Related Sound File"), "Text", xmpText, xmpInternal,
1163
     N_("EXIF tag 40964, 0xA004. An \"8.3\" file name for the related sound file.")},
1164
    {"DateTimeOriginal", N_("Date and Time Original"), "Date", xmpText, xmpInternal,
1165
     N_("EXIF tags 36867, 0x9003 (primary) and 37521, 0x9291 (subseconds). "
1166
        "Date and time when original image was generated, in ISO 8601 format. "
1167
        "Includes the EXIF SubSecTimeOriginal data.")},
1168
    {"DateTimeDigitized", N_("Date and Time Digitized"), "Date", xmpText, xmpInternal,
1169
     N_("EXIF tag 36868, 0x9004 (primary) and 37522, 0x9292 (subseconds). Date and time when "
1170
        "image was stored as digital data, can be the same as DateTimeOriginal if originally "
1171
        "stored in digital form. Stored in ISO 8601 format. Includes the EXIF "
1172
        "SubSecTimeDigitized data.")},
1173
    {"ExposureTime", N_("Exposure Time"), "Rational", xmpText, xmpInternal,
1174
     N_("EXIF tag 33434, 0x829A. Exposure time in seconds.")},
1175
    {"FNumber", N_("F Number"), "Rational", xmpText, xmpInternal, N_("EXIF tag 33437, 0x829D. F number.")},
1176
    {"ExposureProgram", N_("Exposure Program"), "Closed Choice of Integer", xmpText, xmpInternal,
1177
     N_("EXIF tag 34850, 0x8822. Class of program used for exposure.")},
1178
    {"SpectralSensitivity", N_("Spectral Sensitivity"), "Text", xmpText, xmpInternal,
1179
     N_("EXIF tag 34852, 0x8824. Spectral sensitivity of each channel.")},
1180
    {"ISOSpeedRatings", N_("ISOSpeedRatings"), "seq Integer", xmpSeq, xmpInternal,
1181
     N_("EXIF tag 34855, 0x8827. ISO Speed and ISO Latitude of the input device as "
1182
        "specified in ISO 12232.")},
1183
    {"OECF", N_("OECF"), "OECF/SFR", xmpText, xmpInternal,
1184
     N_("EXIF tag 34856, 0x8828. Opto-Electoric Conversion Function as specified in ISO 14524.")},
1185
    {"ShutterSpeedValue", N_("Shutter Speed Value"), "Rational", xmpText, xmpInternal,
1186
     N_("EXIF tag 37377, 0x9201. Shutter speed, unit is APEX. See Annex C of the EXIF specification.")},
1187
    {"ApertureValue", N_("Aperture Value"), "Rational", xmpText, xmpInternal,
1188
     N_("EXIF tag 37378, 0x9202. Lens aperture, unit is APEX.")},
1189
    {"BrightnessValue", N_("Brightness Value"), "Rational", xmpText, xmpInternal,
1190
     N_("EXIF tag 37379, 0x9203. Brightness, unit is APEX.")},
1191
    {"ExposureBiasValue", N_("Exposure Bias Value"), "Rational", xmpText, xmpInternal,
1192
     N_("EXIF tag 37380, 0x9204. Exposure bias, unit is APEX.")},
1193
    {"MaxApertureValue", N_("Maximum Aperture Value"), "Rational", xmpText, xmpInternal,
1194
     N_("EXIF tag 37381, 0x9205. Smallest F number of lens, in APEX.")},
1195
    {"SubjectDistance", N_("Subject Distance"), "Rational", xmpText, xmpInternal,
1196
     N_("EXIF tag 37382, 0x9206. Distance to subject, in meters.")},
1197
    {"MeteringMode", N_("Metering Mode"), "Closed Choice of Integer", xmpText, xmpInternal,
1198
     N_("EXIF tag 37383, 0x9207. Metering mode.")},
1199
    {"LightSource", N_("Light Source"), "Closed Choice of Integer", xmpText, xmpInternal,
1200
     N_("EXIF tag 37384, 0x9208. Light source.")},
1201
    {"Flash", N_("Flash"), "Flash", xmpText, xmpInternal,
1202
     N_("EXIF tag 37385, 0x9209. Strobe light (flash) source data.")},
1203
    {"FocalLength", N_("Focal Length"), "Rational", xmpText, xmpInternal,
1204
     N_("EXIF tag 37386, 0x920A. Focal length of the lens, in millimeters.")},
1205
    {"SubjectArea", N_("Subject Area"), "seq Integer", xmpSeq, xmpInternal,
1206
     N_("EXIF tag 37396, 0x9214. The location and area of the main subject in the overall scene.")},
1207
    {"FlashEnergy", N_("Flash Energy"), "Rational", xmpText, xmpInternal,
1208
     N_("EXIF tag 41483, 0xA20B. Strobe energy during image capture.")},
1209
    {"SpatialFrequencyResponse", N_("Spatial Frequency Response"), "OECF/SFR", xmpText, xmpInternal,
1210
     N_("EXIF tag 41484, 0xA20C. Input device spatial frequency table and SFR values as "
1211
        "specified in ISO 12233.")},
1212
    {"FocalPlaneXResolution", N_("Focal Plane X Resolution"), "Rational", xmpText, xmpInternal,
1213
     N_("EXIF tag 41486, 0xA20E. Horizontal focal resolution, measured pixels per unit.")},
1214
    {"FocalPlaneYResolution", N_("Focal Plane Y Resolution"), "Rational", xmpText, xmpInternal,
1215
     N_("EXIF tag 41487, 0xA20F. Vertical focal resolution, measured in pixels per unit.")},
1216
    {"FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"), "Closed Choice of Integer", xmpText, xmpInternal,
1217
     N_("EXIF tag 41488, 0xA210. Unit used for FocalPlaneXResolution and FocalPlaneYResolution.")},
1218
    {"SubjectLocation", N_("Subject Location"), "seq Integer", xmpSeq, xmpInternal,
1219
     N_("EXIF tag 41492, 0xA214. Location of the main subject of the scene. The first value is the "
1220
        "horizontal pixel and the second value is the vertical pixel at which the "
1221
        "main subject appears.")},
1222
    {"ExposureIndex", N_("Exposure Index"), "Rational", xmpText, xmpInternal,
1223
     N_("EXIF tag 41493, 0xA215. Exposure index of input device.")},
1224
    {"SensingMethod", N_("Sensing Method"), "Closed Choice of Integer", xmpText, xmpInternal,
1225
     N_("EXIF tag 41495, 0xA217. Image sensor type on input device.")},
1226
    {"FileSource", N_("File Source"), "Closed Choice of Integer", xmpText, xmpInternal,
1227
     N_("EXIF tag 41728, 0xA300. Indicates image source.")},
1228
    {"SceneType", N_("Scene Type"), "Closed Choice of Integer", xmpText, xmpInternal,
1229
     N_("EXIF tag 41729, 0xA301. Indicates the type of scene.")},
1230
    {"CFAPattern", N_("CFA Pattern"), "CFAPattern", xmpText, xmpInternal,
1231
     N_("EXIF tag 41730, 0xA302. Color filter array geometric pattern of the image sense.")},
1232
    {"CustomRendered", N_("Custom Rendered"), "Closed Choice of Integer", xmpText, xmpInternal,
1233
     N_("EXIF tag 41985, 0xA401. Indicates the use of special processing on image data.")},
1234
    {"ExposureMode", N_("Exposure Mode"), "Closed Choice of Integer", xmpText, xmpInternal,
1235
     N_("EXIF tag 41986, 0xA402. Indicates the exposure mode set when the image was shot.")},
1236
    {"WhiteBalance", N_("White Balance"), "Closed Choice of Integer", xmpText, xmpInternal,
1237
     N_("EXIF tag 41987, 0xA403. Indicates the white balance mode set when the image was shot.")},
1238
    {"DigitalZoomRatio", N_("Digital Zoom Ratio"), "Rational", xmpText, xmpInternal,
1239
     N_("EXIF tag 41988, 0xA404. Indicates the digital zoom ratio when the image was shot.")},
1240
    {"FocalLengthIn35mmFilm", N_("Focal Length In 35mm Film"), "Integer", xmpText, xmpInternal,
1241
     N_("EXIF tag 41989, 0xA405. Indicates the equivalent focal length assuming a 35mm film "
1242
        "camera, in mm. A value of 0 means the focal length is unknown. Note that this tag "
1243
        "differs from the FocalLength tag.")},
1244
    {"SceneCaptureType", N_("Scene Capture Type"), "Closed Choice of Integer", xmpText, xmpInternal,
1245
     N_("EXIF tag 41990, 0xA406. Indicates the type of scene that was shot.")},
1246
    {"GainControl", N_("Gain Control"), "Closed Choice of Integer", xmpText, xmpInternal,
1247
     N_("EXIF tag 41991, 0xA407. Indicates the degree of overall image gain adjustment.")},
1248
    {"Contrast", N_("Contrast"), "Closed Choice of Integer", xmpText, xmpInternal,
1249
     N_("EXIF tag 41992, 0xA408. Indicates the direction of contrast processing applied by the camera.")},
1250
    {"Saturation", N_("Saturation"), "Closed Choice of Integer", xmpText, xmpInternal,
1251
     N_("EXIF tag 41993, 0xA409. Indicates the direction of saturation processing applied by the camera.")},
1252
    {"Sharpness", N_("Sharpness"), "Closed Choice of Integer", xmpText, xmpInternal,
1253
     N_("EXIF tag 41994, 0xA40A. Indicates the direction of sharpness processing applied by the camera.")},
1254
    {"DeviceSettingDescription", N_("Device Setting Description"), "DeviceSettings", xmpText, xmpInternal,
1255
     N_("EXIF tag 41995, 0xA40B. Indicates information on the picture-taking conditions of a particular camera "
1256
        "model.")},
1257
    {"SubjectDistanceRange", N_("Subject Distance Range"), "Closed Choice of Integer", xmpText, xmpInternal,
1258
     N_("EXIF tag 41996, 0xA40C. Indicates the distance to the subject.")},
1259
    {"ImageUniqueID", N_("Image Unique ID"), "Text", xmpText, xmpInternal,
1260
     N_("EXIF tag 42016, 0xA420. An identifier assigned uniquely to each image. It is recorded as a 32 "
1261
        "character ASCII string, equivalent to hexadecimal notation and 128-bit fixed length.")},
1262
    {"GPSVersionID", N_("GPS Version ID"), "Text", xmpText, xmpInternal,
1263
     N_("GPS tag 0, 0x00. A decimal encoding of each of the four EXIF bytes with period separators. "
1264
        "The current value is \"2.0.0.0\".")},
1265
    {"GPSLatitude", N_("GPS Latitude"), "GPSCoordinate", xmpText, xmpInternal,
1266
     N_("GPS tag 2, 0x02 (position) and 1, 0x01 (North/South). Indicates latitude.")},
1267
    {"GPSLongitude", N_("GPS Longitude"), "GPSCoordinate", xmpText, xmpInternal,
1268
     N_("GPS tag 4, 0x04 (position) and 3, 0x03 (East/West). Indicates longitude.")},
1269
    {"GPSAltitudeRef", N_("GPS Altitude Reference"), "Closed Choice of Integer", xmpText, xmpInternal,
1270
     N_("GPS tag 5, 0x05. Indicates whether the altitude is above or below sea level.")},
1271
    {"GPSAltitude", N_("GPS Altitude"), "Rational", xmpText, xmpInternal,
1272
     N_("GPS tag 6, 0x06. Indicates altitude in meters.")},
1273
    {"GPSTimeStamp", N_("GPS Time Stamp"), "Date", xmpText, xmpInternal,
1274
     N_("GPS tag 29 (date), 0x1D, and, and GPS tag 7 (time), 0x07. Time stamp of GPS data, "
1275
        "in Coordinated Universal Time. Note: The GPSDateStamp tag is new in EXIF 2.2. "
1276
        "The GPS timestamp in EXIF 2.1 does not include a date. If not present, "
1277
        "the date component for the XMP should be taken from exif:DateTimeOriginal, or if that is "
1278
        "also lacking from exif:DateTimeDigitized. If no date is available, do not write "
1279
        "exif:GPSTimeStamp to XMP.")},
1280
    {"GPSSatellites", N_("GPS Satellites"), "Text", xmpText, xmpInternal,
1281
     N_("GPS tag 8, 0x08. Satellite information, format is unspecified.")},
1282
    {"GPSStatus", N_("GPS Status"), "Closed Choice of Text", xmpText, xmpInternal,
1283
     N_("GPS tag 9, 0x09. Status of GPS receiver at image creation time.")},
1284
    {"GPSMeasureMode", N_("GPS Measure Mode"), "Text", xmpText, xmpInternal,
1285
     N_("GPS tag 10, 0x0A. GPS measurement mode, Text type.")},
1286
    {"GPSDOP", N_("GPS DOP"), "Rational", xmpText, xmpInternal,
1287
     N_("GPS tag 11, 0x0B. Degree of precision for GPS data.")},
1288
    {"GPSSpeedRef", N_("GPS Speed Reference"), "Closed Choice of Text", xmpText, xmpInternal,
1289
     N_("GPS tag 12, 0x0C. Units used to speed measurement.")},
1290
    {"GPSSpeed", N_("GPS Speed"), "Rational", xmpText, xmpInternal,
1291
     N_("GPS tag 13, 0x0D. Speed of GPS receiver movement.")},
1292
    {"GPSTrackRef", N_("GPS Track Reference"), "Closed Choice of Text", xmpText, xmpInternal,
1293
     N_("GPS tag 14, 0x0E. Reference for movement direction.")},
1294
    {"GPSTrack", N_("GPS Track"), "Rational", xmpText, xmpInternal,
1295
     N_("GPS tag 15, 0x0F. Direction of GPS movement, values range from 0 to 359.99.")},
1296
    {"GPSImgDirectionRef", N_("GPS Image Direction Reference"), "Closed Choice of Text", xmpText, xmpInternal,
1297
     N_("GPS tag 16, 0x10. Reference for image direction.")},
1298
    {"GPSImgDirection", N_("GPS Image Direction"), "Rational", xmpText, xmpInternal,
1299
     N_("GPS tag 17, 0x11. Direction of image when captured, values range from 0 to 359.99.")},
1300
    {"GPSMapDatum", N_("GPS Map Datum"), "Text", xmpText, xmpInternal, N_("GPS tag 18, 0x12. Geodetic survey data.")},
1301
    {"GPSDestLatitude", N_("GPS Destination Latitude"), "GPSCoordinate", xmpText, xmpInternal,
1302
     N_("GPS tag 20, 0x14 (position) and 19, 0x13 (North/South). Indicates destination latitude.")},
1303
    {"GPSDestLongitude", N_("GPS Destination Longitude"), "GPSCoordinate", xmpText, xmpInternal,
1304
     N_("GPS tag 22, 0x16 (position) and 21, 0x15 (East/West). Indicates destination longitude.")},
1305
    {"GPSDestBearingRef", N_("GPS Destination Bearing Reference"), "Closed Choice of Text", xmpText, xmpInternal,
1306
     N_("GPS tag 23, 0x17. Reference for movement direction.")},
1307
    {"GPSDestBearing", N_("GPS Destination Bearing"), "Rational", xmpText, xmpInternal,
1308
     N_("GPS tag 24, 0x18. Destination bearing, values from 0 to 359.99.")},
1309
    {"GPSDestDistanceRef", N_("GPS Destination Distance Reference"), "Closed Choice  of Text", xmpText, xmpInternal,
1310
     N_("GPS tag 25, 0x19. Units used for speed measurement.")},
1311
    {"GPSDestDistance", N_("GPS Destination Distance"), "Rational", xmpText, xmpInternal,
1312
     N_("GPS tag 26, 0x1A. Distance to destination.")},
1313
    {"GPSProcessingMethod", N_("GPS Processing Method"), "Text", xmpText, xmpInternal,
1314
     N_("GPS tag 27, 0x1B. A character string recording the name of the method used for location finding.")},
1315
    {"GPSAreaInformation", N_("GPS Area Information"), "Text", xmpText, xmpInternal,
1316
     N_("GPS tag 28, 0x1C. A character string recording the name of the GPS area.")},
1317
    {"GPSDifferential", N_("GPS Differential"), "Closed Choice of Integer", xmpText, xmpInternal,
1318
     N_("GPS tag 30, 0x1E. Indicates whether differential correction is applied to the GPS receiver.")},
1319
    // End of list marker
1320
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1321
};
1322
1323
const XmpPropertyInfo xmpExifEXInfo[] = {
1324
    {"Gamma", N_("Gamma"), "Rational", xmpText, xmpInternal,
1325
     N_("EXIF tag 42240, 0xA500. Indicates the value of coefficient gamma.")},
1326
    {"PhotographicSensitivity", N_("Photographic Sensitivity"), "Integer", xmpText, xmpInternal,
1327
     N_("EXIF tag 34855, 0x8827. Indicates the sensitivity of the camera or input device when the image was shot "
1328
        "up to the value of 65535 with one of the following parameters that are defined in ISO 12232: standard "
1329
        "output sensitivity (SOS), recommended exposure index (REI), or ISO speed.")},
1330
    {"SensitivityType", N_("Sensitivity Type"), "Closed Choice of Integer", xmpText, xmpInternal,
1331
     N_("EXIF tag 34864, 0x8830. Indicates which one of the parameters of ISO12232 is used for "
1332
        "PhotographicSensitivity:0 = Unknown "
1333
        "1 = Standard output sensitivity (SOS) "
1334
        "2 = Recommended exposure index (REI) "
1335
        "3 = ISO speed "
1336
        "4 = Standard output sensitivity (SOS) and recommended exposure index (REI) "
1337
        "5 = Standard output sensitivity (SOS) and ISO speed "
1338
        "6 = Recommended exposure index (REI) and ISO speed "
1339
        "7 = Standard output sensitivity (SOS) and recommended exposure index (REI) and ISO speed")},
1340
    {"StandardOutput-Sensitivity", N_("Standard Output Sensitivity"), "Integer", xmpText, xmpInternal,
1341
     N_("EXIF tag 34865, 0x8831. Indicates the standard output sensitivity value of a camera or input device "
1342
        "defined in ISO 12232.")},
1343
    {"RecommendedExposureIndex", N_("Recommended Exposure Index"), "Integer", xmpText, xmpInternal,
1344
     N_("EXIF tag 34866, 0x8832. Indicates the recommended exposure index value of a camera or input device "
1345
        "defined in ISO 12232.")},
1346
    {"ISOSpeed", N_("ISO Speed"), "Integer", xmpText, xmpInternal,
1347
     N_("EXIF tag 34867, 0x8833. Indicates the ISO speed value of a camera or input device defined in ISO 12232.")},
1348
    {"ISOSpeedLatitudeyyy", N_("ISO Speed Latitude yyy"), "Integer", xmpText, xmpInternal,
1349
     N_("EXIF tag 34868, 0x8834. Indicates the ISO speed latitude yyy value of a camera or input device defined in "
1350
        "ISO 12232.")},
1351
    {"ISOSpeedLatitudezzz", N_("ISO Speed Latitude zzz"), "Integer", xmpText, xmpInternal,
1352
     N_("EXIF tag 34869, 0x8835. Indicates the ISO speed latitude zzz value of a camera or input device defined in "
1353
        "ISO 12232.")},
1354
    {"CameraOwnerName", N_("Camera Owner Name"), "Proper-Name", xmpText, xmpInternal,
1355
     N_("EXIF tag 42032, 0xA430. This tag records the owner of a camera used in photography as an ASCII string.")},
1356
    {"BodySerialNumber", N_("Body Serial Number"), "Text", xmpText, xmpInternal,
1357
     N_("EXIF tag 42033, 0xA431. The serial number of the camera or camera body used to take the photograph.")},
1358
    {"LensSpecification", N_("Lens Specification"), "Ordered array of Rational", xmpText, xmpInternal,
1359
     N_("EXIF tag 42034, 0xA432. notes minimum focal length, maximum focal length, minimum F number in the minimum "
1360
        "focal length, and minimum F number in the maximum focal length, which are specification information for "
1361
        "the lens that was used in photography.")},
1362
    {"LensMake", N_("Lens Make"), "Proper-Name", xmpText, xmpInternal,
1363
     N_("EXIF tag 42035, 0xA433. Records the lens manufacturer as an ASCII string.")},
1364
    {"LensModel", N_("Lens Model"), "Text", xmpText, xmpInternal,
1365
     N_("EXIF tag 42036, 0xA434. Records the lens's model name and model number as an ASCII string.")},
1366
    {"LensSerialNumber", N_("Lens Serial Number"), "Text", xmpText, xmpInternal,
1367
     N_("EXIF tag 42037, 0xA435. This tag records the serial number of the interchangeable lens that was used in "
1368
        "photography as an ASCII string.")},
1369
1370
    {"InteroperabilityIndex", N_("Interoperability Index"), "Closed Choice of Text", xmpText, xmpInternal,
1371
     N_("EXIF tag 1, 0x0001. Indicates the identification of the Interoperability rule.  "
1372
        "R98 = Indicates a file conforming to R98 file specification of Recommended Exif Interoperability Rules "
1373
        "(Exif R 98) or to DCF basic file stipulated by Design Rule for Camera File System (DCF). "
1374
        "THM = Indicates a file conforming to DCF thumbnail file stipulated by Design rule for Camera File System. "
1375
        "R03 = Indicates a file conforming to DCF Option File stipulated by Design rule for Camera File System.")},
1376
    // End of list marker
1377
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1378
};
1379
1380
const XmpPropertyInfo xmpAuxInfo[] = {
1381
    {"Lens", N_("Lens"), "Text", xmpText, xmpInternal,
1382
     N_("A description of the lens used to take the photograph. For example, \"70-200 mm f/2.8-4.0\".")},
1383
    {"SerialNumber", N_("Serial Number"), "Text", xmpText, xmpInternal,
1384
     N_("The serial number of the camera or camera body used to take the photograph.")},
1385
    // End of list marker
1386
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1387
};
1388
1389
const XmpPropertyInfo xmpIptcInfo[] = {
1390
    {"AltTextAccessibility", N_("Alternative Text (Accessibility)"), "Lang Alt", langAlt, xmpExternal,
1391
     N_("A brief textual description of the purpose and meaning of an image that can be accessed by assistive "
1392
        "technology or displayed when the image is disabled in the browser. It should not exceed 250 characters.")},
1393
    {"CreatorContactInfo", N_("Creator's Contact Info"), "ContactInfo", xmpText, xmpExternal,
1394
     N_("The creator's contact information provides all necessary information to get in contact "
1395
        "with the creator of this image and comprises a set of sub-properties for proper addressing.")},
1396
    {"CiAdrExtadr", N_("Contact Info: Address (deprecated)"), "Text", xmpText, xmpExternal,
1397
     N_("Deprecated, use the CiAdrExtadr tag in ContactInfo struct instead. sub-key Creator Contact Info: address. "
1398
        "Comprises an optional company name and all required "
1399
        "information to locate the building or postbox to which mail should be sent.")},
1400
    {"CiAdrCity", N_("Contact Info-City (deprecated)"), "Text", xmpText, xmpExternal,
1401
     N_("Deprecated, use the CiAdrCity tag in ContactInfo struct instead. sub-key Creator Contact Info: The "
1402
        "contact information city part.")},
1403
    {"CiAdrRegion", N_("Contact Info-State/Province (deprecated)"), "Text", xmpText, xmpExternal,
1404
     N_("Deprecated, use the CiAdrRegion tag in ContactInfo struct instead. sub-key Creator Contact Info: state or "
1405
        "province.")},
1406
    {"CiAdrPcode", N_("Contact Info-Postal Code (deprecated)"), "Text", xmpText, xmpExternal,
1407
     N_("Deprecated, use the CiAdrPcode tag in ContactInfo struct instead. sub-key Creator Contact Info: local "
1408
        "postal code.")},
1409
    {"CiAdrCtry", N_("Contact Info-Country (deprecated)"), "Text", xmpText, xmpExternal,
1410
     N_("Deprecated, use the CiAdrCtry tag in ContactInfo struct instead. sub-key Creator Contact Info: country.")},
1411
    {"CiEmailWork", N_("Contact Info-Email (deprecated)"), "Text", xmpText, xmpExternal,
1412
     N_("Deprecated, use the CiEmailWork tag in ContactInfo struct instead. sub-key Creator Contact Info: email "
1413
        "address.")},
1414
    {"CiTelWork", N_("Contact Info-Phone (deprecated)"), "Text", xmpText, xmpExternal,
1415
     N_("Deprecated, use the CiTelWork tag in ContactInfo struct instead. sub-key Creator Contact Info: phone "
1416
        "number.")},
1417
    {"CiUrlWork", N_("Contact Info-Web URL (deprecated)"), "Text", xmpText, xmpExternal,
1418
     N_("Deprecated, use the CiUrlWork tag in ContactInfo struct instead. sub-key Creator Contact Info: web "
1419
        "address.")},
1420
    {"ExtDescrAccessibility", N_("Extended Description (Accessibility)"), "Lang Alt", langAlt, xmpExternal,
1421
     N_("A more detailed textual description of the purpose and meaning of an image that elaborates on the "
1422
        "information provided by the Alt Text (Accessibility) property. This property does not have a "
1423
        "character limitation and is not required if the Alt Text (Accessibility) field sufficiently describes the "
1424
        "image.")},
1425
    {"IntellectualGenre", N_("Intellectual Genre"), "Text", xmpText, xmpExternal,
1426
     N_("Describes the nature, intellectual, artistic or journalistic characteristic of an image.")},
1427
    {"Scene", N_("IPTC Scene Code"), "bag closed Choice of Text", xmpBag, xmpExternal,
1428
     N_("Describes the scene of a photo content. Specifies one or more terms from the IPTC "
1429
        "\"Scene-NewsCodes\". Each Scene is represented as a string of 6 digits in an unordered list.")},
1430
    {"SubjectCode", N_("IPTC Subject Code"), "bag closed Choice of Text", xmpBag, xmpExternal,
1431
     N_("Specifies one or more Subjects from the IPTC \"Subject-NewsCodes\" taxonomy to "
1432
        "categorize the image. Each Subject is represented as a string of 8 digits in an unordered list.")},
1433
    {"Location", N_("Sublocation (legacy)"), "Text", xmpText, xmpExternal,
1434
     N_("(legacy) Exact name of the sublocation shown in the image. This sublocation name could either be the name "
1435
        "of a sublocation to a city or the name of a well known location or (natural) monument "
1436
        "outside a city. In the sense of a sublocation to a city this element is at the fourth "
1437
        "level of a top-down geographical hierarchy.")},
1438
    {"CountryCode", N_("Country Code (legacy)"), "closed Choice of Text", xmpText, xmpExternal,
1439
     N_("(legacy) Code of the country of the location shown in the image. This element is at the top/first level "
1440
        "of "
1441
        "a top-down geographical hierarchy. The code should be taken from ISO 3166 two or three "
1442
        "letter code. The full name of a country should go in the \"Country\" element.")},
1443
    // End of list marker
1444
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1445
};
1446
1447
const XmpPropertyInfo xmpIptcExtInfo[] = {
1448
    {"AddlModelInfo", N_("Additional model information"), "Text", xmpText, xmpExternal,
1449
     N_("Information about the ethnicity and other facets of the model(s) in a model-released image.")},
1450
    {"OrganisationInImageCode", N_("Code of featured Organisation"), "bag Text", xmpBag, xmpExternal,
1451
     N_("Code from a controlled vocabulary for identifying the organisation or company which is featured in the "
1452
        "image.")},
1453
    {"AboutCvTerm", N_("CV-Term About Image"), "bag CVTerm", xmpBag, xmpExternal,
1454
     N_("One or more topics, themes or entities the content is about, each one expressed by a term from a "
1455
        "Controlled Vocabulary.")},
1456
    {"CVterm", N_("Controlled Vocabulary Term"), "bag URI", xmpBag, xmpExternal,
1457
     N_("A term to describe the content of the image by a value from a Controlled Vocabulary.")},
1458
    {"ModelAge", N_("Model age"), "bag Integer", xmpBag, xmpExternal,
1459
     N_("Age of the human model(s) at the time this image was taken in a model released image.")},
1460
    {"OrganisationInImageName", N_("Name of featured Organisation"), "bag Text", xmpBag, xmpExternal,
1461
     N_("Name of the organisation or company which is featured in the image.")},
1462
    {"PersonInImage", N_("Person shown"), "bag Text", xmpBag, xmpExternal, N_("Name of a person shown in the image.")},
1463
    {"PersonInImageWDetails", N_("Person Shown (Details)"), "bag Person", xmpBag, xmpExternal,
1464
     N_("Details about a person the content is about.")},
1465
    {"ProductInImage", N_("Product Shown"), "bag Product", xmpBag, xmpExternal, N_("A product the content is about.")},
1466
    {"PropertyReleaseID", N_("Property Release Id"), "bag Text", xmpBag, xmpExternal,
1467
     N_("Optional identifier associated with each Property Release.")},
1468
    {"DigImageGUID", N_("Digital Image Identifier"), "Text", xmpText, xmpInternal,
1469
     N_("Globally unique identifier for this digital image. It is created and applied by the creator of the "
1470
        "digital image at the time of its creation. This value shall not be changed after that time.")},
1471
    {"DigitalSourcefileType", N_("Physical type of original photo (deprecated)"), "URI", xmpText, xmpExternal,
1472
     N_("Deprecated, use the DigitalSourceType tag instead. The type of the source digital file.")},
1473
    {"DigitalSourceType", N_("Digital Source Type"), "URI", xmpText, xmpExternal,
1474
     N_("The type of the source of this digital image.")},
1475
    {"Event", N_("Event Name"), "Lang Alt", langAlt, xmpExternal,
1476
     N_("Names or describes the specific event at which the photo was taken.")},
1477
    {"EventId", N_("Event Identifier"), "bag Text", xmpBag, xmpExternal,
1478
     N_("Identifier(s) of the specific event at which the photo was taken.")},
1479
    {"EmbdEncRightsExpr", N_("Embedded Encoded Rights Expression"), "bag EERE", xmpBag, xmpInternal,
1480
     N_("An embedded rights expression using any rights expression language.")},
1481
    {"Genre", N_("Genre"), "bag CVTerm", xmpBag, xmpExternal,
1482
     N_("Artistic, style, journalistic, product or other genre(s) of the image (expressed by a term "
1483
        "from any Controlled Vocabulary).")},
1484
    {"ImageRegion", N_("Image Region(s)"), "bag ImageRegion", xmpBag, xmpExternal,
1485
     N_("Sets a region inside an image by defining its boundaries. All pixels of the boundary are "
1486
        "also part of the region. It may include metadata related to this region.")},
1487
    {"LinkedEncRightsExpr", N_("Linked Encoded Rights Expression"), "bag LERE", xmpBag, xmpExternal,
1488
     N_("A linked rights expression using any rights expression language.")},
1489
    {"MaxAvailHeight", N_("Maximum available height"), "Integer", xmpText, xmpExternal,
1490
     N_("The maximum available height in pixels of the original photo from which this photo has been derived by "
1491
        "downsizing.")},
1492
    {"MaxAvailWidth", N_("Maximum available width"), "Integer", xmpText, xmpExternal,
1493
     N_("The maximum available width in pixels of the original photo from which this photo has been derived by "
1494
        "downsizing.")},
1495
    {"RegistryId", N_("Registry Entry"), "bag RegistryEntryDetails", xmpBag, xmpExternal,
1496
     N_("Both a Registry Item Id and a Registry Organisation Id to record any registration of this digital image "
1497
        "with a registry.")},
1498
    {"RegItemId", N_("Registry Entry-Item Identifier (deprecated)"), "Text", xmpText, xmpExternal,
1499
     N_("Deprecated, use the RegItemId tag in Product struct instead. A unique identifier created by a registry "
1500
        "and applied by the creator of the digital image. This value shall not be changed after being applied. "
1501
        "This identifier is linked to a corresponding Registry Organisation Identifier.")},
1502
    {"RegOrgId", N_("Registry Entry-Organisation Identifier (deprecated)"), "Text", xmpText, xmpExternal,
1503
     N_("Deprecated, use the RegOrgId tag in RegistryEntryDetails struct instead. An identifier for the registry "
1504
        "which issued the corresponding Registry Image Id.")},
1505
    {"IptcLastEdited", N_("IPTC Fields Last Edited"), "Date", xmpText, xmpExternal,
1506
     N_("The date and optionally time when any of the IPTC photo metadata fields has been last edited.")},
1507
    {"LocationShown", N_("Location Shown"), "bag LocationDetails", xmpBag, xmpExternal,
1508
     N_("A location shown in the image.")},
1509
    {"LocationCreated", N_("Location Created"), "bag LocationDetails", xmpBag, xmpExternal,
1510
     N_("The location the photo was taken.")},
1511
    {"City", N_("Location-City (deprecated)"), "Text", xmpText, xmpExternal,
1512
     N_("Deprecated, use the City tag in LocationDetails struct instead. Name of the city of a location.")},
1513
    {"CountryCode", N_("Location-Country ISO-Code (deprecated)"), "Text", xmpText, xmpExternal,
1514
     N_("Deprecated, use the CountryCode tag in LocationDetails struct instead. The ISO code of a country of a "
1515
        "location.")},
1516
    {"CountryName", N_("Location-Country Name (deprecated)"), "Text", xmpText, xmpExternal,
1517
     N_("Deprecated, use the CountryName tag in LocationDetails struct instead. The name of a country of a "
1518
        "location.")},
1519
    {"ProvinceState", N_("Location-Province/State (deprecated)"), "Text", xmpText, xmpExternal,
1520
     N_("Deprecated, use the ProvinceState tag in LocationDetails struct instead. The name of a subregion of a "
1521
        "country - a province or state - of a location.")},
1522
    {"Sublocation", N_("Location-Sublocation (deprecated)"), "Text", xmpText, xmpExternal,
1523
     N_("Deprecated, use the City tag in LocationDetails struct instead. Name of a sublocation. This sublocation "
1524
        "name could either be the name of a sublocation to a city or the name of a well known location or "
1525
        "(natural) monument outside a city.")},
1526
    {"WorldRegion", N_("Location-World Region (deprecated)"), "Text", xmpText, xmpExternal,
1527
     N_("Deprecated, use the WorldRegion tag in LocationDetails struct instead. The name of a world region of a "
1528
        "location.")},
1529
    {"ArtworkOrObject", N_("Artwork or object in the image"), "bag ArtworkOrObjectDetails", xmpBag, xmpExternal,
1530
     N_("A set of metadata about artwork or an object in the image.")},
1531
    {"AOCopyrightNotice", N_("Artwork or object-Copyright notice (deprecated)"), "Text", xmpText, xmpExternal,
1532
     N_("Deprecated, use the AOCopyrightNotice tag in ArtworkOrObjectDetails struct instead. Contains any "
1533
        "necessary copyright notice for claiming the intellectual property for artwork or an object in the image "
1534
        "and should identify the current owner of the copyright of this work with associated intellectual property "
1535
        "rights.")},
1536
    {"AOCreator", N_("Artwork or object-Creator (deprecated)"), "seq ProperName", xmpSeq, xmpExternal,
1537
     N_("Deprecated, use the AOCreator tag in ArtworkOrObjectDetails struct instead. Contains the name of the "
1538
        "artist who has created artwork or an object in the image. In cases where the artist could or should not "
1539
        "be identified the name of a company or organisation may be appropriate.")},
1540
    {"AODateCreated", N_("Artwork or object-Date Created (deprecated)"), "Date", xmpText, xmpExternal,
1541
     N_("Deprecated, use the AODateCreated tag in ArtworkOrObjectDetails struct instead. Designates the date and "
1542
        "optionally the time the artwork or object in the image was created. This relates to artwork or objects "
1543
        "with associated intellectual property rights.")},
1544
    {"AOSource", N_("Artwork or object-Source (deprecated)"), "Text", xmpText, xmpExternal,
1545
     N_("Deprecated, use the AOSource tag in ArtworkOrObjectDetails struct instead. The organisation or body "
1546
        "holding and registering the artwork or object in the image for inventory purposes.")},
1547
    {"AOSourceInvNo", N_("Artwork or object-Source inventory number (deprecated)"), "Text", xmpText, xmpExternal,
1548
     N_("Deprecated, use the AOSourceInvNo tag in ArtworkOrObjectDetails struct instead. The inventory number "
1549
        "issued by the organisation or body holding and registering the artwork or object in the image.")},
1550
    {"AOTitle", N_("Artwork or object-Title (deprecated)"), "Lang Alt", langAlt, xmpExternal,
1551
     N_("Deprecated, use the AOTitle tag in ArtworkOrObjectDetails struct instead. A reference for the artwork or "
1552
        "object in the image.")},
1553
    // End of list marker
1554
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
1555
};
1556
1557
//! XMP Iptc4xmpCore:Scene
1558
//  Source: http://cv.iptc.org/newscodes/scene/
1559
constexpr TagVocabulary iptcScene[] = {
1560
    {"010100", N_("Headshot")},       {"010200", N_("Half-length")},
1561
    {"010300", N_("Full-length")},    {"010400", N_("Profile")},
1562
    {"010500", N_("rear view")},      {"010600", N_("Single")},
1563
    {"010700", N_("Couple")},         {"010800", N_("Two")},
1564
    {"010900", N_("Group")},          {"011000", N_("General view")},
1565
    {"011100", N_("Panoramic view")}, {"011200", N_("Aerial view")},
1566
    {"011300", N_("Under-water")},    {"011400", N_("Night scene")},
1567
    {"011500", N_("Satellite")},      {"011600", N_("Exterior view")},
1568
    {"011700", N_("Interior view")},  {"011800", N_("Close-up")},
1569
    {"011900", N_("Action")},         {"012000", N_("Performing")},
1570
    {"012100", N_("Posing")},         {"012200", N_("Symbolic")},
1571
    {"012300", N_("Off-beat")},       {"012400", N_("Movie scene")},
1572
};
1573
1574
//! XMP Iptc4xmpCore:SubjectCode
1575
//  Source: https://cv.iptc.org/newscodes/subjectcode/
1576
constexpr TagVocabulary iptcSubjectCode[] = {
1577
    {"01000000", "arts, culture and entertainment"},
1578
    {"01001000", "archaeology"},
1579
    {"01002000", "architecture"},
1580
    {"01003000", "bullfighting"},
1581
    {"01004000", "festive event (including carnival)"},
1582
    {"01005000", "cinema"},
1583
    {"01005001", "film festival"},
1584
    {"01006000", "dance"},
1585
    {"01007000", "fashion"},
1586
    {"01007001", "jewelry"},
1587
    {"01008000", "language"},
1588
    {"01009000", "library and museum"},
1589
    {"01010000", "literature"},
1590
    {"01010001", "fiction"},
1591
    {"01010002", "poetry"},
1592
    {"01011000", "music"},
1593
    {"01011001", "classical music"},
1594
    {"01011002", "folk music"},
1595
    {"01011003", "jazz music"},
1596
    {"01011004", "popular music"},
1597
    {"01011005", "country music"},
1598
    {"01011006", "rock and roll music"},
1599
    {"01011007", "hip-hop"},
1600
    {"01012000", "painting"},
1601
    {"01013000", "photography"},
1602
    {"01014000", "radio"},
1603
    {"01015000", "sculpture"},
1604
    {"01015001", "plastic art"},
1605
    {"01016000", "television"},
1606
    {"01016001", "soap opera"},
1607
    {"01017000", "theatre"},
1608
    {"01017001", "music theatre"},
1609
    {"01018000", "monument and heritage site"},
1610
    {"01018001", "institution-DEPRECATED"},
1611
    {"01019000", "customs and tradition"},
1612
    {"01020000", "arts (general)"},
1613
    {"01021000", "entertainment (general)"},
1614
    {"01021001", "entertainment award"},
1615
    {"01022000", "culture (general)"},
1616
    {"01022001", "cultural development"},
1617
    {"01023000", "nightclub"},
1618
    {"01024000", "cartoon"},
1619
    {"01025000", "animation"},
1620
    {"01026000", "mass media"},
1621
    {"01026001", "periodicals"},
1622
    {"01026002", "news media"},
1623
    {"01026003", "newspapers"},
1624
    {"01026004", "reviews"},
1625
    {"01027000", "internet"},
1626
    {"01028000", "history"},
1627
    {"02000000", "crime, law and justice"},
1628
    {"02001000", "crime"},
1629
    {"02001001", "homicide"},
1630
    {"02001002", "computer crime"},
1631
    {"02001003", "theft"},
1632
    {"02001004", "drug trafficking"},
1633
    {"02001005", "sexual assault"},
1634
    {"02001006", "assault (general)"},
1635
    {"02001007", "kidnapping"},
1636
    {"02001008", "arson"},
1637
    {"02001009", "gang activity"},
1638
    {"02001010", "terrorism"},
1639
    {"02002000", "judiciary (system of justice)"},
1640
    {"02002001", "lawyer"},
1641
    {"02002002", "judge"},
1642
    {"02002003", "court administration"},
1643
    {"02003000", "police"},
1644
    {"02003001", "law enforcement"},
1645
    {"02003002", "investigation"},
1646
    {"02003003", "arrest"},
1647
    {"02004000", "punishment"},
1648
    {"02004001", "fine"},
1649
    {"02004002", "execution"},
1650
    {"02005000", "prison"},
1651
    {"02006000", "laws"},
1652
    {"02006001", "criminal"},
1653
    {"02006002", "civil"},
1654
    {"02007000", "justice and rights"},
1655
    {"02007001", "civil rights"},
1656
    {"02008000", "trials"},
1657
    {"02008001", "litigation"},
1658
    {"02008002", "arbitration"},
1659
    {"02008003", "court preliminary"},
1660
    {"02009000", "prosecution"},
1661
    {"02009001", "defendant"},
1662
    {"02009002", "witness"},
1663
    {"02010000", "organized crime"},
1664
    {"02011000", "international law"},
1665
    {"02011001", "international court or tribunal"},
1666
    {"02011002", "extradition"},
1667
    {"02012000", "corporate crime"},
1668
    {"02012001", "fraud"},
1669
    {"02012002", "embezzlement"},
1670
    {"02012003", "restraint of trade"},
1671
    {"02012004", "breach of contract"},
1672
    {"02012005", "anti-trust crime"},
1673
    {"02012006", "corruption"},
1674
    {"02012007", "bribery"},
1675
    {"02013000", "war crime"},
1676
    {"02014000", "inquest"},
1677
    {"02015000", "inquiry"},
1678
    {"02016000", "tribunal"},
1679
    {"03000000", "disaster and accident"},
1680
    {"03001000", "drought"},
1681
    {"03002000", "earthquake"},
1682
    {"03003000", "famine"},
1683
    {"03004000", "fire"},
1684
    {"03005000", "flood"},
1685
    {"03006000", "industrial accident"},
1686
    {"03006001", "structural failures"},
1687
    {"03007000", "meteorological disaster"},
1688
    {"03007001", "windstorms"},
1689
    {"03008000", "nuclear accident"},
1690
    {"03009000", "pollution"},
1691
    {"03010000", "transport accident"},
1692
    {"03010001", "road accident"},
1693
    {"03010002", "railway accident"},
1694
    {"03010003", "air and space accident"},
1695
    {"03010004", "maritime accident"},
1696
    {"03011000", "volcanic eruption"},
1697
    {"03012000", "relief and aid organisation"},
1698
    {"03013000", "accident (general)"},
1699
    {"03014000", "emergency incident"},
1700
    {"03014001", "explosion"},
1701
    {"03015000", "disaster (general)"},
1702
    {"03015001", "natural disasters"},
1703
    {"03015002", "avalanche/landslide"},
1704
    {"03016000", "emergency planning"},
1705
    {"03017000", "rescue"},
1706
    {"04000000", "economy, business and finance"},
1707
    {"04001000", "agriculture"},
1708
    {"04001001", "arable farming"},
1709
    {"04001002", "fishing industry"},
1710
    {"04001003", "forestry and timber"},
1711
    {"04001004", "livestock farming"},
1712
    {"04001005", "viniculture"},
1713
    {"04001006", "aquaculture"},
1714
    {"04002000", "chemicals"},
1715
    {"04002001", "biotechnology"},
1716
    {"04002002", "fertiliser"},
1717
    {"04002003", "health and beauty product"},
1718
    {"04002004", "inorganic chemical"},
1719
    {"04002005", "organic chemical"},
1720
    {"04002006", "pharmaceutical"},
1721
    {"04002007", "synthetic and plastic"},
1722
    {"04003000", "computing and information technology"},
1723
    {"04003001", "hardware"},
1724
    {"04003002", "networking"},
1725
    {"04003003", "satellite technology"},
1726
    {"04003004", "semiconductors and active components"},
1727
    {"04003005", "software"},
1728
    {"04003006", "telecommunication equipment"},
1729
    {"04003007", "telecommunication service"},
1730
    {"04003008", "security"},
1731
    {"04003009", "wireless technology"},
1732
    {"04004000", "construction and property"},
1733
    {"04004001", "heavy construction"},
1734
    {"04004002", "house building"},
1735
    {"04004003", "real estate"},
1736
    {"04004004", "farms"},
1737
    {"04004005", "land price"},
1738
    {"04004006", "renovation"},
1739
    {"04004007", "design and engineering"},
1740
    {"04005000", "energy and resource"},
1741
    {"04005001", "alternative energy"},
1742
    {"04005002", "coal"},
1743
    {"04005003", "oil and gas - downstream activities"},
1744
    {"04005004", "oil and gas - upstream activities"},
1745
    {"04005005", "nuclear power"},
1746
    {"04005006", "electricity production and distribution"},
1747
    {"04005007", "waste management and pollution control"},
1748
    {"04005008", "water supply"},
1749
    {"04005009", "natural resources (general)"},
1750
    {"04005010", "energy (general)"},
1751
    {"04005011", "natural gas"},
1752
    {"04005012", "petrol"},
1753
    {"04005013", "diesel fuel"},
1754
    {"04005014", "kerosene/paraffin"},
1755
    {"04006000", "financial and business service"},
1756
    {"04006001", "accountancy and auditing"},
1757
    {"04006002", "banking"},
1758
    {"04006003", "consultancy service"},
1759
    {"04006004", "employment agency"},
1760
    {"04006005", "healthcare provider"},
1761
    {"04006006", "insurance"},
1762
    {"04006007", "legal service"},
1763
    {"04006008", "market research"},
1764
    {"04006009", "stock broking"},
1765
    {"04006010", "personal investing"},
1766
    {"04006011", "market trend"},
1767
    {"04006012", "shipping service"},
1768
    {"04006013", "personal service"},
1769
    {"04006014", "janitorial service"},
1770
    {"04006015", "funeral parlour and crematorium"},
1771
    {"04006016", "rental service"},
1772
    {"04006017", "wedding service"},
1773
    {"04006018", "personal finance"},
1774
    {"04006019", "personal income"},
1775
    {"04006020", "auction service"},
1776
    {"04006021", "printing/promotional service"},
1777
    {"04006022", "investment service"},
1778
    {"04007000", "consumer goods"},
1779
    {"04007001", "clothing"},
1780
    {"04007002", "department store"},
1781
    {"04007003", "food"},
1782
    {"04007004", "mail order"},
1783
    {"04007005", "retail"},
1784
    {"04007006", "speciality store"},
1785
    {"04007007", "wholesale"},
1786
    {"04007008", "beverage"},
1787
    {"04007009", "electronic commerce"},
1788
    {"04007010", "luxury good"},
1789
    {"04007011", "non-durable good"},
1790
    {"04007012", "toy"},
1791
    {"04008000", "macro economics"},
1792
    {"04008001", "central bank"},
1793
    {"04008002", "consumer issue"},
1794
    {"04008003", "debt market"},
1795
    {"04008004", "economic indicator"},
1796
    {"04008005", "emerging market"},
1797
    {"04008006", "foreign exchange market"},
1798
    {"04008007", "government aid"},
1799
    {"04008008", "government debt"},
1800
    {"04008009", "interest rate"},
1801
    {"04008010", "international economic institution"},
1802
    {"04008011", "international (foreign) trade"},
1803
    {"04008012", "loan market"},
1804
    {"04008013", "economic organization"},
1805
    {"04008014", "consumer confidence"},
1806
    {"04008015", "trade dispute"},
1807
    {"04008016", "inflation and deflation"},
1808
    {"04008017", "prices"},
1809
    {"04008018", "currency values"},
1810
    {"04008019", "budgets and budgeting"},
1811
    {"04008020", "credit and debt"},
1812
    {"04008021", "loans"},
1813
    {"04008022", "mortgages"},
1814
    {"04008023", "financial markets"},
1815
    {"04008024", "commodity markets"},
1816
    {"04008025", "investments"},
1817
    {"04008026", "stocks"},
1818
    {"04008027", "bonds"},
1819
    {"04008028", "mutual funds"},
1820
    {"04008029", "derivative securities"},
1821
    {"04008030", "imports"},
1822
    {"04008031", "exports"},
1823
    {"04008032", "trade agreements"},
1824
    {"04008033", "trade policy"},
1825
    {"04008034", "business enterprises"},
1826
    {"04008035", "tariff"},
1827
    {"04008036", "trade balance"},
1828
    {"04009000", "market and exchange"},
1829
    {"04009001", "energy"},
1830
    {"04009002", "metal"},
1831
    {"04009003", "securities"},
1832
    {"04009004", "soft commodity"},
1833
    {"04010000", "media"},
1834
    {"04010001", "advertising"},
1835
    {"04010002", "book"},
1836
    {"04010003", "cinema industry"},
1837
    {"04010004", "news agency"},
1838
    {"04010005", "newspaper and magazine"},
1839
    {"04010006", "online"},
1840
    {"04010007", "public relation"},
1841
    {"04010008", "radio industry"},
1842
    {"04010009", "satellite and cable service"},
1843
    {"04010010", "television industry"},
1844
    {"04010011", "music industry"},
1845
    {"04011000", "manufacturing and engineering"},
1846
    {"04011001", "aerospace"},
1847
    {"04011002", "automotive equipment"},
1848
    {"04011003", "defence equipment"},
1849
    {"04011004", "electrical appliance"},
1850
    {"04011005", "heavy engineering"},
1851
    {"04011006", "industrial component"},
1852
    {"04011007", "instrument engineering"},
1853
    {"04011008", "shipbuilding"},
1854
    {"04011009", "machine manufacturing"},
1855
    {"04012000", "metal and mineral"},
1856
    {"04012001", "building material"},
1857
    {"04012002", "gold and precious material"},
1858
    {"04012003", "iron and steel"},
1859
    {"04012004", "non ferrous metal"},
1860
    {"04012005", "mining"},
1861
    {"04013000", "process industry"},
1862
    {"04013001", "distiller and brewer"},
1863
    {"04013002", "food"},
1864
    {"04013003", "furnishings and furniture"},
1865
    {"04013004", "paper and packaging product"},
1866
    {"04013005", "rubber product"},
1867
    {"04013006", "soft drinks"},
1868
    {"04013007", "textile and clothing"},
1869
    {"04013008", "tobacco"},
1870
    {"04014000", "tourism and leisure"},
1871
    {"04014001", "casino and gambling"},
1872
    {"04014002", "hotel and accommodation"},
1873
    {"04014003", "recreational and sporting goods"},
1874
    {"04014004", "restaurant and catering"},
1875
    {"04014005", "tour operator"},
1876
    {"04015000", "transport"},
1877
    {"04015001", "air transport"},
1878
    {"04015002", "railway"},
1879
    {"04015003", "road transport"},
1880
    {"04015004", "waterway and maritime transport"},
1881
    {"04016000", "company information"},
1882
    {"04016001", "accounting and audit"},
1883
    {"04016002", "annual and special corporate meeting"},
1884
    {"04016003", "annual report"},
1885
    {"04016004", "antitrust issue"},
1886
    {"04016005", "merger, acquisition and takeover"},
1887
    {"04016006", "analysts' comment"},
1888
    {"04016007", "bankruptcy"},
1889
    {"04016008", "board of directors (appointment and change)"},
1890
    {"04016009", "buyback"},
1891
    {"04016010", "C.E.O. interview"},
1892
    {"04016011", "corporate officer"},
1893
    {"04016012", "corporate profile"},
1894
    {"04016013", "contract"},
1895
    {"04016014", "defence contract"},
1896
    {"04016015", "dividend announcement"},
1897
    {"04016016", "earnings forecast"},
1898
    {"04016017", "financially distressed company"},
1899
    {"04016018", "earnings"},
1900
    {"04016019", "financing and stock offering"},
1901
    {"04016020", "government contract"},
1902
    {"04016021", "global expansion"},
1903
    {"04016022", "insider trading"},
1904
    {"04016023", "joint venture"},
1905
    {"04016024", "leveraged buyout"},
1906
    {"04016025", "layoffs and downsizing"},
1907
    {"04016026", "licensing agreement"},
1908
    {"04016027", "litigation and regulation"},
1909
    {"04016028", "management change"},
1910
    {"04016029", "marketing"},
1911
    {"04016030", "new product"},
1912
    {"04016031", "patent, copyright and trademark"},
1913
    {"04016032", "plant closing"},
1914
    {"04016033", "plant opening"},
1915
    {"04016034", "privatisation"},
1916
    {"04016035", "proxy filing"},
1917
    {"04016036", "rating"},
1918
    {"04016037", "research and development"},
1919
    {"04016038", "quarterly or semiannual financial statement"},
1920
    {"04016039", "restructuring and recapitalisation"},
1921
    {"04016040", "spin-off"},
1922
    {"04016041", "stock activity"},
1923
    {"04016042", "industrial production"},
1924
    {"04016043", "productivity"},
1925
    {"04016044", "inventories"},
1926
    {"04016045", "sales"},
1927
    {"04016046", "corporations"},
1928
    {"04016047", "shareholders"},
1929
    {"04016048", "corporate performance"},
1930
    {"04016049", "losses"},
1931
    {"04016050", "credit ratings"},
1932
    {"04016051", "stock splits"},
1933
    {"04016052", "stock options"},
1934
    {"04016053", "recalls (products)"},
1935
    {"04016054", "globalization"},
1936
    {"04016055", "consumers"},
1937
    {"04016056", "purchase"},
1938
    {"04016057", "new service"},
1939
    {"04017000", "economy (general)"},
1940
    {"04017001", "economic policy"},
1941
    {"04018000", "business (general)"},
1942
    {"04018001", "institution"},
1943
    {"04019000", "finance (general)"},
1944
    {"04019001", "money and monetary policy"},
1945
    {"05000000", "education"},
1946
    {"05001000", "adult education"},
1947
    {"05002000", "further education"},
1948
    {"05003000", "parent organisation"},
1949
    {"05004000", "preschool"},
1950
    {"05005000", "school"},
1951
    {"05005001", "elementary schools"},
1952
    {"05005002", "middle schools"},
1953
    {"05005003", "high schools"},
1954
    {"05006000", "teachers union"},
1955
    {"05007000", "university"},
1956
    {"05008000", "upbringing"},
1957
    {"05009000", "entrance examination"},
1958
    {"05010000", "teaching and learning"},
1959
    {"05010001", "students"},
1960
    {"05010002", "teachers"},
1961
    {"05010003", "curriculum"},
1962
    {"05010004", "test/examination"},
1963
    {"05011000", "religious education"},
1964
    {"05011001", "parochial school"},
1965
    {"05011002", "seminary"},
1966
    {"05011003", "yeshiva"},
1967
    {"05011004", "madrasa"},
1968
    {"06000000", "environmental issue"},
1969
    {"06001000", "renewable energy"},
1970
    {"06002000", "conservation"},
1971
    {"06002001", "endangered species"},
1972
    {"06002002", "ecosystem"},
1973
    {"06003000", "energy saving"},
1974
    {"06004000", "environmental politics"},
1975
    {"06005000", "environmental pollution"},
1976
    {"06005001", "air pollution"},
1977
    {"06005002", "water pollution"},
1978
    {"06006000", "natural resources"},
1979
    {"06006001", "land resources"},
1980
    {"06006002", "parks"},
1981
    {"06006003", "forests"},
1982
    {"06006004", "wetlands"},
1983
    {"06006005", "mountains"},
1984
    {"06006006", "rivers"},
1985
    {"06006007", "oceans"},
1986
    {"06006008", "wildlife"},
1987
    {"06006009", "energy resources"},
1988
    {"06007000", "nature"},
1989
    {"06007001", "invasive species"},
1990
    {"06008000", "population"},
1991
    {"06009000", "waste"},
1992
    {"06010000", "water"},
1993
    {"06011000", "global warming"},
1994
    {"06012000", "hazardous materials"},
1995
    {"06013000", "environmental cleanup"},
1996
    {"07000000", "health"},
1997
    {"07001000", "disease"},
1998
    {"07001001", "communicable diseases"},
1999
    {"07001002", "virus diseases"},
2000
    {"07001003", "AIDS"},
2001
    {"07001004", "cancer"},
2002
    {"07001005", "heart disease"},
2003
    {"07001006", "alzheimer's disease"},
2004
    {"07001007", "animal diseases"},
2005
    {"07001008", "plant diseases"},
2006
    {"07001009", "retrovirus"},
2007
    {"07002000", "epidemic and plague"},
2008
    {"07003000", "health treatment"},
2009
    {"07003001", "prescription drugs"},
2010
    {"07003002", "dietary supplements"},
2011
    {"07003003", "diet"},
2012
    {"07003004", "medical procedure/test"},
2013
    {"07003005", "therapy"},
2014
    {"07004000", "health organisations"},
2015
    {"07005000", "medical research"},
2016
    {"07006000", "medical staff"},
2017
    {"07006001", "primary care physician"},
2018
    {"07006002", "health-workers union"},
2019
    {"07007000", "medicine"},
2020
    {"07007001", "herbal"},
2021
    {"07007002", "holistic"},
2022
    {"07007003", "western"},
2023
    {"07007004", "traditional Chinese"},
2024
    {"07008000", "preventative medicine"},
2025
    {"07008001", "vaccines"},
2026
    {"07009000", "injury"},
2027
    {"07010000", "hospital and clinic"},
2028
    {"07011000", "government health care"},
2029
    {"07011001", "medicare"},
2030
    {"07011002", "medicaid"},
2031
    {"07012000", "private health care"},
2032
    {"07013000", "healthcare policy"},
2033
    {"07013001", "food safety"},
2034
    {"07014000", "medical specialisation"},
2035
    {"07014001", "geriatric"},
2036
    {"07014002", "pediatrics"},
2037
    {"07014003", "reproduction"},
2038
    {"07014004", "genetics"},
2039
    {"07014005", "obstetrics/gynecology"},
2040
    {"07015000", "medical service"},
2041
    {"07016000", "physical fitness"},
2042
    {"07017000", "illness"},
2043
    {"07017001", "mental illness"},
2044
    {"07017002", "eating disorder"},
2045
    {"07017003", "obesity"},
2046
    {"07018000", "medical conditions"},
2047
    {"07019000", "patient"},
2048
    {"08000000", "human interest"},
2049
    {"08001000", "animal"},
2050
    {"08002000", "curiosity"},
2051
    {"08003000", "people"},
2052
    {"08003001", "advice"},
2053
    {"08003002", "celebrity"},
2054
    {"08003003", "accomplishment"},
2055
    {"08003004", "human mishap"},
2056
    {"08003005", "fortune-telling"},
2057
    {"08004000", "mystery"},
2058
    {"08005000", "society"},
2059
    {"08005001", "ceremony"},
2060
    {"08005002", "death"},
2061
    {"08005003", "funeral"},
2062
    {"08005004", "estate bestowal"},
2063
    {"08005005", "memorial"},
2064
    {"08006000", "award and prize"},
2065
    {"08006001", "record"},
2066
    {"08007000", "imperial and royal matters"},
2067
    {"08008000", "plant"},
2068
    {"09000000", "labour"},
2069
    {"09001000", "apprentices"},
2070
    {"09002000", "collective contract"},
2071
    {"09002001", "contract issue-wages"},
2072
    {"09002002", "contract issue-healthcare"},
2073
    {"09002003", "contract issue-work rules"},
2074
    {"09003000", "employment"},
2075
    {"09003001", "labor market"},
2076
    {"09003002", "job layoffs"},
2077
    {"09003003", "child labor"},
2078
    {"09003004", "occupations"},
2079
    {"09004000", "labour dispute"},
2080
    {"09005000", "labour legislation"},
2081
    {"09006000", "retirement"},
2082
    {"09007000", "retraining"},
2083
    {"09008000", "strike"},
2084
    {"09009000", "unemployment"},
2085
    {"09010000", "unions"},
2086
    {"09011000", "wage and pension"},
2087
    {"09011001", "employee benefits"},
2088
    {"09011002", "social security"},
2089
    {"09012000", "work relations"},
2090
    {"09013000", "health and safety at work"},
2091
    {"09014000", "advanced training"},
2092
    {"09015000", "employer"},
2093
    {"09016000", "employee"},
2094
    {"10000000", "lifestyle and leisure"},
2095
    {"10001000", "game"},
2096
    {"10001001", "Go"},
2097
    {"10001002", "chess"},
2098
    {"10001003", "bridge"},
2099
    {"10001004", "shogi"},
2100
    {"10002000", "gaming and lottery"},
2101
    {"10003000", "gastronomy"},
2102
    {"10003001", "organic foods"},
2103
    {"10004000", "hobby"},
2104
    {"10004001", "DIY"},
2105
    {"10004002", "shopping"},
2106
    {"10004003", "gardening"},
2107
    {"10005000", "holiday or vacation"},
2108
    {"10006000", "tourism"},
2109
    {"10007000", "travel and commuting"},
2110
    {"10007001", "traffic"},
2111
    {"10008000", "club and association"},
2112
    {"10009000", "lifestyle (house and home)"},
2113
    {"10010000", "leisure (general)"},
2114
    {"10011000", "public holiday"},
2115
    {"10012000", "hunting"},
2116
    {"10013000", "fishing"},
2117
    {"10014000", "auto trends"},
2118
    {"10015000", "adventure"},
2119
    {"10016000", "beauty"},
2120
    {"10017000", "consumer issue"},
2121
    {"10018000", "wedding"},
2122
    {"11000000", "politics"},
2123
    {"11001000", "defence"},
2124
    {"11001001", "veterans affairs"},
2125
    {"11001002", "national security"},
2126
    {"11001003", "security measures"},
2127
    {"11001004", "armed Forces"},
2128
    {"11001005", "military equipment"},
2129
    {"11001006", "firearms"},
2130
    {"11001007", "biological and chemical weapons"},
2131
    {"11001008", "missile systems"},
2132
    {"11001009", "nuclear weapons"},
2133
    {"11002000", "diplomacy"},
2134
    {"11002001", "summit"},
2135
    {"11002002", "international relations"},
2136
    {"11002003", "peace negotiations"},
2137
    {"11002004", "alliances"},
2138
    {"11003000", "election"},
2139
    {"11003001", "political candidates"},
2140
    {"11003002", "political campaigns"},
2141
    {"11003003", "campaign finance"},
2142
    {"11003004", "national elections"},
2143
    {"11003005", "regional elections"},
2144
    {"11003006", "local elections"},
2145
    {"11003007", "voting"},
2146
    {"11003008", "poll"},
2147
    {"11003009", "european elections"},
2148
    {"11003010", "primary"},
2149
    {"11004000", "espionage and intelligence"},
2150
    {"11005000", "foreign aid"},
2151
    {"11005001", "economic sanction"},
2152
    {"11006000", "government"},
2153
    {"11006001", "civil and public service"},
2154
    {"11006002", "safety of citizens"},
2155
    {"11006003", "think tank"},
2156
    {"11006004", "national government"},
2157
    {"11006005", "executive (government)"},
2158
    {"11006006", "heads of state"},
2159
    {"11006007", "government departments"},
2160
    {"11006008", "public officials"},
2161
    {"11006009", "ministers (government)"},
2162
    {"11006010", "public employees"},
2163
    {"11006011", "privatisation"},
2164
    {"11006012", "nationalisation"},
2165
    {"11006013", "impeachment"},
2166
    {"11007000", "human rights"},
2167
    {"11008000", "local authority"},
2168
    {"11009000", "parliament"},
2169
    {"11009001", "upper house"},
2170
    {"11009002", "lower house"},
2171
    {"11010000", "parties and movements"},
2172
    {"11010001", "non government organizations (NGO)"},
2173
    {"11011000", "refugee"},
2174
    {"11012000", "regional authority"},
2175
    {"11013000", "state budget and tax"},
2176
    {"11013001", "public finance"},
2177
    {"11014000", "treaty and international organisation-DEPRECATED"},
2178
    {"11014001", "international relations-DEPRECATED"},
2179
    {"11014002", "peace negotiations-DEPRECATED"},
2180
    {"11014003", "alliances-DEPRECATED"},
2181
    {"11015000", "constitution"},
2182
    {"11016000", "interior policy"},
2183
    {"11016001", "data protection"},
2184
    {"11016002", "housing and urban planning"},
2185
    {"11016003", "pension and welfare"},
2186
    {"11016004", "personal weapon control"},
2187
    {"11016005", "indigenous people"},
2188
    {"11016006", "personal data collection"},
2189
    {"11016007", "planning inquiries"},
2190
    {"11017000", "migration"},
2191
    {"11018000", "citizens initiative and recall"},
2192
    {"11019000", "referenda"},
2193
    {"11020000", "nuclear policy"},
2194
    {"11021000", "lobbying"},
2195
    {"11022000", "regulatory policy and organisation"},
2196
    {"11023000", "censorship"},
2197
    {"11024000", "politics (general)"},
2198
    {"11024001", "political systems"},
2199
    {"11024002", "democracy"},
2200
    {"11024003", "political development"},
2201
    {"11025000", "freedom of the press"},
2202
    {"11026000", "freedom of religion"},
2203
    {"11027000", "treaty"},
2204
    {"11028000", "international organisation"},
2205
    {"12000000", "religion and belief"},
2206
    {"12001000", "cult and sect"},
2207
    {"12002000", "belief (faith)"},
2208
    {"12002001", "unificationism"},
2209
    {"12002002", "scientology"},
2210
    {"12003000", "freemasonry"},
2211
    {"12004000", "religion-DEPRECATED"},
2212
    {"12004001", "christianity-DEPRECATED"},
2213
    {"12004002", "islam-DEPRECATED"},
2214
    {"12004003", "judaism-DEPRECATED"},
2215
    {"12004004", "buddhism-DEPRECATED"},
2216
    {"12004005", "hinduism-DEPRECATED"},
2217
    {"12005000", "church (organisation)-DEPRECATED"},
2218
    {"12005001", "religious facilities-DEPRECATED"},
2219
    {"12006000", "values"},
2220
    {"12006001", "ethics"},
2221
    {"12006002", "corrupt practices"},
2222
    {"12007000", "church and state relations"},
2223
    {"12008000", "philosophy"},
2224
    {"12009000", "christianity"},
2225
    {"12009001", "protestant"},
2226
    {"12009002", "lutheran"},
2227
    {"12009003", "reformed"},
2228
    {"12009004", "anglican"},
2229
    {"12009005", "methodist"},
2230
    {"12009006", "baptist"},
2231
    {"12009007", "mennonite"},
2232
    {"12009009", "mormon"},
2233
    {"12009010", "roman catholic"},
2234
    {"12009011", "old catholic"},
2235
    {"12009012", "orthodoxy"},
2236
    {"12009013", "salvation army"},
2237
    {"12010000", "islam"},
2238
    {"12011000", "judaism"},
2239
    {"12012000", "buddhism"},
2240
    {"12013000", "hinduism"},
2241
    {"12014000", "religious festival or holiday"},
2242
    {"12014001", "christmas"},
2243
    {"12014002", "easter"},
2244
    {"12014003", "pentecost"},
2245
    {"12014004", "ramadan"},
2246
    {"12014005", "yom kippur"},
2247
    {"12015000", "religious leader"},
2248
    {"12015001", "pope"},
2249
    {"12016000", "nature religion"},
2250
    {"12017000", "taoism"},
2251
    {"12018000", "shintoism"},
2252
    {"12019000", "sikhism"},
2253
    {"12020000", "jainism"},
2254
    {"12021000", "parsasm"},
2255
    {"12022000", "confucianism"},
2256
    {"12023000", "religious text"},
2257
    {"12023001", "bible"},
2258
    {"12023002", "qur'an"},
2259
    {"12023003", "torah"},
2260
    {"12024000", "interreligious dialogue"},
2261
    {"12025000", "religious event"},
2262
    {"12025001", "catholic convention"},
2263
    {"12025002", "protestant convention"},
2264
    {"12025004", "ritual"},
2265
    {"12026000", "concordat"},
2266
    {"12027000", "ecumenism"},
2267
    {"13000000", "science and technology"},
2268
    {"13001000", "applied science"},
2269
    {"13001001", "physics"},
2270
    {"13001002", "chemistry"},
2271
    {"13001003", "cosmology"},
2272
    {"13001004", "particle physics"},
2273
    {"13002000", "engineering"},
2274
    {"13002001", "material science"},
2275
    {"13003000", "human science"},
2276
    {"13003001", "social sciences"},
2277
    {"13003002", "history"},
2278
    {"13003003", "psychology"},
2279
    {"13003004", "sociology"},
2280
    {"13003005", "anthropology"},
2281
    {"13004000", "natural science"},
2282
    {"13004001", "geology"},
2283
    {"13004002", "paleontology"},
2284
    {"13004003", "geography"},
2285
    {"13004004", "botany"},
2286
    {"13004005", "zoology"},
2287
    {"13004006", "physiology"},
2288
    {"13004007", "astronomy"},
2289
    {"13004008", "biology"},
2290
    {"13005000", "philosophical science"},
2291
    {"13006000", "research"},
2292
    {"13006001", "survey"},
2293
    {"13007000", "scientific exploration"},
2294
    {"13008000", "space programme"},
2295
    {"13009000", "science (general)"},
2296
    {"13010000", "technology (general)"},
2297
    {"13010001", "rocketry"},
2298
    {"13010002", "laser"},
2299
    {"13011000", "standards"},
2300
    {"13012000", "animal science"},
2301
    {"13013000", "micro science"},
2302
    {"13014000", "marine science"},
2303
    {"13015000", "weather science"},
2304
    {"13016000", "electronics"},
2305
    {"13017000", "identification technology"},
2306
    {"13018000", "mathematics"},
2307
    {"13019000", "biotechnology"},
2308
    {"13020000", "agricultural research and technology"},
2309
    {"13021000", "nanotechnology"},
2310
    {"13022000", "IT/computer sciences"},
2311
    {"13023000", "scientific institutions"},
2312
    {"14000000", "social issue"},
2313
    {"14001000", "addiction"},
2314
    {"14002000", "charity"},
2315
    {"14003000", "demographics"},
2316
    {"14003001", "population and census"},
2317
    {"14003002", "immigration"},
2318
    {"14003003", "illegal immigrants"},
2319
    {"14003004", "emigrants"},
2320
    {"14004000", "disabled"},
2321
    {"14005000", "euthanasia (also includes assisted suicide)"},
2322
    {"14005001", "suicide"},
2323
    {"14006000", "family"},
2324
    {"14006001", "parent and child"},
2325
    {"14006002", "adoption"},
2326
    {"14006003", "marriage"},
2327
    {"14006004", "divorce"},
2328
    {"14006005", "sex"},
2329
    {"14006006", "courtship"},
2330
    {"14007000", "family planning"},
2331
    {"14008000", "health insurance"},
2332
    {"14009000", "homelessness"},
2333
    {"14010000", "minority group"},
2334
    {"14010001", "gays and lesbians"},
2335
    {"14010002", "national or ethnic minority"},
2336
    {"14011000", "pornography"},
2337
    {"14012000", "poverty"},
2338
    {"14013000", "prostitution"},
2339
    {"14014000", "racism"},
2340
    {"14015000", "welfare"},
2341
    {"14016000", "abortion"},
2342
    {"14017000", "missing person"},
2343
    {"14017001", "missing due to hostilities"},
2344
    {"14018000", "long term care"},
2345
    {"14019000", "juvenile delinquency"},
2346
    {"14020000", "nuclear radiation victims"},
2347
    {"14021000", "slavery"},
2348
    {"14022000", "abusive behaviour"},
2349
    {"14023000", "death and dying"},
2350
    {"14024000", "people"},
2351
    {"14024001", "children"},
2352
    {"14024002", "infants"},
2353
    {"14024003", "teen-agers"},
2354
    {"14024004", "adults"},
2355
    {"14024005", "senior citizens"},
2356
    {"14025000", "social issues (general)"},
2357
    {"14025001", "social conditions"},
2358
    {"14025002", "social problems"},
2359
    {"14025003", "discrimination"},
2360
    {"14025004", "social services"},
2361
    {"14025005", "death penalty policies"},
2362
    {"14026000", "ordnance clearance"},
2363
    {"14027000", "reconstruction"},
2364
    {"15000000", "sport"},
2365
    {"15001000", "aero and aviation sport"},
2366
    {"15001001", "parachuting"},
2367
    {"15001002", "sky diving"},
2368
    {"15002000", "alpine skiing"},
2369
    {"15002001", "downhill"},
2370
    {"15002002", "giant slalom"},
2371
    {"15002003", "super G"},
2372
    {"15002004", "slalom"},
2373
    {"15002005", "combined"},
2374
    {"15003000", "American football"},
2375
    {"15003001", "(US) National Football League (NFL) (North American)"},
2376
    {"15003002", "CFL"},
2377
    {"15003003", "AFL-DEPRECATED"},
2378
    {"15004000", "archery"},
2379
    {"15004001", "FITA / Outdoor target archery"},
2380
    {"15004002", "crossbow shooting"},
2381
    {"15005000", "athletics, track and field"},
2382
    {"15005001", "100 m"},
2383
    {"15005002", "200 m"},
2384
    {"15005003", "400 m"},
2385
    {"15005004", "800 m"},
2386
    {"15005005", "1000 m"},
2387
    {"15005006", "1500 m"},
2388
    {"15005007", "mile"},
2389
    {"15005008", "2000 m"},
2390
    {"15005009", "3000 m"},
2391
    {"15005010", "5000 m"},
2392
    {"15005011", "10,000 m"},
2393
    {"15005012", "20 km"},
2394
    {"15005013", "one hour"},
2395
    {"15005014", "25000"},
2396
    {"15005015", "30000"},
2397
    {"15005016", "110 m hurdles"},
2398
    {"15005017", "400 m hurdles"},
2399
    {"15005018", "3000 m steeplechase"},
2400
    {"15005019", "high jump"},
2401
    {"15005020", "pole vault"},
2402
    {"15005021", "long jump"},
2403
    {"15005022", "triple jump"},
2404
    {"15005023", "shot put"},
2405
    {"15005024", "discus throw"},
2406
    {"15005025", "hammer throw"},
2407
    {"15005026", "javelin throw"},
2408
    {"15005027", "decathlon"},
2409
    {"15005028", "4x100 m"},
2410
    {"15005029", "4x200 m"},
2411
    {"15005030", "4x400 m"},
2412
    {"15005031", "4x800 m"},
2413
    {"15005032", "4x1500 m"},
2414
    {"15005033", "walk 1 h"},
2415
    {"15005034", "walk 2 h"},
2416
    {"15005035", "10 km walk"},
2417
    {"15005036", "15 km walk"},
2418
    {"15005037", "20 km walk"},
2419
    {"15005038", "30 km walk"},
2420
    {"15005039", "50 km walk"},
2421
    {"15005040", "100 m hurdles"},
2422
    {"15005041", "5 km walk"},
2423
    {"15005042", "heptathlon"},
2424
    {"15005043", "1500 m walk"},
2425
    {"15005044", "2000 m walk"},
2426
    {"15005045", "3000 m walk"},
2427
    {"15005046", "50 m"},
2428
    {"15005047", "50 m hurdles"},
2429
    {"15005048", "50 yards"},
2430
    {"15005049", "50 yard hurdles"},
2431
    {"15005050", "60 m"},
2432
    {"15005051", "60 m hurdles"},
2433
    {"15005052", "60 yards"},
2434
    {"15005053", "60 yard hurdles"},
2435
    {"15005054", "100 yards"},
2436
    {"15005055", "100 yard hurdles"},
2437
    {"15005056", "300 m"},
2438
    {"15005057", "300 yards"},
2439
    {"15005058", "440 yards"},
2440
    {"15005059", "500 m"},
2441
    {"15005060", "500 yards"},
2442
    {"15005061", "600 m"},
2443
    {"15005062", "600 yards"},
2444
    {"15005063", "880 yards"},
2445
    {"15005064", "1000 yards"},
2446
    {"15005065", "2 miles"},
2447
    {"15005066", "3 miles"},
2448
    {"15005067", "6 miles"},
2449
    {"15005068", "4x1 mile"},
2450
    {"15005069", "pentathlon"},
2451
    {"15006000", "badminton"},
2452
    {"15007000", "baseball"},
2453
    {"15007001", "Major League Baseball (North American Professional) - American League"},
2454
    {"15007002", "Major League Baseball (North American Professional) - National League"},
2455
    {"15007003", "Major League Baseball (North American Professional) - Special (e.g. All-Star, World Series)"},
2456
    {"15007004", "rubberball baseball"},
2457
    {"15007005", "Major League Baseball Playoffs"},
2458
    {"15007006", "World Series"},
2459
    {"15008000", "basketball"},
2460
    {"15008001", "National Basketball Association (North American Professional)"},
2461
    {"15008002", "professional - Women general"},
2462
    {"15008003", "Swiss netball"},
2463
    {"15008004", "German netball"},
2464
    {"15008005", "Dutch netball"},
2465
    {"15009000", "biathlon"},
2466
    {"15009001", "7.5 km"},
2467
    {"15009002", "10 km"},
2468
    {"15009003", "15 km"},
2469
    {"15009004", "20 km"},
2470
    {"15009005", "4x7.5 km relay"},
2471
    {"15009006", "12.5 km pursuit"},
2472
    {"15010000", "billiards, snooker and pool"},
2473
    {"15010001", "8 ball"},
2474
    {"15010002", "9 ball"},
2475
    {"15010003", "14.1"},
2476
    {"15010004", "continuous-DEPRECATED"},
2477
    {"15010005", "other-DEPRECATED"},
2478
    {"15010006", "snooker"},
2479
    {"15011000", "bobsleigh"},
2480
    {"15011001", "two-man sled"},
2481
    {"15011002", "four-man sled"},
2482
    {"15012000", "bowling"},
2483
    {"15013000", "bowls and petanque"},
2484
    {"15014000", "boxing"},
2485
    {"15014001", "super-heavyweight"},
2486
    {"15014002", "heavyweight"},
2487
    {"15014003", "cruiserweight"},
2488
    {"15014004", "light-heavyweight"},
2489
    {"15014005", "super-middleweight"},
2490
    {"15014006", "middleweight"},
2491
    {"15014007", "light-middleweight"},
2492
    {"15014008", "welterweight"},
2493
    {"15014009", "light-welterweight"},
2494
    {"15014010", "lightweight"},
2495
    {"15014011", "super-featherweight"},
2496
    {"15014012", "featherweight"},
2497
    {"15014013", "super-bantamweight"},
2498
    {"15014014", "bantamweight"},
2499
    {"15014015", "super-flyweight"},
2500
    {"15014016", "flyweight"},
2501
    {"15014017", "light flyweight"},
2502
    {"15014018", "straw"},
2503
    {"15014019", "IBF"},
2504
    {"15014020", "WBA"},
2505
    {"15014021", "WBC"},
2506
    {"15014022", "WBO"},
2507
    {"15014023", "French boxing"},
2508
    {"15014024", "Thai boxing"},
2509
    {"15015000", "canoeing and kayaking"},
2510
    {"15015001", "Slalom"},
2511
    {"15015002", "200 m"},
2512
    {"15015003", "500 m"},
2513
    {"15015004", "1000 m"},
2514
    {"15015005", "K1"},
2515
    {"15015006", "K2"},
2516
    {"15015007", "K4"},
2517
    {"15015008", "C1"},
2518
    {"15015009", "C2"},
2519
    {"15015010", "C4"},
2520
    {"15015011", "canoe sailing"},
2521
    {"15015012", "pontoniering"},
2522
    {"15016000", "climbing"},
2523
    {"15016001", "mountaineering"},
2524
    {"15016002", "sport climbing"},
2525
    {"15017000", "cricket"},
2526
    {"15018000", "curling"},
2527
    {"15018001", "icestock sport"},
2528
    {"15019000", "cycling"},
2529
    {"15019001", "track"},
2530
    {"15019002", "pursuit"},
2531
    {"15019003", "Olympic sprint"},
2532
    {"15019004", "sprint"},
2533
    {"15019005", "Keirin"},
2534
    {"15019006", "points race"},
2535
    {"15019007", "Madison race"},
2536
    {"15019008", "500 m time trial"},
2537
    {"15019009", "1 km time trial"},
2538
    {"15019010", "one hour"},
2539
    {"15019011", "road race"},
2540
    {"15019012", "road time trial"},
2541
    {"15019013", "staging race"},
2542
    {"15019014", "cyclo-cross"},
2543
    {"15019015", "Vtt"},
2544
    {"15019016", "Vtt-cross"},
2545
    {"15019017", "Vtt-downhill"},
2546
    {"15019018", "bi-crossing"},
2547
    {"15019019", "trial"},
2548
    {"15019020", "artistic cycling"},
2549
    {"15019021", "cycle ball"},
2550
    {"15020000", "dancing"},
2551
    {"15021000", "diving"},
2552
    {"15021001", "10 m platform"},
2553
    {"15021002", "10 m platform synchronised"},
2554
    {"15021003", "3 m springboard"},
2555
    {"15021004", "3 m springboard synchronised"},
2556
    {"15021005", "subaquatics"},
2557
    {"15021006", "scuba diving"},
2558
    {"15022000", "equestrian"},
2559
    {"15022001", "three-day event"},
2560
    {"15022002", "dressage"},
2561
    {"15022003", "jumping"},
2562
    {"15022004", "cross country"},
2563
    {"15023000", "fencing"},
2564
    {"15023001", "epee"},
2565
    {"15023002", "foil"},
2566
    {"15023003", "sabre"},
2567
    {"15024000", "field Hockey"},
2568
    {"15024001", "roll hockey"},
2569
    {"15025000", "figure Skating"},
2570
    {"15025001", "singles"},
2571
    {"15025002", "pairs"},
2572
    {"15025003", "ice dance"},
2573
    {"15026000", "freestyle Skiing"},
2574
    {"15026001", "moguls"},
2575
    {"15026002", "aerials"},
2576
    {"15026003", "artistic skiing"},
2577
    {"15027000", "golf"},
2578
    {"15028000", "gymnastics"},
2579
    {"15028001", "floor exercise"},
2580
    {"15028002", "vault"},
2581
    {"15028003", "pommel horse"},
2582
    {"15028004", "uneven bars"},
2583
    {"15028005", "parallel bars"},
2584
    {"15028006", "horizontal bar"},
2585
    {"15028007", "rings"},
2586
    {"15028008", "beam"},
2587
    {"15028009", "rhythmic"},
2588
    {"15028010", "clubs"},
2589
    {"15028011", "hoop"},
2590
    {"15028012", "ribbon"},
2591
    {"15028013", "rope"},
2592
    {"15028014", "ball"},
2593
    {"15028015", "trampoline"},
2594
    {"15029000", "handball (team)"},
2595
    {"15030000", "horse racing, harness racing"},
2596
    {"15030001", "flat racing"},
2597
    {"15030002", "steeple chase"},
2598
    {"15030003", "trotting"},
2599
    {"15030004", "cross country"},
2600
    {"15031000", "ice hockey"},
2601
    {"15031001", "National Hockey League (North American)"},
2602
    {"15031002", "sledge hockey"},
2603
    {"15032000", "Jai Alai (Pelota)"},
2604
    {"15032001", "fronton"},
2605
    {"15032002", "jai-alai"},
2606
    {"15032003", "left wall"},
2607
    {"15032004", "trinquet"},
2608
    {"15032005", "rebot"},
2609
    {"15032006", "chistera ancha"},
2610
    {"15032007", "chistera corta"},
2611
    {"15032008", "bare hand"},
2612
    {"15032009", "pala-ancha"},
2613
    {"15032010", "pala-corta"},
2614
    {"15032011", "pasaka"},
2615
    {"15032012", "xare"},
2616
    {"15033000", "judo"},
2617
    {"15033001", "heavyweight"},
2618
    {"15033002", "half-heavyweight"},
2619
    {"15033003", "middleweight"},
2620
    {"15033004", "half-middleweight"},
2621
    {"15033005", "half-lightweight"},
2622
    {"15033006", "lightweight"},
2623
    {"15033007", "extra lightweight"},
2624
    {"15034000", "karate"},
2625
    {"15034001", "sparring"},
2626
    {"15034002", "formal exercise-DEPRECATED"},
2627
    {"15035000", "lacrosse"},
2628
    {"15036000", "luge"},
2629
    {"15036001", "singles"},
2630
    {"15036002", "doubles"},
2631
    {"15037000", "marathon"},
2632
    {"15038000", "modern pentathlon"},
2633
    {"15038001", "running"},
2634
    {"15038002", "shooting"},
2635
    {"15038003", "swimming"},
2636
    {"15038004", "fencing"},
2637
    {"15038005", "showjumping"},
2638
    {"15039000", "motor racing"},
2639
    {"15039001", "Formula One"},
2640
    {"15039002", "F3000"},
2641
    {"15039003", "endurance"},
2642
    {"15039004", "Indy"},
2643
    {"15039005", "CART"},
2644
    {"15039006", "NHRA"},
2645
    {"15039007", "NASCAR"},
2646
    {"15039008", "TRUCKI"},
2647
    {"15040000", "motor rallying"},
2648
    {"15040001", "rallying"},
2649
    {"15040002", "pursuit"},
2650
    {"15040003", "rallycross"},
2651
    {"15041000", "motorcycling"},
2652
    {"15041001", "speed-Grand-Prix"},
2653
    {"15041002", "enduro"},
2654
    {"15041003", "grass-track"},
2655
    {"15041004", "moto-ball"},
2656
    {"15041005", "moto-cross"},
2657
    {"15041006", "rallying"},
2658
    {"15041007", "trial"},
2659
    {"15041008", "endurance"},
2660
    {"15041009", "superbike"},
2661
    {"15041010", "125 cm3"},
2662
    {"15041011", "250 cm3"},
2663
    {"15041012", "500 cm3"},
2664
    {"15041013", "side-cars"},
2665
    {"15041014", "motoGP"},
2666
    {"15042000", "netball"},
2667
    {"15043000", "nordic skiing"},
2668
    {"15043001", "cross-country"},
2669
    {"15043002", "5 km classical time"},
2670
    {"15043003", "10 km classical style"},
2671
    {"15043004", "10 km pursuit free style"},
2672
    {"15043005", "15 km classical style"},
2673
    {"15043006", "15 km pursuit free style"},
2674
    {"15043007", "10 km + 15 km combined"},
2675
    {"15043008", "30 km classical style"},
2676
    {"15043009", "30km free style"},
2677
    {"15043010", "50 km free style"},
2678
    {"15043011", "4x5 km relay"},
2679
    {"15043012", "4x10 km relay"},
2680
    {"15043013", "nordic combined"},
2681
    {"15043014", "raid"},
2682
    {"15043015", "5 km pursuit free style"},
2683
    {"15043016", "1.5 km sprint free"},
2684
    {"15043017", "50 km classic style"},
2685
    {"15044000", "orienteering"},
2686
    {"15044001", "ski orienteering"},
2687
    {"15045000", "polo"},
2688
    {"15046000", "power boating"},
2689
    {"15046001", "F1"},
2690
    {"15046002", "F2"},
2691
    {"15047000", "rowing"},
2692
    {"15047001", "single sculls"},
2693
    {"15047002", "double sculls"},
2694
    {"15047003", "quadruple sculls"},
2695
    {"15047004", "coxless pair"},
2696
    {"15047005", "coxless four"},
2697
    {"15047006", "eight"},
2698
    {"15047007", "lightweight"},
2699
    {"15048000", "rugby league"},
2700
    {"15049000", "rugby union"},
2701
    {"15049001", "rugby 7"},
2702
    {"15050000", "sailing"},
2703
    {"15050001", "Tornado"},
2704
    {"15050002", "soling"},
2705
    {"15050003", "49er"},
2706
    {"15050004", "Europe"},
2707
    {"15050005", "Laser"},
2708
    {"15050006", "470"},
2709
    {"15050007", "Finn"},
2710
    {"15050008", "Star"},
2711
    {"15050009", "flying dutchmann"},
2712
    {"15050010", "505"},
2713
    {"15050011", "staging race"},
2714
    {"15050012", "around the world"},
2715
    {"15050013", "monohull"},
2716
    {"15050014", "multihulls"},
2717
    {"15050015", "yngling"},
2718
    {"15050016", "mistral"},
2719
    {"15051000", "shooting"},
2720
    {"15051001", "10 m air rifle"},
2721
    {"15051002", "10 m air pistol"},
2722
    {"15051003", "10 m running target"},
2723
    {"15051004", "25 m rapid fire pistol"},
2724
    {"15051005", "25 m sport pistol"},
2725
    {"15051006", "50 m free pistol"},
2726
    {"15051007", "50 m free rifle prone"},
2727
    {"15051008", "50 m free rifle 3x40"},
2728
    {"15051009", "50 m sport rifle 3x20"},
2729
    {"15051010", "trap"},
2730
    {"15051011", "double trap"},
2731
    {"15051012", "skeet"},
2732
    {"15052000", "ski jumping"},
2733
    {"15052001", "K90 jump"},
2734
    {"15052002", "K120 jump"},
2735
    {"15052003", "K180 (flying jump)"},
2736
    {"15053000", "snow boarding"},
2737
    {"15053001", "giant slalom"},
2738
    {"15053002", "half-pipe"},
2739
    {"15054000", "soccer"},
2740
    {"15055000", "softball"},
2741
    {"15056000", "speed skating"},
2742
    {"15056001", "500 m"},
2743
    {"15056002", "1000 m"},
2744
    {"15056003", "1500 m"},
2745
    {"15056004", "3000 m"},
2746
    {"15056005", "5000 m"},
2747
    {"15056006", "10000 m"},
2748
    {"15056007", "Short-track"},
2749
    {"15056008", "st 500 m"},
2750
    {"15056009", "st 1000m"},
2751
    {"15056010", "st 1500m"},
2752
    {"15056011", "st 3000m"},
2753
    {"15056012", "st 3000m relay"},
2754
    {"15056013", "st 5000m"},
2755
    {"15056014", "st 5000m relay"},
2756
    {"15057000", "speedway"},
2757
    {"15058000", "sports organisations"},
2758
    {"15058001", "IOC"},
2759
    {"15058002", "international federation"},
2760
    {"15058003", "continental federation"},
2761
    {"15058004", "national federation"},
2762
    {"15058005", "GAISF"},
2763
    {"15059000", "squash"},
2764
    {"15060000", "sumo wrestling"},
2765
    {"15061000", "surfing"},
2766
    {"15062000", "swimming"},
2767
    {"15062001", "50 m freestyle"},
2768
    {"15062002", "100 m freestyle"},
2769
    {"15062003", "200 m freestyle"},
2770
    {"15062004", "400 m freestyle"},
2771
    {"15062005", "800 m freestyle"},
2772
    {"15062006", "1500 m freestyle"},
2773
    {"15062007", "relay 4x50 m freestyle"},
2774
    {"15062008", "relay 4x100 m freestyle"},
2775
    {"15062009", "relay 4x200 m freestyle"},
2776
    {"15062010", "50 m backstroke"},
2777
    {"15062011", "100 m backstroke"},
2778
    {"15062012", "200 m backstroke"},
2779
    {"15062013", "50 m breaststroke"},
2780
    {"15062014", "100 m breaststroke"},
2781
    {"15062015", "200 m breaststroke"},
2782
    {"15062016", "50 m butterfly"},
2783
    {"15062017", "100 m butterfly"},
2784
    {"15062018", "200 m butterfly"},
2785
    {"15062019", "100 m medley"},
2786
    {"15062020", "200 m medley"},
2787
    {"15062021", "400 m medley"},
2788
    {"15062022", "relay 4x50 m medlay"},
2789
    {"15062023", "relay4x100 m medley"},
2790
    {"15062024", "short course"},
2791
    {"15062025", "synchronised technical routine"},
2792
    {"15062026", "synchronised free routine"},
2793
    {"15063000", "table tennis"},
2794
    {"15064000", "Taekwon-Do"},
2795
    {"15064001", "under 49 kg"},
2796
    {"15064002", "under 58 kg"},
2797
    {"15064003", "49-57 kg"},
2798
    {"15064004", "58-68 kg"},
2799
    {"15064005", "57-67 kg"},
2800
    {"15064006", "68-80 kg"},
2801
    {"15064007", "over 67 kg"},
2802
    {"15064008", "over 80 kg"},
2803
    {"15065000", "tennis"},
2804
    {"15065001", "soft tennis"},
2805
    {"15066000", "triathlon"},
2806
    {"15066001", "triathlon swimming"},
2807
    {"15066002", "triathlon cycling"},
2808
    {"15066003", "triathlon run"},
2809
    {"15067000", "volleyball"},
2810
    {"15067001", "beach volleyball"},
2811
    {"15068000", "water polo"},
2812
    {"15069000", "water skiing"},
2813
    {"15069001", "slalom"},
2814
    {"15069002", "trick"},
2815
    {"15069003", "jump"},
2816
    {"15069004", "combined"},
2817
    {"15070000", "weightlifting"},
2818
    {"15070001", "snatch"},
2819
    {"15070002", "clean and jerk"},
2820
    {"15070003", "48 kg"},
2821
    {"15070004", "53 kg"},
2822
    {"15070005", "63 kg"},
2823
    {"15070006", "75 kg"},
2824
    {"15070007", "over 75 kg"},
2825
    {"15070008", "56 kg"},
2826
    {"15070009", "62 kg"},
2827
    {"15070010", "69 kg"},
2828
    {"15070011", "77 kg"},
2829
    {"15070012", "85 kg"},
2830
    {"15070013", "94 kg"},
2831
    {"15070014", "105 kg"},
2832
    {"15070015", "over 105 kg"},
2833
    {"15070016", "powerlifting"},
2834
    {"15071000", "windsurfing"},
2835
    {"15071001", "ocean"},
2836
    {"15071002", "lake"},
2837
    {"15071003", "river"},
2838
    {"15071004", "land"},
2839
    {"15072000", "wrestling"},
2840
    {"15072001", "freestyle"},
2841
    {"15072002", "greco-roman"},
2842
    {"15072003", "over 130 kg"},
2843
    {"15072004", "130 kg"},
2844
    {"15072005", "97 kg"},
2845
    {"15072006", "85 kg"},
2846
    {"15072007", "76 kg"},
2847
    {"15072008", "69 kg"},
2848
    {"15072009", "63 kg"},
2849
    {"15072010", "58 kg"},
2850
    {"15072011", "54 kg"},
2851
    {"15072012", "Swiss wrestling"},
2852
    {"15073000", "sports event"},
2853
    {"15073001", "Summer Olympics"},
2854
    {"15073002", "Winter Olympics"},
2855
    {"15073003", "Summer universiade"},
2856
    {"15073004", "Winter Universiade"},
2857
    {"15073005", "Commonwealth Games"},
2858
    {"15073006", "Winter Goodwill Games"},
2859
    {"15073007", "Summer Asian Games"},
2860
    {"15073008", "Winter Asian Games"},
2861
    {"15073009", "Panamerican Games"},
2862
    {"15073010", "African Games"},
2863
    {"15073011", "Mediterranean Games"},
2864
    {"15073012", "SouthEast Asiatic Games"},
2865
    {"15073013", "PanPacific Games"},
2866
    {"15073014", "SouthPacific Games"},
2867
    {"15073015", "PanArabic Games"},
2868
    {"15073016", "Summer Goodwill Games"},
2869
    {"15073017", "World games"},
2870
    {"15073018", "World Cup"},
2871
    {"15073019", "intercontinental cup"},
2872
    {"15073020", "continental cup"},
2873
    {"15073021", "international cup"},
2874
    {"15073022", "National Cup"},
2875
    {"15073023", "interregional cup"},
2876
    {"15073024", "regional cup"},
2877
    {"15073025", "league cup"},
2878
    {"15073026", "world championship"},
2879
    {"15073027", "intercontinental championship"},
2880
    {"15073028", "continental championship 1st level"},
2881
    {"15073029", "continental championship 2nd level"},
2882
    {"15073030", "continental championship 3rd level"},
2883
    {"15073031", "national championship 1st level"},
2884
    {"15073032", "national championship 2nd level"},
2885
    {"15073033", "national championship3rdlevel"},
2886
    {"15073034", "national championship 4th level"},
2887
    {"15073035", "regional championship"},
2888
    {"15073036", "Grand Prix"},
2889
    {"15073037", "intercontinental tournament"},
2890
    {"15073038", "continental tournament"},
2891
    {"15073039", "international tournament"},
2892
    {"15073040", "national tournament"},
2893
    {"15073041", "inter-nations competition"},
2894
    {"15073042", "inter-clubs competition"},
2895
    {"15073043", "friendly competition"},
2896
    {"15073044", "all-stars competition"},
2897
    {"15073045", "exhibition"},
2898
    {"15073046", "Super Bowl"},
2899
    {"15073047", "paralympic games"},
2900
    {"15074000", "rodeo"},
2901
    {"15074001", "barrel racing"},
2902
    {"15074002", "calf roping"},
2903
    {"15074003", "bull riding"},
2904
    {"15074004", "bulldogging"},
2905
    {"15074005", "saddle bronc"},
2906
    {"15074006", "bareback"},
2907
    {"15074007", "goat roping"},
2908
    {"15075000", "mini golf sport"},
2909
    {"15076000", "bandy"},
2910
    {"15077000", "flying disc"},
2911
    {"15077001", "ultimate"},
2912
    {"15077002", "guts"},
2913
    {"15077003", "overall"},
2914
    {"15077004", "distance"},
2915
    {"15077005", "discathon"},
2916
    {"15077006", "DDC"},
2917
    {"15077007", "SCF"},
2918
    {"15077008", "freestyle"},
2919
    {"15077009", "accuracy"},
2920
    {"15077010", "disc golf"},
2921
    {"15078000", "floorball"},
2922
    {"15079000", "casting"},
2923
    {"15080000", "tug-of-war"},
2924
    {"15081000", "croquette"},
2925
    {"15082000", "dog racing"},
2926
    {"15082001", "sled"},
2927
    {"15082002", "oval track"},
2928
    {"15083000", "skeleton"},
2929
    {"15084000", "Australian rules football"},
2930
    {"15085000", "Canadian football"},
2931
    {"15086000", "duathlon"},
2932
    {"15087000", "hornuss"},
2933
    {"15088000", "fist ball"},
2934
    {"15089000", "inline skating"},
2935
    {"15090000", "grass ski"},
2936
    {"15091000", "snowbiking"},
2937
    {"15092000", "twirling"},
2938
    {"15093000", "kendo"},
2939
    {"15094000", "jukendo"},
2940
    {"15095000", "naginata"},
2941
    {"15096000", "kyudo"},
2942
    {"15097000", "kabaddi"},
2943
    {"15098000", "sepak takraw"},
2944
    {"15099000", "wushu"},
2945
    {"15100000", "darts"},
2946
    {"15101000", "bodybuilding"},
2947
    {"15102000", "sports disciplinary action"},
2948
    {"15103000", "sports awards"},
2949
    {"16000000", "unrest, conflicts and war"},
2950
    {"16001000", "act of terror"},
2951
    {"16002000", "armed conflict"},
2952
    {"16003000", "civil unrest"},
2953
    {"16003001", "revolutions"},
2954
    {"16003002", "rebellions"},
2955
    {"16003003", "political dissent"},
2956
    {"16003004", "religious conflict"},
2957
    {"16003005", "social conflict"},
2958
    {"16004000", "coup d'etat"},
2959
    {"16005000", "guerrilla activity"},
2960
    {"16005001", "bioterrorism"},
2961
    {"16005002", "bombings"},
2962
    {"16006000", "massacre"},
2963
    {"16006001", "genocide"},
2964
    {"16007000", "riots"},
2965
    {"16008000", "demonstration"},
2966
    {"16009000", "war"},
2967
    {"16009001", "civil war"},
2968
    {"16009002", "international military intervention"},
2969
    {"16009003", "prisoners and detainees"},
2970
    {"16010000", "conflict (general)"},
2971
    {"16010001", "peacekeeping force"},
2972
    {"16011000", "crisis"},
2973
    {"16012000", "weaponry"},
2974
    {"17000000", "weather"},
2975
    {"17001000", "forecast"},
2976
    {"17002000", "global change"},
2977
    {"17003000", "report"},
2978
    {"17003001", "weather news"},
2979
    {"17004000", "statistic"},
2980
    {"17005000", "warning"},
2981
};
2982
2983
//! XMP iptcExt:DigitalSourcefileType
2984
constexpr TagVocabulary iptcExtDigitalSourcefileType[] = {
2985
    {"scanfilm", N_("Scan from film")},   {"scantransparency", N_("Scan from transparency (including slide)")},
2986
    {"scanprint", N_("Scan from print")}, {"cameraraw", N_("Camera RAW")},
2987
    {"cameratiff", N_("Camera TIFF")},    {"camerajpeg", N_("Camera JPEG")},
2988
};
2989
2990
//! XMP iptcExt:DigitalSourceType
2991
//  Source: http://cv.iptc.org/newscodes/digitalsourcetype/
2992
constexpr TagVocabulary iptcExtDigitalSourceType[] = {
2993
    {"digitalCapture", N_("Digital capture")},
2994
    {"negativeFilm", N_("Digitised from a negative on film")},
2995
    {"positiveFilm", N_("Digitised from a positive on film")},
2996
    {"print", N_("Digitised from a print on non-transparent medium")},
2997
    {"softwareImage", N_("The digital image was created by computer software")},
2998
};
2999
3000
const XmpPropertyInfo xmpPlusInfo[] = {
3001
    // PLUS Version 2.0.1
3002
    // https://ns.useplus.org/LDF/ldf-XMPSpecification
3003
    // Header
3004
    {"Version", N_("PLUS Version"), "Text", xmpText, xmpExternal,
3005
     N_("The version number of the PLUS standards in place at the time of the transaction.")},
3006
    {"Licensee", N_("Licensee"), "seq LicenseeDetail", xmpSeq, xmpExternal,
3007
     N_("Party or parties to whom the license is granted by the Licensor/s under the license transaction.")},
3008
    {"LicenseeID", N_("Licensee ID"), "Text", xmpText, xmpExternal, N_("Optional PLUS-ID identifying each Licensee.")},
3009
    {"LicenseeName", N_("Licensee Name"), "ProperName", xmpText, xmpExternal, N_("Name of each Licensee.")},
3010
    {"EndUser", N_("End User"), "seq EndUserDetail", xmpSeq, xmpExternal,
3011
     N_("Party or parties ultimately making use of the image under the license.")},
3012
    {"EndUserID", N_("End User ID"), "Text", xmpText, xmpExternal, N_("Optional PLUS-ID identifying each End User.")},
3013
    {"EndUserName", N_("End User Name"), "ProperName", xmpText, xmpExternal, N_("Name of each End User.")},
3014
    {"Licensor", N_("Licensor"), "seq LicensorDetail", xmpSeq, xmpExternal,
3015
     N_("Party or parties granting the license to the Licensee.")},
3016
    {"LicensorID", N_("Licensor ID"), "Text", xmpText, xmpExternal, N_("Optional PLUS-ID identifying each Licensor.")},
3017
    {"LicensorName", N_("Licensor Name"), "ProperName", xmpText, xmpExternal, N_("Name of each Licensor.")},
3018
    {"LicensorStreetAddress", N_("Licensor Address"), "Text", xmpText, xmpExternal, N_("Licensor street address.")},
3019
    {"LicensorExtendedAddress", N_("Licensor Address Detail"), "Text", xmpText, xmpExternal,
3020
     N_("Additional Licensor mailing address details.")},
3021
    {"LicensorCity", N_("Licensor City"), "Text", xmpText, xmpExternal, N_("Licensor City name.")},
3022
    {"LicensorRegion", N_("Licensor State or Province"), "Text", xmpText, xmpExternal,
3023
     N_("Licensor State or Province name.")},
3024
    {"LicensorPostalCode", N_("Licensor Postal Code"), "Text", xmpText, xmpExternal,
3025
     N_("Licensor Postal Code or Zip Code.")},
3026
    {"LicensorCountry", N_("Licensor Country"), "Text", xmpText, xmpExternal, N_("Licensor Country name.")},
3027
    {"LicensorTelephoneType1", N_("Licensor Telephone Type 1"), "URL", xmpText, xmpExternal,
3028
     N_("Licensor Telephone Type 1.")},
3029
    {"LicensorTelephone1", N_("Licensor Telephone 1"), "Text", xmpText, xmpExternal,
3030
     N_("Licensor Telephone number 1.")},
3031
    {"LicensorTelephoneType2", N_("Licensor Telephone Type 2"), "URL", xmpText, xmpExternal,
3032
     N_("Licensor Telephone Type 2.")},
3033
    {"LicensorTelephone2", N_("Licensor Telephone 2"), "Text", xmpText, xmpExternal,
3034
     N_("Licensor Telephone number 2.")},
3035
    {"LicensorEmail", N_("Licensor Email"), "Text", xmpText, xmpExternal, N_("Licensor Email address.")},
3036
    {"LicensorURL", N_("Licensor URL"), "URL", xmpText, xmpExternal,
3037
     N_("URL for a Licensor web page. May facilitate licensing of the image.")},
3038
    {"LicensorNotes", N_("Licensor Notes"), "Lang Alt", langAlt, xmpExternal,
3039
     N_("Supplemental information for use in identifying and contacting the Licensor/s.")},
3040
    // Media Permissions
3041
    {"MediaSummaryCode", N_("PLUS Media Summary Code"), "Text", xmpText, xmpExternal,
3042
     N_("A PLUS-standardized alphanumeric code string summarizing the media usages included in the license.")},
3043
    // Constraints
3044
    {"LicenseStartDate", N_("License Start Date"), "Date", xmpText, xmpExternal,
3045
     N_("The date on which the license takes effect.")},
3046
    {"LicenseEndDate", N_("License End Date"), "Date", xmpText, xmpExternal,
3047
     N_("The date on which the license expires.")},
3048
    {"MediaConstraints", N_("Media Constraints"), "Lang Alt", langAlt, xmpExternal,
3049
     N_("Constraints limiting the scope of PLUS Media Usage/s included in the license to particular named media or "
3050
        "to media not yet specifically defined in the PLUS Media Matrix.")},
3051
    {"RegionConstraints", N_("Region Constraints"), "Lang Alt", langAlt, xmpExternal,
3052
     N_("Constraints limiting the scope of geographic distribution to specific cities, states, provinces or other "
3053
        "areas to be included in or excluded from the PLUS Regions specified in the Media Usages specified in the "
3054
        "license.")},
3055
    {"ProductOrServiceConstraints", N_("Product or Service Constraints"), "Lang Alt", langAlt, xmpExternal,
3056
     N_("Constraints limiting usage of the image to promotion of/association with a named product or service.")},
3057
    {"ImageFileConstraints", N_("Image File Constraints"), "bag URL", xmpBag, xmpExternal,
3058
     N_("Constraints on the changing of the image file name, metadata or file type.")},
3059
    {"ImageAlterationConstraints", N_("Image Alteration Constraints"), "bag URL", xmpBag, xmpExternal,
3060
     N_("Constraints on alteration of the image by cropping, flipping, retouching, colorization, de-colorization "
3061
        "or merging.")},
3062
    {"ImageDuplicationConstraints", N_("Image Duplication Constraints"), "URL", xmpText, xmpExternal,
3063
     N_("Constraints on the creation of duplicates of the image.")},
3064
    {"ModelReleaseStatus", N_("Model Release Status"), "URL", xmpText, xmpExternal,
3065
     N_("Summarizes the availability and scope of model releases authorizing usage of the likenesses of persons "
3066
        "appearing in the photograph.")},
3067
    {"ModelReleaseID", N_("Model Release ID"), "bag Text", xmpBag, xmpExternal,
3068
     N_("Optional identifier associated with each Model Release.")},
3069
    {"MinorModelAgeDisclosure", N_("Minor Model Age Disclosure"), "URL", xmpText, xmpExternal,
3070
     N_("Age of the youngest model pictured in the image, at the time that the image was made.")},
3071
    {"PropertyReleaseStatus", N_("Property Release Status"), "URL", xmpText, xmpExternal,
3072
     N_("Summarizes the availability and scope of property releases authorizing usage of the properties appearing "
3073
        "in the photograph.")},
3074
    {"PropertyReleaseID", N_("Property Release ID"), "bag Text", xmpBag, xmpExternal,
3075
     N_("Optional identifier associated with each Property Release.")},
3076
    {"OtherConstraints", N_("Other Constraints"), "Lang Alt", langAlt, xmpExternal,
3077
     N_("Additional constraints on the use of the asset.")},
3078
    // Requirements
3079
    {"CreditLineRequired", N_("Credit Line Required"), "URL", xmpText, xmpExternal,
3080
     N_("Attribution requirements, if any.")},
3081
    {"AdultContentWarning", N_("Adult Content Warning"), "URL", xmpText, xmpExternal,
3082
     N_("Warning indicating the presence of content not suitable for minors.")},
3083
    {"OtherLicenseRequirements", N_("Other License Requirements"), "Lang Alt", langAlt, xmpExternal,
3084
     N_("Additional license requirements.")},
3085
    // Conditions
3086
    {"TermsAndConditionsText", N_("Terms and Conditions Text"), "Lang Alt", langAlt, xmpExternal,
3087
     N_("Terms and Conditions applying to the license.")},
3088
    {"TermsAndConditionsURL", N_("Terms and Conditions URL"), "URL", xmpText, xmpExternal,
3089
     N_("URL for Terms and Conditions applying to the license.")},
3090
    {"OtherConditions", N_("Other License Conditions"), "Lang Alt", langAlt, xmpExternal,
3091
     N_("Additional license conditions.")},
3092
    // Image Info
3093
    {"ImageType", N_("Image Type"), "URL", xmpText, xmpExternal, N_("Identifies the type of image delivered.")},
3094
    {"LicensorImageID", N_("Licensor Image ID"), "Text", xmpText, xmpExternal,
3095
     N_("Optional identifier assigned by the Licensor to the image.")},
3096
    {"FileNameAsDelivered", N_("Image File Name As Delivered"), "Text", xmpText, xmpExternal,
3097
     N_("Name of the image file delivered to the Licensee for use under the license.")},
3098
    {"ImageFileFormatAsDelivered", N_("Image File Format As Delivered"), "URL", xmpText, xmpExternal,
3099
     N_("File format of the image file delivered to the Licensee for use under the license.")},
3100
    {"ImageFileSizeAsDelivered", N_("Image File Size As Delivered"), "URL", xmpText, xmpExternal,
3101
     N_("Size of the image file delivered to the Licensee.")},
3102
    {"CopyrightStatus", N_("Copyright Status"), "URL", xmpText, xmpExternal, N_("Copyright status of the image.")},
3103
    {"CopyrightRegistrationNumber", N_("Copyright Registration Number"), "Text", xmpText, xmpExternal,
3104
     N_("Copyright Registration Number, if any, applying to the licensed image.")},
3105
    {"FirstPublicationDate", N_("First Publication Date"), "Date", xmpText, xmpExternal,
3106
     N_("The date on which the image was first published.")},
3107
    {"CopyrightOwner", N_("Copyright Owner"), "seq CopyrightOwnerDetail", xmpSeq, xmpExternal,
3108
     N_("Owner or owners of the copyright in the licensed image.")},
3109
    {"CopyrightOwnerID", N_("Copyright Owner ID"), "Text", xmpText, xmpExternal,
3110
     N_("Optional PLUS-ID identifying each Copyright Owner.")},
3111
    {"CopyrightOwnerName", N_("Copyright Owner Name"), "ProperName", xmpText, xmpExternal,
3112
     N_("Name of Copyright Owner.")},
3113
    {"CopyrightOwnerImageID", N_("Copyright Owner Image ID"), "Text", xmpText, xmpExternal,
3114
     N_("Optional identifier assigned by the Copyright Owner to the image.")},
3115
    {"ImageCreator", N_("Image Creator"), "seq ImageCreatorDetail", xmpSeq, xmpExternal, N_("Creator/s of the image.")},
3116
    {"ImageCreatorID", N_("Image Creator ID"), "Text", xmpText, xmpExternal,
3117
     N_("Optional PLUS-ID identifying each Image Creator.")},
3118
    {"ImageCreatorName", N_("Image Creator Name"), "ProperName", xmpText, xmpExternal, N_("Name of Image Creator.")},
3119
    {"ImageCreatorImageID", N_("Image Creator Image ID"), "Text", xmpText, xmpExternal,
3120
     N_("Optional identifier assigned by the Image Creator to the image.")},
3121
    {"ImageSupplierID", N_("Image Supplier ID"), "Text", xmpText, xmpExternal,
3122
     N_("Optional PLUS-ID identifying the Image Supplier.")},
3123
    {"ImageSupplierName", N_("Image Supplier Name"), "ProperName", xmpText, xmpExternal, N_("Name of Image Supplier.")},
3124
    {"ImageSupplierImageID", N_("Image Supplier Image ID"), "Text", xmpText, xmpExternal,
3125
     N_("Optional identifier assigned by the Image Supplier to the image.")},
3126
    {"LicenseeImageID", N_("Licensee Image ID"), "Text", xmpText, xmpExternal,
3127
     N_("Optional identifier assigned by the Licensee to the image.")},
3128
    {"LicenseeImageNotes", N_("Licensee Image Notes"), "Lang Alt", langAlt, xmpExternal,
3129
     N_("Notes added by Licensee.")},
3130
    {"OtherImageInfo", N_("Other Image Info"), "Lang Alt", langAlt, xmpExternal, N_("Additional image information.")},
3131
    // License Info
3132
    {"LicenseID", N_("License ID"), "Text", xmpText, xmpExternal,
3133
     N_("Optional PLUS-ID assigned by the Licensor to the License.")},
3134
    {"LicensorTransactionID", N_("Licensor Transaction ID"), "bag Text", xmpBag, xmpExternal,
3135
     N_("Identifier assigned by Licensor for Licensor's reference and internal use.")},
3136
    {"LicenseeTransactionID", N_("Licensee Transaction ID"), "bag Text", xmpBag, xmpExternal,
3137
     N_("Identifier assigned by Licensee for Licensee's reference and internal use.")},
3138
    {"LicenseeProjectReference", N_("Licensee Project Reference"), "bag Text", xmpBag, xmpExternal,
3139
     N_("Project reference name or description assigned by Licensee.")},
3140
    {"LicenseTransactionDate", N_("License Transaction Date"), "Date", xmpText, xmpExternal,
3141
     N_("The date of the License Transaction.")},
3142
    {"Reuse", N_("Reuse"), "URL", xmpText, xmpExternal,
3143
     N_("Indicates whether a license is a repeat or an initial license.  Reuse may require that licenses stored in "
3144
        "files previously delivered to the customer be updated.")},
3145
    {"DataMining", N_("Data Mining"), "URL", xmpText, xmpExternal,
3146
     N_("Data mining prohibition or permission, optionally with constraints.")},
3147
    {"OtherLicenseDocuments", N_("Other License Documents"), "bag Text", xmpBag, xmpExternal,
3148
     N_("Reference information for additional documents associated with the license.")},
3149
    {"OtherLicenseInfo", N_("Other License Info"), "Lang Alt", langAlt, xmpExternal,
3150
     N_("Additional license information.")},
3151
    // Custom Fields
3152
    {"Custom1", N_("Custom 1"), "bag Lang Alt", xmpBag, xmpExternal,
3153
     N_("Optional field for use at Licensor's discretion.")},
3154
    {"Custom2", N_("Custom 2"), "bag Lang Alt", xmpBag, xmpExternal,
3155
     N_("Optional field for use at Licensor's discretion.")},
3156
    {"Custom3", N_("Custom 3"), "bag Lang Alt", xmpBag, xmpExternal,
3157
     N_("Optional field for use at Licensor's discretion.")},
3158
    {"Custom4", N_("Custom 4"), "bag Lang Alt", xmpBag, xmpExternal,
3159
     N_("Optional field for use at Licensor's discretion.")},
3160
    {"Custom5", N_("Custom 5"), "bag Lang Alt", xmpBag, xmpExternal,
3161
     N_("Optional field for use at Licensor's discretion.")},
3162
    {"Custom6", N_("Custom 6"), "bag Lang Alt", xmpBag, xmpExternal,
3163
     N_("Optional field for use at Licensee's discretion.")},
3164
    {"Custom7", N_("Custom 7"), "bag Lang Alt", xmpBag, xmpExternal,
3165
     N_("Optional field for use at Licensee's discretion.")},
3166
    {"Custom8", N_("Custom 8"), "bag Lang Alt", xmpBag, xmpExternal,
3167
     N_("Optional field for use at Licensee's discretion.")},
3168
    {"Custom9", N_("Custom 9"), "bag Lang Alt", xmpBag, xmpExternal,
3169
     N_("Optional field for use at Licensee's discretion.")},
3170
    {"Custom10", N_("Custom 10"), "bag Lang Alt", xmpBag, xmpExternal,
3171
     N_("Optional field for use at Licensee's discretion.")},
3172
    // End of list marker
3173
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3174
};
3175
3176
//! XMP plus:AdultContentWarning
3177
constexpr TagVocabulary plusAdultContentWarning[] = {
3178
    {"CW-AWR", N_("Adult Content Warning Required")},
3179
    {"CW-NRQ", N_("Not Required")},
3180
    {"CW-UNK", N_("Unknown")},
3181
};
3182
3183
//! XMP plus:CopyrightStatus
3184
constexpr TagVocabulary plusCopyrightStatus[] = {
3185
    {"CS-PRO", N_("Protected")},
3186
    {"CS-PUB", N_("Public Domain")},
3187
    {"CS-UNK", N_("Unknown")},
3188
};
3189
3190
//! XMP plus:CreditLineRequired
3191
constexpr TagVocabulary plusCreditLineRequired[] = {
3192
    {"CR-CAI", N_("Credit Adjacent To Image")},
3193
    {"CR-CCA", N_("Credit in Credits Area")},
3194
    {"CR-COI", N_("Credit on Image")},
3195
    {"CR-NRQ", N_("Not Require")},
3196
};
3197
3198
//! XMP plus:ImageAlterationConstraints
3199
constexpr TagVocabulary plusImageAlterationConstraints[] = {
3200
    {"AL-CLR", N_("No Colorization")}, {"AL-CRP", N_("No Cropping")}, {"AL-DCL", N_("No De-Colorization")},
3201
    {"AL-FLP", N_("No Flipping")},     {"AL-MRG", N_("No Merging")},  {"AL-RET", N_("No Retouching")},
3202
};
3203
3204
//! XMP plus:ImageDuplicationConstraints
3205
constexpr TagVocabulary plusImageDuplicationConstraints[] = {
3206
    {"DP-LIC", N_("Duplication Only as Necessary Under License")},
3207
    {"DP-NDC", N_("No Duplication Constraints")},
3208
    {"DP-NOD", N_("No Duplication")},
3209
};
3210
3211
//! XMP plus:ImageFileConstraints
3212
constexpr TagVocabulary plusImageFileConstraints[] = {
3213
    {"IF-MFN", N_("Maintain File Name")},
3214
    {"IF-MFT", N_("Maintain File Type")},
3215
    {"IF-MID", N_("Maintain ID in File Name")},
3216
    {"IF-MMD", N_("Maintain Metadata")},
3217
};
3218
3219
//! XMP plus:ImageFileFormatAsDelivered
3220
constexpr TagVocabulary plusImageFileFormatAsDelivered[] = {
3221
    {"FF-BMP", N_("Windows Bitmap (BMP)")},
3222
    {"FF-DNG", N_("Digital Negative (DNG)")},
3223
    {"FF-EPS", N_("Encapsulated PostScript (EPS)")},
3224
    {"FF-GIF", N_("Graphics Interchange Format (GIF)")},
3225
    {"FF-JPG", N_("JPEG Interchange Formats (JPG, JIF, JFIF)")},
3226
    {"FF-OTR", N_("Other")},
3227
    {"FF-PIC", N_("Macintosh Picture (PICT)")},
3228
    {"FF-PNG", N_("Portable Network Graphics (PNG)")},
3229
    {"FF-PSD", N_("Photoshop Document (PSD)")},
3230
    {"FF-RAW", N_("Proprietary RAW Image Format")},
3231
    {"FF-TIF", N_("Tagged Image File Format (TIFF)")},
3232
    {"FF-WMP", N_("Windows Media Photo (HD Photo)")},
3233
};
3234
3235
//! XMP plus:ImageFileSizeAsDelivered
3236
constexpr TagVocabulary plusImageFileSizeAsDelivered[] = {
3237
    {"SZ-G50", N_("Greater than 50 MB")}, {"SZ-U01", N_("Up to 1 MB")},  {"SZ-U10", N_("Up to 10 MB")},
3238
    {"SZ-U30", N_("Up to 30 MB")},        {"SZ-U50", N_("Up to 50 MB")},
3239
};
3240
3241
//! XMP plus:ImageType
3242
constexpr TagVocabulary plusImageType[] = {
3243
    {"TY-ILL", N_("Illustrated Image")},
3244
    {"TY-MCI", N_("Multimedia or Composited Image")},
3245
    {"TY-OTR", N_("Other")},
3246
    {"TY-PHO", N_("Photographic Image")},
3247
    {"TY-VID", N_("Video")},
3248
};
3249
3250
//! XMP plus:LicensorTelephoneType
3251
constexpr TagVocabulary plusLicensorTelephoneType[] = {
3252
    {"cell", N_("Cell")}, {"fax", N_("FAX")}, {"home", N_("Home")}, {"pager", N_("Pager")}, {"work", N_("Work")},
3253
};
3254
3255
//! XMP plus:MinorModelAgeDisclosure
3256
constexpr TagVocabulary plusMinorModelAgeDisclosure[] = {
3257
    {"AG-UNK", N_("Age Unknown")},     {"AG-A25", N_("Age 25 or Over")}, {"AG-A24", N_("Age 24")},
3258
    {"AG-A23", N_("Age 23")},          {"AG-A22", N_("Age 22")},         {"AG-A21", N_("Age 21")},
3259
    {"AG-A20", N_("Age 20")},          {"AG-A19", N_("Age 19")},         {"AG-A18", N_("Age 18")},
3260
    {"AG-A17", N_("Age 17")},          {"AG-A16", N_("Age 16")},         {"AG-A15", N_("Age 15")},
3261
    {"AG-U14", N_("Age 14 or Under")},
3262
};
3263
3264
//! XMP plus:ModelReleaseStatus
3265
constexpr TagVocabulary plusModelReleaseStatus[] = {
3266
    {"MR-NON", N_("None")},
3267
    {"MR-NAP", N_("Not Applicable")},
3268
    {"MR-UMR", N_("Unlimited Model Releases")},
3269
    {"MR-LMR", N_("Limited or Incomplete Model Releases")},
3270
};
3271
3272
//! XMP plus:PropertyReleaseStatus
3273
constexpr TagVocabulary plusPropertyReleaseStatus[] = {
3274
    {"PR-NON", N_("None")},
3275
    {"PR-NAP", N_("Not Applicable")},
3276
    {"PR-UPR", N_("Unlimited Property Releases")},
3277
    {"PR-LPR", N_("Limited or Incomplete Property Releases")},
3278
};
3279
3280
//! XMP plus:Reuse
3281
constexpr TagVocabulary plusReuse[] = {
3282
    {"RE-NAP", N_("Not Applicable")},
3283
    {"RE-REU", N_("Repeat Use")},
3284
};
3285
3286
//! XMP plus:DataMining
3287
constexpr TagVocabulary plusDataMining[] = {
3288
    {"DMI-UNSPECIFIED", N_("Unspecified - no prohibition defined")},
3289
    {"DMI-ALLOWED", N_("Allowed")},
3290
    {"DMI-PROHIBITED-AIMLTRAINING", N_("Prohibited for AI/ML training")},
3291
    {"DMI-PROHIBITED-GENAIMLTRAINING", N_("Prohibited for Generative AI/ML training")},
3292
    {"DMI-PROHIBITED-EXCEPTSEARCHENGINEINDEXING", N_("Prohibited except for search engine indexing")},
3293
    {"DMI-PROHIBITED", N_("Prohibited")},
3294
    {"DMI-PROHIBITED-SEECONSTRAINT", N_("Prohibited, see Other Constraints property")},
3295
    {"DMI-PROHIBITED-SEEEMBEDDEDRIGHTSEXPR", N_("Prohibited, see Embedded Encoded Rights Expression property")},
3296
    {"DMI-PROHIBITED-SEELINKEDRIGHTSEXPR", N_("Prohibited, see Linked Encoded Rights Expression property")},
3297
};
3298
3299
const XmpPropertyInfo xmpMediaProInfo[] = {
3300
    {"Event", N_("Event"), "Text", xmpText, xmpExternal, N_("Fixture Identification")},
3301
    {"Status", N_("Status"), "Text", xmpText, xmpExternal, N_("A notation making the image unique")},
3302
    {"People", N_("People"), "bag Text", xmpBag, xmpExternal, N_("Contact")},
3303
    {"CatalogSets", N_("Catalog Sets"), "bag Text", xmpBag, xmpExternal,
3304
     N_("Descriptive markers of catalog items by content")},
3305
    // End of list marker
3306
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3307
};
3308
3309
const XmpPropertyInfo xmpExpressionMediaInfo[] = {
3310
    {"Event", N_("Event"), "Text", xmpText, xmpExternal, N_("Fixture Identification")},
3311
    {"Status", N_("Status"), "Text", xmpText, xmpExternal, N_("A notation making the image unique")},
3312
    {"People", N_("People"), "bag Text", xmpBag, xmpExternal, N_("Contact")},
3313
    {"CatalogSets", N_("Catalog Sets"), "bag Text", xmpBag, xmpExternal,
3314
     N_("Descriptive markers of catalog items by content")},
3315
    // End of list marker
3316
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3317
};
3318
3319
const XmpPropertyInfo xmpMicrosoftPhotoInfo[] = {
3320
    {"RegionInfo", N_("RegionInfo"), "RegionInfo", xmpText, xmpInternal,
3321
     N_("Microsoft Photo people-tagging metadata root")},
3322
    // End of list marker
3323
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3324
};
3325
3326
const XmpPropertyInfo xmpMicrosoftPhotoRegionInfoInfo[] = {
3327
    {"Regions", N_("Regions"), "bag Region", xmpBag, xmpExternal, N_("Contains Regions/person tags")},
3328
    {"DateRegionsValid", N_("Date Regions Valid"), "Date", xmpText, xmpExternal,
3329
     N_("Date the last region was created")},
3330
    // End of list marker
3331
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3332
};
3333
3334
const XmpPropertyInfo xmpMicrosoftPhotoRegionInfo[] = {
3335
    {"PersonDisplayName", N_("Person Display Name"), "Text", xmpText, xmpExternal,
3336
     N_("Name of the person (in the given rectangle)")},
3337
    {"Rectangle", N_("Rectangle"), "Text", xmpText, xmpExternal,
3338
     N_("Rectangle that identifies the person within the photo")},
3339
    {
3340
        "PersonEmailDigest",
3341
        N_("Person Email Digest"),
3342
        "Text",
3343
        xmpText,
3344
        xmpExternal,
3345
        N_("SHA-1 encrypted message hash of the person's Windows Live e-mail address"),
3346
    },
3347
    {"PersonLiveIdCID", N_("Person LiveId CID"), "Text", xmpText, xmpExternal,
3348
     N_("Signed decimal representation of the person's Windows Live CID")},
3349
    // End of list marker
3350
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3351
};
3352
3353
const XmpPropertyInfo xmpMWGRegionsInfo[] = {
3354
    {"Regions", N_("Regions"), "RegionInfo", xmpText, xmpInternal,
3355
     N_("Main structure containing region based information")},
3356
    {"AppliedToDimensions", N_("Applied To Dimensions"), "Dimensions", xmpText, xmpExternal,
3357
     N_("Width and height of image when storing region data")},
3358
    {"RegionList", N_("Region List"), "bag RegionStruct", xmpBag, xmpExternal, N_("List of Region structures")},
3359
    {"Area", N_("Area"), "Area", xmpText, xmpExternal, N_("Descriptive markers of catalog items by content")},
3360
    {"Type", N_("Type"), "closed Choice of Text", xmpText, xmpExternal,
3361
     N_("Type purpose of region (Face|Pet|Focus|BarCode)")},
3362
    {"Name", N_("Name"), "Text", xmpText, xmpExternal, N_("Name/ short description of content in image region")},
3363
    {"Description", N_("Description"), "Text", xmpText, xmpExternal,
3364
     N_("Usage scenario for a given focus area (EvaluatedUsed|EvaluatedNotUsed|NotEvaluatedNotUsed)")},
3365
    {"FocusUsage", N_("Focus Usage"), "closed Choice of Text", xmpText, xmpExternal,
3366
     N_("Descriptive markers of catalog items by content")},
3367
    {"BarCodeValue", N_("Bar Code Value"), "Text", xmpText, xmpExternal, N_("Decoded BarCode value string")},
3368
    {"Extensions", N_("Extensions"), "Text", xmpText, xmpInternal,
3369
     N_("Any top level XMP property to describe the region content")},
3370
    // End of list marker
3371
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3372
};
3373
3374
const XmpPropertyInfo xmpMWGKeywordInfo[] = {
3375
    {"Keywords", N_("Keywords"), "KeywordInfo", xmpText, xmpInternal,
3376
     N_("Main structure containing keyword based information")},
3377
    {"Hierarchy", N_("Hierarchy"), "bag KeywordStruct", xmpBag, xmpExternal, N_("List of root keyword structures")},
3378
    {"Keyword", N_("Keyword"), "Text", xmpText, xmpExternal, N_("Name of keyword (-node)")},
3379
    {"Applied", N_("Applied"), "Boolean", xmpText, xmpExternal,
3380
     N_("True if this keyword has been applied, False otherwise. If missing, mwg-kw:Applied is presumed True for "
3381
        "leaf nodes and False for ancestor nodes")},
3382
    {"Children", N_("Children"), "bag KeywordStruct", xmpBag, xmpExternal, N_("List of children keyword structures")},
3383
3384
    // End of list marker
3385
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3386
};
3387
3388
const XmpPropertyInfo xmpGPanoInfo[] = {
3389
    {"UsePanoramaViewer", N_("Use Panorama Viewer"), "Boolean", xmpText, xmpExternal,
3390
     N_("Whether to show this image in a panorama viewer rather than as a normal flat image. This may be specified "
3391
        "based on user preferences or by the stitching software. The application displaying or ingesting the image "
3392
        "may choose to ignore this.")},
3393
    {"CaptureSoftware", N_("Capture Software"), "Text", xmpText, xmpExternal,
3394
     N_("If capture was done using an application on a mobile device, such as an Android phone, the name of the "
3395
        "application that was used (such as \"Photo Sphere\"). This should be left blank if source images were "
3396
        "captured manually, such as by using a DSLR on a tripod.")},
3397
    {"StitchingSoftware", N_("Stitching Software"), "Text", xmpText, xmpExternal,
3398
     N_("The software that was used to create the final panorama. This may sometimes be the same value as that of  "
3399
        "GPano:CaptureSoftware.")},
3400
    {"ProjectionType", N_("Projection Type"), "Open Choice of Text", xmpText, xmpExternal,
3401
     N_("Projection type used in the image file. Google products currently support the value equirectangular.")},
3402
    {"PoseHeadingDegrees", N_("Pose Heading Degrees"), "Real", xmpText, xmpExternal,
3403
     N_("Compass heading, measured in degrees, for the center the image. Value must be >= 0 and < 360.")},
3404
    {"PosePitchDegrees", N_("Pose Pitch Degrees"), "Real", xmpText, xmpExternal,
3405
     N_("Pitch, measured in degrees, for the center in the image. Value must be >= -90 and <= 90.")},
3406
    {"PoseRollDegrees", N_("Pose Roll Degrees"), "Real", xmpText, xmpExternal,
3407
     N_("Roll, measured in degrees, of the image where level with the horizon is 0. Value must be > -180 and <= "
3408
        "180.")},
3409
    {"InitialViewHeadingDegrees", N_("Initial View Heading Degrees"), "Integer", xmpText, xmpExternal,
3410
     N_("The heading angle of the initial view in degrees.")},
3411
    {"InitialViewPitchDegrees", N_("Initial View Pitch Degrees"), "Integer", xmpText, xmpExternal,
3412
     N_("The pitch angle of the initial view in degrees.")},
3413
    {"InitialViewRollDegrees", N_("Initial View Roll Degrees"), "Integer", xmpText, xmpExternal,
3414
     N_("The roll angle of the initial view in degrees.")},
3415
    {"InitialHorizontalFOVDegrees", N_("Initial Horizontal FOV Degrees"), "Real", xmpText, xmpExternal,
3416
     N_("The initial horizontal field of view that the viewer should display (in degrees). This is similar to a "
3417
        "zoom level.")},
3418
    {"FirstPhotoDate", N_("First Photo Date"), "Date", xmpText, xmpExternal,
3419
     N_("Date and time for the first image created in the panorama.")},
3420
    {"LastPhotoDate", N_("Last Photo Date"), "Date", xmpText, xmpExternal,
3421
     N_("Date and time for the last image created in the panorama.")},
3422
    {"SourcePhotosCount", N_("Source Photos Count"), "Integer", xmpText, xmpExternal,
3423
     N_("Number of source images used to create the panorama")},
3424
    {"ExposureLockUsed", N_("Exposure Lock Used"), "Boolean", xmpText, xmpExternal,
3425
     N_("When individual source photographs were captured, whether or not the camera's exposure setting was "
3426
        "locked.")},
3427
    {"CroppedAreaImageWidthPixels", N_("Cropped Area Image Width Pixels"), "Integer", xmpText, xmpExternal,
3428
     N_("Original width in pixels of the image (equal to the actual image's width for unedited images).")},
3429
    {"CroppedAreaImageHeightPixels", N_("Cropped Area Image Height Pixels"), "Integer", xmpText, xmpExternal,
3430
     N_("Original height in pixels of the image (equal to the actual image's height for unedited images).")},
3431
    {"FullPanoWidthPixels", N_("Full Pano Width Pixels"), "Integer", xmpText, xmpExternal,
3432
     N_("Original full panorama width from which the image was cropped. Or, if only a partial panorama was "
3433
        "captured, this specifies the width of what the full panorama would have been.")},
3434
    {"FullPanoHeightPixels", N_("Full Pano Height Pixels"), "Integer", xmpText, xmpExternal,
3435
     N_("Original full panorama height from which the image was cropped. Or, if only a partial panorama was "
3436
        "captured, this specifies the height of what the full panorama would have been.")},
3437
    {"CroppedAreaLeftPixels", N_("Cropped Area Left Pixels"), "Integer", xmpText, xmpExternal,
3438
     N_("Column where the left edge of the image was cropped from the full sized panorama.")},
3439
    {"CroppedAreaTopPixels", N_("Cropped Area Top Pixels"), "Integer", xmpText, xmpExternal,
3440
     N_("Row where the top edge of the image was cropped from the full sized panorama.")},
3441
    {"InitialCameraDolly", N_("Initial Camera Dolly"), "Real", xmpText, xmpExternal,
3442
     N_("This optional parameter moves the virtual camera position along the line of sight, away from the center "
3443
        "of the photo sphere. A rear surface position is represented by the value -1.0, while a front surface "
3444
        "position is represented by 1.0. For normal viewing, this parameter should be set to 0.")},
3445
3446
    // End of list marker
3447
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
3448
};
3449
3450
const XmpPropertyInfo xmpVideoInfo[] = {
3451
    {"Album", N_("Album"), "Text", xmpText, xmpExternal, N_("The name of the album.")},
3452
    {"ArchivalLocation", N_("Archival Location"), "Text", xmpText, xmpExternal,
3453
     N_("Information about the Archival Location.")},
3454
    {"Arranger", N_("Arranger"), "Text", xmpText, xmpExternal, N_("Information about the Arranger.")},
3455
    {"ArrangerKeywords", N_("Arranger Keywords"), "Text", xmpText, xmpExternal,
3456
     N_("Information about the Arranger Keywords.")},
3457
    {"Artist", N_("Artist"), "Text", xmpText, xmpExternal, N_("The name of the artist or artists.")},
3458
    {"AspectRatio", N_("Video Aspect Ratio"), "Rational", xmpText, xmpExternal,
3459
     N_("Ratio of Width:Height, helps to determine how a video would be displayed on a screen")},
3460
    {"AspectRatioType", N_("Video Aspect Ratio Type"), "Text", xmpText, xmpExternal,
3461
     N_("Aspect Ratio Type. E.g.: Free-Resizing or Fixed")},
3462
    {"AttachFileData", N_("Attached File Data"), "Text", xmpText, xmpExternal, N_("Attached File Data")},
3463
    {"AttachFileDesc", N_("Attached File Description"), "Text", xmpText, xmpExternal, N_("Attached File Description")},
3464
    {"AttachFileMIME", N_("Attached File MIME Type"), "Text", xmpText, xmpExternal, N_("Attached File MIME Type")},
3465
    {"AttachFileName", N_("Attached File Name"), "Text", xmpText, xmpExternal, N_("Attached File Name")},
3466
    {"AttachFileUID", N_("Attached File UID"), "Integer", xmpText, xmpExternal, N_("Attached File Universal ID")},
3467
    {"BaseURL", N_("Base URL"), "Text", xmpText, xmpExternal, N_("A C string that specifies a Base URL.")},
3468
    {"BitDepth", N_("Bit Depth"), "Integer", xmpText, xmpExternal,
3469
     N_("A 16-bit integer that indicates the pixel depth of the compressed image. Values of 1, 2, 4, 8 , 16, 24, "
3470
        "and 32 indicate the depth of color images")},
3471
    {"Brightness", N_("Brightness"), "Integer", xmpText, xmpExternal, N_("Brightness setting.")},
3472
    {"CameraByteOrder", N_("Camera Byte Order"), "Text", xmpText, xmpExternal,
3473
     N_("Byte Order used by the Video Capturing device.")},
3474
    {"Cinematographer", N_("Video Cinematographer"), "Text", xmpText, xmpExternal,
3475
     N_("The video Cinematographer information.")},
3476
    {"CleanApertureWidth", N_("Clean Aperture Width"), "Integer", xmpText, xmpExternal,
3477
     N_("Clean aperture width in pixels")},
3478
    {"CleanApertureHeight", N_("Clean Aperture Height"), "Integer", xmpText, xmpExternal,
3479
     N_("Clean aperture height in pixels")},
3480
    {"Codec", N_("Video Codec"), "Text", xmpText, xmpExternal,
3481
     N_("The video codec information. Informs about the encoding algorithm of video. Codec Info is required for "
3482
        "video playback.")},
3483
    {"CodecDecodeAll", N_("Video Codec Decode Info"), "Text", xmpText, xmpExternal,
3484
     N_("Contains information the video Codec Decode All, i.e. Enabled/Disabled")},
3485
    {"CodecDescription", N_("Video Codec Description"), "Text", xmpText, xmpExternal,
3486
     N_("Contains description the codec.")},
3487
    {"CodecInfo", N_("Video Codec Information"), "Text", xmpText, xmpExternal,
3488
     N_("Contains information the codec needs before decoding can be started.")},
3489
    {"CodecDownloadUrl", N_("Video Codec Download URL"), "Text", xmpText, xmpExternal, N_("Video Codec Download URL.")},
3490
    {"CodecSettings", N_("Video Codec Settings"), "Text", xmpText, xmpExternal,
3491
     N_("Contains settings the codec needs before decoding can be started.")},
3492
    {"ColorMode", N_("Color Mode"), "Text", xmpText, xmpExternal, N_("Color Mode")},
3493
    {"ColorNoiseReduction", N_("Color Noise Reduction"), "Integer", xmpText, xmpExternal,
3494
     N_("\"Color Noise Reduction\" setting. Range 0 to +100.")},
3495
    {"ColorSpace", N_("Video Color Space"), "closed Choice of Text", xmpText, xmpInternal,
3496
     N_("The color space. One of: sRGB (used by Photoshop), CCIR-601 (used for NTSC), "
3497
        "CCIR-709 (used for HD).")},
3498
    {"Comment", N_("Comment"), "Text", xmpText, xmpExternal, N_("Information about the Comment.")},
3499
    {"Commissioned", N_("Commissioned"), "Text", xmpText, xmpExternal, N_("Commissioned.")},
3500
    {"CompatibleBrands", N_("QTime Compatible FileType Brand"), "Text", xmpText, xmpExternal,
3501
     N_("Other QuickTime Compatible FileType Brand")},
3502
    {"Composer", N_("Composer"), "Text", xmpText, xmpExternal, N_("Information about the Composer.")},
3503
    {"ComposerKeywords", N_("Composer Keywords"), "Text", xmpText, xmpExternal,
3504
     N_("Information about the Composer Keywords.")},
3505
    {"Compressor", N_("Compressor"), "Text", xmpText, xmpExternal, N_("Video Compression Library Used")},
3506
    {"CompressorID", N_("Video Compressor ID"), "Text", xmpText, xmpExternal,
3507
     N_("Video Compression ID of Technology/Codec Used")},
3508
    {"CompressorVersion", N_("Compressor Version"), "Text", xmpText, xmpExternal,
3509
     N_("Information about the Compressor Version.")},
3510
    {"Container", N_("Container Type"), "Text", xmpText, xmpExternal, N_("Primary Metadata Container")},
3511
    {"ContentCompressAlgo", N_("Content Compression Algorithm"), "Text", xmpText, xmpExternal,
3512
     N_("Content Compression Algorithm. E.g.: zlib")},
3513
    {"ContentEncodingType", N_("Content Encoding Type"), "Text", xmpText, xmpExternal,
3514
     N_("Content Encoding Type. E.g.: Encryption or Compression")},
3515
    {"ContentEncryptAlgo", N_("Content Encryption Algorithm"), "Text", xmpText, xmpExternal,
3516
     N_("Content Encryption Algorithm. E.g.: Blowfish")},
3517
    {"ContentSignAlgo", N_("Content Signature Algorithm"), "Text", xmpText, xmpExternal,
3518
     N_("Content Signature Algorithm. E.g.: RSA")},
3519
    {"ContentSignHashAlgo", N_("Content Sign Hash Algorithm"), "Text", xmpText, xmpExternal,
3520
     N_("Content Signature Hash Algorithm. E.g.: SHA1-160 or MD5")},
3521
    {"Contrast", N_("Contrast"), "Closed Choice of Integer", xmpText, xmpInternal,
3522
     N_("Indicates the direction of contrast processing applied by the camera.")},
3523
    {"Copyright", N_("Copyright"), "Text", xmpText, xmpExternal,
3524
     N_("Copyright, can be name of an organization or an individual.")},
3525
    {"CostumeDesigner", N_("Costume Designer"), "Text", xmpText, xmpExternal,
3526
     N_("Costume Designer associated with the video.")},
3527
    {"Country", N_("Country"), "Text", xmpText, xmpExternal, N_("Name of the country where the video was created.")},
3528
    {"CreationDate", N_("Creation Date"), "Integer", xmpText, xmpExternal,
3529
     N_("Specifies the date and time of the initial creation of the file. The value is given as the "
3530
        "number of 100-nanosecond intervals since January 1, 1601, according to Coordinated Universal Time "
3531
        "(Greenwich Mean Time).")},
3532
    {"CropBottom", N_("Pixel Crop Bottom"), "Integer", xmpText, xmpExternal,
3533
     N_("Number of Pixels to be cropped from the bottom.")},
3534
    {"CropLeft", N_("Pixel Crop Left"), "Integer", xmpText, xmpExternal,
3535
     N_("Number of Pixels to be cropped from the left.")},
3536
    {"CropRight", N_("Pixel Crop Right"), "Integer", xmpText, xmpExternal,
3537
     N_("Number of Pixels to be cropped from the right.")},
3538
    {"Cropped", N_("Cropped"), "Integer", xmpText, xmpExternal, N_("Field that indicates if a video is cropped.")},
3539
    {"CropTop", N_("Pixel Crop Top"), "Integer", xmpText, xmpExternal,
3540
     N_("Number of Pixels to be cropped from the top.")},
3541
    {"CurrentTime", N_("Current Time"), "Integer", xmpText, xmpExternal,
3542
     N_("The time value for current time position within the movie.")},
3543
    {"DataPackets", N_("Data Packets"), "Integer", xmpText, xmpExternal,
3544
     N_("Specifies the number of Data Packet entries that exist within the Data Object.")},
3545
    {"DateTimeOriginal", N_("Date and Time Original"), "Date", xmpText, xmpInternal,
3546
     N_("Date and time when original video was generated, in ISO 8601 format.")},
3547
    {"DateTimeDigitized", N_("Date and Time Digitized"), "Date", xmpText, xmpInternal,
3548
     N_("Date and time when video was stored as digital data, can be the same "
3549
        "as DateTimeOriginal if originally stored in digital form. Stored in ISO 8601 format.")},
3550
    {"DateUTC", N_("Date-Time Original"), "Text", xmpText, xmpExternal, N_("Contains the production date")},
3551
    {"DefaultOn", N_("Video Track Default On"), "Text", xmpText, xmpExternal,
3552
     N_("Video Track Default On , i.e. Enabled/Disabled")},
3553
    {"DigitalZoomRatio", N_("Digital Zoom Ratio"), "Rational", xmpText, xmpInternal,
3554
     N_("Indicates the digital zoom ratio when the video was shot.")},
3555
    {"Dimensions", N_("Dimensions"), "Text", xmpText, xmpExternal,
3556
     N_("Information about the Dimensions of the video frame.")},
3557
    {"Director", N_("Director"), "Text", xmpText, xmpExternal, N_("Information about the Director.")},
3558
    {"DisplayUnit", N_("Video Display Unit"), "Text", xmpText, xmpExternal,
3559
     N_("Video display unit. E.g.: cm, pixels, inch")},
3560
    {"DistributedBy", N_("Distributed By"), "Text", xmpText, xmpExternal,
3561
     N_("Distributed By, i.e. name of person or organization.")},
3562
    {"DocType", N_("Doc Type"), "Text", xmpText, xmpExternal,
3563
     N_("Describes the contents of the file. In the case of a MATROSKA file, its value is 'matroska'")},
3564
    {"DocTypeReadVersion", N_("Doc Type Read Version"), "Integer", xmpText, xmpExternal,
3565
     N_("A Matroska video specific property, helps in determining the compatibility of file with a particular "
3566
        "version of a video player")},
3567
    {"DocTypeVersion", N_("Doc Type Version"), "Integer", xmpText, xmpExternal,
3568
     N_("A Matroska video specific property, indicated the version of filetype, helps in determining the "
3569
        "compatibility")},
3570
    {"DotsPerInch", N_("Dots Per Inch"), "Integer", xmpText, xmpExternal, N_("Dots Per Inch")},
3571
    {"duration", N_("Duration"), "Integer", xmpText, xmpExternal,
3572
     N_("The duration of the media file. Measured in milli-seconds.")},
3573
    {"EBMLReadVersion", N_("EBML Read Version"), "Integer", xmpText, xmpExternal,
3574
     N_("Extensible Binary Meta Language Read Version")},
3575
    {"EBMLVersion", N_("EBML Version"), "Integer", xmpText, xmpExternal, N_("Extensible Binary Meta Language Version")},
3576
    {"Edit1", N_("Edit Block 1 / Language"), "Text", xmpText, xmpExternal,
3577
     N_("Information about the Edit / Language.")},
3578
    {"Edit2", N_("Edit Block 2 / Language"), "Text", xmpText, xmpExternal,
3579
     N_("Information about the Edit / Language.")},
3580
    {"Edit3", N_("Edit Block 3 / Language"), "Text", xmpText, xmpExternal,
3581
     N_("Information about the Edit / Language.")},
3582
    {"Edit4", N_("Edit Block 4 / Language"), "Text", xmpText, xmpExternal,
3583
     N_("Information about the Edit / Language.")},
3584
    {"Edit5", N_("Edit Block 5 / Language"), "Text", xmpText, xmpExternal,
3585
     N_("Information about the Edit / Language.")},
3586
    {"Edit6", N_("Edit Block 6 / Language"), "Text", xmpText, xmpExternal,
3587
     N_("Information about the Edit / Language.")},
3588
    {"Edit7", N_("Edit Block 7 / Language"), "Text", xmpText, xmpExternal,
3589
     N_("Information about the Edit / Language.")},
3590
    {"Edit8", N_("Edit Block 8 / Language"), "Text", xmpText, xmpExternal,
3591
     N_("Information about the Edit / Language.")},
3592
    {"Edit9", N_("Edit Block 9 / Language"), "Text", xmpText, xmpExternal,
3593
     N_("Information about the Edit / Language.")},
3594
    {"EditedBy", N_("Edited By"), "Text", xmpText, xmpExternal, N_("Edited By, i.e. name of person or organization.")},
3595
    {"Enabled", N_("Video Track Enabled"), "Text", xmpText, xmpExternal,
3596
     N_("Status of Video Track, i.e. Enabled/Disabled")},
3597
    {"EncodedBy", N_("Encoded By"), "Text", xmpText, xmpExternal,
3598
     N_("Encoded By, i.e. name of person or organization.")},
3599
    {"EncodedPixelsWidth", N_("Encoded Pixels Width"), "Integer", xmpText, xmpExternal,
3600
     N_("Encoded Pixels width in pixels")},
3601
    {"EncodedPixelsHeight", N_("Encoded Pixels Height"), "Integer", xmpText, xmpExternal,
3602
     N_("Encoded Pixels height in pixels")},
3603
    {"Encoder", N_("Encoder"), "Text", xmpText, xmpExternal, N_("Information about the Encoder.")},
3604
    {"EndTimecode", N_("End Timecode"), "Integer", xmpText, xmpExternal, N_("End Timecode")},
3605
    {"Engineer", N_("Engineer"), "Text", xmpText, xmpExternal, N_("Engineer, in most cases name of person.")},
3606
    {"Equipment", N_("Equipment"), "Text", xmpText, xmpExternal,
3607
     N_("Information about the Equipment used for recording Video.")},
3608
    {"ExposureCompensation", N_("Exposure Compensation"), "Text", xmpText, xmpExternal,
3609
     N_("Exposure Compensation Information.")},
3610
    {"ExposureProgram", N_("Exposure Program"), "Text", xmpText, xmpExternal, N_("Exposure Program Information.")},
3611
    {"ExposureTime", N_("Exposure Time"), "Rational", xmpText, xmpInternal, N_("Exposure time in seconds.")},
3612
    {"ExtendedContentDescription", N_("Extended Content Description"), "Text", xmpSeq, xmpExternal,
3613
     N_("Extended Content Description, usually found in ASF type files.")},
3614
    {"FileDataRate", N_("File Data Rate"), "Rational", xmpText, xmpExternal,
3615
     N_("The file data rate in megabytes per second. For example: \"36/10\" = 3.6 MB/sec")},
3616
    {"FileID", N_("File ID"), "Text", xmpText, xmpExternal, N_("File ID.")},
3617
    {"FileLength", N_("File Length"), "Integer", xmpText, xmpInternal, N_("File length.")},
3618
    {"FileName", N_("File Name"), "Text", xmpText, xmpExternal, N_("File Name or Absolute File Path")},
3619
    {"FileSize", N_("File Size"), "Integer", xmpText, xmpExternal, N_("File Size, in MB")},
3620
    {"FileType", N_("File Type"), "Text", xmpText, xmpExternal, N_("Extension of File or Type of File")},
3621
    {"FilterEffect", N_("Filter Effect"), "Text", xmpText, xmpExternal, N_("Filter Effect Settings Applied.")},
3622
    {"FirmwareVersion", N_("Firmware Version"), "Text", xmpText, xmpExternal,
3623
     N_("Firmware Version of the Camera/Video device.")},
3624
    {"FNumber", N_("F Number"), "Rational", xmpText, xmpInternal, N_("F number. Camera Lens specific data.")},
3625
    {"FocalLength", N_("Focal Length"), "Rational", xmpText, xmpInternal,
3626
     N_("Focal length of the lens, in millimeters.")},
3627
    {"FocusMode", N_("Focus Mode"), "Text", xmpText, xmpExternal,
3628
     N_("Focus Mode of the Lens. E.g.: AF for Auto Focus")},
3629
    {"Format", N_("Format"), "Text", xmpText, xmpExternal,
3630
     N_("Indication of movie format (computer-generated, digitized, and so on).")},
3631
    {"FrameCount", N_("Frame Count"), "Integer", xmpText, xmpExternal, N_("Total number of frames in a video")},
3632
    {"FrameHeight", N_("Frame Height"), "Integer", xmpText, xmpExternal, N_("Height of frames in a video")},
3633
    {"FrameRate", N_("Video Frame Rate"), "Frames per Second", xmpText, xmpExternal,
3634
     N_("Rate at which frames are presented in a video (Expressed in fps(Frames per Second))")},
3635
    {"FrameSize", N_("Video Frame Size"), "Dimensions", xmpText, xmpExternal,
3636
     N_("The frame size. For example: w:720, h: 480, unit:pixels")},
3637
    {"FrameWidth", N_("Frame Width"), "Integer", xmpText, xmpExternal, N_("Width of frames in a video")},
3638
    {"Genre", N_("Genre"), "Text", xmpText, xmpExternal, N_("The name of the genre.")},
3639
    {"GPSAltitude", N_("GPS Altitude"), "Rational", xmpText, xmpInternal,
3640
     N_("GPS tag 6, 0x06. Indicates altitude in meters.")},
3641
    {"GPSAltitudeRef", N_("GPS Altitude Reference"), "Closed Choice of Integer", xmpText, xmpInternal,
3642
     N_("GPS tag 5, 0x05. Indicates whether the altitude is above or below sea level.")},
3643
    {"GPSCoordinates", N_("GPS Coordinates"), "Text", xmpText, xmpExternal,
3644
     N_("Information about the GPS Coordinates.")},
3645
    {"GPSDateStamp", N_("GPS Time Stamp"), "Date", xmpText, xmpInternal, N_("Date stamp of GPS data.")},
3646
    {"GPSImgDirection", N_("GPS Image Direction"), "Rational", xmpText, xmpInternal,
3647
     N_("Direction of image when captured, values range from 0 to 359.99.")},
3648
    {"GPSImgDirectionRef", N_("GPS Image Direction Reference"), "Closed Choice of Text", xmpText, xmpInternal,
3649
     N_("Reference for image direction.")},
3650
    {"GPSLatitude", N_("GPS Latitude"), "GPSCoordinate", xmpText, xmpInternal,
3651
     N_("(North/South). Indicates latitude.")},
3652
    {"GPSLongitude", N_("GPS Longitude"), "GPSCoordinate", xmpText, xmpInternal,
3653
     N_("(East/West). Indicates longitude.")},
3654
    {"GPSMapDatum", N_("GPS Map Datum"), "Text", xmpText, xmpInternal, N_("Geodetic survey data.")},
3655
    {"GPSSatellites", N_("GPS Satellites"), "Text", xmpText, xmpInternal,
3656
     N_("Satellite information, format is unspecified.")},
3657
    {"GPSTimeStamp", N_("GPS Time Stamp"), "Date", xmpText, xmpInternal, N_("Time stamp of GPS data.")},
3658
    {"GPSVersionID", N_("GPS Version ID"), "Text", xmpText, xmpInternal,
3659
     N_("A decimal encoding with period separators.")},
3660
    {"GraphicsMode", N_("Graphics Mode"), "Text", xmpText, xmpExternal,
3661
     N_("A 16-bit integer that specifies the transfer mode. The transfer mode specifies which Boolean"
3662
        "operation QuickDraw should perform when drawing or transferring an image from one location to another.")},
3663
    {"Grouping", N_("Grouping"), "Text", xmpText, xmpExternal, N_("Information about the Grouping.")},
3664
    {"HandlerClass", N_("Handler Class"), "Text", xmpText, xmpExternal,
3665
     N_("A four-character code that identifies the type of the handler. Only two values are valid for this field: "
3666
        "'mhlr' for media handlers and 'dhlr' for data handlers.")},
3667
    {"HandlerDescription", N_("Handler Description"), "Text", xmpText, xmpExternal,
3668
     N_("A (counted) string that specifies the name of the component-that is, the media handler used when this "
3669
        "media was created..")},
3670
    {"HandlerType", N_("Handler Type"), "Text", xmpText, xmpExternal,
3671
     N_("A four-character code that identifies the type of the media handler or data handler.")},
3672
    {"HandlerVendorID", N_("Handler Vendor ID"), "Text", xmpText, xmpExternal, N_("Component manufacturer.")},
3673
    {"Height", N_("Video Height"), "Integer", xmpText, xmpExternal, N_("Video height in pixels")},
3674
    {"HueAdjustment", N_("Hue Adjustment"), "Integer", xmpText, xmpExternal,
3675
     N_("Hue Adjustment Settings Information.")},
3676
    {"ImageLength", N_("Image Length"), "Integer", xmpText, xmpExternal,
3677
     N_("Image Length, a property inherited from BitMap format")},
3678
    {"InfoBannerImage", N_("Info Banner Image"), "Text", xmpText, xmpExternal, N_("Information Banner Image.")},
3679
    {"InfoBannerURL", N_("Info Banner URL"), "Text", xmpText, xmpExternal, N_("Information Banner URL.")},
3680
    {"Information", N_("Information"), "Text", xmpText, xmpExternal, N_("Additional Movie Information.")},
3681
    {"InfoText", N_("Info Text"), "Text", xmpText, xmpExternal, N_("Information Text.")},
3682
    {"InfoURL", N_("Info URL"), "Text", xmpText, xmpExternal, N_("Information URL.")},
3683
    {"ISO", N_("ISO Setting"), "Integer", xmpText, xmpExternal, N_("Information about the ISO Setting.")},
3684
    {"ISRCCode", N_("ISRC Code"), "Text", xmpText, xmpExternal, N_("Information about the ISRC Code.")},
3685
    {"Junk", N_("Junk Data"), "Text", xmpText, xmpExternal, N_("Video Junk data")},
3686
    {"Language", N_("Language"), "Text", xmpText, xmpExternal, N_("Language.")},
3687
    {"Length", N_("Length"), "Integer", xmpText, xmpExternal, N_("The length of the media file.")},
3688
    {"LensModel", N_("Lens Model"), "Text", xmpText, xmpExternal, N_("Lens Model.")},
3689
    {"LensType", N_("Lens Type"), "Text", xmpText, xmpExternal, N_("Lens Type.")},
3690
    {"Lightness", N_("Lightness"), "Text", xmpText, xmpExternal, N_("Lightness.")},
3691
    {"LocationInfo", N_("Location Information"), "Text", xmpText, xmpExternal, N_("Location Information.")},
3692
    {"LogoIconURL", N_("Logo Icon URL"), "Text", xmpText, xmpExternal, N_("A C string that specifies Logo Icon URL.")},
3693
    {"LogoURL", N_("Logo URL"), "Text", xmpText, xmpExternal, N_("A C string that specifies a Logo URL.")},
3694
    {"Lyrics", N_("Lyrics"), "Text", xmpText, xmpExternal, N_("Lyrics of a Song/Video.")},
3695
    {"MajorBrand", N_("QTime Major FileType Brand"), "Text", xmpText, xmpExternal,
3696
     N_("QuickTime Major File Type Brand")},
3697
    {"Make", N_("Equipment Make"), "Text", xmpText, xmpExternal, N_("Manufacturer of recording equipment")},
3698
    {"MakerNoteType", N_("Camera Maker Note Type"), "Text", xmpText, xmpExternal, N_("Maker Note Type of the camera.")},
3699
    {"MakerNoteVersion", N_("Camera Maker Note Version"), "Text", xmpText, xmpExternal,
3700
     N_("Maker Note Version of the camera.")},
3701
    {"MakerURL", N_("Maker URL"), "Text", xmpText, xmpExternal, N_("Camera Manufacturer's URL.")},
3702
    {"MaxApertureValue", N_("Maximum Aperture Value"), "Rational", xmpText, xmpInternal,
3703
     N_("Smallest F number of lens, in APEX.")},
3704
    {"MaxBitRate", N_("Maximum Bit Rate"), "Integer", xmpText, xmpExternal,
3705
     N_("Specifies the maximum instantaneous bit rate in bits per second for the entire file. This shall equal the "
3706
        "sum of the bit rates of the individual digital media streams.")},
3707
    {"MaxDataRate", N_("Maximum Data Rate"), "kiloBytes per Second", xmpText, xmpExternal,
3708
     N_("Peak rate at which data is presented in a video (Expressed in kB/s(kiloBytes per Second))")},
3709
    {"MediaCreateDate", N_("Media Track Create Date"), "Integer", xmpText, xmpExternal,
3710
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the media header was "
3711
        "created.")},
3712
    {"MediaDuration", N_("Media Track Duration"), "Integer", xmpText, xmpExternal,
3713
     N_("A time value that indicates the duration of this media (in the movie's time coordinate system).")},
3714
    {"MediaHeaderVersion", N_("Media Header Version"), "Text", xmpText, xmpExternal,
3715
     N_("A 1-byte specification of the version of this media header")},
3716
    {"MediaLangCode", N_("Media Language Code"), "Integer", xmpText, xmpExternal,
3717
     N_("A 16-bit integer that specifies the language code for this media.")},
3718
    {"MediaModifyDate", N_("Media Track Modify Date"), "Integer", xmpText, xmpExternal,
3719
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the media header was "
3720
        "last modified.")},
3721
    {"MediaTimeScale", N_("Media Time Scale"), "Integer", xmpText, xmpExternal,
3722
     N_("A time value that indicates the time scale for this media-that is, the number of time units that pass per "
3723
        "second in its time coordinate system.")},
3724
    {"Medium", N_("Medium"), "Text", xmpSeq, xmpExternal, N_("Medium.")},
3725
    {"Metadata", N_("Metadata"), "Text", xmpSeq, xmpExternal,
3726
     N_("An array of Unknown / Unregistered Metadata Tags and their values.")},
3727
    {"MetadataLibrary", N_("Metadata Library"), "Text", xmpSeq, xmpExternal,
3728
     N_("An array of Unregistered Metadata Library Tags and their values.")},
3729
    {"MeteringMode", N_("Metering Mode"), "Closed Choice of Integer", xmpText, xmpInternal, N_("Metering mode.")},
3730
    {"MicroSecPerFrame", N_("Micro Seconds Per Frame"), "Integer", xmpText, xmpExternal,
3731
     N_("Number of micro seconds per frame, or frame rate")},
3732
    {"MimeType", N_("Mime Type"), "Text", xmpText, xmpExternal, N_("Tells about the video format")},
3733
    {"MinorVersion", N_("QTime Minor FileType Version"), "Text", xmpText, xmpExternal,
3734
     N_("QuickTime Minor File Type Version")},
3735
    {"Model", N_("Equipment Model"), "Text", xmpText, xmpExternal, N_("Model name or number of equipment.")},
3736
    {"ModificationDate", N_("Modification Date-Time"), "Text", xmpText, xmpExternal,
3737
     N_("Contains the modification date of the video")},
3738
    {"MovieHeaderVersion", N_("Movie Header Version"), "Integer", xmpText, xmpExternal, N_("Movie Header Version")},
3739
    {"MusicBy", N_("Music By"), "Text", xmpText, xmpExternal, N_("Music By, i.e. name of person or organization.")},
3740
    {"MuxingApp", N_("Muxing App"), "Text", xmpText, xmpExternal,
3741
     N_("Contains the name of the library that has been used to create the file (like \"libmatroska 0.7.0\")")},
3742
    {"Name", N_("Name"), "Text", xmpText, xmpExternal, N_("Name of song or the event.")},
3743
    {"NextTrackID", N_("Next Track ID"), "Integer", xmpText, xmpExternal,
3744
     N_("A 32-bit integer that indicates a value to use for the track ID number of the next track added to this "
3745
        "movie. Note that 0 is not a valid track ID value.")},
3746
    {"NumOfColours", N_("Number Of Colours"), "Integer/Text", xmpText, xmpExternal, N_("Total number of colours used")},
3747
    {"NumOfImpColours", N_("Number Of Important Colours"), "Integer/Text", xmpText, xmpExternal,
3748
     N_("Number Of Important Colours, a property inherited from BitMap format")},
3749
    {"NumOfParts", N_("Number Of Parts"), "Integer", xmpText, xmpExternal, N_("Total number of parts in the video.")},
3750
    {"OpColor", N_("Operation Colours"), "Integer/Text", xmpText, xmpExternal,
3751
     N_("Three 16-bit values that specify the red, green, and blue colors for the transfer mode operation "
3752
        "indicated in the graphics mode field.")},
3753
    {"Organization", N_("Organization"), "Text", xmpText, xmpExternal,
3754
     N_("Name of organization associated with the video.")},
3755
    {"Orientation", N_("Orientation"), "Closed Choice of Integer", xmpText, xmpInternal,
3756
     N_("Video Orientation:"
3757
        "1 = Horizontal (normal) "
3758
        "2 = Mirror horizontal "
3759
        "3 = Rotate 180 "
3760
        "4 = Mirror vertical "
3761
        "5 = Mirror horizontal and rotate 270 CW "
3762
        "6 = Rotate 90 CW "
3763
        "7 = Mirror horizontal and rotate 90 CW "
3764
        "8 = Rotate 270 CW")},
3765
    {"Part", N_("Part"), "Text", xmpText, xmpExternal, N_("Part.")},
3766
    {"Performers", N_("Performers"), "Text", xmpText, xmpExternal, N_("Performers involved in the video.")},
3767
    {"PerformerKeywords", N_("Performer Keywords"), "Text", xmpText, xmpExternal, N_("Performer Keywords.")},
3768
    {"PerformerURL", N_("Performer URL"), "Text", xmpText, xmpExternal, N_("Performer's dedicated URL.")},
3769
    {"PictureControlData", N_("Picture Control Data"), "Text", xmpText, xmpExternal, N_("Picture Control Data.")},
3770
    {"PictureControlVersion", N_("Picture Control Version"), "Text", xmpText, xmpExternal,
3771
     N_("Picture Control Data Version.")},
3772
    {"PictureControlName", N_("Picture Control Name"), "Text", xmpText, xmpExternal, N_("Picture Control Name.")},
3773
    {"PictureControlBase", N_("Picture Control Base"), "Text", xmpText, xmpExternal, N_("Picture Control Data Base.")},
3774
    {"PictureControlAdjust", N_("Picture Control Adjust"), "Text", xmpText, xmpExternal,
3775
     N_("Picture Control Adjust Information.")},
3776
    {"PictureControlQuickAdjust", N_("Picture Control Quick Adjust"), "Text", xmpText, xmpExternal,
3777
     N_("Picture Control Quick Adjustment Settings.")},
3778
    {"PlaySelection", N_("Play Selection"), "Text", xmpText, xmpExternal, N_("Play Selection.")},
3779
    {"PlayMode", N_("Play Mode"), "Text", xmpText, xmpExternal, N_("Information about the Play Mode.")},
3780
    {"PhysicalEquivalent", N_("Chapter Physical Equivalent"), "Text", xmpText, xmpExternal,
3781
     N_("Contains the information of External media.")},
3782
    {"PixelDepth", N_("Video Pixel Depth"), "closed Choice of Text", xmpText, xmpExternal,
3783
     N_("The size in bits of each color component of a pixel. Standard Windows 32-bit "
3784
        "pixels have 8 bits per component. One of: 8Int, 16Int, 32Int, 32Float.")},
3785
    {"PixelPerMeterX", N_("Pixels Per Meter X"), "Integer", xmpText, xmpExternal,
3786
     N_("Pixels Per Meter X, a property inherited from BitMap format")},
3787
    {"PixelPerMeterY", N_("Pixels Per Meter Y"), "Integer", xmpText, xmpExternal,
3788
     N_("Pixels Per Meter Y, a property inherited from BitMap format")},
3789
    {"Planes", N_("Planes"), "Integer", xmpText, xmpExternal, N_("The number of Image Planes in the video")},
3790
    {"PosterTime", N_("Poster Time"), "Integer", xmpText, xmpExternal,
3791
     N_("The time value of the time of the movie poster.")},
3792
    {"PreferredRate", N_("Preferred Rate"), "Rational", xmpText, xmpExternal,
3793
     N_("A 32-bit fixed-point number that specifies the rate at which to play this movie. A value of 1.0 indicates "
3794
        "normal rate.")},
3795
    {"PreferredVolume", N_("Preferred Volume"), "Rational", xmpText, xmpExternal,
3796
     N_("A 16-bit fixed-point number that specifies how loud to play this movie's sound. A value of 1.0 indicates "
3797
        "full volume.")},
3798
    {"Preroll", N_("Preroll"), "Integer", xmpText, xmpExternal,
3799
     N_("Specifies the amount of time to buffer data before starting to play the file, in millisecond units. If "
3800
        "this value is nonzero,"
3801
        "the Play Duration field and all of the payload Presentation Time fields have been offset by this amount. "
3802
        "Therefore, player software "
3803
        "must subtract the value in the preroll field from the play duration and presentation times to calculate "
3804
        "their actual values.")},
3805
    {"PreviewAtomType", N_("Preview Atom Type"), "Text", xmpText, xmpExternal,
3806
     N_("Indicates the type of atom that contains the preview data")},
3807
    {"PreviewDate", N_("Preview Date"), "Integer", xmpText, xmpExternal,
3808
     N_("The date of the movie preview in local time converted from UTC")},
3809
    {"PreviewDuration", N_("Preview Duration"), "Integer", xmpText, xmpExternal,
3810
     N_("The duration of the movie preview in movie time scale units")},
3811
    {"PreviewTime", N_("Preview Time"), "Integer", xmpText, xmpExternal,
3812
     N_("The time value in the movie at which the preview begins.")},
3813
    {"PreviewVersion", N_("Preview Version"), "Integer", xmpText, xmpExternal, N_("The version of the movie preview")},
3814
    {"ProducedBy", N_("Produced By"), "Text", xmpText, xmpExternal,
3815
     N_("Produced By, i.e. name of person or organization.")},
3816
    {"Producer", N_("Producer"), "Text", xmpText, xmpExternal, N_("Producer involved with the video.")},
3817
    {"ProducerKeywords", N_("Producer Keywords"), "Text", xmpText, xmpExternal,
3818
     N_("Information about the Producer Keywords.")},
3819
    {"ProductionApertureWidth", N_("Production Aperture Width"), "Integer", xmpText, xmpExternal,
3820
     N_("Production aperture width in pixels")},
3821
    {"ProductionApertureHeight", N_("Production Aperture Height"), "Integer", xmpText, xmpExternal,
3822
     N_("Production aperture height in pixels")},
3823
    {"ProductionDesigner", N_("Production Designer"), "Text", xmpText, xmpExternal,
3824
     N_("Information about the Production Designer.")},
3825
    {"ProductionStudio", N_("Production Studio"), "Text", xmpText, xmpExternal,
3826
     N_("Information about the Production Studio.")},
3827
    {"Product", N_("Product"), "Text", xmpText, xmpExternal, N_("Product.")},
3828
    {"ProjectRef", N_("Project Reference"), "ProjectLink", xmpText, xmpExternal,
3829
     N_("A reference to the project that created this file.")},
3830
    {"Rate", N_("Rate"), "Integer", xmpText, xmpExternal, N_("Rate.")},
3831
    {"Rated", N_("Rated"), "Text", xmpText, xmpExternal, N_("The age circle required for viewing the video.")},
3832
    {"Rating", N_("Rating"), "Text", xmpText, xmpExternal, N_("Rating, e.g. 7  or 8 (generally out of 10).")},
3833
    {"RecordLabelName", N_("Record Label Name"), "Text", xmpText, xmpExternal,
3834
     N_("Record Label Name, or the name of the organization recording the video.")},
3835
    {"RecordLabelURL", N_("Record Label URL"), "Text", xmpText, xmpExternal, N_("Record Label URL.")},
3836
    {"RecordingCopyright", N_("Recording Copyright"), "Text", xmpText, xmpExternal, N_("Recording Copyright.")},
3837
    {"Requirements", N_("Requirements"), "Text", xmpText, xmpExternal, N_("Information about the Requirements.")},
3838
    {"ResolutionUnit", N_("Resolution Unit"), "Closed Choice of Integer", xmpText, xmpInternal,
3839
     N_("Unit used for XResolution and YResolution. Value is one of: 2 = inches; 3 = centimeters.")},
3840
    {"RippedBy", N_("Ripped By"), "Text", xmpText, xmpExternal, N_("Ripped By, i.e. name of person or organization.")},
3841
    {"Saturation", N_("Saturation"), "Closed Choice of Integer", xmpText, xmpInternal,
3842
     N_("Indicates the direction of saturation processing applied by the camera.")},
3843
    {"SecondaryGenre", N_("Secondary Genre"), "Text", xmpText, xmpExternal, N_("The name of the secondary genre.")},
3844
    {"SelectionTime", N_("Selection Time"), "Integer", xmpText, xmpExternal,
3845
     N_("The time value for the start time of the current selection.")},
3846
    {"SelectionDuration", N_("Selection Duration"), "Integer", xmpText, xmpExternal,
3847
     N_("The duration of the current selection in movie time scale units.")},
3848
    {"SendDuration", N_("Send Duration"), "Integer", xmpText, xmpExternal,
3849
     N_("Specifies the time needed to send the file in 100-nanosecond units. This value should "
3850
        "include the duration of the last packet in the content.")},
3851
    {"Sharpness", N_("Sharpness"), "Integer", xmpText, xmpExternal, N_("\"Sharpness\" setting. Range 0 to +100.")},
3852
    {"Software", N_("Software"), "Text", xmpText, xmpExternal, N_("Software used to generate / create Video data.")},
3853
    {"SoftwareVersion", N_("Software Version"), "Text", xmpText, xmpExternal, N_("The Version of the software used.")},
3854
    {"SongWriter", N_("Song Writer"), "Text", xmpText, xmpExternal, N_("The name of the song writer.")},
3855
    {"SongWriterKeywords", N_("Song Writer Keywords"), "Text", xmpText, xmpExternal, N_("Song Writer Keywords.")},
3856
    {"Source", N_("Source"), "Text", xmpText, xmpExternal, N_("Source.")},
3857
    {"SourceCredits", N_("Source Credits"), "Text", xmpText, xmpExternal, N_("Source Credits.")},
3858
    {"SourceForm", N_("Source Form"), "Text", xmpText, xmpExternal, N_("Source Form.")},
3859
    {"SourceImageHeight", N_("Source Image Height"), "Integer", xmpText, xmpExternal, N_("Video height in pixels")},
3860
    {"SourceImageWidth", N_("Source Image Width"), "Integer", xmpText, xmpExternal, N_("Video width in pixels")},
3861
    {"Starring", N_("Starring"), "Text", xmpText, xmpExternal,
3862
     N_("Starring, name of famous people appearing in the video.")},
3863
    {"StartTimecode", N_("Start Timecode"), "Integer", xmpText, xmpExternal, N_("Start Timecode")},
3864
    {"Statistics", N_("Statistics"), "Text", xmpText, xmpExternal, N_("Statistics.")},
3865
    {"StreamCount", N_("Stream Count"), "Integer", xmpText, xmpExternal, N_("Total Number Of Streams")},
3866
    {"StreamName", N_("Stream Name"), "Text", xmpText, xmpExternal,
3867
     N_("Describes the Stream Name. E.g.: FUJIFILM AVI STREAM 0100")},
3868
    {"StreamQuality", N_("Stream Quality"), "Integer", xmpText, xmpExternal, N_("General Stream Quality")},
3869
    {"StreamSampleRate", N_("Stream Sample Rate"), "Rational", xmpText, xmpExternal, N_("Stream Sample Rate")},
3870
    {"StreamSampleCount", N_("Stream Sample Count"), "Integer", xmpText, xmpExternal, N_("Stream Sample Count")},
3871
    {"StreamSampleSize", N_("Stream Sample Size"), "Integer", xmpText, xmpExternal, N_("General Stream Sample Size")},
3872
    {"StreamType", N_("Stream Type"), "Text", xmpText, xmpExternal,
3873
     N_("Describes the Stream Type. E.g.: Video, Audio or Subtitles")},
3874
    {"SubTCodec", N_("Subtitles Codec"), "Text", xmpText, xmpExternal,
3875
     N_("Subtitles stream codec, for general purpose")},
3876
    {"SubTCodecDecodeAll", N_("Subtitle Codec Decode Info"), "Text", xmpText, xmpExternal,
3877
     N_("Contains information the Subtitles codec decode all, i.e. Enabled/Disabled")},
3878
    {"SubTCodecInfo", N_("Subtitles Codec Information"), "Text", xmpText, xmpExternal,
3879
     N_("Contains additional information about subtitles.")},
3880
    {"SubTCodecDownloadUrl", N_("Subtitle Codec Download URL"), "Text", xmpText, xmpExternal,
3881
     N_("Video Subtitle Codec Download URL.")},
3882
    {"SubTCodecSettings", N_("Subtitle Codec Settings"), "Text", xmpText, xmpExternal,
3883
     N_("Contains settings the codec needs before decoding can be started.")},
3884
    {"SubTDefaultOn", N_("Subtitle Track Default On"), "Text", xmpText, xmpExternal,
3885
     N_("Subtitles Track Default On , i.e. Enabled/Disabled")},
3886
    {"SubTEnabled", N_("Subtitle Track Enabled"), "Text", xmpText, xmpExternal,
3887
     N_("Status of Subtitles Track, i.e. Enabled/Disabled")},
3888
    {"Subtitle", N_("Subtitle"), "Text", xmpText, xmpExternal, N_("Subtitle of the video.")},
3889
    {"SubtitleKeywords", N_("Subtitle Keywords"), "Text", xmpText, xmpExternal, N_("Subtitle Keywords.")},
3890
    {"SubTLang", N_("Subtitles Language"), "Text", xmpText, xmpExternal,
3891
     N_("The Language in which the subtitles is recorded in.")},
3892
    {"SubTTrackForced", N_("Subtitle Track Forced"), "Text", xmpText, xmpExternal,
3893
     N_("Subtitles Track Forced , i.e. Enabled/Disabled")},
3894
    {"SubTTrackLacing", N_("Subtitle Track Lacing"), "Text", xmpText, xmpExternal,
3895
     N_("Subtitles Track Lacing , i.e. Enabled/Disabled")},
3896
    {"Subject", N_("Subject"), "Text", xmpText, xmpExternal, N_("Subject.")},
3897
    {"TapeName", N_("Tape Name"), "Text", xmpText, xmpExternal, N_("TapeName.")},
3898
    {"TagDefault", N_("Tag Default Setting"), "Text", xmpText, xmpExternal,
3899
     N_("If Tag is Default enabled, this value is Yes, else No")},
3900
    {"TagLanguage", N_("Tag Language"), "Text", xmpText, xmpExternal, N_("Language that has been used to define tags")},
3901
    {"TagName", N_("Tag Name"), "Text", xmpText, xmpExternal,
3902
     N_("Tags could be used to define several titles for a segment.")},
3903
    {"TagString", N_("Tag String"), "Text", xmpText, xmpExternal, N_("Information contained in a Tags")},
3904
    {"TargetType", N_("Target Type"), "Text", xmpText, xmpExternal,
3905
     N_("A string describing the logical level of the object the Tag is referring to.")},
3906
    {"Technician", N_("Technician"), "Text", xmpText, xmpExternal, N_("Technician, in most cases name of person.")},
3907
    {"ThumbnailHeight", N_("Thumbnail Height"), "Integer", xmpText, xmpExternal, N_("Preview Image Thumbnail Height.")},
3908
    {"ThumbnailLength", N_("Thumbnail Length"), "Integer", xmpText, xmpExternal, N_("Preview Image Thumbnail Length.")},
3909
    {"ThumbnailWidth", N_("Thumbnail Width"), "Integer", xmpText, xmpExternal, N_("Preview Image Thumbnail Width.")},
3910
    {"TimecodeScale", N_("Timecode Scale"), "Rational", xmpText, xmpExternal,
3911
     N_("Multiplying factor which is helpful in calculation of a particular timecode")},
3912
    {"TimeOffset", N_("Time Offset"), "Integer", xmpText, xmpExternal,
3913
     N_("Specifies the presentation time offset of the stream in 100-nanosecond units. This value shall be equal "
3914
        "to the send time of the first interleaved packet in the data section.")},
3915
    {"TimeScale", N_("Time Scale"), "Integer", xmpText, xmpExternal,
3916
     N_("A time value that indicates the time scale for this movie-that is, the number of time units that"
3917
        "pass per second in its time coordinate system. A time coordinate system that measures time"
3918
        "in sixtieths of a second, for example, has a time scale of 60.")},
3919
    {"Title", N_("Title"), "Text", xmpText, xmpExternal,
3920
     N_("Contains a general name of the SEGMENT, like 'Lord of the Rings - The Two Towers', however, Tags could be "
3921
        "used to define several titles for a segment.")},
3922
    {"ToningEffect", N_("Toning Effect"), "Text", xmpText, xmpExternal, N_("Toning Effect Settings Applied.")},
3923
    {"TotalFrameCount", N_("Total Frame Count"), "Integer", xmpText, xmpExternal,
3924
     N_("Total number of frames in a video")},
3925
    {"TotalStream", N_("Number Of Streams"), "Integer", xmpText, xmpExternal,
3926
     N_("Total number of streams present in a video. E.g.: Video, Audio or Subtitles")},
3927
    {"Track", N_("Track"), "Text", xmpText, xmpExternal, N_("Information about the Track.")},
3928
    {"TrackCreateDate", N_("Video Track Create Date"), "Integer", xmpText, xmpExternal,
3929
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the track header was "
3930
        "created.")},
3931
    {"TrackDuration", N_("Video Track Duration"), "Integer", xmpText, xmpExternal,
3932
     N_("A time value that indicates the duration of this track (in the movie's time coordinate system).")},
3933
    {"TrackForced", N_("Video Track Forced"), "Text", xmpText, xmpExternal,
3934
     N_("Video Track Forced , i.e. Enabled/Disabled")},
3935
    {"TrackID", N_("Track ID"), "Integer", xmpText, xmpExternal,
3936
     N_("A 32-bit integer that uniquely identifies the track. The value 0 cannot be used.")},
3937
    {"TrackHeaderVersion", N_("Track Header Version"), "Text", xmpText, xmpExternal,
3938
     N_("A 1-byte specification of the version of this track header")},
3939
    {"TrackLacing", N_("Video Track Lacing"), "Text", xmpText, xmpExternal,
3940
     N_("Video Track Lacing , i.e. Enabled/Disabled")},
3941
    {"TrackLang", N_("Track Language"), "Text", xmpText, xmpExternal,
3942
     N_("The Language in which a particular stream is recorded in.")},
3943
    {"TrackLayer", N_("Video Track Layer"), "Integer", xmpText, xmpExternal,
3944
     N_("A 16-bit integer that indicates this track's spatial priority in its movie. The QuickTime Movie"
3945
        "Toolbox uses this value to determine how tracks overlay one another. Tracks with lower layer"
3946
        "values are displayed in front of tracks with higher layer values.")},
3947
    {"TrackModifyDate", N_("Video Track Modify Date"), "Integer", xmpText, xmpExternal,
3948
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the track header was "
3949
        "last modified.")},
3950
    {"TrackName", N_("Track Name"), "Text", xmpText, xmpExternal,
3951
     N_("Track Name could be used to define titles for a segment.")},
3952
    {"TrackNumber", N_("Track Number"), "Integer", xmpText, xmpExternal, N_("Track Number.")},
3953
    {"TrackVolume", N_("Track Volume"), "Rational", xmpText, xmpExternal,
3954
     N_("A 16-bit fixed-point number that specifies how loud to play this track's sound. A value of 1.0 indicates "
3955
        "full volume.")},
3956
    {"TranslateCodec", N_("Chapter Translate Codec"), "Text", xmpText, xmpExternal,
3957
     N_("Chapter Translate Codec information. Usually used in Matroska file type.")},
3958
    {"UnknownInfo", N_("Unknown Information"), "Text", xmpText, xmpExternal,
3959
     N_("Unknown / Unregistered Metadata Tags and their values.")},
3960
    {"UnknownInfo2", N_("Unknown Information"), "Text", xmpText, xmpExternal,
3961
     N_("Unknown / Unregistered Metadata Tags and their values.")},
3962
    {"URL", N_("Video URL"), "Text", xmpText, xmpExternal,
3963
     N_("A C string that specifies a URL. There may be additional data after the C string.")},
3964
    {"URN", N_("Video URN"), "Text", xmpText, xmpExternal,
3965
     N_("A C string that specifies a URN. There may be additional data after the C string.")},
3966
    {"VariProgram", N_("Vari Program"), "Text", xmpText, xmpExternal,
3967
     N_("Software settings used to generate / create Video data.")},
3968
    {"VegasVersionMajor", N_("Vegas Version Major"), "Text", xmpText, xmpExternal, N_("Vegas Version Major.")},
3969
    {"VegasVersionMinor", N_("Vegas Version Minor"), "Text", xmpText, xmpExternal, N_("Vegas Version Minor.")},
3970
    {"Vendor", N_("Vendor"), "Text", xmpText, xmpExternal,
3971
     N_("The developer of the compressor that generated the compressed data.")},
3972
    {"VendorID", N_("Vendor ID"), "Text", xmpText, xmpExternal,
3973
     N_("A 32-bit integer that specifies the developer of the compressor that generated the compressed data. Often "
3974
        "this field contains 'appl' to indicate Apple Computer, Inc.")},
3975
    {"VideoQuality", N_("Video Quality"), "Integer", xmpText, xmpExternal, N_("Video Stream Quality")},
3976
    {"VideoSampleSize", N_("Video Sample Size"), "Integer", xmpText, xmpExternal, N_("Video Stream Sample Size")},
3977
    {"VideoScanType", N_("Video Scan Type"), "Text", xmpText, xmpExternal,
3978
     N_("Video Scan Type, it can be Progressive or Interlaced")},
3979
    {"WatermarkURL", N_("Watermark URL"), "Text", xmpText, xmpExternal,
3980
     N_("A C string that specifies a Watermark URL.")},
3981
    {"WhiteBalance", N_("White Balance"), "Closed Choice Text", xmpText, xmpExternal,
3982
     N_("\"White Balance\" setting. One of: As Shot, Auto, Daylight, Cloudy, Shade, Tungsten, "
3983
        "Fluorescent, Flash, Custom")},
3984
    {"WhiteBalanceFineTune", N_("White Balance Fine Tune"), "Integer", xmpText, xmpExternal,
3985
     N_("White Balance Fine Tune.")},
3986
    {"Width", N_("Video Width"), "Integer", xmpText, xmpExternal, N_("Video width in pixels")},
3987
    {"WindowLocation", N_("Window Location"), "Text", xmpText, xmpExternal,
3988
     N_("Information about the Window Location.")},
3989
    {"WorldTime", N_("World Time"), "Integer", xmpText, xmpExternal, N_("World Time")},
3990
    {"WrittenBy", N_("Written By"), "Text", xmpText, xmpExternal,
3991
     N_("Written By, i.e. name of person or organization.")},
3992
    {"WritingApp", N_("Writing App"), "Text", xmpText, xmpExternal,
3993
     N_("Contains the name of the application used to create the file (like \"mkvmerge 0.8.1\")")},
3994
    {"XResolution", N_("X Resolution"), "Rational", xmpText, xmpInternal,
3995
     N_("Horizontal resolution in pixels per unit.")},
3996
    {"Year", N_("Year"), "Integer", xmpText, xmpExternal, N_("Year in which the video was made.")},
3997
    {"YResolution", N_("Y Resolution"), "Rational", xmpText, xmpInternal,
3998
     N_("Vertical resolution in pixels per unit.")},
3999
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
4000
};
4001
4002
const XmpPropertyInfo xmpAudioInfo[] = {
4003
    {"AvgBytePerSec", N_("Average Bytes Per Second"), "Integer", xmpText, xmpExternal,
4004
     N_("Average Bytes Per Second found in audio stream")},
4005
    {"Balance", N_("Balance"), "Integer", xmpText, xmpExternal, N_("Indicates the left-right balance of the audio")},
4006
    {"BitsPerSample", N_("Bits Per Sample/ Bit Rate"), "Integer", xmpText, xmpExternal, N_("Bits per test sample")},
4007
    {"ChannelType", N_("Audio Channel Type"), "Integers", xmpText, xmpExternal,
4008
     N_("The audio channel type. One of: Mono, Stereo, 5.1, 7.1.")},
4009
    {"Codec", N_("Audio Codec"), "Text", xmpText, xmpExternal, N_("Codec used for Audio Encoding/Decoding")},
4010
    {"CodecDecodeAll", N_("Audio Codec Decode Info"), "Text", xmpText, xmpExternal,
4011
     N_("Contains information the audio codec decode all, i.e. Enabled/Disabled")},
4012
    {"CodecDescription", N_("Audio Codec Description"), "Text", xmpText, xmpExternal,
4013
     N_("Contains description the codec.")},
4014
    {"CodecDownloadUrl", N_("Audio Codec Download URL"), "Text", xmpText, xmpExternal, N_("Audio Codec Download URL.")},
4015
    {"CodecInfo", N_("Audio Codec Information"), "Text", xmpText, xmpExternal,
4016
     N_("Contains information the codec needs before decoding can be started. An example is the Vorbis "
4017
        "initialization packets for Vorbis audio.")},
4018
    {"CodecSettings", N_("Audio Codec Settings"), "Text", xmpText, xmpExternal,
4019
     N_("Contains settings the codec needs before decoding can be started.")},
4020
    {"Compressor", N_("Audio Compressor"), "Text", xmpText, xmpExternal,
4021
     N_("The audio compression used. For example, MP3.")},
4022
    {"DefaultDuration", N_("Audio Default Duration"), "Text", xmpText, xmpExternal,
4023
     N_("The number of micro seconds an audio chunk plays.")},
4024
    {"DefaultStream", N_("Audio Default Stream"), "Text", xmpText, xmpExternal,
4025
     N_("Audio Stream that would be played by default.")},
4026
    {"DefaultOn", N_("Audio Track Default On"), "Text", xmpText, xmpExternal,
4027
     N_("Audio Track Default On , i.e. Enabled/Disabled")},
4028
    {"Enabled", N_("Audio Track Enabled"), "Text", xmpText, xmpExternal,
4029
     N_("Status of Audio Track, i.e. Enabled/Disabled")},
4030
    {"Format", N_("Audio Format"), "Text", xmpText, xmpExternal,
4031
     N_("A four-character code that identifies the format of the audio.")},
4032
    {"HandlerClass", N_("Handler Class"), "Text", xmpText, xmpExternal,
4033
     N_("A four-character code that identifies the type of the handler. Only two values are valid for this field: "
4034
        "'mhlr' for media handlers and 'dhlr' for data handlers.")},
4035
    {"HandlerDescription", N_("Handler Description"), "Text", xmpText, xmpExternal,
4036
     N_("A (counted) string that specifies the name of the component-that is, the media handler used when this "
4037
        "media was created..")},
4038
    {"HandlerType", N_("Handler Type"), "Text", xmpText, xmpExternal,
4039
     N_("A four-character code that identifies the type of the media handler or data handler.")},
4040
    {"HandlerVendorID", N_("Handler Vendor ID"), "Text", xmpText, xmpExternal, N_("Component manufacturer.")},
4041
    {"MediaCreateDate", N_("Media Track Create Date"), "Integer", xmpText, xmpExternal,
4042
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the media header was "
4043
        "created.")},
4044
    {"MediaDuration", N_("Media Track Duration"), "Integer", xmpText, xmpExternal,
4045
     N_("A time value that indicates the duration of this media (in the movie's time coordinate system).")},
4046
    {"MediaHeaderVersion", N_("Media Header Version"), "Text", xmpText, xmpExternal,
4047
     N_("A 1-byte specification of the version of this media header")},
4048
    {"MediaLangCode", N_("Media Language Code"), "Integer", xmpText, xmpExternal,
4049
     N_("A 16-bit integer that specifies the language code for this media.")},
4050
    {"MediaModifyDate", N_("Media Track Modify Date"), "Integer", xmpText, xmpExternal,
4051
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the media header was "
4052
        "last modified.")},
4053
    {"MediaTimeScale", N_("Media Time Scale"), "Integer", xmpText, xmpExternal,
4054
     N_("A time value that indicates the time scale for this media-that is, the number of time units that pass per "
4055
        "second in its time coordinate system.")},
4056
    {"OutputSampleRate", N_("Output Audio Sample Rate"), "Integer", xmpText, xmpExternal,
4057
     N_("The output audio sample rate. Can be any value, but commonly 32000, 41100, or 48000.")},
4058
    {"SampleCount", N_("Audio Sample Count"), "Integer", xmpText, xmpExternal,
4059
     N_("Sample taken for Analyzing Audio Stream")},
4060
    {"SampleRate", N_("Audio Sample Rate"), "Integer", xmpText, xmpExternal,
4061
     N_("The audio sample rate. Can be any value, but commonly 32000, 41100, or 48000.")},
4062
    {"SampleType", N_("Audio Sample Type"), "closed Choice of Text", xmpText, xmpExternal,
4063
     N_("The audio sample type. One of: 8Int, 16Int, 32Int, 32Float.")},
4064
    {"SchemeTitle", N_("Sound Scheme Title"), "Text", xmpText, xmpExternal, N_("Sound Scheme Title.")},
4065
    {"TimeOffset", N_("Time Offset"), "Integer", xmpText, xmpExternal,
4066
     N_("Specifies the presentation time offset of the stream in 100-nanosecond units. This value shall be equal "
4067
        "to the send time of the first interleaved packet in the data section.")},
4068
    {"TrackCreateDate", N_("Audio Track Create Date"), "Integer", xmpText, xmpExternal,
4069
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the track header was "
4070
        "created.")},
4071
    {"TrackDuration", N_("Audio Track Duration"), "Integer", xmpText, xmpExternal,
4072
     N_("A time value that indicates the duration of this track (in the movie's time coordinate system).")},
4073
    {"TrackForced", N_("Audio Track Forced"), "Text", xmpText, xmpExternal,
4074
     N_("Audio Track Forced , i.e. Enabled/Disabled")},
4075
    {"TrackID", N_("Track ID"), "Integer", xmpText, xmpExternal,
4076
     N_("A 32-bit integer that uniquely identifies the track. The value 0 cannot be used.")},
4077
    {"TrackHeaderVersion", N_("Track Header Version"), "Text", xmpText, xmpExternal,
4078
     N_("A 1-byte specification of the version of this track header")},
4079
    {"TrackLacing", N_("Audio Track Lacing"), "Text", xmpText, xmpExternal,
4080
     N_("Audio Track Lacing , i.e. Enabled/Disabled")},
4081
    {"TrackLang", N_("Track Language"), "Text", xmpText, xmpExternal,
4082
     N_("The Language in which a particular stream is recorded in.")},
4083
    {"TrackLayer", N_("Audio Track Layer"), "Integer", xmpText, xmpExternal,
4084
     N_("A 16-bit integer that indicates this track's spatial priority in its movie. The QuickTime Movie"
4085
        "Toolbox uses this value to determine how tracks overlay one another. Tracks with lower layer"
4086
        "values are displayed in front of tracks with higher layer values.")},
4087
    {"TrackModifyDate", N_("Audio Track Modify Date"), "Integer", xmpText, xmpExternal,
4088
     N_("A 32-bit integer that indicates (in seconds since midnight, January 1, 1904) when the track header was "
4089
        "last modified.")},
4090
    {"TrackVolume", N_("Track Volume"), "Rational", xmpText, xmpExternal,
4091
     N_("A 16-bit fixed-point number that specifies how loud to play this track's sound. A value of 1.0 indicates "
4092
        "full volume.")},
4093
    {"URL", N_("Audio URL"), "Text", xmpText, xmpExternal,
4094
     N_("A C string that specifies a URL. There may be additional data after the C string.")},
4095
    {"URN", N_("Audio URN"), "Text", xmpText, xmpExternal,
4096
     N_("A C string that specifies a URN. There may be additional data after the C string.")},
4097
    {"VendorID", N_("Vendor ID"), "Text", xmpText, xmpExternal,
4098
     N_("A 32-bit integer that specifies the developer of the compressor that generated the compressed data. Often "
4099
        "this field contains 'appl' to indicate Apple Computer, Inc.")},
4100
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
4101
};
4102
4103
const XmpPropertyInfo xmpDctermsInfo[] = {
4104
    // dcterms properties used by DwC under the Record Class.
4105
    {"type", N_("Type"), "bag open Choice", xmpBag, xmpExternal, N_("The nature or genre of the resource.")},
4106
    {"modified", N_("Date Modified"), "seq Date", xmpSeq, xmpExternal, N_("Date on which the resource was changed.")},
4107
    {"language", N_("Language"), "bag Locale", xmpBag, xmpExternal, N_("A language of the resource.")},
4108
    {"license", N_("License"), "Lang Alt", langAlt, xmpExternal,
4109
     N_("A legal document giving official permission to do something with the resource.")},
4110
    {"rightsHolder", N_("Rights Holder"), "seq ProperName", xmpSeq, xmpExternal,
4111
     N_("A person or organization owning or managing rights over the resource.")},
4112
    {"accessRights", N_("Access Rights"), "Lang Alt", langAlt, xmpExternal,
4113
     N_("Information about who can access the resource or an indication of its security status.")},
4114
    {"bibliographicCitation", N_("Bibliographic Citation"), "Text", xmpText, xmpExternal,
4115
     N_("A bibliographic reference for the resource.")},
4116
    {"references", N_("References"), "bag Text", xmpBag, xmpExternal,
4117
     N_("A related resource that is referenced, cited, or otherwise pointed to by the described resource.")},
4118
    // Location Level Class
4119
    {
4120
        "Location",
4121
        N_("Location"),
4122
        "Location",
4123
        xmpText,
4124
        xmpInternal,
4125
        N_("*Main structure* containing Darwin Core location based information."),
4126
    },
4127
    // End of list marker
4128
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
4129
};
4130
4131
const XmpPropertyInfo xmpDwCInfo[] = {
4132
4133
    // Record Level Class
4134
    {
4135
        "Record",
4136
        N_("Record"),
4137
        "Record",
4138
        xmpText,
4139
        xmpInternal,
4140
        N_("*Main structure* containing record based information."),
4141
    },
4142
    // Record Level Terms
4143
    {"institutionID", N_("Institution ID"), "Text", xmpText, xmpExternal,
4144
     N_("An identifier for the institution having custody of the object(s) or information referred to in the "
4145
        "record.")},
4146
    {"collectionID", N_("Collection ID"), "Text", xmpText, xmpExternal,
4147
     N_("An identifier for the collection or dataset from which the record was derived. For physical specimens, "
4148
        "the recommended best practice is to use the identifier in a collections registry such as the Biodiversity "
4149
        "Collections Index (http://www.biodiversitycollectionsindex.org/).")},
4150
    {"institutionCode", N_("Institution Code"), "Text", xmpText, xmpExternal,
4151
     N_("The name (or acronym) in use by the institution having custody of the object(s) or information referred "
4152
        "to in the record.")},
4153
    {"datasetID", N_("Dataset ID"), "Text", xmpText, xmpExternal,
4154
     N_("An identifier for the set of data. May be a global unique identifier or an identifier specific to a "
4155
        "collection or institution.")},
4156
    {"collectionCode", N_("Collection Code"), "Text", xmpText, xmpExternal,
4157
     N_("The name, acronym, coden, or initialism identifying the collection or data set from which the record was "
4158
        "derived.")},
4159
    {"datasetName", N_("Dataset Name"), "Text", xmpText, xmpExternal,
4160
     N_("The name identifying the data set from which the record was derived.")},
4161
    {"ownerInstitutionCode", N_("Owner Institution Code"), "Text", xmpText, xmpExternal,
4162
     N_("The name (or acronym) in use by the institution having ownership of the object(s) or information referred "
4163
        "to in the record.")},
4164
    {"basisOfRecord", N_("Basis Of Record"), "Text", xmpText, xmpExternal,
4165
     N_("The specific nature of the data record - a subtype of the type. Recommended best practice is to use a "
4166
        "controlled vocabulary such as the Darwin Core Type Vocabulary "
4167
        "(http://rs.tdwg.org/dwc/terms/type-vocabulary/index.htm).")},
4168
    {"informationWithheld", N_("Information Withheld"), "Text", xmpText, xmpExternal,
4169
     N_("Additional information that exists, but that has not been shared in the given record.")},
4170
    {"dataGeneralizations", N_("Data Generalizations"), "Text", xmpText, xmpExternal,
4171
     N_("Actions taken to make the shared data less specific or complete than in its original form. Suggests that "
4172
        "alternative data of higher quality may be available on request.")},
4173
    {"dynamicProperties", N_("Dynamic Properties"), "bag Text", xmpBag, xmpExternal,
4174
     N_("A list (concatenated and separated) of additional measurements, facts, characteristics, or assertions "
4175
        "about the record. Meant to provide a mechanism for structured content such as key-value pairs.")},
4176
4177
    // Occurrence Level Class
4178
    {
4179
        "Occurrence",
4180
        N_("Occurrence"),
4181
        "Occurrence",
4182
        xmpText,
4183
        xmpInternal,
4184
        N_("*Main structure* containing occurrence based information."),
4185
    },
4186
    // Occurrence Level Terms
4187
    {"occurrenceID", N_("Occurrence ID"), "Text", xmpText, xmpExternal,
4188
     N_("An identifier for the Occurrence (as opposed to a particular digital record of the occurrence). In the "
4189
        "absence of a persistent global unique identifier, construct one from a combination of identifiers in the "
4190
        "record that will most closely make the occurrenceID globally unique.")},
4191
    {"catalogNumber", N_("Catalog Number"), "Text", xmpText, xmpExternal,
4192
     N_("An identifier (preferably unique) for the record within the data set or collection.")},
4193
    {"occurrenceDetails", N_("Occurrence Details"), "Text", xmpText, xmpExternal,
4194
     N_("Deprecated. Details about the Occurrence.")},
4195
    {"occurrenceRemarks", N_("Occurrence Remarks"), "Text", xmpText, xmpExternal,
4196
     N_("Comments or notes about the Occurrence.")},
4197
    {"recordNumber", N_("Record Number"), "Text", xmpText, xmpExternal,
4198
     N_("An identifier given to the Occurrence at the time it was recorded. Often serves as a link between field "
4199
        "notes and an Occurrence record, such as a specimen collector's number.")},
4200
    {"recordedBy", N_("Recorded By"), "bag Text", xmpBag, xmpExternal,
4201
     N_("A list (concatenated and separated) of names of people, groups, or organizations responsible for "
4202
        "recording the original Occurrence. The primary collector or observer, especially one who applies a "
4203
        "personal identifier (recordNumber), should be listed first.")},
4204
    {"individualID", N_("Individual ID"), "Text", xmpText, xmpExternal,
4205
     N_("Deprecated. An identifier for an individual or named group of individual organisms represented in the "
4206
        "Occurrence. Meant to accommodate resampling of the same individual or group for monitoring purposes. May "
4207
        "be a global unique identifier or an identifier specific to a data set.")},
4208
    {"individualCount", N_("Individual Count"), "Integer", xmpText, xmpExternal,
4209
     N_("The number of individuals represented present at the time of the Occurrence.")},
4210
    {"organismQuantity", N_("Organism Quantity"), "Text", xmpText, xmpExternal,
4211
     N_("A number or enumeration value for the quantity of organisms.")},
4212
    {"organismQuantityType", N_("Organism Quantity Type"), "Text", xmpText, xmpExternal,
4213
     N_("The type of quantification system used for the quantity of organisms.")},
4214
    {"sex", N_("Sex"), "Text", xmpText, xmpExternal,
4215
     N_("The sex of the biological individual(s) represented in the Occurrence. Recommended best practice is to "
4216
        "use a controlled vocabulary.")},
4217
    {"lifeStage", N_("Life Stage"), "Text", xmpText, xmpExternal,
4218
     N_("The age class or life stage of the biological individual(s) at the time the Occurrence was recorded. "
4219
        "Recommended best practice is to use a controlled vocabulary.")},
4220
    {"reproductiveCondition", N_("Reproductive Condition"), "Text", xmpText, xmpExternal,
4221
     N_("The reproductive condition of the biological individual(s) represented in the Occurrence. Recommended "
4222
        "best practice is to use a controlled vocabulary.")},
4223
    {"behavior", N_("Behavior"), "Text", xmpText, xmpExternal,
4224
     N_("A description of the behavior shown by the subject at the time the Occurrence was recorded. Recommended "
4225
        "best practice is to use a controlled vocabulary.")},
4226
    {"establishmentMeans", N_("Establishment Means"), "Text", xmpText, xmpExternal,
4227
     N_("The process by which the biological individual(s) represented in the Occurrence became established at the "
4228
        "location. Recommended best practice is to use a controlled vocabulary.")},
4229
    {"occurrenceStatus", N_("Occurrence Status"), "Text", xmpText, xmpExternal,
4230
     N_("A statement about the presence or absence of a Taxon at a Location. Recommended best practice is to use a "
4231
        "controlled vocabulary.")},
4232
    {"preparations", N_("Preparations"), "bag Text", xmpBag, xmpExternal,
4233
     N_("A list (concatenated and separated) of preparations and preservation methods for a specimen.")},
4234
    {"disposition", N_("Disposition"), "Text", xmpText, xmpExternal,
4235
     N_("The current state of a specimen with respect to the collection identified in collectionCode or "
4236
        "collectionID. Recommended best practice is to use a controlled vocabulary.")},
4237
    {"otherCatalogNumbers", N_("Other Catalog Numbers"), "bag Text", xmpBag, xmpExternal,
4238
     N_("A list (concatenated and separated) of previous or alternate fully qualified catalog numbers or other "
4239
        "human-used identifiers for the same Occurrence, whether in the current or any other data set or "
4240
        "collection.")},
4241
    {"previousIdentifications", N_("Previous Identifications"), "bag Text", xmpBag, xmpExternal,
4242
     N_("Deprecated. A list (concatenated and separated) of previous assignments of names to the Occurrence.")},
4243
    {"associatedMedia", N_("Associated Media"), "bag Text", xmpBag, xmpExternal,
4244
     N_("A list (concatenated and separated) of identifiers (publication, global unique identifier, URI) of media "
4245
        "associated with the Occurrence.")},
4246
    {"associatedReferences", N_("Associated References"), "bag Text", xmpBag, xmpExternal,
4247
     N_("A list (concatenated and separated) of identifiers (publication, bibliographic reference, global unique "
4248
        "identifier, URI) of literature associated with the Occurrence.")},
4249
    {"associatedOccurrences", N_("Associated Occurrences"), "bag Text", xmpBag, xmpExternal,
4250
     N_("Deprecated. A list (concatenated and separated) of identifiers of other Occurrence records and their "
4251
        "associations to this Occurrence.")},
4252
    {"associatedSequences", N_("Associated Sequences"), "bag Text", xmpBag, xmpExternal,
4253
     N_("A list (concatenated and separated) of identifiers (publication, global unique identifier, URI) of "
4254
        "genetic sequence information associated with the Occurrence.")},
4255
    {"associatedTaxa", N_("Associated Taxa"), "bag Text", xmpBag, xmpExternal,
4256
     N_("A list (concatenated and separated) of identifiers or names of taxa and their associations with the "
4257
        "Occurrence.")},
4258
4259
    // Organism Level Class
4260
    {
4261
        "Organism",
4262
        N_("Organism"),
4263
        "Organism",
4264
        xmpText,
4265
        xmpInternal,
4266
        N_("*Main structure* containing organism based information."),
4267
    },
4268
    // Organism Level Terms
4269
    {"organismID", N_("Organism ID"), "Text", xmpText, xmpExternal,
4270
     N_("An identifier for the Organism instance (as opposed to a particular digital record of the Organism). May "
4271
        "be a globally unique identifier or an identifier specific to the data set.")},
4272
    {"organismName", N_("Organism Name"), "Text", xmpText, xmpExternal,
4273
     N_("A textual name or label assigned to an Organism instance.")},
4274
    {"organismScope", N_("Organism Scope"), "Text", xmpText, xmpExternal,
4275
     N_("A description of the kind of Organism instance. Can be used to indicate whether the Organism instance "
4276
        "represents a discrete organism or if it represents a particular type of aggregation. Recommended best "
4277
        "practice is to use a controlled vocabulary.")},
4278
    {"associatedOccurrences", N_("Organism Associated Occurrences"), "bag Text", xmpBag, xmpExternal,
4279
     N_("A list (concatenated and separated with a vertical bar ' | ') of identifiers of other Occurrence records "
4280
        "and their associations to this Occurrence.")},
4281
    {"associatedOrganisms", N_("Associated Organisms"), "bag Text", xmpBag, xmpExternal,
4282
     N_("A list (concatenated and separated with a vertical bar ' | ' ) of identifiers of other Organisms and "
4283
        "their associations to this Organism.")},
4284
    {"previousIdentifications", N_("Previous Identifications"), "bag Text", xmpBag, xmpExternal,
4285
     N_("A list (concatenated and separated with a vertical bar ' | ' ) of previous assignments of names to the "
4286
        "Organism.")},
4287
    {"organismRemarks", N_("Organism Remarks"), "Text", xmpText, xmpExternal,
4288
     N_("Comments or notes about the Organism instance.")},
4289
4290
    // Material Sample Level Class
4291
    {
4292
        "MaterialSample",
4293
        N_("Material Sample"),
4294
        "MaterialSample",
4295
        xmpText,
4296
        xmpInternal,
4297
        N_("*Main structure* containing material sample based information."),
4298
    },
4299
    {
4300
        "LivingSpecimen",
4301
        N_("Living Specimen"),
4302
        "LivingSpecimen",
4303
        xmpText,
4304
        xmpInternal,
4305
        N_("*Main structure* containing living specimen based information. A specimen that is alive."),
4306
    },
4307
    {
4308
        "PreservedSpecimen",
4309
        N_("Preserved Specimen"),
4310
        "PreservedSpecimen",
4311
        xmpText,
4312
        xmpInternal,
4313
        N_("*Main structure* containing preserved specimen based information. A specimen that has been preserved."),
4314
    },
4315
    {
4316
        "FossilSpecimen",
4317
        N_("Fossil Specimen"),
4318
        "FossilSpecimen",
4319
        xmpText,
4320
        xmpInternal,
4321
        N_("*Main structure* containing fossil specimen based information. A preserved specimen that is a fossil."),
4322
    },
4323
    // Material Sample Level Terms
4324
    {"materialSampleID", N_("Material Sample ID"), "Text", xmpText, xmpExternal,
4325
     N_("An identifier for the MaterialSample (as opposed to a particular digital record of the material sample). "
4326
        "In the absence of a persistent global unique identifier, construct one from a combination of identifiers "
4327
        "in the record that will most closely make the materialSampleID globally unique.")},
4328
4329
    // Event Level Class
4330
    {
4331
        "Event",
4332
        N_("Event"),
4333
        "Event",
4334
        xmpText,
4335
        xmpInternal,
4336
        N_("*Main structure* containing event based information."),
4337
    },
4338
    {
4339
        "HumanObservation",
4340
        N_("Human Observation"),
4341
        "HumanObservation",
4342
        xmpText,
4343
        xmpInternal,
4344
        N_("*Main structure* containing human observation based information."),
4345
    },
4346
    {
4347
        "MachineObservation",
4348
        N_("Machine Observation"),
4349
        "MachineObservation",
4350
        xmpText,
4351
        xmpInternal,
4352
        N_("*Main structure* containing machine observation based information."),
4353
    },
4354
    // Event Level Terms
4355
    {"eventID", N_("Event ID"), "Text", xmpText, xmpExternal,
4356
     N_("An identifier for the set of information associated with an Event (something that occurs at a place and "
4357
        "time). May be a global unique identifier or an identifier specific to the data set.")},
4358
    {"parentEventID", N_("Parent Event ID"), "Text", xmpText, xmpExternal,
4359
     N_("An identifier for the broader Event that groups this and potentially other Events.")},
4360
    {"eventDate", N_("Event Date"), "Date", xmpText, xmpExternal,
4361
     N_("The date-time or interval during which an Event occurred. For occurrences, this is the date-time when the "
4362
        "event was recorded. Not suitable for a time in a geological context. Recommended best practice is to use "
4363
        "an encoding scheme, such as ISO 8601:2004(E).")},
4364
    {"earliestDate", N_("Event Earliest Date"), "Date", xmpText, xmpExternal,
4365
     N_("Deprecated. (Child of Xmp.dwc.Event) The date-time or interval during which an Event started. For "
4366
        "occurrences, this is the date-time when the event was recorded. Not suitable for a time in a geological "
4367
        "context. Recommended best practice is to use an encoding scheme, such as ISO 8601:2004(E).")},
4368
    {"latestDate", N_("Event Latest Date"), "Date", xmpText, xmpExternal,
4369
     N_("Deprecated. (Child of Xmp.dwc.Event) The date-time or interval during which an Event ended. For "
4370
        "occurrences, this is the date-time when the event was recorded. Not suitable for a time in a geological "
4371
        "context. Recommended best practice is to use an encoding scheme, such as ISO 8601:2004(E).")},
4372
    {"eventTime", N_("Event Time"), "Date", xmpText, xmpExternal,
4373
     N_("The time or interval during which an Event occurred. Recommended best practice is to use an encoding "
4374
        "scheme, such as ISO 8601:2004(E).")},
4375
    {"startDayOfYear", N_("Start Day Of Year"), "Integer", xmpText, xmpExternal,
4376
     N_("The earliest ordinal day of the year on which the Event occurred (1 for January 1, 365 for December 31, "
4377
        "except in a leap year, in which case it is 366).")},
4378
    {"endDayOfYear", N_("End Day Of Year"), "Integer", xmpText, xmpExternal,
4379
     N_("The latest ordinal day of the year on which the Event occurred (1 for January 1, 365 for December 31, "
4380
        "except in a leap year, in which case it is 366).")},
4381
    {"year", N_("Year"), "Integer", xmpText, xmpExternal,
4382
     N_("The four-digit year in which the Event occurred, according to the Common Era Calendar.")},
4383
    {"month", N_("Month"), "Integer", xmpText, xmpExternal, N_("The ordinal month in which the Event occurred.")},
4384
    {"day", N_("Day"), "Integer", xmpText, xmpExternal,
4385
     N_("The integer day of the month on which the Event occurred.")},
4386
    {"verbatimEventDate", N_("Verbatim Event Date"), "Text", xmpText, xmpExternal,
4387
     N_("The verbatim original representation of the date and time information for an Event.")},
4388
    {"habitat", N_("Habitat"), "Text", xmpText, xmpExternal,
4389
     N_("A category or description of the habitat in which the Event occurred.")},
4390
    {"samplingProtocol", N_("Sampling Protocol"), "Text", xmpText, xmpExternal,
4391
     N_("The name of, reference to, or description of the method or protocol used during an Event.")},
4392
    {"samplingEffort", N_("Sampling Effort"), "Text", xmpText, xmpExternal,
4393
     N_("The amount of effort expended during an Event.")},
4394
    {"sampleSizeValue", N_("Sampling Size Value"), "Text", xmpText, xmpExternal,
4395
     N_("A numeric value for a measurement of the size (time duration, length, area, or volume) of a sample in a "
4396
        "sampling event.")},
4397
    {"sampleSizeUnit", N_("Sampling Size Unit"), "Text", xmpText, xmpExternal,
4398
     N_("The unit of measurement of the size (time duration, length, area, or volume) of a sample in a sampling "
4399
        "event.")},
4400
    {"fieldNumber", N_("Field Number"), "Text", xmpText, xmpExternal,
4401
     N_("An identifier given to the event in the field. Often serves as a link between field notes and the "
4402
        "Event.")},
4403
    {"fieldNotes", N_("Field Notes"), "Text", xmpText, xmpExternal,
4404
     N_("One of (a) an indicator of the existence of, (b) a reference to (publication, URI), or (c) the text of "
4405
        "notes taken in the field about the Event.")},
4406
    {"eventRemarks", N_("Event Remarks"), "Text", xmpText, xmpExternal, N_("Comments or notes about the Event.")},
4407
4408
    // Location Level Class
4409
    {
4410
        "dctermsLocation",
4411
        N_("Location Class"),
4412
        "Location",
4413
        xmpText,
4414
        xmpInternal,
4415
        N_("Deprecated. Use Xmp.dcterms.Location instead. *Main structure* containing location based information."),
4416
    },
4417
    // Location Level Terms
4418
    {"locationID", N_("Location ID"), "Text", xmpText, xmpExternal,
4419
     N_("An identifier for the set of location information (data associated with Location). May be a global unique "
4420
        "identifier or an identifier specific to the data set.")},
4421
    {"higherGeographyID", N_("Higher Geography ID"), "Text", xmpText, xmpExternal,
4422
     N_("An identifier for the geographic region within which the Location occurred. Recommended best practice is "
4423
        "to use an persistent identifier from a controlled vocabulary such as the Getty Thesaurus of Geographic "
4424
        "Names.")},
4425
    {"higherGeography", N_("Higher Geography"), "bag Text", xmpBag, xmpExternal,
4426
     N_("A list (concatenated and separated) of geographic names less specific than the information captured in "
4427
        "the locality term.")},
4428
    {"continent", N_("Continent"), "Text", xmpText, xmpExternal,
4429
     N_("The name of the continent in which the Location occurs. Recommended best practice is to use a controlled "
4430
        "vocabulary such as the Getty Thesaurus of Geographic Names or the ISO 3166 Continent code.")},
4431
    {"waterBody", N_("Water Body"), "Text", xmpText, xmpExternal,
4432
     N_("The name of the water body in which the Location occurs. Recommended best practice is to use a controlled "
4433
        "vocabulary such as the Getty Thesaurus of Geographic Names.")},
4434
    {"islandGroup", N_("Island Group"), "Text", xmpText, xmpExternal,
4435
     N_("The name of the island group in which the Location occurs. Recommended best practice is to use a "
4436
        "controlled vocabulary such as the Getty Thesaurus of Geographic Names.")},
4437
    {"island", N_("Island"), "Text", xmpText, xmpExternal,
4438
     N_("The name of the island on or near which the Location occurs. Recommended best practice is to use a "
4439
        "controlled vocabulary such as the Getty Thesaurus of Geographic Names.")},
4440
    {"country", N_("Country"), "Text", xmpText, xmpExternal,
4441
     N_("The name of the country or major administrative unit in which the Location occurs. Recommended best "
4442
        "practice is to use a controlled vocabulary such as the Getty Thesaurus of Geographic Names.")},
4443
    {"countryCode", N_("Country Code"), "Text", xmpText, xmpExternal,
4444
     N_("The standard code for the country in which the Location occurs. Recommended best practice is to use ISO "
4445
        "3166-1-alpha-2 country codes.")},
4446
    {"stateProvince", N_("State Province"), "Text", xmpText, xmpExternal,
4447
     N_("The name of the next smaller administrative region than country (state, province, canton, department, "
4448
        "region, etc.) in which the Location occurs.")},
4449
    {"county", N_("County"), "Text", xmpText, xmpExternal,
4450
     N_("The full, unabbreviated name of the next smaller administrative region than stateProvince (county, shire, "
4451
        "department, etc.) in which the Location occurs.")},
4452
    {"municipality", N_("Municipality"), "Text", xmpText, xmpExternal,
4453
     N_("The full, unabbreviated name of the next smaller administrative region than county (city, municipality, "
4454
        "etc.) in which the Location occurs. Do not use this term for a nearby named place that does not contain "
4455
        "the actual location.")},
4456
    {"locality", N_("Locality"), "Text", xmpText, xmpExternal,
4457
     N_("The specific description of the place. Less specific geographic information can be provided in other "
4458
        "geographic terms (higherGeography, continent, country, stateProvince, county, municipality, waterBody, "
4459
        "island, islandGroup). This term may contain information modified from the original to correct perceived "
4460
        "errors or standardize the description.")},
4461
    {"verbatimLocality", N_("Verbatim Locality"), "Text", xmpText, xmpExternal,
4462
     N_("The original textual description of the place.")},
4463
    {"verbatimElevation", N_("Verbatim Elevation"), "Text", xmpText, xmpExternal,
4464
     N_("The original description of the elevation (altitude, usually above sea level) of the Location.")},
4465
    {"minimumElevationInMeters", N_("Minimum Elevation In Meters"), "Real", xmpText, xmpExternal,
4466
     N_("The lower limit of the range of elevation (altitude, usually above sea level), in meters.")},
4467
    {"maximumElevationInMeters", N_("Maximum Elevation In Meters"), "Real", xmpText, xmpExternal,
4468
     N_("The upper limit of the range of elevation (altitude, usually above sea level), in meters.")},
4469
    {"verbatimDepth", N_("Verbatim Depth"), "Text", xmpText, xmpExternal,
4470
     N_("The original description of the depth below the local surface.")},
4471
    {"minimumDepthInMeters", N_("Minimum Depth In Meters"), "Real", xmpText, xmpExternal,
4472
     N_("The lesser depth of a range of depth below the local surface, in meters.")},
4473
    {"maximumDepthInMeters", N_("Maximum Depth In Meters"), "Real", xmpText, xmpExternal,
4474
     N_("The greater depth of a range of depth below the local surface, in meters.")},
4475
    {"minimumDistanceAboveSurfaceInMeters", N_("Minimum Distance Above Surface In Meters"), "Real", xmpText,
4476
     xmpExternal,
4477
     N_("The lesser distance in a range of distance from a reference surface in the vertical direction, in meters. "
4478
        "Use positive values for locations above the surface, negative values for locations below. If depth "
4479
        "measures are given, the reference surface is the location given by the depth, otherwise the reference "
4480
        "surface is the location given by the elevation.")},
4481
    {"maximumDistanceAboveSurfaceInMeters", N_("Maximum Distance Above Surface In Meters"), "Real", xmpText,
4482
     xmpExternal,
4483
     N_("The greater distance in a range of distance from a reference surface in the vertical direction, in "
4484
        "meters. Use positive values for locations above the surface, negative values for locations below. If "
4485
        "depth measures are given, the reference surface is the location given by the depth, otherwise the "
4486
        "reference surface is the location given by the elevation.")},
4487
    {"locationAccordingTo", N_("Location According To"), "Text", xmpText, xmpExternal,
4488
     N_("Information about the source of this Location information. Could be a publication (gazetteer), "
4489
        "institution, or team of individuals.")},
4490
    {"locationRemarks", N_("Location Remarks"), "Text", xmpText, xmpExternal,
4491
     N_("Comments or notes about the Location.")},
4492
    {"verbatimCoordinates", N_("Verbatim Coordinates"), "Text", xmpText, xmpExternal,
4493
     N_("The verbatim original spatial coordinates of the Location. The coordinate ellipsoid, geodeticDatum, or "
4494
        "full Spatial Reference System (SRS) for these coordinates should be stored in verbatimSRS and the "
4495
        "coordinate system should be stored in verbatimCoordinateSystem.")},
4496
    {"verbatimLatitude", N_("Verbatim Latitude"), "Text", xmpText, xmpExternal,
4497
     N_("The verbatim original latitude of the Location. The coordinate ellipsoid, geodeticDatum, or full Spatial "
4498
        "Reference System (SRS) for these coordinates should be stored in verbatimSRS and the coordinate system "
4499
        "should be stored in verbatimCoordinateSystem.")},
4500
    {"verbatimLongitude", N_("Verbatim Longitude"), "Text", xmpText, xmpExternal,
4501
     N_("The verbatim original longitude of the Location. The coordinate ellipsoid, geodeticDatum, or full Spatial "
4502
        "Reference System (SRS) for these coordinates should be stored in verbatimSRS and the coordinate system "
4503
        "should be stored in verbatimCoordinateSystem.")},
4504
    {"verbatimCoordinateSystem", N_("Verbatim Coordinate System"), "Text", xmpText, xmpExternal,
4505
     N_("The spatial coordinate system for the verbatimLatitude and verbatimLongitude or the verbatimCoordinates "
4506
        "of the Location. Recommended best practice is to use a controlled vocabulary.")},
4507
    {"verbatimSRS", N_("Verbatim SRS"), "Text", xmpText, xmpExternal,
4508
     N_("The ellipsoid, geodetic datum, or spatial reference system (SRS) upon which coordinates given in "
4509
        "verbatimLatitude and verbatimLongitude, or verbatimCoordinates are based. Recommended best practice is "
4510
        "use the EPSG code as a controlled vocabulary to provide an SRS, if known. Otherwise use a controlled "
4511
        "vocabulary for the name or code of the geodetic datum, if known. Otherwise use a controlled vocabulary "
4512
        "for the name or code of the ellipsoid, if known. If none of these is known, use the value \"unknown\".")},
4513
    {"decimalLatitude", N_("Decimal Latitude"), "Real", xmpText, xmpExternal,
4514
     N_("The geographic latitude (in decimal degrees, using the spatial reference system given in geodeticDatum) "
4515
        "of the geographic center of a Location. Positive values are north of the Equator, negative values are "
4516
        "south of it. Legal values lie between -90 and 90, inclusive.")},
4517
    {"decimalLongitude", N_("Decimal Longitude"), "Real", xmpText, xmpExternal,
4518
     N_("The geographic longitude (in decimal degrees, using the spatial reference system given in geodeticDatum) "
4519
        "of the geographic center of a Location. Positive values are east of the Greenwich Meridian, negative "
4520
        "values are west of it. Legal values lie between -180 and 180, inclusive.")},
4521
    {"geodeticDatum", N_("Geodetic Datum"), "Text", xmpText, xmpExternal,
4522
     N_("The ellipsoid, geodetic datum, or spatial reference system (SRS) upon which the geographic coordinates "
4523
        "given in decimalLatitude and decimalLongitude as based. Recommended best practice is use the EPSG code as "
4524
        "a controlled vocabulary to provide an SRS, if known. Otherwise use a controlled vocabulary for the name "
4525
        "or code of the geodetic datum, if known. Otherwise use a controlled vocabulary for the name or code of "
4526
        "the ellipsoid, if known. If none of these is known, use the value \"unknown\".")},
4527
    {"coordinateUncertaintyInMeters", N_("Coordinate Uncertainty In Meters"), "Real", xmpText, xmpExternal,
4528
     N_("The horizontal distance (in meters) from the given decimalLatitude and decimalLongitude describing the "
4529
        "smallest circle containing the whole of the Location. Leave the value empty if the uncertainty is "
4530
        "unknown, cannot be estimated, or is not applicable (because there are no coordinates). Zero is not a "
4531
        "valid value for this term.")},
4532
    {"coordinatePrecision", N_("Coordinate Precision"), "Text", xmpText, xmpExternal,
4533
     N_("A decimal representation of the precision of the coordinates given in the decimalLatitude and "
4534
        "decimalLongitude.")},
4535
    {"pointRadiusSpatialFit", N_("Point Radius Spatial Fit"), "Real", xmpText, xmpExternal,
4536
     /* xgettext:no-c-format */
4537
     N_("The ratio of the area of the point-radius (decimalLatitude, decimalLongitude, "
4538
        "coordinateUncertaintyInMeters) to the area of the true (original, or most specific) spatial "
4539
        "representation of the Location. Legal values are 0, greater than or equal to 1, or undefined. A value of "
4540
        "1 is an exact match or 100% overlap. A value of 0 should be used if the given point-radius does not "
4541
        "completely contain the original representation. The pointRadiusSpatialFit is undefined (and should be "
4542
        "left blank) if the original representation is a point without uncertainty and the given georeference is "
4543
        "not that same point (without uncertainty). If both the original and the given georeference are the same "
4544
        "point, the pointRadiusSpatialFit is 1.")},
4545
    {"footprintWKT", N_("Footprint WKT"), "Text", xmpText, xmpExternal,
4546
     N_("A Well-Known Text (WKT) representation of the shape (footprint, geometry) that defines the Location. A "
4547
        "Location may have both a point-radius representation (see decimalLatitude) and a footprint "
4548
        "representation, and they may differ from each other.")},
4549
    {"footprintSRS", N_("Footprint SRS"), "Text", xmpText, xmpExternal,
4550
     N_("A Well-Known Text (WKT) representation of the Spatial Reference System (SRS) for the footprintWKT of the "
4551
        "Location. Do not use this term to describe the SRS of the decimalLatitude and decimalLongitude, even if "
4552
        "it is the same as for the footprintWKT - use the geodeticDatum instead.")},
4553
    {"footprintSpatialFit", N_("Footprint Spatial Fit"), "Real", xmpText, xmpExternal,
4554
     /* xgettext:no-c-format */
4555
     N_("The ratio of the area of the footprint (footprintWKT) to the area of the true (original, or most "
4556
        "specific) spatial representation of the Location. Legal values are 0, greater than or equal to 1, or "
4557
        "undefined. A value of 1 is an exact match or 100% overlap. A value of 0 should be used if the given "
4558
        "footprint does not completely contain the original representation. The footprintSpatialFit is undefined "
4559
        "(and should be left blank) if the original representation is a point and the given georeference is not "
4560
        "that same point. If both the original and the given georeference are the same point, the "
4561
        "footprintSpatialFit is 1.")},
4562
    {"georeferencedBy", N_("Georeferenced By"), "bag Text", xmpBag, xmpExternal,
4563
     N_("A list (concatenated and separated) of names of people, groups, or organizations who determined the "
4564
        "georeference (spatial representation) for the Location.")},
4565
    {"georeferencedDate", N_("Georeferenced Date"), "Date", xmpText, xmpExternal,
4566
     N_("The date on which the Location was georeferenced. Recommended best practice is to use an encoding scheme, "
4567
        "such as ISO 8601:2004(E).")},
4568
    {"georeferenceProtocol", N_("Georeference Protocol"), "Text", xmpText, xmpExternal,
4569
     N_("A description or reference to the methods used to determine the spatial footprint, coordinates, and "
4570
        "uncertainties.")},
4571
    {"georeferenceSources", N_("Georeference Sources"), "bag Text", xmpBag, xmpExternal,
4572
     N_("A list (concatenated and separated) of maps, gazetteers, or other resources used to georeference the "
4573
        "Location, described specifically enough to allow anyone in the future to use the same resources.")},
4574
    {"georeferenceVerificationStatus", N_("Georeference Verification Status"), "Text", xmpText, xmpExternal,
4575
     N_("A categorical description of the extent to which the georeference has been verified to represent the best "
4576
        "possible spatial description. Recommended best practice is to use a controlled vocabulary.")},
4577
    {"georeferenceRemarks", N_("Georeference Remarks"), "Text", xmpText, xmpExternal,
4578
     N_("Notes or comments about the spatial description determination, explaining assumptions made in addition or "
4579
        "opposition to the those formalized in the method referred to in georeferenceProtocol.")},
4580
4581
    // Geological Context Level Class
4582
    {
4583
        "GeologicalContext",
4584
        N_("Geological Context"),
4585
        "GeologicalContext",
4586
        xmpText,
4587
        xmpInternal,
4588
        N_("*Main structure* containing geological context based information."),
4589
    },
4590
    // Geological Context Level Terms
4591
    {"geologicalContextID", N_("Geological Context ID"), "Text", xmpText, xmpExternal,
4592
     N_("An identifier for the set of information associated with a GeologicalContext (the location within a "
4593
        "geological context, such as stratigraphy). May be a global unique identifier or an identifier specific to "
4594
        "the data set.")},
4595
    {"earliestEonOrLowestEonothem", N_("Earliest Eon Or Lowest Eonothem"), "Text", xmpText, xmpExternal,
4596
     N_("The full name of the earliest possible geochronologic eon or lowest chrono-stratigraphic eonothem or the "
4597
        "informal name (\"Precambrian\") attributable to the stratigraphic horizon from which the cataloged item "
4598
        "was collected.")},
4599
    {"latestEonOrHighestEonothem", N_("Latest Eon Or Highest Eonothem"), "Text", xmpText, xmpExternal,
4600
     N_("The full name of the latest possible geochronologic eon or highest chrono-stratigraphic eonothem or the "
4601
        "informal name (\"Precambrian\") attributable to the stratigraphic horizon from which the cataloged item "
4602
        "was collected.")},
4603
    {"earliestEraOrLowestErathem", N_("Earliest Era Or Lowest Erathem"), "Text", xmpText, xmpExternal,
4604
     N_("The full name of the earliest possible geochronologic era or lowest chronostratigraphic erathem "
4605
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4606
    {"latestEraOrHighestErathem", N_("Latest Era Or Highest Erathem"), "Text", xmpText, xmpExternal,
4607
     N_("The full name of the latest possible geochronologic era or highest chronostratigraphic erathem "
4608
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4609
    {"earliestPeriodOrLowestSystem", N_("Earliest Period Or Lowest System"), "Text", xmpText, xmpExternal,
4610
     N_("The full name of the earliest possible geochronologic period or lowest chronostratigraphic system "
4611
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4612
    {"latestPeriodOrHighestSystem", N_("Latest Period Or Highest System"), "Text", xmpText, xmpExternal,
4613
     N_("The full name of the latest possible geochronologic period or highest chronostratigraphic system "
4614
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4615
    {"earliestEpochOrLowestSeries", N_("Earliest Epoch Or Lowest Series"), "Text", xmpText, xmpExternal,
4616
     N_("The full name of the earliest possible geochronologic epoch or lowest chronostratigraphic series "
4617
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4618
    {"latestEpochOrHighestSeries", N_("Latest Epoch Or Highest Series"), "Text", xmpText, xmpExternal,
4619
     N_("The full name of the latest possible geochronologic epoch or highest chronostratigraphic series "
4620
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4621
    {"earliestAgeOrLowestStage", N_("Earliest Age Or Lowest Stage"), "Text", xmpText, xmpExternal,
4622
     N_("The full name of the earliest possible geochronologic age or lowest chronostratigraphic stage "
4623
        "attributable to the stratigraphic horizon from which the cataloged item was collected.")},
4624
    {"latestAgeOrHighestStage", N_("Latest Age Or Highest Stage"), "Text", xmpText, xmpExternal,
4625
     N_("The full name of the latest possible geochronologic age or highest chronostratigraphic stage attributable "
4626
        "to the stratigraphic horizon from which the cataloged item was collected.")},
4627
    {"lowestBiostratigraphicZone", N_("Lowest Biostratigraphic Zone"), "Text", xmpText, xmpExternal,
4628
     N_("The full name of the lowest possible geological biostratigraphic zone of the stratigraphic horizon from "
4629
        "which the cataloged item was collected.")},
4630
    {"highestBiostratigraphicZone", N_("Highest Biostratigraphic Zone"), "Text", xmpText, xmpExternal,
4631
     N_("The full name of the highest possible geological biostratigraphic zone of the stratigraphic horizon from "
4632
        "which the cataloged item was collected.")},
4633
    {"lithostratigraphicTerms", N_("Lithostratigraphic Terms"), "Text", xmpText, xmpExternal,
4634
     N_("The combination of all litho-stratigraphic names for the rock from which the cataloged item was "
4635
        "collected.")},
4636
    {"group", N_("Group"), "Text", xmpText, xmpExternal,
4637
     N_("The full name of the lithostratigraphic group from which the cataloged item was collected.")},
4638
    {"formation", N_("Formation"), "Text", xmpText, xmpExternal,
4639
     N_("The full name of the lithostratigraphic formation from which the cataloged item was collected.")},
4640
    {"member", N_("Member"), "Text", xmpText, xmpExternal,
4641
     N_("The full name of the lithostratigraphic member from which the cataloged item was collected.")},
4642
    {"bed", N_("Bed"), "Text", xmpText, xmpExternal,
4643
     N_("The full name of the lithostratigraphic bed from which the cataloged item was collected.")},
4644
4645
    // Identification Level Class
4646
    {
4647
        "Identification",
4648
        N_("Identification"),
4649
        "Identification",
4650
        xmpText,
4651
        xmpInternal,
4652
        N_("*Main structure* containing identification based information."),
4653
    },
4654
    // Identification Level Terms
4655
    {"identificationID", N_("Identification ID"), "Text", xmpText, xmpExternal,
4656
     N_("An identifier for the Identification (the body of information associated with the assignment of a "
4657
        "scientific name). May be a global unique identifier or an identifier specific to the data set.")},
4658
    {"identifiedBy", N_("Identified By"), "bag Text", xmpBag, xmpExternal,
4659
     N_("A list (concatenated and separated) of names of people, groups, or organizations who assigned the Taxon "
4660
        "to the subject.")},
4661
    {"dateIdentified", N_("Date Identified"), "Date", xmpText, xmpExternal,
4662
     N_("The date on which the subject was identified as representing the Taxon. Recommended best practice is to "
4663
        "use an encoding scheme, such as ISO 8601:2004(E).")},
4664
    {"identificationReferences", N_("Identification References"), "bag Text", xmpBag, xmpExternal,
4665
     N_("A list (concatenated and separated) of references (publication, global unique identifier, URI) used in "
4666
        "the Identification.")},
4667
    {"identificationVerificationStatus", N_("Identification Verification Status"), "Text", xmpText, xmpExternal,
4668
     N_("A categorical indicator of the extent to which the taxonomic identification has been verified to be "
4669
        "correct. Recommended best practice is to use a controlled vocabulary such as that used in HISPID/ABCD.")},
4670
    {"identificationRemarks", N_("Identification Remarks"), "Text", xmpText, xmpExternal,
4671
     N_("Comments or notes about the Identification.")},
4672
    {"identificationQualifier", N_("Identification Qualifier"), "Text", xmpText, xmpExternal,
4673
     N_("A brief phrase or a standard term (\"cf.\" \"aff.\") to express the determiner's doubts about the "
4674
        "Identification.")},
4675
    {"typeStatus", N_("Type Status"), "bag Text", xmpBag, xmpExternal,
4676
     N_("A list (concatenated and separated) of nomenclatural types (type status, typified scientific name, "
4677
        "publication) applied to the subject.")},
4678
4679
    // Taxon Level Class
4680
    {
4681
        "Taxon",
4682
        N_("Taxon"),
4683
        "Taxon",
4684
        xmpText,
4685
        xmpInternal,
4686
        N_("*Main structure* containing taxonomic based information."),
4687
    },
4688
    // Taxon Level Terms
4689
    {"taxonID", N_("Taxon ID"), "Text", xmpText, xmpExternal,
4690
     N_("An identifier for the set of taxon information (data associated with the Taxon class). May be a global "
4691
        "unique identifier or an identifier specific to the data set.")},
4692
    {"scientificNameID", N_("Scientific Name ID"), "Text", xmpText, xmpExternal,
4693
     N_("An identifier for the nomenclatural (not taxonomic) details of a scientific name.")},
4694
    {"acceptedNameUsageID", N_("Accepted Name Usage ID"), "Text", xmpText, xmpExternal,
4695
     N_("An identifier for the name usage (documented meaning of the name according to a source) of the currently "
4696
        "valid (zoological) or accepted (botanical) taxon.")},
4697
    {"parentNameUsageID", N_("Parent Name Usage ID"), "Text", xmpText, xmpExternal,
4698
     N_("An identifier for the name usage (documented meaning of the name according to a source) of the direct, "
4699
        "most proximate higher-rank parent taxon (in a classification) of the most specific element of the "
4700
        "scientificName.")},
4701
    {"originalNameUsageID", N_("Original Name Usage ID"), "Text", xmpText, xmpExternal,
4702
     N_("An identifier for the name usage (documented meaning of the name according to a source) in which the "
4703
        "terminal element of the scientificName was originally established under the rules of the associated "
4704
        "nomenclaturalCode.")},
4705
    {"nameAccordingToID", N_("Name According To ID"), "Text", xmpText, xmpExternal,
4706
     N_("An identifier for the source in which the specific taxon concept circumscription is defined or implied. "
4707
        "See nameAccordingTo.")},
4708
    {"namePublishedInID", N_("Name Published In ID"), "Text", xmpText, xmpExternal,
4709
     N_("An identifier for the publication in which the scientificName was originally established under the rules "
4710
        "of the associated nomenclaturalCode.")},
4711
    {"taxonConceptID", N_("Taxon Concept ID"), "Text", xmpText, xmpExternal,
4712
     N_("An identifier for the taxonomic concept to which the record refers - not for the nomenclatural details of "
4713
        "a taxon.")},
4714
    {"scientificName", N_("Scientific Name"), "Text", xmpText, xmpExternal,
4715
     N_("The full scientific name, with authorship and date information if known. When forming part of an "
4716
        "Identification, this should be the name in lowest level taxonomic rank that can be determined. This term "
4717
        "should not contain identification qualifications, which should instead be supplied in the "
4718
        "IdentificationQualifier term.")},
4719
    {"acceptedNameUsage", N_("Accepted Name Usage"), "Text", xmpText, xmpExternal,
4720
     N_("The full name, with authorship and date information if known, of the currently valid (zoological) or "
4721
        "accepted (botanical) taxon.")},
4722
    {"parentNameUsage", N_("Parent Name Usage"), "Text", xmpText, xmpExternal,
4723
     N_("The full name, with authorship and date information if known, of the direct, most proximate higher-rank "
4724
        "parent taxon (in a classification) of the most specific element of the scientificName.")},
4725
    {"originalNameUsage", N_("Original Name Usage"), "Text", xmpText, xmpExternal,
4726
     N_("The taxon name, with authorship and date information if known, as it originally appeared when first "
4727
        "established under the rules of the associated nomenclaturalCode. The basionym (botany) or basonym "
4728
        "(bacteriology) of the scientificName or the senior/earlier homonym for replaced names.")},
4729
    {"nameAccordingTo", N_("Name According To"), "Text", xmpText, xmpExternal,
4730
     N_("The reference to the source in which the specific taxon concept circumscription is defined or implied - "
4731
        "traditionally signified by the Latin \"sensu\" or \"sec.\" (from secundum, meaning \"according to\"). For "
4732
        "taxa that result from identifications, a reference to the keys, monographs, experts and other sources "
4733
        "should be given.")},
4734
    {"namePublishedIn", N_("Name Published In"), "Text", xmpText, xmpExternal,
4735
     N_("A reference for the publication in which the scientificName was originally established under the rules of "
4736
        "the associated nomenclaturalCode.")},
4737
    {"namePublishedInYear", N_("Name Published In Year"), "Text", xmpText, xmpExternal,
4738
     N_("The four-digit year in which the scientificName was published.")},
4739
    {"higherClassification", N_("Higher Classification"), "bag Text", xmpBag, xmpExternal,
4740
     N_("A list (concatenated and separated) of taxa names terminating at the rank immediately superior to the "
4741
        "taxon referenced in the taxon record. Recommended best practice is to order the list starting with the "
4742
        "highest rank and separating the names for each rank with a semi-colon ;")},
4743
    {"kingdom", N_("Kingdom"), "Text", xmpText, xmpExternal,
4744
     N_("The full scientific name of the kingdom in which the taxon is classified.")},
4745
    {"phylum", N_("Phylum"), "Text", xmpText, xmpExternal,
4746
     N_("The full scientific name of the phylum or division in which the taxon is classified.")},
4747
    {"class", N_("Class"), "Text", xmpText, xmpExternal,
4748
     N_("The full scientific name of the class in which the taxon is classified.")},
4749
    {"order", N_("Order"), "Text", xmpText, xmpExternal,
4750
     N_("The full scientific name of the order in which the taxon is classified.")},
4751
    {"family", N_("Family"), "Text", xmpText, xmpExternal,
4752
     N_("The full scientific name of the family in which the taxon is classified.")},
4753
    {"genus", N_("Genus"), "Text", xmpText, xmpExternal,
4754
     N_("The full scientific name of the genus in which the taxon is classified.")},
4755
    {"subgenus", N_("Subgenus"), "Text", xmpText, xmpExternal,
4756
     N_("The full scientific name of the subgenus in which the taxon is classified. Values should include the "
4757
        "genus to avoid homonym confusion.")},
4758
    {"specificEpithet", N_("Specific Epithet"), "Text", xmpText, xmpExternal,
4759
     N_("The name of the first or species epithet of the scientificName.")},
4760
    {"infraspecificEpithet", N_("Infraspecific Epithet"), "Text", xmpText, xmpExternal,
4761
     N_("The name of the lowest or terminal infraspecific epithet of the scientificName, excluding any rank "
4762
        "designation.")},
4763
    {"taxonRank", N_("Taxon Rank"), "Text", xmpText, xmpExternal,
4764
     N_("The taxonomic rank of the most specific name in the scientificName. Recommended best practice is to use a "
4765
        "controlled vocabulary.")},
4766
    {"verbatimTaxonRank", N_("Verbatim Taxon Rank"), "Text", xmpText, xmpExternal,
4767
     N_("The taxonomic rank of the most specific name in the scientificName as it appears in the original "
4768
        "record.")},
4769
    {"scientificNameAuthorship", N_("Scientific Name Authorship"), "Text", xmpText, xmpExternal,
4770
     N_("The authorship information for the scientificName formatted according to the conventions of the "
4771
        "applicable nomenclaturalCode.")},
4772
    {"vernacularName", N_("Vernacular Name"), "Lang Alt", langAlt, xmpExternal, N_("A common or vernacular name.")},
4773
    {"nomenclaturalCode", N_("Nomenclatural Code"), "Text", xmpText, xmpExternal,
4774
     N_("The nomenclatural code (or codes in the case of an ambiregnal name) under which the scientificName is "
4775
        "constructed. Recommended best practice is to use a controlled vocabulary.")},
4776
    {"taxonomicStatus", N_("Taxonomic Status"), "Text", xmpText, xmpExternal,
4777
     N_("The status of the use of the scientificName as a label for a taxon. Requires taxonomic opinion to define "
4778
        "the scope of a taxon. Rules of priority then are used to define the taxonomic status of the nomenclature "
4779
        "contained in that scope, combined with the experts opinion. It must be linked to a specific taxonomic "
4780
        "reference that defines the concept. Recommended best practice is to use a controlled vocabulary.")},
4781
    {"nomenclaturalStatus", N_("Nomenclatural Status"), "Text", xmpText, xmpExternal,
4782
     N_("The status related to the original publication of the name and its conformance to the relevant rules of "
4783
        "nomenclature. It is based essentially on an algorithm according to the business rules of the code. It "
4784
        "requires no taxonomic opinion.")},
4785
    {"taxonRemarks", N_("Taxon Remarks"), "Text", xmpText, xmpExternal,
4786
     N_("Comments or notes about the taxon or name.")},
4787
4788
    // Resource Relationship Level Class
4789
    {
4790
        "ResourceRelationship",
4791
        N_("Resource Relationship"),
4792
        "ResourceRelationship",
4793
        xmpText,
4794
        xmpInternal,
4795
        N_("*Main structure* containing relationships between resources based information."),
4796
    },
4797
    // Resource Relationship Level Terms
4798
    {"resourceRelationshipID", N_("Resource Relationship ID"), "Text", xmpText, xmpExternal,
4799
     N_("An identifier for an instance of relationship between one resource (the subject) and another "
4800
        "(relatedResource, the object).")},
4801
    {"resourceID", N_("Resource ID"), "Text", xmpText, xmpExternal,
4802
     N_("An identifier for the resource that is the subject of the relationship.")},
4803
    {"relatedResourceID", N_("Related Resource ID"), "Text", xmpText, xmpExternal,
4804
     N_("An identifier for a related resource (the object, rather than the subject of the relationship).")},
4805
    {"relationshipOfResource", N_("Relationship Of Resource"), "Text", xmpText, xmpExternal,
4806
     N_("The relationship of the resource identified by relatedResourceID to the subject (optionally identified by "
4807
        "the resourceID). Recommended best practice is to use a controlled vocabulary.")},
4808
    {"relationshipAccordingTo", N_("Relationship According To"), "Text", xmpText, xmpExternal,
4809
     N_("The source (person, organization, publication, reference) establishing the relationship between the two "
4810
        "resources.")},
4811
    {"relationshipEstablishedDate", N_("Relationship Established Date"), "Date", xmpText, xmpExternal,
4812
     N_("The date-time on which the relationship between the two resources was established. Recommended best "
4813
        "practice is to use an encoding scheme, such as ISO 8601:2004(E).")},
4814
    {"relationshipRemarks", N_("Relationship Remarks"), "Text", xmpText, xmpExternal,
4815
     N_("Comments or notes about the relationship between the two resources.")},
4816
4817
    // Measurement Or Fact Level Class
4818
    {
4819
        "MeasurementOrFact",
4820
        N_("Measurement Or Fact"),
4821
        "MeasurementOrFact",
4822
        xmpText,
4823
        xmpInternal,
4824
        N_("*Main structure* containing measurement based information."),
4825
    },
4826
    // Measurement Or Fact Level Terms
4827
    {"measurementID", N_("Measurement ID"), "Text", xmpText, xmpExternal,
4828
     N_("An identifier for the MeasurementOrFact (information pertaining to measurements, facts, characteristics, "
4829
        "or assertions). May be a global unique identifier or an identifier specific to the data set.")},
4830
    {"measurementType", N_("Measurement Type"), "Text", xmpText, xmpExternal,
4831
     N_("The nature of the measurement, fact, characteristic, or assertion. Recommended best practice is to use a "
4832
        "controlled vocabulary.")},
4833
    {"measurementValue", N_("Measurement Value"), "Text", xmpText, xmpExternal,
4834
     N_("The value of the measurement, fact, characteristic, or assertion.")},
4835
    {"measurementAccuracy", N_("Measurement Accuracy"), "Text", xmpText, xmpExternal,
4836
     N_("The description of the potential error associated with the measurementValue.")},
4837
    {"measurementUnit", N_("Measurement Unit"), "Text", xmpText, xmpExternal,
4838
     N_("The units associated with the measurementValue. Recommended best practice is to use the International "
4839
        "System of Units (SI).")},
4840
    {"measurementDeterminedDate", N_("Measurement Determined Date"), "Date", xmpText, xmpExternal,
4841
     N_("The date on which the MeasurementOrFact was made. Recommended best practice is to use an encoding scheme, "
4842
        "such as ISO 8601:2004(E).")},
4843
    {"measurementDeterminedBy", N_("Measurement Determined By"), "bag Text", xmpBag, xmpExternal,
4844
     N_("A list (concatenated and separated) of names of people, groups, or organizations who determined the value "
4845
        "of the MeasurementOrFact.")},
4846
    {"measurementMethod", N_("Measurement Method"), "Text", xmpText, xmpExternal,
4847
     N_("A description of or reference to (publication, URI) the method or protocol used to determine the "
4848
        "measurement, fact, characteristic, or assertion.")},
4849
    {"measurementRemarks", N_("Measurement Remarks"), "Text", xmpText, xmpExternal,
4850
     N_("Comments or notes accompanying the MeasurementOrFact.")},
4851
    // End of list marker
4852
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
4853
};
4854
4855
const XmpPropertyInfo xmpAcdseeInfo[] = {
4856
    {"caption", N_("Caption"), "Text", xmpText, xmpExternal, N_("A brief description of the file")},
4857
    {"datetime", N_("Date Time"), "Text", xmpText, xmpExternal, N_("Date and Time")},
4858
    {"author", N_("Author"), "Text", xmpText, xmpExternal, N_("The name of the author or photographer")},
4859
    {"rating", N_("Rating"), "Text", xmpText, xmpExternal, N_("Numerical rating from 1 to 5")},
4860
    {"notes", N_("Notes"), "Text", xmpText, xmpExternal,
4861
     N_("Any descriptive or additional free-form text up to 4,095 characters")},
4862
    {"tagged", N_("Tagged"), "Text", xmpText, xmpExternal, N_("True or False")},
4863
    {"categories", N_("Categories"), "Text", xmpText, xmpExternal, N_("Catalog of hierarchical keywords and groups")},
4864
4865
    // End of list marker
4866
    {nullptr, nullptr, nullptr, invalidTypeId, xmpInternal, nullptr},
4867
};
4868
4869
constexpr XmpPrintInfo xmpPrintInfo[] = {
4870
    {"Xmp.crs.CropUnits", EXV_PRINT_TAG(crsCropUnits)},
4871
    {"Xmp.exif.ApertureValue", print0x9202},
4872
    {"Xmp.exif.BrightnessValue", printFloat},
4873
    {"Xmp.exif.ColorSpace", print0xa001},
4874
    {"Xmp.exif.ComponentsConfiguration", print0x9101},
4875
    {"Xmp.exif.Contrast", printNormalSoftHard},
4876
    {"Xmp.exif.CreateDate", printXmpDate},
4877
    {"Xmp.exif.CustomRendered", print0xa401},
4878
    {"Xmp.exif.DateTimeOriginal", printXmpDate},
4879
    {"Xmp.exif.ExifVersion", printXmpVersion},
4880
    {"Xmp.exif.ExposureBiasValue", print0x9204},
4881
    {"Xmp.exif.ExposureMode", print0xa402},
4882
    {"Xmp.exif.ExposureProgram", print0x8822},
4883
    {"Xmp.exif.FileSource", print0xa300},
4884
    {"Xmp.exif.FlashpixVersion", printXmpVersion},
4885
    {"Xmp.exif.FNumber", print0x829d},
4886
    {"Xmp.exif.FocalLength", print0x920a},
4887
    {"Xmp.exif.FocalPlaneResolutionUnit", printExifUnit},
4888
    {"Xmp.exif.FocalPlaneXResolution", printFloat},
4889
    {"Xmp.exif.FocalPlaneYResolution", printFloat},
4890
    {"Xmp.exif.GainControl", print0xa407},
4891
    {"Xmp.exif.GPSAltitudeRef", print0x0005},
4892
    {"Xmp.exif.GPSDestBearingRef", printGPSDirRef},
4893
    {"Xmp.exif.GPSDestDistanceRef", print0x0019},
4894
    {"Xmp.exif.GPSDifferential", print0x001e},
4895
    {"Xmp.exif.GPSImgDirectionRef", printGPSDirRef},
4896
    {"Xmp.exif.GPSMeasureMode", print0x000a},
4897
    {"Xmp.exif.GPSSpeedRef", print0x000c},
4898
    {"Xmp.exif.GPSStatus", print0x0009},
4899
    {"Xmp.exif.GPSTimeStamp", printXmpDate},
4900
    {"Xmp.exif.GPSTrackRef", printGPSDirRef},
4901
    {"Xmp.exif.LightSource", print0x9208},
4902
    {"Xmp.exif.MeteringMode", print0x9207},
4903
    {"Xmp.exif.ModifyDate", printXmpDate},
4904
    {"Xmp.exif.Saturation", print0xa409},
4905
    {"Xmp.exif.SceneCaptureType", print0xa406},
4906
    {"Xmp.exif.SceneType", print0xa301},
4907
    {"Xmp.exif.SensingMethod", print0xa217},
4908
    {"Xmp.exif.Sharpness", printNormalSoftHard},
4909
    {"Xmp.exif.ShutterSpeedValue", print0x9201},
4910
    {"Xmp.exif.SubjectDistanceRange", print0xa40c},
4911
    {"Xmp.exif.WhiteBalance", print0xa403},
4912
    {"Xmp.tiff.Orientation", print0x0112},
4913
    {"Xmp.tiff.ResolutionUnit", printExifUnit},
4914
    {"Xmp.tiff.XResolution", printInt64},
4915
    {"Xmp.tiff.YCbCrPositioning", print0x0213},
4916
    {"Xmp.tiff.YResolution", printInt64},
4917
    {"Xmp.iptc.Scene", EXV_PRINT_VOCABULARY_MULTI(iptcScene)},
4918
    {"Xmp.iptc.SubjectCode", EXV_PRINT_VOCABULARY_MULTI(iptcSubjectCode)},
4919
    {"Xmp.iptcExt.DigitalSourcefileType", EXV_PRINT_VOCABULARY(iptcExtDigitalSourcefileType)},
4920
    {"Xmp.iptcExt.DigitalSourceType", EXV_PRINT_VOCABULARY(iptcExtDigitalSourceType)},
4921
    {"Xmp.plus.AdultContentWarning", EXV_PRINT_VOCABULARY(plusAdultContentWarning)},
4922
    {"Xmp.plus.CopyrightStatus", EXV_PRINT_VOCABULARY(plusCopyrightStatus)},
4923
    {"Xmp.plus.CreditLineRequired", EXV_PRINT_VOCABULARY(plusCreditLineRequired)},
4924
    {"Xmp.plus.ImageAlterationConstraints", EXV_PRINT_VOCABULARY(plusImageAlterationConstraints)},
4925
    {"Xmp.plus.ImageDuplicationConstraints", EXV_PRINT_VOCABULARY(plusImageDuplicationConstraints)},
4926
    {"Xmp.plus.ImageFileConstraints", EXV_PRINT_VOCABULARY(plusImageFileConstraints)},
4927
    {"Xmp.plus.ImageFileFormatAsDelivered", EXV_PRINT_VOCABULARY(plusImageFileFormatAsDelivered)},
4928
    {"Xmp.plus.ImageFileSizeAsDelivered", EXV_PRINT_VOCABULARY(plusImageFileSizeAsDelivered)},
4929
    {"Xmp.plus.ImageType", EXV_PRINT_VOCABULARY(plusImageType)},
4930
    {"Xmp.plus.LicensorTelephoneType1", EXV_PRINT_VOCABULARY(plusLicensorTelephoneType)},
4931
    {"Xmp.plus.LicensorTelephoneType2", EXV_PRINT_VOCABULARY(plusLicensorTelephoneType)},
4932
    {"Xmp.plus.MinorModelAgeDisclosure", EXV_PRINT_VOCABULARY(plusMinorModelAgeDisclosure)},
4933
    {"Xmp.plus.ModelReleaseStatus", EXV_PRINT_VOCABULARY(plusModelReleaseStatus)},
4934
    {"Xmp.plus.PropertyReleaseStatus", EXV_PRINT_VOCABULARY(plusPropertyReleaseStatus)},
4935
    {"Xmp.plus.Reuse", EXV_PRINT_VOCABULARY(plusReuse)},
4936
    {"Xmp.plus.DataMining", EXV_PRINT_VOCABULARY(plusDataMining)},
4937
};
4938
4939
270k
bool XmpNsInfo::operator==(const XmpNsInfo::Ns& ns) const {
4940
270k
  return ns_ == ns.ns_;
4941
270k
}
4942
4943
3.10M
bool XmpNsInfo::operator==(const XmpNsInfo::Prefix& prefix) const {
4944
3.10M
  return prefix_ == prefix.prefix_;
4945
3.10M
}
4946
4947
0
bool XmpPropertyInfo::operator==(const std::string& name) const {
4948
0
  return name_ == name;
4949
0
}
4950
4951
XmpProperties::NsRegistry XmpProperties::nsRegistry_;
4952
475k
std::mutex& XmpProperties::getMutex() {
4953
475k
  static std::mutex m;
4954
475k
  return m;
4955
475k
}
4956
4957
/// \todo not used internally. At least we should test it
4958
0
const XmpNsInfo* XmpProperties::lookupNsRegistry(const XmpNsInfo::Prefix& prefix) {
4959
0
  XmpLock lock;
4960
0
  return lookupNsRegistryUnlocked(prefix, lock);
4961
0
}
4962
4963
262k
const XmpNsInfo* XmpProperties::lookupNsRegistryUnlocked(const XmpNsInfo::Prefix& prefix, const XmpLock&) {
4964
505k
  for (const auto& [_, p] : nsRegistry_) {
4965
505k
    if (p == prefix)
4966
1.26k
      return &p;
4967
505k
  }
4968
261k
  return nullptr;
4969
262k
}
4970
4971
0
void XmpProperties::registerNs(const std::string& ns, const std::string& prefix) {
4972
0
  XmpLock lock;
4973
0
  registerNsUnlocked(ns, prefix, lock);
4974
0
}
4975
4976
13
void XmpProperties::registerNsUnlocked(const std::string& ns, const std::string& prefix, const XmpLock& lock) {
4977
13
  if (ns.empty())
4978
0
    return;
4979
13
  std::string ns2 = ns;
4980
13
  if (ns2.back() != '/' && ns2.back() != '#')
4981
1
    ns2 += '/';
4982
4983
  // 1. Check if this URI is already registered with this exact prefix
4984
13
  auto it = nsRegistry_.find(ns2);
4985
13
  if (it != nsRegistry_.end() && std::strcmp(it->second.prefix_, prefix.c_str()) == 0) {
4986
0
    return;  // Already registered with this prefix
4987
0
  }
4988
4989
  // 2. Check if this prefix is already registered with a DIFFERENT URI
4990
13
  if (auto xnp = lookupNsRegistryUnlocked(XmpNsInfo::Prefix{prefix}, lock)) {
4991
0
#ifndef SUPPRESS_WARNINGS
4992
0
    if (ns2 != xnp->ns_)
4993
0
      EXV_WARNING << "Updating namespace URI for " << prefix << " from " << xnp->ns_ << " to " << ns2 << "\n";
4994
0
#endif
4995
0
    unregisterNsUnlocked(xnp->ns_, lock);
4996
0
  }
4997
4998
  // 3. Ensure the URI is unregistered if it's currently used with a different prefix
4999
  // (This handles the case where prefix changed for the same URI, preventing memory leak)
5000
13
  unregisterNsUnlocked(ns2, lock);
5001
  // Allocated memory is freed when the namespace is unregistered.
5002
  // Using malloc/free for better system compatibility in case
5003
  // users don't unregister their namespaces explicitly.
5004
13
  XmpNsInfo xn;
5005
13
  auto c = new char[ns2.size() + 1];
5006
13
  std::strcpy(c, ns2.c_str());
5007
13
  xn.ns_ = c;
5008
13
  c = new char[prefix.size() + 1];
5009
13
  std::strcpy(c, prefix.c_str());
5010
13
  xn.prefix_ = c;
5011
13
  xn.xmpPropertyInfo_ = nullptr;
5012
13
  xn.desc_ = "";
5013
13
  nsRegistry_[ns2] = xn;
5014
13
}
5015
5016
0
void XmpProperties::unregisterNs(const std::string& ns) {
5017
0
  XmpLock lock;
5018
0
  unregisterNsUnlocked(ns, lock);
5019
0
}
5020
5021
13
void XmpProperties::unregisterNsUnlocked(const std::string& ns, const XmpLock&) {
5022
13
  unregisterNsNoLock(ns, LifetimeKey{});
5023
13
}
5024
5025
26
void XmpProperties::unregisterNsNoLock(const std::string& ns, LifetimeKey) {
5026
26
  auto i = nsRegistry_.find(ns);
5027
26
  if (i != nsRegistry_.end()) {
5028
13
    delete[] i->second.prefix_;
5029
13
    delete[] i->second.ns_;
5030
13
    nsRegistry_.erase(i);
5031
13
  }
5032
26
}
5033
5034
0
void XmpProperties::unregisterNs() {
5035
0
  XmpLock lock;
5036
0
  unregisterNsUnlocked(lock);
5037
0
}
5038
5039
0
void XmpProperties::unregisterNsUnlocked(const XmpLock&) {
5040
0
  unregisterAllNsNoLock(LifetimeKey{});
5041
0
}
5042
1
void XmpProperties::unregisterAllNsNoLock(LifetimeKey) {
5043
  /// \todo check if we are not unregistering the first NS
5044
1
  auto i = nsRegistry_.begin();
5045
14
  while (i != nsRegistry_.end()) {
5046
13
    auto kill = i++;
5047
13
    unregisterNsNoLock(kill->first, LifetimeKey{});
5048
13
  }
5049
1
}
5050
5051
0
std::string XmpProperties::prefix(const std::string& ns) {
5052
0
  XmpLock lock;
5053
0
  return prefixUnlocked(ns, lock);
5054
0
}
5055
5056
12.0k
std::string XmpProperties::prefixUnlocked(const std::string& ns, const XmpLock&) {
5057
12.0k
  std::string ns2 = ns;
5058
12.0k
  if (ns2.back() != '/' && ns2.back() != '#')
5059
407
    ns2 += '/';
5060
5061
12.0k
  auto i = nsRegistry_.find(ns2);
5062
12.0k
  std::string p;
5063
12.0k
  if (i != nsRegistry_.end())
5064
901
    p = i->second.prefix_;
5065
11.1k
  else if (auto xn = Exiv2::find(xmpNsInfo, XmpNsInfo::Ns{std::move(ns2)}))
5066
7.11k
    p = std::string(xn->prefix_);
5067
12.0k
  return p;
5068
12.0k
}
5069
5070
0
std::string XmpProperties::ns(const std::string& prefix) {
5071
0
  XmpLock lock;
5072
0
  return nsUnlocked(prefix, lock);
5073
0
}
5074
5075
124k
std::string XmpProperties::nsUnlocked(const std::string& prefix, const XmpLock& lock) {
5076
124k
  if (auto xn = lookupNsRegistryUnlocked(XmpNsInfo::Prefix{prefix}, lock))
5077
1.13k
    return xn->ns_;
5078
122k
  return nsInfoUnlocked(prefix, lock)->ns_;
5079
124k
}
5080
5081
848
bool XmpProperties::prefixIsBoundUnlocked(const std::string& prefix, const XmpLock& lock) {
5082
848
  const auto pf = XmpNsInfo::Prefix{prefix};
5083
848
  return lookupNsRegistryUnlocked(pf, lock) != nullptr || Exiv2::find(xmpNsInfo, pf) != nullptr;
5084
848
}
5085
5086
0
const char* XmpProperties::propertyTitle(const XmpKey& key) {
5087
0
  XmpLock lock;
5088
0
  return propertyTitleUnlocked(key, lock);
5089
0
}
5090
5091
0
const char* XmpProperties::propertyTitleUnlocked(const XmpKey& key, const XmpLock& lock) {
5092
0
  const XmpPropertyInfo* pi = propertyInfoUnlocked(key, lock);
5093
0
  return pi ? pi->title_ : nullptr;
5094
0
}
5095
5096
0
const char* XmpProperties::propertyDesc(const XmpKey& key) {
5097
0
  XmpLock lock;
5098
0
  return propertyDescUnlocked(key, lock);
5099
0
}
5100
5101
0
const char* XmpProperties::propertyDescUnlocked(const XmpKey& key, const XmpLock& lock) {
5102
0
  const XmpPropertyInfo* pi = propertyInfoUnlocked(key, lock);
5103
0
  return pi ? pi->desc_ : nullptr;
5104
0
}
5105
5106
0
TypeId XmpProperties::propertyType(const XmpKey& key) {
5107
0
  XmpLock lock;
5108
0
  return propertyTypeUnlocked(key, lock);
5109
0
}
5110
5111
14.4k
TypeId XmpProperties::propertyTypeUnlocked(const XmpKey& key, const XmpLock& lock) {
5112
14.4k
  const XmpPropertyInfo* pi = propertyInfoUnlocked(key, lock);
5113
14.4k
  return pi ? pi->typeId_ : xmpText;
5114
14.4k
}
5115
5116
0
const XmpPropertyInfo* XmpProperties::propertyInfo(const XmpKey& key) {
5117
0
  XmpLock lock;
5118
0
  return propertyInfoUnlocked(key, lock);
5119
0
}
5120
5121
14.4k
const XmpPropertyInfo* XmpProperties::propertyInfoUnlocked(const XmpKey& key, const XmpLock& lock) {
5122
14.4k
  std::string prefix = key.groupName();
5123
14.4k
  std::string property = key.tagName();
5124
  // If property is a path for a nested property, determines the innermost element
5125
14.4k
  if (auto i = property.find_last_of('/'); i != std::string::npos) {
5126
0
    i = std::distance(property.begin(), std::find_if(property.begin() + i, property.end(), isalpha));
5127
0
    property = property.substr(i);
5128
0
    i = property.find_first_of(':');
5129
0
    if (i != std::string::npos) {
5130
0
      prefix = property.substr(0, i);
5131
0
      property = property.substr(i + 1);
5132
0
    }
5133
#ifdef EXIV2_DEBUG_MESSAGES
5134
    std::cout << "Nested key: " << key.key() << ", prefix: " << prefix << ", property: " << property << "\n";
5135
#endif
5136
0
  }
5137
14.4k
  if (auto pl = propertyListUnlocked(prefix, lock)) {
5138
1.77M
    for (size_t j = 0; pl[j].name_; ++j) {
5139
1.77M
      if (property == pl[j].name_) {
5140
14.0k
        return pl + j;
5141
14.0k
      }
5142
1.77M
    }
5143
14.4k
  }
5144
338
  return nullptr;
5145
14.4k
}
5146
5147
/// \todo not used internally. At least we should test it
5148
0
const char* XmpProperties::nsDesc(const std::string& prefix) {
5149
0
  XmpLock lock;
5150
0
  return nsDescUnlocked(prefix, lock);
5151
0
}
5152
5153
0
const char* XmpProperties::nsDescUnlocked(const std::string& prefix, const XmpLock& lock) {
5154
0
  return nsInfoUnlocked(prefix, lock)->desc_;
5155
0
}
5156
5157
0
const XmpPropertyInfo* XmpProperties::propertyList(const std::string& prefix) {
5158
0
  XmpLock lock;
5159
0
  return propertyListUnlocked(prefix, lock);
5160
0
}
5161
5162
14.4k
const XmpPropertyInfo* XmpProperties::propertyListUnlocked(const std::string& prefix, const XmpLock& lock) {
5163
14.4k
  return nsInfoUnlocked(prefix, lock)->xmpPropertyInfo_;
5164
14.4k
}
5165
5166
0
const XmpNsInfo* XmpProperties::nsInfo(const std::string& prefix) {
5167
0
  XmpLock lock;
5168
0
  return nsInfoUnlocked(prefix, lock);
5169
0
}
5170
5171
137k
const XmpNsInfo* XmpProperties::nsInfoUnlocked(const std::string& prefix, const XmpLock& lock) {
5172
137k
  const auto pf = XmpNsInfo::Prefix{prefix};
5173
137k
  const XmpNsInfo* xn = lookupNsRegistryUnlocked(pf, lock);
5174
137k
  if (!xn)
5175
137k
    xn = Exiv2::find(xmpNsInfo, pf);
5176
137k
  if (!xn)
5177
0
    throw Error(ErrorCode::kerNoNamespaceInfoForXmpPrefix, prefix);
5178
137k
  return xn;
5179
137k
}
5180
5181
0
void XmpProperties::registeredNamespaces(Exiv2::Dictionary& nsDict) {
5182
  // Lock must be held for the duration of registry iteration
5183
0
  XmpLock lock;
5184
0
  registeredNamespacesUnlocked(nsDict, lock);
5185
0
}
5186
5187
0
void XmpProperties::registeredNamespacesUnlocked(Exiv2::Dictionary& nsDict, const XmpLock& lock) {
5188
0
  for (auto&& i : xmpNsInfo) {
5189
0
    Exiv2::XmpParser::registerNsImpl(i.ns_, i.prefix_);
5190
0
  }
5191
0
  Exiv2::XmpParser::registeredNamespacesUnlocked(nsDict, lock);
5192
0
}
5193
5194
0
void XmpProperties::printProperties(std::ostream& os, const std::string& prefix) {
5195
0
  XmpLock lock;
5196
0
  printPropertiesUnlocked(os, prefix, lock);
5197
0
}
5198
5199
0
void XmpProperties::printPropertiesUnlocked(std::ostream& os, const std::string& prefix, const XmpLock& lock) {
5200
0
  if (auto pl = propertyListUnlocked(prefix, lock)) {
5201
0
    for (int i = 0; pl[i].name_; ++i) {
5202
0
      os << pl[i];
5203
0
    }
5204
0
  }
5205
0
}  // XmpProperties::printPropertiesUnlocked
5206
5207
0
std::ostream& XmpProperties::printProperty(std::ostream& os, const std::string& key, const Value& value) {
5208
0
  XmpLock lock;
5209
0
  return printPropertyUnlocked(os, key, value, lock);
5210
0
}
5211
5212
std::ostream& XmpProperties::printPropertyUnlocked(std::ostream& os, const std::string& key, const Value& value,
5213
0
                                                   const XmpLock&) {
5214
0
  PrintFct fct = printValue;
5215
0
  if (value.count() != 0) {
5216
0
    if (auto info = Exiv2::find(xmpPrintInfo, key))
5217
0
      fct = info->printFct_;
5218
0
  }
5219
0
  return fct(os, value, nullptr);
5220
0
}
5221
5222
//! @brief Internal Pimpl structure with private members and data of class XmpKey.
5223
struct XmpKey::Impl {
5224
114k
  Impl() = default;                                                                             //!< Default constructor
5225
  Impl(const std::string& prefix, const std::string& property);                                 //!< Constructor
5226
  Impl(const std::string& prefix, const std::string& property, const XmpProperties::XmpLock&);  // Unlocked constructor
5227
5228
  /*!
5229
    @brief Parse and convert the \em key string into property and prefix.
5230
           Updates data members if the string can be decomposed, or throws
5231
           \em Error.
5232
5233
    @throw Error if the key cannot be decomposed.
5234
  */
5235
  void decomposeKey(const std::string& key);  //!< Mysterious magic
5236
  void decomposeKeyUnlocked(const std::string& key, const XmpProperties::XmpLock&);
5237
5238
  // DATA
5239
  static constexpr auto familyName_ = "Xmp";  //!< "Xmp"
5240
5241
  std::string prefix_;    //!< Prefix
5242
  std::string property_;  //!< Property name
5243
};
5244
5245
//! @brief Constructor for Internal Pimpl structure XmpKey::Impl::Impl
5246
XmpKey::Impl::Impl(const std::string& prefix, const std::string& property) :
5247
0
    Impl(prefix, property, XmpProperties::XmpLock()) {
5248
0
}
5249
5250
9.41k
XmpKey::Impl::Impl(const std::string& prefix, const std::string& property, const XmpProperties::XmpLock& lock) {
5251
  // Validate prefix unlocked (must hold lock)
5252
9.41k
  if (XmpProperties::nsUnlocked(prefix, lock).empty())
5253
0
    throw Error(ErrorCode::kerNoNamespaceForPrefix, prefix);
5254
5255
9.41k
  property_ = property;
5256
9.41k
  prefix_ = prefix;
5257
9.41k
}
5258
5259
97.4k
XmpKey::XmpKey(const std::string& key) : p_(std::make_unique<Impl>()) {
5260
97.4k
  p_->decomposeKey(key);
5261
97.4k
}
5262
5263
17.2k
XmpKey::XmpKey(const std::string& key, const XmpProperties::XmpLock& lock) : p_(std::make_unique<Impl>()) {
5264
17.2k
  p_->decomposeKeyUnlocked(key, lock);
5265
17.2k
}
5266
5267
0
XmpKey::XmpKey(const std::string& prefix, const std::string& property) : p_(std::make_unique<Impl>(prefix, property)) {
5268
0
}
5269
5270
XmpKey::XmpKey(const std::string& prefix, const std::string& property, const XmpProperties::XmpLock& lock) :
5271
9.41k
    p_(std::make_unique<Impl>(prefix, property, lock)) {
5272
9.41k
}
5273
5274
177k
XmpKey::~XmpKey() = default;
5275
5276
53.0k
XmpKey::XmpKey(const XmpKey& rhs) : p_(std::make_unique<Impl>(*rhs.p_)) {
5277
53.0k
}
5278
5279
0
XmpKey& XmpKey::operator=(const XmpKey& rhs) {
5280
0
  if (this == &rhs)
5281
0
    return *this;
5282
0
  *p_ = *rhs.p_;
5283
0
  return *this;
5284
0
}
5285
5286
53.0k
XmpKey::UniquePtr XmpKey::clone() const {
5287
53.0k
  return UniquePtr(clone_());
5288
53.0k
}
5289
5290
53.0k
XmpKey* XmpKey::clone_() const {
5291
53.0k
  return new XmpKey(*this);
5292
53.0k
}
5293
5294
165k
std::string XmpKey::key() const {
5295
165k
  return std::string(Exiv2::XmpKey::Impl::familyName_) + "." + p_->prefix_ + "." + p_->property_;
5296
165k
}
5297
5298
0
const char* XmpKey::familyName() const {
5299
0
  return Exiv2::XmpKey::Impl::familyName_;
5300
0
}
5301
5302
35.0k
std::string XmpKey::groupName() const {
5303
35.0k
  return p_->prefix_;
5304
35.0k
}
5305
5306
24.9k
std::string XmpKey::tagName() const {
5307
24.9k
  return p_->property_;
5308
24.9k
}
5309
5310
0
std::string XmpKey::tagLabel() const {
5311
0
  XmpProperties::XmpLock lock;
5312
0
  const char* pt = XmpProperties::propertyTitleUnlocked(*this, lock);
5313
0
  if (!pt)
5314
0
    return tagName();
5315
0
  return pt;
5316
0
}
5317
5318
0
std::string XmpKey::tagDesc() const {
5319
0
  XmpProperties::XmpLock lock;
5320
0
  const char* pt = XmpProperties::propertyDescUnlocked(*this, lock);
5321
0
  if (!pt)
5322
0
    return "";
5323
0
  return pt;
5324
0
}
5325
5326
0
uint16_t XmpKey::tag() const {
5327
0
  return 0;
5328
0
}
5329
5330
0
std::string XmpKey::ns() const {
5331
0
  XmpProperties::XmpLock lock;
5332
0
  return XmpProperties::nsUnlocked(p_->prefix_, lock);
5333
0
}
5334
5335
//! @cond IGNORE
5336
97.4k
void XmpKey::Impl::decomposeKey(const std::string& key) {
5337
97.4k
  XmpProperties::XmpLock lock;
5338
97.4k
  decomposeKeyUnlocked(key, lock);
5339
97.4k
}  // XmpKey::Impl::decomposeKey
5340
5341
114k
void XmpKey::Impl::decomposeKeyUnlocked(const std::string& key, const XmpProperties::XmpLock& lock) {
5342
  // Get the family name, prefix and property name parts of the key
5343
114k
  if (!key.starts_with(familyName_))
5344
0
    throw Error(ErrorCode::kerInvalidKey, key);
5345
114k
  std::string::size_type pos1 = key.find('.');
5346
114k
  std::string::size_type pos0 = pos1 + 1;
5347
114k
  pos1 = key.find('.', pos0);
5348
114k
  if (pos1 == std::string::npos)
5349
0
    throw Error(ErrorCode::kerInvalidKey, key);
5350
114k
  std::string prefix = key.substr(pos0, pos1 - pos0);
5351
114k
  if (prefix.empty())
5352
0
    throw Error(ErrorCode::kerInvalidKey, key);
5353
114k
  std::string property = key.substr(pos1 + 1);
5354
114k
  if (property.empty())
5355
0
    throw Error(ErrorCode::kerInvalidKey, key);
5356
5357
  // Validate prefix unlocked (must hold lock)
5358
114k
  if (XmpProperties::nsUnlocked(prefix, lock).empty())
5359
0
    throw Error(ErrorCode::kerNoNamespaceForPrefix, prefix);
5360
5361
114k
  property_ = std::move(property);
5362
114k
  prefix_ = std::move(prefix);
5363
114k
}  // XmpKey::Impl::decomposeKeyUnlocked
5364
5365
// *************************************************************************
5366
// free functions
5367
// *************************************************************************
5368
// free functions
5369
0
std::ostream& operator<<(std::ostream& os, const XmpPropertyInfo& propertyInfo) {
5370
  // CSV encoded I am \"dead\" beat" => "I am ""dead"" beat"
5371
0
  std::string escapedDesc;
5372
0
  escapedDesc.push_back('"');
5373
0
  for (char c : std::string_view(propertyInfo.desc_)) {
5374
0
    if (c == '"')
5375
0
      escapedDesc += "\"\"";
5376
0
    else
5377
0
      escapedDesc.push_back(c);
5378
0
  }
5379
0
  escapedDesc.push_back('"');
5380
5381
0
  return os << stringFormat("{},{},{},{},{},{}\n", propertyInfo.name_, propertyInfo.title_, propertyInfo.xmpValueType_,
5382
0
                            TypeInfo::typeName(propertyInfo.typeId_),
5383
0
                            (propertyInfo.xmpCategory_ == xmpExternal ? "External" : "Internal"), escapedDesc);
5384
0
}
5385
//! @endcond
5386
5387
}  // namespace Exiv2