diff --git a/.eslintrc.json b/.eslintrc.json index 10c3289e..1d5f8ebe 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,16 @@ "no-console": ["error", { "allow": ["warn"] }], "linebreak-style": ["error", "unix"], "guard-for-in": "error", - "max-len": "off" + "max-len": "off", + "no-var": "error", + "prefer-const": "error", + "array-callback-return": "error", + "no-constant-binary-expression": "error", + "no-constructor-return": "error", + "no-self-compare": "error", + "no-template-curly-in-string": "error", + "no-unmodified-loop-condition": "error", + "no-unreachable": "error", + "prefer-arrow-callback": ["error", { "allowUnboundThis": false }] } } diff --git a/README.md b/README.md index 1808cd8c..479e7377 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The HED annotation strategy is very general and a standardized vocabulary in the [HED schema](https://github.com/hed-standard/hed-specification) enables annotation of events in an understandable, machine-actionable format. -Additional [library schemas](https://github.com/hed-standard/hed-schema-library) +Additional [library schemas](https://github.com/hed-standard/hed-schema-library) with specialized vocabularies needed for particular subfields are under development. HED validation occurs at several levels. @@ -16,6 +16,7 @@ Syntactic validation checks that HED strings comply with the required syntax, but not whether tags comply with the additional requirements of a HED schema. Semantic validation verifies validity at many levels: + 1. **Tag-level validation** checks that tags are in the schema and have correct units and value type. 2. **String-level validation** performs additional checks for correctness. @@ -78,8 +79,9 @@ const dataset = new hedValidator.validator.BidsDataset(eventData, sidecarData) } } ``` + The `schemaDefinition` object follows a similar format as the BIDS `HEDVersion` object, but with local `path` values pre-parsed to use the fully qualified path name. -The primary objects needed for HED validation can be found in +The primary objects needed for HED validation can be found in [validator/bids/types.js](https://github.com/hed-standard/hed-javascript/blob/master/validator/bids/types.js). diff --git a/common/issues/data.js b/common/issues/data.js index e8326659..8a27d8af 100644 --- a/common/issues/data.js +++ b/common/issues/data.js @@ -1,15 +1,21 @@ const { stringTemplate } = require('../../utils/string') const issueData = { + // Syntax issues parentheses: { hedCode: 'HED_PARENTHESES_MISMATCH', level: 'error', message: stringTemplate`Number of opening and closing parentheses are unequal. ${'opening'} opening parentheses. ${'closing'} closing parentheses.`, }, - invalidTag: { - hedCode: 'HED_TAG_INVALID', + unopenedParentheses: { + hedCode: 'HED_PARENTHESES_MISMATCH', level: 'error', - message: stringTemplate`Invalid tag - "${'tag'}"`, + message: stringTemplate`Closing parenthesis at index ${'index'} of string "${'string'}" does not have a corresponding opening parenthesis.`, + }, + unclosedParentheses: { + hedCode: 'HED_PARENTHESES_MISMATCH', + level: 'error', + message: stringTemplate`Opening parenthesis at index ${'index'} of string "${'string'}" does not have a corresponding closing parenthesis.`, }, extraDelimiter: { hedCode: 'HED_TAG_EMPTY', @@ -26,16 +32,27 @@ const issueData = { level: 'error', message: stringTemplate`Duplicate tag at indices (${0}, ${1}) - "${'tag'}"`, }, + invalidCharacter: { + hedCode: 'HED_CHARACTER_INVALID', + level: 'error', + message: stringTemplate`Invalid character "${'character'}" at index ${'index'} of string "${'string'}"`, + }, + // Common semantic validation issues + invalidTag: { + hedCode: 'HED_TAG_INVALID', + level: 'error', + message: stringTemplate`Invalid tag - "${'tag'}"`, + }, + extraCommaOrInvalid: { + hedCode: 'HED_TAG_INVALID', + level: 'error', + message: stringTemplate`Either "${'previousTag'}" contains a comma when it should not or "${'tag'}" is not a valid tag`, + }, multipleUniqueTags: { hedCode: 'HED_TAG_NOT_UNIQUE', level: 'error', message: stringTemplate`Multiple unique tags with prefix - "${'tag'}"`, }, - tooManyTildes: { - hedCode: 'HED_TILDES_UNSUPPORTED', - level: 'error', - message: stringTemplate`Too many tildes - group "${'tagGroup'}"`, - }, childRequired: { hedCode: 'HED_TAG_REQUIRES_CHILD', level: 'error', @@ -56,75 +73,51 @@ const issueData = { level: 'error', message: stringTemplate`Invalid unit - "${'tag'}" - valid units are "${'unitClassUnits'}"`, }, - extraCommaOrInvalid: { - hedCode: 'HED_TAG_INVALID', - level: 'error', - message: stringTemplate`Either "${'previousTag'}" contains a comma when it should not or "${'tag'}" is not a valid tag`, - }, - invalidCharacter: { - hedCode: 'HED_CHARACTER_INVALID', + invalidValue: { + hedCode: 'HED_VALUE_INVALID', level: 'error', - message: stringTemplate`Invalid character "${'character'}" at index ${'index'} of string "${'string'}"`, - }, - extension: { - hedCode: 'HED_TAG_EXTENDED', - level: 'warning', - message: stringTemplate`Tag extension found - "${'tag'}"`, + message: stringTemplate`Invalid placeholder value for tag "${'tag'}"`, }, invalidPlaceholder: { hedCode: 'HED_PLACEHOLDER_INVALID', level: 'error', message: stringTemplate`Invalid placeholder - "${'tag'}"`, }, - invalidPlaceholderInDefinition: { - hedCode: 'HED_PLACEHOLDER_INVALID', - level: 'error', - message: stringTemplate`Invalid placeholder in definition - "${'definition'}"`, - }, missingPlaceholder: { hedCode: 'HED_PLACEHOLDER_INVALID', level: 'error', message: stringTemplate`HED value string "${'string'}" is missing a required placeholder.`, }, - invalidValue: { - hedCode: 'HED_VALUE_INVALID', - level: 'error', - message: stringTemplate`Invalid placeholder value for tag "${'tag'}"`, - }, - invalidParentNode: { - hedCode: 'HED_VALUE_IS_NODE', - level: 'error', - message: stringTemplate`"${'tag'}" appears as "${'parentTag'}" and cannot be used as an extension. Indices (${0}, ${1}).`, - }, - emptyTagFound: { - hedCode: 'HED_NODE_NAME_EMPTY', - level: 'error', - message: stringTemplate`Empty tag cannot be converted.`, + extension: { + hedCode: 'HED_TAG_EXTENDED', + level: 'warning', + message: stringTemplate`Tag extension found - "${'tag'}"`, }, - duplicateTagsInSchema: { - hedCode: 'HED_GENERIC_ERROR', + // HED 3-specific validation issues + invalidPlaceholderInDefinition: { + hedCode: 'HED_PLACEHOLDER_INVALID', level: 'error', - message: stringTemplate`Source HED schema is invalid as it contains duplicate tags.`, + message: stringTemplate`Invalid placeholder in definition - "${'definition'}"`, }, - illegalDefinitionGroupTag: { + nestedDefinition: { hedCode: 'HED_DEFINITION_INVALID', level: 'error', - message: stringTemplate`Illegal tag "${'tag'}" in tag group for definition "${'definition'}"`, + message: stringTemplate`Illegal nested definition in tag group for definition "${'definition'}"`, }, - nestedDefinition: { + duplicateDefinition: { hedCode: 'HED_DEFINITION_INVALID', level: 'error', - message: stringTemplate`Illegal nested definition in tag group for definition "${'definition'}"`, + message: stringTemplate`Definition "${'definition'}" is declared multiple times. This instance's tag group is "${'tagGroup'}"`, }, multipleTagGroupsInDefinition: { hedCode: 'HED_DEFINITION_INVALID', level: 'error', message: stringTemplate`Multiple inner tag groups found in definition "${'definition'}"`, }, - duplicateDefinition: { + illegalDefinitionGroupTag: { hedCode: 'HED_DEFINITION_INVALID', level: 'error', - message: stringTemplate`Definition "${'definition'}" is declared multiple times. This instance's tag group is "${'tagGroup'}"`, + message: stringTemplate`Illegal tag "${'tag'}" in tag group for definition "${'definition'}"`, }, invalidTopLevelTagGroupTag: { hedCode: 'HED_TAG_GROUP_ERROR', @@ -141,20 +134,78 @@ const issueData = { level: 'error', message: stringTemplate`Tag "${'tag'}" is only allowed inside of a tag group.`, }, - requestedSchemaLoadFailed: { + // Tag conversion issues + invalidParentNode: { + hedCode: 'HED_VALUE_IS_NODE', + level: 'error', + message: stringTemplate`"${'tag'}" appears as "${'parentTag'}" and cannot be used as an extension. Indices (${0}, ${1}).`, + }, + emptyTagFound: { + hedCode: 'HED_NODE_NAME_EMPTY', + level: 'error', + message: stringTemplate`Empty tag cannot be converted.`, + }, + duplicateTagsInSchema: { + hedCode: 'HED_GENERIC_ERROR', + level: 'error', + message: stringTemplate`Source HED schema is invalid as it contains duplicate tags.`, + }, + // Schema issues + invalidSchemaNickname: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`The prefix nickname "${'nickname'}" in specification "${'spec'}" is duplicated or invalid.`, + }, + invalidSchemaSpecification: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`The supplied schema specification is invalid. Specification: ${'spec'}`, + }, + requestedSchemaLoadFailedFallbackUsed: { hedCode: 'HED_SCHEMA_LOAD_FAILED', level: 'warning', - message: stringTemplate`The requested schema "${'schemaDefinition'}" failed to load. The error given was "${'error'}". The fallback schema bundled with this validator will be used instead.`, + message: stringTemplate`The requested schema failed to load. The fallback schema bundled with this validator will be used instead. Specification: ${'spec'}`, + }, + requestedSchemaLoadFailedNoFallbackUsed: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`The requested schema failed to load. The validator did not attempt to load a fallback schema. Specification: ${'spec'}`, }, fallbackSchemaLoadFailed: { hedCode: 'HED_SCHEMA_LOAD_FAILED', level: 'error', - message: stringTemplate`The fallback schema bundled with this validator failed to load. The error given was "${'error'}". No HED validation was performed.`, + message: stringTemplate`The fallback schema bundled with this validator failed to load. No HED validation was performed.`, + }, + bundledSchemaLoadFailed: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`Could not load HED schema for spec "${'spec'}" from bundled copy - "${'error'}".`, + }, + localSchemaLoadFailed: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`Could not load HED schema from path "${'path'}" - "${'error'}".`, + }, + remoteSchemaLoadFailed: { + hedCode: 'HED_SCHEMA_LOAD_FAILED', + level: 'error', + message: stringTemplate`Could not load HED schema "${'spec'}" from remote repository - "${'error'}".`, + }, + unmatchedBaseSchema: { + hedCode: 'HED_LIBRARY_UNMATCHED', + level: 'error', + message: stringTemplate`Tag "${'tag'}" is declared to use a base schema in the dataset's schema listing, but no such schema was defined.`, + }, + unmatchedLibrarySchema: { + hedCode: 'HED_LIBRARY_UNMATCHED', + level: 'error', + message: stringTemplate`Tag "${'tag'}" is declared to use a library schema nicknamed "${'library'}" in the dataset's schema listing, but no such schema was found.`, }, + // Generic errors genericError: { hedCode: 'HED_GENERIC_ERROR', level: 'error', - message: stringTemplate`Unknown HED error "${'internalCode'}".`, + message: stringTemplate`Unknown HED error "${'internalCode'}" - parameters: "${'parameters'}".`, }, } diff --git a/common/issues/issues.js b/common/issues/issues.js index 2beb9be2..9abbf706 100644 --- a/common/issues/issues.js +++ b/common/issues/issues.js @@ -21,6 +21,7 @@ class Issue { * Also the internal error code. * * TODO: This is kept for backward compatibility until the next major version bump. + * @deprecated * @type {string} */ this.code = internalCode @@ -46,20 +47,23 @@ class Issue { * Generate a new issue object. * * @param {string} internalCode The internal error code. - * @param {object} parameters The error string parameters. + * @param {Object} parameters The error string parameters. * @return {Issue} An object representing the issue. */ const generateIssue = function (internalCode, parameters) { const issueCodeData = issueData[internalCode] || issueData.genericError const { hedCode, level, message } = issueCodeData const bounds = parameters.bounds || [] - parameters.internalCode = internalCode + if (issueCodeData === issueData.genericError) { + parameters.internalCode = internalCode + parameters.parameters = 'Issue parameters: ' + JSON.stringify(parameters) + } const parsedMessage = message(...bounds, parameters) return new Issue(internalCode, hedCode, level, parsedMessage) } module.exports = { - generateIssue: generateIssue, - Issue: Issue, + generateIssue, + Issue, } diff --git a/common/schema/config.js b/common/schema/config.js index 82da8ca3..cfb3b4b4 100644 --- a/common/schema/config.js +++ b/common/schema/config.js @@ -1,4 +1,15 @@ +/** Path to the fallback HED schema. */ + +const localSchemaList = new Map([ + ['HED8.0.0', require('../../data/HED8.0.0.xml')], + ['HED8.1.0', require('../../data/HED8.1.0.xml')], + ['HED_testlib_1.0.2', require('../../data/HED_testlib_1.0.2.xml')], +]) + +// TODO: Delete in 4.0.0. +const fallbackFilePath = 'data/HED8.0.0.xml' + module.exports = { - /** Path to the fallback HED schema. */ - fallbackFilePath: 'data/HED8.0.0.xml', + fallbackFilePath, + localSchemaList, } diff --git a/common/schema/index.js b/common/schema/index.js index fe5fe3a3..4d192f54 100644 --- a/common/schema/index.js +++ b/common/schema/index.js @@ -3,8 +3,8 @@ const loadSchema = require('./loader') const { Schema, Schemas } = require('./types') module.exports = { - loadSchema: loadSchema, - Schema: Schema, - Schemas: Schemas, - config: config, + loadSchema, + Schema, + Schemas, + config, } diff --git a/common/schema/loader.js b/common/schema/loader.js index 91396452..01feeac9 100644 --- a/common/schema/loader.js +++ b/common/schema/loader.js @@ -1,74 +1,98 @@ /** HED schema loading functions. */ /* Imports */ - -const isEmpty = require('lodash/isEmpty') +const path = require('path') const xml2js = require('xml2js') const files = require('../../utils/files') -const { stringTemplate } = require('../../utils/string') +const { generateIssue } = require('../issues/issues') -const { fallbackFilePath } = require('./config') +const { fallbackFilePath, localSchemaList } = require('./config') /** * Load schema XML data from a schema version or path description. * - * @param {{path: string?, library: string?, version: string?}} schemaDef The description of which schema to use. + * @param {SchemaSpec} schemaDef The description of which schema to use. * @param {boolean} useFallback Whether to use a bundled fallback schema if the requested schema cannot be loaded. - * @return {Promise|Promise} The schema XML data or an error. + * @param {boolean} reportNoFallbackError Whether to report an error on a failed schema load when no fallback was used. + * @return {Promise|Promise<[object, Issue[]]>} The schema XML data or an error. */ -const loadSchema = function (schemaDef = {}, useFallback = true) { - if (isEmpty(schemaDef)) { - schemaDef.version = 'Latest' +const loadSchema = function (schemaDef = null, useFallback = true, reportNoFallbackError = true) { + const schemaPromise = loadPromise(schemaDef) + if (schemaPromise === null) { + return Promise.reject([generateIssue('invalidSchemaSpecification', { spec: JSON.stringify(schemaDef) })]) } - let schemaPromise - if (schemaDef.path) { - schemaPromise = loadLocalSchema(schemaDef.path) - } /* else if (schemaDef.library) { - return loadRemoteLibrarySchema(schemaDef.library, schemaDef.version) - } */ else if (schemaDef.version) { - schemaPromise = loadRemoteBaseSchema(schemaDef.version) - } else { - return Promise.reject(new Error('Invalid schema definition format.')) + return schemaPromise + .then((xmlData) => [xmlData, []]) + .catch((issues) => { + if (useFallback) { + issues.push(generateIssue('requestedSchemaLoadFailedFallbackUsed', { spec: JSON.stringify(schemaDef) })) + return loadLocalSchema(fallbackFilePath) + .then((xmlData) => [xmlData, issues]) + .catch((fallbackIssues) => { + fallbackIssues.push(generateIssue('fallbackSchemaLoadFailed', {})) + return Promise.reject(issues.concat(fallbackIssues)) + }) + } else { + if (reportNoFallbackError) { + issues.push(generateIssue('requestedSchemaLoadFailedNoFallbackUsed', { spec: JSON.stringify(schemaDef) })) + } + return Promise.reject(issues) + } + }) +} + +/** + * Load schema XML data from a schema version or path description. + * + * @todo Rename to {@link loadSchema} in 4.0.0. + * + * @param {SchemaSpec} schemaDef The description of which schema to use. + * @return {Promise|Promise<[object, Issue[]]>} The schema XML data or an error. + */ +const loadSchemaFromSpec = function (schemaDef = null) { + const schemaPromise = loadPromise(schemaDef) + if (schemaPromise === null) { + return Promise.reject([generateIssue('invalidSchemaSpecification', { spec: JSON.stringify(schemaDef) })]) } - return schemaPromise.catch((error) => { - if (useFallback) { - return loadLocalSchema(fallbackFilePath) - } else { - throw error - } - }) + return schemaPromise.then((xmlData) => [xmlData, []]) } /** - * Load base schema XML data from the HED specification GitHub repository. + * Choose the schema Promise from a schema version or path description. * - * @param {string} version The base schema version to load. - * @return {Promise} The schema XML data. + * @param {SchemaSpec} schemaDef The description of which schema to use. + * @return {Promise} The schema XML data or an error. */ -const loadRemoteBaseSchema = function (version = 'Latest') { - const url = `https://raw.githubusercontent.com/hed-standard/hed-specification/master/hedxml/HED${version}.xml` - return loadSchemaFile( - files.readHTTPSFile(url), - stringTemplate`Could not load HED base schema, version "${1}", from remote repository - "${0}".`, - ...arguments, - ) +const loadPromise = function (schemaDef) { + if (schemaDef === null) { + return null + } else if (schemaDef.path) { + // TODO: Replace with localPath in 4.0.0. + return loadLocalSchema(schemaDef.path) + } else { + if (localSchemaList.has(schemaDef.localName)) { + return loadBundledSchema(schemaDef) + } else { + return loadRemoteSchema(schemaDef) + } + } } /** - * Load library schema XML data from the HED specification GitHub repository. + * Load schema XML data from the HED GitHub repository. * - * @param {string} library The library schema to load. - * @param {string} version The schema version to load. - * @return {Promise} The library schema XML data. + * @param {SchemaSpec} schemaDef The standard schema version to load. + * @return {Promise} The schema XML data. */ -const loadRemoteLibrarySchema = function (library, version = 'Latest') { - const url = `https://raw.githubusercontent.com/hed-standard/hed-schema-library/master/hedxml/HED_${library}_${version}.xml` - return loadSchemaFile( - files.readHTTPSFile(url), - stringTemplate`Could not load HED library schema ${1}, version "${2}", from remote repository - "${0}".`, - ...arguments, - ) +const loadRemoteSchema = function (schemaDef) { + let url + if (schemaDef.library) { + url = `https://raw.githubusercontent.com/hed-standard/hed-schema-library/main/library_schemas/${schemaDef.library}/hedxml/HED_${schemaDef.library}_${schemaDef.version}.xml` + } else { + url = `https://raw.githubusercontent.com/hed-standard/hed-specification/master/hedxml/HED${schemaDef.version}.xml` + } + return loadSchemaFile(files.readHTTPSFile(url), 'remoteSchemaLoadFailed', { spec: JSON.stringify(schemaDef) }) } /** @@ -78,24 +102,34 @@ const loadRemoteLibrarySchema = function (library, version = 'Latest') { * @return {Promise} The schema XML data. */ const loadLocalSchema = function (path) { - return loadSchemaFile( - files.readFile(path), - stringTemplate`Could not load HED schema from path "${1}" - "${0}".`, - ...arguments, - ) + return loadSchemaFile(files.readFile(path), 'localSchemaLoadFailed', { path: path }) +} + +/** + * Load schema XML data from a bundled file. + * + * @param {SchemaSpec} schemaDef The description of which schema to use. + * @return {Promise} The schema XML data. + */ +const loadBundledSchema = function (schemaDef) { + return parseSchemaXML(localSchemaList.get(schemaDef.localName)).catch((error) => { + const issueArgs = { spec: schemaDef, error: error.message } + return Promise.reject([generateIssue('bundledSchemaLoadFailed', issueArgs)]) + }) } /** * Actually load the schema XML file. * * @param {Promise} xmlDataPromise The Promise containing the unparsed XML data. - * @param {function(...[*]): string} errorMessage A tagged template literal containing the error message. - * @param {Array} errorArgs The error arguments passed from the calling function. + * @param {string} issueCode The issue code. + * @param {Object} issueArgs The issue arguments passed from the calling function. * @return {Promise} The parsed schema XML data. */ -const loadSchemaFile = function (xmlDataPromise, errorMessage, ...errorArgs) { +const loadSchemaFile = function (xmlDataPromise, issueCode, issueArgs) { return xmlDataPromise.then(parseSchemaXML).catch((error) => { - throw new Error(errorMessage(error, ...errorArgs)) + issueArgs.error = error.message + return Promise.reject([generateIssue(issueCode, issueArgs)]) }) } @@ -109,4 +143,7 @@ const parseSchemaXML = function (data) { return xml2js.parseStringPromise(data, { explicitCharkey: true }) } -module.exports = loadSchema +module.exports = { + loadSchemaFromSpec, + loadSchema, +} diff --git a/common/schema/types.js b/common/schema/types.js index 93a3d340..04231d62 100644 --- a/common/schema/types.js +++ b/common/schema/types.js @@ -1,6 +1,6 @@ /** HED schema classes */ -const { getGenerationForSchemaVersion } = require('../../utils/hed') +const { getGenerationForSchemaVersion } = require('../../utils/hedData') /** * An imported HED schema object. @@ -26,9 +26,10 @@ class Schema { this.version = rootElement.$.version /** * The HED library schema name. - * @type {string|undefined} + * @type {string} */ - this.library = rootElement.$.library + this.library = rootElement.$.library || '' + /** * The description of tag attributes. * @type {SchemaAttributes} @@ -43,7 +44,7 @@ class Schema { * The HED generation of this schema. * @type {Number} */ - if (this.library !== undefined) { + if (this.library) { this.generation = 3 } else { this.generation = getGenerationForSchemaVersion(this.version) @@ -119,19 +120,64 @@ class Hed3Schema extends Schema { class Schemas { /** * Constructor. - * @param {Schema} baseSchema The base HED schema. + * @param {Schema|Map|null} schemas The imported HED schemas. */ - constructor(baseSchema) { - /** - * The base HED schema. - * @type {Schema} - */ - this.baseSchema = baseSchema - /** - * The imported library HED schemas. - * @type {Map} - */ - this.librarySchemas = new Map() + constructor(schemas) { + if (schemas === null || schemas instanceof Map) { + /** + * The imported HED schemas. + * + * The empty string key ("") corresponds to the schema with no nickname, + * while other keys correspond to the respective nicknames. + * + * This field is null for syntax-only validation. + * + * @type {Map|null} + */ + this.schemas = schemas + } else if (schemas instanceof Schema) { + this.schemas = new Map([['', schemas]]) + } else { + throw new Error('Invalid type passed to Schemas constructor') + } + } + + /** + * Return the schema with the given nickname. + * + * @param {string} schemaName A nickname in the schema set. + * @returns {Schema|null} The schema object corresponding to that nickname, or null if no schemas are defined. + */ + getSchema(schemaName) { + if (this.schemas === null || !this.schemas.has(schemaName)) { + return null + } else { + return this.schemas.get(schemaName) + } + } + + /** + * The base schema, i.e. the schema with no nickname, if one is defined. + * + * @returns {Schema|null} + */ + get baseSchema() { + return this.getSchema('') + } + + /** + * The library schemas, i.e. the schema with nicknames, if any are defined. + * + * @returns {Map|null} + */ + get librarySchemas() { + if (this.schemas !== null) { + const schemasCopy = new Map(this.schemas) + schemasCopy.delete('') + return schemasCopy + } else { + return null + } } /** @@ -141,13 +187,25 @@ class Schemas { * @type {Number} */ get generation() { - if (this.baseSchema === null) { + if (this.schemas === null || this.schemas.size === 0) { return 0 - } else { + } else if (this.librarySchemas.size > 0) { + return 3 + } else if (this.baseSchema) { return this.baseSchema.generation + } else { + return 0 } } + /** + * Whether this schema collection is for syntactic validation only. + * @return {boolean} + */ + get isSyntaxOnly() { + return this.generation === 0 + } + /** * Whether this schema collection comprises HED 2 schemas. * @return {boolean} @@ -165,9 +223,85 @@ class Schemas { } } +/** + * A schema version specification. + */ +class SchemaSpec { + /** + * Constructor. + * + * @param {string} nickname The nickname of this schema. + * @param {string} version The version of this schema. + * @param {string?} library The library name of this schema. + * @param {string?} localPath The local path for this schema. + */ + constructor(nickname, version, library = '', localPath = '') { + this.nickname = nickname + this.version = version + this.library = library + this.localPath = localPath + } + + /** + * Compute the name for the bundled copy of this schema. + * + * @returns {string} + */ + get localName() { + if (!this.library) { + return 'HED' + this.version + } else { + return 'HED_' + this.library + '_' + this.version + } + } + + /** + * Alias to old name of localPath. + * + * @todo Replace with localPath in 4.0.0. + * + * @returns {string} The local path for this schema. + */ + get path() { + return this.localPath + } +} + +/** + * A specification mapping schema nicknames to SchemaSpec objects. + */ +class SchemasSpec { + constructor() { + this.data = new Map() + } + + /** + * Add a schema to this specification. + * + * @param {SchemaSpec} schemaSpec A schema specification. + * @returns {SchemasSpec| map} This object. + */ + addSchemaSpec(schemaSpec) { + this.data.set(schemaSpec.nickname, schemaSpec) + return this + } + + /** + * Determine whether this specification already has a schema with the given nickname. + * + * @param {SchemaSpec} schemaSpec A schema specification with a nickname. + * @returns {boolean} Whether the nickname exists in this specification. + */ + isDuplicate(schemaSpec) { + return this.data.has(schemaSpec.nickname) + } +} + module.exports = { - Schema: Schema, - Hed2Schema: Hed2Schema, - Hed3Schema: Hed3Schema, - Schemas: Schemas, + Schema, + Hed2Schema, + Hed3Schema, + Schemas, + SchemaSpec, + SchemasSpec, } diff --git a/converter/__tests__/converter.spec.js b/converter/__tests__/converter.spec.js index 1d062dbc..bda86a2a 100644 --- a/converter/__tests__/converter.spec.js +++ b/converter/__tests__/converter.spec.js @@ -1,14 +1,17 @@ const assert = require('chai').assert const converter = require('../converter') -const schema = require('../schema') const generateIssue = require('../issues') +const { SchemaSpec, SchemasSpec } = require('../../common/schema/types') +const { buildSchemas } = require('../../validator/schema/init') describe('HED string conversion', () => { const hedSchemaFile = 'tests/data/HED8.0.0.xml' - let schemaPromise + let hedSchemaPromise beforeAll(() => { - schemaPromise = schema.buildSchema({ path: hedSchemaFile }) + const spec1 = new SchemaSpec('', '8.0.0', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec1) + hedSchemaPromise = buildSchemas(specs) }) describe('HED tags', () => { @@ -18,15 +21,16 @@ describe('HED string conversion', () => { * @param {Object} testStrings The test strings. * @param {Object} expectedResults The expected results. * @param {Object} expectedIssues The expected issues. - * @param {function (Schemas, string, string, number): [string, Issue[]]} testFunction The test function. - * @return {Promise | PromiseLike | Promise} + * @param {function (Schema, string, string, number): [string, Issue[]]} testFunction The test function. + * @return {Promise} */ const validatorBase = function (testStrings, expectedResults, expectedIssues, testFunction) { - return schemaPromise.then((schemas) => { - for (const testStringKey of Object.keys(testStrings)) { - const [testResult, issues] = testFunction(schemas, testStrings[testStringKey], testStrings[testStringKey], 0) - assert.strictEqual(testResult, expectedResults[testStringKey], testStrings[testStringKey]) - assert.sameDeepMembers(issues, expectedIssues[testStringKey], testStrings[testStringKey]) + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + for (const [testStringKey, testString] of Object.entries(testStrings)) { + const [testResult, issues] = testFunction(hedSchemas.baseSchema, testString, testString, 0) + assert.strictEqual(testResult, expectedResults[testStringKey], testString) + assert.sameDeepMembers(issues, expectedIssues[testStringKey], testString) } }) } @@ -583,14 +587,15 @@ describe('HED string conversion', () => { * @param {Object} expectedResults The expected results. * @param {Object} expectedIssues The expected issues. * @param {function (Schemas, string): [string, Issue[]]} testFunction The test function. - * @return {Promise | PromiseLike | Promise} + * @return {Promise} */ const validatorBase = function (testStrings, expectedResults, expectedIssues, testFunction) { - return schemaPromise.then((schemas) => { - for (const testStringKey of Object.keys(testStrings)) { - const [testResult, issues] = testFunction(schemas, testStrings[testStringKey]) - assert.strictEqual(testResult, expectedResults[testStringKey], testStrings[testStringKey]) - assert.sameDeepMembers(issues, expectedIssues[testStringKey], testStrings[testStringKey]) + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + for (const [testStringKey, testString] of Object.entries(testStrings)) { + const [testResult, issues] = testFunction(hedSchemas, testString) + assert.strictEqual(testResult, expectedResults[testStringKey], testString) + assert.sameDeepMembers(issues, expectedIssues[testStringKey], testString) } }) } diff --git a/converter/__tests__/splitHedString.spec.js b/converter/__tests__/splitHedString.spec.js index 962f8b41..d1b75b77 100644 --- a/converter/__tests__/splitHedString.spec.js +++ b/converter/__tests__/splitHedString.spec.js @@ -9,8 +9,7 @@ describe('HED string delimiter splitting', () => { * @param {Object} expectedResults The expected results. */ const validator = function (testStrings, expectedResults) { - for (const testStringKey of Object.keys(testStrings)) { - const testString = testStrings[testStringKey] + for (const [testStringKey, testString] of Object.entries(testStrings)) { const testResult = splitHedString(testString) const testResultParts = testResult.map(([, [startPosition, endPosition]]) => { return testString.slice(startPosition, endPosition) diff --git a/converter/converter.js b/converter/converter.js index b8cdd76b..8d5b5a69 100644 --- a/converter/converter.js +++ b/converter/converter.js @@ -24,14 +24,14 @@ const removeSlashesAndSpaces = function (hedString) { * on for HED 3 schemas) allow for similar HED 2 validation with minimal code * duplication. * - * @param {Schemas} schemas The schema container object containing short-to-long mappings. + * @param {Schema} schema The schema object containing a short-to-long mapping. * @param {string} hedTag The HED tag to convert. * @param {string} hedString The full HED string (for error messages). * @param {number} offset The offset of this tag within the HED string. * @return {[string, Issue[]]} The long-form tag and any issues. */ -const convertTagToLong = function (schemas, hedTag, hedString, offset) { - const mapping = schemas.baseSchema.mapping +const convertTagToLong = function (schema, hedTag, hedString, offset) { + const mapping = schema.mapping if (hedTag.startsWith('/')) { hedTag = hedTag.slice(1) @@ -125,14 +125,14 @@ const convertTagToLong = function (schemas, hedTag, hedString, offset) { /** * Convert a HED tag to short form. * - * @param {Schemas} schemas The schema container object containing short-to-long mappings. + * @param {Schema} schema The schema object containing a short-to-long mapping. * @param {string} hedTag The HED tag to convert. * @param {string} hedString The full HED string (for error messages). * @param {number} offset The offset of this tag within the HED string. * @return {[string, Issue[]]} The short-form tag and any issues. */ -const convertTagToShort = function (schemas, hedTag, hedString, offset) { - const mapping = schemas.baseSchema.mapping +const convertTagToShort = function (schema, hedTag, hedString, offset) { + const mapping = schema.mapping if (hedTag.startsWith('/')) { hedTag = hedTag.slice(1) @@ -196,13 +196,13 @@ const convertTagToShort = function (schemas, hedTag, hedString, offset) { * * This is for the internal string parsing for the validation side. * - * @param {Schemas} schemas The schema container object containing short-to-long mappings. + * @param {Schema} schema The schema object containing a short-to-long mapping. * @param {string} partialHedString The partial HED string to convert to long form. * @param {string} fullHedString The full HED string. * @param {number} offset The offset of the partial HED string within the full string. * @return {[string, Issue[]]} The converted string and any issues. */ -const convertPartialHedStringToLong = function (schemas, partialHedString, fullHedString, offset) { +const convertPartialHedStringToLong = function (schema, partialHedString, fullHedString, offset) { let issues = [] const hedString = removeSlashesAndSpaces(partialHedString) @@ -218,7 +218,7 @@ const convertPartialHedStringToLong = function (schemas, partialHedString, fullH for (const [isHedTag, [startPosition, endPosition]] of hedTags) { const tag = hedString.slice(startPosition, endPosition) if (isHedTag) { - const [shortTagString, singleError] = convertTagToLong(schemas, tag, fullHedString, startPosition + offset) + const [shortTagString, singleError] = convertTagToLong(schema, tag, fullHedString, startPosition + offset) issues = issues.concat(singleError) finalString += shortTagString } else { @@ -232,15 +232,15 @@ const convertPartialHedStringToLong = function (schemas, partialHedString, fullH /** * Convert a HED string. * - * @param {Schemas} schemas The schema container object containing short-to-long mappings. + * @param {Schema} schema The schema object containing a short-to-long mapping. * @param {string} hedString The HED tag to convert. - * @param {function (Schemas, string, string, number): [string, Issue[]]} conversionFn The conversion function for a tag. + * @param {function (Schema, string, string, number): [string, Issue[]]} conversionFn The conversion function for a tag. * @return {[string, Issue[]]} The converted string and any issues. */ -const convertHedString = function (schemas, hedString, conversionFn) { +const convertHedString = function (schema, hedString, conversionFn) { let issues = [] - if (!schemas.baseSchema.mapping.hasNoDuplicates) { + if (!schema.mapping.hasNoDuplicates) { issues.push(generateIssue('duplicateTagsInSchema', '')) return [hedString, issues] } @@ -258,7 +258,7 @@ const convertHedString = function (schemas, hedString, conversionFn) { for (const [isHedTag, [startPosition, endPosition]] of hedTags) { const tag = hedString.slice(startPosition, endPosition) if (isHedTag) { - const [shortTagString, singleError] = conversionFn(schemas, tag, hedString, startPosition) + const [shortTagString, singleError] = conversionFn(schema, tag, hedString, startPosition) issues = issues.concat(singleError) finalString += shortTagString } else { @@ -275,9 +275,10 @@ const convertHedString = function (schemas, hedString, conversionFn) { * @param {Schemas} schemas The schema container object containing short-to-long mappings. * @param {string} hedString The HED tag to convert. * @return {[string, Issue[]]} The long-form string and any issues. + * @deprecated */ const convertHedStringToLong = function (schemas, hedString) { - return convertHedString(schemas, hedString, convertTagToLong) + return convertHedString(schemas.baseSchema, hedString, convertTagToLong) } /** @@ -286,16 +287,17 @@ const convertHedStringToLong = function (schemas, hedString) { * @param {Schemas} schemas The schema container object containing short-to-long mappings. * @param {string} hedString The HED tag to convert. * @return {[string, Issue[]]} The short-form string and any issues. + * @deprecated */ const convertHedStringToShort = function (schemas, hedString) { - return convertHedString(schemas, hedString, convertTagToShort) + return convertHedString(schemas.baseSchema, hedString, convertTagToShort) } module.exports = { - convertHedStringToShort: convertHedStringToShort, - convertHedStringToLong: convertHedStringToLong, - convertPartialHedStringToLong: convertPartialHedStringToLong, - convertTagToShort: convertTagToShort, - convertTagToLong: convertTagToLong, - removeSlashesAndSpaces: removeSlashesAndSpaces, + convertHedStringToShort, + convertHedStringToLong, + convertPartialHedStringToLong, + convertTagToShort, + convertTagToLong, + removeSlashesAndSpaces, } diff --git a/converter/index.js b/converter/index.js index d1b7bfcc..3d471b24 100644 --- a/converter/index.js +++ b/converter/index.js @@ -1,8 +1,8 @@ -const converter = require('./converter') -const schema = require('./schema') +const { convertHedStringToLong, convertHedStringToShort } = require('./converter') +const { buildSchema } = require('./schema') module.exports = { - buildSchema: schema.buildSchema, - convertHedStringToShort: converter.convertHedStringToShort, - convertHedStringToLong: converter.convertHedStringToLong, + buildSchema, + convertHedStringToShort, + convertHedStringToLong, } diff --git a/converter/schema.js b/converter/schema.js index 1300a5fb..ca15e8c6 100644 --- a/converter/schema.js +++ b/converter/schema.js @@ -78,16 +78,17 @@ const getParentTagName = function (tagElement) { * * @param {{path: string?, version: string?}} schemaDef The description of which schema to use. * @return {Promise|Promise} The schema container object or an error. + * @deprecated */ const buildSchema = function (schemaDef = {}) { - return schemaUtils.loadSchema(schemaDef).then((xmlData) => { + return schemaUtils.loadSchema(schemaDef).then(([xmlData, issues]) => { const mapping = buildMappingObject(xmlData) - const baseSchema = new schemaUtils.Schema(xmlData, undefined, mapping) + const baseSchema = new schemaUtils.Schema(xmlData, null, mapping) return new schemaUtils.Schemas(baseSchema) }) } module.exports = { - buildSchema: buildSchema, - buildMappingObject: buildMappingObject, + buildSchema, + buildMappingObject, } diff --git a/converter/types.js b/converter/types.js index 5ca6bf02..164c2f7c 100644 --- a/converter/types.js +++ b/converter/types.js @@ -50,6 +50,6 @@ class Mapping { } module.exports = { - TagEntry: TagEntry, - Mapping: Mapping, + TagEntry, + Mapping, } diff --git a/data/HED8.1.0.xml b/data/HED8.1.0.xml new file mode 100644 index 00000000..f5b7cfc4 --- /dev/null +++ b/data/HED8.1.0.xml @@ -0,0 +1,7072 @@ + + + This schema includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + Animal-agent + An agent that is an animal. + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + + Controller-agent + An agent experiment control software or hardware. + + + Human-agent + A person who takes an active role or produces a specified effect. + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + + Software-agent + An agent computer program. + + + + Action + Do something. + + extensionAllowed + + + Communicate + Convey knowledge of or information about something. + + Communicate-gesturally + Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + + + Communicate-musically + Communicate using music. + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + + Play-instrument + Make musical sounds using an instrument. + + + Sing + Produce musical tones by means of the voice. + + + Vocalize + Utter vocal sounds. + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + + Shout + Say something very loudly. + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + + Speak + Communicate using spoken language. + + + Whisper + Speak very softly using breath without vocal cords. + + + + + Move + Move in a specified direction or manner. Change position or posture. + + Breathe + Inhale or exhale during respiration. + + Blow + Expel air through pursed lips. + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + + Exhale + Blow out or expel breath. + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + + Inhale + Draw in with the breath through the nose or mouth. + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + + + Move-body + Move entire body. + + Bend + Move body in a bowed or curved manner. + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + + Fall-down + Lose balance and collapse. + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + + Jerk + Make a quick, sharp, sudden movement. + + + Lie-down + Move to a horizontal or resting position. + + + Recover-balance + Return to a stable, upright body position. + + + Sit-down + Move from a standing to a sitting position. + + + Sit-up + Move from lying down to a sitting position. + + + Stand-up + Move from a sitting to a standing position. + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + + Stumble + Trip or momentarily lose balance and almost fall. + + + Turn + Change or cause to change direction. + + + + Move-body-part + Move one part of a body. + + Move-eyes + Move eyes. + + Blink + Shut and open the eyes quickly. + + + Close-eyes + Lower and keep eyelids in a closed position. + + + Fixate + Direct eyes to a specific point or target. + + + Inhibit-blinks + Purposely prevent blinking. + + + Open-eyes + Raise eyelids to expose pupil. + + + Saccade + Move eyes rapidly between fixation points. + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + + + Move-face + Move the face or jaw. + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + + + Move-head + Move head. + + Lift-head + Tilt head back lifting chin. + + + Lower-head + Move head downward so that eyes are in a lower position. + + + Turn-head + Rotate head horizontally to look in a different direction. + + + + Move-lower-extremity + Move leg and/or foot. + + Curl-toes + Bend toes sometimes to grip. + + + Hop + Jump on one foot. + + + Jog + Run at a trot to exercise. + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + + Kick + Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + + Pedal + Move by working the pedals of a bicycle or other machine. + + + Press-foot + Move by pressing foot. + + + Run + Travel on foot at a fast pace. + + + Step + Put one leg in front of the other and shift weight onto it. + + Heel-strike + Strike the ground with the heel during a step. + + + Toe-off + Push with toe as part of a stride. + + + + Trot + Run at a moderate pace, typically with short steps. + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + + + Move-torso + Move body trunk. + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + Drop + Let or cause to fall vertically. + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + + Grasp + Seize and hold firmly. + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + + Lift + Raising something to higher position. + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + + Point + Draw attention to something by extending a finger or arm. + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + + Reach + Stretch out your arm in order to get or touch something. + + + Release + Make available or set free. + + + Retract + Draw or pull back. + + + Scratch + Drag claws or nails over a surface or on skin. + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + + Touch + Come into or be in contact with. + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + Hear + Give attention to a sound. + + + See + Direct gaze toward someone or something or in a specified direction. + + + Smell + Inhale in order to ascertain an odor or scent. + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + + Sense-by-touch + Sense something through receptors in the skin. + + + + Perform + Carry out or accomplish an action, task, or function. + + Close + Act as to blocked against entry or passage. + + + Collide-with + Hit with force when moving. + + + Halt + Bring or come to an abrupt stop. + + + Modify + Change something. + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + + Operate + Control the functioning of a machine, process, or system. + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + + Read + Interpret something that is written or printed. + + + Repeat + Make do or perform again. + + + Rest + Be inactive in order to regain strength, health, or energy. + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + Allow + Allow access to something such as allowing a car to pass. + + + Attend-to + Focus mental experience on specific targets. + + + Count + Tally items either silently or aloud. + + + Deny + Refuse to give or grant something requested or desired by someone. + + + Detect + Discover or identify the presence or existence of something. + + + Discriminate + Recognize a distinction. + + + Encode + Convert information or an instruction into a particular form. + + + Evade + Escape or avoid, especially by cleverness or trickery. + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + + Identify + Establish or indicate who or what someone or something is. + + + Imagine + Form a mental image or concept of something. + + + Judge + Evaluate evidence to make a decision or form a belief. + + + Learn + Adaptively change behavior as the result of experience. + + + Memorize + Adaptively change behavior as the result of experience. + + + Plan + Think about the activities required to achieve a desired goal. + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact informaton. + + + Recognize + Identify someone or something from having encountered them before. + + + Respond + React to something such as a treatment or a stimulus. + + + Recall + Remember information by mental effort. + + + Switch-attention + Transfer attention from one focus to another. + + + Track + Follow a person, animal, or object through space or time. + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + Biological-item + An entity that is biological, that is related to living organisms. + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + Body + The biological structure representing an organism. + + + Body-part + Any part of an organism. + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + Hair + The filamentous outgrowth of the epidermis. + + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + + Eye + The organ of sight or vision. + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + + Teeth + The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + + Calf + The fleshy part at the back of the leg below the knee. + + + Foot + The structure found below the ankle joint required for locomotion. + + Big-toe + The largest toe on the inner side of the foot. + + + Heel + The back of the foot below the ankle. + + + Instep + The part of the foot between the ball and the heel on the inner side. + + + Little-toe + The smallest toe located on the outer side of the foot. + + + Toes + The terminal digits of the foot. + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + + Shin + Front part of the leg below the knee. + + + Thigh + Upper part of the leg between hip and knee. + + + + Torso + The body excluding the head and neck and limbs. + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + + Gentalia + The external organs of reproduction. + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + + Waist + The abdominal circumference at the navel. + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + Elbow + A type of hinge joint located between the forearm and upper arm. + + + Forearm + Lower part of the arm between the elbow and wrist. + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + Finger + Any of the digits of the hand. + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + + Middle-finger + The middle or third finger from the radial side of the hand. + + + Ring-finger + The fourth finger from the radial side of the hand. + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + + + Shoulder + Joint attaching upper arm to trunk. + + + Upper-arm + Portion of arm between shoulder and elbow. + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + + Human + The bipedal primate mammal Homo sapiens. + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + Character + A mark or symbol used in writing. + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + + Nonword + A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + + Phoneme + A speech sound that is distinguished by the speakers of a particular language. + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + + Syllable + A unit of spoken language larger than a phoneme. + + + Textblock + A block of text. + + + Word + A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + Geometric-object + An object or a representation that has structure and topology in space. + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + Dots + A small round mark or spot. + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + + + 2D-shape + A planar, two-dimensional shape. + + Arrow + A shape with a pointed end indicating direction. + + + Clockface + The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Circle + A ring-shaped structure with every point equidistant from the center. + + + + Rectangle + A parallelogram with four right angles. + + Square + A square is a special rectangle with four equal sides. + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + + Triangle + A three-sided polygon. + + + + 3D-shape + A geometric three-dimensional shape. + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + + Man-made-object + Something constructed by human means. + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + Room + An area within a building enclosed by walls and floor and ceiling. + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + + Entrance + The means or place of entry. + + + Attic + A room or a space immediately below the roof of a building. + + + Basement + The part of a building that is wholly or partly below ground level. + + + + Clothing + A covering designed to be worn on the body. + + + Device + An object contrived for a specific purpose. + + Assistive-device + A device that help an individual accomplish a task. + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + + Writing-device + A device used for writing. + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + # + Value of a keyboard key. + + takesValue + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + # + Value of keypad key. + + takesValue + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + + Push-button + A switch designed to be operated by pressing a button. + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective meshwork. + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + + + + Auditory-device + A device designed to produce sound. + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + + File-storage + A device for recording digital information to a permanent media. + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + + Motion-capture + A device for recording the movement of objects or people. + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + + Measurement-device + A device in which a measure function inheres. + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + Clock-face + A location identifier based on clockface numbering or anatomic subregion. + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + + Tool + A component that is not part of a device but is designed to support its assemby or operation. + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + Letter + A written message addressed to a person or organization. + + + Note + A brief written record. + + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + + Notebook + A book for notes or memoranda. + + + Questionnaire + A document consisting of questions and possibly responses, depending on whether it has been filled out. + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + + Manufactured-material + Substances created or extracted from raw materials. + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + + Glass + A brittle transparent solid with irregular atomic structure. + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + + Plastic + Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + + + Media + Media are audo/visual/audiovisual modes of communicating information for mass consumption. + + Media-clip + A short segment of media. + + Audio-clip + A short segment of audio. + + + Audiovisual-clip + A short media segment containing both audio and video. + + + Video-clip + A short segment of video. + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + + Image + Any record of an imaging event whether physical or electronic. + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + + Painting + A work produced through the art of painting. + + + Photograph + An image recorded by a camera. + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + + + Vehicle + A mobile machine which transports people or cargo. + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + + Boat + A watercraft of any size which is able to float or plane on water. + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + + Train + A connected line of railroad cars with or without a locomotive. + + + Truck + A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + Field + An unbroken expanse as of ice or grassland. + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + Environmental-sound + Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + + Instrument-sound + Sound produced by a musical instrument. + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + + Crowing + Loud shrill sounds characteristic of roosters. + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + + Mooing + Deep vocal sounds like those made by a cow. + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + + Squawking + Loud, harsh noises such as those made by geese. + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + Agent-property + Something that pertains to an agent. + + extensionAllowed + + + Agent-state + The state of the agent. + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + Alert + Condition of heightened watchfulness or preparation for action. + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + + Distracted + Lacking in concentration because of being preoccupied. + + + Awake + In a non sleeping state. + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + + Passive + Not responding or initiating an action in response to a stimulus. + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + + Content + Feeling satisfaction with things as they are. + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + + Excited + Feeling great enthusiasm and eagerness. + + + Fearful + Feeling apprehension that one may be in danger. + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + + Happy + Feeling pleased and content. + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + + Joyful + Feeling delight or intense happiness. + + + Loving + Feeling a strong positive emotion of affection and attraction. + + + Relieved + No longer feeling pain, distress, anxiety, or reassured. + + + Sad + Feeling grief or unhappiness. + + + Stressed + Experiencing mental or emotional strain or tension. + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + + Sated + Feeling full. + + relatedTag + Hungry + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + + Eyes-closed + Keeping eyes closed with no blinking. + + + Eyes-open + Keeping eyes open with occasional blinking. + + + Kneeling + Positioned where one or both knees are on the ground. + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + + Sitting + In a seated position. + + + Standing + Assuming or maintaining an erect upright position. + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + Age + Length of time elapsed time since birth of the agent. + + # + + takesValue + + + valueClass + numericClass + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + + Sex + Physical properties or qualities by which male is distinguished from female. + + Female + Biological sex of an individual with female sexual organs such ova. + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + Data-marker + An indicator placed to mark something. + + Data-break-marker + An indicator place to indicate a gap in the data. + + + Temporal-marker + An indicator placed at a particular time in the data. + + Onset + Labels the start or beginning of something, usually an event. + + topLevelTagGroup + + + + Offset + Labels the time at which something stops. + + topLevelTagGroup + + + + Pause + Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + + Time-sync + A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + # + + takesValue + + + valueClass + numericClass + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + # + + takesValue + + + valueClass + numericClass + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + # + + takesValue + + + valueClass + numericClass + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + # + + takesValue + + + valueClass + numericClass + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + # + + takesValue + + + valueClass + numericClass + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + # + + takesValue + + + valueClass + numericClass + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + + Computed-prediction + A computed extrapolation of known data. + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + + + Data-value + Designation of the type of a data item. + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + + Masked + Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. + + relatedTag + Unmasked + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + Cold + Having an absence of heat. + + relatedTag + Hot + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + + Hot + Having an excess of heat. + + relatedTag + Cold + + + + Large + Having a great extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Small + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + + Loud + Having a perceived high intensity of sound. + + relatedTag + Quiet + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + + Small + Having a small extent such as in physical dimensions, period of time, amplitude or frequency. + + relatedTag + Large + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + + Rotated + Positioned offset around an axis or center. + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + + + + Physical-value + The value of some physical property of something. + + Weight + The relative mass or the quantity of matter contained by something. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + + + Temperature + A measure of hot or cold based on the average kinetic energy of the atoms or molecules in the system. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + temperatureUnits + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + Fraction + A numerical value between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-index + The index of an item in a collection, sequence or other structure. (A (Item-index/3, B)) means that A is item number 3 in B. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + # + + takesValue + + + valueClass + numericClass + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + # + + takesValue + + + valueClass + numericClass + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + # + + takesValue + + + valueClass + numericClass + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + Data-maximum + The largest possible quantity or degree. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-median + The value which has an equal number of values greater and less than it. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-minimum + The smallest possible quantity. + + # + + takesValue + + + valueClass + numericClass + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + # + + takesValue + + + valueClass + numericClass + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + # + + takesValue + + + valueClass + numericClass + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + Rate-of-change + The amount of change accumulated per unit time. + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + # + + takesValue + + + unitClass + frequencyUnits + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + # + + takesValue + + + valueClass + numericClass + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + + + Temporal-rate + The number of items per unit of time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + + Spatial-value + Value of an item involving space. + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + + + Distance + A measure of the space separating two objects or points. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + X-position + The position along the x-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Y-position + The position along the y-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Z-position + The position along the z-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + Size + The physical magnitude of something. + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Width + The extent or measurement of something from side to side. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + Delay + Time during which some action is awaited. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Duration + The period of time during which something occurs or continues. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + Abrupt + Marked by sudden change. + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + + Estimated-value + Something that has been calculated or measured approximately. + + + Exact-value + A value that is viewed to the true value according to some standard. + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + + Repetitive + A recurring action that is often non-purposeful. + + + Stochastic + Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + + Varying + Differing in size, amount, degree, or nature. + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + Indoors + Located inside a building or enclosure. + + + Outdoors + Any area outside a building or shelter. + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + + Rural + Of or pertaining to the country as opposed to the city. + + + Terrain + Characterization of the physical features of a tract of land. + + Composite-terrain + Tracts of land characterized by a mixure of physical features. + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + + Grassy-terrain + Tracts of land covered by grass. + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + requireChild + + + # + + takesValue + + + valueClass + nameClass + + + + + Metadata + Data about data. Information that describes another set of data. + + CogAtlas + The Cognitive Atlas ID number of something. + + # + + takesValue + + + + + CogPo + The CogPO ID number of something. + + # + + takesValue + + + + + Creation-date + The date on which data creation of this element began. + + requireChild + + + # + + takesValue + + + valueClass + dateTimeClass + + + + + Experimental-note + A brief written record about the experiment. + + # + + takesValue + + + valueClass + textClass + + + + + Library-name + Official name of a HED library. + + # + + takesValue + + + valueClass + nameClass + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + # + + takesValue + + + valueClass + nameClass + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + # + + takesValue + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + # + + takesValue + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + # + Usually is a semantic version. + + takesValue + + + + + + Parameter + Something user-defined for this experiment. + + Parameter-label + The name of the parameter. + + # + + takesValue + + + valueClass + nameClass + + + + + Parameter-value + The value of the parameter. + + # + + takesValue + + + valueClass + textClass + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + Collection + A tag designating a grouping of items such as in a set or list. + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + tagGroup + + + # + + takesValue + + + valueClass + nameClass + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + topLevelTagGroup + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + topLevelTagGroup + + + unique + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + + Sensory-property + Relating to sensation or the physical senses. + + Sensory-attribute + A sensory characteristic associated with another entity. + + Auditory-attribute + Pertaining to the sense of hearing. + + Loudness + Perceived intensity of a sound. + + # + + takesValue + + + valueClass + numericClass + nameClass + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Sound-envelope + Description of how a sound changes over time. + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + # + + takesValue + + + valueClass + nameClass + + + + + Sound-volume + The sound pressure level (SPL) usually the ratio to a reference signal estimated as the lower bound of hearing. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + intensityUnits + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + Bitter + Having a sharp, pungent taste. + + + Salty + Tasting of or like salt. + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + + Sour + Having a sharp, acidic taste. + + + Sweet + Having or resembling the taste of sugar. + + + + Olfactory-attribute + Having a smell. + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + + + Tactile-attribute + Pertaining to the sense of touch. + + Tactile-pressure + Having a feeling of heaviness. + + + Tactile-temperature + Having a feeling of hotness or coldness. + + + Tactile-texture + Having a feeling of roughness. + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + + Visual-attribute + Pertaining to the sense of sight. + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp. + + Blue-color + CSS color group. + + CadetBlue + CSS-color 0x5F9EA0. + + + SteelBlue + CSS-color 0x4682B4. + + + LightSteelBlue + CSS-color 0xB0C4DE. + + + LightBlue + CSS-color 0xADD8E6. + + + PowderBlue + CSS-color 0xB0E0E6. + + + LightSkyBlue + CSS-color 0x87CEFA. + + + SkyBlue + CSS-color 0x87CEEB. + + + CornflowerBlue + CSS-color 0x6495ED. + + + DeepSkyBlue + CSS-color 0x00BFFF. + + + DodgerBlue + CSS-color 0x1E90FF. + + + RoyalBlue + CSS-color 0x4169E1. + + + Blue + CSS-color 0x0000FF. + + + MediumBlue + CSS-color 0x0000CD. + + + DarkBlue + CSS-color 0x00008B. + + + Navy + CSS-color 0x000080. + + + MidnightBlue + CSS-color 0x191970. + + + + Brown-color + CSS color group. + + Cornsilk + CSS-color 0xFFF8DC. + + + BlanchedAlmond + CSS-color 0xFFEBCD. + + + Bisque + CSS-color 0xFFE4C4. + + + NavajoWhite + CSS-color 0xFFDEAD. + + + Wheat + CSS-color 0xF5DEB3. + + + BurlyWood + CSS-color 0xDEB887. + + + Tan + CSS-color 0xD2B48C. + + + RosyBrown + CSS-color 0xBC8F8F. + + + SandyBrown + CSS-color 0xF4A460. + + + GoldenRod + CSS-color 0xDAA520. + + + DarkGoldenRod + CSS-color 0xB8860B. + + + Peru + CSS-color 0xCD853F. + + + Chocolate + CSS-color 0xD2691E. + + + Olive + CSS-color 0x808000. + + + SaddleBrown + CSS-color 0x8B4513. + + + Sienna + CSS-color 0xA0522D. + + + Brown + CSS-color 0xA52A2A. + + + Maroon + CSS-color 0x800000. + + + + Cyan-color + CSS color group. + + Aqua + CSS-color 0x00FFFF. + + + Cyan + CSS-color 0x00FFFF. + + + LightCyan + CSS-color 0xE0FFFF. + + + PaleTurquoise + CSS-color 0xAFEEEE. + + + Aquamarine + CSS-color 0x7FFFD4. + + + Turquoise + CSS-color 0x40E0D0. + + + MediumTurquoise + CSS-color 0x48D1CC. + + + DarkTurquoise + CSS-color 0x00CED1. + + + + Green-color + CSS color group. + + GreenYellow + CSS-color 0xADFF2F. + + + Chartreuse + CSS-color 0x7FFF00. + + + LawnGreen + CSS-color 0x7CFC00. + + + Lime + CSS-color 0x00FF00. + + + LimeGreen + CSS-color 0x32CD32. + + + PaleGreen + CSS-color 0x98FB98. + + + LightGreen + CSS-color 0x90EE90. + + + MediumSpringGreen + CSS-color 0x00FA9A. + + + SpringGreen + CSS-color 0x00FF7F. + + + MediumSeaGreen + CSS-color 0x3CB371. + + + SeaGreen + CSS-color 0x2E8B57. + + + ForestGreen + CSS-color 0x228B22. + + + Green + CSS-color 0x008000. + + + DarkGreen + CSS-color 0x006400. + + + YellowGreen + CSS-color 0x9ACD32. + + + OliveDrab + CSS-color 0x6B8E23. + + + DarkOliveGreen + CSS-color 0x556B2F. + + + MediumAquaMarine + CSS-color 0x66CDAA. + + + DarkSeaGreen + CSS-color 0x8FBC8F. + + + LightSeaGreen + CSS-color 0x20B2AA. + + + DarkCyan + CSS-color 0x008B8B. + + + Teal + CSS-color 0x008080. + + + + Gray-color + CSS color group. + + Gainsboro + CSS-color 0xDCDCDC. + + + LightGray + CSS-color 0xD3D3D3. + + + Silver + CSS-color 0xC0C0C0. + + + DarkGray + CSS-color 0xA9A9A9. + + + DimGray + CSS-color 0x696969. + + + Gray + CSS-color 0x808080. + + + LightSlateGray + CSS-color 0x778899. + + + SlateGray + CSS-color 0x708090. + + + DarkSlateGray + CSS-color 0x2F4F4F. + + + Black + CSS-color 0x000000. + + + + Orange-color + CSS color group. + + Orange + CSS-color 0xFFA500. + + + DarkOrange + CSS-color 0xFF8C00. + + + Coral + CSS-color 0xFF7F50. + + + Tomato + CSS-color 0xFF6347. + + + OrangeRed + CSS-color 0xFF4500. + + + + Pink-color + CSS color group. + + Pink + CSS-color 0xFFC0CB. + + + LightPink + CSS-color 0xFFB6C1. + + + HotPink + CSS-color 0xFF69B4. + + + DeepPink + CSS-color 0xFF1493. + + + PaleVioletRed + CSS-color 0xDB7093. + + + MediumVioletRed + CSS-color 0xC71585. + + + + Purple-color + CSS color group. + + Lavender + CSS-color 0xE6E6FA. + + + Thistle + CSS-color 0xD8BFD8. + + + Plum + CSS-color 0xDDA0DD. + + + Orchid + CSS-color 0xDA70D6. + + + Violet + CSS-color 0xEE82EE. + + + Fuchsia + CSS-color 0xFF00FF. + + + Magenta + CSS-color 0xFF00FF. + + + MediumOrchid + CSS-color 0xBA55D3. + + + DarkOrchid + CSS-color 0x9932CC. + + + DarkViolet + CSS-color 0x9400D3. + + + BlueViolet + CSS-color 0x8A2BE2. + + + DarkMagenta + CSS-color 0x8B008B. + + + Purple + CSS-color 0x800080. + + + MediumPurple + CSS-color 0x9370DB. + + + MediumSlateBlue + CSS-color 0x7B68EE. + + + SlateBlue + CSS-color 0x6A5ACD. + + + DarkSlateBlue + CSS-color 0x483D8B. + + + RebeccaPurple + CSS-color 0x663399. + + + Indigo + CSS-color 0x4B0082. + + + + Red-color + CSS color group. + + LightSalmon + CSS-color 0xFFA07A. + + + Salmon + CSS-color 0xFA8072. + + + DarkSalmon + CSS-color 0xE9967A. + + + LightCoral + CSS-color 0xF08080. + + + IndianRed + CSS-color 0xCD5C5C. + + + Crimson + CSS-color 0xDC143C. + + + Red + CSS-color 0xFF0000. + + + FireBrick + CSS-color 0xB22222. + + + DarkRed + CSS-color 0x8B0000. + + + + Yellow-color + CSS color group. + + Gold + CSS-color 0xFFD700. + + + Yellow + CSS-color 0xFFFF00. + + + LightYellow + CSS-color 0xFFFFE0. + + + LemonChiffon + CSS-color 0xFFFACD. + + + LightGoldenRodYellow + CSS-color 0xFAFAD2. + + + PapayaWhip + CSS-color 0xFFEFD5. + + + Moccasin + CSS-color 0xFFE4B5. + + + PeachPuff + CSS-color 0xFFDAB9. + + + PaleGoldenRod + CSS-color 0xEEE8AA. + + + Khaki + CSS-color 0xF0E68C. + + + DarkKhaki + CSS-color 0xBDB76B. + + + + White-color + CSS color group. + + White + CSS-color 0xFFFFFF. + + + Snow + CSS-color 0xFFFAFA. + + + HoneyDew + CSS-color 0xF0FFF0. + + + MintCream + CSS-color 0xF5FFFA. + + + Azure + CSS-color 0xF0FFFF. + + + AliceBlue + CSS-color 0xF0F8FF. + + + GhostWhite + CSS-color 0xF8F8FF. + + + WhiteSmoke + CSS-color 0xF5F5F5. + + + SeaShell + CSS-color 0xFFF5EE. + + + Beige + CSS-color 0xF5F5DC. + + + OldLace + CSS-color 0xFDF5E6. + + + FloralWhite + CSS-color 0xFFFAF0. + + + Ivory + CSS-color 0xFFFFF0. + + + AntiqueWhite + CSS-color 0xFAEBD7. + + + Linen + CSS-color 0xFAF0E6. + + + LavenderBlush + CSS-color 0xFFF0F5. + + + MistyRose + CSS-color 0xFFE4E1. + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + Dark-shade + A color tone not reflecting much light. + + + Light-shade + A color tone reflecting more light. + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + # + White intensity between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + HSV-color + A color representation that models how colors appear under light. + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + # + Angular value between 0 and 360. + + takesValue + + + valueClass + numericClass + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + # + + takesValue + + + valueClass + numericClass + + + + + + RGB-color + A color from the RGB schema. + + RGB-red + The red component. + + # + R value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-blue + The blue component. + + # + B value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + RGB-green + The green component. + + # + G value of RGB between 0 and 1. + + takesValue + + + valueClass + numericClass + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + + Opacity + A measure of impenetrability to light. + + + + + Sensory-presentation + The entity has a sensory manifestation. + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + + Visual-presentation + The sense of sight used in the presentation to the user. + + 2D-view + A view showing only two dimensions. + + + 3D-view + A view showing three dimensions. + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + + Satellite-view + A representation as captured by technology such as a satellite. + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + + Orienting-attention + Directing attention to a target stimulus. + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + + + Task-event-role + The purpose of an event with respect to the task. + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + + Participant-response + Something related to a participant actions in performing the task. + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + + Correction + An action offering an improvement to replace a mistake or error. + + + Done-indication + An action that indicates that the participant has completed this step in the task. + + relatedTag + Ready-indication + + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + + Omitted-action + An expected response was skipped. + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + + Ready-indication + An action that indicates that the participant is ready to perform the next step in the task. + + relatedTag + Done-indication + + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + + + Task-stimulus-role + The role the stimulus plays in the task. + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + + Meaningful + Conveying significant or relevant information. + + + Newly-learned + Representing recently acquired information or understanding. + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + + Novel + Having no previous example or precedent or parallel. + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + + Query + A sentence of inquiry that asks for a reply. + + + Reward + A positive reinforcement for a desired action, behavior or response. + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + + Target + Something fixed as a goal, destination, or point of examination. + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + extensionAllowed + + + Comparative-relation + Something considered in comparison to something else. The first argument is the focus. + + Approximately-equal-to + (A, (Approximately-equal-to, B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than + (A, (Less-than, B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than-or-equal-to + (A, (Less-than-or-equal-to, B)) indicates that the relative size or order of A is smaller than or equal to B. + + + Greater-than + (A, (Greater-than, B)) indicates that the relative size or order of A is bigger than that of B. + + + Greater-than-or-equal-to + (A, (Greater-than-or-equal-to, B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + + Equal-to + (A, (Equal-to, B)) indicates that the size or order of A is the same as that of B. + + + Not-equal-to + (A, (Not-equal-to, B)) indicates that the size or order of A is not the same as that of B. + + + + Connective-relation + Indicates two items are related in some way. + + Belongs-to + (A, (Belongs-to, B)) indicates that A is a member of B. + + + Connected-to + (A, (Connected-to, B)) indicates that A is related to B in some respect, usually through a direct link. + + + Contained-in + (A, (Contained-in, B)) indicates that A is completely inside of B. + + + Described-by + (A, (Described-by, B)) indicates that B provides information about A. + + + From-to + (A, (From-to, B)) indicates a directional relation from A to B. A is considered the source. + + + Group-of + (A, (Group-of, B)) indicates A is a group of items of type B. + + + Implied-by + (A, (Implied-by, B)) indicates B is suggested by A. + + + Includes + (A, (Includes, B)) indicates that A has B as a member or part. + + + Interacts-with + (A, (Interacts-with, B)) indicates A and B interact, possibly reciprocally. + + + Member-of + (A, (Member-of, B)) indicates A is a member of group B. + + + Part-of + (A, (Part-of, B)) indicates A is a part of the whole B. + + + Performed-by + (A, (Performed-by, B)) indicates that the action or procedure A was carried out by agent B. + + + Performed-using + A, (Performed-using, B)) indicates that the action or procedure A was accomplished using B. + + + Related-to + (A, (Related-to, B)) indicates A has some relationship to B. + + + Unrelated-to + (A, (Unrelated-to, B)) indicates that A is not related to B. For example, A is not related to Task. + + + + Directional-relation + A relationship indicating direction of change. + + Away-from + (A, (Away-from, B)) indicates that A is going or has moved away from B. The meaning depends on A and B. + + + Towards + (A, (Towards, B)) indicates that A is going to or has moved to B. The meaning depends on A and B. + + + + Spatial-relation + Indicating information about position. + + Above + (A, (Above, B)) means A is in a place or position that is higher than B. + + + Across-from + (A, (Across-from, B)) means A is on the opposite side of something from B. + + + Adjacent-to + (A, (Adjacent-to, B)) indicates that A is next to B in time or space. + + + Ahead-of + (A, (Ahead-of, B)) indicates that A is further forward in time or space in B. + + + Around + (A, (Around, B)) means A is in or near the present place or situation of B. + + + Behind + (A, (Behind, B)) means A is at or to the far side of B, typically so as to be hidden by it. + + + Below + (A, (Below, B)) means A is in a place or position that is lower than the position of B. + + + Between + (A, (Between, (B, C))) means A is in the space or interval separating B and C. + + + Bilateral-to + (A, (Bilateral, B)) means A is on both sides of B or affects both sides of B. + + + Bottom-edge-of + (A, (Bottom-edge-of, B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + + Boundary-of + (A, (Boundary-of, B)) means A is on or part of the edge or boundary of B. + + + Center-of + (A, (Center-of, B)) means A is at a point or or in an area that is approximately central within B. + + + Close-to + (A, (Close-to, B)) means A is at a small distance from or is located near in space to B. + + + Far-from + (A, (Far-from, B)) means A is at a large distance from or is not located near in space to B. + + + In-front-of + (A, (In-front-of, B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + + Left-edge-of + (A, (Left-edge-of, B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + + Left-side-of + (A, (Left-side-of, B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + + Lower-left-of + (A, (Lower-left-of, B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-right-of + Upper-left-of + Upper-right-of + + + + Lower-right-of + (A, (Lower-right-of, B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Upper-left-of + Upper-left-of + Lower-right-of + + + + Outside-of + (A, (Outside-of, B)) means A is located in the space around but not including B. + + + Over + (A, (Over, B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + + Right-edge-of + (A, (Right-edge-of, B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + + Right-side-of + (A, (Right-side-of, B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + + To-left-of + (A, (To-left-of, B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + + To-right-of + (A, (To-right-of, B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + + Top-edge-of + (A, (Top-edge-of, B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + + Top-of + (A, (Top-of, B)) means A is on the uppermost part, side, or surface of B. + + + Upper-left-of + (A, (Upper-left-of, B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Lower-right-of + Upper-right-of + + + + Upper-right-of + (A, (Upper-right-of, B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Upper-left-of + Lower-right-of + + + + Underneath + (A, (Underneath, B)) means A is situated directly below and may be concealed by B. + + + Within + (A, (Within, B)) means A is on the inside of or contained in B. + + + + Temporal-relation + Any relationship which includes a temporal or time-based component. + + After + (A, (After B)) means A happens at a time subsequent to a reference time related to B. + + + Asynchronous-with + (A, (Asynchronous-with, B)) means A happens at times not occurring at the same time or having the same period or phase as B. + + + Before + (A, (Before B)) means A happens at a time earlier in time or order than B. + + + During + (A, (During, B)) means A happens at some point in a given period of time in which B is ongoing. + + + Synchronous-with + (A, (Synchronous-with, B)) means A happens at occurs at the same time or rate as B. + + + Waiting-for + (A, (Waiting-for, B)) means A pauses for something to happen in B. + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + conversionFactor + 1.0 + + + + rad + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + degree + + conversionFactor + 0.0174533 + + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + conversionFactor + 1.0 + + + + $ + + unitPrefix + + + unitSymbol + + + conversionFactor + 1.0 + + + + euro + + + point + + + + electricPotentialUnits + + defaultUnits + uv + + + v + + SIUnit + + + unitSymbol + + + conversionFactor + 0.000001 + + + + Volt + + SIUnit + + + conversionFactor + 0.000001 + + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + conversionFactor + 1.0 + + + + Hz + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. May be used for sound intensity. + + unitSymbol + + + conversionFactor + 1.0 + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + conversionFactor + 1.0 + + + + + magneticFieldUnits + Units used to magnetic field intensity. + + defaultUnits + fT + + + tesla + + SIUnit + + + conversionFactor + 10^-15 + + + + T + + SIUnit + + + unitSymbol + + + conversionFactor + 10^-15 + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + conversionFactor + 1.0 + + + + B + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + conversionFactor + 0.3048 + + + + inch + + conversionFactor + 0.0254 + + + + metre + + SIUnit + + + conversionFactor + 1.0 + + + + m + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mile + + conversionFactor + 1609.34 + + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + mph + + unitSymbol + + + conversionFactor + 0.44704 + + + + kph + + unitSymbol + + + conversionFactor + 0.277778 + + + + + temperatureUnits + + degree Celsius + + SIUnit + + + conversionFactor + 1.0 + + + + oC + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + conversionFactor + 1.0 + + + + s + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + day + + conversionFactor + 86400 + + + + minute + + conversionFactor + 60 + + + + hour + Should be in 24-hour format. + + conversionFactor + 3600 + + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + conversionFactor + 1.0 + + + + gram + + SIUnit + + + conversionFactor + 1.0 + + + + pound + + conversionFactor + 453.592 + + + + lb + + conversionFactor + 453.592 + + + + + + + deca + SI unit multiple representing 10^1. + + SIUnitModifier + + + conversionFactor + 10.0 + + + + da + SI unit multiple representing 10^1. + + SIUnitSymbolModifier + + + conversionFactor + 10.0 + + + + hecto + SI unit multiple representing 10^2. + + SIUnitModifier + + + conversionFactor + 100.0 + + + + h + SI unit multiple representing 10^2. + + SIUnitSymbolModifier + + + conversionFactor + 100.0 + + + + kilo + SI unit multiple representing 10^3. + + SIUnitModifier + + + conversionFactor + 1000.0 + + + + k + SI unit multiple representing 10^3. + + SIUnitSymbolModifier + + + conversionFactor + 1000.0 + + + + mega + SI unit multiple representing 10^6. + + SIUnitModifier + + + conversionFactor + 10^6 + + + + M + SI unit multiple representing 10^6. + + SIUnitSymbolModifier + + + conversionFactor + 10^6 + + + + giga + SI unit multiple representing 10^9. + + SIUnitModifier + + + conversionFactor + 10^9 + + + + G + SI unit multiple representing 10^9. + + SIUnitSymbolModifier + + + conversionFactor + 10^9 + + + + tera + SI unit multiple representing 10^12. + + SIUnitModifier + + + conversionFactor + 10^12 + + + + T + SI unit multiple representing 10^12. + + SIUnitSymbolModifier + + + conversionFactor + 10^12 + + + + peta + SI unit multiple representing 10^15. + + SIUnitModifier + + + conversionFactor + 10^15 + + + + P + SI unit multiple representing 10^15. + + SIUnitSymbolModifier + + + conversionFactor + 10^15 + + + + exa + SI unit multiple representing 10^18. + + SIUnitModifier + + + conversionFactor + 10^18 + + + + E + SI unit multiple representing 10^18. + + SIUnitSymbolModifier + + + conversionFactor + 10^18 + + + + zetta + SI unit multiple representing 10^21. + + SIUnitModifier + + + conversionFactor + 10^21 + + + + Z + SI unit multiple representing 10^21. + + SIUnitSymbolModifier + + + conversionFactor + 10^21 + + + + yotta + SI unit multiple representing 10^24. + + SIUnitModifier + + + conversionFactor + 10^24 + + + + Y + SI unit multiple representing 10^24. + + SIUnitSymbolModifier + + + conversionFactor + 10^24 + + + + deci + SI unit submultiple representing 10^-1. + + SIUnitModifier + + + conversionFactor + 0.1 + + + + d + SI unit submultiple representing 10^-1. + + SIUnitSymbolModifier + + + conversionFactor + 0.1 + + + + centi + SI unit submultiple representing 10^-2. + + SIUnitModifier + + + conversionFactor + 0.01 + + + + c + SI unit submultiple representing 10^-2. + + SIUnitSymbolModifier + + + conversionFactor + 0.01 + + + + milli + SI unit submultiple representing 10^-3. + + SIUnitModifier + + + conversionFactor + 0.001 + + + + m + SI unit submultiple representing 10^-3. + + SIUnitSymbolModifier + + + conversionFactor + 0.001 + + + + micro + SI unit submultiple representing 10^-6. + + SIUnitModifier + + + conversionFactor + 10^-6 + + + + u + SI unit submultiple representing 10^-6. + + SIUnitSymbolModifier + + + conversionFactor + 10^-6 + + + + nano + SI unit submultiple representing 10^-9. + + SIUnitModifier + + + conversionFactor + 10^-9 + + + + n + SI unit submultiple representing 10^-9. + + SIUnitSymbolModifier + + + conversionFactor + 10^-9 + + + + pico + SI unit submultiple representing 10^-12. + + SIUnitModifier + + + conversionFactor + 10^-12 + + + + p + SI unit submultiple representing 10^-12. + + SIUnitSymbolModifier + + + conversionFactor + 10^-12 + + + + femto + SI unit submultiple representing 10^-15. + + SIUnitModifier + + + conversionFactor + 10^-15 + + + + f + SI unit submultiple representing 10^-15. + + SIUnitSymbolModifier + + + conversionFactor + 10^-15 + + + + atto + SI unit submultiple representing 10^-18. + + SIUnitModifier + + + conversionFactor + 10^-18 + + + + a + SI unit submultiple representing 10^-18. + + SIUnitSymbolModifier + + + conversionFactor + 10^-18 + + + + zepto + SI unit submultiple representing 10^-21. + + SIUnitModifier + + + conversionFactor + 10^-21 + + + + z + SI unit submultiple representing 10^-21. + + SIUnitSymbolModifier + + + conversionFactor + 10^-21 + + + + yocto + SI unit submultiple representing 10^-24. + + SIUnitModifier + + + conversionFactor + 10^-24 + + + + y + SI unit submultiple representing 10^-24. + + SIUnitSymbolModifier + + + conversionFactor + 10^-24 + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + conversionFactor + The multiplicative factor to multiply these units to convert to default units. + + unitProperty + + + unitModifierProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. A tag group can have at most one tag with this attribute. + + boolProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + This is an updated version of the schema format. The properties are now part of the schema. The schema attributes are designed to be checked in software rather than hard-coded. The schema attributes, themselves have properties. + + + diff --git a/data/HED_testlib_1.0.2.xml b/data/HED_testlib_1.0.2.xml new file mode 100644 index 00000000..72dcd78e --- /dev/null +++ b/data/HED_testlib_1.0.2.xml @@ -0,0 +1,6542 @@ + + + This schema is the first official release that includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + Animal-agent + An agent that is an animal. + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + + Controller-agent + An agent experiment control software or hardware. + + + Human-agent + A person who takes an active role or produces a specified effect. + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + + Software-agent + An agent computer program. + + + + Action + Do something. + + extensionAllowed + + + Communicate + Convey knowledge of or information about something. + + Communicate-gesturally + Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + + + Communicate-musically + Communicate using music. + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + + Play-instrument + Make musical sounds using an instrument. + + + Sing + Produce musical tones by means of the voice. + + + Vocalize + Utter vocal sounds. + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + + Shout + Say something very loudly. + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + + Speak + Communicate using spoken language. + + + Whisper + Speak very softly using breath without vocal cords. + + + + + Move + Move in a specified direction or manner. Change position or posture. + + Breathe + Inhale or exhale during respiration. + + Blow + Expel air through pursed lips. + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + + Exhale + Blow out or expel breath. + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + + Inhale + Draw in with the breath through the nose or mouth. + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + + + Move-body + Move entire body. + + Bend + Move body in a bowed or curved manner. + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + + Fall-down + Lose balance and collapse. + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + + Jerk + Make a quick, sharp, sudden movement. + + + Lie-down + Move to a horizontal or resting position. + + + Recover-balance + Return to a stable, upright body position. + + + Sit-down + Move from a standing to a sitting position. + + + Sit-up + Move from lying down to a sitting position. + + + Stand-up + Move from a sitting to a standing position. + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + + Stumble + Trip or momentarily lose balance and almost fall. + + + Turn + Change or cause to change direction. + + + + Move-body-part + Move one part of a body. + + Move-eyes + Move eyes. + + Blink + Shut and open the eyes quickly. + + + Close-eyes + Lower and keep eyelids in a closed position. + + + Fixate + Direct eyes to a specific point or target. + + + Inhibit-blinks + Purposely prevent blinking. + + + Open-eyes + Raise eyelids to expose pupil. + + + Saccade + Move eyes rapidly between fixation points. + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + + + Move-face + Move the face or jaw. + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + + + Move-head + Move head. + + Lift-head + Tilt head back lifting chin. + + + Lower-head + Move head downward so that eyes are in a lower position. + + + Turn-head + Rotate head horizontally to look in a different direction. + + + + Move-lower-extremity + Move leg and/or foot. + + Curl-toes + Bend toes sometimes to grip. + + + Hop + Jump on one foot. + + + Jog + Run at a trot to exercise. + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + + Kick + Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + + Pedal + Move by working the pedals of a bicycle or other machine. + + + Press-foot + Move by pressing foot. + + + Run + Travel on foot at a fast pace. + + + Step + Put one leg in front of the other and shift weight onto it. + + Heel-strike + Strike the ground with the heel during a step. + + + Toe-off + Push with toe as part of a stride. + + + + Trot + Run at a moderate pace, typically with short steps. + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + + + Move-torso + Move body trunk. + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + Drop + Let or cause to fall vertically. + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + + Grasp + Seize and hold firmly. + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + + Lift + Raising something to higher position. + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + + Point + Draw attention to something by extending a finger or arm. + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + + Reach + Stretch out your arm in order to get or touch something. + + + Release + Make available or set free. + + + Retract + Draw or pull back. + + + Scratch + Drag claws or nails over a surface or on skin. + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + + Touch + Come into or be in contact with. + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + Hear + Give attention to a sound. + + + See + Direct gaze toward someone or something or in a specified direction. + + + Smell + Inhale in order to ascertain an odor or scent. + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + + Sense-by-touch + Sense something through receptors in the skin. + + + + Perform + Carry out or accomplish an action, task, or function. + + Close + Act as to blocked against entry or passage. + + + Collide-with + Hit with force when moving. + + + Halt + Bring or come to an abrupt stop. + + + Modify + Change something. + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + + Operate + Control the functioning of a machine, process, or system. + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + + Read + Interpret something that is written or printed. + + + Repeat + Make do or perform again. + + + Rest + Be inactive in order to regain strength, health, or energy. + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + Allow + Allow access to something such as allowing a car to pass. + + + Attend-to + Focus mental experience on specific targets. + + + Count + Tally items either silently or aloud. + + + Deny + Refuse to give or grant something requested or desired by someone. + + + Detect + Discover or identify the presence or existence of something. + + + Discriminate + Recognize a distinction. + + + Encode + Convert information or an instruction into a particular form. + + + Evade + Escape or avoid, especially by cleverness or trickery. + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + + Identify + Establish or indicate who or what someone or something is. + + + Imagine + Form a mental image or concept of something. + + + Judge + Evaluate evidence to make a decision or form a belief. + + + Learn + Adaptively change behavior as the result of experience. + + + Memorize + Adaptively change behavior as the result of experience. + + + Plan + Think about the activities required to achieve a desired goal. + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact informaton. + + + Recognize + Identify someone or something from having encountered them before. + + + Respond + React to something such as a treatment or a stimulus. + + + Recall + Remember information by mental effort. + + + Switch-attention + Transfer attention from one focus to another. + + + Track + Follow a person, animal, or object through space or time. + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + Biological-item + An entity that is biological, that is related to living organisms. + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + Body-part + Any part of an organism. + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + Hair + The filamentous outgrowth of the epidermis. + + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + + Eye + The organ of sight or vision. + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + + Teeth + The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + + Calf + The fleshy part at the back of the leg below the knee. + + + Foot + The structure found below the ankle joint required for locomotion. + + Big-toe + The largest toe on the inner side of the foot. + + + Heel + The back of the foot below the ankle. + + + Instep + The part of the foot between the ball and the heel on the inner side. + + + Little-toe + The smallest toe located on the outer side of the foot. + + + Toes + The terminal digits of the foot. + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + + Shin + Front part of the leg below the knee. + + + Thigh + Upper part of the leg between hip and knee. + + + + Torso + The body excluding the head and neck and limbs. + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + + Gentalia + The external organs of reproduction. + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + + Waist + The abdominal circumference at the navel. + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + Elbow + A type of hinge joint located between the forearm and upper arm. + + + Forearm + Lower part of the arm between the elbow and wrist. + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + Finger + Any of the digits of the hand. + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + + Middle-finger + The middle or third finger from the radial side of the hand. + + + Ring-finger + The fourth finger from the radial side of the hand. + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + + + Shoulder + Joint attaching upper arm to trunk. + + + Upper-arm + Portion of arm between shoulder and elbow. + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + + Human + The bipedal primate mammal Homo sapiens. + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + Character + A mark or symbol used in writing. + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + + Nonword + A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + + Phoneme + A speech sound that is distinguished by the speakers of a particular language. + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + + Syllable + A unit of spoken language larger than a phoneme. + + + Textblock + A block of text. + + + Word + A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + Geometric-object + An object or a representation that has structure and topology in space. + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + Dots + A small round mark or spot. + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + + + 2D-shape + A planar, two-dimensional shape. + + Clockface + The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Circle + A ring-shaped structure with every point equidistant from the center. + + + + Rectangle + A parallelogram with four right angles. + + Square + A square is a special rectangle with four equal sides. + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + + Triangle + A three-sided polygon. + + + + 3D-shape + A geometric three-dimensional shape. + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + + Man-made-object + Something constructed by human means. + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + Room + An area within a building enclosed by walls and floor and ceiling. + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + + Entrance + The means or place of entry. + + + Attic + A room or a space immediately below the roof of a building. + + + Basement + The part of a building that is wholly or partly below ground level. + + + + Clothing + A covering designed to be worn on the body. + + + Device + An object contrived for a specific purpose. + + Assistive-device + A device that help an individual accomplish a task. + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + + Writing-device + A device used for writing. + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + # + Value of a keyboard key. + + takesValue + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + # + Value of keypad key. + + takesValue + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + + Push-button + A switch designed to be operated by pressing a button. + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective meshwork. + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + + + + Auditory-device + A device designed to produce sound. + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + + File-storage + A device for recording digital information to a permanent media. + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + + Motion-capture + A device for recording the movement of objects or people. + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + + Measurement-device + A device in which a measure function inheres. + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + Clock-face + A location identifier based on clockface numbering or anatomic subregion. + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + + Tool + A component that is not part of a device but is designed to support its assemby or operation. + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + Letter + A written message addressed to a person or organization. + + + Note + A brief written record. + + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + + Notebook + A book for notes or memoranda. + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + + Manufactured-material + Substances created or extracted from raw materials. + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + + Glass + A brittle transparent solid with irregular atomic structure. + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + + Plastic + Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + + + Media + Media are audo/visual/audiovisual modes of communicating information for mass consumption. + + Media-clip + A short segment of media. + + Audio-clip + A short segment of audio. + + + Audiovisual-clip + A short media segment containing both audio and video. + + + Video-clip + A short segment of video. + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + + Image + Any record of an imaging event whether physical or electronic. + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + + Painting + A work produced through the art of painting. + + + Photograph + An image recorded by a camera. + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + + + Vehicle + A mobile machine which transports people or cargo. + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + + Boat + A watercraft of any size which is able to float or plane on water. + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + + Train + A connected line of railroad cars with or without a locomotive. + + + Truck + A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + Field + An unbroken expanse as of ice or grassland. + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + Environmental-sound + Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + + Instrument-sound + Sound produced by a musical instrument. + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + + Crowing + Loud shrill sounds characteristic of roosters. + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + + Mooing + Deep vocal sounds like those made by a cow. + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + + Squawking + Loud, harsh noises such as those made by geese. + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + Agent-property + Something that pertains to an agent. + + extensionAllowed + + + Agent-state + The state of the agent. + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + Alert + Condition of heightened watchfulness or preparation for action. + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + + Awake + In a non sleeping state. + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + + Passive + Not responding or initiating an action in response to a stimulus. + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + + Content + Feeling satisfaction with things as they are. + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + + Excited + Feeling great enthusiasm and eagerness. + + + Fearful + Feeling apprehension that one may be in danger. + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + + Happy + Feeling pleased and content. + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + + Joyful + Feeling delight or intense happiness. + + + Loving + Feeling a strong positive emotion of affection and attraction. + + + Relieved + No longer feeling pain, distress, anxiety, or reassured. + + + Sad + Feeling grief or unhappiness. + + + Stressed + Experiencing mental or emotional strain or tension. + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + + Sated + Feeling full. + + relatedTag + Hungry + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + + Eyes-closed + Keeping eyes closed with no blinking. + + + Eyes-open + Keeping eyes open with occasional blinking. + + + Kneeling + Positioned where one or both knees are on the ground. + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + + Sitting + In a seated position. + + + Standing + Assuming or maintaining an erect upright position. + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + Age + Length of time elapsed time since birth of the agent. + + # + + takesValue + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + + Sex + Physical properties or qualities by which male is distinguished from female. + + Female + Biological sex of an individual with female sexual organs such ova. + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + Data-marker + An indicator placed to mark something. + + Temporal-marker + An indicator placed at a particular time in the data. + + Onset + Labels the start or beginning of something, usually an event. + + topLevelTagGroup + + + + Offset + Labels the time at which something stops. + + topLevelTagGroup + + + + Pause + Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + + Time-sync + A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + # + + takesValue + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + # + + takesValue + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + # + + takesValue + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + # + + takesValue + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + # + + takesValue + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + # + + takesValue + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + + Computed-prediction + A computed extrapolation of known data. + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + + + Data-value + Designation of the type of a data item. + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + + Masked + Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. + + relatedTag + Unmasked + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + Cold + Characterized by an absence of heat. + + relatedTag + Hot + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + + Hot + Characterized by an excess of heat. + + relatedTag + Cold + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + + Loud + Characterizing a perceived high intensity of sound. + + relatedTag + Quiet + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + + Rotated + Positioned offset around an axis or center. + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + + + + Physical-value + The value of some physical property of something. + + Weight + The relative mass or the quantity of matter contained by something. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + Fraction + A numerical value between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + # + + takesValue + + + valueClass + numericClass + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + # + + takesValue + + + valueClass + numericClass + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + # + + takesValue + + + valueClass + numericClass + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + Data-maximum + The largest possible quantity or degree. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-median + The value which has an equal number of values greater and less than it. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-minimum + The smallest possible quantity. + + # + + takesValue + + + valueClass + numericClass + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + # + + takesValue + + + valueClass + numericClass + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + # + + takesValue + + + valueClass + numericClass + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + Rate-of-change + The amount of change accumulated per unit time. + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + # + + takesValue + + + unitClass + frequencyUnits + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + # + + takesValue + + + valueClass + numericClass + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + + + Temporal-rate + The number of items per unit of time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + + Spatial-value + Value of an item involving space. + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + + + Distance + A measure of the space separating two objects or points. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + X-position + The position along the x-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Y-position + The position along the y-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Z-position + The position along the z-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + Size + The physical magnitude of something. + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Width + The extent or measurement of something from side to side. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + Delay + Time during which some action is awaited. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Duration + The period of time during which something occurs or continues. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + Abrupt + Marked by sudden change. + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + + Estimated-value + Something that has been calculated or measured approximately. + + + Exact-value + A value that is viewed to the true value according to some standard. + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + + Repetitive + A recurring action that is often non-purposeful. + + + Stochastic + Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + + Varying + Differing in size, amount, degree, or nature. + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + Indoors + Located inside a building or enclosure. + + + Outdoors + Any area outside a building or shelter. + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + + Rural + Of or pertaining to the country as opposed to the city. + + + Terrain + Characterization of the physical features of a tract of land. + + Composite-terrain + Tracts of land characterized by a mixure of physical features. + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + + Grassy-terrain + Tracts of land covered by grass. + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + requireChild + + + # + + takesValue + + + valueClass + nameClass + + + + + Metadata + Data about data. Information that describes another set of data. + + CogAtlas + The Cognitive Atlas ID number of something. + + # + + takesValue + + + + + CogPo + The CogPO ID number of something. + + # + + takesValue + + + + + Creation-date + The date on which data creation of this element began. + + requireChild + + + # + + takesValue + + + valueClass + dateTimeClass + + + + + Experimental-note + A brief written record about the experiment. + + # + + takesValue + + + valueClass + textClass + + + + + Library-name + Official name of a HED library. + + # + + takesValue + + + valueClass + nameClass + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + # + + takesValue + + + valueClass + nameClass + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + # + + takesValue + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + # + + takesValue + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + # + Usually is a semantic version. + + takesValue + + + + + + Parameter + Something user-defined for this experiment. + + Parameter-label + The name of the parameter. + + # + + takesValue + + + valueClass + nameClass + + + + + Parameter-value + The value of the parameter. + + # + + takesValue + + + valueClass + textClass + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + Collection + A tag designating a grouping of items such as in a set or list. + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + tagGroup + + + # + + takesValue + + + valueClass + nameClass + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + topLevelTagGroup + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + topLevelTagGroup + + + unique + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + + Sensory-property + Relating to sensation or the physical senses. + + Sensory-attribute + A sensory characteristic associated with another entity. + + Auditory-attribute + Pertaining to the sense of hearing. + + Loudness + Perceived intensity of a sound. + + # + + takesValue + + + valueClass + numericClass + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Sound-envelope + Description of how a sound changes over time. + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + # + + takesValue + + + valueClass + labelClass + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + Bitter + Having a sharp, pungent taste. + + + Salty + Tasting of or like salt. + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + + Sour + Having a sharp, acidic taste. + + + Sweet + Having or resembling the taste of sugar. + + + + Olfactory-attribute + Having a smell. + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + + + Tactile-attribute + Pertaining to the sense of touch. + + Tactile-pressure + Having a feeling of heaviness. + + + Tactile-temperature + Having a feeling of hotness or coldness. + + + Tactile-texture + Having a feeling of roughness. + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + + Visual-attribute + Pertaining to the sense of sight. + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp + + Blue-color + CSS color group + + CadetBlue + CSS-color 0x5F9EA0 + + + SteelBlue + CSS-color 0x4682B4 + + + LightSteelBlue + CSS-color 0xB0C4DE + + + LightBlue + CSS-color 0xADD8E6 + + + PowderBlue + CSS-color 0xB0E0E6 + + + LightSkyBlue + CSS-color 0x87CEFA + + + SkyBlue + CSS-color 0x87CEEB + + + CornflowerBlue + CSS-color 0x6495ED + + + DeepSkyBlue + CSS-color 0x00BFFF + + + DodgerBlue + CSS-color 0x1E90FF + + + RoyalBlue + CSS-color 0x4169E1 + + + Blue + CSS-color 0x0000FF + + + MediumBlue + CSS-color 0x0000CD + + + DarkBlue + CSS-color 0x00008B + + + Navy + CSS-color 0x000080 + + + MidnightBlue + CSS-color 0x191970 + + + + Brown-color + CSS color group + + Cornsilk + CSS-color 0xFFF8DC + + + BlanchedAlmond + CSS-color 0xFFEBCD + + + Bisque + CSS-color 0xFFE4C4 + + + NavajoWhite + CSS-color 0xFFDEAD + + + Wheat + CSS-color 0xF5DEB3 + + + BurlyWood + CSS-color 0xDEB887 + + + Tan + CSS-color 0xD2B48C + + + RosyBrown + CSS-color 0xBC8F8F + + + SandyBrown + CSS-color 0xF4A460 + + + GoldenRod + CSS-color 0xDAA520 + + + DarkGoldenRod + CSS-color 0xB8860B + + + Peru + CSS-color 0xCD853F + + + Chocolate + CSS-color 0xD2691E + + + Olive + CSS-color 0x808000 + + + SaddleBrown + CSS-color 0x8B4513 + + + Sienna + CSS-color 0xA0522D + + + Brown + CSS-color 0xA52A2A + + + Maroon + CSS-color 0x800000 + + + + Cyan-color + CSS color group + + Aqua + CSS-color 0x00FFFF + + + Cyan + CSS-color 0x00FFFF + + + LightCyan + CSS-color 0xE0FFFF + + + PaleTurquoise + CSS-color 0xAFEEEE + + + Aquamarine + CSS-color 0x7FFFD4 + + + Turquoise + CSS-color 0x40E0D0 + + + MediumTurquoise + CSS-color 0x48D1CC + + + DarkTurquoise + CSS-color 0x00CED1 + + + + Green-color + CSS color group + + GreenYellow + CSS-color 0xADFF2F + + + Chartreuse + CSS-color 0x7FFF00 + + + LawnGreen + CSS-color 0x7CFC00 + + + Lime + CSS-color 0x00FF00 + + + LimeGreen + CSS-color 0x32CD32 + + + PaleGreen + CSS-color 0x98FB98 + + + LightGreen + CSS-color 0x90EE90 + + + MediumSpringGreen + CSS-color 0x00FA9A + + + SpringGreen + CSS-color 0x00FF7F + + + MediumSeaGreen + CSS-color 0x3CB371 + + + SeaGreen + CSS-color 0x2E8B57 + + + ForestGreen + CSS-color 0x228B22 + + + Green + CSS-color 0x008000 + + + DarkGreen + CSS-color 0x006400 + + + YellowGreen + CSS-color 0x9ACD32 + + + OliveDrab + CSS-color 0x6B8E23 + + + DarkOliveGreen + CSS-color 0x556B2F + + + MediumAquaMarine + CSS-color 0x66CDAA + + + DarkSeaGreen + CSS-color 0x8FBC8F + + + LightSeaGreen + CSS-color 0x20B2AA + + + DarkCyan + CSS-color 0x008B8B + + + Teal + CSS-color 0x008080 + + + + Gray-color + CSS color group + + Gainsboro + CSS-color 0xDCDCDC + + + LightGray + CSS-color 0xD3D3D3 + + + Silver + CSS-color 0xC0C0C0 + + + DarkGray + CSS-color 0xA9A9A9 + + + DimGray + CSS-color 0x696969 + + + Gray + CSS-color 0x808080 + + + LightSlateGray + CSS-color 0x778899 + + + SlateGray + CSS-color 0x708090 + + + DarkSlateGray + CSS-color 0x2F4F4F + + + Black + CSS-color 0x000000 + + + + Orange-color + CSS color group + + Orange + CSS-color 0xFFA500 + + + DarkOrange + CSS-color 0xFF8C00 + + + Coral + CSS-color 0xFF7F50 + + + Tomato + CSS-color 0xFF6347 + + + OrangeRed + CSS-color 0xFF4500 + + + + Pink-color + CSS color group + + Pink + CSS-color 0xFFC0CB + + + LightPink + CSS-color 0xFFB6C1 + + + HotPink + CSS-color 0xFF69B4 + + + DeepPink + CSS-color 0xFF1493 + + + PaleVioletRed + CSS-color 0xDB7093 + + + MediumVioletRed + CSS-color 0xC71585 + + + + Purple-color + CSS color group + + Lavender + CSS-color 0xE6E6FA + + + Thistle + CSS-color 0xD8BFD8 + + + Plum + CSS-color 0xDDA0DD + + + Orchid + CSS-color 0xDA70D6 + + + Violet + CSS-color 0xEE82EE + + + Fuchsia + CSS-color 0xFF00FF + + + Magenta + CSS-color 0xFF00FF + + + MediumOrchid + CSS-color 0xBA55D3 + + + DarkOrchid + CSS-color 0x9932CC + + + DarkViolet + CSS-color 0x9400D3 + + + BlueViolet + CSS-color 0x8A2BE2 + + + DarkMagenta + CSS-color 0x8B008B + + + Purple + CSS-color 0x800080 + + + MediumPurple + CSS-color 0x9370DB + + + MediumSlateBlue + CSS-color 0x7B68EE + + + SlateBlue + CSS-color 0x6A5ACD + + + DarkSlateBlue + CSS-color 0x483D8B + + + RebeccaPurple + CSS-color 0x663399 + + + Indigo + CSS-color 0x4B0082 + + + + Red-color + CSS color group + + LightSalmon + CSS-color 0xFFA07A + + + Salmon + CSS-color 0xFA8072 + + + DarkSalmon + CSS-color 0xE9967A + + + LightCoral + CSS-color 0xF08080 + + + IndianRed + CSS-color 0xCD5C5C + + + Crimson + CSS-color 0xDC143C + + + Red + CSS-color 0xFF0000 + + + FireBrick + CSS-color 0xB22222 + + + DarkRed + CSS-color 0x8B0000 + + + + Yellow-color + CSS color group + + Gold + CSS-color 0xFFD700 + + + Yellow + CSS-color 0xFFFF00 + + + LightYellow + CSS-color 0xFFFFE0 + + + LemonChiffon + CSS-color 0xFFFACD + + + LightGoldenRodYellow + CSS-color 0xFAFAD2 + + + PapayaWhip + CSS-color 0xFFEFD5 + + + Moccasin + CSS-color 0xFFE4B5 + + + PeachPuff + CSS-color 0xFFDAB9 + + + PaleGoldenRod + CSS-color 0xEEE8AA + + + Khaki + CSS-color 0xF0E68C + + + DarkKhaki + CSS-color 0xBDB76B + + + + White-color + CSS color group + + White + CSS-color 0xFFFFFF + + + Snow + CSS-color 0xFFFAFA + + + HoneyDew + CSS-color 0xF0FFF0 + + + MintCream + CSS-color 0xF5FFFA + + + Azure + CSS-color 0xF0FFFF + + + AliceBlue + CSS-color 0xF0F8FF + + + GhostWhite + CSS-color 0xF8F8FF + + + WhiteSmoke + CSS-color 0xF5F5F5 + + + SeaShell + CSS-color 0xFFF5EE + + + Beige + CSS-color 0xF5F5DC + + + OldLace + CSS-color 0xFDF5E6 + + + FloralWhite + CSS-color 0xFFFAF0 + + + Ivory + CSS-color 0xFFFFF0 + + + AntiqueWhite + CSS-color 0xFAEBD7 + + + Linen + CSS-color 0xFAF0E6 + + + LavenderBlush + CSS-color 0xFFF0F5 + + + MistyRose + CSS-color 0xFFE4E1 + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + Dark-shade + A color tone not reflecting much light. + + + Light-shade + A color tone reflecting more light. + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + # + White intensity between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + HSV-color + A color representation that models how colors appear under light. + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + # + Angular value between 0 and 360 + + takesValue + + + valueClass + numericClass + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + # + B value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + # + + takesValue + + + valueClass + numericClass + + + + + + RGB-color + A color from the RGB schema. + + RGB-red + The red component. + + # + R value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + RGB-blue + The blue component. + + # + B value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + RGB-green + The green component. + + # + G value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + + Opacity + A measure of impenetrability to light. + + + + + Sensory-presentation + The entity has a sensory manifestation. + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + + Visual-presentation + The sense of sight used in the presentation to the user. + + 2D-view + A view showing only two dimensions. + + + 3D-view + A view showing three dimensions. + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + + Satellite-view + A representation as captured by technology such as a satellite. + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + + Orienting-attention + Directing attention to a target stimulus. + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + + + Task-event-role + The purpose of an event with respect to the task. + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + + Participant-response + Something related to a participant actions in performing the task. + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + + Correction + An action offering an improvement to replace a mistake or error. + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + + Omitted-action + An expected response was skipped. + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + + + Task-stimulus-role + The role the stimulus plays in the task. + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + + Meaningful + Conveying significant or relevant information. + + + Newly-learned + Representing recently acquired information or understanding. + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + + Novel + Having no previous example or precedent or parallel. + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + + Query + A sentence of inquiry that asks for a reply. + + + Reward + A positive reinforcement for a desired action, behavior or response. + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + + Target + Something fixed as a goal, destination, or point of examination. + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + Comparative-relation + Something considered in comparison to something else. + + Approximately-equal-to + (A (Approximately-equal-to B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than + (A (Less-than B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than-or-equal-to + (A (Less-than-or-equal-to B)) indicates that the relative size or order of A is smaller than or equal to B. + + + Greater-than + (A (Greater-than B)) indicates that the relative size or order of A is bigger than that of B. + + + Greater-than-or-equal-to + (A (Greater-than-or-equal-to B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + + Equal-to + (A (Equal-to B)) indicates that the size or order of A is the same as that of B. + + + Not-equal-to + (A (Not-equal-to B)) indicates that the size or order of A is not the same as that of B. + + + + Connective-relation + Indicates two items are related in some way. + + Belongs-to + (A (Belongs-to B)) indicates that A is a member of B. + + + Connected-to + (A (Connected-to) B) indicates that A is related to B in some respect, usually through a direct link. + + + Contained-in + (A (Contained-in B)) indicates that A is completely inside of B. + + + Described-by + (A (Described-by B)) indicates that B provides information about A. + + + From-to + (A (From-to B)) indicates a directional relation from A to B. A is considered the source. + + + Group-of + (A (Group-of B)) indicates A is a group of items of type B. + + + Implied-by + (A (Implied-by B)) indicates B is suggested by A. + + + Interacts-with + (A (Interacts-with B)) indicates A and B interact, possibly reciprocally. + + + Member-of + (A (Member-of B)) indicates A is a member of group B. + + + Part-of + (A (Part-of B)) indicates A is a part of the whole B. + + + Performed-by + (A (Performed-by B)) Indicates that ction or procedure A was carried out by agent B. + + + Related-to + (A (Relative-to B)) indicates A is a part of the whole B. + + + + Directional-relation + A relationship indicating direction of change. + + Away-from + Go away from a place or object. + + + Towards + Moving in the direction of. A relation binding a relational quality or disposition to the relevant type of entity + + + + Spatial-relation + Indicating information about position. + + Above + (A (Adjacent-to B)) means A is in a place or position that is higher than B. + + + Across-from + (A (Across-from B)) means A is on the opposite side of something from B. + + + Adjacent-to + (A (Adjacent-to B)) indicates that A is next to B in time or space. + + + Ahead-of + (A (Ahead-of B)) indicates that A is further forward in time or space in B. + + + Around + (A (Around B)) means A is in or near the present place or situation of B. + + + Behind + (A (Behind B)) means A is at or to the far side of B, typically so as to be hidden by it. + + + Below + (A (Below B)) means A is in a place or position that is lower than the position of B. + + + Between + (A (Between, (B, C))) means A is in the space or interval separating B and C. + + + Bilateral-to + (A (Bilateral B)) means A is on both sides of B or affects both sides of B. + + + Bottom-edge-of + (A (Bottom-edge-of B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + + Boundary-of + (A (Boundary-of B)) means A is on or part of the edge or boundary of B. + + + Center-of + (A (Center-of B)) means A is at a point or or in an area that is approximately central within B. + + + Close-to + (A (Close-to B)) means A is at a small distance from or is located near in space to B. + + + Far-from + (A (Far-from B)) means A is at a large distance from or is not located near in space to B. + + + In-front-of + (A (In-front-of B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + + Left-edge-of + (A (Left-edge-of B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + + Left-side-of + (A (Left-side-of B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + + Lower-left-of + (A (Lower-left-of B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-right-of + Upper-left-of + Upper-right-of + + + + Lower-right-of + (A (Lower-right-of B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Upper-left-of + Upper-left-of + Lower-right-of + + + + Outside-of + (A (Outside-of B)) means A is located in the space around but not including B. + + + Over + (A (over B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + + Right-edge-of + (A (Right-edge-of B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + + Right-side-of + (A (Right-side-of B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + + To-left-of + (A (To-left-of B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + + To-right-of + (A (To-right-of B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + + Top-edge-of + (A (Top-edge-of B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + + Top-of + (A (Top-of B)) means A is on the uppermost part, side, or surface of B. + + + Upper-left-of + (A (Upper-left-of B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Lower-right-of + Upper-right-of + + + + Upper-right-of + (A (Upper-right-of B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Upper-left-of + Lower-right-of + + + + Underneath + (A (Underneath B)) means A is situated directly below and may be concealed by B. + + + Within + (A (Within B)) means A is on the inside of or contained in B. + + + + Temporal-relation + Any relationship which includes a temporal or time-based component. + + After + (A After B) means A happens at a time subsequent to a reference time related to B. + + + Asynchronous-with + (A Asynchronous-with B) means A happens at times not occurring at the same time or having the same period or phase as B. + + + Before + (A Before B) means A happens at a time earlier in time or order than B. + + + During + (A During B) means A happens at some point in a given period of time in which B is ongoing. + + + Synchronous-with + (A Synchronous-with B) means A happens at occurs at the same time or rate as B. + + + Waiting-for + (A Waiting-for B) means A pauses for something to happen in B. + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + + rad + + SIUnit + + + unitSymbol + + + + degree + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + + $ + + unitPrefix + + + unitSymbol + + + + point + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + + Hz + + SIUnit + + + unitSymbol + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. Often used for sound intensity. + + unitSymbol + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + + B + + SIUnit + + + unitSymbol + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + + inch + + + metre + + SIUnit + + + + m + + SIUnit + + + unitSymbol + + + + mile + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + + mph + + unitSymbol + + + + kph + + unitSymbol + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + + s + + SIUnit + + + unitSymbol + + + + day + + + minute + + + hour + Should be in 24-hour format. + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + + gram + + SIUnit + + + + pound + + + lb + + + + + + deca + SI unit multiple representing 10^1 + + SIUnitModifier + + + + da + SI unit multiple representing 10^1 + + SIUnitSymbolModifier + + + + hecto + SI unit multiple representing 10^2 + + SIUnitModifier + + + + h + SI unit multiple representing 10^2 + + SIUnitSymbolModifier + + + + kilo + SI unit multiple representing 10^3 + + SIUnitModifier + + + + k + SI unit multiple representing 10^3 + + SIUnitSymbolModifier + + + + mega + SI unit multiple representing 10^6 + + SIUnitModifier + + + + M + SI unit multiple representing 10^6 + + SIUnitSymbolModifier + + + + giga + SI unit multiple representing 10^9 + + SIUnitModifier + + + + G + SI unit multiple representing 10^9 + + SIUnitSymbolModifier + + + + tera + SI unit multiple representing 10^12 + + SIUnitModifier + + + + T + SI unit multiple representing 10^12 + + SIUnitSymbolModifier + + + + peta + SI unit multiple representing 10^15 + + SIUnitModifier + + + + P + SI unit multiple representing 10^15 + + SIUnitSymbolModifier + + + + exa + SI unit multiple representing 10^18 + + SIUnitModifier + + + + E + SI unit multiple representing 10^18 + + SIUnitSymbolModifier + + + + zetta + SI unit multiple representing 10^21 + + SIUnitModifier + + + + Z + SI unit multiple representing 10^21 + + SIUnitSymbolModifier + + + + yotta + SI unit multiple representing 10^24 + + SIUnitModifier + + + + Y + SI unit multiple representing 10^24 + + SIUnitSymbolModifier + + + + deci + SI unit submultiple representing 10^-1 + + SIUnitModifier + + + + d + SI unit submultiple representing 10^-1 + + SIUnitSymbolModifier + + + + centi + SI unit submultiple representing 10^-2 + + SIUnitModifier + + + + c + SI unit submultiple representing 10^-2 + + SIUnitSymbolModifier + + + + milli + SI unit submultiple representing 10^-3 + + SIUnitModifier + + + + m + SI unit submultiple representing 10^-3 + + SIUnitSymbolModifier + + + + micro + SI unit submultiple representing 10^-6 + + SIUnitModifier + + + + u + SI unit submultiple representing 10^-6 + + SIUnitSymbolModifier + + + + nano + SI unit submultiple representing 10^-9 + + SIUnitModifier + + + + n + SI unit submultiple representing 10^-9 + + SIUnitSymbolModifier + + + + pico + SI unit submultiple representing 10^-12 + + SIUnitModifier + + + + p + SI unit submultiple representing 10^-12 + + SIUnitSymbolModifier + + + + femto + SI unit submultiple representing 10^-15 + + SIUnitModifier + + + + f + SI unit submultiple representing 10^-15 + + SIUnitSymbolModifier + + + + atto + SI unit submultiple representing 10^-18 + + SIUnitModifier + + + + a + SI unit submultiple representing 10^-18 + + SIUnitSymbolModifier + + + + zepto + SI unit submultiple representing 10^-21 + + SIUnitModifier + + + + z + SI unit submultiple representing 10^-21 + + SIUnitSymbolModifier + + + + yocto + SI unit submultiple representing 10^-24 + + SIUnitModifier + + + + y + SI unit submultiple representing 10^-24 + + SIUnitSymbolModifier + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. + + boolProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + This is an updated version of the schema format. The properties are now part of the schema. The schema attributes are designed to be checked in software rather than hard-coded. The schema attributes, themselves have properties. + + + diff --git a/esbuild.cjs b/esbuild.cjs new file mode 100644 index 00000000..e33523f9 --- /dev/null +++ b/esbuild.cjs @@ -0,0 +1,48 @@ +const path = require('path') +const esbuild = require('esbuild') +const GlobalsPlugin = require('esbuild-plugin-globals') + +// Node.js target build +esbuild.build({ + entryPoints: [path.join(process.cwd(), 'index.js')], + loader: { '.xml': 'text' }, + outdir: path.join(process.cwd(), 'dist', 'commonjs'), + target: 'node12', + bundle: true, + sourcemap: true, + platform: 'node', +}) + +// Browser target build +esbuild.build({ + entryPoints: [path.join(process.cwd(), 'index.js')], + loader: { '.xml': 'text' }, + outdir: path.join(process.cwd(), 'dist', 'esm'), + bundle: true, + sourcemap: true, + format: 'esm', + define: { + global: 'globalThis', + window: 'globalThis', + crypto: 'globalThis', + os: 'globalThis', + timers: 'globalThis', + process: JSON.stringify({ + env: {}, + argv: [], + stdout: '', + stderr: '', + stdin: '', + version: 'v12.14.1', + }), + external: ['pluralize'], + }, + plugins: [ + GlobalsPlugin({ + crypto: 'globalThis', + os: 'globalThis', + timers: 'globalThis', + process: 'globalThis', + }), + ], +}) diff --git a/index.js b/index.js index 2ecf5795..d6b6aa72 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,6 @@ const converter = require('./converter') const validator = require('./validator') module.exports = { - converter: converter, - validator: validator, + converter, + validator, } diff --git a/package-lock.json b/package-lock.json index cf61f994..3d02d86b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,12 @@ "version": "3.7.1", "license": "MIT", "dependencies": { + "buffer": "^6.0.3", "date-and-time": "^0.14.2", "date-fns": "^2.17.0", + "events": "^3.3.0", "lodash": "^4.17.21", + "path": "^0.12.7", "pluralize": "^8.0.0", "semver": "^7.3.4", "then-request": "^6.0.2", @@ -19,12 +22,15 @@ }, "devDependencies": { "chai": "^4.3.6", - "eslint": "^8.15.0", + "esbuild": "^0.15.5", + "esbuild-plugin-globals": "^0.1.1", + "esbuild-runner": "^2.2.1", + "eslint": "^8.22.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "husky": "^8.0.0", - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0", + "jest": "^27.5.1", + "jest-environment-node": "^27.5.1", "prettier": "^2.6.2", "pretty-quick": "^3.1.3" }, @@ -46,42 +52,42 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", - "integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.12", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.12", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -106,13 +112,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", "dev": true, "dependencies": { - "@babel/types": "^7.17.12", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "engines": { @@ -120,12 +126,12 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, @@ -134,13 +140,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" }, @@ -161,145 +167,151 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", - "integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -345,13 +357,13 @@ "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -360,7 +372,7 @@ "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -379,9 +391,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", - "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -538,12 +550,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -553,33 +565,33 @@ } }, "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", - "integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.12", - "@babel/types": "^7.17.12", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -597,12 +609,13 @@ } }, "node_modules/@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -615,16 +628,32 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", + "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -636,9 +665,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -649,6 +678,16 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -712,60 +751,59 @@ } }, "node_modules/@jest/console": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", - "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/core": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.0.tgz", - "integrity": "sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dev": true, "dependencies": { - "@jest/console": "^28.1.0", - "@jest/reporters": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.0.2", - "jest-config": "^28.1.0", - "jest-haste-map": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-resolve-dependencies": "^28.1.0", - "jest-runner": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", - "jest-watcher": "^28.1.0", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", - "pretty-format": "^28.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -777,109 +815,85 @@ } }, "node_modules/@jest/environment": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.0.tgz", - "integrity": "sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, "dependencies": { - "@jest/fake-timers": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^28.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.0.tgz", - "integrity": "sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==", - "dev": true, - "dependencies": { - "expect": "^28.1.0", - "jest-snapshot": "^28.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.0.tgz", - "integrity": "sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==", - "dev": true, - "dependencies": { - "jest-get-type": "^28.0.2" + "jest-mock": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.0.tgz", - "integrity": "sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", - "@sinonjs/fake-timers": "^9.1.1", + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^28.1.0", - "jest-mock": "^28.1.0", - "jest-util": "^28.1.0" + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/globals": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.0.tgz", - "integrity": "sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.0", - "@jest/expect": "^28.1.0", - "@jest/types": "^28.1.0" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/reporters": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.0.tgz", - "integrity": "sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", - "@jridgewell/trace-mapping": "^0.3.7", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.3", + "glob": "^7.1.2", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-util": "^28.1.0", - "jest-worker": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "slash": "^3.0.0", + "source-map": "^0.6.0", "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^9.0.0" + "v8-to-istanbul": "^8.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -890,103 +904,90 @@ } } }, - "node_modules/@jest/schemas": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", - "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.23.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, "node_modules/@jest/source-map": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.0.2.tgz", - "integrity": "sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/test-result": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", - "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, "dependencies": { - "@jest/console": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/test-sequencer": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz", - "integrity": "sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dev": true, "dependencies": { - "@jest/test-result": "^28.1.0", + "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "slash": "^3.0.0" + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/transform": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.0.tgz", - "integrity": "sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.0", - "@jridgewell/trace-mapping": "^0.3.7", + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jest/types": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", - "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, "dependencies": { - "@jest/schemas": "^28.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.8", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -1003,44 +1004,73 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@sinclair/typebox": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", - "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", - "dev": true + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } }, "node_modules/@sinonjs/commons": { "version": "1.8.3", @@ -1052,14 +1082,23 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, "dependencies": { "@sinonjs/commons": "^1.7.0" } }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -1093,9 +1132,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" @@ -1162,9 +1201,9 @@ "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" }, "node_modules/@types/prettier": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", - "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", "dev": true }, "node_modules/@types/qs": { @@ -1179,9 +1218,9 @@ "dev": true }, "node_modules/@types/yargs": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", - "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -1193,10 +1232,38 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1214,6 +1281,27 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1347,21 +1435,22 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "node_modules/babel-jest": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", - "integrity": "sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dev": true, "dependencies": { - "@jest/transform": "^28.1.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.0.2", + "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" @@ -1384,18 +1473,18 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz", - "integrity": "sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", + "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -1422,16 +1511,16 @@ } }, "node_modules/babel-preset-jest": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz", - "integrity": "sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^28.0.2", + "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -1443,6 +1532,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1465,10 +1573,16 @@ "node": ">=8" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "funding": [ { @@ -1481,11 +1595,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" }, "bin": { "browserslist": "cli.js" @@ -1503,6 +1616,29 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1539,9 +1675,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", + "version": "1.0.30001383", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz", + "integrity": "sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg==", "dev": true, "funding": [ { @@ -1612,9 +1748,9 @@ } }, "node_modules/ci-info": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", - "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true }, "node_modules/cjs-module-lexer": { @@ -1637,7 +1773,7 @@ "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "engines": { "iojs": ">= 1.0.0", @@ -1727,6 +1863,44 @@ "node": ">= 8" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/date-and-time": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", @@ -1761,10 +1935,16 @@ } } }, + "node_modules/decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "node_modules/deep-eql": { @@ -1812,12 +1992,24 @@ } }, "node_modules/diff-sequences": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", - "integrity": "sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">=8" } }, "node_modules/doctrine": { @@ -1832,19 +2024,40 @@ "node": ">=6.0.0" } }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", + "version": "1.4.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz", + "integrity": "sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw==", "dev": true }, "node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -1874,82 +2087,550 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/esbuild": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", + "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.15.5", + "esbuild-android-64": "0.15.5", + "esbuild-android-arm64": "0.15.5", + "esbuild-darwin-64": "0.15.5", + "esbuild-darwin-arm64": "0.15.5", + "esbuild-freebsd-64": "0.15.5", + "esbuild-freebsd-arm64": "0.15.5", + "esbuild-linux-32": "0.15.5", + "esbuild-linux-64": "0.15.5", + "esbuild-linux-arm": "0.15.5", + "esbuild-linux-arm64": "0.15.5", + "esbuild-linux-mips64le": "0.15.5", + "esbuild-linux-ppc64le": "0.15.5", + "esbuild-linux-riscv64": "0.15.5", + "esbuild-linux-s390x": "0.15.5", + "esbuild-netbsd-64": "0.15.5", + "esbuild-openbsd-64": "0.15.5", + "esbuild-sunos-64": "0.15.5", + "esbuild-windows-32": "0.15.5", + "esbuild-windows-64": "0.15.5", + "esbuild-windows-arm64": "0.15.5" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", + "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "node_modules/esbuild-android-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", + "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.2.3", - "@humanwhocodes/config-array": "^0.9.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.6.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "node_modules/esbuild-darwin-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", + "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", + "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", + "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", + "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", + "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", + "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", + "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", + "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", + "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", + "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", + "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", + "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", + "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", + "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-plugin-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-globals/-/esbuild-plugin-globals-0.1.1.tgz", + "integrity": "sha512-BK0OJ02paAPJp4tGyFBum/YHerGYeRvonCRuRpkIbJemQrFHw3uWy6MEXcKgOwecAyXo3fOY5opl8ude2kHVrw==", + "dev": true, + "engines": { + "node": ">=7" + } + }, + "node_modules/esbuild-runner": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esbuild-runner/-/esbuild-runner-2.2.1.tgz", + "integrity": "sha512-VP0VfJJZiZ3cKzdOH59ZceDxx/GzBKra7tiGM8MfFMLv6CR1/cpsvtQ3IsJI3pz7HyeYxtbPyecj3fHwR+3XcQ==", + "dev": true, + "dependencies": { + "source-map-support": "0.5.19", + "tslib": "2.3.1" + }, + "bin": { + "esr": "bin/esr.js" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/esbuild-runner/node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", + "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", + "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", + "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", + "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.3", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, "bin": { @@ -2029,18 +2710,82 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "dev": true, "dependencies": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -2098,6 +2843,14 @@ "node": ">=0.10.0" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -2124,26 +2877,25 @@ "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.0.tgz", - "integrity": "sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/fast-deep-equal": { @@ -2158,6 +2910,34 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2170,6 +2950,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -2235,6 +3024,20 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2363,9 +3166,9 @@ } }, "node_modules/globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2377,12 +3180,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2414,6 +3243,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2434,6 +3275,20 @@ "node": ">=6.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -2447,6 +3302,19 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -2471,6 +3339,37 @@ "url": "https://github.com/sponsors/typicode" } }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -2542,13 +3441,13 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -2605,6 +3504,12 @@ "node": ">=0.12.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", @@ -2614,6 +3519,12 @@ "node": ">=8" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2688,9 +3599,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -2701,20 +3612,20 @@ } }, "node_modules/jest": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.0.tgz", - "integrity": "sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, "dependencies": { - "@jest/core": "^28.1.0", + "@jest/core": "^27.5.1", "import-local": "^3.0.2", - "jest-cli": "^28.1.0" + "jest-cli": "^27.5.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -2726,16 +3637,17 @@ } }, "node_modules/jest-changed-files": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.0.2.tgz", - "integrity": "sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dev": true, "dependencies": { + "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-changed-files/node_modules/execa": { @@ -2783,59 +3695,59 @@ } }, "node_modules/jest-circus": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.0.tgz", - "integrity": "sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.0", - "@jest/expect": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.0", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", - "pretty-format": "^28.1.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-cli": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.0.tgz", - "integrity": "sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dev": true, "dependencies": { - "@jest/core": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "prompts": "^2.0.1", - "yargs": "^17.3.1" + "yargs": "^16.2.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" @@ -2847,203 +3759,248 @@ } }, "node_modules/jest-config": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.0.tgz", - "integrity": "sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.0", - "@jest/types": "^28.1.0", - "babel-jest": "^28.1.0", + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.3", + "glob": "^7.1.1", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.0", - "jest-environment-node": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-runner": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.0", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "peerDependencies": { - "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, "ts-node": { "optional": true } } }, "node_modules/jest-diff": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.0.tgz", - "integrity": "sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^28.0.2", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-docblock": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.0.2.tgz", - "integrity": "sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-each": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.0.tgz", - "integrity": "sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.0", - "pretty-format": "^28.1.0" + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-environment-node": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", - "integrity": "sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dev": true, "dependencies": { - "@jest/environment": "^28.1.0", - "@jest/fake-timers": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^28.1.0", - "jest-util": "^28.1.0" + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-haste-map": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.0.tgz", - "integrity": "sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", - "@types/graceful-fs": "^4.1.3", + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.0", - "jest-worker": "^28.1.0", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-leak-detector": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz", - "integrity": "sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dev": true, "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz", - "integrity": "sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^28.1.0", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", - "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.0", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-mock": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.0.tgz", - "integrity": "sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-pnp-resolver": { @@ -3064,110 +4021,112 @@ } }, "node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.0.tgz", - "integrity": "sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, "dependencies": { + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", + "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-resolve-dependencies": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz", - "integrity": "sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.0" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runner": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.0.tgz", - "integrity": "sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dev": true, "dependencies": { - "@jest/console": "^28.1.0", - "@jest/environment": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.8.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.0.2", - "jest-environment-node": "^28.1.0", - "jest-haste-map": "^28.1.0", - "jest-leak-detector": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-resolve": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-util": "^28.1.0", - "jest-watcher": "^28.1.0", - "jest-worker": "^28.1.0", - "source-map-support": "0.5.13", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", "throat": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runtime": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.0.tgz", - "integrity": "sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.0", - "@jest/fake-timers": "^28.1.0", - "@jest/globals": "^28.1.0", - "@jest/source-map": "^28.0.2", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-mock": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-runtime/node_modules/execa": { @@ -3214,47 +4173,59 @@ "node": ">=10.17.0" } }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-snapshot": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.0.tgz", - "integrity": "sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", + "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", - "@types/babel__traverse": "^7.0.6", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.0", + "expect": "^27.5.1", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.0", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.0", - "semver": "^7.3.5" + "pretty-format": "^27.5.1", + "semver": "^7.3.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-util": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", - "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3262,24 +4233,24 @@ "picomatch": "^2.2.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-validate": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.0.tgz", - "integrity": "sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, "dependencies": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^27.5.1", "leven": "^3.1.0", - "pretty-format": "^28.1.0" + "pretty-format": "^27.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { @@ -3295,28 +4266,27 @@ } }, "node_modules/jest-watcher": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", - "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dev": true, "dependencies": { - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.0", + "jest-util": "^27.5.1", "string-length": "^4.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-worker": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.0.tgz", - "integrity": "sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "dependencies": { "@types/node": "*", @@ -3324,7 +4294,7 @@ "supports-color": "^8.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": ">= 10.13.0" } }, "node_modules/jest-worker/node_modules/supports-color": { @@ -3360,6 +4330,52 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3521,6 +4537,15 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -3614,13 +4639,13 @@ "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "node_modules/normalize-path": { @@ -3644,6 +4669,12 @@ "node": ">=8" } }, + "node_modules/nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, "node_modules/object-inspect": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", @@ -3764,6 +4795,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3797,6 +4843,15 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -3890,18 +4945,17 @@ } }, "node_modules/pretty-format": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", - "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "dependencies": { - "@jest/schemas": "^28.0.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "react-is": "^17.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -3952,6 +5006,14 @@ "node": ">=8" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3978,6 +5040,12 @@ "node": ">= 6" } }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -4011,10 +5079,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/react-is": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "node_modules/readable-stream": { @@ -4046,19 +5140,25 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4108,6 +5208,16 @@ "node": ">=10" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -4123,16 +5233,57 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -4212,9 +5363,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -4224,7 +5375,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stack-utils": { @@ -4362,6 +5513,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -4452,7 +5609,7 @@ "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "engines": { "node": ">=4" @@ -4470,6 +5627,39 @@ "node": ">=8.0" } }, + "node_modules/tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4508,6 +5698,50 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4517,11 +5751,34 @@ "punycode": "^2.1.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -4529,19 +5786,49 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", - "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" }, "engines": { "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -4551,6 +5838,44 @@ "makeerror": "1.0.12" } }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4599,18 +5924,44 @@ "dev": true }, "node_modules/write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -4631,6 +5982,12 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -4646,30 +6003,42 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { - "node": ">=12" + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } }, @@ -4685,36 +6054,36 @@ } }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.10.tgz", - "integrity": "sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", "dev": true }, "@babel/core": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.12.tgz", - "integrity": "sha512-44ODe6O1IVz9s2oJE3rZ4trNNKTX9O7KpQpfAP4t8QII/zwrVRHL7i2pxhqtcY7tqMLrrKfMlBKnm1QlrRFs5w==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", - "@babel/helper-compilation-targets": "^7.17.10", - "@babel/helper-module-transforms": "^7.17.12", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.12", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -4731,23 +6100,23 @@ } }, "@babel/generator": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.12.tgz", - "integrity": "sha512-V49KtZiiiLjH/CnIW6OjJdrenrGoyh6AmKQ3k2AZFKozC1h846Q4NYlZ5nqAigPDUXfGzC88+LOUuG8yKd2kCw==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", "dev": true, "requires": { - "@babel/types": "^7.17.12", - "@jridgewell/gen-mapping": "^0.3.0", + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } @@ -4755,13 +6124,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.17.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz", - "integrity": "sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.10", - "@babel/helper-validator-option": "^7.16.7", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", "browserslist": "^4.20.2", "semver": "^6.3.0" }, @@ -4775,112 +6144,115 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true }, "@babel/helper-function-name": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", - "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.12.tgz", - "integrity": "sha512-t5s2BeSWIghhFRPh9XMn6EIGmvn8Lmw5RVASJzkIx1mSemubQQBNIZiQD7WzaFmaHIrjAec4x8z9Yx8SjJ1/LA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.12", - "@babel/types": "^7.17.12" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-plugin-utils": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz", - "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", "dev": true }, "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/types": "^7.17.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "dev": true + }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz", - "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -4917,19 +6289,19 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -4944,9 +6316,9 @@ } }, "@babel/parser": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.12.tgz", - "integrity": "sha512-FLzHmN9V3AJIrWfOpvRlZCeVg/WLdicSnTMsLur6uDj9TT8ymUlG9XxURdW/XvuygK+2CW0poOJABdA4m/YKxA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", "dev": true }, "@babel/plugin-syntax-async-generators": { @@ -5058,39 +6430,39 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz", - "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.17.12" + "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.12.tgz", - "integrity": "sha512-zULPs+TbCvOkIFd4FrG53xrpxvCBwLIgo6tO0tJorY7YV2IWFxUfS/lXDJbGgfyYt9ery/Gxj2niwttNnB0gIw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.12", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.17.9", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.12", - "@babel/types": "^7.17.12", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -5104,12 +6476,13 @@ } }, "@babel/types": { - "version": "7.17.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.12.tgz", - "integrity": "sha512-rH8i29wcZ6x9xjzI5ILHL/yZkbQnCERdHlogKuIb4PUr7do4iT8DPekrTbBLWTnRQm6U0GYABbTMSzijmEqlAg==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -5119,16 +6492,23 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@esbuild/linux-loong64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", + "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.3.tgz", - "integrity": "sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.3.2", - "globals": "^13.9.0", + "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -5137,9 +6517,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -5147,6 +6527,12 @@ "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -5200,222 +6586,193 @@ "dev": true }, "@jest/console": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.0.tgz", - "integrity": "sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", "dev": true, "requires": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0" } }, "@jest/core": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.0.tgz", - "integrity": "sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", "dev": true, "requires": { - "@jest/console": "^28.1.0", - "@jest/reporters": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "ci-info": "^3.2.0", + "emittery": "^0.8.1", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^28.0.2", - "jest-config": "^28.1.0", - "jest-haste-map": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-resolve-dependencies": "^28.1.0", - "jest-runner": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", - "jest-watcher": "^28.1.0", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", "micromatch": "^4.0.4", - "pretty-format": "^28.1.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.0.tgz", - "integrity": "sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", "dev": true, "requires": { - "@jest/fake-timers": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^28.1.0" - } - }, - "@jest/expect": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.0.tgz", - "integrity": "sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA==", - "dev": true, - "requires": { - "expect": "^28.1.0", - "jest-snapshot": "^28.1.0" - } - }, - "@jest/expect-utils": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.0.tgz", - "integrity": "sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw==", - "dev": true, - "requires": { - "jest-get-type": "^28.0.2" + "jest-mock": "^27.5.1" } }, "@jest/fake-timers": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.0.tgz", - "integrity": "sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", "dev": true, "requires": { - "@jest/types": "^28.1.0", - "@sinonjs/fake-timers": "^9.1.1", + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", "@types/node": "*", - "jest-message-util": "^28.1.0", - "jest-mock": "^28.1.0", - "jest-util": "^28.1.0" + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" } }, "@jest/globals": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.0.tgz", - "integrity": "sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", "dev": true, "requires": { - "@jest/environment": "^28.1.0", - "@jest/expect": "^28.1.0", - "@jest/types": "^28.1.0" + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" } }, "@jest/reporters": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.0.tgz", - "integrity": "sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", - "@jridgewell/trace-mapping": "^0.3.7", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", - "glob": "^7.1.3", + "glob": "^7.1.2", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^5.1.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-util": "^28.1.0", - "jest-worker": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "slash": "^3.0.0", + "source-map": "^0.6.0", "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", "terminal-link": "^2.0.0", - "v8-to-istanbul": "^9.0.0" - } - }, - "@jest/schemas": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz", - "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.23.3" + "v8-to-istanbul": "^8.1.0" } }, "@jest/source-map": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.0.2.tgz", - "integrity": "sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.0.tgz", - "integrity": "sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", "dev": true, "requires": { - "@jest/console": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz", - "integrity": "sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", "dev": true, "requires": { - "@jest/test-result": "^28.1.0", + "@jest/test-result": "^27.5.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "slash": "^3.0.0" + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" } }, "@jest/transform": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.0.tgz", - "integrity": "sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", "dev": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.0", - "@jridgewell/trace-mapping": "^0.3.7", + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.0.tgz", - "integrity": "sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dev": true, "requires": { - "@jest/schemas": "^28.0.2", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/yargs": "^17.0.8", + "@types/yargs": "^16.0.0", "chalk": "^4.0.0" } }, @@ -5430,39 +6787,59 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "@sinclair/typebox": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz", - "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==", + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -5473,14 +6850,20 @@ } }, "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, "requires": { "@sinonjs/commons": "^1.7.0" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/babel__core": { "version": "7.1.19", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", @@ -5514,9 +6897,9 @@ } }, "@types/babel__traverse": { - "version": "7.17.1", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz", - "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.0.tgz", + "integrity": "sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -5583,9 +6966,9 @@ "integrity": "sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==" }, "@types/prettier": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", - "integrity": "sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", + "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", "dev": true }, "@types/qs": { @@ -5600,9 +6983,9 @@ "dev": true }, "@types/yargs": { - "version": "17.0.10", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz", - "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", + "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -5614,12 +6997,36 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -5627,6 +7034,21 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -5722,15 +7144,16 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "babel-jest": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.0.tgz", - "integrity": "sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", "dev": true, "requires": { - "@jest/transform": "^28.1.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.0.2", + "babel-preset-jest": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -5750,14 +7173,14 @@ } }, "babel-plugin-jest-hoist": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz", - "integrity": "sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", + "@types/babel__core": "^7.0.0", "@types/babel__traverse": "^7.0.6" } }, @@ -5782,12 +7205,12 @@ } }, "babel-preset-jest": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz", - "integrity": "sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", "dev": true, "requires": { - "babel-plugin-jest-hoist": "^28.0.2", + "babel-plugin-jest-hoist": "^27.5.1", "babel-preset-current-node-syntax": "^1.0.0" } }, @@ -5797,6 +7220,11 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5816,17 +7244,22 @@ "fill-range": "^7.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "bser": { @@ -5838,6 +7271,15 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -5865,9 +7307,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001341", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001341.tgz", - "integrity": "sha512-2SodVrFFtvGENGCv0ChVJIDQ0KPaS1cg7/qtfMaICgeMolDdo/Z2OD32F0Aq9yl6F4YFwGPBS5AaPqNYiW4PoA==", + "version": "1.0.30001383", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001383.tgz", + "integrity": "sha512-swMpEoTp5vDoGBZsYZX7L7nXHe6dsHxi9o6/LKf/f0LukVtnrxly5GVb/fWdCDTqi/yw6Km6tiJ0pmBacm0gbg==", "dev": true }, "caseless": { @@ -5913,9 +7355,9 @@ "dev": true }, "ci-info": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz", - "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", "dev": true }, "cjs-module-lexer": { @@ -5938,7 +7380,7 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "collect-v8-coverage": { @@ -6012,6 +7454,40 @@ "which": "^2.0.1" } }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + } + }, "date-and-time": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.2.tgz", @@ -6031,10 +7507,16 @@ "ms": "2.1.2" } }, + "decimal.js": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", + "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", + "dev": true + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-eql": { @@ -6070,11 +7552,20 @@ "dev": true }, "diff-sequences": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", - "integrity": "sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -6084,16 +7575,33 @@ "esutils": "^2.0.2" } }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "electron-to-chromium": { - "version": "1.4.137", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz", - "integrity": "sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA==", + "version": "1.4.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.233.tgz", + "integrity": "sha512-ejwIKXTg1wqbmkcRJh9Ur3hFGHFDZDw1POzdsVrB2WZjgRuRMHIQQKNpe64N/qh3ZtH2otEoRoS+s6arAAuAAw==", "dev": true }, "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", "dev": true }, "emoji-regex": { @@ -6120,6 +7628,203 @@ "is-arrayish": "^0.2.1" } }, + "esbuild": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", + "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", + "dev": true, + "requires": { + "@esbuild/linux-loong64": "0.15.5", + "esbuild-android-64": "0.15.5", + "esbuild-android-arm64": "0.15.5", + "esbuild-darwin-64": "0.15.5", + "esbuild-darwin-arm64": "0.15.5", + "esbuild-freebsd-64": "0.15.5", + "esbuild-freebsd-arm64": "0.15.5", + "esbuild-linux-32": "0.15.5", + "esbuild-linux-64": "0.15.5", + "esbuild-linux-arm": "0.15.5", + "esbuild-linux-arm64": "0.15.5", + "esbuild-linux-mips64le": "0.15.5", + "esbuild-linux-ppc64le": "0.15.5", + "esbuild-linux-riscv64": "0.15.5", + "esbuild-linux-s390x": "0.15.5", + "esbuild-netbsd-64": "0.15.5", + "esbuild-openbsd-64": "0.15.5", + "esbuild-sunos-64": "0.15.5", + "esbuild-windows-32": "0.15.5", + "esbuild-windows-64": "0.15.5", + "esbuild-windows-arm64": "0.15.5" + } + }, + "esbuild-android-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", + "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", + "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", + "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", + "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", + "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", + "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", + "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", + "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", + "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", + "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", + "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", + "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", + "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", + "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", + "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", + "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", + "dev": true, + "optional": true + }, + "esbuild-plugin-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/esbuild-plugin-globals/-/esbuild-plugin-globals-0.1.1.tgz", + "integrity": "sha512-BK0OJ02paAPJp4tGyFBum/YHerGYeRvonCRuRpkIbJemQrFHw3uWy6MEXcKgOwecAyXo3fOY5opl8ude2kHVrw==", + "dev": true + }, + "esbuild-runner": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/esbuild-runner/-/esbuild-runner-2.2.1.tgz", + "integrity": "sha512-VP0VfJJZiZ3cKzdOH59ZceDxx/GzBKra7tiGM8MfFMLv6CR1/cpsvtQ3IsJI3pz7HyeYxtbPyecj3fHwR+3XcQ==", + "dev": true, + "requires": { + "source-map-support": "0.5.19", + "tslib": "2.3.1" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "esbuild-sunos-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", + "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", + "dev": true, + "optional": true + }, + "esbuild-windows-32": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", + "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", + "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", + "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", + "dev": true, + "optional": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6132,14 +7837,69 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.15.0.tgz", - "integrity": "sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA==", + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.22.0.tgz", + "integrity": "sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.2.3", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -6149,14 +7909,17 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.3.3", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -6173,6 +7936,45 @@ "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + } } }, "eslint-config-prettier": { @@ -6225,12 +8027,12 @@ "dev": true }, "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.3.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.3.tgz", + "integrity": "sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==", "dev": true, "requires": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -6271,6 +8073,11 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "execa": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", @@ -6291,20 +8098,19 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expect": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.0.tgz", - "integrity": "sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", "dev": true, "requires": { - "@jest/expect-utils": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0" + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" } }, "fast-deep-equal": { @@ -6319,6 +8125,30 @@ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", "dev": true }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -6331,6 +8161,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -6384,6 +8223,17 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -6475,20 +8325,40 @@ } }, "globals": { - "version": "13.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz", - "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "requires": { "type-fest": "^0.20.2" } }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6508,6 +8378,15 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -6525,6 +8404,17 @@ "parse-cache-control": "^1.0.1" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -6540,6 +8430,16 @@ } } }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -6552,6 +8452,20 @@ "integrity": "sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==", "dev": true }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", @@ -6602,13 +8516,13 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -6647,12 +8561,24 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6714,9 +8640,9 @@ } }, "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -6724,22 +8650,23 @@ } }, "jest": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.0.tgz", - "integrity": "sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, "requires": { - "@jest/core": "^28.1.0", + "@jest/core": "^27.5.1", "import-local": "^3.0.2", - "jest-cli": "^28.1.0" + "jest-cli": "^27.5.1" } }, "jest-changed-files": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.0.2.tgz", - "integrity": "sha512-QX9u+5I2s54ZnGoMEjiM2WeBvJR2J7w/8ZUmH2um/WLAuGAYFQcsVXY9+1YL6k0H/AGUdH8pXUAv6erDqEsvIA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", "dev": true, "requires": { + "@jest/types": "^27.5.1", "execa": "^5.0.0", "throat": "^6.0.1" }, @@ -6776,202 +8703,245 @@ } }, "jest-circus": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.0.tgz", - "integrity": "sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", "dev": true, "requires": { - "@jest/environment": "^28.1.0", - "@jest/expect": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", + "expect": "^27.5.1", "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.0", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", - "pretty-format": "^28.1.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" } }, "jest-cli": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.0.tgz", - "integrity": "sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", "dev": true, "requires": { - "@jest/core": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "prompts": "^2.0.1", - "yargs": "^17.3.1" + "yargs": "^16.2.0" } }, "jest-config": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.0.tgz", - "integrity": "sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", "dev": true, "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.0", - "@jest/types": "^28.1.0", - "babel-jest": "^28.1.0", + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", - "glob": "^7.1.3", + "glob": "^7.1.1", "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.0", - "jest-environment-node": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-runner": "^28.1.0", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^28.1.0", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" } }, "jest-diff": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.0.tgz", - "integrity": "sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", "dev": true, "requires": { "chalk": "^4.0.0", - "diff-sequences": "^28.0.2", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" } }, "jest-docblock": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.0.2.tgz", - "integrity": "sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.0.tgz", - "integrity": "sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", "dev": true, "requires": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.0", - "pretty-format": "^28.1.0" + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" } }, "jest-environment-node": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.0.tgz", - "integrity": "sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", "dev": true, "requires": { - "@jest/environment": "^28.1.0", - "@jest/fake-timers": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", - "jest-mock": "^28.1.0", - "jest-util": "^28.1.0" + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" } }, "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "dev": true }, "jest-haste-map": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.0.tgz", - "integrity": "sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", "dev": true, "requires": { - "@jest/types": "^28.1.0", - "@types/graceful-fs": "^4.1.3", + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.0", - "jest-worker": "^28.1.0", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", "micromatch": "^4.0.4", "walker": "^1.0.7" } }, + "jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + } + }, "jest-leak-detector": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz", - "integrity": "sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", "dev": true, "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" } }, "jest-matcher-utils": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz", - "integrity": "sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dev": true, "requires": { "chalk": "^4.0.0", - "jest-diff": "^28.1.0", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.0" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" } }, "jest-message-util": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.0.tgz", - "integrity": "sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^28.1.0", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.0.tgz", - "integrity": "sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", "dev": true, "requires": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*" } }, @@ -6983,93 +8953,95 @@ "requires": {} }, "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", "dev": true }, "jest-resolve": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.0.tgz", - "integrity": "sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", "dev": true, "requires": { + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", + "jest-haste-map": "^27.5.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.0", - "jest-validate": "^28.1.0", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", "resolve": "^1.20.0", "resolve.exports": "^1.1.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz", - "integrity": "sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", "dev": true, "requires": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.0" + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" } }, "jest-runner": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.0.tgz", - "integrity": "sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", "dev": true, "requires": { - "@jest/console": "^28.1.0", - "@jest/environment": "^28.1.0", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", - "emittery": "^0.10.2", + "emittery": "^0.8.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^28.0.2", - "jest-environment-node": "^28.1.0", - "jest-haste-map": "^28.1.0", - "jest-leak-detector": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-resolve": "^28.1.0", - "jest-runtime": "^28.1.0", - "jest-util": "^28.1.0", - "jest-watcher": "^28.1.0", - "jest-worker": "^28.1.0", - "source-map-support": "0.5.13", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", "throat": "^6.0.1" } }, "jest-runtime": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.0.tgz", - "integrity": "sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.0", - "@jest/fake-timers": "^28.1.0", - "@jest/globals": "^28.1.0", - "@jest/source-map": "^28.0.2", - "@jest/test-result": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "requires": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "execa": "^5.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-mock": "^28.1.0", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.0", - "jest-snapshot": "^28.1.0", - "jest-util": "^28.1.0", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -7105,44 +9077,53 @@ } } }, + "jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "requires": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + } + }, "jest-snapshot": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.0.tgz", - "integrity": "sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", "dev": true, "requires": { - "@babel/core": "^7.11.6", + "@babel/core": "^7.7.2", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.0", - "@jest/transform": "^28.1.0", - "@jest/types": "^28.1.0", - "@types/babel__traverse": "^7.0.6", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^28.1.0", + "expect": "^27.5.1", "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.0", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.0", - "jest-matcher-utils": "^28.1.0", - "jest-message-util": "^28.1.0", - "jest-util": "^28.1.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^28.1.0", - "semver": "^7.3.5" + "pretty-format": "^27.5.1", + "semver": "^7.3.2" } }, "jest-util": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.0.tgz", - "integrity": "sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", "dev": true, "requires": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -7151,17 +9132,17 @@ } }, "jest-validate": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.0.tgz", - "integrity": "sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", "dev": true, "requires": { - "@jest/types": "^28.1.0", + "@jest/types": "^27.5.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", + "jest-get-type": "^27.5.1", "leven": "^3.1.0", - "pretty-format": "^28.1.0" + "pretty-format": "^27.5.1" }, "dependencies": { "camelcase": { @@ -7173,25 +9154,24 @@ } }, "jest-watcher": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.0.tgz", - "integrity": "sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", "dev": true, "requires": { - "@jest/test-result": "^28.1.0", - "@jest/types": "^28.1.0", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.0", + "jest-util": "^27.5.1", "string-length": "^4.0.1" } }, "jest-worker": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.0.tgz", - "integrity": "sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "requires": { "@types/node": "*", @@ -7225,6 +9205,41 @@ "argparse": "^2.0.1" } }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -7352,6 +9367,12 @@ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -7424,13 +9445,13 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-releases": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", - "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "normalize-path": { @@ -7448,6 +9469,12 @@ "path-key": "^3.0.0" } }, + "nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", + "dev": true + }, "object-inspect": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", @@ -7535,6 +9562,21 @@ "lines-and-columns": "^1.1.6" } }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7559,6 +9601,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -7619,15 +9667,14 @@ } }, "pretty-format": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.0.tgz", - "integrity": "sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "requires": { - "@jest/schemas": "^28.0.2", "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "react-is": "^17.0.1" }, "dependencies": { "ansi-styles": { @@ -7664,6 +9711,11 @@ } } }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -7687,6 +9739,12 @@ "sisteransi": "^1.0.5" } }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -7711,10 +9769,22 @@ "side-channel": "^1.0.4" } }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "react-is": { - "version": "18.1.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", - "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true }, "readable-stream": { @@ -7740,16 +9810,22 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dev": true, "requires": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.9.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -7783,6 +9859,12 @@ "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -7792,16 +9874,40 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -7860,9 +9966,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -7872,7 +9978,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "stack-utils": { @@ -7973,6 +10079,12 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -8050,7 +10162,7 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true }, "to-regex-range": { @@ -8062,6 +10174,33 @@ "is-number": "^7.0.0" } }, + "tough-cookie": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -8088,6 +10227,31 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8097,6 +10261,31 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8109,14 +10298,40 @@ "dev": true }, "v8-to-istanbul": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", - "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" } }, "walker": { @@ -8128,6 +10343,38 @@ "makeerror": "1.0.12" } }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8161,15 +10408,30 @@ "dev": true }, "write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -8184,6 +10446,12 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -8196,24 +10464,30 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true } } diff --git a/package.json b/package.json index 8514a0a8..60799d83 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,13 @@ "name": "hed-validator", "version": "3.7.1", "description": "A JavaScript validator for HED (Hierarchical Event Descriptor) strings.", - "main": "index.js", + "main": "./dist/commonjs/index.js", + "exports": { + ".": { + "browser": "./dist/esm/index.js", + "node": "./dist/commonjs/index.js" + } + }, "repository": { "type": "git", "url": "https://github.com/hed-standard/hed-javascript.git" @@ -11,6 +17,8 @@ "node": ">=12.12.0" }, "scripts": { + "build": "node ./esbuild.cjs", + "prepublishOnly": "npm run build", "lint": "./node_modules/eslint/bin/eslint.js ./**/*.js", "test": "./node_modules/.bin/jest", "coverage": "./node_modules/.bin/jest --coverage", @@ -26,9 +34,12 @@ }, "homepage": "https://github.com/hed-standard/hed-javascript", "dependencies": { + "buffer": "^6.0.3", "date-and-time": "^0.14.2", "date-fns": "^2.17.0", + "events": "^3.3.0", "lodash": "^4.17.21", + "path": "^0.12.7", "pluralize": "^8.0.0", "semver": "^7.3.4", "then-request": "^6.0.2", @@ -36,12 +47,15 @@ }, "devDependencies": { "chai": "^4.3.6", - "eslint": "^8.15.0", + "esbuild": "^0.15.5", + "esbuild-plugin-globals": "^0.1.1", + "esbuild-runner": "^2.2.1", + "eslint": "^8.22.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^4.0.0", "husky": "^8.0.0", - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0", + "jest": "^27.5.1", + "jest-environment-node": "^27.5.1", "prettier": "^2.6.2", "pretty-quick": "^3.1.3" }, @@ -51,9 +65,17 @@ } }, "jest": { - "testEnvironment": "node" + "testEnvironment": "node", + "transform": { + "\\.js$": "esbuild-runner/jest", + "\\.xml$": "/tests/fileTransformer.js" + } }, "browser": { "fs": false - } + }, + "type": "commonjs", + "files": [ + "dist/*" + ] } diff --git a/tests/bids.spec.js b/tests/bids.spec.js index 99144d8b..43e075d4 100644 --- a/tests/bids.spec.js +++ b/tests/bids.spec.js @@ -1,10 +1,14 @@ const assert = require('chai').assert const converterGenerateIssue = require('../converter/issues') const { generateIssue } = require('../common/issues/issues') +const { SchemaSpec, SchemasSpec } = require('../common/schema/types') +const { recursiveMap } = require('../utils/array') +const { parseSchemasSpec } = require('../validator/bids/schema') const { BidsDataset, BidsEventFile, BidsHedIssue, + BidsJsonFile, BidsIssue, BidsSidecar, validateBidsDataset, @@ -134,7 +138,92 @@ describe('BIDS datasets', () => { }, }, ], + // sub05 - HED 3 sidecars with libraries + [ + { + // Library and base and defs + event_type: { + HED: { + show_face: 'Sensory-event, ts:Visual-presentation', + left_press: 'Press, Def/My-def1, ts:Def/My-def2/3', + }, + }, + dummy_defs: { + HED: { + def1: '(Definition/My-def1, (Red, Blue))', + def2: '(ts:Definition/My-def2/#, (Green, Label/#))', + }, + }, + }, + { + // Just library no defs + event_type: { + HED: { + show_face: 'ts:Sensory-event, ts:Visual-presentation', + left_press: 'ts:Push-button', + }, + }, + }, + { + // Just base + event_type: { + HED: { + show_face: 'Sensory-event, Visual-presentation', + left_press: 'Push-button', + }, + }, + }, + { + // Just score as base + event_type: { + HED: { + show_face: 'Manual-eye-closure, Drowsiness', + left_press: 'Wicket-spikes, Frequency', + }, + }, + }, + { + // Just score as a library + event_type: { + HED: { + show_face: 'sc:Manual-eye-closure, sc:Drowsiness', + left_press: 'sc:Wicket-spikes, sc:Frequency', + }, + }, + }, + { + // Testlib with Defs as base + event_type: { + HED: { + show_face: 'Sensory-event, Visual-presentation', + left_press: 'Press, Def/My-def1, Def/My-def2/3', + }, + }, + dummy_defs: { + HED: { + def1: '(Definition/My-def1, (Red, Blue))', + def2: '(Definition/My-def2/#, (Green, Label/#))', + }, + }, + }, + { + // Testlib with defs with as library + event_type: { + HED: { + show_face: 'ts:Sensory-event, ts:Visual-presentation', + left_press: 'ts:Press, ts:Def/My-def1, ts:Def/My-def2/3', + }, + }, + dummy_defs: { + HED: { + def1: '(ts:Definition/My-def1, (ts:Red, ts:Blue))', + def2: '(ts:Definition/My-def2/#, (ts:Green, ts:Label/#))', + }, + }, + }, + ], ] + const hedColumnOnlyHeader = ['onset', 'duration', 'HED'] const bidsTsvFiles = [ // sub01 - Valid TSV-only data @@ -457,7 +546,7 @@ describe('BIDS datasets', () => { [ new BidsEventFile( '/sub05/sub05_task-test_run-1_events.tsv', - ['/sub04/sub04_task-test_run-1_events.json'], + ['/sub05/sub05_task-test_run-1_events.json'], sidecars[3][0], { headers: ['onset', 'duration', 'test', 'HED'], @@ -472,34 +561,207 @@ describe('BIDS datasets', () => { }, ), ], + // sub06 - Valid combined sidecar/TSV data with library + [ + new BidsEventFile( + '/sub06/sub06_task-test_run-1_events.tsv', + ['/sub06/sub06_task-test_run-1_events.json'], + sidecars[4][0], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][1], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][2], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][3], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][4], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][5], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + new BidsEventFile( + '/sub03/sub06_task-test_run-1_events.tsv', + ['/sub03/sub06_task-test_run-1_events.json'], + sidecars[4][6], + { + headers: ['onset', 'duration', 'event_type', 'size'], + rows: [ + ['onset', 'duration', 'event_type', 'size'], + ['7', 'n/a', 'show_face', '6'], + ['7', 'n/a', 'left_press', '7'], + ], + }, + { + relativePath: '/sub06/sub06_task-test_run-1_events.tsv', + path: '/sub06/sub06_task-test_run-1_events.tsv', + }, + ), + ], + ] + + const datasetDescriptions = [ + // Good datasetDescription.json files + [ + { Name: 'OnlyBase', BIDSVersion: '1.7.0', HEDVersion: '8.1.0' }, + { Name: 'BaseAndTest', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:testlib_1.0.2'] }, + { Name: 'OnlyTestAsLib', BIDSVersion: '1.7.0', HEDVersion: ['ts:testlib_1.0.2'] }, + { Name: 'BaseAndTwoTests', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:testlib_1.0.2', 'bg:testlib_1.0.2'] }, + { Name: 'TwoTests', BIDSVersion: '1.7.0', HEDVersion: ['ts:testlib_1.0.2', 'bg:testlib_1.0.2'] }, + { Name: 'OnlyScoreAsBase', BIDSVersion: '1.7.0', HEDVersion: 'score_0.0.1' }, + { Name: 'OnlyScoreAsLib', BIDSVersion: '1.7.0', HEDVersion: 'sc:score_0.0.1' }, + { Name: 'OnlyTestAsBase', BIDSVersion: '1.7.0', HEDVersion: 'testlib_1.0.2' }, + ], + [ + { Name: 'NonExistentLibrary', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:badlib_1.0.2'] }, + { Name: 'LeadingColon', BIDSVersion: '1.7.0', HEDVersion: [':testlib_1.0.2', '8.1.0'] }, + { Name: 'BadNickName', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 't-s:testlib_1.0.2'] }, + { Name: 'MultipleColons1', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts::testlib_1.0.2'] }, + { Name: 'MultipleColons2', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', ':ts:testlib_1.0.2'] }, + { Name: 'NoLibraryName', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:_1.0.2'] }, + { Name: 'BadVersion1', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:testlib1.0.2'] }, + { Name: 'BadVersion2', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:testlib_1.a.2'] }, + { Name: 'BadRemote1', BIDSVersion: '1.7.0', HEDVersion: ['8.1.0', 'ts:testlib_1.800.2'] }, + { Name: 'BadRemote2', BIDSVersion: '1.7.0', HEDVersion: '8.828.0' }, + ], ] + /** - * @type {object[][]} + * @type {BidsSidecar[][]} */ let bidsSidecars + /** + * @type {BidsJsonFile[][]} + */ + let bidsDatasetDescriptions + + /** + * @type {SchemasSpec} + */ + let specs + /** + * @type {SchemasSpec} + */ + let specs2 beforeAll(() => { - bidsSidecars = sidecars.map((sub_data, sub) => { - return sub_data.map((run_data, run) => { + const spec1 = new SchemaSpec('', '8.0.0') + specs = new SchemasSpec().addSchemaSpec(spec1) + const spec2 = new SchemaSpec('', '7.2.0') + specs2 = new SchemasSpec().addSchemaSpec(spec2) + bidsSidecars = sidecars.map((subData, sub) => { + return subData.map((runData, run) => { const name = `/sub0${sub + 1}/sub0${sub + 1}_task-test_run-${run + 1}_events.json` - return new BidsSidecar(name, run_data, { + return new BidsSidecar(name, runData, { relativePath: name, path: name, }) }) }) + bidsDatasetDescriptions = recursiveMap((datasetDescriptionData) => { + return new BidsJsonFile('/dataset_description.json', datasetDescriptionData, { + relativePath: '/dataset_description.json', + path: '/dataset_description.json', + }) + }, datasetDescriptions) }) /** * Validate the test datasets. - * @param {object} testDatasets The datasets to test with. - * @param {object} expectedIssues The expected issues. - * @param {object} versionSpec The schema version to test with. + * @param {Object} testDatasets The datasets to test with. + * @param {Object} expectedIssues The expected issues. + * @param {SchemasSpec} versionSpec The schema version to test with. * @return {Promise} */ const validator = (testDatasets, expectedIssues, versionSpec) => { return Promise.all( Object.entries(testDatasets).map(([datasetName, dataset]) => { + assert.property(expectedIssues, datasetName, datasetName + ' is not in expectedIssues') return validateBidsDataset(dataset, versionSpec).then((issues) => { assert.sameDeepMembers(issues, expectedIssues[datasetName], datasetName) }) @@ -507,6 +769,29 @@ describe('BIDS datasets', () => { ) } + /** + * Validate the test datasets. + * @param {Object} testDatasets The datasets to test with. + * @param {Object} expectedIssues The expected issues. + * @param {SchemasSpec} versionSpecs The schema version to test with. + * @return {Promise} + */ + const validatorWithSpecs = (testDatasets, expectedIssues, versionSpecs) => { + return Promise.all( + Object.entries(testDatasets).map(([datasetName, dataset]) => { + assert.property(expectedIssues, datasetName, datasetName + ' is not in expectedIssues') + let specs = versionSpecs + if (versionSpecs) { + assert.property(versionSpecs, datasetName, datasetName + ' is not in versionSpecs') + specs = versionSpecs[datasetName] + } + return validateBidsDataset(dataset, specs).then((issues) => { + assert.sameDeepMembers(issues, expectedIssues[datasetName], datasetName) + }) + }), + ) + } + describe('Sidecar-only datasets', () => { it('should validate non-placeholder HED strings in BIDS sidecars', () => { const goodDatasets = bidsSidecars[0] @@ -528,7 +813,7 @@ describe('BIDS datasets', () => { new BidsHedIssue(generateIssue('invalidTag', { tag: 'Confused' }), bidsSidecars[1][1].file), ], } - return validator(testDatasets, expectedIssues, { version: '8.0.0' }) + return validator(testDatasets, expectedIssues, specs) }, 10000) it('should validate placeholders in BIDS sidecars', () => { @@ -562,7 +847,7 @@ describe('BIDS datasets', () => { new BidsHedIssue(generateIssue('invalidPlaceholder', { tag: 'RGB-green/#' }), bidsSidecars[2][8].file), ], } - return validator(testDatasets, expectedIssues, { version: '8.0.0' }) + return validator(testDatasets, expectedIssues, specs) }, 10000) }) @@ -595,7 +880,7 @@ describe('BIDS datasets', () => { new BidsHedIssue(maglevWarning, badDatasets[4].file), ], } - return validator(testDatasets, expectedIssues, { version: '8.0.0' }) + return validator(testDatasets, expectedIssues, specs) }, 10000) }) @@ -655,7 +940,7 @@ describe('BIDS datasets', () => { new BidsIssue(108, badDatasets[4].file, 'purple'), ], } - return validator(testDatasets, expectedIssues, { version: '8.0.0' }) + return validator(testDatasets, expectedIssues, specs) }, 10000) }) @@ -668,7 +953,216 @@ describe('BIDS datasets', () => { const expectedIssues = { all_good: [], } - return validator(testDatasets, expectedIssues, { version: '7.2.0' }) + return validator(testDatasets, expectedIssues, specs2) }, 10000) }) + + describe('HED 3 library schema tests', () => { + let goodEvents + let goodDatasetDescriptions, badDatasetDescriptions + + beforeAll(() => { + goodEvents = bidsTsvFiles[5] + goodDatasetDescriptions = bidsDatasetDescriptions[0] + badDatasetDescriptions = bidsDatasetDescriptions[1] + }) + + describe('HED 3 library schema good tests', () => { + it('should validate HED 3 in BIDS event with json and a dataset description and no version spec', () => { + const testDatasets = { + basestd_with_std_no_defs: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[0]), + basestd_with_std_and_libtestlib_nodefs: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[1]), + basestd_with_std_and_two_libtestlibs_nodefs: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[3]), + libtestlib_with_basestd_and_libtestlib_nodefs: new BidsDataset( + [goodEvents[1]], + [], + goodDatasetDescriptions[1], + ), + libtestlib_with_basestd_and_two_libtestlibs_nodefs: new BidsDataset( + [goodEvents[1]], + [], + goodDatasetDescriptions[3], + ), + libtestlib_with_two_libtestlibs_nodefs: new BidsDataset([goodEvents[1]], [], goodDatasetDescriptions[4]), + basestd_libtestlib_with_basestd_and_libtestlib_defs: new BidsDataset( + [goodEvents[0]], + [], + goodDatasetDescriptions[1], + ), + basestd_libtestlib_with_basestd_and_two_libtestlib_defs: new BidsDataset( + [goodEvents[0]], + [], + goodDatasetDescriptions[3], + ), + basescore_with_basescore_no_defs: new BidsDataset([goodEvents[3]], [], goodDatasetDescriptions[5]), + libscore_with_libscore_nodefs: new BidsDataset([goodEvents[4]], [], goodDatasetDescriptions[6]), + basetestlib_with_basetestlib_with_defs: new BidsDataset([goodEvents[5]], [], goodDatasetDescriptions[7]), + libtestlib_with_basestd_and_libtestlib_with_defs: new BidsDataset( + [goodEvents[6]], + [], + goodDatasetDescriptions[1], + ), + libtestlib_with_libtestlib_with_defs: new BidsDataset([goodEvents[6]], [], goodDatasetDescriptions[2]), + libtestlib_with_basestd_and_two_libtestlib_with_defs: new BidsDataset( + [goodEvents[6]], + [], + goodDatasetDescriptions[3], + ), + libtestlib_with_two_libtestlib_with_defs: new BidsDataset([goodEvents[6]], [], goodDatasetDescriptions[4]), + } + const expectedIssues = { + basestd_with_std_no_defs: [], + basestd_with_std_and_libtestlib_nodefs: [], + basestd_with_std_and_two_libtestlibs_nodefs: [], + libtestlib_with_basestd_and_libtestlib_nodefs: [], + libtestlib_with_basestd_and_two_libtestlibs_nodefs: [], + libtestlib_with_two_libtestlibs_nodefs: [], + basestd_libtestlib_with_basestd_and_libtestlib_defs: [], + basestd_libtestlib_with_basestd_and_two_libtestlib_defs: [], + basescore_with_basescore_no_defs: [], + libscore_with_libscore_nodefs: [], + basetestlib_with_basetestlib_with_defs: [], + libtestlib_with_basestd_and_libtestlib_with_defs: [], + libtestlib_with_libtestlib_with_defs: [], + libtestlib_with_basestd_and_two_libtestlib_with_defs: [], + libtestlib_with_two_libtestlib_with_defs: [], + } + return validator(testDatasets, expectedIssues, null) + }, 10000) + }) + + describe('HED 3 library schema bad tests', () => { + it('should not validate when library schema specifications are invalid', () => { + const testDatasets = { + unknown_library: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[0]), + leading_colon: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[1]), + bad_nickname: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[2]), + multipleColons1: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[3]), + multipleColons2: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[4]), + noLibraryName: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[5]), + badVersion1: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[6]), + badVersion2: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[7]), + badRemote1: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[8]), + badRemote2: new BidsDataset([goodEvents[2]], [], badDatasetDescriptions[9]), + } + + const expectedIssues = { + unknown_library: [ + new BidsHedIssue( + generateIssue('remoteSchemaLoadFailed', { + spec: JSON.stringify(new SchemaSpec('ts', '1.0.2', 'badlib')), + error: + 'Server responded to https://raw.githubusercontent.com/hed-standard/hed-schema-library/main/library_schemas/badlib/hedxml/HED_badlib_1.0.2.xml with status code 404:\n404: Not Found', + }), + badDatasetDescriptions[0].file, + ), + ], + leading_colon: [ + new BidsHedIssue( + generateIssue('invalidSchemaNickname', { nickname: '', spec: ':testlib_1.0.2' }), + badDatasetDescriptions[1].file, + ), + ], + bad_nickname: [ + new BidsHedIssue( + generateIssue('invalidSchemaNickname', { nickname: 't-s', spec: 't-s:testlib_1.0.2' }), + badDatasetDescriptions[2].file, + ), + ], + multipleColons1: [ + new BidsHedIssue( + generateIssue('invalidSchemaSpecification', { spec: 'ts::testlib_1.0.2' }), + badDatasetDescriptions[3].file, + ), + ], + multipleColons2: [ + new BidsHedIssue( + generateIssue('invalidSchemaSpecification', { spec: ':ts:testlib_1.0.2' }), + badDatasetDescriptions[4].file, + ), + ], + noLibraryName: [ + new BidsHedIssue( + generateIssue('invalidSchemaSpecification', { spec: 'ts:_1.0.2' }), + badDatasetDescriptions[5].file, + ), + ], + badVersion1: [ + new BidsHedIssue( + generateIssue('invalidSchemaSpecification', { spec: 'ts:testlib1.0.2' }), + badDatasetDescriptions[6].file, + ), + ], + badVersion2: [ + new BidsHedIssue( + generateIssue('invalidSchemaSpecification', { spec: 'ts:testlib_1.a.2' }), + badDatasetDescriptions[7].file, + ), + ], + badRemote1: [ + new BidsHedIssue( + generateIssue('remoteSchemaLoadFailed', { + spec: JSON.stringify(new SchemaSpec('ts', '1.800.2', 'testlib')), + error: + 'Server responded to https://raw.githubusercontent.com/hed-standard/hed-schema-library/main/library_schemas/testlib/hedxml/HED_testlib_1.800.2.xml with status code 404:\n404: Not Found', + }), + badDatasetDescriptions[8].file, + ), + ], + badRemote2: [ + new BidsHedIssue( + generateIssue('remoteSchemaLoadFailed', { + spec: JSON.stringify(new SchemaSpec('', '8.828.0', '')), + error: + 'Server responded to https://raw.githubusercontent.com/hed-standard/hed-specification/master/hedxml/HED8.828.0.xml with status code 404:\n404: Not Found', + }), + badDatasetDescriptions[9].file, + ), + ], + } + return validator(testDatasets, expectedIssues, null) + }, 10000) + }) + + describe('HED 3 library schema with version spec', () => { + it('should validate HED 3 in BIDS event files sidecars and libraries using version spec', () => { + const [specs0] = parseSchemasSpec(['8.1.0']) + const [specs1] = parseSchemasSpec(['8.1.0', 'ts:testlib_1.0.2']) + const [specs2] = parseSchemasSpec(['ts:testlib_1.0.2']) + const [specs3] = parseSchemasSpec(['8.1.0', 'ts:testlib_1.0.2', 'bg:testlib_1.0.2']) + const [specs4] = parseSchemasSpec(['ts:testlib_1.0.2', 'bg:testlib_1.0.2']) + const testDatasets1 = { + library_and_defs_base_ignored: new BidsDataset([goodEvents[0]], [], goodDatasetDescriptions[1]), + library_and_defs_no_base: new BidsDataset([goodEvents[0]], [], goodDatasetDescriptions[3]), + library_only_with_extra_base: new BidsDataset([goodEvents[1]], [], goodDatasetDescriptions[1]), + library_only: new BidsDataset([goodEvents[1]], [], goodDatasetDescriptions[1]), + just_base2: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[0]), + library_not_needed1: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[1]), + library_not_needed2: new BidsDataset([goodEvents[2]], [], goodDatasetDescriptions[3]), + library_and_base_with_extra_schema: new BidsDataset([goodEvents[0]], [], goodDatasetDescriptions[1]), + } + const expectedIssues1 = { + library_and_defs_base_ignored: [], + library_and_defs_no_base: [], + library_only_with_extra_base: [], + library_only: [], + just_base2: [], + library_not_needed1: [], + library_not_needed2: [], + library_and_base_with_extra_schema: [], + } + const schemaSpecs = { + library_and_defs_base_ignored: specs1, + library_and_defs_no_base: specs3, + library_only_with_extra_base: specs1, + library_only: specs1, + just_base2: specs0, + library_not_needed1: specs1, + library_not_needed2: specs3, + library_and_base_with_extra_schema: specs1, + } + return validatorWithSpecs(testDatasets1, expectedIssues1, schemaSpecs) + }, 10000) + }) + }) }) diff --git a/tests/data/HED_score_0.0.1.xml b/tests/data/HED_score_0.0.1.xml new file mode 100644 index 00000000..f83321ae --- /dev/null +++ b/tests/data/HED_score_0.0.1.xml @@ -0,0 +1,3217 @@ + + + This schema is Hierarchical Event Descriptors (HED) Library Schema implementation for Standardized Computer-based Organized Reporting of EEG: SCORE based on the first official release that includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. +Data sharing using standard definitions enables applications of automated tools to optimize analyses, reduce errors, and ultimately to advance the understanding of the human brain. +This implementation of SCORE in an open-source, machine-readable format using HED to enables its use in machine analysis and mega-analysis. +Reference: +[1] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE." Epilepsia 54.6 (2013) +[2] Beniczky, Sandor, et al. "Standardized computer based organized reporting of EEG: SCORE second version." Clinical Neurophysiology 128.11 (2017) + + + Modulators + External stimuli / interventions or changes in the alertness level (sleep) that modify: the background activity, or how often a graphoelement is occurring, or change other features of the graphoelement (like intra-burst frequency). + + Intermittent-photic-stimulation + + # + + takesValue + + + + + Hyperventilation + + Quality-of-hyperventilation + + Refused + + + Poor-effort + + + Good-effort + + + Excellent-effort + + + + + Sleep-deprivation + + # + + takesValue + + + + + Sleep-following-sleep-deprivation + + # + + takesValue + + + + + Natural-sleep + + # + + takesValue + + + + + Induced-sleep + + # + + takesValue + + + + + Drowsiness + + # + + takesValue + + + + + Awakening + + # + + takesValue + + + + + Medication-administered-during-recording + + # + + takesValue + + + + + Medication-withdrawal-or-reduction-during-recording + + # + + takesValue + + + + + Manual-eye-closure + + # + + takesValue + + + + + Manual-eye-opening + + # + + takesValue + + + + + Auditory-stimulation + + # + + takesValue + + + + + Nociceptive-stimulation + + # + + takesValue + + + + + Physical-effort + + # + + takesValue + + + + + Cognitive-tasks + + # + + takesValue + + + + + Other-modulators-and-procedures + + # + + takesValue + + + + + + Background-activity + An EEG activity representing the setting in which a given normal or abnormal pattern appears and from which such pattern is distinguished. + + Posterior-dominant-rhythm + Rhythmic activity occurring during wakefulness over the posterior regions of the head, generally with maximum amplitudes over the occipital areas. Amplitude varies. Best seen with eyes closed and during physical relaxation and relative mental inactivity. Blocked or attenuated by attention, especially visual, and mental effort. In adults this is the alpha rhythm, and the frequency is 8 to 13 Hz. However the frequency can be higher or lower than this range (often a supra or sub harmonic of alpha frequency) and is called alpha variant rhythm (fast and slow alpha variant rhythm). In children, the normal range of the frequency of the posterior dominant rhythm is age-dependant. + + + Mu-rhythm + EEG rhythm at 7-11 Hz composed of arch-shaped waves occurring over the central or centro-parietal regions of the scalp during wakefulness. Amplitudes varies but is mostly below 50 microV. Blocked or attenuated most clearly by contralateral movement, thought of movement, readiness to move or tactile stimulation. + + + Other-organized-rhythms + EEG activity that consisting of waves of approximately constant period, which is considered as part of the background (ongoing) activity, but does not fulfil the criteria of the posterior dominant rhythm. + + + Special-features + Special Features. + + Continuous-background-activity + + + Nearly-continuous-background-activity + + + Discontinuous-background-activity + + + Background-Burst-suppression + EEG pattern consisting of bursts (activity appearing and disappearing abruptly) interrupted by periods of low amplitude (below 20 microV) and which occurs simultaneously over all head regions. + + + Background-sBurst-attenuation + + + Suppression + Periods showing activity under 10 microV (referential montage) and interrupting the background (ongoing) activity. + + + Electrocerebral-inactivity + Absence of any ongoing cortical electric activities; in all leads EEG is isoelectric or only contains artefacts. Sensitivity has to be increased up to 2 microV/mm; recording time: at least 30 minutes. + + + + + Sleep-drowsiness + The features of the ongoing activity during sleep are scored here. If abnormal graphoelements appear, disappear or change their morphology during sleep, that is not scored here but at the entry corresponding to that graphooelement (as a modulator). + + Sleep-architecture + Only to be scored if whole-night sleep is part of the recording. It is a global descriptor of the structure and pattern of sleep: estimation of the amount of time spent in REM and NREM sleep, sleep duration, NREM-REM cycle. Used with Findings-attributes tags + + + Sleep-stage-reached + For normal sleep patterns the sleep stages reached during the recording can be specified + + N1 + Sleep stage 1 + + + N2 + Sleep stage 2 + + + N3 + Sleep stage 3 + + + REM + Rapid eye movement + + + + Sleep-spindles + Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 microV in the adult. Used with Findings-attributes tags + + + Vertex-waves + Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 microV. Abbreviation: V wave. Synonym: vertex sharp wave. Used with Findings-attributes tags + + + K-complexes + A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during nonREM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. Used with Findings-attributes tags + + + Saw-tooth-waves + Used with Findings-attributes tags + + + POSTS + Positive occipital sharp transients of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 microV. Used with Findings-attributes tags + + + Hypnagogic-hypersynchrony + Bursts of bilateral, synchronous delta or theta activity of large amplitude, occasionally with superimposed faster components, occurring during falling asleep or during awakening, in children. Used with Findings-attributes tags + + + Non-reactive-sleep + EEG activity consisting of normal sleep graphoelemts, but which cannot be interrupted by external stimuli/ the patient cannot be waken. Used with Findings-attributes tags + + + + Interictal-findings + EEG patterns / transients that are distinguished form the background activity, considered abnormal, but are not recorded during ictal period (seizure) or postictal period; the presence of interictal findings does not necessarily imply that the patient has epilepsy. + + Epileptiform-interictal-activity + + + Abnormal-interictal-rhythmic-activity + + + Special-patterns + + PDs + Periodic discharges not further specified (PDs). + + + Extreme-delta-brush + + + Burst-suppression + + + Burst-attenuation + + + + + Episodes + Clinical episodes or electrographic seizures. + + Epileptic-seizure + + Focal-onset + + Aware + + + Impaired-awareness + + + Awareness-unknown + + + Focal-to-bilateral-tonic-clonic + + + + Generalized-onset + + + Unknown-onset + + + Unclassified + + + + Subtle-seizure + Seizure type frequent in neonates, sometimes referred to as motor automatisms; they may include random and roving eye movements, sucking, chewing motions, tongue protrusion, rowing or swimming or boxing movements of the arms, pedaling and bycicling movements of the lower limbs; apneic seizures are relatively common. Although some subtle seizures are associated with rhythmic ictal EEG discharges , and are clearly epileptic, ictal EEG often does not show typical epileptic activity + + + Electrographic-seizure + Referred usually to non convulsive status. Ictal EEG: rhythmic discharge or spike and wave pattern with definite evolution in frequency, location, or morphology lasting at least 10 s; evolution in amplitude alone did not qualify + + + PNES + Psychogenic nonepileptic seizure + + + Sleep-related-episodes + + Arousal + Normal + + + Benign-sleep-myoclonus + A distinctive disorder of sleep characterized by a) neonatal onset, b) rhythmic myoclonic jerks only during sleep and c) abrupt and consistent cessation with arousal, d) absence of concomitant electrographic changes suggestive of seizures, and e) good outcome. + + + Confusional-awakening + Episodes of non epileptic nature included in NREM parasomnias, characterized by sudden arousal and complex behavior but without full alertness, usually lasting a few minutes and occurring almost in all children at least occasionally. Amnesia of the episode is the rule. + + + Sleep-PLMS + Periodic limb movement in sleep. Episodes characterized by brief (0.5- to 5.0-second) lower-extremity movements during sleep, which typically occur at 20- to 40-second intervals, most commonly during the first 3 hours of sleep. The affected individual is usually not aware of the movements or of the transient partial arousals. + + + RBD + REM sleep behavioral disorder. Episodes characterized by: a) presence of REM sleep without atonia (RSWA) on polysomnography (PSG); b) presence of at least 1 of the following conditions - (1) Sleep-related behaviors, by history, that have been injurious, potentially injurious, or disruptive (example: dream enactment behavior); (2) abnormal REM sleep behavior documented during PSG monitoring; (3) absence of epileptiform activity on electroencephalogram (EEG) during REM sleep (unless RBD can be clearly distinguished from any concurrent REM sleep-related seizure disorder); (4) sleep disorder not better explained by another sleep disorder, a medical or neurologic disorder, a mental disorder, medication use, or a substance use disorder. + + + Sleep-walking + Episodes characterized by ambulation during sleep; the patient is difficult to arouse during an episode, and is usually amnesic following the episode. Episodes usually occur in the first third of the night during slow wave sleep. Polysomnographic recordings demonstrate 2 abnormalities during the first sleep cycle: frequent, brief, nonbehavioral EEG-defined arousals prior to the somnambulistic episode and abnormally low gamma (0.75-2.0 Hz) EEG power on spectral analysis, correlating with high-voltage (hypersynchronic gamma) waves lasting 10 to 15 s occurring just prior to the movement. This is followed by stage I NREM sleep, and there is no evidence of complete awakening. + + + + Pediatric-episodes + + Hyperekplexia + Disorder characterized by exaggerated startle response and hypertonicity that may occur during the first year of life and in severe cases during the neonatal period. Children usually present with marked irritability and recurrent startles in response to handling and sounds. Severely affected infants can have severe jerks and stiffening, sometimes with breathholding spells. + + + Jactatio-capitis-nocturna + Relatively common in normal children at the time of going to bed, especially during the first year of life, the rhythmic head movements persist during sleep. Usually, these phenomena disappear before 3 years of age. + + + Pavor-nocturnus + Nocturnal episodes characterized by age of onset of less than five years (mean age 18 months, with peak prevalence at five to seven years), appearance of signs of panic two hours after falling asleep with crying, screams, a fearful expression, inability to recognize other people including parents (for a duration of 5-15 minutes), amnesia upon awakening. Pavor nocturnus occurs in patients almost every night for months or years (but the frequency is highly variable and may be as low as once a month) and is likely to disappear spontaneously at the age of six to eight years. + + + Stereotypical-behavior + Repetitive motor behavior in children, typically rhythmic and persistent; usually not paroxysmal and rarely suggest epilepsy. They include headbanging, head-rolling, jactatio capitis nocturna, body rocking, buccal or lingual movements, hand flapping and related mannerisms, repetitive hand-waving (to self-induce photosensitive seizures). + + + + Paroxysmal-motor-event + Paroxysmal phenomena during neonatal or childhood periods characterized by recurrent motor or behavioural signs or symptoms that must be distinguishes from epileptic disorders. + + + Syncope + Episode with loss of consciousness and muscle tone that is abrupt in onset, of short duration and followed by rapid recovery; it occurs in response to transient impairment of cerebral perfusion. Typical prodromal symptoms often herald onset of syncope and postictal symptoms are minimal. Syncopal convulsions resulting from cerebral anoxia are common but are not a form of epilepsy, nor are there any accompanying EEG ictal discharges. + + + Cataplexy + A sudden decrement in muscle tone and loss of deep tendon reflexes, leading to muscle weakness, paralysis, or postural collapse. Cataplexy usually is precipitated by an outburst of emotional expression-notably laughter, anger, or startle. It is one of the tetrad of symptoms of narcolepsy. During cataplexy, respiration and voluntary eye movements are not compromised. Consciousness is preserved. + + + Other-episodes + + # + free text + + takesValue + + + + + + Physiologic-patterns + EEG graphoelements or rhythms that are considered normal. They only should be scored if the physician considers that they have a specific clinical significance for the recording. + + Rhythmic-activity-patterns + Not further specified + + + Slow-alpha-variant-rhythm + Characteristic rhythms mostly at 4-5 Hz, recorded most prominently over the posterior regions of the head. Generally alternate, or are intermixed, with alpha rhythm to which they often are harmonically related. Amplitude varies but is frequently close to 50 micro V. Blocked or attenuated by attention, especially visual, and mental effort. Comment: slow alpha variant rhythms should be distinguished from posterior slow waves characteristic of children and adolescents and occasionally seen in young adults. + + + Fast-alpha-variant-rhythm + Characteristic rhythm at 14-20 Hz, detected most prominently over the posterior regions of the head. May alternate or be intermixed with alpha rhythm. Blocked or attenuated by attention, especially visual, and mental effort. + + + Ciganek-rhythm + + + Lambda-wave + Diphasic sharp transient occurring over occipital regions of the head of waking subjects during visual exploration. The main component is positive relative to other areas. Timelocked to saccadic eye movement. Amplitude varies but is generally below 50 micro V. + + + Posterior-slow-waves-youth + Waves in the delta and theta range, of variable form, lasting 0.35 to 0.5 s or longer without any consistent periodicity, found in the range of 6-12 years (occasionally seen in young adults). Alpha waves are almost always intermingled or superimposed. Reactive similar to alpha activity. + + + Diffuse-slowing-hyperventilation + Diffuse slowing induced by hyperventilation. Bilateral, diffuse slowing during hyperventilation. Recorded in 70 precent of normal children (3-5 years) and less then 10 precent of adults. Usually appear in the posterior regions and spread forward in younger age group, whereas they tend to appear in the frontal regions and spread backward in the older age group. + + + Photic-driving + Physiologic response consisting of rhythmic activity elicited over the posterior regions of the head by repetitive photic stimulation at frequencies of about 5-30 Hz. Comments: term should be limited to activity time-locked to the stimulus and of frequency identical or harmonically related to the stimulus frequency. Photic driving should be distinguished from the visual evoked potentials elicited by isolated flashes of light or flashes repeated at very low frequency. + + + Photomyogenic-response + A response to intermittent photic stimulation characterized by the appearance in the record of brief, repetitive muscular artifacts (spikes) over the anterior regions of the head. These often increase gradually in amplitude as stimuli are continued and cease promptly when the stimulus is withdrawn. Comment: this response is frequently associated with flutter of the eyelids and vertical oscillations of the eyeballs and sometimes with discrete jerking mostly involving the musculature of the face and head. (Preferred to synonym: photomyoclonic response). + + + Arousal-pattern + Arousal pattern in children. Prolonged, marked high voltage 4-6/s activity in all leads with some intermixed slower frequencies, in children. + + + Sleep-spindles-patterns + Burst at 11-15 Hz but mostly at 12-14 Hz generally diffuse but of higher voltage over the central regions of the head, occurring during sleep. Amplitude varies but is mostly below 50 micro V in the adult. + + + Vertex-wave + Vertex sharp transient. Sharp potential, maximal at the vertex, negative relative to other areas, apparently occurring spontaneously during sleep or in response to a sensory stimulus during sleep or wakefulness. May be single or repetitive. Amplitude varies but rarely exceeds 250 micro V. Abbreviation: V wave. Synonym: vertex sharp wave. + + + K-complex + A burst of somewhat variable appearance, consisting most commonly of a high voltage negative slow wave followed by a smaller positive slow wave frequently associated with a sleep spindle. Duration greater than 0.5 s. Amplitude is generally maximal in the frontal vertex. K complexes occur during non-REM sleep, apparently spontaneously, or in response to sudden sensory / auditory stimuli, and are not specific for any individual sensory modality. + + + POSTS-pattern + Positive occipital sharp transient of sleep. Sharp transient maximal over the occipital regions, positive relative to other areas, apparently occurring spontaneously during sleep. May be single or repetitive. Amplitude varies but is generally bellow 50 micro V. + + + Frontal-arousal-rhythm + Prolonged (up to 20s) rhythmical sharp or spiky activity over the frontal areas (maximum over the frontal midline) seen at arousal from sleep in children with minimal cerebral dysfunction. + + + Other-physiologic-patterns + + + + Uncertain-significant-patterns + EEG graphoelements or rhythms that resemble abnormal patterns but that are not necessarily associated with a pathology, and the physician does not consider them abnormal in the context of the scored recording (like normal variants and patterns). + + Sharp-transient-pattern + + + Wicket-spikes + Spike-like monophasic negative single waves or trains of waves occurring over the temporal regions during drowsiness that have an arcuate or mu-like appearance. These are mainly seen in older individuals and represent a benign variant that is of little clinical significance. + + + Small-sharp-spikes + Benign Epileptiform Transients of Sleep (BETS). Small sharp spikes (SSS) of very short duration and low amplitude, often followed by a small theta wave, occurring in the temporal regions during drowsiness and light sleep. They occur on one or both sides (often asynchronously). The main negative and positive components are of about equally spiky character. Rarely seen in children, they are seen most often in adults and the elderly. Two thirds of the patients have a history of epileptic seizures. + + + Fourteen-six-Hz-positive-burst + Burst of arch-shaped waves at 13-17 Hz and/or 5-7-Hz but most commonly at 14 and or 6 Hz seen generally over the posterior temporal and adjacent areas of one or both sides of the head during sleep. The sharp peaks of its component waves are positive with respect to other regions. Amplitude varies but is generally below 75 micro V. Comments: (1) best demonstrated by referential recording using contralateral earlobe or other remote, reference electrodes. (2) This pattern has no established clinical significance. + + + Six-Hz-spike-slow-wave + Spike and slow wave complexes at 4-7Hz, but mostly at 6 Hz occurring generally in brief bursts bilaterally and synchronously, symmetrically or asymmetrically, and either confined to or of larger amplitude over the posterior or anterior regions of the head. The spike has a strong positive component. Amplitude varies but is generally smaller than that of spike-andslow-wave complexes repeating at slower rates. Comment: this pattern should be distinguished from epileptiform discharges. Synonym: wave and spike phantom. + + + Rudimentary-spike-wave-complex + Synonym: Pseudo petit mal discharge. Paroxysmal discharge that consists of generalized or nearly generalized high voltage 3 to 4/sec waves with poorly developed spike in the positive trough between the slow waves, occurring in drowsiness only. It is found only in infancy and early childhood when marked hypnagogic rhythmical theta activity is paramount in the drowsy state. + + + Slow-fused-transient + A posterior slow-wave preceded by a sharp-contoured potential that blends together with the ensuing slow wave, in children. + + + Needle-like-occipital-spikes-blind + Spike discharges of a particularly fast and needle-like character develop over the occipital region in most congenitally blind children. Completely disappear during childhood or adolescence. + + + SREDA + Subclinical rhythmic EEG discharge of adults. A rhythmic pattern seen in the adult age group, mainly in the waking state or drowsiness. Itconsists of a mixture of frequencies, often predominant in the theta range. The onset may be fairly abrupt with widespread sharp rhythmical theta and occasionally with delta activity. As to the spatial distribution, a maximum of this discharge is usually found over the centroparietal region and especially over the vertex. It may resemble a seizure discharge but is not accompanied by any clinical signs or symptoms. + + + RTTD + Rhythmic temporal theta burst of drowsiness. Characteristic burst of 4-7 Hz waves frequently notched by faster waves, occurring over the temporal regions of the head during drowsiness. Synonym: psychomotor variant pattern. Comment: this is a pattern of drowsiness that is of no clinical significance. + + + Temporal-slowing-elderly + Focal theta and/or delta activity over the temporal regions, especially the left, in persons over the age of 60. Amplitudes are low/ similar to the background activity. Comment: focal temporal theta was found in 20 precent of people between the ages of 40-59 years, and 40 precent of people between 60 and 79 years. One third of people older than 60 years had focal temporal delta activity. + + + Breach-rhythm + Rhythmical activity recorded over cranial bone defects. Usually it is in the 6 to 11/sec range, does not respond to movements. + + + Other-uncertain-significant-patterns + + + + EEG-artifacts + When relevant for the clinical interpretation, artifacts can be scored by specifying the type and the location. + + Biological-artifacts + Used with Findings-property/ tags + + Eye-blinks + Fp1/Fp2 become electropositive with eye closure because the cornea is positively charged causing a negative deflection in Fp1/Fp2. If the eye blink is unilateral, consider prosthetic eye. If it is in F8 rather than Fp2 then the electrodes are plugged in wrong. + + + Eye-movements-horizontal + There is an upward deflection in the Fp2-F8 derivation, when the eyes move to the right side. In this case F8 becomes more positive and therefore. When the eyes move to the left, F7 becomes more positive and there is an upward deflection in the Fp1-F7 derivation. + + + Eye-movements-vertical + The EEG shows positive potentials (50-100 micro V) with bifrontal distribution, maximum at Fp1 and Fp2, when the eyeball rotated upward. The downward rotation of the eyeball was associated with the negative deflection. The time course of the deflections was similar to the time course of the eyeball movement. + + + Slow-eye-movements + Slow, rolling eye-movements, seen during drowsiness. + + + Chewing-artifact + + + Sucking-artifact + + + Glossokinetic-artifact + The tongue functions as a dipole, with the tip negative with respect to the base. The artifact produced by the tongue has a broad potential field that drops from frontal to occipital areas, although it is less steep than that produced by eye movement artifacts. The amplitude of the potentials is greater inferiorly than in parasagittal regions; the frequency is variable but usually in the delta range. Chewing and sucking can produce similar artifacts. + + + Rocking-patting-artifact + Quasi-rhythmical artefacts in recordings from infants caused by rocking/ patting. + + + Movement-artifact + Large amplitude artifact, with irregular morphology (usually resembling a slow-wave or a wave with complex morphology) seen in one or several channels, due to movement. If the causing movement is repetitive, the artifact might resemble a rhythmic EEG activity. + + + Respiration-artifact + Respiration can produce 2 kinds of artifacts. One type is in the form of slow and rhythmic activity, synchronous with the body movements of respiration and mechanically affecting the impedance of (usually) one electrode. The other type can be slow or sharp waves that occur synchronously with inhalation or exhalation and involve those electrodes on which the patient is lying. + + + Pulse-artifact + Occurs when an EEG electrode is placed over a pulsating vessel. The pulsation can cause slow waves that may simulate EEG activity. A direct relationship exists between ECG and the pulse waves (200-300 millisecond delay after ECG equals QRS complex). + + + ECG-artifact + Far-field potential generated in the heart. The voltage and apparent surface of the artifact vary from derivation to derivation and, consequently, from montage to montage. The artifact is observed best in referential montages using earlobe electrodes A1 and A2. ECG artifact is recognized easily by its rhythmicity/regularity and coincidence with the ECG tracing. + + + Sweat-artifact + Is a low amplitude undulating waveform that is usually greater than 2 seconds and may appear to be an unstable baseline. + + + EMG-artifact + Myogenic potentials are the most common artifacts. Frontalis and temporalis muscles (ex..: clenching of jaw muscles) are common causes. Generally, the potentials generated in the muscles are of shorter duration than those generated in the brain. The frequency components are usually beyond 30-50 Hz, and the bursts are arrhythmic. + + + + Non-biological-artifacts + Used with Findings-property/ tags + + Power-supply-artifact + 50-60 Hz artifact. Monomorphic waveform due to 50 or 60 Hz A/C power supply. + + + Induction-artifact + Artefacts (usually of high frequency) induced by nearby equipment (like in the intensive care unit). + + + Artificial-ventilation-artifact + + + Electrode-pops + Are brief discharges with a very steep upslope and shallow fall that occur in all leads which include that electrode. + + + Salt-bridge-artifact + Typically occurs in 1 channel which may appear isoelectric. Only seen in bipolar montage. + + + + Other-artifacts + Used with Findings-property/ tags + + # + free text + + takesValue + + + + + + Polygraphic-channels + Changes observed in polygraphic channels can be scored: EOG, Respiration, ECG, EMG, other polygraphic channel (+ free text), and their significance logged (normal, abnormal, no definite abnormality). + + EOG + electrooculography + + # + free text + + takesValue + + + + + Respiration + + Oxygen-saturation + + # + + takesValue + + + valueClass + numericClass + + + + + Respiration-features + + Apnoe + Add duration and comments in free text + + # + free text + + takesValue + + + + + Hypopnea + Add duration and comments in free text + + # + free text + + takesValue + + + + + Apnea-hypopnea-index + events/h. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Periodic-respiration + + # + free text + + takesValue + + + + + Tachypnea + cycles per min. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Other-respiration-features + + # + free text + + takesValue + + + + + + + ECG + electrocardiography + + QT-period + + # + free text + + takesValue + + + + + ECG-features + + Sinus-rhythm + Normal rhythm. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Arrhythmia + + # + free text + + takesValue + + + + + Asystolia + duration: range in seconds. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Bradycardia + beats/min: range. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Extrasystole + + # + free text + + takesValue + + + + + Ventricular-premature-depolarization + Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Tachycardia + beats/min: range. Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Other-ECG-features + + # + free text + + takesValue + + + + + + + EMG + electromyography + + Muscle-side + + Left-muscle + + + Right-muscle + + + Bilateral-muscle + + + + Muscle-Name + + # + free text + + takesValue + + + + + EMG-features + + Myoclonus-rhythmic + Used with Findings-attributes tags + + # + free text + + takesValue + + + + + Myoclonus-arrhythmic + + # + free text + + takesValue + + + + + Myoclonus-synchronous + + # + free text + + takesValue + + + + + Myoclonus-asynchronous + + # + free text + + takesValue + + + + + PLMS + Periodic limb movements in sleep + + + Spasm + + # + free text + + takesValue + + + + + Tonic-contraction + + # + free text + + takesValue + + + + + Asymmetric-activation-left-first + + # + free text + + takesValue + + + + + Asymmetric-activation-right-first + + # + free text + + takesValue + + + + + Other-EMG-features + + # + free text + + takesValue + + + + + + + Other-channels + + # + free text + + takesValue + + + + + + Findings-attributes + Subtree tree for general properties + + Not-possible-to-determine + Not possible to determine + + + No-definite-abnormality + + + Yes + + + No + + + Frequency + Hz Values (numbers) typed in. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Amplitude + microV Values (numbers) typed in. + + # + + takesValue + + + valueClass + numericClass + + + + + Duration + An offset that is implicit after duration time passed from the onset. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Significance + Used with Findings-attributes tags + + + Asymmetry + + LowerLeft + Lower on the left side. + + + LowerRight + Lower on the right side. + + + + Increased + + # + free text + + takesValue + + + + + Decreased + + # + free text + + takesValue + + + + + Stopped-by + + # + free text + + takesValue + + + + + Triggered-by + + # + free text + + takesValue + + + + + Unmodified + + # + free text + + takesValue + + + + + + Findings-property + Descriptive elements. Similar to main HED /Property Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + Morphology-property + + Delta-activity + EEG rhythm in the delta (under 4 Hz) range that does not belong to the posterior dominant rhythm (scored under other organised rhythms). Used with Amplitude tag + + + Theta-activity + EEG rhythm in the theta (4-8 Hz) range that does not belong to the posterior dominant rhythm (scored under other organised rhythms). Used with Amplitude tag + + + Alpha-activity + EEG rhythm in the alpha range (8-13 Hz) which is considered part of the background (ongoing) activity but does not fulfil the criteria of the posterior dominant rhythm (alpha rhythm). Used with Amplitude tag + + + Beta-activity + EEG rhythm between 14 and 40 Hz, which is considered part of the background (ongoing) activity but does not fulfil the criteria of the posterior dominant rhythm. Most characteristically: a rhythm from 14 to 40 Hz recorded over the fronto-central regions of the head during wakefulness. Amplitude of the beta rhythm varies but is mostly below 30 microV. Other beta rhythms are most prominent in other locations or are diffuse. Used with Amplitude tag + + + Gamma-activity + + + Spike + A transient, clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale and duration from 20 to under 70 ms, i.e. 1/50-1/15 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + + Spike-and-slow-wave + A pattern consisting of a spike followed by a slow wave. + + + Runs-of-rapid-spikes + Bursts of spike discharges at a rate from 10 to 25/sec (in most cases somewhat irregular). The bursts last more than 2 seconds (usually 2 to 10 seconds) and it is typically seen in sleep. Synonyms: rhythmic spikes, generalized paroxysmal fast activity, fast paroxysmal rhythms, grand mal discharge, fast beta activity + + + Polyspikes + Two or more consecutive spikes. + + + Polyspike-and-slow-wave + Two or more consecutive spikes associated with one or more slow waves. + + + Sharp-wave + A transient clearly distinguished from background activity, with pointed peak at a conventional paper speed or time scale, and duration of 70-200 ms, i.e. over 1/4-1/5 s approximately. Main component is generally negative relative to other areas. Amplitude varies. + + + Sharp-and-slow-wave + A sequence of a sharp wave and a slow wave. + + + Slow-sharp-wave + A transient that bears all the characteristics of a sharp-wave, but exceeds 200 ms. Synonym: blunted sharp wave. + + + Hypsarrhythmia-classic + + + Hypsarrhythmia-modified + + + Fast-spike-activity + A burst consisting of a sequence of spikes. Duration greater than 1 s. Frequency at least in the alpha range. + + + Low-voltage-fast-activity + Refers to the fast, and often recruiting activity which can be recorded at the onset of an ictal discharge, particularly in invasive EEG recording of a seizure. + + + Polysharp-waves + A sequence of two or more sharp-waves. + + + Polymorphic-delta + EEG activity consisting of waves in the delta range (over 250 ms duration for each wave) but of different morphology. + + + FIRDA + Frontal intermittent rhythmic delta activity. Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 1.5-2.5 Hz over the frontal areas of one or both sides of the head. Comment: most commonly associated with unspecified encephalopathy, in adults. + + + OIRDA + Occipital intermittent rhythmic delta activity. Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at 2-3 Hz over the occipital or posterior head regions of one or both sides of the head. Frequently blocked or attenuated by opening the eyes. Comment: most commonly associated with unspecified encephalopathy, in children + + + TIRDA + Temporal intermittent rhythmic delta activity. Fairly regular or approximately sinusoidal waves, mostly occurring in bursts at over the temporal areas of one side of the head. Comment: most commonly associated with temporal lobe epilepsy. + + + PDs-property + + Superimposed-activity + + Fast-activity + + + Rhythmic-activity + + + + Sharpness + + Spiky + + + Sharp + + + Sharply-contoured + + + Blunt + + + + Number-of-phases + + 1-phase + + + 2-phases + + + 3-phases + + + Greater-than-3 + + + + Triphasic-morphology + + + Absolute-amplitude + + Very-low + lower than 20 microV) + + + Low + 20 to 49 microV + + + Medium + 50 to 199 microV + + + High + greater than 200 microV + + + + Relative-amplitude + + Less-than-equal-2 + + + Greater-than-2 + + + + Polarity + + Positive + + + Negative + + + Unclear + + + + + + Source-analysis + How the current in the brain reaches the electrode sensors. + + Brain-region-laterality + Uses Location-property/Laterality tags + + + Brain-region-SA + + + + Location-property + + Laterality + + Left + + + Left-greater-right + + + Right + + + Right-greater-left + + + Midline + + + Diffuse-asynchronous + + + + Region + + Frontal + + + Temporal + + + Central + + + Parietal + + + Occipital + + + + Body-part + + Eyelid + + + Face + + + Arm + + + Leg + + + Trunk + + + Visceral + + + Hemi + + + + Centricity + + Axial + + + Proximal-limb + + + Distal-limb + + + + Sensors + lists all corresponding sensors (electrodes/channels in montage) + + # + + takesValue + + + + + Propagation + Used with Findings-attributes tags + + + Multifocal + Used with Findings-attributes tags + + + + Modulators-property + For each described graphoelement, the influence of the modulators can be scored. Only modulators present in the recording are scored. + + Reactivity + Used with Findings-attributes tags + + + Eye-closure-sensitivity + Eye closure sensitivity. Used with Findings-attributes tags + + + Eye-opening-passive + Passive eye opening. Used with Findings-attributes tags + + + Medication-effect-EEG + Medications effect on EEG. Used with Findings-attributes tags + + + Medication-reduction-effect-EEG + Medications reduction or withdrawl effect on EEG. Used with Findings-attributes tags + + + Auditive-stimuli-effect + Used with Findings-attributes tags + + + Nociceptive-stimuli-effect + Used with Findings-attributes tags + + + Physical-effort-effect + Used with Findings-attributes tags + + + Cognitive-tasks-effect + Used with Findings-attributes tags + + + Other-modulators-effect-EEG + Used with Findings-attributes tags + + + Facilitating-factors + Facilitating factors are defined as transient and sporadic endogenous or exogenous elements capable of augmenting seizure incidence (increasing the likelihood of seizure occurrence). + + Alcohol + + # + free text + + takesValue + + + + + Awake + + # + free text + + takesValue + + + + + Catamenial + + # + free text + + takesValue + + + + + Fever + + # + free text + + takesValue + + + + + Sleep + + # + free text + + takesValue + + + + + Sleep-deprived + + # + free text + + takesValue + + + + + Other + + # + free text + + takesValue + + + + + + Provocative-factors + Provocative factors are defined as transient and sporadic endogenous or exogenous elements capable of evoking/triggering seizures immediately following the exposure to it. + + Hyperventilation-provoked + + # + free text + + takesValue + + + + + Reflex-provoked + + # + free text + + takesValue + + + + + + Medication-effect-clinical + Medications clinical effect. Used with Findings-attributes tags + + + Medication-reduction-effect-clinical + Medications reduction or withdrawal clinical effect. Used with Findings-attributes tags + + + Other-modulators-effect-clinical + Used with Findings-attributes tags + + + IPS-effect + + Posterior-stimulus-dependent-response + + + Posterior-stimulus-independent-response-limited + limited to the stimulus-train + + + Posterior-stimulus-independent-response-self-sustained + + + Generalized-photoparoxysmal-response-limited + limited to the stimulus-train + + + Generalized-photoparoxysmal-response-self-sustained + + + Activation-of-pre-existing-epileptogenic-area + + + + Modulators-effect + Tags for describing the influence of the modulators + + Continuous-during-NRS + Continuous during non-rapid-eye-movement-sleep (NRS) + + # + free text + + takesValue + + + + + Only-during + + # + Only during Sleep/Awakening/Hyperventilation/Physical effort/Cognitive task. Free text + + takesValue + + + + + Change-of-patterns + Change of patterns during sleep/awakening + + # + free text + + takesValue + + + + + + + Time-related-features-property + Important to estimate how often an interictal abnormality is seen in the recording. + + Appearance-mode + Describes how the non-ictal EEG pattern/graphoelement is distributed through the recording + + Random + Occurrence of the the non-ictal EEG pattern / graphoelement without any rhytmicity / periodicity + + + Periodic + Non-ictal EEG pattern / graphoelement occurring at an approximately regular rate / interval (generally of 1 to several seconds). + + + Variable + Occurrence of non-ictal EEG pattern / graphoelements, that is sometimes rhythmic or periodic, other times random, throughout the recording + + + + Discharge-pattern + Describes the organization of the EEG signal within the discharge (distinguish between single and repetitive discharges) + + Single-discharge + Applies to the intra-burst pattern: a graphoelement that is not repetitive; before and after the graphoelement one can distinguish the background activity. Used with Findings-attributes tags + + + Rhythmic-trains-or-bursts + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at approximately constant period. Used with Findings-attributes tags + + + Arhythmic-trains-or-bursts + Applies to the intra-burst pattern: a non-ictal graphoelement that repeats itself without returning to the background activity between them. The graphoelements within this repetition occur at inconstant period. Used with Findings-attributes tags + + + Fragmented + + # + free text + + takesValue + + + + + + Extent + percentage of occurrence during the recording (background activity) + + # + + takesValue + + + valueClass + numericClass + + + + + + PDR-property + + PDR-amplitude-range + Used with Findings-attributes tags + + Low-range + Low (less than 20 microV) + + + Medium-range + Medium (between 20 and 70 microV) + + + High-range + High ( more than 70 microV) + + + + PDR-Amplitude-asymmetry + A difference in amplitude between the homologous area on opposite sides of the head that consistently exceeds 50 percent. Used with Asymmetry tags + + + PDR-Frequency-asymmetry + Used with Asymmetry tags + + + PDR-Eye-opening + Change (disappearance or measurable decrease in amplitude) of a posterior dominant rhythm following eye-opening. Eye closure has the opposite effect. Used with Findings-attributes tags + + ReducedLeft + Reduced left side reactivity + + + ReducedRigth + Reduced right side reactivity + + + ReducedBoth + Reduced reactivity on both sides + + + + PDR-Organization + Used with Findings-attributes tags + + PoorlyOrganized + Poorly organized + + + Disorganized + Disorganized + + + MarkedlyDisorganized + Markedly disorganized + + + + PDR-Caveat + Used with Findings-attributes tags + + Only-open-eyes-during-the-recording + + # + free text + + takesValue + + + + + Sleep-deprived-caveat + + # + free text + + takesValue + + + + + Drowsy + + # + free text + + takesValue + + + + + Only-following-hyperventilation + + + + Absence-of-PDR + + Artifacts + + + Extreme-low-voltage + + + Eye-closure-could-not-be-achieved + + + Lack-of-awake-period + + + Lack-of-compliance + + + Other-causes + + + + + Incidence + how often it occurs/time-epoch + + Only-once + + + Rare-incidence + less than 1/h + + + Uncommon + 1/5 min to 1/h + + + Occasional-incidence + 1/min to 1/5min + + + Frequent-incidence + 1/10 s to 1/min + + + Abundant-incidence + greater than 1/10 s) + + + + Prevalence + the percentage of the recording covered by the train/burst + + Rare + Less than 1 percents + + + Occasional + 1 to 9 percents + + + Frequent + 10 to 49 percents + + + Abundant + 50 to 89 percents + + + Continuous + Greater than 90 percents + + + + Episode-property + + Epileptic-seizure-classification + Epileptic seizures are named using the current ILAE seizure classification (Fisher et al., 2017, Beniczky et al., 2017). + + Motor-onset + + Myoclonic-seizure + + + Negative-myoclonic-seizure + + + Clonic-seizure + + + Tonic-seizure + + + Atonic-seizure + + + Myoclonic-Atonic-seizure + + + Myoclonic-tonoc-clonic-seizure + + + Tonic-clonic-seizure + + + Automatism-seizure + + + Hyperkinetic-seizure + + + Epileptic-spasm-episode + + + + Nonmotor-onset + + Behavior-arrest-seizure + + + Sensory-seizure + + + Emotional-seizure + + + Cognitive-seizure + + + Autonomic-seizure + + + + Absence + + Typical-absence-seizure + + + Atypical-absence-seizure + + + Myoclonic-absence-seizure + + + Eyelid-myoclonia-seizure + + + + + Episode-phase + The electroclinical findings (i.e., the seizure semiology and the ictal EEG) are divided in three phases: onset, propagation, and postictal. + + Initial + + + Subsequent + + + Postictal + + + + Seizure-semiology + + Motor-manifestation + + Elementary-motor + + Tonic + A sustained increase in muscle contraction lasting a few seconds to minutes. + + + Dystonic + Sustained contractions of both agonist and antagonist muscles producing athetoid or twisting movements, which, when prolonged, may produce abnormal postures. + + + Epileptic-spasm + A sudden flexion, extension, or mixed extension flexion of predominantly proximal and truncal muscles that is usually more sustained than a myoclonic movement but not so sustained as a tonic seizure (i.e., about 1 s). Limited forms may occur: grimacing, head nodding. Frequent occurrence in clusters. + + + Postural + Adoption of a posture that may be bilaterally symmetric or asymmetric (as in a fencing posture) + + + Versive + A sustained, forced conjugate ocular, cephalic, and/or truncal rotation or lateral deviation from the midline + + + Clonic + Myoclonus that is regularly repetitive, involves the same muscle groups, at a frequency of about 2 to 3 c/s, and is prolonged. Synonym: rhythmic myoclonus + + + Myoclonic + Characterized by myoclonus. MYOCLONUS : sudden, brief (lower than 100 ms) involuntary single or multiple contraction(s) of muscles(s) or muscle groups of variable topography (axial, proximal limb, distal) + + + Jacksonian-march + Term indicating spread of clonic movements through contiguous body parts unilaterally + + + Negative-myoclonus + Characterized by negative myoclonus. NEGATIVE MYOCLONUS: interruption of tonic muscular activity for lower than 500 ms without evidence of preceding myoclonia. + + + Tonic-clonic + A sequence consisting of a tonic followed by a clonic phase. Variants such as clonic-tonic-clonic may be seen. Asymmetry of limb posture during the tonic phase of a GTC: one arm is rigidly extended at the elbow (often with the fist clenched tightly and flexed at the wrist), whereas the opposite arm is flexed at the elbow. + + Without-figure-of-four + + + With-figure-of-four-extension-left-elbow + + + With-figure-of-four-extension-right-elbow + + + + Astatic + Loss of erect posture that results from an atonic, myoclonic, or tonic mechanism. Synonym: drop attack. + + + Atonic + Sudden loss or diminution of muscle tone without apparent preceding myoclonic or tonic event lasting greator or equal to 1 to 2 s, involving head, trunk, jaw, or limb musculature. + + + Eye-blinking + + + Other-elementary-motor + + # + free text + + takesValue + + + + + + Automatisms + + Mimetic + Facial expression suggesting an emotional state, often fear. + + + Oroalimentary + Lip smacking, lip pursing, chewing, licking, tooth grinding, or swallowing. + + + Dacrystic + Bursts of crying. + + + Dyspraxic + Inability to perform learned movements spontaneously or on command or imitation despite intact relevant motor and sensory systems and adequate comprehension and cooperation + + + Manual + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + + Gestural + Semipurposive, asynchronous hand movements. Often unilateral. + + + Pedal + 1. Indicates principally distal components, bilateral or unilateral. 2. Fumbling, tapping, manipulating movements. + + + Hypermotor + 1. Involves predominantly proximal limb or axial muscles producing irregular sequential ballistic movements, such as pedaling, pelvic thrusting, thrashing, rocking movements. 2. Increase in rate of ongoing movements or inappropriately rapid performance of a movement. + + + Hypokinetic + A decrease in amplitude and/or rate or arrest of ongoing motor activity. + + + Gelastic + Bursts of laughter or giggling, usually without an appropriate affective tone. + + + Other-Automatism + + # + free text + + takesValue + + + + + + Motor-behavioral-arrest + Interruption of ongoing motor activity or of ongoing behaviours with fixed gaze, without movement of the head or trunk (oro-alimentary and hand automatisms may continue) + + + + Non-motor-manifestation + + Sensory + + Headache + Headache occurring in close temporal proximity to the seizure or as the sole seizure manifestation + + + Visual + Flashing or flickering lights, spots, simple patterns, scotomata, or amaurosis. + + + Auditory + Buzzing, drumming sounds or single tones. + + + Olfactory + + + Gustatory + Taste sensations including acidic, bitter, salty, sweet, or metallic. + + + Epigastric + Abdominal discomfort including nausea, emptiness, tightness, churning, butterflies, malaise, pain, and hunger; sensation may rise to chest or throat. Some phenomena may reflect ictal autonomic dysfunction. + + + Somatosensory + Tingling, numbness, electric-shock sensation, sense of movement or desire to move. + + + Painful + Peripheral (lateralized/bilateral), cephalic, abdominal + + + Autonomic-sensation + A sensation consistent with involvement of the autonomic nervous system, including cardiovascular, gastrointestinal, sudomotor, vasomotor, and thermoregulatory functions. (Thus autonomic aura; cf. autonomic events 3.0). + + + Other-sensory + + # + free text + + takesValue + + + + + + Experiential + + Affective-emotional + Components include fear, depression, joy, and (rarely) anger. + + + Hallucinatory + Composite perceptions without corresponding external stimuli involving visual, auditory, somatosensory, olfactory, and/or gustatory phenomena. Example: hearing and seeing people talking. + + + Illusory + An alteration of actual percepts involving the visual, auditory, somatosensory, olfactory, or gustatory systems. + + + Mnemonic + Components that reflect ictal dysmnesia such as feelings of familiarity (deja-vu) and unfamiliarity (jamais-vu). + + Deja-vu + + + Jamais-vu + + + + Other-experiential + + # + free text + + takesValue + + + + + + Dyscognitive + The term describes events in which (1) disturbance of cognition is the predominant or most apparent feature, and (2a) two or more of the following components are involved, or (2b) involvement of such components remains undetermined. Otherwise, use the more specific term (e.g., mnemonic experiential seizure or hallucinatory experiential seizure). Components of cognition: ++ perception: symbolic conception of sensory information ++ attention: appropriate selection of a principal perception or task ++ emotion: appropriate affective significance of a perception ++ memory: ability to store and retrieve percepts or concepts ++ executive function: anticipation, selection, monitoring of consequences, and initiation of motor activity including praxis, speech + + + Language-related + + Vocalization + + + Verbalization + + + Dysphasia + + + Aphasia + + + Other-language-related + + # + free text + + takesValue + + + + + + Autonomic + + Pupillary + Mydriasis, miosis (either bilateral or unilateral) + + + Hypersalivation + Increase in production of saliva leading to uncontrollable drooling + + + Respiratory-apnoeic + subjective shortness of breath, hyperventilation, stridor, coughing, choking, apnea, oxygen desaturation, neurogenic pulmonary edema + + + Cardiovascular + Modifications of heart rate (tachycardia, bradycardia), cardiac arrhythmias (such as sinus arrhythmia, sinus arrest, supraventricular tachycardia, atrial premature depolarizations, ventricular premature depolarizations, atrio-ventricular block, bundle branch block, atrioventricular nodal escape rhythm, asystole) + + + Gastrointestinal + Nausea, eructation, vomiting, retching, abdominal sensations, abdominal pain, flatulence, spitting, diarrhoea + + + Urinary-incontinence + urinary urge (intense urinary urge at the beginning of seizures), urinary incontinence, ictal urination (rare symptom of partial seizures without loss of consciousness) + + + Genital + Sexual auras (erotic thoughts and feelings, sexual arousal and orgasm). Genital auras (unpleasant, sometimes painful, frightening or emotionally neutral somatosensory sensations in the genitals that can be accompanied by ictal orgasm). Sexual automatisms (hypermotor movements consisting of writhing, thrusting, rhythmic movements of the pelvis, arms and legs, sometimes associated with picking and rhythmic manipulation of the groin or genitalia, exhibitionism and masturbation) + + + Vasomotor + Flushing or pallor (may be accompanied by feelings of warmth, cold and pain) + + + Sudomotor + Sweating and piloerection ( may be accompanied by feelings of warmth, cold and pain) + + + Thermoregulatory + Hyperthermia, fever + + + Other-autonomic + + # + free text + + takesValue + + + + + + + Other-manifestation + + # + free text + + takesValue + + + + + + Ictal-EEG + + Obscured-by-artifacts + + + Ictal-EEG-activity + + + + + Time-context-property + + Consciousness + Used with Findings-attributes tags + + Not-tested + + + Affected + + + Mildly-affected + + + Not-affected + + + + Episode-awareness + Used with Findings-attributes tags + + + Start-relationship + + Clinical-start-followed-EEG + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + EEG-start-followed-clinical + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Simultaneous + + + + Event-count + Event per recording + + # + + takesValue + + + valueClass + numericClass + + + + + State-start + State at the start of the episode + + From-sleep + + # + free text + + takesValue + + + + + From-awake + + # + free text + + takesValue + + + + + + Postictal-phase + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Prodome + Prodrome is a preictal phenomenon, and it is defined as a subjective or objective clinical alteration (e.g., ill-localized sensation or agitation) that heralds the onset of an epileptic seizure but does not form part of it (Blume et al., 2001). Therefore, prodrome should be distinguished from aura (which is an ictal phenomenon). + + # + free text + + takesValue + + + + + Tongue-biting + + + Seizure-dynamics + + Evolution-morphology + + # + free text + + takesValue + + + + + Evolution-frequency + + # + free text + + takesValue + + + + + Evolution-location + + # + free text + + takesValue + + + + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + + rad + + SIUnit + + + unitSymbol + + + + degree + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + + $ + + unitPrefix + + + unitSymbol + + + + point + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + + Hz + + SIUnit + + + unitSymbol + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. Often used for sound intensity. + + unitSymbol + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + + B + + SIUnit + + + unitSymbol + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + + inch + + + metre + + SIUnit + + + + m + + SIUnit + + + unitSymbol + + + + mile + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + + mph + + unitSymbol + + + + kph + + unitSymbol + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + + s + + SIUnit + + + unitSymbol + + + + day + + + minute + + + hour + Should be in 24-hour format. + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + + gram + + SIUnit + + + + pound + + + lb + + + + + + deca + SI unit multiple representing 10^1 + + SIUnitModifier + + + + da + SI unit multiple representing 10^1 + + SIUnitSymbolModifier + + + + hecto + SI unit multiple representing 10^2 + + SIUnitModifier + + + + h + SI unit multiple representing 10^2 + + SIUnitSymbolModifier + + + + kilo + SI unit multiple representing 10^3 + + SIUnitModifier + + + + k + SI unit multiple representing 10^3 + + SIUnitSymbolModifier + + + + mega + SI unit multiple representing 10^6 + + SIUnitModifier + + + + M + SI unit multiple representing 10^6 + + SIUnitSymbolModifier + + + + giga + SI unit multiple representing 10^9 + + SIUnitModifier + + + + G + SI unit multiple representing 10^9 + + SIUnitSymbolModifier + + + + tera + SI unit multiple representing 10^12 + + SIUnitModifier + + + + T + SI unit multiple representing 10^12 + + SIUnitSymbolModifier + + + + peta + SI unit multiple representing 10^15 + + SIUnitModifier + + + + P + SI unit multiple representing 10^15 + + SIUnitSymbolModifier + + + + exa + SI unit multiple representing 10^18 + + SIUnitModifier + + + + E + SI unit multiple representing 10^18 + + SIUnitSymbolModifier + + + + zetta + SI unit multiple representing 10^21 + + SIUnitModifier + + + + Z + SI unit multiple representing 10^21 + + SIUnitSymbolModifier + + + + yotta + SI unit multiple representing 10^24 + + SIUnitModifier + + + + Y + SI unit multiple representing 10^24 + + SIUnitSymbolModifier + + + + deci + SI unit submultiple representing 10^-1 + + SIUnitModifier + + + + d + SI unit submultiple representing 10^-1 + + SIUnitSymbolModifier + + + + centi + SI unit submultiple representing 10^-2 + + SIUnitModifier + + + + c + SI unit submultiple representing 10^-2 + + SIUnitSymbolModifier + + + + milli + SI unit submultiple representing 10^-3 + + SIUnitModifier + + + + m + SI unit submultiple representing 10^-3 + + SIUnitSymbolModifier + + + + micro + SI unit submultiple representing 10^-6 + + SIUnitModifier + + + + u + SI unit submultiple representing 10^-6 + + SIUnitSymbolModifier + + + + nano + SI unit submultiple representing 10^-9 + + SIUnitModifier + + + + n + SI unit submultiple representing 10^-9 + + SIUnitSymbolModifier + + + + pico + SI unit submultiple representing 10^-12 + + SIUnitModifier + + + + p + SI unit submultiple representing 10^-12 + + SIUnitSymbolModifier + + + + femto + SI unit submultiple representing 10^-15 + + SIUnitModifier + + + + f + SI unit submultiple representing 10^-15 + + SIUnitSymbolModifier + + + + atto + SI unit submultiple representing 10^-18 + + SIUnitModifier + + + + a + SI unit submultiple representing 10^-18 + + SIUnitSymbolModifier + + + + zepto + SI unit submultiple representing 10^-21 + + SIUnitModifier + + + + z + SI unit submultiple representing 10^-21 + + SIUnitSymbolModifier + + + + yocto + SI unit submultiple representing 10^-24 + + SIUnitModifier + + + + y + SI unit submultiple representing 10^-24 + + SIUnitSymbolModifier + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. + + boolProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + TPA, November 2021 + diff --git a/tests/data/HED_testlib_1.0.2.xml b/tests/data/HED_testlib_1.0.2.xml new file mode 100644 index 00000000..72dcd78e --- /dev/null +++ b/tests/data/HED_testlib_1.0.2.xml @@ -0,0 +1,6542 @@ + + + This schema is the first official release that includes an xsd and requires unit class, unit modifier, value class, schema attribute and property sections. + + + + + Event + Something that happens at a given time and (typically) place. Elements of this tag subtree designate the general category in which an event falls. + + suggestedTag + Task-property + + + Sensory-event + Something perceivable by the participant. An event meant to be an experimental stimulus should include the tag Task-property/Task-event-role/Experimental-stimulus. + + suggestedTag + Task-event-role + Sensory-presentation + + + + Agent-action + Any action engaged in by an agent (see the Agent subtree for agent categories). A participant response to an experiment stimulus should include the tag Agent-property/Agent-task-role/Experiment-participant. + + suggestedTag + Task-event-role + Agent + + + + Data-feature + An event marking the occurrence of a data feature such as an interictal spike or alpha burst that is often added post hoc to the data record. + + suggestedTag + Data-property + + + + Experiment-control + An event pertaining to the physical control of the experiment during its operation. + + + Experiment-procedure + An event indicating an experimental procedure, as in performing a saliva swab during the experiment or administering a survey. + + + Experiment-structure + An event specifying a change-point of the structure of experiment. This event is typically used to indicate a change in experimental conditions or tasks. + + + Measurement-event + A discrete measure returned by an instrument. + + suggestedTag + Data-property + + + + + Agent + Someone or something that takes an active role or produces a specified effect.The role or effect may be implicit. Being alive or performing an activity such as a computation may qualify something to be an agent. An agent may also be something that simulates something else. + + suggestedTag + Agent-property + + + Animal-agent + An agent that is an animal. + + + Avatar-agent + An agent associated with an icon or avatar representing another agent. + + + Controller-agent + An agent experiment control software or hardware. + + + Human-agent + A person who takes an active role or produces a specified effect. + + + Robotic-agent + An agent mechanical device capable of performing a variety of often complex tasks on command or by being programmed in advance. + + + Software-agent + An agent computer program. + + + + Action + Do something. + + extensionAllowed + + + Communicate + Convey knowledge of or information about something. + + Communicate-gesturally + Communicate nonverbally using visible bodily actions, either in place of speech or together and in parallel with spoken words. Gestures include movement of the hands, face, or other parts of the body. + + relatedTag + Move-face + Move-upper-extremity + + + Clap-hands + Strike the palms of against one another resoundingly, and usually repeatedly, especially to express approval. + + + Clear-throat + Cough slightly so as to speak more clearly, attract attention, or to express hesitancy before saying something awkward. + + relatedTag + Move-face + Move-head + + + + Frown + Express disapproval, displeasure, or concentration, typically by turning down the corners of the mouth. + + relatedTag + Move-face + + + + Grimace + Make a twisted expression, typically expressing disgust, pain, or wry amusement. + + relatedTag + Move-face + + + + Nod-head + Tilt head in alternating up and down arcs along the sagittal plane. It is most commonly, but not universally, used to indicate agreement, acceptance, or acknowledgement. + + relatedTag + Move-head + + + + Pump-fist + Raise with fist clenched in triumph or affirmation. + + relatedTag + Move-upper-extremity + + + + Raise-eyebrows + Move eyebrows upward. + + relatedTag + Move-face + Move-eyes + + + + Shake-fist + Clench hand into a fist and shake to demonstrate anger. + + relatedTag + Move-upper-extremity + + + + Shake-head + Turn head from side to side as a way of showing disagreement or refusal. + + relatedTag + Move-head + + + + Shhh + Place finger over lips and possibly uttering the syllable shhh to indicate the need to be quiet. + + relatedTag + Move-upper-extremity + + + + Shrug + Lift shoulders up towards head to indicate a lack of knowledge about a particular topic. + + relatedTag + Move-upper-extremity + Move-torso + + + + Smile + Form facial features into a pleased, kind, or amused expression, typically with the corners of the mouth turned up and the front teeth exposed. + + relatedTag + Move-face + + + + Spread-hands + Spread hands apart to indicate ignorance. + + relatedTag + Move-upper-extremity + + + + Thumbs-down + Extend the thumb downward to indicate disapproval. + + relatedTag + Move-upper-extremity + + + + Thumb-up + Extend the thumb upward to indicate approval. + + relatedTag + Move-upper-extremity + + + + Wave + Raise hand and move left and right, as a greeting or sign of departure. + + relatedTag + Move-upper-extremity + + + + Widen-eyes + Open eyes and possibly with eyebrows lifted especially to express surprise or fear. + + relatedTag + Move-face + Move-eyes + + + + Wink + Close and open one eye quickly, typically to indicate that something is a joke or a secret or as a signal of affection or greeting. + + relatedTag + Move-face + Move-eyes + + + + + Communicate-musically + Communicate using music. + + Hum + Make a low, steady continuous sound like that of a bee. Sing with the lips closed and without uttering speech. + + + Play-instrument + Make musical sounds using an instrument. + + + Sing + Produce musical tones by means of the voice. + + + Vocalize + Utter vocal sounds. + + + Whistle + Produce a shrill clear sound by forcing breath out or air in through the puckered lips. + + + + Communicate-vocally + Communicate using mouth or vocal cords. + + Cry + Shed tears associated with emotions, usually sadness but also joy or frustration. + + + Groan + Make a deep inarticulate sound in response to pain or despair. + + + Laugh + Make the spontaneous sounds and movements of the face and body that are the instinctive expressions of lively amusement and sometimes also of contempt or derision. + + + Scream + Make loud, vociferous cries or yells to express pain, excitement, or fear. + + + Shout + Say something very loudly. + + + Sigh + Emit a long, deep, audible breath expressing sadness, relief, tiredness, or a similar feeling. + + + Speak + Communicate using spoken language. + + + Whisper + Speak very softly using breath without vocal cords. + + + + + Move + Move in a specified direction or manner. Change position or posture. + + Breathe + Inhale or exhale during respiration. + + Blow + Expel air through pursed lips. + + + Cough + Suddenly and audibly expel air from the lungs through a partially closed glottis, preceded by inhalation. + + + Exhale + Blow out or expel breath. + + + Hiccup + Involuntarily spasm the diaphragm and respiratory organs, with a sudden closure of the glottis and a characteristic sound like that of a cough. + + + Hold-breath + Interrupt normal breathing by ceasing to inhale or exhale. + + + Inhale + Draw in with the breath through the nose or mouth. + + + Sneeze + Suddenly and violently expel breath through the nose and mouth. + + + Sniff + Draw in air audibly through the nose to detect a smell, to stop it from running, or to express contempt. + + + + Move-body + Move entire body. + + Bend + Move body in a bowed or curved manner. + + + Dance + Perform a purposefully selected sequences of human movement often with aesthetic or symbolic value. Move rhythmically to music, typically following a set sequence of steps. + + + Fall-down + Lose balance and collapse. + + + Flex + Cause a muscle to stand out by contracting or tensing it. Bend a limb or joint. + + + Jerk + Make a quick, sharp, sudden movement. + + + Lie-down + Move to a horizontal or resting position. + + + Recover-balance + Return to a stable, upright body position. + + + Sit-down + Move from a standing to a sitting position. + + + Sit-up + Move from lying down to a sitting position. + + + Stand-up + Move from a sitting to a standing position. + + + Stretch + Straighten or extend body or a part of body to its full length, typically so as to tighten muscles or in order to reach something. + + + Shudder + Tremble convulsively, sometimes as a result of fear or revulsion. + + + Stumble + Trip or momentarily lose balance and almost fall. + + + Turn + Change or cause to change direction. + + + + Move-body-part + Move one part of a body. + + Move-eyes + Move eyes. + + Blink + Shut and open the eyes quickly. + + + Close-eyes + Lower and keep eyelids in a closed position. + + + Fixate + Direct eyes to a specific point or target. + + + Inhibit-blinks + Purposely prevent blinking. + + + Open-eyes + Raise eyelids to expose pupil. + + + Saccade + Move eyes rapidly between fixation points. + + + Squint + Squeeze one or both eyes partly closed in an attempt to see more clearly or as a reaction to strong light. + + + Stare + Look fixedly or vacantly at someone or something with eyes wide open. + + + + Move-face + Move the face or jaw. + + Bite + Seize with teeth or jaws an object or organism so as to grip or break the surface covering. + + + Burp + Noisily release air from the stomach through the mouth. Belch. + + + Chew + Repeatedly grinding, tearing, and or crushing with teeth or jaws. + + + Gurgle + Make a hollow bubbling sound like that made by water running out of a bottle. + + + Swallow + Cause or allow something, especially food or drink to pass down the throat. + + Gulp + Swallow quickly or in large mouthfuls, often audibly, sometimes to indicate apprehension. + + + + Yawn + Take a deep involuntary inhalation with the mouth open often as a sign of drowsiness or boredom. + + + + Move-head + Move head. + + Lift-head + Tilt head back lifting chin. + + + Lower-head + Move head downward so that eyes are in a lower position. + + + Turn-head + Rotate head horizontally to look in a different direction. + + + + Move-lower-extremity + Move leg and/or foot. + + Curl-toes + Bend toes sometimes to grip. + + + Hop + Jump on one foot. + + + Jog + Run at a trot to exercise. + + + Jump + Move off the ground or other surface through sudden muscular effort in the legs. + + + Kick + Strike out or flail with the foot or feet. Strike using the leg, in unison usually with an area of the knee or lower using the foot. + + + Pedal + Move by working the pedals of a bicycle or other machine. + + + Press-foot + Move by pressing foot. + + + Run + Travel on foot at a fast pace. + + + Step + Put one leg in front of the other and shift weight onto it. + + Heel-strike + Strike the ground with the heel during a step. + + + Toe-off + Push with toe as part of a stride. + + + + Trot + Run at a moderate pace, typically with short steps. + + + Walk + Move at a regular pace by lifting and setting down each foot in turn never having both feet off the ground at once. + + + + Move-torso + Move body trunk. + + + Move-upper-extremity + Move arm, shoulder, and/or hand. + + Drop + Let or cause to fall vertically. + + + Grab + Seize suddenly or quickly. Snatch or clutch. + + + Grasp + Seize and hold firmly. + + + Hold-down + Prevent someone or something from moving by holding them firmly. + + + Lift + Raising something to higher position. + + + Make-fist + Close hand tightly with the fingers bent against the palm. + + + Point + Draw attention to something by extending a finger or arm. + + + Press + Apply pressure to something to flatten, shape, smooth or depress it. This action tag should be used to indicate key presses and mouse clicks. + + relatedTag + Push + + + + Push + Apply force in order to move something away. Use Press to indicate a key press or mouse click. + + relatedTag + Press + + + + Reach + Stretch out your arm in order to get or touch something. + + + Release + Make available or set free. + + + Retract + Draw or pull back. + + + Scratch + Drag claws or nails over a surface or on skin. + + + Snap-fingers + Make a noise by pushing second finger hard against thumb and then releasing it suddenly so that it hits the base of the thumb. + + + Touch + Come into or be in contact with. + + + + + + Perceive + Produce an internal, conscious image through stimulating a sensory system. + + Hear + Give attention to a sound. + + + See + Direct gaze toward someone or something or in a specified direction. + + + Smell + Inhale in order to ascertain an odor or scent. + + + Taste + Sense a flavor in the mouth and throat on contact with a substance. + + + Sense-by-touch + Sense something through receptors in the skin. + + + + Perform + Carry out or accomplish an action, task, or function. + + Close + Act as to blocked against entry or passage. + + + Collide-with + Hit with force when moving. + + + Halt + Bring or come to an abrupt stop. + + + Modify + Change something. + + + Open + Widen an aperture, door, or gap, especially one allowing access to something. + + + Operate + Control the functioning of a machine, process, or system. + + + Play + Engage in activity for enjoyment and recreation rather than a serious or practical purpose. + + + Read + Interpret something that is written or printed. + + + Repeat + Make do or perform again. + + + Rest + Be inactive in order to regain strength, health, or energy. + + + Write + Communicate or express by means of letters or symbols written or imprinted on a surface. + + + + Think + Direct the mind toward someone or something or use the mind actively to form connected ideas. + + Allow + Allow access to something such as allowing a car to pass. + + + Attend-to + Focus mental experience on specific targets. + + + Count + Tally items either silently or aloud. + + + Deny + Refuse to give or grant something requested or desired by someone. + + + Detect + Discover or identify the presence or existence of something. + + + Discriminate + Recognize a distinction. + + + Encode + Convert information or an instruction into a particular form. + + + Evade + Escape or avoid, especially by cleverness or trickery. + + + Generate + Cause something, especially an emotion or situation to arise or come about. + + + Identify + Establish or indicate who or what someone or something is. + + + Imagine + Form a mental image or concept of something. + + + Judge + Evaluate evidence to make a decision or form a belief. + + + Learn + Adaptively change behavior as the result of experience. + + + Memorize + Adaptively change behavior as the result of experience. + + + Plan + Think about the activities required to achieve a desired goal. + + + Predict + Say or estimate that something will happen or will be a consequence of something without having exact informaton. + + + Recognize + Identify someone or something from having encountered them before. + + + Respond + React to something such as a treatment or a stimulus. + + + Recall + Remember information by mental effort. + + + Switch-attention + Transfer attention from one focus to another. + + + Track + Follow a person, animal, or object through space or time. + + + + + Item + An independently existing thing (living or nonliving). + + extensionAllowed + + + Biological-item + An entity that is biological, that is related to living organisms. + + Anatomical-item + A biological structure, system, fluid or other substance excluding single molecular entities. + + Body-part + Any part of an organism. + + Head + The upper part of the human body, or the front or upper part of the body of an animal, typically separated from the rest of the body by a neck, and containing the brain, mouth, and sense organs. + + Hair + The filamentous outgrowth of the epidermis. + + + Ear + A sense organ needed for the detection of sound and for establishing balance. + + + Face + The anterior portion of the head extending from the forehead to the chin and ear to ear. The facial structures contain the eyes, nose and mouth, cheeks and jaws. + + Cheek + The fleshy part of the face bounded by the eyes, nose, ear, and jaw line. + + + Chin + The part of the face below the lower lip and including the protruding part of the lower jaw. + + + Eye + The organ of sight or vision. + + + Eyebrow + The arched strip of hair on the bony ridge above each eye socket. + + + Forehead + The part of the face between the eyebrows and the normal hairline. + + + Lip + Fleshy fold which surrounds the opening of the mouth. + + + Nose + A structure of special sense serving as an organ of the sense of smell and as an entrance to the respiratory tract. + + + Mouth + The proximal portion of the digestive tract, containing the oral cavity and bounded by the oral opening. + + + Teeth + The hard bonelike structures in the jaws. A collection of teeth arranged in some pattern in the mouth or other part of the body. + + + + + Lower-extremity + Refers to the whole inferior limb (leg and/or foot). + + Ankle + A gliding joint between the distal ends of the tibia and fibula and the proximal end of the talus. + + + Calf + The fleshy part at the back of the leg below the knee. + + + Foot + The structure found below the ankle joint required for locomotion. + + Big-toe + The largest toe on the inner side of the foot. + + + Heel + The back of the foot below the ankle. + + + Instep + The part of the foot between the ball and the heel on the inner side. + + + Little-toe + The smallest toe located on the outer side of the foot. + + + Toes + The terminal digits of the foot. + + + + Knee + A joint connecting the lower part of the femur with the upper part of the tibia. + + + Shin + Front part of the leg below the knee. + + + Thigh + Upper part of the leg between hip and knee. + + + + Torso + The body excluding the head and neck and limbs. + + Torso-back + The rear surface of the human body from the shoulders to the hips. + + + Buttocks + The round fleshy parts that form the lower rear area of a human trunk. + + + Torso-chest + The anterior side of the thorax from the neck to the abdomen. + + + Gentalia + The external organs of reproduction. + + + Hip + The lateral prominence of the pelvis from the waist to the thigh. + + + Waist + The abdominal circumference at the navel. + + + + Upper-extremity + Refers to the whole superior limb (shoulder, arm, elbow, wrist, hand). + + Elbow + A type of hinge joint located between the forearm and upper arm. + + + Forearm + Lower part of the arm between the elbow and wrist. + + + Hand + The distal portion of the upper extremity. It consists of the carpus, metacarpus, and digits. + + Finger + Any of the digits of the hand. + + Index-finger + The second finger from the radial side of the hand, next to the thumb. + + + Little-finger + The fifth and smallest finger from the radial side of the hand. + + + Middle-finger + The middle or third finger from the radial side of the hand. + + + Ring-finger + The fourth finger from the radial side of the hand. + + + Thumb + The thick and short hand digit which is next to the index finger in humans. + + + + Palm + The part of the inner surface of the hand that extends from the wrist to the bases of the fingers. + + + Knuckles + A part of a finger at a joint where the bone is near the surface, especially where the finger joins the hand. + + + + Shoulder + Joint attaching upper arm to trunk. + + + Upper-arm + Portion of arm between shoulder and elbow. + + + Wrist + A joint between the distal end of the radius and the proximal row of carpal bones. + + + + + + Organism + A living entity, more specifically a biological entity that consists of one or more cells and is capable of genomic replication (independently or not). + + Animal + A living organism that has membranous cell walls, requires oxygen and organic foods, and is capable of voluntary movement. + + + Human + The bipedal primate mammal Homo sapiens. + + + Plant + Any living organism that typically synthesizes its food from inorganic substances and possesses cellulose cell walls. + + + + + Language-item + An entity related to a systematic means of communicating by the use of sounds, symbols, or gestures. + + suggestedTag + Sensory-presentation + + + Character + A mark or symbol used in writing. + + + Clause + A unit of grammatical organization next below the sentence in rank, usually consisting of a subject and predicate. + + + Glyph + A hieroglyphic character, symbol, or pictograph. + + + Nonword + A group of letters or speech sounds that looks or sounds like a word but that is not accepted as such by native speakers. + + + Paragraph + A distinct section of a piece of writing, usually dealing with a single theme. + + + Phoneme + A speech sound that is distinguished by the speakers of a particular language. + + + Phrase + A phrase is a group of words functioning as a single unit in the syntax of a sentence. + + + Sentence + A set of words that is complete in itself, conveying a statement, question, exclamation, or command and typically containing an explicit or implied subject and a predicate containing a finite verb. + + + Syllable + A unit of spoken language larger than a phoneme. + + + Textblock + A block of text. + + + Word + A word is the smallest free form (an item that may be expressed in isolation with semantic or pragmatic content) in a language. + + + + Object + Something perceptible by one or more of the senses, especially by vision or touch. A material thing. + + suggestedTag + Sensory-presentation + + + Geometric-object + An object or a representation that has structure and topology in space. + + Pattern + An arrangement of objects, facts, behaviors, or other things which have scientific, mathematical, geometric, statistical, or other meaning. + + Dots + A small round mark or spot. + + + LED-pattern + A pattern created by lighting selected members of a fixed light emitting diode array. + + + + 2D-shape + A planar, two-dimensional shape. + + Clockface + The dial face of a clock. A location identifier based on clockface numbering or anatomic subregion. + + + Cross + A figure or mark formed by two intersecting lines crossing at their midpoints. + + + Dash + A horizontal stroke in writing or printing to mark a pause or break in sense or to represent omitted letters or words. + + + Ellipse + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Circle + A ring-shaped structure with every point equidistant from the center. + + + + Rectangle + A parallelogram with four right angles. + + Square + A square is a special rectangle with four equal sides. + + + + Single-point + A point is a geometric entity that is located in a zero-dimensional spatial region and whose position is defined by its coordinates in some coordinate system. + + + Star + A conventional or stylized representation of a star, typically one having five or more points. + + + Triangle + A three-sided polygon. + + + + 3D-shape + A geometric three-dimensional shape. + + Box + A square or rectangular vessel, usually made of cardboard or plastic. + + Cube + A solid or semi-solid in the shape of a three dimensional square. + + + + Cone + A shape whose base is a circle and whose sides taper up to a point. + + + Cylinder + A surface formed by circles of a given radius that are contained in a plane perpendicular to a given axis, whose centers align on the axis. + + + Ellipsoid + A closed plane curve resulting from the intersection of a circular cone and a plane cutting completely through it, especially a plane not parallel to the base. + + Sphere + A solid or hollow three-dimensional object bounded by a closed surface such that every point on the surface is equidistant from the center. + + + + Pyramid + A polyhedron of which one face is a polygon of any number of sides, and the other faces are triangles with a common vertex. + + + + + Ingestible-object + Something that can be taken into the body by the mouth for digestion or absorption. + + + Man-made-object + Something constructed by human means. + + Building + A structure that has a roof and walls and stands more or less permanently in one place. + + Room + An area within a building enclosed by walls and floor and ceiling. + + + Roof + A roof is the covering on the uppermost part of a building which provides protection from animals and weather, notably rain, but also heat, wind and sunlight. + + + Entrance + The means or place of entry. + + + Attic + A room or a space immediately below the roof of a building. + + + Basement + The part of a building that is wholly or partly below ground level. + + + + Clothing + A covering designed to be worn on the body. + + + Device + An object contrived for a specific purpose. + + Assistive-device + A device that help an individual accomplish a task. + + Glasses + Frames with lenses worn in front of the eye for vision correction, eye protection, or protection from UV rays. + + + Writing-device + A device used for writing. + + Pen + A common writing instrument used to apply ink to a surface for writing or drawing. + + + Pencil + An implement for writing or drawing that is constructed of a narrow solid pigment core in a protective casing that prevents the core from being broken or marking the hand. + + + + + Computing-device + An electronic device which take inputs and processes results from the inputs. + + Cellphone + A telephone with access to a cellular radio system so it can be used over a wide area, without a physical connection to a network. + + + Desktop-computer + A computer suitable for use at an ordinary desk. + + + Laptop-computer + A computer that is portable and suitable for use while traveling. + + + Tablet-computer + A small portable computer that accepts input directly on to its screen rather than via a keyboard or mouse. + + + + Engine + A motor is a machine designed to convert one or more forms of energy into mechanical energy. + + + IO-device + Hardware used by a human (or other system) to communicate with a computer. + + Input-device + A piece of equipment used to provide data and control signals to an information processing system such as a computer or information appliance. + + Computer-mouse + A hand-held pointing device that detects two-dimensional motion relative to a surface. + + Mouse-button + An electric switch on a computer mouse which can be pressed or clicked to select or interact with an element of a graphical user interface. + + + Scroll-wheel + A scroll wheel or mouse wheel is a wheel used for scrolling made of hard plastic with a rubbery surface usually located between the left and right mouse buttons and is positioned perpendicular to the mouse surface. + + + + Joystick + A control device that uses a movable handle to create two-axis input for a computer device. + + + Keyboard + A device consisting of mechanical keys that are pressed to create input to a computer. + + Keyboard-key + A button on a keyboard usually representing letters, numbers, functions, or symbols. + + # + Value of a keyboard key. + + takesValue + + + + + + Keypad + A device consisting of keys, usually in a block arrangement, that provides limited input to a system. + + Keypad-key + A key on a separate section of a computer keyboard that groups together numeric keys and those for mathematical or other special functions in an arrangement like that of a calculator. + + # + Value of keypad key. + + takesValue + + + + + + Microphone + A device designed to convert sound to an electrical signal. + + + Push-button + A switch designed to be operated by pressing a button. + + + + Output-device + Any piece of computer hardware equipment which converts information into human understandable form. + + Display-device + An output device for presentation of information in visual or tactile form the latter used for example in tactile electronic displays for blind people. + + Head-mounted-display + An instrument that functions as a display device, worn on the head or as part of a helmet, that has a small display optic in front of one (monocular HMD) or each eye (binocular HMD). + + + LED-display + A LED display is a flat panel display that uses an array of light-emitting diodes as pixels for a video display. + + + Computer-screen + An electronic device designed as a display or a physical device designed to be a protective meshwork. + + Screen-window + A part of a computer screen that contains a display different from the rest of the screen. A window is a graphical control element consisting of a visual area containing some of the graphical user interface of the program it belongs to and is framed by a window decoration. + + + + + Auditory-device + A device designed to produce sound. + + Headphones + An instrument that consists of a pair of small loudspeakers, or less commonly a single speaker, held close to ears and connected to a signal source such as an audio amplifier, radio, CD player or portable media player. + + + Loudspeaker + A device designed to convert electrical signals to sounds that can be heard. + + + + + Recording-device + A device that copies information in a signal into a persistent information bearer. + + EEG-recorder + A device for recording electric currents in the brain using electrodes applied to the scalp, to the surface of the brain, or placed within the substance of the brain. + + + File-storage + A device for recording digital information to a permanent media. + + + MEG-recorder + A device for measuring the magnetic fields produced by electrical activity in the brain, usually conducted externally. + + + Motion-capture + A device for recording the movement of objects or people. + + + Tape-recorder + A device for recording and reproduction usually using magnetic tape for storage that can be saved and played back. + + + + Touchscreen + A control component that operates an electronic device by pressing the display on the screen. + + + + Machine + A human-made device that uses power to apply forces and control movement to perform an action. + + + Measurement-device + A device in which a measure function inheres. + + Clock + A device designed to indicate the time of day or to measure the time duration of an event or action. + + Clock-face + A location identifier based on clockface numbering or anatomic subregion. + + + + + Robot + A mechanical device that sometimes resembles a living animal and is capable of performing a variety of often complex human tasks on command or by being programmed in advance. + + + Tool + A component that is not part of a device but is designed to support its assemby or operation. + + + + Document + A physical object, or electronic counterpart, that is characterized by containing writing which is meant to be human-readable. + + Letter + A written message addressed to a person or organization. + + + Note + A brief written record. + + + Book + A volume made up of pages fastened along one edge and enclosed between protective covers. + + + Notebook + A book for notes or memoranda. + + + + Furnishing + Furniture, fittings, and other decorative accessories, such as curtains and carpets, for a house or room. + + + Manufactured-material + Substances created or extracted from raw materials. + + Ceramic + A hard, brittle, heat-resistant and corrosion-resistant material made by shaping and then firing a nonmetallic mineral, such as clay, at a high temperature. + + + Glass + A brittle transparent solid with irregular atomic structure. + + + Paper + A thin sheet material produced by mechanically or chemically processing cellulose fibres derived from wood, rags, grasses or other vegetable sources in water. + + + Plastic + Various high-molecular-weight thermoplastic or thermosetting polymers that are capable of being molded, extruded, drawn, or otherwise shaped and then hardened into a form. + + + Steel + An alloy made up of iron with typically a few tenths of a percent of carbon to improve its strength and fracture resistance compared to iron. + + + + Media + Media are audo/visual/audiovisual modes of communicating information for mass consumption. + + Media-clip + A short segment of media. + + Audio-clip + A short segment of audio. + + + Audiovisual-clip + A short media segment containing both audio and video. + + + Video-clip + A short segment of video. + + + + Visualization + An planned process that creates images, diagrams or animations from the input data. + + Animation + A form of graphical illustration that changes with time to give a sense of motion or represent dynamic changes in the portrayal. + + + Art-installation + A large-scale, mixed-media constructions, often designed for a specific place or for a temporary period of time. + + + Braille + A display using a system of raised dots that can be read with the fingers by people who are blind. + + + Image + Any record of an imaging event whether physical or electronic. + + Cartoon + A type of illustration, sometimes animated, typically in a non-realistic or semi-realistic style. The specific meaning has evolved over time, but the modern usage usually refers to either an image or series of images intended for satire, caricature, or humor. A motion picture that relies on a sequence of illustrations for its animation. + + + Drawing + A representation of an object or outlining a figure, plan, or sketch by means of lines. + + + Icon + A sign (such as a word or graphic symbol) whose form suggests its meaning. + + + Painting + A work produced through the art of painting. + + + Photograph + An image recorded by a camera. + + + + Movie + A sequence of images displayed in succession giving the illusion of continuous movement. + + + Outline-visualization + A visualization consisting of a line or set of lines enclosing or indicating the shape of an object in a sketch or diagram. + + + Point-light-visualization + A display in which action is depicted using a few points of light, often generated from discrete sensors in motion capture. + + + Sculpture + A two- or three-dimensional representative or abstract forms, especially by carving stone or wood or by casting metal or plaster. + + + Stick-figure-visualization + A drawing showing the head of a human being or animal as a circle and all other parts as straight lines. + + + + + Navigational-object + An object whose purpose is to assist directed movement from one location to another. + + Path + A trodden way. A way or track laid down for walking or made by continual treading. + + + Road + An open way for the passage of vehicles, persons, or animals on land. + + Lane + A defined path with physical dimensions through which an object or substance may traverse. + + + + Runway + A paved strip of ground on a landing field for the landing and takeoff of aircraft. + + + + Vehicle + A mobile machine which transports people or cargo. + + Aircraft + A vehicle which is able to travel through air in an atmosphere. + + + Bicycle + A human-powered, pedal-driven, single-track vehicle, having two wheels attached to a frame, one behind the other. + + + Boat + A watercraft of any size which is able to float or plane on water. + + + Car + A wheeled motor vehicle used primarily for the transportation of human passengers. + + + Cart + A cart is a vehicle which has two wheels and is designed to transport human passengers or cargo. + + + Tractor + A mobile machine specifically designed to deliver a high tractive effort at slow speeds, and mainly used for the purposes of hauling a trailer or machinery used in agriculture or construction. + + + Train + A connected line of railroad cars with or without a locomotive. + + + Truck + A motor vehicle which, as its primary funcion, transports cargo rather than human passangers. + + + + + Natural-object + Something that exists in or is produced by nature, and is not artificial or man-made. + + Mineral + A solid, homogeneous, inorganic substance occurring in nature and having a definite chemical composition. + + + Natural-feature + A feature that occurs in nature. A prominent or identifiable aspect, region, or site of interest. + + Field + An unbroken expanse as of ice or grassland. + + + Hill + A rounded elevation of limited extent rising above the surrounding land with local relief of less than 300m. + + + Mountain + A landform that extends above the surrounding terrain in a limited area. + + + River + A natural freshwater surface stream of considerable volume and a permanent or seasonal flow, moving in a definite channel toward a sea, lake, or another river. + + + Waterfall + A sudden descent of water over a step or ledge in the bed of a river. + + + + + + Sound + Mechanical vibrations transmitted by an elastic medium. Something that can be heard. + + Environmental-sound + Sounds occuring in the environment. An accumulation of noise pollution that occurs outside. This noise can be caused by transport, industrial, and recreational activities. + + Crowd-sound + Noise produced by a mixture of sounds from a large group of people. + + + Signal-noise + Any part of a signal that is not the true or original signal but is introduced by the communication mechanism. + + + + Musical-sound + Sound produced by continuous and regular vibrations, as opposed to noise. + + Tone + A musical note, warble, or other sound used as a particular signal on a telephone or answering machine. + + + Instrument-sound + Sound produced by a musical instrument. + + + Vocalized-sound + Musical sound produced by vocal cords in a biological agent. + + + + Named-animal-sound + A sound recognizable as being associated with particular animals. + + Barking + Sharp explosive cries like sounds made by certain animals, especially a dog, fox, or seal. + + + Bleating + Wavering cries like sounds made by a sheep, goat, or calf. + + + Crowing + Loud shrill sounds characteristic of roosters. + + + Chirping + Short, sharp, high-pitched noises like sounds made by small birds or an insects. + + + Growling + Low guttural sounds like those that made in the throat by a hostile dog or other animal. + + + Meowing + Vocalizations like those made by as those cats. These sounds have diverse tones and are sometimes chattered, murmured or whispered. The purpose can be assertive. + + + Mooing + Deep vocal sounds like those made by a cow. + + + Purring + Low continuous vibratory sound such as those made by cats. The sound expresses contentment. + + + Roaring + Loud, deep, or harsh prolonged sounds such as those made by big cats and bears for long-distance communication and intimidation. + + + Squawking + Loud, harsh noises such as those made by geese. + + + + Named-object-sound + A sound identifiable as coming from a particular type of object. + + Alarm-sound + A loud signal often loud continuous ringing to alert people to a problem or condition that requires urgent attention. + + + Beep + A short, single tone, that is typically high-pitched and generally made by a computer or other machine. + + + Buzz + A persistent vibratory sound often made by a buzzer device and used to indicate something incorrect. + + + Ka-ching + The sound made by a mechanical cash register, often to designate a reward. + + + Click + The sound made by a mechanical cash register, often to designate a reward. + + + Ding + A short ringing sound such as that made by a bell, often to indicate a correct response or the expiration of time. + + + Horn-blow + A loud sound made by forcing air through a sound device that funnels air to create the sound, often used to sound an alert. + + + Siren + A loud, continuous sound often varying in frequency designed to indicate an emergency. + + + + + + Property + Something that pertains to a thing. A characteristic of some entity. A quality or feature regarded as a characteristic or inherent part of someone or something. HED attributes are adjectives or adverbs. + + extensionAllowed + + + Agent-property + Something that pertains to an agent. + + extensionAllowed + + + Agent-state + The state of the agent. + + Agent-cognitive-state + The state of the cognitive processes or state of mind of the agent. + + Alert + Condition of heightened watchfulness or preparation for action. + + + Anesthetized + Having lost sensation to pain or having senses dulled due to the effects of an anesthetic. + + + Asleep + Having entered a periodic, readily reversible state of reduced awareness and metabolic activity, usually accompanied by physical relaxation and brain activity. + + + Attentive + Concentrating and focusing mental energy on the task or surroundings. + + + Awake + In a non sleeping state. + + + Brain-dead + Characterized by the irreversible absence of cortical and brain stem functioning. + + + Comatose + In a state of profound unconsciousness associated with markedly depressed cerebral activity. + + + Drowsy + In a state of near-sleep, a strong desire for sleep, or sleeping for unusually long periods. + + + Intoxicated + In a state with disturbed psychophysiological functions and responses as a result of administration or ingestion of a psychoactive substance. + + + Locked-in + In a state of complete paralysis of all voluntary muscles except for the ones that control the movements of the eyes. + + + Passive + Not responding or initiating an action in response to a stimulus. + + + Resting + A state in which the agent is not exhibiting any physical exertion. + + + Vegetative + A state of wakefulness and conscience, but (in contrast to coma) with involuntary opening of the eyes and movements (such as teeth grinding, yawning, or thrashing of the extremities). + + + + Agent-emotional-state + The status of the general temperament and outlook of an agent. + + Angry + Experiencing emotions characterized by marked annoyance or hostility. + + + Aroused + In a state reactive to stimuli leading to increased heart rate and blood pressure, sensory alertness, mobility and readiness to respond. + + + Awed + Filled with wonder. Feeling grand, sublime or powerful emotions characterized by a combination of joy, fear, admiration, reverence, and/or respect. + + + Compassionate + Feeling or showing sympathy and concern for others often evoked for a person who is in distress and associated with altruistic motivation. + + + Content + Feeling satisfaction with things as they are. + + + Disgusted + Feeling revulsion or profound disapproval aroused by something unpleasant or offensive. + + + Emotionally-neutral + Feeling neither satisfied nor dissatisfied. + + + Empathetic + Understanding and sharing the feelings of another. Being aware of, being sensitive to, and vicariously experiencing the feelings, thoughts, and experience of another. + + + Excited + Feeling great enthusiasm and eagerness. + + + Fearful + Feeling apprehension that one may be in danger. + + + Frustrated + Feeling annoyed as a result of being blocked, thwarted, disappointed or defeated. + + + Grieving + Feeling sorrow in response to loss, whether physical or abstract. + + + Happy + Feeling pleased and content. + + + Jealous + Feeling threatened by a rival in a relationship with another individual, in particular an intimate partner, usually involves feelings of threat, fear, suspicion, distrust, anxiety, anger, betrayal, and rejection. + + + Joyful + Feeling delight or intense happiness. + + + Loving + Feeling a strong positive emotion of affection and attraction. + + + Relieved + No longer feeling pain, distress, anxiety, or reassured. + + + Sad + Feeling grief or unhappiness. + + + Stressed + Experiencing mental or emotional strain or tension. + + + + Agent-physiological-state + Having to do with the mechanical, physical, or biochemical function of an agent. + + Healthy + Having no significant health-related issues. + + relatedTag + Sick + + + + Hungry + Being in a state of craving or desiring food. + + relatedTag + Sated + Thirsty + + + + Rested + Feeling refreshed and relaxed. + + relatedTag + Tired + + + + Sated + Feeling full. + + relatedTag + Hungry + + + + Sick + Being in a state of ill health, bodily malfunction, or discomfort. + + relatedTag + Healthy + + + + Thirsty + Feeling a need to drink. + + relatedTag + Hungry + + + + Tired + Feeling in need of sleep or rest. + + relatedTag + Rested + + + + + Agent-postural-state + Pertaining to the position in which agent holds their body. + + Crouching + Adopting a position where the knees are bent and the upper body is brought forward and down, sometimes to avoid detection or to defend oneself. + + + Eyes-closed + Keeping eyes closed with no blinking. + + + Eyes-open + Keeping eyes open with occasional blinking. + + + Kneeling + Positioned where one or both knees are on the ground. + + + On-treadmill + Ambulation on an exercise apparatus with an endless moving belt to support moving in place. + + + Prone + Positioned in a recumbent body position whereby the person lies on its stomach and faces downward. + + + Sitting + In a seated position. + + + Standing + Assuming or maintaining an erect upright position. + + + Seated-with-chin-rest + Using a device that supports the chin and head. + + + + + Agent-task-role + The function or part that is ascribed to an agent in performing the task. + + Experiment-actor + An agent who plays a predetermined role to create the experiment scenario. + + + Experiment-controller + An agent exerting control over some aspect of the experiment. + + + Experiment-participant + Someone who takes part in an activity related to an experiment. + + + Experimenter + Person who is the owner of the experiment and has its responsibility. + + + + Agent-trait + A genetically, environmentally, or socially determined characteristic of an agent. + + Age + Length of time elapsed time since birth of the agent. + + # + + takesValue + + + + + Agent-experience-level + Amount of skill or knowledge that the agent has as pertains to the task. + + Expert-level + Having comprehensive and authoritative knowledge of or skill in a particular area related to the task. + + relatedTag + Intermediate-experience-level + Novice-level + + + + Intermediate-experience-level + Having a moderate amount of knowledge or skill related to the task. + + relatedTag + Expert-level + Novice-level + + + + Novice-level + Being inexperienced in a field or situation related to the task. + + relatedTag + Expert-level + Intermediate-experience-level + + + + + Gender + Characteristics that are socially constructed, including norms, behaviors, and roles based on sex. + + + Sex + Physical properties or qualities by which male is distinguished from female. + + Female + Biological sex of an individual with female sexual organs such ova. + + + Male + Biological sex of an individual with male sexual organs producing sperm. + + + Intersex + Having genitalia and/or secondary sexual characteristics of indeterminate sex. + + + + Handedness + Individual preference for use of a hand, known as the dominant hand. + + Left-handed + Preference for using the left hand or foot for tasks requiring the use of a single hand or foot. + + + Right-handed + Preference for using the right hand or foot for tasks requiring the use of a single hand or foot. + + + Ambidextrous + Having no overall dominance in the use of right or left hand or foot in the performance of tasks that require one hand or foot. + + + + + + Data-property + Something that pertains to data or information. + + extensionAllowed + + + Data-marker + An indicator placed to mark something. + + Temporal-marker + An indicator placed at a particular time in the data. + + Onset + Labels the start or beginning of something, usually an event. + + topLevelTagGroup + + + + Offset + Labels the time at which something stops. + + topLevelTagGroup + + + + Pause + Indicates the temporary interruption of the operation a process and subsequently wait for a signal to continue. + + + Time-out + A cancellation or cessation that automatically occurs when a predefined interval of time has passed without a certain event occurring. + + + Time-sync + A synchronization signal whose purpose to help synchronize different signals or processes. Often used to indicate a marker inserted into the recorded data to allow post hoc synchronization of concurrently recorded data streams. + + + + + Data-resolution + Smallest change in a quality being measured by an sensor that causes a perceptible change. + + Printer-resolution + Resolution of a printer, usually expressed as the number of dots-per-inch for a printer. + + # + + takesValue + + + + + Screen-resolution + Resolution of a screen, usually expressed as the of pixels in a dimension for a digital display device. + + # + + takesValue + + + + + Sensory-resolution + Resolution of measurements by a sensing device. + + # + + takesValue + + + + + Spatial-resolution + Linear spacing of a spatial measurement. + + # + + takesValue + + + + + Spectral-resolution + Measures the ability of a sensor to resolve features in the electromagnetic spectrum. + + # + + takesValue + + + + + Temporal-resolution + Measures the ability of a sensor to resolve features in time. + + # + + takesValue + + + + + + Data-source-type + The type of place, person, or thing from which the data comes or can be obtained. + + Computed-feature + A feature computed from the data by a tool. This tag should be grouped with a label of the form Toolname_propertyName. + + + Computed-prediction + A computed extrapolation of known data. + + + Expert-annotation + An explanatory or critical comment or other in-context information provided by an authority. + + + Instrument-measurement + Information obtained from a device that is used to measure material properties or make other observations. + + + Observation + Active acquisition of information from a primary source. Should be grouped with a label of the form AgentID_featureName. + + + + Data-value + Designation of the type of a data item. + + Categorical-value + Indicates that something can take on a limited and usually fixed number of possible values. + + Categorical-class-value + Categorical values that fall into discrete classes such as true or false. The grouping is absolute in the sense that it is the same for all participants. + + All + To a complete degree or to the full or entire extent. + + relatedTag + Some + None + + + + Correct + Free from error. Especially conforming to fact or truth. + + relatedTag + Wrong + + + + Explicit + Stated clearly and in detail, leaving no room for confusion or doubt. + + relatedTag + Implicit + + + + False + Not in accordance with facts, reality or definitive criteria. + + relatedTag + True + + + + Implicit + Implied though not plainly expressed. + + relatedTag + Explicit + + + + Invalid + Not allowed or not conforming to the correct format or specifications. + + relatedTag + Valid + + + + None + No person or thing, nobody, not any. + + relatedTag + All + Some + + + + Some + At least a small amount or number of, but not a large amount of, or often. + + relatedTag + All + None + + + + True + Conforming to facts, reality or definitive criteria. + + relatedTag + False + + + + Valid + Allowable, usable, or acceptable. + + relatedTag + Invalid + + + + Wrong + Inaccurate or not correct. + + relatedTag + Correct + + + + + Categorical-judgment-value + Categorical values that are based on the judgment or perception of the participant such familiar and famous. + + Abnormal + Deviating in any way from the state, position, structure, condition, behavior, or rule which is considered a norm. + + relatedTag + Normal + + + + Asymmetrical + Lacking symmetry or having parts that fail to correspond to one another in shape, size, or arrangement. + + relatedTag + Symmetrical + + + + Audible + A sound that can be perceived by the participant. + + relatedTag + Inaudible + + + + Congruent + Concordance of multiple evidence lines. In agreement or harmony. + + relatedTag + Incongruent + + + + Complex + Hard, involved or complicated, elaborate, having many parts. + + relatedTag + Simple + + + + Constrained + Keeping something within particular limits or bounds. + + relatedTag + Unconstrained + + + + Disordered + Not neatly arranged. Confused and untidy. A structural quality in which the parts of an object are non-rigid. + + relatedTag + Ordered + + + + Familiar + Recognized, familiar, or within the scope of knowledge. + + relatedTag + Unfamiliar + Famous + + + + Famous + A person who has a high degree of recognition by the general population for his or her success or accomplishments. A famous person. + + relatedTag + Familiar + Unfamiliar + + + + Inaudible + A sound below the threshold of perception of the participant. + + relatedTag + Audible + + + + Incongruent + Not in agreement or harmony. + + relatedTag + Congruent + + + + Involuntary + An action that is not made by choice. In the body, involuntary actions (such as blushing) occur automatically, and cannot be controlled by choice. + + relatedTag + Voluntary + + + + Masked + Information exists but is not provided or is partially obscured due to security, privacy, or other concerns. + + relatedTag + Unmasked + + + + Normal + Being approximately average or within certain limits. Conforming with or constituting a norm or standard or level or type or social norm. + + relatedTag + Abnormal + + + + Ordered + Conforming to a logical or comprehensible arrangement of separate elements. + + relatedTag + Disordered + + + + Simple + Easily understood or presenting no difficulties. + + relatedTag + Complex + + + + Symmetrical + Made up of exactly similar parts facing each other or around an axis. Showing aspects of symmetry. + + relatedTag + Asymmetrical + + + + Unconstrained + Moving without restriction. + + relatedTag + Constrained + + + + Unfamiliar + Not having knowledge or experience of. + + relatedTag + Familiar + Famous + + + + Unmasked + Information is revealed. + + relatedTag + Masked + + + + Voluntary + Using free will or design; not forced or compelled; controlled by individual volition. + + relatedTag + Involuntary + + + + + Categorical-level-value + Categorical values based on dividing a continuous variable into levels such as high and low. + + Cold + Characterized by an absence of heat. + + relatedTag + Hot + + + + Deep + Extending relatively far inward or downward. + + relatedTag + Shallow + + + + High + Having a greater than normal degree, intensity, or amount. + + relatedTag + Low + Medium + + + + Hot + Characterized by an excess of heat. + + relatedTag + Cold + + + + Liminal + Situated at a sensory threshold that is barely perceptible or capable of eliciting a response. + + relatedTag + Subliminal + Supraliminal + + + + Loud + Characterizing a perceived high intensity of sound. + + relatedTag + Quiet + + + + Low + Less than normal in degree, intensity or amount. + + relatedTag + High + + + + Medium + Mid-way between small and large in number, quantity, magnitude or extent. + + relatedTag + Low + High + + + + Negative + Involving disadvantage or harm. + + relatedTag + Positive + + + + Positive + Involving advantage or good. + + relatedTag + Negative + + + + Quiet + Characterizing a perceived low intensity of sound. + + relatedTag + Loud + + + + Rough + Having a surface with perceptible bumps, ridges, or irregularities. + + relatedTag + Smooth + + + + Shallow + Having a depth which is relatively low. + + relatedTag + Deep + + + + Smooth + Having a surface free from bumps, ridges, or irregularities. + + relatedTag + Rough + + + + Subliminal + Situated below a sensory threshold that is imperceptible or not capable of eliciting a response. + + relatedTag + Liminal + Supraliminal + + + + Supraliminal + Situated above a sensory threshold that is perceptible or capable of eliciting a response. + + relatedTag + Liminal + Subliminal + + + + Thick + Wide in width, extent or cross-section. + + relatedTag + Thin + + + + Thin + Narrow in width, extent or cross-section. + + relatedTag + Thick + + + + + Categorical-orientation-value + Value indicating the orientation or direction of something. + + Backward + Directed behind or to the rear. + + relatedTag + Forward + + + + Downward + Moving or leading toward a lower place or level. + + relatedTag + Leftward + Rightward + Upward + + + + Forward + At or near or directed toward the front. + + relatedTag + Backward + + + + Horizontally-oriented + Oriented parallel to or in the plane of the horizon. + + relatedTag + Vertically-oriented + + + + Leftward + Going toward or facing the left. + + relatedTag + Downward + Rightward + Upward + + + + Oblique + Slanting or inclined in direction, course, or position that is neither parallel nor perpendicular nor right-angular. + + relatedTag + Rotated + + + + Rightward + Going toward or situated on the right. + + relatedTag + Downward + Leftward + Upward + + + + Rotated + Positioned offset around an axis or center. + + + Upward + Moving, pointing, or leading to a higher place, point, or level. + + relatedTag + Downward + Leftward + Rightward + + + + Vertically-oriented + Oriented perpendicular to the plane of the horizon. + + relatedTag + Horizontally-oriented + + + + + + Physical-value + The value of some physical property of something. + + Weight + The relative mass or the quantity of matter contained by something. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + weightUnits + + + + + + Quantitative-value + Something capable of being estimated or expressed with numeric values. + + Fraction + A numerical value between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-count + The integer count of something which is usually grouped with the entity it is counting. (Item-count/3, A) indicates that 3 of A have occurred up to this point. + + # + + takesValue + + + valueClass + numericClass + + + + + Item-interval + An integer indicating how many items or entities have passed since the last one of these. An item interval of 0 indicates the current item. + + # + + takesValue + + + valueClass + numericClass + + + + + Percentage + A fraction or ratio with 100 understood as the denominator. + + # + + takesValue + + + valueClass + numericClass + + + + + Ratio + A quotient of quantities of the same kind for different components within the same system. + + # + + takesValue + + + valueClass + numericClass + + + + + + Statistical-value + A value based on or employing the principles of statistics. + + extensionAllowed + + + Data-maximum + The largest possible quantity or degree. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-mean + The sum of a set of values divided by the number of values in the set. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-median + The value which has an equal number of values greater and less than it. + + # + + takesValue + + + valueClass + numericClass + + + + + Data-minimum + The smallest possible quantity. + + # + + takesValue + + + valueClass + numericClass + + + + + Probability + A measure of the expectation of the occurrence of a particular event. + + # + + takesValue + + + valueClass + numericClass + + + + + Standard-deviation + A measure of the range of values in a set of numbers. Standard deviation is a statistic used as a measure of the dispersion or variation in a distribution, equal to the square root of the arithmetic mean of the squares of the deviations from the arithmetic mean. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-accuracy + A measure of closeness to true value expressed as a number between 0 and 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-precision + A quantitative representation of the degree of accuracy necessary for or associated with a particular action. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-recall + Sensitivity is a measurement datum qualifying a binary classification test and is computed by substracting the false negative rate to the integral numeral 1. + + # + + takesValue + + + valueClass + numericClass + + + + + Statistical-uncertainty + A measure of the inherent variability of repeated observation measurements of a quantity including quantities evaluated by statistical methods and by other means. + + # + + takesValue + + + valueClass + numericClass + + + + + + Spatiotemporal-value + A property relating to space and/or time. + + Rate-of-change + The amount of change accumulated per unit time. + + Acceleration + Magnitude of the rate of change in either speed or direction. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + accelerationUnits + + + + + Frequency + Frequency is the number of occurrences of a repeating event per unit time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Jerk-rate + Magnitude of the rate at which the acceleration of an object changes with respect to time. The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + jerkUnits + + + + + Sampling-rate + The number of digital samples taken or recorded per unit of time. + + # + + takesValue + + + unitClass + frequencyUnits + + + + + Refresh-rate + The frequency with which the image on a computer monitor or similar electronic display screen is refreshed, usually expressed in hertz. + + # + + takesValue + + + valueClass + numericClass + + + + + Speed + A scalar measure of the rate of movement of the object expressed either as the distance travelled divided by the time taken (average speed) or the rate of change of position with respect to time at a particular point (instantaneous speed). The direction of change should be given separately. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + speedUnits + + + + + Temporal-rate + The number of items per unit of time. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + + Spatial-value + Value of an item involving space. + + Angle + The amount of inclination of one line to another or the plane of one object to another. + + # + + takesValue + + + unitClass + angleUnits + + + valueClass + numericClass + + + + + Distance + A measure of the space separating two objects or points. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Position + A reference to the alignment of an object, a particular situation or view of a situation, or the location of an object. Coordinates with respect a specified frame of reference or the default Screen-frame if no frame is given. + + X-position + The position along the x-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Y-position + The position along the y-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Z-position + The position along the z-axis of the frame of reference. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + + Size + The physical magnitude of something. + + Area + The extent of a 2-dimensional surface enclosed within a boundary. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + areaUnits + + + + + Depth + The distance from the surface of something especially from the perspective of looking from the front. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Length + The linear extent in space from one end of something to the other end, or the extent of something from beginning to end. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Width + The extent or measurement of something from side to side. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Height + The vertical measurement or distance from the base to the top of an object. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + physicalLengthUnits + + + + + Volume + The amount of three dimensional space occupied by an object or the capacity of a space or container. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + volumeUnits + + + + + + + Temporal-value + A characteristic of or relating to time or limited by time. + + Delay + Time during which some action is awaited. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Duration + The period of time during which something occurs or continues. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-interval + The period of time separating two instances, events, or occurrences. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Time-value + A value with units of time. Usually grouped with tags identifying what the value represents. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + + + Data-variability-attribute + An attribute describing how something changes or varies. + + Abrupt + Marked by sudden change. + + + Constant + Continually recurring or continuing without interruption. Not changing in time or space. + + + Continuous + Uninterrupted in time, sequence, substance, or extent. + + relatedTag + Discrete + Discontinuous + + + + Decreasing + Becoming smaller or fewer in size, amount, intensity, or degree. + + relatedTag + Increasing + + + + Deterministic + No randomness is involved in the development of the future states of the element. + + relatedTag + Random + Stochastic + + + + Discontinuous + Having a gap in time, sequence, substance, or extent. + + relatedTag + Continuous + + + + Discrete + Constituting a separate entities or parts. + + relatedTag + Continuous + Discontinuous + + + + Flickering + Moving irregularly or unsteadily or burning or shining fitfully or with a fluctuating light. + + + Estimated-value + Something that has been calculated or measured approximately. + + + Exact-value + A value that is viewed to the true value according to some standard. + + + Fractal + Having extremely irregular curves or shapes for which any suitably chosen part is similar in shape to a given larger or smaller part when magnified or reduced to the same size. + + + Increasing + Becoming greater in size, amount, or degree. + + relatedTag + Decreasing + + + + Random + Governed by or depending on chance. Lacking any definite plan or order or purpose. + + relatedTag + Deterministic + Stochastic + + + + Repetitive + A recurring action that is often non-purposeful. + + + Stochastic + Uses a random probability distribution or pattern that may be analysed statistically but may not be predicted precisely to determine future states. + + relatedTag + Deterministic + Random + + + + Varying + Differing in size, amount, degree, or nature. + + + + + Environmental-property + Relating to or arising from the surroundings of an agent. + + Indoors + Located inside a building or enclosure. + + + Outdoors + Any area outside a building or shelter. + + + Real-world + Located in a place that exists in real space and time under realistic conditions. + + + Virtual-world + Using technology that creates immersive, computer-generated experiences that a person can interact with and navigate through. The digital content is generally delivered to the user through some type of headset and responds to changes in head position or through interaction with other types of sensors. Existing in a virtual setting such as a simulation or game environment. + + + Augmented-reality + Using technology that enhances real-world experiences with computer-derived digital overlays to change some aspects of perception of the natural environment. The digital content is shown to the user through a smart device or glasses and responds to changes in the environment. + + + Motion-platform + A mechanism that creates the feelings of being in a real motion environment. + + + Urban + Relating to, located in, or characteristic of a city or densely populated area. + + + Rural + Of or pertaining to the country as opposed to the city. + + + Terrain + Characterization of the physical features of a tract of land. + + Composite-terrain + Tracts of land characterized by a mixure of physical features. + + + Dirt-terrain + Tracts of land characterized by a soil surface and lack of vegetation. + + + Grassy-terrain + Tracts of land covered by grass. + + + Gravel-terrain + Tracts of land covered by a surface consisting a loose aggregation of small water-worn or pounded stones. + + + Leaf-covered-terrain + Tracts of land covered by leaves and composited organic material. + + + Muddy-terrain + Tracts of land covered by a liquid or semi-liquid mixture of water and some combination of soil, silt, and clay. + + + Paved-terrain + Tracts of land covered with concrete, asphalt, stones, or bricks. + + + Rocky-terrain + Tracts of land consisting or full of rock or rocks. + + + Sloped-terrain + Tracts of land arranged in a sloping or inclined position. + + + Uneven-terrain + Tracts of land that are not level, smooth, or regular. + + + + + Informational-property + Something that pertains to a task. + + extensionAllowed + + + Description + An explanation of what the tag group it is in means. If the description is at the top-level of an event string, the description applies to the event. + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + ID + An alphanumeric name that identifies either a unique object or a unique class of objects. Here the object or class may be an idea, physical countable object (or class), or physical uncountable substance (or class). + + requireChild + + + # + + takesValue + + + valueClass + textClass + + + + + Label + A string of 20 or fewer characters identifying something. Labels usually refer to general classes of things while IDs refer to specific instances. A term that is associated with some entity. A brief description given for purposes of identification. An identifying or descriptive marker that is attached to an object. + + requireChild + + + # + + takesValue + + + valueClass + nameClass + + + + + Metadata + Data about data. Information that describes another set of data. + + CogAtlas + The Cognitive Atlas ID number of something. + + # + + takesValue + + + + + CogPo + The CogPO ID number of something. + + # + + takesValue + + + + + Creation-date + The date on which data creation of this element began. + + requireChild + + + # + + takesValue + + + valueClass + dateTimeClass + + + + + Experimental-note + A brief written record about the experiment. + + # + + takesValue + + + valueClass + textClass + + + + + Library-name + Official name of a HED library. + + # + + takesValue + + + valueClass + nameClass + + + + + OBO-identifier + The identifier of a term in some Open Biology Ontology (OBO) ontology. + + # + + takesValue + + + valueClass + nameClass + + + + + Pathname + The specification of a node (file or directory) in a hierarchical file system, usually specified by listing the nodes top-down. + + # + + takesValue + + + + + Subject-identifier + A sequence of characters used to identify, name, or characterize a trial or study subject. + + # + + takesValue + + + + + Version-identifier + An alphanumeric character string that identifies a form or variant of a type or original. + + # + Usually is a semantic version. + + takesValue + + + + + + Parameter + Something user-defined for this experiment. + + Parameter-label + The name of the parameter. + + # + + takesValue + + + valueClass + nameClass + + + + + Parameter-value + The value of the parameter. + + # + + takesValue + + + valueClass + textClass + + + + + + + Organizational-property + Relating to an organization or the action of organizing something. + + Collection + A tag designating a grouping of items such as in a set or list. + + # + Name of the collection. + + takesValue + + + valueClass + nameClass + + + + + Condition-variable + An aspect of the experiment or task that is to be varied during the experiment. Task-conditions are sometimes called independent variables or contrasts. + + # + Name of the condition variable. + + takesValue + + + valueClass + nameClass + + + + + Control-variable + An aspect of the experiment that is fixed throughout the study and usually is explicitly controlled. + + # + Name of the control variable. + + takesValue + + + valueClass + nameClass + + + + + Def + A HED-specific utility tag used with a defined name to represent the tags associated with that definition. + + requireChild + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Def-expand + A HED specific utility tag that is grouped with an expanded definition. The child value of the Def-expand is the name of the expanded definition. + + requireChild + + + tagGroup + + + # + + takesValue + + + valueClass + nameClass + + + + + Definition + A HED-specific utility tag whose child value is the name of the concept and the tag group associated with the tag is an English language explanation of a concept. + + requireChild + + + topLevelTagGroup + + + # + Name of the definition. + + takesValue + + + valueClass + nameClass + + + + + Event-context + A special HED tag inserted as part of a top-level tag group to contain information about the interrelated conditions under which the event occurs. The event context includes information about other events that are ongoing when this event happens. + + topLevelTagGroup + + + unique + + + + Event-stream + A special HED tag indicating that this event is a member of an ordered succession of events. + + # + Name of the event stream. + + takesValue + + + valueClass + nameClass + + + + + Experimental-intertrial + A tag used to indicate a part of the experiment between trials usually where nothing is happening. + + # + Optional label for the intertrial block. + + takesValue + + + valueClass + nameClass + + + + + Experimental-trial + Designates a run or execution of an activity, for example, one execution of a script. A tag used to indicate a particular organizational part in the experimental design often containing a stimulus-response pair or stimulus-response-feedback triad. + + # + Optional label for the trial (often a numerical string). + + takesValue + + + valueClass + nameClass + + + + + Indicator-variable + An aspect of the experiment or task that is measured as task conditions are varied during the experiment. Experiment indicators are sometimes called dependent variables. + + # + Name of the indicator variable. + + takesValue + + + valueClass + nameClass + + + + + Recording + A tag designating the data recording. Recording tags are usually have temporal scope which is the entire recording. + + # + Optional label for the recording. + + takesValue + + + valueClass + nameClass + + + + + Task + An assigned piece of work, usually with a time allotment. A tag used to indicate a linkage the structured activities performed as part of the experiment. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + Time-block + A tag used to indicate a contiguous time block in the experiment during which something is fixed or noted. + + # + Optional label for the task block. + + takesValue + + + valueClass + nameClass + + + + + + Sensory-property + Relating to sensation or the physical senses. + + Sensory-attribute + A sensory characteristic associated with another entity. + + Auditory-attribute + Pertaining to the sense of hearing. + + Loudness + Perceived intensity of a sound. + + # + + takesValue + + + valueClass + numericClass + + + + + Pitch + A perceptual property that allows the user to order sounds on a frequency scale. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + frequencyUnits + + + + + Sound-envelope + Description of how a sound changes over time. + + Sound-envelope-attack + The time taken for initial run-up of level from nil to peak usually beginning when the key on a musical instrument is pressed. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-decay + The time taken for the subsequent run down from the attack level to the designated sustain level. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-release + The time taken for the level to decay from the sustain level to zero after the key is released + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + Sound-envelope-sustain + The time taken for the main sequence of the sound duration, until the key is released. + + # + + takesValue + + + valueClass + numericClass + + + unitClass + timeUnits + + + + + + Timbre + The perceived sound quality of a singing voice or musical instrument. + + # + + takesValue + + + valueClass + labelClass + + + + + + Gustatory-attribute + Pertaining to the sense of taste. + + Bitter + Having a sharp, pungent taste. + + + Salty + Tasting of or like salt. + + + Savory + Belonging to a taste that is salty or spicy rather than sweet. + + + Sour + Having a sharp, acidic taste. + + + Sweet + Having or resembling the taste of sugar. + + + + Olfactory-attribute + Having a smell. + + + Somatic-attribute + Pertaining to the feelings in the body or of the nervous system. + + Pain + The sensation of discomfort, distress, or agony, resulting from the stimulation of specialized nerve endings. + + + Stress + The negative mental, emotional, and physical reactions that occur when environmental stressors are perceived as exceeding the adaptive capacities of the individual. + + + + Tactile-attribute + Pertaining to the sense of touch. + + Tactile-pressure + Having a feeling of heaviness. + + + Tactile-temperature + Having a feeling of hotness or coldness. + + + Tactile-texture + Having a feeling of roughness. + + + Tactile-vibration + Having a feeling of mechanical oscillation. + + + + Vestibular-attribute + Pertaining to the sense of balance or body position. + + + Visual-attribute + Pertaining to the sense of sight. + + Color + The appearance of objects (or light sources) described in terms of perception of their hue and lightness (or brightness) and saturation. + + CSS-color + One of 140 colors supported by all browsers. For more details such as the color RGB or HEX values, check: https://www.w3schools.com/colors/colors_groups.asp + + Blue-color + CSS color group + + CadetBlue + CSS-color 0x5F9EA0 + + + SteelBlue + CSS-color 0x4682B4 + + + LightSteelBlue + CSS-color 0xB0C4DE + + + LightBlue + CSS-color 0xADD8E6 + + + PowderBlue + CSS-color 0xB0E0E6 + + + LightSkyBlue + CSS-color 0x87CEFA + + + SkyBlue + CSS-color 0x87CEEB + + + CornflowerBlue + CSS-color 0x6495ED + + + DeepSkyBlue + CSS-color 0x00BFFF + + + DodgerBlue + CSS-color 0x1E90FF + + + RoyalBlue + CSS-color 0x4169E1 + + + Blue + CSS-color 0x0000FF + + + MediumBlue + CSS-color 0x0000CD + + + DarkBlue + CSS-color 0x00008B + + + Navy + CSS-color 0x000080 + + + MidnightBlue + CSS-color 0x191970 + + + + Brown-color + CSS color group + + Cornsilk + CSS-color 0xFFF8DC + + + BlanchedAlmond + CSS-color 0xFFEBCD + + + Bisque + CSS-color 0xFFE4C4 + + + NavajoWhite + CSS-color 0xFFDEAD + + + Wheat + CSS-color 0xF5DEB3 + + + BurlyWood + CSS-color 0xDEB887 + + + Tan + CSS-color 0xD2B48C + + + RosyBrown + CSS-color 0xBC8F8F + + + SandyBrown + CSS-color 0xF4A460 + + + GoldenRod + CSS-color 0xDAA520 + + + DarkGoldenRod + CSS-color 0xB8860B + + + Peru + CSS-color 0xCD853F + + + Chocolate + CSS-color 0xD2691E + + + Olive + CSS-color 0x808000 + + + SaddleBrown + CSS-color 0x8B4513 + + + Sienna + CSS-color 0xA0522D + + + Brown + CSS-color 0xA52A2A + + + Maroon + CSS-color 0x800000 + + + + Cyan-color + CSS color group + + Aqua + CSS-color 0x00FFFF + + + Cyan + CSS-color 0x00FFFF + + + LightCyan + CSS-color 0xE0FFFF + + + PaleTurquoise + CSS-color 0xAFEEEE + + + Aquamarine + CSS-color 0x7FFFD4 + + + Turquoise + CSS-color 0x40E0D0 + + + MediumTurquoise + CSS-color 0x48D1CC + + + DarkTurquoise + CSS-color 0x00CED1 + + + + Green-color + CSS color group + + GreenYellow + CSS-color 0xADFF2F + + + Chartreuse + CSS-color 0x7FFF00 + + + LawnGreen + CSS-color 0x7CFC00 + + + Lime + CSS-color 0x00FF00 + + + LimeGreen + CSS-color 0x32CD32 + + + PaleGreen + CSS-color 0x98FB98 + + + LightGreen + CSS-color 0x90EE90 + + + MediumSpringGreen + CSS-color 0x00FA9A + + + SpringGreen + CSS-color 0x00FF7F + + + MediumSeaGreen + CSS-color 0x3CB371 + + + SeaGreen + CSS-color 0x2E8B57 + + + ForestGreen + CSS-color 0x228B22 + + + Green + CSS-color 0x008000 + + + DarkGreen + CSS-color 0x006400 + + + YellowGreen + CSS-color 0x9ACD32 + + + OliveDrab + CSS-color 0x6B8E23 + + + DarkOliveGreen + CSS-color 0x556B2F + + + MediumAquaMarine + CSS-color 0x66CDAA + + + DarkSeaGreen + CSS-color 0x8FBC8F + + + LightSeaGreen + CSS-color 0x20B2AA + + + DarkCyan + CSS-color 0x008B8B + + + Teal + CSS-color 0x008080 + + + + Gray-color + CSS color group + + Gainsboro + CSS-color 0xDCDCDC + + + LightGray + CSS-color 0xD3D3D3 + + + Silver + CSS-color 0xC0C0C0 + + + DarkGray + CSS-color 0xA9A9A9 + + + DimGray + CSS-color 0x696969 + + + Gray + CSS-color 0x808080 + + + LightSlateGray + CSS-color 0x778899 + + + SlateGray + CSS-color 0x708090 + + + DarkSlateGray + CSS-color 0x2F4F4F + + + Black + CSS-color 0x000000 + + + + Orange-color + CSS color group + + Orange + CSS-color 0xFFA500 + + + DarkOrange + CSS-color 0xFF8C00 + + + Coral + CSS-color 0xFF7F50 + + + Tomato + CSS-color 0xFF6347 + + + OrangeRed + CSS-color 0xFF4500 + + + + Pink-color + CSS color group + + Pink + CSS-color 0xFFC0CB + + + LightPink + CSS-color 0xFFB6C1 + + + HotPink + CSS-color 0xFF69B4 + + + DeepPink + CSS-color 0xFF1493 + + + PaleVioletRed + CSS-color 0xDB7093 + + + MediumVioletRed + CSS-color 0xC71585 + + + + Purple-color + CSS color group + + Lavender + CSS-color 0xE6E6FA + + + Thistle + CSS-color 0xD8BFD8 + + + Plum + CSS-color 0xDDA0DD + + + Orchid + CSS-color 0xDA70D6 + + + Violet + CSS-color 0xEE82EE + + + Fuchsia + CSS-color 0xFF00FF + + + Magenta + CSS-color 0xFF00FF + + + MediumOrchid + CSS-color 0xBA55D3 + + + DarkOrchid + CSS-color 0x9932CC + + + DarkViolet + CSS-color 0x9400D3 + + + BlueViolet + CSS-color 0x8A2BE2 + + + DarkMagenta + CSS-color 0x8B008B + + + Purple + CSS-color 0x800080 + + + MediumPurple + CSS-color 0x9370DB + + + MediumSlateBlue + CSS-color 0x7B68EE + + + SlateBlue + CSS-color 0x6A5ACD + + + DarkSlateBlue + CSS-color 0x483D8B + + + RebeccaPurple + CSS-color 0x663399 + + + Indigo + CSS-color 0x4B0082 + + + + Red-color + CSS color group + + LightSalmon + CSS-color 0xFFA07A + + + Salmon + CSS-color 0xFA8072 + + + DarkSalmon + CSS-color 0xE9967A + + + LightCoral + CSS-color 0xF08080 + + + IndianRed + CSS-color 0xCD5C5C + + + Crimson + CSS-color 0xDC143C + + + Red + CSS-color 0xFF0000 + + + FireBrick + CSS-color 0xB22222 + + + DarkRed + CSS-color 0x8B0000 + + + + Yellow-color + CSS color group + + Gold + CSS-color 0xFFD700 + + + Yellow + CSS-color 0xFFFF00 + + + LightYellow + CSS-color 0xFFFFE0 + + + LemonChiffon + CSS-color 0xFFFACD + + + LightGoldenRodYellow + CSS-color 0xFAFAD2 + + + PapayaWhip + CSS-color 0xFFEFD5 + + + Moccasin + CSS-color 0xFFE4B5 + + + PeachPuff + CSS-color 0xFFDAB9 + + + PaleGoldenRod + CSS-color 0xEEE8AA + + + Khaki + CSS-color 0xF0E68C + + + DarkKhaki + CSS-color 0xBDB76B + + + + White-color + CSS color group + + White + CSS-color 0xFFFFFF + + + Snow + CSS-color 0xFFFAFA + + + HoneyDew + CSS-color 0xF0FFF0 + + + MintCream + CSS-color 0xF5FFFA + + + Azure + CSS-color 0xF0FFFF + + + AliceBlue + CSS-color 0xF0F8FF + + + GhostWhite + CSS-color 0xF8F8FF + + + WhiteSmoke + CSS-color 0xF5F5F5 + + + SeaShell + CSS-color 0xFFF5EE + + + Beige + CSS-color 0xF5F5DC + + + OldLace + CSS-color 0xFDF5E6 + + + FloralWhite + CSS-color 0xFFFAF0 + + + Ivory + CSS-color 0xFFFFF0 + + + AntiqueWhite + CSS-color 0xFAEBD7 + + + Linen + CSS-color 0xFAF0E6 + + + LavenderBlush + CSS-color 0xFFF0F5 + + + MistyRose + CSS-color 0xFFE4E1 + + + + + Color-shade + A slight degree of difference between colors, especially with regard to how light or dark it is or as distinguished from one nearly like it. + + Dark-shade + A color tone not reflecting much light. + + + Light-shade + A color tone reflecting more light. + + + + Grayscale + Using a color map composed of shades of gray, varying from black at the weakest intensity to white at the strongest. + + # + White intensity between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + HSV-color + A color representation that models how colors appear under light. + + Hue + Attribute of a visual sensation according to which an area appears to be similar to one of the perceived colors. + + # + Angular value between 0 and 360 + + takesValue + + + valueClass + numericClass + + + + + Saturation + Colorfulness of a stimulus relative to its own brightness. + + # + B value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + HSV-value + An attribute of a visual sensation according to which an area appears to emit more or less light. + + # + + takesValue + + + valueClass + numericClass + + + + + + RGB-color + A color from the RGB schema. + + RGB-red + The red component. + + # + R value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + RGB-blue + The blue component. + + # + B value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + RGB-green + The green component. + + # + G value of RGB between 0 and 1 + + takesValue + + + valueClass + numericClass + + + + + + + Luminance + A quality that exists by virtue of the luminous intensity per unit area projected in a given direction. + + + Opacity + A measure of impenetrability to light. + + + + + Sensory-presentation + The entity has a sensory manifestation. + + Auditory-presentation + The sense of hearing is used in the presentation to the user. + + Loudspeaker-separation + The distance between two loudspeakers. Grouped with the Distance tag. + + suggestedTag + Distance + + + + Monophonic + Relating to sound transmission, recording, or reproduction involving a single transmission path. + + + Silent + The absence of ambient audible sound or the state of having ceased to produce sounds. + + + Stereophonic + Relating to, or constituting sound reproduction involving the use of separated microphones and two transmission channels to achieve the sound separation of a live hearing. + + + + Gustatory-presentation + The sense of taste used in the presentation to the user. + + + Olfactory-presentation + The sense of smell used in the presentation to the user. + + + Somatic-presentation + The nervous system is used in the presentation to the user. + + + Tactile-presentation + The sense of touch used in the presentation to the user. + + + Vestibular-presentation + The sense balance used in the presentation to the user. + + + Visual-presentation + The sense of sight used in the presentation to the user. + + 2D-view + A view showing only two dimensions. + + + 3D-view + A view showing three dimensions. + + + Background-view + Parts of the view that are farthest from the viewer and usually the not part of the visual focus. + + + Bistable-view + Something having two stable visual forms that have two distinguishable stable forms as in optical illusions. + + + Foreground-view + Parts of the view that are closest to the viewer and usually the most important part of the visual focus. + + + Foveal-view + Visual presentation directly on the fovea. A view projected on the small depression in the retina containing only cones and where vision is most acute. + + + Map-view + A diagrammatic representation of an area of land or sea showing physical features, cities, roads. + + Aerial-view + Elevated view of an object from above, with a perspective as though the observer were a bird. + + + Satellite-view + A representation as captured by technology such as a satellite. + + + Street-view + A 360-degrees panoramic view from a position on the ground. + + + + Peripheral-view + Indirect vision as it occurs outside the point of fixation. + + + + + + Task-property + Something that pertains to a task. + + extensionAllowed + + + Task-attentional-demand + Strategy for allocating attention toward goal-relevant information. + + Bottom-up-attention + Attentional guidance purely by externally driven factors to stimuli that are salient because of their inherent properties relative to the background. Sometimes this is referred to as stimulus driven. + + relatedTag + Top-down-attention + + + + Covert-attention + Paying attention without moving the eyes. + + relatedTag + Overt-attention + + + + Divided-attention + Integrating parallel multiple stimuli. Behavior involving responding simultaneously to multiple tasks or multiple task demands. + + relatedTag + Focused-attention + + + + Focused-attention + Responding discretely to specific visual, auditory, or tactile stimuli. + + relatedTag + Divided-attention + + + + Orienting-attention + Directing attention to a target stimulus. + + + Overt-attention + Selectively processing one location over others by moving the eyes to point at that location. + + relatedTag + Covert-attention + + + + Selective-attention + Maintaining a behavioral or cognitive set in the face of distracting or competing stimuli. Ability to pay attention to a limited array of all available sensory information. + + + Sustained-attention + Maintaining a consistent behavioral response during continuous and repetitive activity. + + + Switched-attention + Having to switch attention between two or more modalities of presentation. + + + Top-down-attention + Voluntary allocation of attention to certain features. Sometimes this is referred to goal-oriented attention. + + relatedTag + Bottom-up-attention + + + + + Task-effect-evidence + The evidence supporting the conclusion that the event had the specified effect. + + Computational-evidence + A type of evidence in which data are produced, and/or generated, and/or analyzed on a computer. + + + External-evidence + A phenomenon that follows and is caused by some previous phenomenon. + + + Intended-effect + A phenomenon that is intended to follow and be caused by some previous phenomenon. + + + Behavioral-evidence + An indication or conclusion based on the behavior of an agent. + + + + Task-event-role + The purpose of an event with respect to the task. + + Experimental-stimulus + Part of something designed to elicit a response in the experiment. + + + Incidental + A sensory or other type of event that is unrelated to the task or experiment. + + + Instructional + Usually associated with a sensory event intended to give instructions to the participant about the task or behavior. + + + Mishap + Unplanned disruption such as an equipment or experiment control abnormality or experimenter error. + + + Participant-response + Something related to a participant actions in performing the task. + + + Task-activity + Something that is part of the overall task or is necessary to the overall experiment but is not directly part of a stimulus-response cycle. Examples would be taking a survey or provided providing a silva sample. + + + Warning + Something that should warn the participant that the parameters of the task have been or are about to be exceeded such as a warning message about getting too close to the shoulder of the road in a driving task. + + + + Task-action-type + How an agent action should be interpreted in terms of the task specification. + + Appropriate-action + An action suitable or proper in the circumstances. + + relatedTag + Inappropriate-action + + + + Correct-action + An action that was a correct response in the context of the task. + + relatedTag + Incorrect-action + Indeterminate-action + + + + Correction + An action offering an improvement to replace a mistake or error. + + + Incorrect-action + An action considered wrong or incorrect in the context of the task. + + relatedTag + Correct-action + Indeterminate-action + + + + Imagined-action + Form a mental image or concept of something. This is used to identity something that only happened in the imagination of the participant as in imagined movements in motor imagery paradigms. + + + Inappropriate-action + An action not in keeping with what is correct or proper for the task. + + relatedTag + Appropriate-action + + + + Indeterminate-action + An action that cannot be distinguished between two or more possibibities in the current context. This tag might be applied when an outside evaluator or a classification algorithm cannot determine a definitive result. + + relatedTag + Correct-action + Incorrect-action + Miss + Near-miss + + + + Omitted-action + An expected response was skipped. + + + Miss + An action considered to be a failure in the context of the task. For example, if the agent is supposed to try to hit a target and misses. + + relatedTag + Near-miss + + + + Near-miss + An action barely satisfied the requirements of the task. In a driving experiment for example this could pertain to a narrowly avoided collision or other accident. + + relatedTag + Miss + + + + + Task-relationship + Specifying organizational importance of sub-tasks. + + Background-subtask + A part of the task which should be performed in the background as for example inhibiting blinks due to instruction while performing the primary task. + + + Primary-subtask + A part of the task which should be the primary focus of the participant. + + + + Task-stimulus-role + The role the stimulus plays in the task. + + Cue + A signal for an action, a pattern of stimuli indicating a particular response. + + + Distractor + A person or thing that distracts or a plausible but incorrect option in a multiple-choice question. In pyschological studies this is sometimes referred to as a foil. + + + Expected + Considered likely, probable or anticipated. Something of low information value as in frequent non-targets in an RSVP paradigm. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Extraneous + Irrelevant or unrelated to the subject being dealt with. + + + Feedback + An evaluative response to an inquiry, process, event, or activity. + + + Go-signal + An indicator to proceed with a planned action. + + relatedTag + Stop-signal + + + + Meaningful + Conveying significant or relevant information. + + + Newly-learned + Representing recently acquired information or understanding. + + + Non-informative + Something that is not useful in forming an opinion or judging an outcome. + + + Non-target + Something other than that done or looked for. Also tag Expected if the Non-target is frequent. + + relatedTag + Target + + + + Not-meaningful + Not having a serious, important, or useful quality or purpose. + + + Novel + Having no previous example or precedent or parallel. + + + Oddball + Something unusual, or infrequent. + + relatedTag + Unexpected + + + suggestedTag + Target + + + + Planned + Something that was decided on or arranged in advance. + + relatedTag + Unplanned + + + + Penalty + A disadvantage, loss, or hardship due to some action. + + + Priming + An implicit memory effect in which exposure to a stimulus influences response to a later stimulus. + + + Query + A sentence of inquiry that asks for a reply. + + + Reward + A positive reinforcement for a desired action, behavior or response. + + + Stop-signal + An indicator that the agent should stop the current activity. + + relatedTag + Go-signal + + + + Target + Something fixed as a goal, destination, or point of examination. + + + Threat + An indicator that signifies hostility and predicts an increased probability of attack. + + + Timed + Something planned or scheduled to be done at a particular time or lasting for a specified amount of time. + + + Unexpected + Something that is not anticipated. + + relatedTag + Expected + + + + Unplanned + Something that has not been planned as part of the task. + + relatedTag + Planned + + + + + + + Relation + Concerns the way in which two or more people or things are connected. + + Comparative-relation + Something considered in comparison to something else. + + Approximately-equal-to + (A (Approximately-equal-to B)) indicates that A and B have almost the same value. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than + (A (Less-than B)) indicates that A is smaller than B. Here A and B could refer to sizes, orders, positions or other quantities. + + + Less-than-or-equal-to + (A (Less-than-or-equal-to B)) indicates that the relative size or order of A is smaller than or equal to B. + + + Greater-than + (A (Greater-than B)) indicates that the relative size or order of A is bigger than that of B. + + + Greater-than-or-equal-to + (A (Greater-than-or-equal-to B)) indicates that the relative size or order of A is bigger than or the same as that of B. + + + Equal-to + (A (Equal-to B)) indicates that the size or order of A is the same as that of B. + + + Not-equal-to + (A (Not-equal-to B)) indicates that the size or order of A is not the same as that of B. + + + + Connective-relation + Indicates two items are related in some way. + + Belongs-to + (A (Belongs-to B)) indicates that A is a member of B. + + + Connected-to + (A (Connected-to) B) indicates that A is related to B in some respect, usually through a direct link. + + + Contained-in + (A (Contained-in B)) indicates that A is completely inside of B. + + + Described-by + (A (Described-by B)) indicates that B provides information about A. + + + From-to + (A (From-to B)) indicates a directional relation from A to B. A is considered the source. + + + Group-of + (A (Group-of B)) indicates A is a group of items of type B. + + + Implied-by + (A (Implied-by B)) indicates B is suggested by A. + + + Interacts-with + (A (Interacts-with B)) indicates A and B interact, possibly reciprocally. + + + Member-of + (A (Member-of B)) indicates A is a member of group B. + + + Part-of + (A (Part-of B)) indicates A is a part of the whole B. + + + Performed-by + (A (Performed-by B)) Indicates that ction or procedure A was carried out by agent B. + + + Related-to + (A (Relative-to B)) indicates A is a part of the whole B. + + + + Directional-relation + A relationship indicating direction of change. + + Away-from + Go away from a place or object. + + + Towards + Moving in the direction of. A relation binding a relational quality or disposition to the relevant type of entity + + + + Spatial-relation + Indicating information about position. + + Above + (A (Adjacent-to B)) means A is in a place or position that is higher than B. + + + Across-from + (A (Across-from B)) means A is on the opposite side of something from B. + + + Adjacent-to + (A (Adjacent-to B)) indicates that A is next to B in time or space. + + + Ahead-of + (A (Ahead-of B)) indicates that A is further forward in time or space in B. + + + Around + (A (Around B)) means A is in or near the present place or situation of B. + + + Behind + (A (Behind B)) means A is at or to the far side of B, typically so as to be hidden by it. + + + Below + (A (Below B)) means A is in a place or position that is lower than the position of B. + + + Between + (A (Between, (B, C))) means A is in the space or interval separating B and C. + + + Bilateral-to + (A (Bilateral B)) means A is on both sides of B or affects both sides of B. + + + Bottom-edge-of + (A (Bottom-edge-of B)) means A is on the bottom most part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Top-edge-of + + + + Boundary-of + (A (Boundary-of B)) means A is on or part of the edge or boundary of B. + + + Center-of + (A (Center-of B)) means A is at a point or or in an area that is approximately central within B. + + + Close-to + (A (Close-to B)) means A is at a small distance from or is located near in space to B. + + + Far-from + (A (Far-from B)) means A is at a large distance from or is not located near in space to B. + + + In-front-of + (A (In-front-of B)) means A is in a position just ahead or at the front part of B, potentially partially blocking B from view. + + + Left-edge-of + (A (Left-edge-of B)) means A is located on the left side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Right-edge-of + Top-edge-of + + + + Left-side-of + (A (Left-side-of B)) means A is located on the left side of B usually as part of B. + + relatedTag + Right-side-of + + + + Lower-left-of + (A (Lower-left-of B)) means A is situated on the lower left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-right-of + Upper-left-of + Upper-right-of + + + + Lower-right-of + (A (Lower-right-of B)) means A is situated on the lower right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Upper-left-of + Upper-left-of + Lower-right-of + + + + Outside-of + (A (Outside-of B)) means A is located in the space around but not including B. + + + Over + (A (over B)) means A above is above B so as to cover or protect or A extends over the a general area as from a from a vantage point. + + + Right-edge-of + (A (Right-edge-of B)) means A is located on the right side of B on or near the boundary of B. + + relatedTag + Bottom-edge-of + Left-edge-of + Top-edge-of + + + + Right-side-of + (A (Right-side-of B)) means A is located on the right side of B usually as part of B. + + relatedTag + Left-side-of + + + + To-left-of + (A (To-left-of B)) means A is located on or directed toward the side to the west of B when B is facing north. This term is used when A is not part of B. + + + To-right-of + (A (To-right-of B)) means A is located on or directed toward the side to the east of B when B is facing north. This term is used when A is not part of B. + + + Top-edge-of + (A (Top-edge-of B)) means A is on the uppermost part or or near the boundary of B. + + relatedTag + Left-edge-of + Right-edge-of + Bottom-edge-of + + + + Top-of + (A (Top-of B)) means A is on the uppermost part, side, or surface of B. + + + Upper-left-of + (A (Upper-left-of B)) means A is situated on the upper left part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Lower-right-of + Upper-right-of + + + + Upper-right-of + (A (Upper-right-of B)) means A is situated on the upper right part of B. This relation is often used to specify qualitative information about screen position. + + relatedTag + Lower-left-of + Upper-left-of + Lower-right-of + + + + Underneath + (A (Underneath B)) means A is situated directly below and may be concealed by B. + + + Within + (A (Within B)) means A is on the inside of or contained in B. + + + + Temporal-relation + Any relationship which includes a temporal or time-based component. + + After + (A After B) means A happens at a time subsequent to a reference time related to B. + + + Asynchronous-with + (A Asynchronous-with B) means A happens at times not occurring at the same time or having the same period or phase as B. + + + Before + (A Before B) means A happens at a time earlier in time or order than B. + + + During + (A During B) means A happens at some point in a given period of time in which B is ongoing. + + + Synchronous-with + (A Synchronous-with B) means A happens at occurs at the same time or rate as B. + + + Waiting-for + (A Waiting-for B) means A pauses for something to happen in B. + + + + + + + accelerationUnits + + defaultUnits + m-per-s^2 + + + m-per-s^2 + + SIUnit + + + unitSymbol + + + + + angleUnits + + defaultUnits + radian + + + radian + + SIUnit + + + + rad + + SIUnit + + + unitSymbol + + + + degree + + + + areaUnits + + defaultUnits + m^2 + + + m^2 + + SIUnit + + + unitSymbol + + + + + currencyUnits + Units indicating the worth of something. + + defaultUnits + $ + + + dollar + + + $ + + unitPrefix + + + unitSymbol + + + + point + + + + frequencyUnits + + defaultUnits + Hz + + + hertz + + SIUnit + + + + Hz + + SIUnit + + + unitSymbol + + + + + intensityUnits + + defaultUnits + dB + + + dB + Intensity expressed as ratio to a threshold. Often used for sound intensity. + + unitSymbol + + + + candela + Units used to express light intensity. + + SIUnit + + + + cd + Units used to express light intensity. + + SIUnit + + + unitSymbol + + + + + jerkUnits + + defaultUnits + m-per-s^3 + + + m-per-s^3 + + unitSymbol + + + + + memorySizeUnits + + defaultUnits + B + + + byte + + SIUnit + + + + B + + SIUnit + + + unitSymbol + + + + + physicalLengthUnits + + defaultUnits + m + + + foot + + + inch + + + metre + + SIUnit + + + + m + + SIUnit + + + unitSymbol + + + + mile + + + + speedUnits + + defaultUnits + m-per-s + + + m-per-s + + SIUnit + + + unitSymbol + + + + mph + + unitSymbol + + + + kph + + unitSymbol + + + + + timeUnits + + defaultUnits + s + + + second + + SIUnit + + + + s + + SIUnit + + + unitSymbol + + + + day + + + minute + + + hour + Should be in 24-hour format. + + + + volumeUnits + + defaultUnits + m^3 + + + m^3 + + SIUnit + + + unitSymbol + + + + + weightUnits + + defaultUnits + g + + + g + + SIUnit + + + unitSymbol + + + + gram + + SIUnit + + + + pound + + + lb + + + + + + deca + SI unit multiple representing 10^1 + + SIUnitModifier + + + + da + SI unit multiple representing 10^1 + + SIUnitSymbolModifier + + + + hecto + SI unit multiple representing 10^2 + + SIUnitModifier + + + + h + SI unit multiple representing 10^2 + + SIUnitSymbolModifier + + + + kilo + SI unit multiple representing 10^3 + + SIUnitModifier + + + + k + SI unit multiple representing 10^3 + + SIUnitSymbolModifier + + + + mega + SI unit multiple representing 10^6 + + SIUnitModifier + + + + M + SI unit multiple representing 10^6 + + SIUnitSymbolModifier + + + + giga + SI unit multiple representing 10^9 + + SIUnitModifier + + + + G + SI unit multiple representing 10^9 + + SIUnitSymbolModifier + + + + tera + SI unit multiple representing 10^12 + + SIUnitModifier + + + + T + SI unit multiple representing 10^12 + + SIUnitSymbolModifier + + + + peta + SI unit multiple representing 10^15 + + SIUnitModifier + + + + P + SI unit multiple representing 10^15 + + SIUnitSymbolModifier + + + + exa + SI unit multiple representing 10^18 + + SIUnitModifier + + + + E + SI unit multiple representing 10^18 + + SIUnitSymbolModifier + + + + zetta + SI unit multiple representing 10^21 + + SIUnitModifier + + + + Z + SI unit multiple representing 10^21 + + SIUnitSymbolModifier + + + + yotta + SI unit multiple representing 10^24 + + SIUnitModifier + + + + Y + SI unit multiple representing 10^24 + + SIUnitSymbolModifier + + + + deci + SI unit submultiple representing 10^-1 + + SIUnitModifier + + + + d + SI unit submultiple representing 10^-1 + + SIUnitSymbolModifier + + + + centi + SI unit submultiple representing 10^-2 + + SIUnitModifier + + + + c + SI unit submultiple representing 10^-2 + + SIUnitSymbolModifier + + + + milli + SI unit submultiple representing 10^-3 + + SIUnitModifier + + + + m + SI unit submultiple representing 10^-3 + + SIUnitSymbolModifier + + + + micro + SI unit submultiple representing 10^-6 + + SIUnitModifier + + + + u + SI unit submultiple representing 10^-6 + + SIUnitSymbolModifier + + + + nano + SI unit submultiple representing 10^-9 + + SIUnitModifier + + + + n + SI unit submultiple representing 10^-9 + + SIUnitSymbolModifier + + + + pico + SI unit submultiple representing 10^-12 + + SIUnitModifier + + + + p + SI unit submultiple representing 10^-12 + + SIUnitSymbolModifier + + + + femto + SI unit submultiple representing 10^-15 + + SIUnitModifier + + + + f + SI unit submultiple representing 10^-15 + + SIUnitSymbolModifier + + + + atto + SI unit submultiple representing 10^-18 + + SIUnitModifier + + + + a + SI unit submultiple representing 10^-18 + + SIUnitSymbolModifier + + + + zepto + SI unit submultiple representing 10^-21 + + SIUnitModifier + + + + z + SI unit submultiple representing 10^-21 + + SIUnitSymbolModifier + + + + yocto + SI unit submultiple representing 10^-24 + + SIUnitModifier + + + + y + SI unit submultiple representing 10^-24 + + SIUnitSymbolModifier + + + + + + dateTimeClass + Date-times should conform to ISO8601 date-time format YYYY-MM-DDThh:mm:ss. Any variation on the full form is allowed. + + allowedCharacter + digits + T + - + : + + + + nameClass + Value class designating values that have the characteristics of node names. The allowed characters are alphanumeric, hyphen, and underbar. + + allowedCharacter + letters + digits + _ + - + + + + numericClass + Value must be a valid numerical value. + + allowedCharacter + digits + E + e + + + - + . + + + + posixPath + Posix path specification. + + allowedCharacter + digits + letters + / + : + + + + textClass + Value class designating values that have the characteristics of text such as in descriptions. + + allowedCharacter + letters + digits + blank + + + - + : + ; + . + / + ( + ) + ? + * + % + $ + @ + + + + + + allowedCharacter + A schema attribute of value classes specifying a special character that is allowed in expressing the value of a placeholder. Normally the allowed characters are listed individually. However, the word letters designates the upper and lower case alphabetic characters and the word digits designates the digits 0-9. The word blank designates the blank character. + + valueClassProperty + + + + defaultUnits + A schema attribute of unit classes specifying the default units to use if the placeholder has a unit class but the substituted value has no units. + + unitClassProperty + + + + extensionAllowed + A schema attribute indicating that users can add unlimited levels of child nodes under this tag. This tag is propagated to child nodes with the exception of the hashtag placeholders. + + boolProperty + + + + recommended + A schema attribute indicating that the event-level HED string should include this tag. + + boolProperty + + + + relatedTag + A schema attribute suggesting HED tags that are closely related to this tag. This attribute is used by tagging tools. + + + requireChild + A schema attribute indicating that one of the node elements descendants must be included when using this tag. + + boolProperty + + + + required + A schema attribute indicating that every event-level HED string should include this tag. + + boolProperty + + + + SIUnit + A schema attribute indicating that this unit element is an SI unit and can be modified by multiple and submultiple names. Note that some units such as byte are designated as SI units although they are not part of the standard. + + boolProperty + + + unitProperty + + + + SIUnitModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a base unit rather than a unit symbol. + + boolProperty + + + unitModifierProperty + + + + SIUnitSymbolModifier + A schema attribute indicating that this SI unit modifier represents a multiple or submultiple of a unit symbol rather than a base symbol. + + boolProperty + + + unitModifierProperty + + + + suggestedTag + A schema attribute that indicates another tag that is often associated with this tag. This attribute is used by tagging tools to provide tagging suggestions. + + + tagGroup + A schema attribute indicating the tag can only appear inside a tag group. + + boolProperty + + + + takesValue + A schema attribute indicating the tag is a hashtag placeholder that is expected to be replaced with a user-defined value. + + boolProperty + + + + topLevelTagGroup + A schema attribute indicating that this tag (or its descendants) can only appear in a top-level tag group. + + boolProperty + + + + unique + A schema attribute indicating that only one of this tag or its descendants can be used in the event-level HED string. + + boolProperty + + + + unitClass + A schema attribute specifying which unit class this value tag belongs to. + + + unitPrefix + A schema attribute applied specifically to unit elements to designate that the unit indicator is a prefix (e.g., dollar sign in the currency units). + + boolProperty + + + unitProperty + + + + unitSymbol + A schema attribute indicating this tag is an abbreviation or symbol representing a type of unit. Unit symbols represent both the singular and the plural and thus cannot be pluralized. + + boolProperty + + + unitProperty + + + + valueClass + A schema attribute specifying which value class this value tag belongs to. + + + + + boolProperty + Indicates that the schema attribute represents something that is either true or false and does not have a value. Attributes without this value are assumed to have string values. + + + unitClassProperty + Indicates that the schema attribute is meant to be applied to unit classes. + + + unitModifierProperty + Indicates that the schema attribute is meant to be applied to unit modifier classes. + + + unitProperty + Indicates that the schema attribute is meant to be applied to units within a unit class. + + + valueClassProperty + Indicates that the schema attribute is meant to be applied to value classes. + + + This is an updated version of the schema format. The properties are now part of the schema. The schema attributes are designed to be checked in software rather than hard-coded. The schema attributes, themselves have properties. + + + diff --git a/tests/dataset.spec.js b/tests/dataset.spec.js index 17e541b4..808df713 100644 --- a/tests/dataset.spec.js +++ b/tests/dataset.spec.js @@ -1,29 +1,34 @@ const assert = require('chai').assert const hed = require('../validator/dataset') -const schema = require('../validator/schema/init') +const { buildSchemas } = require('../validator/schema/init') const generateValidationIssue = require('../common/issues/issues').generateIssue const generateConverterIssue = require('../converter/issues') +const { SchemaSpec, SchemasSpec } = require('../common/schema/types') describe('HED dataset validation', () => { const hedSchemaFile = 'tests/data/HED8.0.0.xml' let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ path: hedSchemaFile }) + const spec1 = new SchemaSpec('', '8.0.0', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec1) + hedSchemaPromise = buildSchemas(specs) }) describe('Basic HED string lists', () => { /** * Test-validate a dataset. * - * @param {object} testDatasets The datasets to test. - * @param {object} expectedIssues The expected issues. + * @param {Object} testDatasets The datasets to test. + * @param {Object} expectedIssues The expected issues. */ const validator = function (testDatasets, expectedIssues) { - return hedSchemaPromise.then((hedSchema) => { - for (const testDatasetKey in testDatasets) { - const [, testIssues] = hed.validateHedEvents(testDatasets[testDatasetKey], hedSchema, null, true) - assert.sameDeepMembers(testIssues, expectedIssues[testDatasetKey], testDatasets[testDatasetKey].join(',')) + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + for (const [testDatasetKey, testDataset] of Object.entries(testDatasets)) { + assert.property(expectedIssues, testDatasetKey, testDatasetKey + ' is not in expectedIssues') + const [, testIssues] = hed.validateHedEvents(testDataset, hedSchemas, null, true) + assert.sameDeepMembers(testIssues, expectedIssues[testDatasetKey], testDataset.join(',')) } }) } @@ -70,14 +75,16 @@ describe('HED dataset validation', () => { /** * Test-validate a dataset. * - * @param {object} testDatasets The datasets to test. - * @param {object} expectedIssues The expected issues. + * @param {Object} testDatasets The datasets to test. + * @param {Object} expectedIssues The expected issues. */ const validator = function (testDatasets, expectedIssues) { - return hedSchemaPromise.then((hedSchema) => { - for (const testDatasetKey in testDatasets) { - const [, testIssues] = hed.validateHedDataset(testDatasets[testDatasetKey], hedSchema, true) - assert.sameDeepMembers(testIssues, expectedIssues[testDatasetKey], testDatasets[testDatasetKey].join(',')) + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + for (const [testDatasetKey, testDataset] of Object.entries(testDatasets)) { + assert.property(expectedIssues, testDatasetKey, testDatasetKey + ' is not in expectedIssues') + const [, testIssues] = hed.validateHedDataset(testDataset, hedSchemas, true) + assert.sameDeepMembers(testIssues, expectedIssues[testDatasetKey], testDataset.join(',')) } }) } diff --git a/tests/event.spec.js b/tests/event.spec.js index d82eb7c7..7d987cb4 100644 --- a/tests/event.spec.js +++ b/tests/event.spec.js @@ -1,12 +1,12 @@ const assert = require('chai').assert const hed = require('../validator/event') -const schema = require('../validator/schema/init') -const { parseHedString } = require('../validator/stringParser') -const { ParsedHedTag } = require('../validator/types/parsedHed') +const { buildSchemas } = require('../validator/schema/init') +const { parseHedString } = require('../validator/parser/main') +const { ParsedHedTag } = require('../validator/parser/parsedHedTag') const { HedValidator, Hed2Validator, Hed3Validator } = require('../validator/event') const { generateIssue } = require('../common/issues/issues') const converterGenerateIssue = require('../converter/issues') -const { Schemas } = require('../common/schema') +const { Schemas, SchemaSpec, SchemasSpec } = require('../common/schema/types') describe('HED string and event validation', () => { /** @@ -14,10 +14,10 @@ describe('HED string and event validation', () => { * * @param {Schemas} hedSchemas The HED schema collection used for testing. * @param {typeof HedValidator} ValidatorClass A subclass of {@link HedValidator} to use for validation. - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorBase = function ( hedSchemas, @@ -28,6 +28,7 @@ describe('HED string and event validation', () => { testOptions = {}, ) { for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedIssues, testStringKey, testStringKey + ' is not in expectedIssues') const [parsedTestString, parsingIssues] = parseHedString(testString, hedSchemas) const validator = new ValidatorClass(parsedTestString, hedSchemas, testOptions) testFunction(validator) @@ -42,10 +43,10 @@ describe('HED string and event validation', () => { * * This base function uses the generic {@link HedValidator} validator class. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSyntacticBase = function (testStrings, expectedIssues, testFunction, testOptions = {}) { const dummySchema = new Schemas(null) @@ -62,12 +63,18 @@ describe('HED string and event validation', () => { // The extra comma is needed to avoid a comma error. extraClosing: '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),),/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px', + wrongOrder: + '/Action/Reach/To touch,((/Attribute/Object side/Left),/Participant/Effect/Body part/Arm),/Attribute/Location/Screen/Top/70 px),(/Attribute/Location/Screen/Left/23 px', valid: '/Action/Reach/To touch,(/Attribute/Object side/Left,/Participant/Effect/Body part/Arm),/Attribute/Location/Screen/Top/70 px,/Attribute/Location/Screen/Left/23 px', } const expectedIssues = { extraOpening: [generateIssue('parentheses', { opening: 2, closing: 1 })], extraClosing: [generateIssue('parentheses', { opening: 1, closing: 2 })], + wrongOrder: [ + generateIssue('unopenedParenthesis', { index: 125, string: testStrings.wrongOrder }), + generateIssue('unclosedParenthesis', { index: 127, string: testStrings.wrongOrder }), + ], valid: [], } // No-op function as this check is done during the parsing stage. @@ -171,6 +178,7 @@ describe('HED string and event validation', () => { openingBracket: '/Attribute/Object side/Left,/Participant/Effect[/Body part/Arm', closingBracket: '/Attribute/Object side/Left,/Participant/Effect]/Body part/Arm', tilde: '/Attribute/Object side/Left,/Participant/Effect~/Body part/Arm', + doubleQuote: '/Attribute/Object side/Left,/Participant/Effect"/Body part/Arm', } const expectedIssues = { openingBrace: [ @@ -208,6 +216,13 @@ describe('HED string and event validation', () => { string: testStrings.tilde, }), ], + doubleQuote: [ + generateIssue('invalidCharacter', { + character: '"', + index: 47, + string: testStrings.doubleQuote, + }), + ], } // No-op function as this check is done during the parsing stage. // eslint-disable-next-line no-unused-vars @@ -237,10 +252,10 @@ describe('HED string and event validation', () => { /** * Tag level syntactic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator, ParsedHedTag[]): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSyntactic = function (testStrings, expectedIssues, testFunction, testOptions = {}) { validatorSyntacticBase( @@ -248,7 +263,7 @@ describe('HED string and event validation', () => { expectedIssues, (validator) => { for (const tagGroup of validator.parsedString.tagGroups) { - for (const subGroup of tagGroup.subGroupIterator()) { + for (const subGroup of tagGroup.subGroupArrayIterator()) { testFunction(validator, subGroup) } } @@ -260,7 +275,7 @@ describe('HED string and event validation', () => { it('should not contain duplicates', () => { const testStrings = { - topLevelDuplicate: 'Event/Category/Experimental stimulus,Event/Category/Experimental stimulus', + //topLevelDuplicate: 'Event/Category/Experimental stimulus,Event/Category/Experimental stimulus', groupDuplicate: 'Item/Object/Vehicle/Train,(Event/Category/Experimental stimulus,Attribute/Visual/Color/Purple,Event/Category/Experimental stimulus)', nestedGroupDuplicate: @@ -320,7 +335,9 @@ describe('HED string and event validation', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ path: hedSchemaFile }) + const spec1 = new SchemaSpec('', '7.1.1', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec1) + hedSchemaPromise = buildSchemas(specs) }) /** @@ -328,13 +345,14 @@ describe('HED string and event validation', () => { * * This base function uses the HED 2-specific {@link Hed2Validator} validator class. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemanticBase = function (testStrings, expectedIssues, testFunction, testOptions = {}) { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') validatorBase(hedSchemas, Hed2Validator, testStrings, expectedIssues, testFunction, testOptions) }) } @@ -392,10 +410,10 @@ describe('HED string and event validation', () => { /** * HED 2 individual tag semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator, ParsedHedTag, ParsedHedTag): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemantic = function (testStrings, expectedIssues, testFunction, testOptions) { return validatorSemanticBase( @@ -493,7 +511,6 @@ describe('HED string and event validation', () => { invalidTime: 'Item/2D shape/Clock face/54:54', } const legalTimeUnits = ['s', 'second', 'day', 'minute', 'hour'] - const legalClockTimeUnits = ['hour:min', 'hour:min:sec'] const legalFrequencyUnits = ['Hz', 'hertz'] const legalSpeedUnits = ['m-per-s', 'kph', 'mph'] const expectedIssues = { @@ -577,10 +594,10 @@ describe('HED string and event validation', () => { /** * HED 2 Tag level semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator, ParsedHedTag[]): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemantic = function (testStrings, expectedIssues, testFunction, testOptions = {}) { validatorSemanticBase( @@ -588,7 +605,7 @@ describe('HED string and event validation', () => { expectedIssues, (validator) => { for (const tagGroup of validator.parsedString.tagGroups) { - for (const subGroup of tagGroup.subGroupIterator()) { + for (const subGroup of tagGroup.subGroupArrayIterator()) { testFunction(validator, subGroup) } } @@ -670,15 +687,12 @@ describe('HED string and event validation', () => { describe('HED Strings', () => { const validator = function (testStrings, expectedIssues, expectValuePlaceholderString = false) { - return hedSchemaPromise.then((schema) => { - for (const testStringKey in testStrings) { - const [, testIssues] = hed.validateHedString( - testStrings[testStringKey], - schema, - true, - expectValuePlaceholderString, - ) - assert.sameDeepMembers(testIssues, expectedIssues[testStringKey], testStrings[testStringKey]) + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedIssues, testStringKey, testStringKey + ' is not in expectedIssues') + const [, testIssues] = hed.validateHedString(testString, hedSchemas, true, expectValuePlaceholderString) + assert.sameDeepMembers(testIssues, expectedIssues[testStringKey], testString) } }) } @@ -747,9 +761,9 @@ describe('HED string and event validation', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ - path: hedSchemaFile, - }) + const spec2 = new SchemaSpec('', '7.0.4', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec2) + hedSchemaPromise = buildSchemas(specs) }) /** @@ -757,13 +771,14 @@ describe('HED string and event validation', () => { * * This base function uses the HED 2-specific {@link Hed2Validator} validator class. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemanticBase = function (testStrings, expectedIssues, testFunction, testOptions = {}) { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') validatorBase(hedSchemas, Hed2Validator, testStrings, expectedIssues, testFunction, testOptions) }) } @@ -772,10 +787,10 @@ describe('HED string and event validation', () => { /** * HED 2 individual tag semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator, ParsedHedTag, ParsedHedTag): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemantic = function (testStrings, expectedIssues, testFunction, testOptions) { return validatorSemanticBase( @@ -886,9 +901,9 @@ describe('HED string and event validation', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ - path: hedSchemaFile, - }) + const spec3 = new SchemaSpec('', '8.0.0', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec3) + hedSchemaPromise = buildSchemas(specs) }) /** @@ -897,13 +912,14 @@ describe('HED string and event validation', () => { * This override is required due to incompatible constructor signatures between Hed3Validator and the other two classes. * * @param {Schemas} hedSchemas The HED schema collection used for testing. - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(HedValidator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorBase = function (hedSchemas, testStrings, expectedIssues, testFunction, testOptions = {}) { for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedIssues, testStringKey, testStringKey + ' is not in expectedIssues') const [parsedTestString, parsingIssues] = parseHedString(testString, hedSchemas) const validator = new Hed3Validator(parsedTestString, hedSchemas, null, testOptions) testFunction(validator) @@ -917,13 +933,14 @@ describe('HED string and event validation', () => { * * This base function uses the HED 3-specific {@link Hed3Validator} validator class. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(Hed3Validator): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemanticBase = function (testStrings, expectedIssues, testFunction, testOptions = {}) { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') validatorBase(hedSchemas, testStrings, expectedIssues, testFunction, testOptions) }) } @@ -1027,10 +1044,10 @@ describe('HED string and event validation', () => { /** * HED 3 individual tag semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(Hed3Validator, ParsedHedTag, ParsedHedTag): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemantic = function (testStrings, expectedIssues, testFunction, testOptions) { return validatorSemanticBase( @@ -1050,11 +1067,11 @@ describe('HED string and event validation', () => { /** * HED 3 individual tag semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} testDefinitions A mapping of test definitions. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} testDefinitions A mapping of test definitions. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(Hed3Validator, ParsedHedTag): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemanticWithDefinitions = function ( testStrings, @@ -1145,7 +1162,7 @@ describe('HED string and event validation', () => { invalidTime: 'Clockface/54:54',*/ } const legalTimeUnits = ['s', 'second', 'day', 'minute', 'hour'] - const legalClockTimeUnits = ['hour:min', 'hour:min:sec'] + // const legalClockTimeUnits = ['hour:min', 'hour:min:sec'] const legalFrequencyUnits = ['Hz', 'hertz'] const legalSpeedUnits = ['m-per-s', 'kph', 'mph'] const expectedIssues = { @@ -1255,10 +1272,10 @@ describe('HED string and event validation', () => { /** * HED 3 tag group semantic validation base function. * - * @param {object} testStrings A mapping of test strings. - * @param {object} expectedIssues The expected issues for each test string. + * @param {Object} testStrings A mapping of test strings. + * @param {Object} expectedIssues The expected issues for each test string. * @param {function(Hed3Validator, ParsedHedGroup): void} testFunction A test-specific function that executes the required validation check. - * @param {object?} testOptions Any needed custom options for the validator. + * @param {Object?} testOptions Any needed custom options for the validator. */ const validatorSemantic = function (testStrings, expectedIssues, testFunction, testOptions = {}) { validatorSemanticBase( @@ -1420,7 +1437,7 @@ describe('HED string and event validation', () => { return validatorSemanticBase( testStrings, expectedIssues, - function (validator) { + (validator) => { validator.validateStringLevel() }, { expectValuePlaceholderString: expectValuePlaceholderString }, diff --git a/tests/fileTransformer.js b/tests/fileTransformer.js new file mode 100644 index 00000000..110358e6 --- /dev/null +++ b/tests/fileTransformer.js @@ -0,0 +1,8 @@ +module.exports = { + process(sourceText, sourcePath, options) { + sourceText = sourceText.replace(/\"/g, '\\"').replace(/\n/g, '\\n') + return { + code: `module.exports = "${sourceText}";`, + } + }, +} diff --git a/tests/schema.spec.js b/tests/schema.spec.js index 9224e9e1..b401499c 100644 --- a/tests/schema.spec.js +++ b/tests/schema.spec.js @@ -1,80 +1,110 @@ const assert = require('chai').assert -const schema = require('../validator/schema/init') -const schemaCommon = require('../common/schema') -const fallbackHedSchemaPath = schemaCommon.config.fallbackFilePath +const { generateIssue } = require('../common/issues/issues') +const { SchemaSpec, SchemasSpec } = require('../common/schema/types') +const { parseSchemaSpec, parseSchemasSpec } = require('../validator/bids/schema') +const { buildSchemas } = require('../validator/schema/init') describe('HED schemas', () => { - describe('Remote HED schemas', () => { - it('can be loaded from a central GitHub repository', () => { - const remoteHedSchemaVersion = '8.0.0' - return schema.buildSchema({ version: remoteHedSchemaVersion }).then((hedSchemas) => { - const hedSchemaVersion = hedSchemas.baseSchema.version - assert.strictEqual(hedSchemaVersion, remoteHedSchemaVersion) + describe('Schema loading', () => { + describe('Bundled HED schemas', () => { + it('a standard schema can be loaded from locally stored schema', () => { + const spec1 = new SchemaSpec('', '8.0.0', '', '') + const specs = new SchemasSpec().addSchemaSpec(spec1) + return buildSchemas(specs).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + assert.strictEqual(hedSchemas.baseSchema.version, spec1.version) + assert.strictEqual(hedSchemas.generation, 3) + }) }) - }) - }) - describe('Local HED schemas', () => { - const localHedSchemaFile = 'tests/data/HED7.1.1.xml' - const localHedSchemaVersion = '7.1.1' - it('can be loaded from a file', () => { - return schema.buildSchema({ path: localHedSchemaFile }).then((hedSchemas) => { - const hedSchemaVersion = hedSchemas.baseSchema.version - assert.strictEqual(hedSchemaVersion, localHedSchemaVersion) + it('a library schema can be loaded from locally stored schema', () => { + const spec1 = new SchemaSpec('', '1.0.2', 'testlib', '') + const specs = new SchemasSpec().addSchemaSpec(spec1) + return buildSchemas(specs).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + assert.strictEqual(hedSchemas.baseSchema.version, spec1.version) + assert.strictEqual(hedSchemas.baseSchema.library, spec1.library) + assert.strictEqual(hedSchemas.generation, 3) + }) }) - }) - }) - describe.skip('Remote HED library schemas', () => { - it('can be loaded from a central GitHub repository', () => { - const remoteHedSchemaLibrary = 'test' - const remoteHedSchemaVersion = '0.0.1' - return schema - .buildSchema({ - library: remoteHedSchemaLibrary, - version: remoteHedSchemaVersion, + it('a base schema with a nickname can be loaded from locally stored schema', () => { + const spec1 = new SchemaSpec('nk', '8.0.0', '', '') + const specs = new SchemasSpec().addSchemaSpec(spec1) + return buildSchemas(specs).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + const schema1 = hedSchemas.getSchema(spec1.nickname) + assert.strictEqual(schema1.version, spec1.version) + assert.strictEqual(schema1.library, spec1.library) + assert.strictEqual(hedSchemas.generation, 3) }) - .then((hedSchemas) => { - const hedSchema = hedSchemas.librarySchemas.get(remoteHedSchemaLibrary) - assert.strictEqual(hedSchema.library, remoteHedSchemaLibrary) - assert.strictEqual(hedSchema.version, remoteHedSchemaVersion) + }) + + it('multiple local schemas can be loaded', () => { + const spec1 = new SchemaSpec('nk', '8.0.0', '', '') + const spec2 = new SchemaSpec('ts', '1.0.2', 'testlib', '') + const spec3 = new SchemaSpec('', '1.0.2', 'testlib', '') + const specs = new SchemasSpec().addSchemaSpec(spec1).addSchemaSpec(spec2).addSchemaSpec(spec3) + return buildSchemas(specs).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + const schema1 = hedSchemas.getSchema(spec1.nickname) + const schema2 = hedSchemas.getSchema(spec2.nickname) + const schema3 = hedSchemas.getSchema(spec3.nickname) + assert.strictEqual(schema1.version, spec1.version) + assert.strictEqual(schema1.library, spec1.library) + assert.strictEqual(schema2.version, spec2.version) + assert.strictEqual(schema2.library, spec2.library) + assert.strictEqual(schema3.version, spec3.version) + assert.strictEqual(schema3.library, spec3.library) + const schema4 = hedSchemas.getSchema('baloney') + assert.strictEqual(schema4, null) }) + }) }) - }) - describe('Fallback HED schemas', () => { - it('loads the fallback schema if a remote schema cannot be found', () => { - // Invalid base schema version - const remoteHedSchemaVersion = '0.0.1' - return schema - .buildSchema({ version: remoteHedSchemaVersion }) - .then((hedSchemas) => { - return Promise.all([ - Promise.resolve(hedSchemas.baseSchema.version), - schema.buildSchema({ path: fallbackHedSchemaPath }), - ]) - }) - .then(([loadedVersion, fallbackHedSchemas]) => { - const fallbackHedSchemaVersion = fallbackHedSchemas.baseSchema.version - assert.strictEqual(loadedVersion, fallbackHedSchemaVersion) + describe('Remote HED schemas', () => { + it('a HED 2 schema can be loaded remotely', () => { + const spec1 = new SchemaSpec('', '7.2.0', '', '') + const specs = new SchemasSpec().addSchemaSpec(spec1) + return buildSchemas(specs).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + const schema1 = hedSchemas.getSchema(spec1.nickname) + assert.strictEqual(schema1.version, spec1.version) + assert.strictEqual(schema1.library, spec1.library) + assert.strictEqual(hedSchemas.generation, 2) }) + }) }) - it('loads the fallback schema if a local schema cannot be found', () => { - // Invalid base schema path - const localHedSchemaFile = 'tests/data/HEDNotFound.xml' - return schema - .buildSchema({ path: localHedSchemaFile }) - .then((hedSchemas) => { - return Promise.all([ - Promise.resolve(hedSchemas.baseSchema.version), - schema.buildSchema({ path: fallbackHedSchemaPath }), - ]) + describe('Local HED schemas', () => { + it('a standard schema can be loaded from a path', () => { + const localHedSchemaFile = 'tests/data/HED7.1.1.xml' + const localHedSchemaVersion = '7.1.1' + const schemaSpec = new SchemaSpec('', '', '', localHedSchemaFile) + const schemasSpec = new SchemasSpec().addSchemaSpec(schemaSpec) + return buildSchemas(schemasSpec).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + assert.strictEqual(hedSchemas.generation, 2) + const hedSchemaVersion = hedSchemas.baseSchema.version + assert.strictEqual(hedSchemaVersion, localHedSchemaVersion) }) - .then(([loadedVersion, fallbackHedSchemas]) => { - const fallbackHedSchemaVersion = fallbackHedSchemas.baseSchema.version - assert.strictEqual(loadedVersion, fallbackHedSchemaVersion) + }) + + it('a library schema can be loaded from a path', () => { + const localHedLibrarySchemaName = 'testlib' + const localHedLibrarySchemaVersion = '1.0.2' + const localHedLibrarySchemaFile = 'tests/data/HED_testlib_1.0.2.xml' + const schemaSpec = new SchemaSpec(localHedLibrarySchemaName, '', '', localHedLibrarySchemaFile) + const schemasSpec = new SchemasSpec().addSchemaSpec(schemaSpec) + return buildSchemas(schemasSpec).then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') + assert.strictEqual(hedSchemas.generation, 3) + const hedSchema = hedSchemas.getSchema(localHedLibrarySchemaName) + assert.strictEqual(hedSchema.generation, 3) + assert.strictEqual(hedSchema.library, localHedLibrarySchemaName) + assert.strictEqual(hedSchema.version, localHedLibrarySchemaVersion) }) + }) }) }) @@ -83,9 +113,9 @@ describe('HED schemas', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ - path: localHedSchemaFile, - }) + const spec1 = new SchemaSpec('', '7.1.1', '', localHedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec1) + hedSchemaPromise = buildSchemas(specs) }) it('should have tag dictionaries for all required tag attributes', () => { @@ -101,7 +131,8 @@ describe('HED schemas', () => { 'takesValue', 'unique', ] - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const dictionaries = hedSchemas.baseSchema.attributes.tagAttributes assert.hasAllKeys(dictionaries, tagDictionaryKeys) }) @@ -109,14 +140,16 @@ describe('HED schemas', () => { it('should have unit dictionaries for all required unit attributes', () => { const unitDictionaryKeys = ['SIUnit', 'unitSymbol'] - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const dictionaries = hedSchemas.baseSchema.attributes.unitAttributes assert.hasAllKeys(dictionaries, unitDictionaryKeys) }) }) it('should contain all of the required tags', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const requiredTags = ['event/category', 'event/description', 'event/label'] const dictionariesRequiredTags = hedSchemas.baseSchema.attributes.tagAttributes['required'] assert.hasAllKeys(dictionariesRequiredTags, requiredTags) @@ -124,7 +157,8 @@ describe('HED schemas', () => { }) it('should contain all of the positioned tags', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const positionedTags = ['event/category', 'event/description', 'event/label', 'event/long name'] const dictionariesPositionedTags = hedSchemas.baseSchema.attributes.tagAttributes['position'] assert.hasAllKeys(dictionariesPositionedTags, positionedTags) @@ -132,7 +166,8 @@ describe('HED schemas', () => { }) it('should contain all of the unique tags', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const uniqueTags = ['event/description', 'event/label', 'event/long name'] const dictionariesUniqueTags = hedSchemas.baseSchema.attributes.tagAttributes['unique'] assert.hasAllKeys(dictionariesUniqueTags, uniqueTags) @@ -140,7 +175,8 @@ describe('HED schemas', () => { }) it('should contain all of the tags with default units', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const defaultUnitTags = { 'attribute/blink/time shut/#': 's', 'attribute/blink/duration/#': 's', @@ -153,7 +189,8 @@ describe('HED schemas', () => { }) it('should contain all of the unit classes with their units and default units', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const defaultUnits = { acceleration: 'm-per-s^2', currency: '$', @@ -193,8 +230,8 @@ describe('HED schemas', () => { const dictionariesUnitAttributes = hedSchemas.baseSchema.attributes.unitClassAttributes const dictionariesAllUnits = hedSchemas.baseSchema.attributes.unitClasses - for (const unitClass in dictionariesUnitAttributes) { - const defaultUnit = dictionariesUnitAttributes[unitClass].defaultUnits + for (const [unitClass, unitClassAttributes] of Object.entries(dictionariesUnitAttributes)) { + const defaultUnit = unitClassAttributes.defaultUnits assert.deepStrictEqual(defaultUnit[0], defaultUnits[unitClass], `Default unit for unit class ${unitClass}`) } assert.deepStrictEqual(dictionariesAllUnits, allUnits, 'All units') @@ -202,7 +239,8 @@ describe('HED schemas', () => { }) it('should contain the correct (large) numbers of tags with certain attributes', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const expectedAttributeTagCount = { isNumeric: 80, predicateType: 20, @@ -212,12 +250,8 @@ describe('HED schemas', () => { } const dictionaries = hedSchemas.baseSchema.attributes.tagAttributes - for (const attribute in expectedAttributeTagCount) { - assert.lengthOf( - Object.keys(dictionaries[attribute]), - expectedAttributeTagCount[attribute], - 'Mismatch on attribute ' + attribute, - ) + for (const [attribute, count] of Object.entries(expectedAttributeTagCount)) { + assert.lengthOf(Object.keys(dictionaries[attribute]), count, 'Mismatch on attribute ' + attribute) } const expectedTagCount = 1116 - 119 + 2 @@ -236,7 +270,8 @@ describe('HED schemas', () => { }) it('should identify if a tag has a certain attribute', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const testStrings = { value: 'Attribute/Location/Reference frame/Relative to participant/Azimuth/#', valueParent: 'Attribute/Location/Reference frame/Relative to participant/Azimuth', @@ -287,26 +322,26 @@ describe('HED schemas', () => { }, } - for (const testStringKey in testStrings) { - const testString = testStrings[testStringKey].toLowerCase() + for (const [testStringKey, testString] of Object.entries(testStrings)) { + const testStringLowercase = testString.toLowerCase() const expected = expectedResults[testStringKey] - for (const expectedKey in expected) { + for (const [expectedKey, expectedResult] of Object.entries(expected)) { if (expectedKey === 'tags') { assert.strictEqual( - hedSchemas.baseSchema.attributes.tags.includes(testString), - expected[expectedKey], + hedSchemas.baseSchema.attributes.tags.includes(testStringLowercase), + expectedResult, `Test string: ${testString}. Attribute: ${expectedKey}`, ) } else if (expectedKey === 'unitClass') { assert.strictEqual( - testString in hedSchemas.baseSchema.attributes.tagUnitClasses, - expected[expectedKey], + testStringLowercase in hedSchemas.baseSchema.attributes.tagUnitClasses, + expectedResult, `Test string: ${testString}. Attribute: ${expectedKey}`, ) } else { assert.strictEqual( - hedSchemas.baseSchema.attributes.tagHasAttribute(testString, expectedKey), - expected[expectedKey], + hedSchemas.baseSchema.attributes.tagHasAttribute(testStringLowercase, expectedKey), + expectedResult, `Test string: ${testString}. Attribute: ${expectedKey}.`, ) } @@ -321,13 +356,14 @@ describe('HED schemas', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ - path: localHedSchemaFile, - }) + const spec2 = new SchemaSpec('', '8.0.0', '', localHedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec2) + hedSchemaPromise = buildSchemas(specs) }) it('should contain all of the tag group tags', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const tagGroupTags = ['property/organizational-property/def-expand'] const schemaTagGroupTags = hedSchemas.baseSchema.entries.definitions .get('tags') @@ -337,7 +373,8 @@ describe('HED schemas', () => { }) it('should contain all of the top-level tag group tags', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const tagGroupTags = [ 'property/organizational-property/definition', 'property/organizational-property/event-context', @@ -352,7 +389,8 @@ describe('HED schemas', () => { }) it('should contain all of the unit classes with their units and default units', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const defaultUnits = { accelerationUnits: 'm-per-s^2', angleUnits: 'radian', @@ -402,17 +440,18 @@ describe('HED schemas', () => { }) it('should contain the correct (large) numbers of tags with certain attributes', () => { - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const expectedAttributeTagCount = { requireChild: 7, takesValue: 88, } const schemaTags = hedSchemas.baseSchema.entries.definitions.get('tags') - for (const attribute of Object.keys(expectedAttributeTagCount)) { + for (const [attribute, count] of Object.entries(expectedAttributeTagCount)) { assert.lengthOf( schemaTags.getEntriesWithBooleanAttribute(attribute), - expectedAttributeTagCount[attribute], + count, 'Mismatch on attribute ' + attribute, ) } @@ -426,4 +465,125 @@ describe('HED schemas', () => { }) }) }) + + const checkWithIssues = function (testStrings, expectedResults, expectedIssues, testFunction) { + for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedResults, testStringKey, testStringKey + ' is not in expectedResults') + assert.property(expectedIssues, testStringKey, testStringKey + ' is not in expectedIssues') + const [testResult, testIssues] = testFunction(testString) + assert.deepStrictEqual(testResult, expectedResults[testStringKey], testString) + assert.sameDeepMembers(testIssues, expectedIssues[testStringKey], testString) + } + } + + describe('HED 3 SchemaSpec tests', () => { + it('should be return a SchemaSpec and no issues when valid', () => { + const tests = { + just_version: '8.1.0', + just_library: 'score_0.1.0', + base_with_nick: 'bt:8.1.0', + } + const expectedResults = { + just_version: new SchemaSpec('', '8.1.0'), + just_library: new SchemaSpec('', '0.1.0', 'score'), + base_with_nick: new SchemaSpec('bt', '8.1.0'), + } + const expectedIssues = { + just_version: [], + just_library: [], + base_with_nick: [], + } + + return checkWithIssues( + tests, + expectedResults, + expectedIssues, + (string) => { + const [sp, issues] = parseSchemaSpec(string) + return [sp, issues] + }, + 10000, + ) + }) + + it('should return issues when invalid', () => { + const tests = { + bad_version: '3.1.a', + } + const expectedResults = { + bad_version: null, + } + const expectedIssues = { + bad_version: [generateIssue('invalidSchemaSpecification', { spec: '3.1.a' })], + } + + return checkWithIssues( + tests, + expectedResults, + expectedIssues, + (string) => { + const [sp, issues] = parseSchemaSpec(string) + return [sp, issues] + }, + 10000, + ) + }) + }) + + describe('HED 3 SchemasSpec tests', () => { + it('should be return a SchemasSpec and no issues when valid', () => { + const schemas1 = new SchemasSpec() + schemas1.addSchemaSpec(new SchemaSpec('', '8.1.0', '', '')) + + const tests = { + just_version: '8.1.0', + } + const expectedResults = { + just_version: schemas1, + } + const expectedIssues = { + just_version: [], + } + + return checkWithIssues( + tests, + expectedResults, + expectedIssues, + (string) => { + const [sp, issues] = parseSchemasSpec(string) + return [sp, issues] + }, + 10000, + ) + }) + + it('should return issues when invalid', () => { + const schemas1 = new SchemasSpec() + schemas1.addSchemaSpec(new SchemaSpec('', '8.1.0', '', '')) + + const tests = { + // bad_version: '3.1.a', + duplicate_key: ['8.1.0', '8.0.0'], + } + const expectedResults = { + bad_version: new SchemasSpec(), + duplicate_key: schemas1, + } + const expectedIssues = { + bad_version: [generateIssue('invalidSchemaSpecification', { spec: '3.1.a' })], + duplicate_key: [generateIssue('invalidSchemaNickname', { spec: '8.0.0', nickname: '' })], + } + + return checkWithIssues( + tests, + expectedResults, + expectedIssues, + (string) => { + const [sp, issues] = parseSchemasSpec(string) + return [sp, issues] + }, + 10000, + ) + }) + }) }) diff --git a/tests/stringParser.spec.js b/tests/stringParser.spec.js index c918bd38..d82eef0e 100644 --- a/tests/stringParser.spec.js +++ b/tests/stringParser.spec.js @@ -1,11 +1,14 @@ const assert = require('chai').assert const { Schemas } = require('../common/schema') -const { buildSchema } = require('../converter/schema') -const { parseHedString, splitHedString } = require('../validator/stringParser') -const { ParsedHedTag } = require('../validator/types/parsedHed') +const { parseHedString } = require('../validator/parser/main') +const splitHedString = require('../validator/parser/splitHedString') +const ParsedHedSubstring = require('../validator/parser/parsedHedSubstring') +const { ParsedHedTag } = require('../validator/parser/parsedHedTag') const { generateIssue } = require('../common/issues/issues') +const { SchemaSpec, SchemasSpec } = require('../common/schema/types') const converterGenerateIssue = require('../converter/issues') const { recursiveMap } = require('../utils/array') +const { buildSchemas } = require('../validator/schema/init') describe('HED string parsing', () => { const nullSchema = new Schemas(null) @@ -20,28 +23,48 @@ describe('HED string parsing', () => { let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = buildSchema({ - path: hedSchemaFile, - }) + const spec2 = new SchemaSpec('', '8.0.0', '', hedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec2) + hedSchemaPromise = buildSchemas(specs) }) + /** + * Test-validate a list of strings without issues. + * + * @template T + * @param {Object} testStrings The strings to test. + * @param {Object} expectedResults The expected results. + * @param {function (string): T} testFunction The testing function. + */ const validatorWithoutIssues = function (testStrings, expectedResults, testFunction) { - for (const testStringKey of Object.keys(testStrings)) { - const testResult = testFunction(testStrings[testStringKey]) - assert.deepStrictEqual(testResult, expectedResults[testStringKey], testStrings[testStringKey]) + for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedResults, testStringKey, testStringKey + ' is not in expectedResults') + const testResult = testFunction(testString) + assert.deepStrictEqual(testResult, expectedResults[testStringKey], testString) } } + /** + * Test-validate a list of strings with issues. + * + * @template T + * @param {Object} testStrings The strings to test. + * @param {Object} expectedResults The expected results. + * @param {Object>} expectedIssues The expected issues. + * @param {function (string): [T, Object>]} testFunction The testing function. + */ const validatorWithIssues = function (testStrings, expectedResults, expectedIssues, testFunction) { - for (const testStringKey of Object.keys(testStrings)) { - const [testResult, testIssues] = testFunction(testStrings[testStringKey]) - assert.sameDeepMembers(testResult, expectedResults[testStringKey], testStrings[testStringKey]) - assert.deepOwnInclude(testIssues, expectedIssues[testStringKey], testStrings[testStringKey]) + for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedResults, testStringKey, testStringKey + ' is not in expectedResults') + assert.property(expectedIssues, testStringKey, testStringKey + ' is not in expectedIssues') + const [testResult, testIssues] = testFunction(testString) + assert.sameDeepMembers(testResult, expectedResults[testStringKey], testString) + assert.deepOwnInclude(testIssues, expectedIssues[testStringKey], testString) } } describe('HED strings', () => { - it('cannot have invalid characters', () => { + it.skip('cannot have invalid characters', () => { const testStrings = { openingCurly: 'Relation/Spatial-relation/Left-side-of,/Action/Move/Bend{/Upper-extremity/Elbow', closingCurly: 'Relation/Spatial-relation/Left-side-of,/Action/Move/Bend}/Upper-extremity/Elbow', @@ -149,49 +172,25 @@ describe('HED string parsing', () => { ]) }) - it('should include each group as its own single element', () => { + it.skip('should include each group as its own single element', () => { const hedString = '/Action/Move/Flex,(Relation/Spatial-relation/Left-side-of,/Action/Move/Bend,/Upper-extremity/Elbow),/Position/X-position/70 px,/Position/Y-position/23 px' const [result, issues] = splitHedString(hedString, nullSchema) assert.deepStrictEqual(Object.values(issues).flat(), []) assert.deepStrictEqual(result, [ new ParsedHedTag('/Action/Move/Flex', '/Action/Move/Flex', [0, 17], nullSchema), - new ParsedHedTag( - '(Relation/Spatial-relation/Left-side-of,/Action/Move/Bend,/Upper-extremity/Elbow)', + new ParsedHedSubstring( '(Relation/Spatial-relation/Left-side-of,/Action/Move/Bend,/Upper-extremity/Elbow)', [18, 99], - nullSchema, ), new ParsedHedTag('/Position/X-position/70 px', '/Position/X-position/70 px', [100, 126], nullSchema), new ParsedHedTag('/Position/Y-position/23 px', '/Position/Y-position/23 px', [127, 153], nullSchema), ]) }) - it('should not include double quotes', () => { - const doubleQuoteString = - 'Event/Category/Sensory-event,"Item/Object/Man-made-object/Vehicle/Train",Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/Purple-color/Purple' - const normalString = - 'Event/Category/Sensory-event,Item/Object/Man-made-object/Vehicle/Train,Property/Sensory-property/Sensory-attribute/Visual-attribute/Color/CSS-color/Purple-color/Purple' - const [doubleQuoteResult, doubleQuoteIssues] = splitHedString(doubleQuoteString, nullSchema) - const [normalResult, normalIssues] = splitHedString(normalString, nullSchema) - assert.deepStrictEqual(Object.values(doubleQuoteIssues).flat(), []) - assert.deepStrictEqual(Object.values(normalIssues).flat(), []) - const noBoundsMap = (parsedTag) => { - return { - canonicalTag: parsedTag.canonicalTag, - formattedTag: parsedTag.formattedTag, - originalTag: parsedTag.originalTag, - } - } - const doubleQuoteResultNoBounds = doubleQuoteResult.map(noBoundsMap) - const normalResultNoBounds = normalResult.map(noBoundsMap) - assert.deepStrictEqual(doubleQuoteResultNoBounds, normalResultNoBounds) - }) - it('should not include blanks', () => { const testStrings = { doubleComma: '/Item/Object/Man-made-object/Vehicle/Car,,/Action/Perform/Operate', - doubleInvalidCharacter: '/Item/Object/Man-made-object/Vehicle/Car[]/Action/Perform/Operate', trailingBlank: '/Item/Object/Man-made-object/Vehicle/Car, /Action/Perform/Operate,', } const expectedList = [ @@ -205,25 +204,10 @@ describe('HED string parsing', () => { ] const expectedResults = { doubleComma: expectedList, - doubleInvalidCharacter: expectedList, trailingBlank: expectedList, } const expectedIssues = { doubleComma: {}, - doubleInvalidCharacter: { - syntax: [ - generateIssue('invalidCharacter', { - character: '[', - index: 40, - string: testStrings.doubleInvalidCharacter, - }), - generateIssue('invalidCharacter', { - character: ']', - index: 41, - string: testStrings.doubleInvalidCharacter, - }), - ], - }, trailingBlank: {}, } validatorWithIssues(testStrings, expectedResults, expectedIssues, (string) => { @@ -357,10 +341,12 @@ describe('HED string parsing', () => { ['Braille', 'Character/A', 'Screen-window'], ], } - return hedSchemaPromise.then((hedSchema) => { + + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') for (const testStringKey of Object.keys(testStrings)) { const testString = testStrings[testStringKey] - const [parsedString, issues] = parseHedString(testString, hedSchema) + const [parsedString, issues] = parseHedString(testString, hedSchemas) assert.deepStrictEqual(Object.values(issues).flat(), []) assert.sameDeepMembers(parsedString.tags.map(originalMap), expectedTags[testStringKey], testString) assert.deepStrictEqual( @@ -411,9 +397,11 @@ describe('HED string parsing', () => { ], }, } - return hedSchemaPromise.then((hedSchema) => { + + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') return validatorWithIssues(testStrings, expectedResults, expectedIssues, (string) => { - const [parsedString, issues] = parseHedString(string, hedSchema) + const [parsedString, issues] = parseHedString(string, hedSchemas) const canonicalTags = parsedString.tags.map((parsedTag) => { return parsedTag.canonicalTag }) diff --git a/utils/__tests__/array.spec.js b/utils/__tests__/array.spec.js index 124014a2..d71d3762 100644 --- a/utils/__tests__/array.spec.js +++ b/utils/__tests__/array.spec.js @@ -42,17 +42,4 @@ describe('Array utility functions', () => { assert.strictEqual(resultF, 1) }) }) - - describe('Array flattening', () => { - it('must correctly flatten nested arrays', () => { - const array1 = ['a', ['b', 'c'], 'd', 'e', [['f', 'g']]] - const array2 = [1, 2, 3, 4] - const array3 = [] - const array4 = [2, [4, [6, [8, [], [10]]]]] - assert.deepStrictEqual(utils.array.flattenDeep(array1), ['a', 'b', 'c', 'd', 'e', 'f', 'g']) - assert.deepStrictEqual(utils.array.flattenDeep(array2), [1, 2, 3, 4]) - assert.deepStrictEqual(utils.array.flattenDeep(array3), []) - assert.deepStrictEqual(utils.array.flattenDeep(array4), [2, 4, 6, 8, 10]) - }) - }) }) diff --git a/utils/__tests__/hed.spec.js b/utils/__tests__/hed.spec.js index 24a25a8f..5b2a8389 100644 --- a/utils/__tests__/hed.spec.js +++ b/utils/__tests__/hed.spec.js @@ -1,13 +1,23 @@ const assert = require('chai').assert -const hed = require('../hed') -const schema = require('../../validator/schema/init') +const hed = require('../hedStrings') +const { SchemaSpec, SchemasSpec } = require('../../common/schema/types') +const { buildSchemas } = require('../../validator/schema/init') describe('HED tag string utility functions', () => { describe('Syntactic utility functions', () => { + /** + * Test-validate a list of strings. + * + * @template T + * @param {Object} testStrings The strings to test. + * @param {Object} expectedResults The expected results. + * @param {function (string): T} testFunction The testing function. + */ const validator = function (testStrings, expectedResults, testFunction) { - for (const testStringKey of Object.keys(testStrings)) { - const testResult = testFunction(testStrings[testStringKey]) - assert.deepStrictEqual(testResult, expectedResults[testStringKey], testStrings[testStringKey]) + for (const [testStringKey, testString] of Object.entries(testStrings)) { + assert.property(expectedResults, testStringKey, testStringKey + ' is not in expectedResults') + const testResult = testFunction(testString) + assert.deepStrictEqual(testResult, expectedResults[testStringKey], testString) } } @@ -170,183 +180,25 @@ describe('HED tag string utility functions', () => { }) }) - const localHedSchemaFile = 'tests/data/HED7.1.1.xml' - describe('HED tag schema-based utility functions', () => { + const localHedSchemaFile = 'tests/data/HED7.1.1.xml' let hedSchemaPromise beforeAll(() => { - hedSchemaPromise = schema.buildSchema({ - path: localHedSchemaFile, - }) - }) - - const validatorBase = function (testStrings, expectedResults, testFunction, assertionFunction) { - return hedSchemaPromise.then((schema) => { - for (const testStringKey of Object.keys(testStrings)) { - const testResult = testFunction(testStrings[testStringKey], schema) - assertionFunction(testResult, expectedResults[testStringKey], testStrings[testStringKey]) - } - }) - } - - const validatorString = function (testStrings, expectedResults, testFunction) { - return validatorBase(testStrings, expectedResults, testFunction, assert.strictEqual) - } - - const validatorList = function (testStrings, expectedResults, testFunction) { - return validatorBase(testStrings, expectedResults, testFunction, assert.sameDeepMembers) - } - - it('should correctly determine if a tag exists', () => { - const testStrings = { - direction: 'attribute/direction/left', - person: 'item/object/person', - validPound: 'event/duration/#', - missingTopLevel: 'something', - missingSub: 'attribute/nothing', - missingValue: 'participant/#', - } - const expectedResults = { - direction: true, - person: true, - validPound: false, - missingTopLevel: false, - missingSub: false, - missingValue: false, - } - return validatorString(testStrings, expectedResults, (string, hedSchemas) => { - return hed.tagExistsInSchema(string, hedSchemas.baseSchema.attributes) - }) - }) - - it('should correctly determine if a tag takes a value', () => { - const testStrings = { - direction: 'attribute/direction/left/35 px', - eventId: 'event/id/35', - validPound: 'event/duration/#', - topLevel: 'something', - noValueSub: 'attribute/color/black', - noValuePound: 'participant/#', - } - const expectedResults = { - direction: true, - eventId: true, - validPound: true, - topLevel: false, - noValueSub: false, - noValuePound: false, - } - return validatorString(testStrings, expectedResults, (string, hedSchemas) => { - return hed.tagTakesValue(string, hedSchemas.baseSchema.attributes, false) - }) - }) - - it('should correctly determine if a tag has a unit class', () => { - const testStrings = { - suffixed: 'attribute/direction/left/35 px', - prefixed: 'participant/effect/cognitive/reward/$10.55', - unitClassPound: 'event/duration/#', - topLevel: 'something', - noUnitClassValue: 'attribute/color/red/0.5', - noUnitClassPound: 'participant/#', - } - const expectedResults = { - suffixed: true, - prefixed: true, - unitClassPound: true, - topLevel: false, - noUnitClassValue: false, - noUnitClassPound: false, - } - return validatorString(testStrings, expectedResults, (string, hedSchemas) => { - return hed.isUnitClassTag(string, hedSchemas.baseSchema.attributes) - }) - }) - - it("should correctly determine a tag's default unit, if any", () => { - const testStrings = { - suffixed: 'attribute/blink/duration/35 ms', - prefixed: 'participant/effect/cognitive/reward/$10.55', - suffixedWithPrefixDefault: 'participant/effect/cognitive/reward/11 dollars', - unitClassPound: 'event/duration/#', - noUnitClassValue: 'attribute/color/red/0.5', - noValue: 'attribute/color/black', - noValuePound: 'participant/#', - } - const expectedResults = { - suffixed: 's', - prefixed: '$', - suffixedWithPrefixDefault: '$', - unitClassPound: 's', - noUnitClassValue: '', - noValue: '', - noValuePound: '', - } - return validatorString(testStrings, expectedResults, (string, hedSchemas) => { - return hed.getUnitClassDefaultUnit(string, hedSchemas.baseSchema.attributes) - }) - }) - - it("should correctly determine a tag's unit classes, if any", () => { - const testStrings = { - suffixed: 'attribute/direction/left/35 px', - prefixed: 'participant/effect/cognitive/reward/$10.55', - suffixedWithPrefixDefault: 'participant/effect/cognitive/reward/11 dollars', - unitClassPound: 'event/duration/#', - noUnitClassValue: 'attribute/color/red/0.5', - noValue: 'attribute/color/black', - noValuePound: 'participant/#', - } - const expectedResults = { - suffixed: ['angle', 'physicalLength', 'pixels'], - prefixed: ['currency'], - suffixedWithPrefixDefault: ['currency'], - unitClassPound: ['time'], - noUnitClassValue: [], - noValue: [], - noValuePound: [], - } - return validatorList(testStrings, expectedResults, (string, hedSchemas) => { - return hed.getTagUnitClasses(string, hedSchemas.baseSchema.attributes) - }) + const spec1 = new SchemaSpec('', '7.1.1', '', localHedSchemaFile) + const specs = new SchemasSpec().addSchemaSpec(spec1) + hedSchemaPromise = buildSchemas(specs) }) - it("should correctly determine a tag's legal units, if any", () => { - const testStrings = { - suffixed: 'attribute/direction/left/35 px', - prefixed: 'participant/effect/cognitive/reward/$10.55', - suffixedWithPrefixDefault: 'participant/effect/cognitive/reward/11 dollars', - unitClassPound: 'event/duration/#', - noUnitClassValue: 'attribute/color/red/0.5', - noValue: 'attribute/color/black', - noValuePound: 'participant/#', - } - const directionUnits = ['degree', 'radian', 'rad', 'm', 'foot', 'metre', 'mile', 'px', 'pixel'] - const currencyUnits = ['dollar', '$', 'point', 'fraction'] - const timeUnits = ['second', 's', 'day', 'minute', 'hour'] - const expectedResults = { - suffixed: directionUnits, - prefixed: currencyUnits, - suffixedWithPrefixDefault: currencyUnits, - unitClassPound: timeUnits, - noUnitClassValue: [], - noValue: [], - noValuePound: [], - } - return validatorList(testStrings, expectedResults, (string, hedSchemas) => { - return hed.getTagUnitClassUnits(string, hedSchemas.baseSchema.attributes) - }) - }) - - it.only('should strip valid units from a value', () => { + it('should strip valid units from a value', () => { const dollarsString = '$25.99' const volumeString = '100 m^3' const prefixedVolumeString = '100 cm^3' const invalidVolumeString = '200 cm' const currencyUnits = ['dollars', '$', 'points', 'fraction'] const volumeUnits = ['m^3'] - return hedSchemaPromise.then((hedSchemas) => { + return hedSchemaPromise.then(([hedSchemas, issues]) => { + assert.isEmpty(issues, 'Schema loading issues occurred') const strippedDollarsString = hed.validateUnits(dollarsString, currencyUnits, hedSchemas.baseSchema.attributes) const strippedVolumeString = hed.validateUnits(volumeString, volumeUnits, hedSchemas.baseSchema.attributes) const strippedPrefixedVolumeString = hed.validateUnits( @@ -365,21 +217,5 @@ describe('HED tag string utility functions', () => { assert.sameOrderedMembers(strippedInvalidVolumeString, [true, false, '200']) }) }) - - it('should correctly determine if a tag allows extensions', () => { - const testStrings = { - vehicle: 'item/object/vehicle/boat', - color: 'attribute/color/red/0.5', - noExtension: 'event/nonsense', - } - const expectedResults = { - vehicle: true, - color: true, - noExtension: false, - } - return validatorString(testStrings, expectedResults, (string, hedSchemas) => { - return hed.isExtensionAllowedTag(string, hedSchemas.baseSchema.attributes) - }) - }) }) }) diff --git a/utils/__tests__/string.spec.js b/utils/__tests__/string.spec.js index fad61b89..035cf641 100644 --- a/utils/__tests__/string.spec.js +++ b/utils/__tests__/string.spec.js @@ -1,4 +1,4 @@ -const assert = require('assert') +const assert = require('chai').assert const utils = require('../') describe('String utility functions', () => { @@ -67,16 +67,18 @@ describe('String utility functions', () => { }) describe('Simple string validation functions', () => { - const validate = function (fn, validStrings, invalidStrings) { - for (const key of Object.keys(validStrings)) { - const string = validStrings[key] - const result = fn(string) - assert.strictEqual(result, true, string) + /** + * Test a string validation function. + * @param {function (string): boolean} testFunction The validation function to test. + * @param {Object} validStrings A set of valid strings. + * @param {Object} invalidStrings A set of invalid strings. + */ + const validate = function (testFunction, validStrings, invalidStrings) { + for (const [key, string] of Object.entries(validStrings)) { + assert.isTrue(testFunction(string), key) } - for (const key of Object.keys(invalidStrings)) { - const string = invalidStrings[key] - const result = fn(string) - assert.strictEqual(result, false, string) + for (const [key, string] of Object.entries(invalidStrings)) { + assert.isFalse(testFunction(string), key) } } diff --git a/utils/array.js b/utils/array.js index c87b4fe8..a1f15c66 100644 --- a/utils/array.js +++ b/utils/array.js @@ -15,19 +15,6 @@ const getElementCount = function (array, elementToCount) { return count } -/** - * Recursively flatten an array. - * - * @param {Array} array The array to flatten. - * @return {Array} The flattened array. - */ -const flattenDeep = function (array) { - return array.reduce( - (accumulator, value) => (Array.isArray(value) ? accumulator.concat(flattenDeep(value)) : accumulator.concat(value)), - [], - ) -} - /** * Return a scalar as a singleton array and an array as-is. * @@ -56,8 +43,7 @@ function recursiveMap(fn, array) { } module.exports = { - getElementCount: getElementCount, - flattenDeep: flattenDeep, - asArray: asArray, - recursiveMap: recursiveMap, + getElementCount, + asArray, + recursiveMap, } diff --git a/utils/bids.js b/utils/bids.js index c8c8e62d..4c4ee666 100644 --- a/utils/bids.js +++ b/utils/bids.js @@ -9,5 +9,5 @@ const sidecarValueHasHed = function (sidecarValue) { } module.exports = { - sidecarValueHasHed: sidecarValueHasHed, + sidecarValueHasHed, } diff --git a/utils/files.js b/utils/files.js index 753dd064..1ed65cf1 100644 --- a/utils/files.js +++ b/utils/files.js @@ -26,6 +26,6 @@ const readHTTPSFile = function (url) { } module.exports = { - readFile: readFile, - readHTTPSFile: readHTTPSFile, + readFile, + readHTTPSFile, } diff --git a/utils/hedData.js b/utils/hedData.js new file mode 100644 index 00000000..d8b5c5fc --- /dev/null +++ b/utils/hedData.js @@ -0,0 +1,49 @@ +const lt = require('semver/functions/lt') + +const { ParsedHedTag } = require('../validator/parser/parsedHedTag') + +/** + * Determine the HED generation for a base schema version number. + * + * @param {string} version A HED base schema version number. + * @return {number} The HED generation the base schema belongs to. + */ +const getGenerationForSchemaVersion = function (version) { + if (lt(version, '4.0.0')) { + return 1 + } else if (lt(version, '8.0.0-alpha')) { + return 2 + } else { + return 3 + } +} + +const mergeParsingIssues = function (previousIssues, currentIssues) { + for (const key of Object.keys(currentIssues)) { + previousIssues[key] = + previousIssues[key] !== undefined ? previousIssues[key].concat(currentIssues[key]) : currentIssues[key] + } +} + +/** + * Get the parent tag objects for a given short tag. + * + * @param {Schemas} hedSchemas The HED schema collection. + * @param {string} shortTag A short-form HED 3 tag. + * @return {Map} A Map mapping a {@link Schema} to a {@link ParsedHedTag} object representing the full tag. + */ +const getParsedParentTags = function (hedSchemas, shortTag) { + const parentTags = new Map() + for (const [schemaNickname, schema] of hedSchemas.schemas) { + const parentTag = new ParsedHedTag(shortTag, shortTag, [0, shortTag.length - 1], hedSchemas, schemaNickname) + parentTags.set(schema, parentTag) + parentTag.conversionIssues = parentTag.conversionIssues.filter((issue) => issue.internalCode !== 'invalidTag') + } + return parentTags +} + +module.exports = { + getGenerationForSchemaVersion, + mergeParsingIssues, + getParsedParentTags, +} diff --git a/utils/hed.js b/utils/hedStrings.js similarity index 87% rename from utils/hed.js rename to utils/hedStrings.js index 9a8682c0..deb5676a 100644 --- a/utils/hed.js +++ b/utils/hedStrings.js @@ -1,13 +1,8 @@ const pluralize = require('pluralize') pluralize.addUncountableRule('hertz') -const lt = require('semver/functions/lt') - const { isNumber } = require('./string') -const tagsDictionaryKey = 'tags' -const unitClassType = 'unitClass' -const unitClassUnitsType = 'units' const unitPrefixType = 'unitPrefix' const unitSymbolType = 'unitSymbol' const SIUnitKey = 'SIUnit' @@ -213,30 +208,13 @@ const getAllUnits = function (hedSchemaAttributes) { return units } -/** - * Determine the HED generation for a base schema version number. - * - * @param {string} version A HED base schema version number. - * @return {number} The HED generation the base schema belongs to. - */ -const getGenerationForSchemaVersion = function (version) { - if (lt(version, '4.0.0')) { - return 1 - } else if (lt(version, '8.0.0-alpha')) { - return 2 - } else { - return 3 - } -} - module.exports = { - replaceTagNameWithPound: replaceTagNameWithPound, - getTagSlashIndices: getTagSlashIndices, - getTagName: getTagName, - getParentTag: getParentTag, - hedStringIsAGroup: hedStringIsAGroup, - removeGroupParentheses: removeGroupParentheses, - validateValue: validateValue, - validateUnits: validateUnits, - getGenerationForSchemaVersion: getGenerationForSchemaVersion, + replaceTagNameWithPound, + getTagSlashIndices, + getTagName, + getParentTag, + hedStringIsAGroup, + removeGroupParentheses, + validateValue, + validateUnits, } diff --git a/utils/index.js b/utils/index.js index 3d31db32..cccbcc78 100644 --- a/utils/index.js +++ b/utils/index.js @@ -1,19 +1,11 @@ -// dependencies ------------------------------------------------------ - -const HED = require('./hed') +const HED = require('./hedStrings') const array = require('./array') const files = require('./files') const string = require('./string') -// public api -------------------------------------------------------- - -const utils = { - HED: HED, - array: array, - files: files, - string: string, +module.exports = { + HED, + array, + files, + string, } - -// exports ----------------------------------------------------------- - -module.exports = utils diff --git a/utils/map.js b/utils/map.js index 94d20bd5..feabcb6e 100644 --- a/utils/map.js +++ b/utils/map.js @@ -29,5 +29,5 @@ const filterNonEqualDuplicates = function (list, equalityFunction = isEqual) { } module.exports = { - filterNonEqualDuplicates: filterNonEqualDuplicates, + filterNonEqualDuplicates, } diff --git a/utils/string.js b/utils/string.js index 7a482d12..82a2f79d 100644 --- a/utils/string.js +++ b/utils/string.js @@ -76,10 +76,10 @@ const isNumber = function (numericString) { */ const stringTemplate = function (strings, ...keys) { return function (...values) { - let dict = values[values.length - 1] || {} - let result = [strings[0]] - keys.forEach(function (key, i) { - let value = Number.isInteger(key) ? values[key] : dict[key] + const dict = values[values.length - 1] || {} + const result = [strings[0]] + keys.forEach((key, i) => { + const value = Number.isInteger(key) ? values[key] : dict[key] result.push(value, strings[i + 1]) }) return result.join('') @@ -87,11 +87,11 @@ const stringTemplate = function (strings, ...keys) { } module.exports = { - stringIsEmpty: stringIsEmpty, - getCharacterCount: getCharacterCount, - capitalizeString: capitalizeString, - isClockFaceTime: isClockFaceTime, - isDateTime: isDateTime, - isNumber: isNumber, - stringTemplate: stringTemplate, + stringIsEmpty, + getCharacterCount, + capitalizeString, + isClockFaceTime, + isDateTime, + isNumber, + stringTemplate, } diff --git a/utils/types.js b/utils/types.js index 394ad4f6..20712a3a 100644 --- a/utils/types.js +++ b/utils/types.js @@ -36,6 +36,6 @@ const MemoizerMixin = (Base) => { class Memoizer extends MemoizerMixin(Object) {} module.exports = { - Memoizer: Memoizer, - MemoizerMixin: MemoizerMixin, + Memoizer, + MemoizerMixin, } diff --git a/utils/xml2js.js b/utils/xml2js.js index 807d9c37..df87324d 100644 --- a/utils/xml2js.js +++ b/utils/xml2js.js @@ -32,5 +32,5 @@ const setParent = function (node, parent) { } module.exports = { - setParent: setParent, + setParent, } diff --git a/utils/xpath.js b/utils/xpath.js index 1b7014ed..beafffb3 100644 --- a/utils/xpath.js +++ b/utils/xpath.js @@ -87,5 +87,5 @@ const search = function (element, elementName, attributeName) { } module.exports = { - find: find, + find, } diff --git a/validator/bids/index.js b/validator/bids/index.js index 838f0bc1..4e2d0799 100644 --- a/validator/bids/index.js +++ b/validator/bids/index.js @@ -1,11 +1,12 @@ -const { BidsDataset, BidsEventFile, BidsHedIssue, BidsIssue, BidsSidecar } = require('./types') -const validateBidsDataset = require('./validate') +const { BidsDataset, BidsEventFile, BidsHedIssue, BidsIssue, BidsJsonFile, BidsSidecar } = require('./types') +const { validateBidsDataset } = require('./validate') module.exports = { - BidsDataset: BidsDataset, - BidsEventFile: BidsEventFile, - BidsHedIssue: BidsHedIssue, - BidsIssue: BidsIssue, - BidsSidecar: BidsSidecar, - validateBidsDataset: validateBidsDataset, + BidsDataset, + BidsEventFile, + BidsHedIssue, + BidsIssue, + BidsJsonFile, + BidsSidecar, + validateBidsDataset, } diff --git a/validator/bids/schema.js b/validator/bids/schema.js new file mode 100644 index 00000000..9b08caed --- /dev/null +++ b/validator/bids/schema.js @@ -0,0 +1,114 @@ +const semver = require('semver') +const { buildSchemas } = require('../schema/init') +const { generateIssue } = require('../../common/issues/issues') +const { SchemaSpec, SchemasSpec } = require('../../common/schema/types') +const { asArray } = require('../../utils/array') + +const alphanumericRegExp = new RegExp('^[a-zA-Z0-9]+$') + +function buildBidsSchemas(dataset, schemaDefinition) { + let schemasSpec + let issues + if (schemaDefinition) { + ;[schemasSpec, issues] = validateSchemasSpec(schemaDefinition) + } else if (dataset.datasetDescription.jsonData && dataset.datasetDescription.jsonData.HEDVersion) { + ;[schemasSpec, issues] = parseSchemasSpec(dataset.datasetDescription.jsonData.HEDVersion) + } else { + ;[schemasSpec, issues] = [null, [generateIssue('invalidSchemaSpecification', { spec: 'no schema available' })]] + } + if (issues.length > 0) { + return Promise.reject(issues) + } else { + return buildSchemas(schemasSpec).then(([schemas]) => [schemas, issues]) + } +} + +function validateSchemasSpec(schemasSpec) { + // ToDO: implement + if (schemasSpec instanceof SchemasSpec) { + return [schemasSpec, []] + } else if (schemasSpec instanceof Map) { + const newSchemasSpec = new SchemasSpec() + newSchemasSpec.data = schemasSpec + return [newSchemasSpec, []] + } else if ('version' in schemasSpec || 'path' in schemasSpec || 'libraries' in schemasSpec) { + return [convertOldSpecToSchemasSpec(schemasSpec), []] + } else { + return [null, [generateIssue('invalidSchemaSpecification', { spec: JSON.stringify(schemasSpec) })]] + } +} + +function convertOldSpecToSchemasSpec(oldSpec) { + const newSpec = new SchemasSpec() + // TODO: implement + return newSpec +} + +function parseSchemasSpec(hedVersion) { + const schemasSpec = new SchemasSpec() + const processVersion = asArray(hedVersion) + const issues = [] + for (const schemaVersion of processVersion) { + const [schemaSpec, verIssues] = parseSchemaSpec(schemaVersion) + if (verIssues.length > 0) { + issues.push(...verIssues) + } else if (schemasSpec.isDuplicate(schemaSpec)) { + issues.push(generateIssue('invalidSchemaNickname', { spec: schemaVersion, nickname: schemaSpec.nickname })) + } else { + schemasSpec.addSchemaSpec(schemaSpec) + } + } + return [schemasSpec, issues] +} + +function parseSchemaSpec(schemaVersion) { + const nicknameSplit = schemaVersion.split(':') + let nickname = '' + let schema + if (nicknameSplit.length > 2) { + return [null, [generateIssue('invalidSchemaSpecification', { spec: schemaVersion })]] + } + if (nicknameSplit.length > 1) { + ;[nickname, schema] = nicknameSplit + if (nickname === '' || !alphanumericRegExp.test(nickname)) { + return [null, [generateIssue('invalidSchemaNickname', { nickname: nickname, spec: schemaVersion })]] + } + } else { + schema = nicknameSplit[0] + } + const versionSplit = schema.split('_') + let library = '' + let version + if (versionSplit.length > 2) { + return [null, [generateIssue('invalidSchemaSpecification', { spec: schemaVersion })]] + } + if (versionSplit.length > 1) { + ;[library, version] = versionSplit + if (library === '' || !alphanumericRegExp.test(library)) { + return [null, [generateIssue('invalidSchemaSpecification', { spec: schemaVersion })]] + } + } else { + version = versionSplit[0] + } + if (!semver.valid(version)) { + return [null, [generateIssue('invalidSchemaSpecification', { spec: schemaVersion })]] + } + const schemaSpec = new SchemaSpec(nickname, version, library) + return [schemaSpec, []] +} + +function validateSchemaSpec(schemaSpec) { + // ToDO: implement + if (!(schemaSpec instanceof SchemaSpec)) { + return [null, [generateIssue('invalidSchemaSpecification', { spec: JSON.stringify(schemaSpec) })]] + } + return [schemaSpec, []] +} + +module.exports = { + buildBidsSchemas, + validateSchemaSpec, + validateSchemasSpec, + parseSchemaSpec, + parseSchemasSpec, +} diff --git a/validator/bids/types.js b/validator/bids/types.js index ec708f6a..c5b0b988 100644 --- a/validator/bids/types.js +++ b/validator/bids/types.js @@ -1,4 +1,4 @@ -const { ParsedHedString, ParsedHedGroup } = require('../stringParser') +const { ParsedHedString, ParsedHedGroup } = require('../parser/main') const { sidecarValueHasHed } = require('../../utils/bids') const { Issue } = require('../../common/issues/issues') @@ -35,7 +35,16 @@ class BidsFile extends BidsData { } } -class BidsJsonFile extends BidsFile {} +class BidsJsonFile extends BidsFile { + constructor(name, jsonData, file) { + super(name, file) + /** + * This file's JSON data. + * @type {object} + */ + this.jsonData = jsonData + } +} class BidsTsvFile extends BidsFile { constructor(name, parsedTsv, file) { @@ -77,19 +86,14 @@ class BidsEventFile extends BidsTsvFile { class BidsSidecar extends BidsJsonFile { constructor(name, sidecarData = {}, file) { - super(name, file) - /** - * The unparsed sidecar data. - * @type {object} - */ - this.sidecarData = sidecarData + super(name, sidecarData, file) this.filterHedStrings() this.categorizeHedStrings() } filterHedStrings() { - const sidecarHedTags = Object.entries(this.sidecarData) + const sidecarHedTags = Object.entries(this.jsonData) .map(([sidecarKey, sidecarValue]) => { if (sidecarValueHasHed(sidecarValue)) { return [sidecarKey, sidecarValue.HED] @@ -116,20 +120,27 @@ class BidsSidecar extends BidsJsonFile { get hedStrings() { return this.hedValueStrings.concat(this.hedCategoricalStrings) } + + get sidecarData() { + return this.jsonData + } } // TODO: Remove in v4.0.0. const fallbackDatasetDescription = new BidsJsonFile('./dataset_description.json', null) class BidsDataset extends BidsData { - constructor(eventData, sidecarData, datasetDescription = fallbackDatasetDescription) { + constructor(eventData, sidecarData, datasetDescription = fallbackDatasetDescription, datasetRootDirectory = null) { super() this.eventData = eventData this.sidecarData = sidecarData this.datasetDescription = datasetDescription + this.datasetRootDirectory = datasetRootDirectory } } +const bidsHedErrorCodes = new Set([104, 106, 107]) + class BidsIssue { constructor(issueCode, file, evidence) { this.code = issueCode @@ -138,7 +149,11 @@ class BidsIssue { } isError() { - return this.code === 104 || this.code === 106 + return bidsHedErrorCodes.has(this.code) + } + + static generateInternalErrorPromise(error) { + return Promise.resolve([new BidsIssue(107, null, error.message)]) } } @@ -154,10 +169,10 @@ class BidsHedIssue extends BidsIssue { } module.exports = { - BidsDataset: BidsDataset, - BidsEventFile: BidsEventFile, - BidsHedIssue: BidsHedIssue, - BidsIssue: BidsIssue, - BidsJsonFile: BidsJsonFile, - BidsSidecar: BidsSidecar, + BidsDataset, + BidsEventFile, + BidsHedIssue, + BidsIssue, + BidsJsonFile, + BidsSidecar, } diff --git a/validator/bids/validate.js b/validator/bids/validate.js index 475dfe00..14d39c9e 100644 --- a/validator/bids/validate.js +++ b/validator/bids/validate.js @@ -1,57 +1,26 @@ const { validateHedDatasetWithContext } = require('../dataset') const { validateHedString } = require('../event') -const { buildSchema } = require('../schema/init') -const { sidecarValueHasHed } = require('../../utils/bids') -const { generateIssue } = require('../../common/issues/issues') -const { fallbackFilePath } = require('../../common/schema') const { BidsDataset, BidsHedIssue, BidsIssue } = require('./types') - -function generateInternalErrorBidsIssue(error) { - return Promise.resolve([new BidsIssue(107, null, error.message)]) -} +const { buildBidsSchemas } = require('./schema') /** * Validate a BIDS dataset. * * @param {BidsDataset} dataset The BIDS dataset. * @param {object} schemaDefinition The version spec for the schema to be loaded. - * @return {Promise>} Any issues found. + * @return {Promise} Any issues found. */ function validateBidsDataset(dataset, schemaDefinition) { - // loop through event data files - const schemaLoadIssues = [] - return buildBidsSchema(dataset, schemaDefinition) - .catch((error) => { - schemaLoadIssues.push( - new BidsHedIssue( - generateIssue('requestedSchemaLoadFailed', { - schemaDefinition: JSON.stringify(schemaDefinition), - error: error.message, - }), - dataset.datasetDescription.file, - ), - ) - return buildBidsSchema(dataset, { path: fallbackFilePath }).catch((error) => { - schemaLoadIssues.push( - new BidsHedIssue( - generateIssue('fallbackSchemaLoadFailed', { - error: error.message, - }), - dataset.datasetDescription.file, - ), + return buildBidsSchemas(dataset, schemaDefinition).then( + ([hedSchemas, schemaLoadIssues]) => { + return validateFullDataset(dataset, hedSchemas) + .catch(BidsIssue.generateInternalErrorPromise) + .then((issues) => + issues.concat(convertHedIssuesToBidsIssues(schemaLoadIssues, dataset.datasetDescription.file)), ) - return [] - }) - }) - .then((datasetIssues) => { - return Promise.resolve(datasetIssues.concat(schemaLoadIssues)) - }) -} - -function buildBidsSchema(dataset, schemaDefinition) { - return buildSchema(schemaDefinition, false).then((hedSchemas) => { - return validateFullDataset(dataset, hedSchemas).catch(generateInternalErrorBidsIssue) - }) + }, + (issues) => convertHedIssuesToBidsIssues(issues, dataset.datasetDescription.file), + ) } function validateFullDataset(dataset, hedSchemas) { @@ -193,4 +162,4 @@ function convertHedIssuesToBidsIssues(hedIssues, file) { return hedIssues.map((hedIssue) => new BidsHedIssue(hedIssue, file)) } -module.exports = validateBidsDataset +module.exports = { validateBidsDataset } diff --git a/validator/dataset.js b/validator/dataset.js index 96b6b096..cf15b00c 100644 --- a/validator/dataset.js +++ b/validator/dataset.js @@ -1,5 +1,5 @@ const { validateHedEventWithDefinitions } = require('./event') -const { parseHedStrings } = require('./stringParser') +const { parseHedStrings } = require('./parser/main') const { generateIssue } = require('../common/issues/issues') const { filterNonEqualDuplicates } = require('../utils/map') @@ -48,7 +48,7 @@ const validateDataset = function (definitions, hedStrings, hedSchemas) { /** * Validate a group of HED strings. * - * @param {ParsedHedString[]} parsedHedStrings The dataset's parsed HED strings. + * @param {(string|ParsedHedString)[]} parsedHedStrings The dataset's parsed HED strings. * @param {Schemas} hedSchemas The HED schema container object. * @param {Map} definitions The dataset's parsed definitions. * @param {boolean} checkForWarnings Whether to check for warnings or only errors. @@ -117,9 +117,9 @@ const validateHedDatasetWithContext = function (hedStrings, contextHedStrings, h } module.exports = { - parseDefinitions: parseDefinitions, - validateDataset: validateDataset, - validateHedEvents: validateHedEvents, - validateHedDataset: validateHedDataset, - validateHedDatasetWithContext: validateHedDatasetWithContext, + parseDefinitions, + validateDataset, + validateHedEvents, + validateHedDataset, + validateHedDatasetWithContext, } diff --git a/validator/event/hed3.js b/validator/event/hed3.js index 85d3470f..df57bb3a 100644 --- a/validator/event/hed3.js +++ b/validator/event/hed3.js @@ -1,5 +1,7 @@ const utils = require('../../utils') -const { ParsedHedGroup, ParsedHedTag } = require('../types/parsedHed') +const { getParsedParentTags } = require('../../utils/hedData') +const ParsedHedGroup = require('../parser/parsedHedGroup') +const { ParsedHedTag } = require('../parser/parsedHedTag') const { HedValidator } = require('./validator') @@ -12,7 +14,7 @@ class Hed3Validator extends HedValidator { * @param {ParsedHedString} parsedString * @param {Schemas} hedSchemas * @param {Map} definitions - * @param {object} options + * @param {Object} options */ constructor(parsedString, hedSchemas, definitions, options) { super(parsedString, hedSchemas, options) @@ -59,9 +61,12 @@ class Hed3Validator extends HedValidator { } _checkForTagAttribute(attribute, fn) { - const tags = this.hedSchemas.baseSchema.entries.definitions.get('tags').getEntriesWithBooleanAttribute(attribute) - for (const tag of tags) { - fn(tag.name) + const schemas = this.hedSchemas.schemas.values() + for (const schema of schemas) { + const tags = schema.entries.definitions.get('tags').getEntriesWithBooleanAttribute(attribute) + for (const tag of tags) { + fn(tag.name) + } } } @@ -94,6 +99,23 @@ class Hed3Validator extends HedValidator { } } + /** + * Check the syntax of tag values. + * + * @param {ParsedHed3Tag} tag A HED tag. + */ + checkValueTagSyntax(tag) { + if (tag.takesValue && !tag.hasUnitClass) { + const isValidValue = this.validateValue( + tag.formattedTagName, + tag.takesValueTag.hasAttributeName('isNumeric'), // Always false + ) + if (!isValidValue) { + this.pushIssue('invalidValue', { tag: tag.originalTag }) + } + } + } + /** * Validate a unit and strip it from the value. * @param {ParsedHed3Tag} tag A HED tag. @@ -102,7 +124,7 @@ class Hed3Validator extends HedValidator { validateUnits(tag) { const originalTagUnitValue = tag.originalTagName const tagUnitClassUnits = tag.validUnits - const validUnits = this.hedSchemas.baseSchema.entries.allUnits + const validUnits = tag.schema.entries.allUnits const unitStrings = Array.from(validUnits.keys()) unitStrings.sort((first, second) => { return second.length - first.length @@ -149,6 +171,9 @@ class Hed3Validator extends HedValidator { /** * Determine if a stripped value is valid. + * + * @param {string} value The stripped value. + * @param {boolean} isNumeric Whether the tag is numeric. */ validateValue(value, isNumeric) { if (value === '#') { @@ -171,9 +196,9 @@ class Hed3Validator extends HedValidator { const definitionShortTag = 'definition' const defExpandShortTag = 'def-expand' const defShortTag = 'def' - const definitionParentTag = this.getParsedParentTag(definitionShortTag) - const defExpandParentTag = this.getParsedParentTag(defExpandShortTag) - const defParentTag = this.getParsedParentTag(defShortTag) + const definitionParentTags = getParsedParentTags(this.hedSchemas, definitionShortTag) + const defExpandParentTags = getParsedParentTags(this.hedSchemas, defExpandShortTag) + const defParentTags = getParsedParentTags(this.hedSchemas, defShortTag) let definitionTagFound = false let defExpandTagFound = false let definitionName @@ -181,11 +206,11 @@ class Hed3Validator extends HedValidator { if (tag instanceof ParsedHedGroup) { continue } - if (tag.isDescendantOf(definitionParentTag)) { + if (tag.isDescendantOf(definitionParentTags.get(tag.schema))) { definitionTagFound = true definitionName = tag.originalTagName break - } else if (tag.isDescendantOf(defExpandParentTag)) { + } else if (tag.isDescendantOf(defExpandParentTags.get(tag.schema))) { defExpandTagFound = true definitionName = tag.originalTagName break @@ -196,7 +221,6 @@ class Hed3Validator extends HedValidator { } let tagGroupValidated = false let tagGroupIssueGenerated = false - const nestedDefinitionParentTags = [definitionParentTag, defExpandParentTag, defParentTag] for (const tag of tagGroup.tags) { if (tag instanceof ParsedHedGroup) { if (tagGroupValidated && !tagGroupIssueGenerated) { @@ -208,6 +232,11 @@ class Hed3Validator extends HedValidator { } tagGroupValidated = true for (const innerTag of tag.tagIterator()) { + const nestedDefinitionParentTags = [ + definitionParentTags.get(innerTag.schema), + defExpandParentTags.get(innerTag.schema), + defParentTags.get(innerTag.schema), + ] if ( nestedDefinitionParentTags.some((parentTag) => { return innerTag.isDescendantOf(parentTag) @@ -219,8 +248,8 @@ class Hed3Validator extends HedValidator { } } } else if ( - (definitionTagFound && !tag.isDescendantOf(definitionParentTag)) || - (defExpandTagFound && !tag.isDescendantOf(defExpandParentTag)) + (definitionTagFound && !tag.isDescendantOf(definitionParentTags.get(tag.schema))) || + (defExpandTagFound && !tag.isDescendantOf(defExpandParentTags.get(tag.schema))) ) { this.pushIssue('illegalDefinitionGroupTag', { tag: tag.originalTag, @@ -237,8 +266,8 @@ class Hed3Validator extends HedValidator { * @param {string} defShortTag The short tag to check for. */ checkForMissingDefinitions(tag, defShortTag = 'Def') { - const defParentTag = this.getParsedParentTag(defShortTag) - if (!tag.isDescendantOf(defParentTag)) { + const defParentTags = getParsedParentTags(this.hedSchemas, defShortTag) + if (!tag.isDescendantOf(defParentTags.get(tag.schema))) { return } const defName = ParsedHedGroup.findDefinitionName(tag.canonicalTag, defShortTag) @@ -247,18 +276,6 @@ class Hed3Validator extends HedValidator { } } - /** - * Get the parent tag object for a given short tag. - * - * @param {string} shortTag A short-form HED 3 tag. - * @return {ParsedHedTag} A parsed HED tag object representing the full tag. - */ - getParsedParentTag(shortTag) { - const parentTag = new ParsedHedTag(shortTag, shortTag, [0, shortTag.length - 1], this.hedSchemas) - this.issues = this.issues.concat(parentTag.conversionIssues) - return parentTag - } - /** * Check for invalid top-level tags. */ @@ -307,5 +324,5 @@ class Hed3Validator extends HedValidator { } module.exports = { - Hed3Validator: Hed3Validator, + Hed3Validator, } diff --git a/validator/event/index.js b/validator/event/index.js index f7d2a335..73ed7328 100644 --- a/validator/event/index.js +++ b/validator/event/index.js @@ -4,10 +4,10 @@ const { HedValidator, Hed2Validator } = require('./validator') const { Hed3Validator } = require('./hed3') module.exports = { - HedValidator: HedValidator, - Hed2Validator: Hed2Validator, - Hed3Validator: Hed3Validator, - validateHedString: validateHedString, - validateHedEvent: validateHedEvent, - validateHedEventWithDefinitions: validateHedEventWithDefinitions, + HedValidator, + Hed2Validator, + Hed3Validator, + validateHedString, + validateHedEvent, + validateHedEventWithDefinitions, } diff --git a/validator/event/init.js b/validator/event/init.js index c488af44..1daa6aed 100644 --- a/validator/event/init.js +++ b/validator/event/init.js @@ -1,6 +1,5 @@ -const { parseHedString } = require('../stringParser') -const { ParsedHedString } = require('../types/parsedHed') -const { buildSchemaAttributesObject } = require('../schema/init') +const { parseHedString } = require('../parser/main') +const ParsedHedString = require('../parser/parsedHedString') const { Schemas } = require('../../common/schema') const { HedValidator, Hed2Validator } = require('./validator') @@ -11,12 +10,12 @@ const { Hed3Validator } = require('./hed3') * * @param {string|ParsedHedString} hedString The HED string to validate. * @param {Schemas} hedSchemas The HED schemas to validate against. - * @param {object} options Any validation options passed in. + * @param {Object} options Any validation options passed in. * @param {Map?} definitions The definitions for this HED dataset. - * @return {[ParsedHedString, Schemas, Issue[], HedValidator]} The parsed HED string, the actual HED schema collection to use, any issues found, and whether to perform semantic validation. + * @return {[ParsedHedString, Issue[], HedValidator]} The parsed HED string, the actual HED schema collection to use, any issues found, and whether to perform semantic validation. */ const initiallyValidateHedString = function (hedString, hedSchemas, options, definitions = null) { - let doSemanticValidation = hedSchemas instanceof Schemas + const doSemanticValidation = hedSchemas instanceof Schemas if (!doSemanticValidation) { hedSchemas = new Schemas(null) } @@ -29,14 +28,10 @@ const initiallyValidateHedString = function (hedString, hedSchemas, options, def ;[parsedString, parsingIssues] = parseHedString(hedString, hedSchemas) } if (parsedString === null) { - return [null, [].concat(Object.values(parsingIssues))] + return [null, [].concat(Object.values(parsingIssues)), null] } else if (parsingIssues.syntax.length + parsingIssues.delimiter.length > 0) { - doSemanticValidation = false hedSchemas = new Schemas(null) } - if (doSemanticValidation && !hedSchemas.baseSchema.attributes) { - hedSchemas.baseSchema.attributes = buildSchemaAttributesObject(hedSchemas.baseSchema.xmlData) - } let hedValidator switch (hedSchemas.generation) { case 0: @@ -132,7 +127,7 @@ const validateHedEventWithDefinitions = function (hedString, hedSchemas, definit } module.exports = { - validateHedString: validateHedString, - validateHedEvent: validateHedEvent, - validateHedEventWithDefinitions: validateHedEventWithDefinitions, + validateHedString, + validateHedEvent, + validateHedEventWithDefinitions, } diff --git a/validator/event/validator.js b/validator/event/validator.js index 0933b1cf..e13220ac 100644 --- a/validator/event/validator.js +++ b/validator/event/validator.js @@ -1,5 +1,6 @@ const utils = require('../../utils') -const { ParsedHedString, ParsedHedTag } = require('../types/parsedHed') +const { ParsedHedTag } = require('../parser/parsedHedTag') +const ParsedHedString = require('../parser/parsedHedString') const { generateIssue } = require('../../common/issues/issues') const { Schemas } = require('../../common/schema') @@ -18,7 +19,7 @@ class HedValidator { * * @param {ParsedHedString} parsedString * @param {Schemas} hedSchemas - * @param {object} options + * @param {Object} options */ constructor(parsedString, hedSchemas, options) { this.parsedString = parsedString @@ -56,7 +57,7 @@ class HedValidator { * Validate the individual HED tags in a parsed HED string object. */ validateIndividualHedTags() { - let previousTag = new ParsedHedTag('', '', [0, 0], this.hedSchemas) + let previousTag = null for (const tag of this.parsedString.tags) { this.validateIndividualHedTag(tag, previousTag) previousTag = tag @@ -85,7 +86,7 @@ class HedValidator { */ validateHedTagLevels() { for (const tagGroup of this.parsedString.tagGroups) { - for (const subGroup of tagGroup.subGroupIterator()) { + for (const subGroup of tagGroup.subGroupArrayIterator()) { this.validateHedTagLevel(subGroup) } } @@ -106,8 +107,10 @@ class HedValidator { * Validate the HED tag groups in a parsed HED string. */ validateHedTagGroups() { - for (const parsedTagGroup of this.parsedString.tagGroups) { - this.validateHedTagGroup(parsedTagGroup) + for (const tagGroup of this.parsedString.tagGroups) { + for (const subGroup of tagGroup.subParsedGroupIterator()) { + this.validateHedTagGroup(subGroup) + } } } @@ -220,18 +223,8 @@ class HedValidator { * * @param {ParsedHedTag} tag A HED tag. */ - checkValueTagSyntax(tag) { - if (tag.takesValue && !tag.hasUnitClass) { - const isValidValue = utils.HED.validateValue( - tag.formattedTagName, - this.hedSchemas.baseSchema.tagHasAttribute(utils.HED.replaceTagNameWithPound(tag.formattedTag), 'isNumeric'), - this.hedSchemas.isHed3, - ) - if (!isValidValue) { - this.pushIssue('invalidValue', { tag: tag.originalTag }) - } - } - } + // eslint-disable-next-line no-unused-vars + checkValueTagSyntax(tag) {} /** * Check if an individual HED tag is in the schema or is an allowed extension. @@ -251,7 +244,7 @@ class HedValidator { tag: tag.originalTag, }) } - } else if (!isExtensionAllowedTag && previousTag.takesValue) { + } else if (!isExtensionAllowedTag && previousTag && previousTag.takesValue) { // This tag isn't an allowed extension, but the previous tag takes a value. // This is likely caused by an extraneous comma. this.pushIssue('extraCommaOrInvalid', { @@ -377,7 +370,7 @@ class HedValidator { * Generate a new issue object and push it to the end of the issues array. * * @param {string} internalCode The internal error code. - * @param {object} parameters The error string parameters. + * @param {Object} parameters The error string parameters. */ pushIssue(internalCode, parameters) { this.issues.push(generateIssue(internalCode, parameters)) @@ -440,10 +433,9 @@ class Hed2Validator extends HedValidator { tagUnitClassUnits, this.hedSchemas.baseSchema.attributes, ) - const validValue = utils.HED.validateValue( + const validValue = this.validateValue( value, - this.hedSchemas.baseSchema.tagHasAttribute(utils.HED.replaceTagNameWithPound(tag.formattedTag), 'isNumeric'), - this.hedSchemas.isHed3, + this.hedSchemas.baseSchema.tagHasAttribute(tag.takesValueFormattedTag, 'isNumeric'), ) if (!foundUnit && this.options.checkForWarnings) { const defaultUnit = tag.defaultUnit @@ -461,8 +453,28 @@ class Hed2Validator extends HedValidator { } } + /** + * Check the syntax of tag values. + * + * @param {ParsedHed2Tag} tag A HED tag. + */ + checkValueTagSyntax(tag) { + if (tag.takesValue && !tag.hasUnitClass) { + const isValidValue = this.validateValue( + tag.formattedTagName, + this.hedSchemas.baseSchema.tagHasAttribute(tag.takesValueFormattedTag, 'isNumeric'), + ) + if (!isValidValue) { + this.pushIssue('invalidValue', { tag: tag.originalTag }) + } + } + } + /** * Determine if a stripped value is valid. + * + * @param {string} value The stripped value. + * @param {boolean} isNumeric Whether the tag is numeric. */ validateValue(value, isNumeric) { if (value === '#') { @@ -477,6 +489,6 @@ class Hed2Validator extends HedValidator { } module.exports = { - HedValidator: HedValidator, - Hed2Validator: Hed2Validator, + HedValidator, + Hed2Validator, } diff --git a/validator/index.js b/validator/index.js index a4fb1eb5..8df8b06b 100644 --- a/validator/index.js +++ b/validator/index.js @@ -1,15 +1,17 @@ -const BIDS = require('./bids') -const dataset = require('./dataset') -const event = require('./event') -const schema = require('./schema/init') +const { BidsDataset, BidsEventFile, BidsJsonFile, BidsSidecar, validateBidsDataset } = require('./bids') +const { validateHedDataset } = require('./dataset') +const { validateHedEvent, validateHedString } = require('./event') +const { buildSchema, buildSchemas } = require('./schema/init') module.exports = { - BidsDataset: BIDS.BidsDataset, - BidsEventFile: BIDS.BidsEventFile, - BidsSidecar: BIDS.BidsSidecar, - buildSchema: schema.buildSchema, - validateBidsDataset: BIDS.validateBidsDataset, - validateHedDataset: dataset.validateHedDataset, - validateHedEvent: event.validateHedEvent, - validateHedString: event.validateHedString, + BidsDataset, + BidsEventFile, + BidsJsonFile, + BidsSidecar, + buildSchema, + buildSchemas, + validateBidsDataset, + validateHedDataset, + validateHedEvent, + validateHedString, } diff --git a/validator/parser/main.js b/validator/parser/main.js new file mode 100644 index 00000000..13647b30 --- /dev/null +++ b/validator/parser/main.js @@ -0,0 +1,191 @@ +const utils = require('../../utils') +const { mergeParsingIssues } = require('../../utils/hedData') +const { generateIssue } = require('../../common/issues/issues') + +const ParsedHedString = require('./parsedHedString') + +const splitHedString = require('./splitHedString') + +const openingGroupCharacter = '(' +const closingGroupCharacter = ')' +const delimiters = new Set([',']) + +/** + * Substitute certain illegal characters and report warnings when found. + */ +const substituteCharacters = function (hedString) { + const issues = [] + const illegalCharacterMap = { '\0': ['ASCII NUL', ' '] } + const flaggedCharacters = /[^\w\d./$ :-]/g + const replaceFunction = function (match, offset) { + if (match in illegalCharacterMap) { + const [name, replacement] = illegalCharacterMap[match] + issues.push( + generateIssue('invalidCharacter', { + character: name, + index: offset, + string: hedString, + }), + ) + return replacement + } else { + return match + } + } + const fixedString = hedString.replace(flaggedCharacters, replaceFunction) + + return [fixedString, issues] +} + +/** + * Check if group parentheses match. Pushes an issue if they don't match. + */ +const countTagGroupParentheses = function (hedString) { + const issues = [] + const numberOfOpeningParentheses = utils.string.getCharacterCount(hedString, openingGroupCharacter) + const numberOfClosingParentheses = utils.string.getCharacterCount(hedString, closingGroupCharacter) + if (numberOfOpeningParentheses !== numberOfClosingParentheses) { + issues.push( + generateIssue('parentheses', { + opening: numberOfOpeningParentheses, + closing: numberOfClosingParentheses, + }), + ) + } + return issues +} + +/** + * Check if a comma is missing after an opening parenthesis. + */ +const isCommaMissingAfterClosingParenthesis = function (lastNonEmptyCharacter, currentCharacter) { + return ( + lastNonEmptyCharacter === closingGroupCharacter && + !(delimiters.has(currentCharacter) || currentCharacter === closingGroupCharacter) + ) +} + +/** + * Check for delimiter issues in a HED string (e.g. missing commas adjacent to groups, extra commas or tildes). + */ +const findDelimiterIssuesInHedString = function (hedString) { + const issues = [] + let lastNonEmptyValidCharacter = '' + let lastNonEmptyValidIndex = 0 + let currentTag = '' + for (let i = 0; i < hedString.length; i++) { + const currentCharacter = hedString.charAt(i) + currentTag += currentCharacter + if (utils.string.stringIsEmpty(currentCharacter)) { + continue + } + if (delimiters.has(currentCharacter)) { + if (currentTag.trim() === currentCharacter) { + issues.push( + generateIssue('extraDelimiter', { + character: currentCharacter, + index: i, + string: hedString, + }), + ) + currentTag = '' + continue + } + currentTag = '' + } else if (currentCharacter === openingGroupCharacter) { + if (currentTag.trim() === openingGroupCharacter) { + currentTag = '' + } else { + issues.push(generateIssue('invalidTag', { tag: currentTag })) + } + } else if (isCommaMissingAfterClosingParenthesis(lastNonEmptyValidCharacter, currentCharacter)) { + issues.push( + generateIssue('commaMissing', { + tag: currentTag.slice(0, -1), + }), + ) + break + } + lastNonEmptyValidCharacter = currentCharacter + lastNonEmptyValidIndex = i + } + if (delimiters.has(lastNonEmptyValidCharacter)) { + issues.push( + generateIssue('extraDelimiter', { + character: lastNonEmptyValidCharacter, + index: lastNonEmptyValidIndex, + string: hedString, + }), + ) + } + return issues +} + +/** + * Validate the full unparsed HED string. + * + * @param {string} hedString The unparsed HED string. + * @return {Object} String substitution issues and other issues. + */ +const validateFullUnparsedHedString = function (hedString) { + const [fixedHedString, substitutionIssues] = substituteCharacters(hedString) + const delimiterIssues = [].concat( + countTagGroupParentheses(fixedHedString), + findDelimiterIssuesInHedString(fixedHedString), + ) + + return { + substitution: substitutionIssues, + delimiter: delimiterIssues, + } +} + +/** + * Parse a full HED string into an object of tag types. + * + * @param {string} hedString The full HED string to parse. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @returns {[ParsedHedString|null, Object]} The parsed HED tag data and an object containing lists of parsing issues. + */ +const parseHedString = function (hedString, hedSchemas) { + const fullStringIssues = validateFullUnparsedHedString(hedString) + if (fullStringIssues.delimiter.length > 0) { + fullStringIssues.syntax = [] + return [null, fullStringIssues] + } + const [parsedTags, splitIssues] = splitHedString(hedString, hedSchemas) + const parsingIssues = Object.assign(fullStringIssues, splitIssues) + if (parsedTags === null) { + return [null, parsingIssues] + } + const parsedString = new ParsedHedString(hedString, parsedTags) + return [parsedString, parsingIssues] +} + +/** + * Parse a set of HED strings. + * + * @param {string[]} hedStrings A set of HED strings. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @return {[ParsedHedString[], Object]} The parsed HED strings and any issues found. + */ +const parseHedStrings = function (hedStrings, hedSchemas) { + return hedStrings + .map((hedString) => { + return parseHedString(hedString, hedSchemas) + }) + .reduce( + ([previousStrings, previousIssues], [currentString, currentIssues]) => { + previousStrings.push(currentString) + mergeParsingIssues(previousIssues, currentIssues) + return [previousStrings, previousIssues] + }, + [[], {}], + ) +} + +module.exports = { + splitHedString, + parseHedString, + parseHedStrings, +} diff --git a/validator/parser/parsedHedGroup.js b/validator/parser/parsedHedGroup.js new file mode 100644 index 00000000..b7c91fdb --- /dev/null +++ b/validator/parser/parsedHedGroup.js @@ -0,0 +1,195 @@ +const differenceWith = require('lodash/differenceWith') + +const { getParsedParentTags } = require('../../utils/hedData') +const { getTagName } = require('../../utils/hedStrings') +const ParsedHedSubstring = require('./parsedHedSubstring') +const { ParsedHedTag } = require('./parsedHedTag') + +/** + * Determine a parsed HED tag group's Definition tags. + * + * @param {ParsedHedGroup} group The parsed HED tag group. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @return {null|ParsedHedTag[]|ParsedHedTag} The Definition tag(s) + */ +const groupDefinitionTag = function (group, hedSchemas) { + if (!hedSchemas.isHed3) { + return ['', null] + } + const definitionShortTag = 'Definition' + const parsedDefinitionTags = getParsedParentTags(hedSchemas, definitionShortTag) + const definitionTags = group.tags.filter((tag) => { + if (!(tag instanceof ParsedHedTag)) { + return false + } + const parsedDefinitionTag = parsedDefinitionTags.get(tag.schema) + return tag.isDescendantOf(parsedDefinitionTag) + }) + switch (definitionTags.length) { + case 0: + return ['', null] + case 1: + return [definitionShortTag, definitionTags[0]] + default: + return [definitionShortTag, definitionTags] + } +} + +/** + * A parsed HED tag group. + */ +class ParsedHedGroup extends ParsedHedSubstring { + /** + * Constructor. + * @param {(ParsedHedTag|ParsedHedGroup)[]} parsedHedTags The parsed HED tags in the HED tag group. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @param {string} hedString The original HED string. + * @param {number[]} originalBounds The bounds of the HED tag in the original HED string. + */ + constructor(parsedHedTags, hedSchemas, hedString, originalBounds) { + const originalTag = hedString.substring(...originalBounds) + super(originalTag, originalBounds) + /** + * The parsed HED tags in the HED tag group. + * @type {(ParsedHedTag|ParsedHedGroup)[]} + */ + this.tags = parsedHedTags + const [definitionBase, definitionTag] = groupDefinitionTag(this, hedSchemas) + this.definitionBase = definitionBase + /** + * The Definition tag associated with this HED tag group. + * @type {ParsedHedTag|ParsedHedTag[]|null} + */ + this.definitionTag = definitionTag + /** + * Whether this HED tag group is a definition group. + * @type {boolean} + */ + this.isDefinitionGroup = definitionTag !== null + } + + /** + * Determine the name of this group's definition. + * @return {string|null} + */ + get definitionName() { + return this._memoize('definitionName', () => { + if (!this.isDefinitionGroup) { + return null + } + return ParsedHedGroup.findDefinitionName(this.definitionTag.canonicalTag, this.definitionBase) + }) + } + + /** + * Determine the name of this group's definition. + */ + static findDefinitionName(canonicalTag, definitionBase) { + const tag = canonicalTag + let value = getTagName(tag) + let previousValue + for (const level of ParsedHedTag.ancestorIterator(tag)) { + if (value.toLowerCase() === definitionBase.toLowerCase()) { + return previousValue + } + previousValue = value + value = getTagName(level) + } + throw Error( + `Completed iteration through ${definitionBase.toLowerCase()} tag without finding ${definitionBase} level.`, + ) + } + + /** + * Determine the value of this group's definition. + * @return {ParsedHedGroup|null} + */ + get definitionGroup() { + return this._memoize('definitionGroup', () => { + if (!this.isDefinitionGroup) { + return null + } + for (const subgroup of this.tags) { + if (subgroup instanceof ParsedHedGroup) { + return subgroup + } + } + throw new Error('Definition group is missing a first-level subgroup.') + }) + } + + equivalent(other) { + if (!(other instanceof ParsedHedGroup)) { + return false + } + return ( + differenceWith(this.tags, other.tags, (ours, theirs) => { + return ours.equivalent(theirs) + }).length === 0 + ) + } + + /** + * The deeply nested array of parsed tags. + * @return {ParsedHedTag[]} + */ + nestedGroups() { + const currentGroup = [] + for (const innerTag of this.tags) { + if (innerTag instanceof ParsedHedTag) { + currentGroup.push(innerTag) + } else if (innerTag instanceof ParsedHedGroup) { + currentGroup.push(innerTag.nestedGroups()) + } + } + return currentGroup + } + + /** + * Iterator over the full HED groups and subgroups in this HED tag group. + * + * @yield {ParsedHedTag[]} The subgroups of this tag group. + */ + *subGroupArrayIterator() { + const currentGroup = [] + for (const innerTag of this.tags) { + if (innerTag instanceof ParsedHedTag) { + currentGroup.push(innerTag) + } else if (innerTag instanceof ParsedHedGroup) { + yield* innerTag.subGroupArrayIterator() + } + } + yield currentGroup + } + + /** + * Iterator over the ParsedHedGroup objects in this HED tag group. + * + * @yield {ParsedHedGroup} This object and the ParsedHedGroup objects belonging to this tag group. + */ + *subParsedGroupIterator() { + yield this + for (const innerTag of this.tags) { + if (innerTag instanceof ParsedHedGroup) { + yield* innerTag.subParsedGroupIterator() + } + } + } + + /** + * Iterator over the parsed HED tags in this HED tag group. + * + * @yield {ParsedHedTag} This tag group's HED tags. + */ + *tagIterator() { + for (const innerTag of this.tags) { + if (innerTag instanceof ParsedHedTag) { + yield innerTag + } else if (innerTag instanceof ParsedHedGroup) { + yield* innerTag.tagIterator() + } + } + } +} + +module.exports = ParsedHedGroup diff --git a/validator/parser/parsedHedString.js b/validator/parser/parsedHedString.js new file mode 100644 index 00000000..d35a38cf --- /dev/null +++ b/validator/parser/parsedHedString.js @@ -0,0 +1,60 @@ +const { ParsedHedTag } = require('./parsedHedTag') +const ParsedHedGroup = require('./parsedHedGroup') + +/** + * A parsed HED string. + */ +class ParsedHedString { + /** + * Constructor. + * @param {string} hedString The original HED string. + * @param {ParsedHedSubstring[]} parsedTags The nested list of parsed HED tags and groups. + */ + constructor(hedString, parsedTags) { + /** + * The original HED string. + * @type {string} + */ + this.hedString = hedString + /** + * The tag groups in the string. + * @type ParsedHedGroup[] + */ + this.tagGroups = parsedTags.filter((tagOrGroup) => tagOrGroup instanceof ParsedHedGroup) + /** + * All of the top-level tags in the string. + * @type ParsedHedTag[] + */ + this.topLevelTags = parsedTags.filter((tagOrGroup) => tagOrGroup instanceof ParsedHedTag) + + const subgroupTags = this.tagGroups.flatMap((tagGroup) => Array.from(tagGroup.tagIterator())) + /** + * All of the tags in the string. + * @type ParsedHedTag[] + */ + this.tags = this.topLevelTags.concat(subgroupTags) + + /** + * The top-level tag groups in the string, split into arrays. + * @type ParsedHedTag[][] + */ + this.topLevelTagGroups = this.tagGroups.map((tagGroup) => + tagGroup.tags.filter((tagOrGroup) => tagOrGroup instanceof ParsedHedTag), + ) + /** + * The definition tag groups in the string. + * @type ParsedHedGroup[] + */ + this.definitionGroups = this.tagGroups.filter((group) => { + return group.isDefinitionGroup + }) + } + + get definitions() { + return this.definitionGroups.map((group) => { + return [group.definitionName, group] + }) + } +} + +module.exports = ParsedHedString diff --git a/validator/parser/parsedHedSubstring.js b/validator/parser/parsedHedSubstring.js new file mode 100644 index 00000000..b67f558d --- /dev/null +++ b/validator/parser/parsedHedSubstring.js @@ -0,0 +1,27 @@ +const { Memoizer } = require('../../utils/types') + +/** + * A parsed HED substring. + */ +class ParsedHedSubstring extends Memoizer { + /** + * Constructor. + * @param {string} originalTag The original HED tag. + * @param {number[]} originalBounds The bounds of the HED tag in the original HED string. + */ + constructor(originalTag, originalBounds) { + super() + /** + * The original pre-parsed version of the HED tag. + * @type {string} + */ + this.originalTag = originalTag + /** + * The bounds of the HED tag in the original HED string. + * @type {int[]} + */ + this.originalBounds = originalBounds + } +} + +module.exports = ParsedHedSubstring diff --git a/validator/types/parsedHed.js b/validator/parser/parsedHedTag.js similarity index 51% rename from validator/types/parsedHed.js rename to validator/parser/parsedHedTag.js index 4401b597..3f060b0b 100644 --- a/validator/types/parsedHed.js +++ b/validator/parser/parsedHedTag.js @@ -1,82 +1,92 @@ -const differenceWith = require('lodash/differenceWith') - -const { Memoizer } = require('../../utils/types') - -const { getTagSlashIndices, replaceTagNameWithPound, getTagName } = require('../../utils/hed') +const { generateIssue } = require('../../common/issues/issues') const { convertPartialHedStringToLong } = require('../../converter/converter') +const { getTagSlashIndices, replaceTagNameWithPound } = require('../../utils/hedStrings') +const ParsedHedSubstring = require('./parsedHedSubstring') /** - * A parsed HED substring. + * A parsed HED tag. */ -class ParsedHedSubstring extends Memoizer { +class ParsedHedTag extends ParsedHedSubstring { /** * Constructor. - * @param {string} originalTag The original pre-parsed version of the HED substring. - * @param {int[]} originalBounds The bounds of the HED substring in the original HED string. + * @param {string} originalTag The original HED tag. + * @param {string} hedString The original HED string. + * @param {number[]} originalBounds The bounds of the HED tag in the original HED string. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @param {string} schemaName The label of this tag's schema in the dataset's schema spec. */ - constructor(originalTag, originalBounds) { - super() + constructor(originalTag, hedString, originalBounds, hedSchemas, schemaName = '') { + super(originalTag, originalBounds) + + this.convertTag(hedString, hedSchemas, schemaName) /** - * The original pre-parsed version of the HED tag. + * The formatted canonical version of the HED tag. * @type {string} */ - this.originalTag = originalTag - /** - * The bounds of the HED tag in the original HED string. - * @type {int[]} - */ - this.originalBounds = originalBounds + this.formattedTag = this.formatTag() } -} -/** - * A parsed HED tag. - */ -class ParsedHedTag extends ParsedHedSubstring { /** - * Constructor. - * @param {string} originalTag The original HED tag. + * Convert this tag to long form. + * * @param {string} hedString The original HED string. - * @param {int[]} originalBounds The bounds of the HED tag in the original HED string. * @param {Schemas} hedSchemas The collection of HED schemas. + * @param {string} schemaName The label of this tag's schema in the dataset's schema spec. */ - constructor(originalTag, hedString, originalBounds, hedSchemas) { - super(originalTag, originalBounds) - let canonicalTag, conversionIssues - if (hedSchemas.baseSchema) { - ;[canonicalTag, conversionIssues] = convertPartialHedStringToLong( - hedSchemas, - originalTag, - hedString, - originalBounds[0], - ) - } else { - canonicalTag = originalTag - conversionIssues = [] + convertTag(hedString, hedSchemas, schemaName) { + if (hedSchemas.isSyntaxOnly) { + /** + * The canonical form of the HED tag. + * @type {string} + */ + this.canonicalTag = this.originalTag + /** + * Any issues encountered during tag conversion. + * @type {Issue[]} + */ + this.conversionIssues = [] + + return } + /** - * The canonical form of the HED tag. - * @type {string} + * The HED schema this tag belongs to. + * @type {Schema} */ + this.schema = hedSchemas.getSchema(schemaName) + if (this.schema === undefined) { + if (schemaName !== '') { + this.conversionIssues = [ + generateIssue('unmatchedLibrarySchema', { + tag: this.originalTag, + library: schemaName, + }), + ] + } else { + this.conversionIssues = [ + generateIssue('unmatchedBaseSchema', { + tag: this.originalTag, + }), + ] + } + this.canonicalTag = this.originalTag + return + } + + const [canonicalTag, conversionIssues] = convertPartialHedStringToLong( + this.schema, + this.originalTag, + hedString, + this.originalBounds[0], + ) this.canonicalTag = canonicalTag - /** - * Any issues encountered during tag conversion. - * @type {Array} - */ this.conversionIssues = conversionIssues - // TODO: Implement - this.schema = hedSchemas.baseSchema - /** - * The formatted canonical version of the HED tag. - * @type {string} - */ - this.formattedTag = this.format() } /** * Format this HED tag by removing newlines, double quotes, and slashes. */ - format() { + formatTag() { this.originalTag = this.originalTag.replace('\n', ' ') let hedTagString = this.canonicalTag.trim() if (hedTagString.startsWith('"')) { @@ -206,7 +216,7 @@ class ParsedHedTag extends ParsedHedSubstring { } equivalent(other) { - return other instanceof ParsedHedTag && this.formattedTag === other.formattedTag + return other instanceof ParsedHedTag && this.formattedTag === other.formattedTag && this.schema === other.schema } } @@ -220,14 +230,21 @@ class ParsedHed2Tag extends ParsedHedTag { }) } + /** + * Determine value-taking form of this tag. + */ + get takesValueFormattedTag() { + return this._memoize('takesValueFormattedTag', () => { + return replaceTagNameWithPound(this.formattedTag) + }) + } + /** * Checks if this HED tag has the 'takesValue' attribute. */ get takesValue() { return this._memoize('takesValue', () => { - const takesValueType = 'takesValue' - const takesValueTag = replaceTagNameWithPound(this.formattedTag) - return this.schema.tagHasAttribute(takesValueTag, takesValueType) + return this.schema.tagHasAttribute(this.takesValueFormattedTag, 'takesValue') }) } @@ -239,8 +256,7 @@ class ParsedHed2Tag extends ParsedHedTag { if (!this.schema.attributes.hasUnitClasses) { return false } - const takesValueTag = replaceTagNameWithPound(this.formattedTag) - return takesValueTag in this.schema.attributes.tagUnitClasses + return this.takesValueFormattedTag in this.schema.attributes.tagUnitClasses }) } @@ -250,8 +266,7 @@ class ParsedHed2Tag extends ParsedHedTag { get unitClasses() { return this._memoize('unitClasses', () => { if (this.hasUnitClass) { - const unitClassTag = replaceTagNameWithPound(this.formattedTag) - return this.schema.attributes.tagUnitClasses[unitClassTag] + return this.schema.attributes.tagUnitClasses[this.takesValueFormattedTag] } else { return [] } @@ -268,16 +283,16 @@ class ParsedHed2Tag extends ParsedHedTag { if (!this.hasUnitClass) { return '' } - const unitClassTag = replaceTagNameWithPound(this.formattedTag) - let hasDefaultAttribute = this.schema.tagHasAttribute(unitClassTag, defaultUnitForTagAttribute) + const takesValueTag = this.takesValueFormattedTag + let hasDefaultAttribute = this.schema.tagHasAttribute(takesValueTag, defaultUnitForTagAttribute) if (hasDefaultAttribute) { - return this.schema.attributes.tagAttributes[defaultUnitForTagAttribute][unitClassTag] + return this.schema.attributes.tagAttributes[defaultUnitForTagAttribute][takesValueTag] } - hasDefaultAttribute = this.schema.tagHasAttribute(unitClassTag, defaultUnitsForUnitClassAttribute) + hasDefaultAttribute = this.schema.tagHasAttribute(takesValueTag, defaultUnitsForUnitClassAttribute) if (hasDefaultAttribute) { - return this.schema.attributes.tagAttributes[defaultUnitsForUnitClassAttribute][unitClassTag] + return this.schema.attributes.tagAttributes[defaultUnitsForUnitClassAttribute][takesValueTag] } - const unitClasses = this.schema.attributes.tagUnitClasses[unitClassTag] + const unitClasses = this.schema.attributes.tagUnitClasses[takesValueTag] const firstUnitClass = unitClasses[0] return this.schema.attributes.unitClassAttributes[firstUnitClass][defaultUnitsForUnitClassAttribute][0] }) @@ -311,18 +326,27 @@ class ParsedHed3Tag extends ParsedHedTag { } /** - * Checks if this HED tag has the 'takesValue' attribute. + * Determine value-taking form of this tag. */ - get takesValue() { - return this._memoize('takesValue', () => { + get takesValueFormattedTag() { + return this._memoize('takesValueFormattedTag', () => { const takesValueType = 'takesValue' for (const ancestor of ParsedHedTag.ancestorIterator(this.formattedTag)) { const takesValueTag = replaceTagNameWithPound(ancestor) if (this.schema.tagHasAttribute(takesValueTag, takesValueType)) { - return true + return takesValueTag } } - return false + return null + }) + } + + /** + * Checks if this HED tag has the 'takesValue' attribute. + */ + get takesValue() { + return this._memoize('takesValue', () => { + return this.takesValueFormattedTag !== null }) } @@ -334,7 +358,7 @@ class ParsedHed3Tag extends ParsedHedTag { if (!this.schema.entries.definitions.has('unitClasses')) { return false } - if (this.takesValueTag === undefined) { + if (this.takesValueTag === null) { return false } return this.takesValueTag.hasUnitClasses @@ -396,243 +420,18 @@ class ParsedHed3Tag extends ParsedHedTag { * @return {SchemaTag} */ get takesValueTag() { - const unitClassTag = replaceTagNameWithPound(this.formattedTag) - return this.schema.entries.definitions.get('tags').getEntry(unitClassTag) - } -} - -/** - * Determine a parsed HED tag group's Definition tags. - * - * @param {ParsedHedGroup} group The parsed HED tag group. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @return {null|ParsedHedTag[]|ParsedHedTag} The Definition tag(s) - */ -const groupDefinitionTag = function (group, hedSchemas) { - if (!hedSchemas.isHed3) { - return ['', null] - } - const definitionShortTag = 'Definition' - const definitionTag = new ParsedHedTag( - definitionShortTag, - definitionShortTag, - [0, definitionShortTag.length - 1], - hedSchemas, - ) - const definitionTags = group.tags.filter((tag) => { - return ( - hedSchemas.baseSchema && hedSchemas.isHed3 && tag instanceof ParsedHedTag && tag.isDescendantOf(definitionTag) - ) - }) - switch (definitionTags.length) { - case 0: - return ['', null] - case 1: - return [definitionShortTag, definitionTags[0]] - default: - return [definitionShortTag, definitionTags] - } -} - -/** - * A parsed HED tag group. - */ -class ParsedHedGroup extends ParsedHedSubstring { - /** - * Constructor. - * @param {(ParsedHedTag|ParsedHedGroup)[]} parsedHedTags The parsed HED tags in the HED tag group. - * @param {string} originalTagGroup The original pre-parsed version of the HED tag group. - * @param {int[]} originalBounds The bounds of the HED tag group in the original HED string. - * @param {Schemas} hedSchemas The collection of HED schemas. - */ - constructor(originalTagGroup, parsedHedTags, originalBounds, hedSchemas) { - super(originalTagGroup, originalBounds) - /** - * The parsed HED tags in the HED tag group. - * @type {(ParsedHedTag|ParsedHedGroup)[]} - */ - this.tags = parsedHedTags - const [definitionBase, definitionTag] = groupDefinitionTag(this, hedSchemas) - this.definitionBase = definitionBase - /** - * The Definition tag associated with this HED tag group. - * @type {ParsedHedTag|ParsedHedTag[]|null} - */ - this.definitionTag = definitionTag - /** - * Whether this HED tag group is a definition group. - * @type {boolean} - */ - this.isDefinitionGroup = definitionTag !== null - } - - /** - * Determine the name of this group's definition. - * @return {string|null} - */ - get definitionName() { - return this._memoize('definitionName', () => { - if (!this.isDefinitionGroup) { - return null - } - return ParsedHedGroup.findDefinitionName(this.definitionTag.canonicalTag, this.definitionBase) - }) - } - - /** - * Determine the name of this group's definition. - */ - static findDefinitionName(canonicalTag, definitionBase) { - let tag = canonicalTag - let value = getTagName(tag) - let previousValue - for (const level of ParsedHedTag.ancestorIterator(tag)) { - if (value.toLowerCase() === definitionBase.toLowerCase()) { - return previousValue - } - previousValue = value - value = getTagName(level) - } - throw Error( - `Completed iteration through ${definitionBase.toLowerCase()} tag without finding ${definitionBase} level.`, - ) - } - - /** - * Determine the value of this group's definition. - * @return {ParsedHedGroup|null} - */ - get definitionGroup() { - return this._memoize('definitionGroup', () => { - if (!this.isDefinitionGroup) { + return this._memoize('takesValueTag', () => { + if (this.takesValueFormattedTag !== null) { + return this.schema.entries.definitions.get('tags').getEntry(this.takesValueFormattedTag) + } else { return null } - for (const subgroup of this.tags) { - if (subgroup instanceof ParsedHedGroup) { - return subgroup - } - } - throw new Error('Definition group is missing a first-level subgroup.') - }) - } - - equivalent(other) { - if (!(other instanceof ParsedHedGroup)) { - return false - } - return ( - differenceWith(this.tags, other.tags, (ours, theirs) => { - return ours.equivalent(theirs) - }).length === 0 - ) - } - - /** - * The deeply nested array of parsed tags. - * @return {ParsedHedTag[]} - */ - nestedGroups() { - const currentGroup = [] - for (const innerTag of this.tags) { - if (innerTag instanceof ParsedHedTag) { - currentGroup.push(innerTag) - } else if (innerTag instanceof ParsedHedGroup) { - currentGroup.push(innerTag.nestedGroups()) - } - } - return currentGroup - } - - /** - * Iterator over the full HED groups and subgroups in this HED tag group. - * - * @yield {ParsedHedTag[]} The subgroups of this tag group. - */ - *subGroupIterator() { - const currentGroup = [] - for (const innerTag of this.tags) { - if (innerTag instanceof ParsedHedTag) { - currentGroup.push(innerTag) - } else if (innerTag instanceof ParsedHedGroup) { - yield* innerTag.subGroupIterator() - } - } - yield currentGroup - } - - /** - * Iterator over the parsed HED tags in this HED tag group. - * - * @yield {ParsedHedTag} This tag group's HED tags. - */ - *tagIterator() { - for (const innerTag of this.tags) { - if (innerTag instanceof ParsedHedTag) { - yield innerTag - } else if (innerTag instanceof ParsedHedGroup) { - yield* innerTag.tagIterator() - } - } - } -} - -/** - * A parsed HED string. - */ -class ParsedHedString { - /** - * Constructor. - * @param {string} hedString The original HED string. - */ - constructor(hedString) { - /** - * The original HED string. - * @type {string} - */ - this.hedString = hedString - /** - * All of the tags in the string. - * @type ParsedHedTag[] - */ - this.tags = [] - /** - * The tag groups in the string. - * @type ParsedHedGroup[] - */ - this.tagGroups = [] - /** - * The tag groups, kept in their original parenthesized form. - * @type ParsedHedTag[] - */ - this.tagGroupStrings = [] - /** - * All of the top-level tags in the string. - * @type ParsedHedTag[] - */ - this.topLevelTags = [] - /** - * The top-level tag groups in the string, split into arrays. - * @type ParsedHedTag[][] - */ - this.topLevelTagGroups = [] - /** - * The definition tag groups in the string. - * @type ParsedHedGroup[] - */ - this.definitionGroups = [] - } - - get definitions() { - return this.definitionGroups.map((group) => { - return [group.definitionName, group] }) } } module.exports = { - ParsedHedTag: ParsedHedTag, - ParsedHed2Tag: ParsedHed2Tag, - ParsedHed3Tag: ParsedHed3Tag, - ParsedHedGroup: ParsedHedGroup, - ParsedHedString: ParsedHedString, + ParsedHedTag, + ParsedHed2Tag, + ParsedHed3Tag, } diff --git a/validator/parser/splitHedString.js b/validator/parser/splitHedString.js new file mode 100644 index 00000000..ed138b81 --- /dev/null +++ b/validator/parser/splitHedString.js @@ -0,0 +1,277 @@ +const flattenDeep = require('lodash/flattenDeep') + +const { ParsedHedTag, ParsedHed2Tag, ParsedHed3Tag } = require('./parsedHedTag') +const ParsedHedGroup = require('./parsedHedGroup') +const { Schema, Schemas } = require('../../common/schema/types') +const { generateIssue } = require('../../common/issues/issues') +const { recursiveMap } = require('../../utils/array') +const { replaceTagNameWithPound } = require('../../utils/hedStrings') +const { mergeParsingIssues } = require('../../utils/hedData') +const { stringIsEmpty } = require('../../utils/string') + +const openingGroupCharacter = '(' +const closingGroupCharacter = ')' +const commaCharacter = ',' +const colonCharacter = ':' +const slashCharacter = '/' +const invalidCharacters = new Set(['{', '}', '[', ']', '~', '"']) +const invalidCharactersOutsideOfValues = new Set([':']) + +const generationToClass = [ + ParsedHedTag, + ParsedHedTag, // Generation 1 is not supported by this validator. + ParsedHed2Tag, + ParsedHed3Tag, +] + +class TagSpec { + constructor(tag, start, end, librarySchema) { + this.tag = tag.trim() + this.bounds = [start, end] + /** + * @type {string} + */ + this.library = librarySchema + } +} + +class GroupSpec { + constructor(start, finish) { + this.start = start + this.finish = finish + /** + * @type {GroupSpec[]} + */ + this.children = [] + } + + get bounds() { + return [this.start, this.finish] + } +} + +/** + * Split a HED string into delimiters and tags. + * + * @param {string} hedString The HED string to be split. + * @return {[TagSpec[], GroupSpec, Object]} The tag specifications, group bounds, and any issues found. + */ +const tokenizeHedString = function (hedString) { + const syntaxIssues = [] + + let currentTag = '' + let groupDepth = 0 + let startingIndex = 0 + let resetStartingIndex = false + let slashFound = false + let librarySchema = '' + const currentGroupStack = [[]] + const parenthesesStack = [new GroupSpec(0, hedString.length)] + + const pushTag = (i) => { + if (!stringIsEmpty(currentTag)) { + currentGroupStack[groupDepth].push(new TagSpec(currentTag, startingIndex, i, librarySchema)) + } + resetStartingIndex = true + slashFound = false + librarySchema = '' + } + + const closeGroup = (i) => { + const bounds = parenthesesStack.pop() + bounds.finish = i + 1 + parenthesesStack[groupDepth - 1].children.push(bounds) + currentGroupStack[groupDepth - 1].push(currentGroupStack.pop()) + groupDepth-- + } + + for (let i = 0; i < hedString.length; i++) { + const character = hedString.charAt(i) + switch (character) { + case openingGroupCharacter: + currentGroupStack.push([]) + parenthesesStack.push(new GroupSpec(i)) + resetStartingIndex = true + groupDepth++ + break + case closingGroupCharacter: { + pushTag(i) + if (groupDepth <= 0) { + syntaxIssues.push( + generateIssue('unopenedParenthesis', { + index: i, + string: hedString, + }), + ) + break + } + closeGroup(i) + break + } + case commaCharacter: + pushTag(i) + break + case colonCharacter: + if (!slashFound && !librarySchema) { + librarySchema = currentTag + resetStartingIndex = true + } else { + currentTag += character + } + break + case slashCharacter: + slashFound = true + currentTag += character + break + default: + currentTag += character + resetStartingIndex = stringIsEmpty(currentTag) + } + if (resetStartingIndex) { + resetStartingIndex = false + startingIndex = i + 1 + currentTag = '' + } + } + pushTag(hedString.length) + + // groupDepth is decremented in closeGroup. + // eslint-disable-next-line no-unmodified-loop-condition + while (groupDepth > 0) { + syntaxIssues.push( + generateIssue('unclosedParenthesis', { + index: parenthesesStack[parenthesesStack.length - 1].start, + string: hedString, + }), + ) + closeGroup(hedString.length) + } + + const tagSpecs = currentGroupStack.pop() + const groupSpecs = parenthesesStack.pop() + const issues = { + syntax: syntaxIssues, + conversion: [], + } + return [tagSpecs, groupSpecs, issues] +} + +/** + * Check the split HED tags for invalid characters + * + * @param {string} hedString The HED string to be split. + * @param {TagSpec[]} tagSpecs The tag specifications. + * @return {Object} Any issues found. + */ +const checkForInvalidCharacters = function (hedString, tagSpecs) { + const syntaxIssues = [] + const flatTagSpecs = flattenDeep(tagSpecs) + + for (const tagSpec of flatTagSpecs) { + const alwaysInvalidIssues = checkTagForInvalidCharacters(hedString, tagSpec, tagSpec.tag, invalidCharacters) + const valueTag = replaceTagNameWithPound(tagSpec.tag) + const outsideValueIssues = checkTagForInvalidCharacters( + hedString, + tagSpec, + valueTag, + invalidCharactersOutsideOfValues, + ) + syntaxIssues.push(...alwaysInvalidIssues, ...outsideValueIssues) + } + + return { syntax: syntaxIssues, conversion: [] } +} + +/** + * Check an individual tag for invalid characters. + * + * @param {string} hedString The HED string to be split. + * @param {TagSpec} tagSpec A tag specification. + * @param {string} tag The tag form to be checked. + * @param {Set} invalidSet The set of invalid characters. + * @returns {Issue[]} Any issues found. + */ +const checkTagForInvalidCharacters = function (hedString, tagSpec, tag, invalidSet) { + const issues = [] + for (let i = 0; i < tag.length; i++) { + const character = tag.charAt(i) + if (invalidSet.has(character)) { + tagSpec.invalidCharacter = true + issues.push( + generateIssue('invalidCharacter', { + character: character, + index: tagSpec.bounds[0] + i, + string: hedString, + }), + ) + } + } + return issues +} + +/** + * Create the parsed HED tag and group objects. + * + * @param {string} hedString The HED string to be split. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @param {TagSpec[]} tagSpecs The tag specifications. + * @param {GroupSpec} groupSpecs The bounds of the tag groups. + * @return {[ParsedHedSubstring[], Object]} The parsed HED string data and any issues found. + */ +const createParsedTags = function (hedString, hedSchemas, tagSpecs, groupSpecs) { + const conversionIssues = [] + const syntaxIssues = [] + const ParsedHedTagClass = generationToClass[hedSchemas.generation] + + const createParsedTag = ({ library: librarySchema, tag: originalTag, bounds: originalBounds }) => { + const parsedTag = new ParsedHedTagClass(originalTag, hedString, originalBounds, hedSchemas, librarySchema) + conversionIssues.push(...parsedTag.conversionIssues) + return parsedTag + } + const createParsedGroups = (tags, groupSpecs) => { + const tagGroups = [] + let index = 0 + for (const tag of tags) { + if (Array.isArray(tag)) { + const groupSpec = groupSpecs[index] + tagGroups.push( + new ParsedHedGroup(createParsedGroups(tag, groupSpec.children), hedSchemas, hedString, groupSpec.bounds), + ) + index++ + } else { + tagGroups.push(tag) + } + } + return tagGroups + } + const parsedTags = recursiveMap(createParsedTag, tagSpecs) + const parsedTagsWithGroups = createParsedGroups(parsedTags, groupSpecs.children) + + const issues = { + syntax: syntaxIssues, + conversion: conversionIssues, + } + + return [parsedTagsWithGroups, issues] +} + +/** + * Split a HED string. + * + * @param {string} hedString The HED string to be split. + * @param {Schemas} hedSchemas The collection of HED schemas. + * @return {[ParsedHedSubstring[], Object]} The parsed HED string data and any issues found. + */ +const splitHedString = function (hedString, hedSchemas) { + const [tagSpecs, groupBounds, splitIssues] = tokenizeHedString(hedString) + const characterIssues = checkForInvalidCharacters(hedString, tagSpecs) + mergeParsingIssues(splitIssues, characterIssues) + if (splitIssues.syntax.length > 0) { + return [null, splitIssues] + } + const [parsedTags, parsingIssues] = createParsedTags(hedString, hedSchemas, tagSpecs, groupBounds) + mergeParsingIssues(splitIssues, parsingIssues) + return [parsedTags, splitIssues] +} + +module.exports = splitHedString diff --git a/validator/schema/hed2.js b/validator/schema/hed2.js index 4a1ce042..d911a77f 100644 --- a/validator/schema/hed2.js +++ b/validator/schema/hed2.js @@ -1,4 +1,4 @@ -const arrayUtils = require('../../utils/array') +const flattenDeep = require('lodash/flattenDeep') // TODO: Switch require once upstream bugs are fixed. // const xpath = require('xml2js-xpath') @@ -50,9 +50,7 @@ class Hed2SchemaParser extends SchemaParser { const [tags, tagElements] = this.getTagsByAttribute(dictionaryKey) if (dictionaryKey === extensionAllowedAttribute) { const tagDictionary = this.stringListToLowercaseTrueDictionary(tags) - const childTagElements = arrayUtils.flattenDeep( - tagElements.map((tagElement) => this.getAllChildTags(tagElement)), - ) + const childTagElements = flattenDeep(tagElements.map((tagElement) => this.getAllChildTags(tagElement))) const childTags = childTagElements.map((tagElement) => { return this.getTagPathFromTagElement(tagElement) }) @@ -192,5 +190,5 @@ class Hed2SchemaParser extends SchemaParser { } module.exports = { - Hed2SchemaParser: Hed2SchemaParser, + Hed2SchemaParser, } diff --git a/validator/schema/hed3.js b/validator/schema/hed3.js index 33e2cc6d..77e1242b 100644 --- a/validator/schema/hed3.js +++ b/validator/schema/hed3.js @@ -284,6 +284,6 @@ class HedV8SchemaParser extends Hed3SchemaParser { } module.exports = { - Hed3SchemaParser: Hed3SchemaParser, - HedV8SchemaParser: HedV8SchemaParser, + Hed3SchemaParser, + HedV8SchemaParser, } diff --git a/validator/schema/init.js b/validator/schema/init.js index c1163905..323ef849 100644 --- a/validator/schema/init.js +++ b/validator/schema/init.js @@ -1,14 +1,24 @@ -const semver = require('semver') - -const loadSchema = require('../../common/schema/loader') -const { Schemas, Hed2Schema, Hed3Schema } = require('../../common/schema/types') +const zip = require('lodash/zip') +const semver = require('semver') +const { Schemas, Hed2Schema, Hed3Schema, SchemasSpec } = require('../../common/schema/types') +const { loadSchema } = require('../../common/schema/loader') const { buildMappingObject } = require('../../converter/schema') const { setParent } = require('../../utils/xml2js') const { Hed2SchemaParser } = require('./hed2') const { HedV8SchemaParser } = require('./hed3') +/** + * Determine whether a HED schema is based on the HED 3 spec. + * + * @param {object} xmlData HED XML data. + * @returns {boolean} Whether the schema is a HED 3 schema. + */ +const isHed3Schema = function (xmlData) { + return xmlData.HED.$.library !== undefined || semver.gte(xmlData.HED.$.version, '8.0.0-alpha.3') +} + /** * Build a schema attributes object from schema XML data. * @@ -18,7 +28,7 @@ const { HedV8SchemaParser } = require('./hed3') const buildSchemaAttributesObject = function (xmlData) { const rootElement = xmlData.HED setParent(rootElement, null) - if (semver.gte(rootElement.$.version, '8.0.0-alpha.3')) { + if (isHed3Schema(xmlData)) { return new HedV8SchemaParser(rootElement).parse() } else { return new Hed2SchemaParser(rootElement).parse() @@ -26,28 +36,76 @@ const buildSchemaAttributesObject = function (xmlData) { } /** - * Build a schema container object from a base schema version or path description. + * Build a single schema container object from a base schema version or path description. + * + * @param {object} xmlData The schema's XML data + * @returns {Schema} The HED schema object. + */ +const buildSchemaObject = function (xmlData) { + const schemaAttributes = buildSchemaAttributesObject(xmlData) + const mapping = buildMappingObject(xmlData) + if (isHed3Schema(xmlData)) { + return new Hed3Schema(xmlData, schemaAttributes, mapping) + } else { + return new Hed2Schema(xmlData, schemaAttributes, mapping) + } +} + +/** + * Build a schema collection object from a schema specification. * - * @param {{path: string?, version: string?}} schemaDef The description of which base schema to use. + * @param {{path: string?, version: string?, libraries: Object?}} schemaDef The description of which schemas to use. * @param {boolean} useFallback Whether to use a bundled fallback schema if the requested schema cannot be loaded. * @return {Promise|Promise} The schema container object or an error. + * @deprecated */ const buildSchema = function (schemaDef = {}, useFallback = true) { - return loadSchema(schemaDef, useFallback).then((xmlData) => { - const schemaAttributes = buildSchemaAttributesObject(xmlData) - const mapping = buildMappingObject(xmlData) - const rootElement = xmlData.HED - let baseSchema - if (semver.gte(rootElement.$.version, '8.0.0-alpha.3')) { - baseSchema = new Hed3Schema(xmlData, schemaAttributes, mapping) - } else { - baseSchema = new Hed2Schema(xmlData, schemaAttributes, mapping) + return loadSchema(schemaDef, useFallback).then(([xmlData, baseSchemaIssues]) => { + const baseSchema = buildSchemaObject(xmlData) + if (schemaDef.libraries === undefined) { + return new Schemas(baseSchema) } - return new Schemas(baseSchema) + const [libraryKeys, libraryDefs] = zip(...Object.entries(schemaDef.libraries)) + return Promise.all( + libraryDefs.map((libraryDef) => { + return loadSchema(libraryDef, false) + }), + ).then((libraryXmlDataAndIssues) => { + const [libraryXmlData, libraryXmlIssues] = zip(...libraryXmlDataAndIssues) + const librarySchemaObjects = libraryXmlData.map(buildSchemaObject) + const schemas = new Map(zip(libraryKeys, librarySchemaObjects)) + schemas.set('', baseSchema) + return new Schemas(schemas) + }) + }) +} + +/** + * Build a schema collection object from a schema specification. + * + * @param {Map|SchemasSpec} schemaSpecs The description of which schemas to use. + * @return {Promise|Promise<[Schemas, Issue[]]>} The schema container object and any issues found. + */ +const buildSchemas = function (schemaSpecs) { + if (schemaSpecs instanceof SchemasSpec) { + schemaSpecs = schemaSpecs.data + } + const schemaKeys = Array.from(schemaSpecs.keys()) + return Promise.all( + schemaKeys.map((k) => { + const spec = schemaSpecs.get(k) + return loadSchema(spec, false, false) + }), + ).then((schemaXmlDataAndIssues) => { + const [schemaXmlData, schemaXmlIssues] = zip(...schemaXmlDataAndIssues) + const schemaObjects = schemaXmlData.map(buildSchemaObject) + const schemas = new Map(zip(schemaKeys, schemaObjects)) + return [new Schemas(schemas), schemaXmlIssues.flat()] }) } module.exports = { - buildSchema: buildSchema, - buildSchemaAttributesObject: buildSchemaAttributesObject, + buildSchema, + buildSchemas, + buildSchemaAttributesObject, } diff --git a/validator/schema/parser.js b/validator/schema/parser.js index 932c9f52..51ecb980 100644 --- a/validator/schema/parser.js +++ b/validator/schema/parser.js @@ -1,4 +1,4 @@ -const arrayUtils = require('../../utils/array') +const flattenDeep = require('lodash/flattenDeep') // TODO: Switch require once upstream bugs are fixed. // const xpath = require('xml2js-xpath') @@ -26,7 +26,7 @@ class SchemaParser { return [] } const tagElementChildren = this.getElementsByName(elementName, parentElement) - const childTags = arrayUtils.flattenDeep( + const childTags = flattenDeep( tagElementChildren.map((child) => this.getAllChildTags(child, elementName, excludeTakeValueTags)), ) childTags.push(parentElement) @@ -83,5 +83,5 @@ class SchemaParser { } module.exports = { - SchemaParser: SchemaParser, + SchemaParser, } diff --git a/validator/schema/types.js b/validator/schema/types.js index 4c3fa333..ff8c435a 100644 --- a/validator/schema/types.js +++ b/validator/schema/types.js @@ -21,32 +21,32 @@ class SchemaAttributes { this.tags = schemaParser.tags /** * The mapping from attributes to tags to values. - * @type {object>} + * @type {Object>} */ this.tagAttributes = schemaParser.tagAttributes /** * The mapping from tags to their unit classes. - * @type {object} + * @type {Object} */ this.tagUnitClasses = schemaParser.tagUnitClasses /** * The mapping from unit classes to their units. - * @type {object} + * @type {Object} */ this.unitClasses = schemaParser.unitClasses /** * The mapping from unit classes to their attributes. - * @type {object>} + * @type {Object>} */ this.unitClassAttributes = schemaParser.unitClassAttributes /** * The mapping from units to their attributes. - * @type {object>} + * @type {Object>} */ this.unitAttributes = schemaParser.unitAttributes /** * The mapping from unit modifier types to unit modifiers. - * @type {object} + * @type {Object} */ this.unitModifiers = schemaParser.unitModifiers /** @@ -450,16 +450,16 @@ class SchemaTag extends SchemaEntry { } module.exports = { - nodeProperty: nodeProperty, - attributeProperty: attributeProperty, - SchemaAttributes: SchemaAttributes, - SchemaEntries: SchemaEntries, - SchemaEntryManager: SchemaEntryManager, - SchemaProperty: SchemaProperty, - SchemaAttribute: SchemaAttribute, - SchemaTag: SchemaTag, - SchemaUnit: SchemaUnit, - SchemaUnitClass: SchemaUnitClass, - SchemaUnitModifier: SchemaUnitModifier, - SchemaValueClass: SchemaValueClass, + nodeProperty, + attributeProperty, + SchemaAttributes, + SchemaEntries, + SchemaEntryManager, + SchemaProperty, + SchemaAttribute, + SchemaTag, + SchemaUnit, + SchemaUnitClass, + SchemaUnitModifier, + SchemaValueClass, } diff --git a/validator/stringParser.js b/validator/stringParser.js deleted file mode 100644 index 93ff75ea..00000000 --- a/validator/stringParser.js +++ /dev/null @@ -1,359 +0,0 @@ -const utils = require('../utils') -const { hedStringIsAGroup, removeGroupParentheses } = require('../utils/hed') -const { generateIssue } = require('../common/issues/issues') - -const { ParsedHedTag, ParsedHed2Tag, ParsedHed3Tag, ParsedHedGroup, ParsedHedString } = require('./types/parsedHed') - -const openingGroupCharacter = '(' -const closingGroupCharacter = ')' -const delimiters = new Set([',']) - -/** - * Split a full HED string into tags. - * - * @param {string} hedString The full HED string. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @param {int} groupStartingIndex The start index of the group in the full HED string. - * @returns {[ParsedHedTag[], object]} An array of HED tags (top-level relative to the passed string) and any issues found. - */ -const splitHedString = function (hedString, hedSchemas, groupStartingIndex = 0) { - const doubleQuoteCharacter = '"' - const invalidCharacters = ['{', '}', '[', ']', '~'] - - const hedTags = [] - const conversionIssues = [] - const syntaxIssues = [] - let groupDepth = 0 - let currentTag = '' - let startingIndex = 0 - let resetStartingIndex = false - - let ParsedHedTagClass - if (hedSchemas.isHed2) { - ParsedHedTagClass = ParsedHed2Tag - } else if (hedSchemas.isHed3) { - ParsedHedTagClass = ParsedHed3Tag - } else { - ParsedHedTagClass = ParsedHedTag - } - - const pushTag = function (i) { - if (!utils.string.stringIsEmpty(currentTag)) { - const parsedHedTag = new ParsedHedTagClass( - currentTag.trim(), - hedString, - [groupStartingIndex + startingIndex, groupStartingIndex + i], - hedSchemas, - ) - hedTags.push(parsedHedTag) - conversionIssues.push(...parsedHedTag.conversionIssues) - } - resetStartingIndex = true - currentTag = '' - } - - // Loop a character at a time. - for (let i = 0; i < hedString.length; i++) { - if (resetStartingIndex) { - startingIndex = i - resetStartingIndex = false - } - const character = hedString.charAt(i) - if (character === doubleQuoteCharacter) { - // Skip double quotes - continue - } else if (character === openingGroupCharacter) { - // Count group characters - groupDepth++ - } else if (character === closingGroupCharacter) { - groupDepth-- - } - if (groupDepth === 0 && delimiters.has(character)) { - // Found the end of a tag, so push the current tag. - pushTag(i) - } else if (invalidCharacters.includes(character)) { - // Found an invalid character, so push an issue. - syntaxIssues.push( - generateIssue('invalidCharacter', { - character: character, - index: groupStartingIndex + i, - string: hedString, - }), - ) - pushTag(i) - } else { - currentTag += character - if (utils.string.stringIsEmpty(currentTag)) { - resetStartingIndex = true - currentTag = '' - } - } - } - pushTag(hedString.length) - - const issues = { - syntax: syntaxIssues, - conversion: conversionIssues, - } - - return [hedTags, issues] -} - -/** - * Find and parse the group tags in a provided list. - * - * @param {(ParsedHedTag|ParsedHedGroup)[]} groupTagsList The list of possible group tags. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @param {ParsedHedString} parsedString The object to store parsed output in. - * @param {boolean} isTopLevel Whether these tag groups are at the top level. - * @return {object[]} The array of issues. - */ -const findTagGroups = function (groupTagsList, hedSchemas, parsedString, isTopLevel) { - const issues = [] - const copiedGroupTagsList = groupTagsList.slice() - copiedGroupTagsList.forEach((tagOrGroup, index) => { - if (hedStringIsAGroup(tagOrGroup.originalTag)) { - const tagGroupString = removeGroupParentheses(tagOrGroup.originalTag) - // Split the group tag and recurse. - const [nestedGroupTagList, nestedGroupIssues] = splitHedString( - tagGroupString, - hedSchemas, - tagOrGroup.originalBounds[0] + 1, - ) - const nestedIssues = findTagGroups(nestedGroupTagList, hedSchemas, parsedString, false) - groupTagsList[index] = new ParsedHedGroup( - tagOrGroup.originalTag, - nestedGroupTagList, - tagOrGroup.originalBounds, - hedSchemas, - ) - if (isTopLevel) { - parsedString.tagGroupStrings.push(tagOrGroup) - parsedString.tagGroups.push(groupTagsList[index]) - parsedString.topLevelTagGroups.push( - nestedGroupTagList.filter((tagOrGroup) => { - return tagOrGroup && !Array.isArray(tagOrGroup) - }), - ) - } - issues.push(nestedGroupIssues, nestedIssues) - } else if (!parsedString.tags.includes(tagOrGroup)) { - parsedString.tags.push(tagOrGroup) - } - }) - parsedString.definitionGroups = parsedString.tagGroups.filter((group) => { - return group.isDefinitionGroup - }) - - return issues.flat() -} - -/** - * Find top-level tags in a split HED tag list. - * - * @param {ParsedHedTag[]} hedTags A list of split HED tags. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @param {ParsedHedString} parsedString The object to store sorted output in. - * @returns {ParsedHedTag[]} The top-level tags from a HED string. - */ -const findTopLevelTags = function (hedTags, hedSchemas, parsedString) { - const topLevelTags = [] - for (const tagOrGroup of hedTags) { - if (!hedStringIsAGroup(tagOrGroup.originalTag)) { - topLevelTags.push(tagOrGroup) - if (!parsedString.tags.includes(tagOrGroup)) { - parsedString.tags.push(tagOrGroup) - } - } - } - return topLevelTags -} - -/** - * Substitute certain illegal characters and report warnings when found. - */ -const substituteCharacters = function (hedString) { - const issues = [] - const illegalCharacterMap = { '\0': ['ASCII NUL', ' '] } - const flaggedCharacters = /[^\w\d./$ :-]/g - const replaceFunction = function (match, offset) { - if (match in illegalCharacterMap) { - const [name, replacement] = illegalCharacterMap[match] - issues.push( - generateIssue('invalidCharacter', { - character: name, - index: offset, - string: hedString, - }), - ) - return replacement - } else { - return match - } - } - const fixedString = hedString.replace(flaggedCharacters, replaceFunction) - - return [fixedString, issues] -} - -/** - * Check if group parentheses match. Pushes an issue if they don't match. - */ -const countTagGroupParentheses = function (hedString) { - const issues = [] - const numberOfOpeningParentheses = utils.string.getCharacterCount(hedString, openingGroupCharacter) - const numberOfClosingParentheses = utils.string.getCharacterCount(hedString, closingGroupCharacter) - if (numberOfOpeningParentheses !== numberOfClosingParentheses) { - issues.push( - generateIssue('parentheses', { - opening: numberOfOpeningParentheses, - closing: numberOfClosingParentheses, - }), - ) - } - return issues -} - -/** - * Check if a comma is missing after an opening parenthesis. - */ -const isCommaMissingAfterClosingParenthesis = function (lastNonEmptyCharacter, currentCharacter) { - return ( - lastNonEmptyCharacter === closingGroupCharacter && - !(delimiters.has(currentCharacter) || currentCharacter === closingGroupCharacter) - ) -} - -/** - * Check for delimiter issues in a HED string (e.g. missing commas adjacent to groups, extra commas or tildes). - */ -const findDelimiterIssuesInHedString = function (hedString) { - const issues = [] - let lastNonEmptyValidCharacter = '' - let lastNonEmptyValidIndex = 0 - let currentTag = '' - for (let i = 0; i < hedString.length; i++) { - const currentCharacter = hedString.charAt(i) - currentTag += currentCharacter - if (utils.string.stringIsEmpty(currentCharacter)) { - continue - } - if (delimiters.has(currentCharacter)) { - if (currentTag.trim() === currentCharacter) { - issues.push( - generateIssue('extraDelimiter', { - character: currentCharacter, - index: i, - string: hedString, - }), - ) - currentTag = '' - continue - } - currentTag = '' - } else if (currentCharacter === openingGroupCharacter) { - if (currentTag.trim() === openingGroupCharacter) { - currentTag = '' - } else { - issues.push(generateIssue('invalidTag', { tag: currentTag })) - } - } else if (isCommaMissingAfterClosingParenthesis(lastNonEmptyValidCharacter, currentCharacter)) { - issues.push( - generateIssue('commaMissing', { - tag: currentTag.slice(0, -1), - }), - ) - break - } - lastNonEmptyValidCharacter = currentCharacter - lastNonEmptyValidIndex = i - } - if (delimiters.has(lastNonEmptyValidCharacter)) { - issues.push( - generateIssue('extraDelimiter', { - character: lastNonEmptyValidCharacter, - index: lastNonEmptyValidIndex, - string: hedString, - }), - ) - } - return issues -} - -/** - * Validate the full unparsed HED string. - * - * @param {string} hedString The unparsed HED string. - * @return {object} String substitution issues and other issues. - */ -const validateFullUnparsedHedString = function (hedString) { - const [fixedHedString, substitutionIssues] = substituteCharacters(hedString) - const delimiterIssues = [].concat( - countTagGroupParentheses(fixedHedString), - findDelimiterIssuesInHedString(fixedHedString), - ) - - return { - substitution: substitutionIssues, - delimiter: delimiterIssues, - } -} - -const mergeParsingIssues = function (previousIssues, currentIssues) { - for (const key of Object.keys(currentIssues)) { - previousIssues[key] = - previousIssues[key] !== undefined ? previousIssues[key].concat(currentIssues[key]) : currentIssues[key] - } -} - -/** - * Parse a full HED string into a object of tag types. - * - * @param {string} hedString The full HED string to parse. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @returns {[ParsedHedString|null, object]} The parsed HED tag data and an object containing lists of parsing issues. - */ -const parseHedString = function (hedString, hedSchemas) { - const fullStringIssues = validateFullUnparsedHedString(hedString) - if (fullStringIssues.delimiter.length > 0) { - fullStringIssues.syntax = [] - return [null, fullStringIssues] - } - const parsedString = new ParsedHedString(hedString) - const [hedTagList, splitIssues] = splitHedString(hedString, hedSchemas) - parsedString.topLevelTags = findTopLevelTags(hedTagList, hedSchemas, parsedString) - const tagGroupIssues = findTagGroups(hedTagList, hedSchemas, parsedString, true) - const parsingIssues = Object.assign(fullStringIssues, splitIssues) - for (const tagGroup of tagGroupIssues) { - mergeParsingIssues(parsingIssues, tagGroup) - } - return [parsedString, parsingIssues] -} - -/** - * Parse a set of HED strings. - * - * @param {string[]} hedStrings A set of HED strings. - * @param {Schemas} hedSchemas The collection of HED schemas. - * @return {[ParsedHedString[], object]} The parsed HED strings and any issues found. - */ -const parseHedStrings = function (hedStrings, hedSchemas) { - return hedStrings - .map((hedString) => { - return parseHedString(hedString, hedSchemas) - }) - .reduce( - ([previousStrings, previousIssues], [currentString, currentIssues]) => { - previousStrings.push(currentString) - mergeParsingIssues(previousIssues, currentIssues) - return [previousStrings, previousIssues] - }, - [[], {}], - ) -} - -module.exports = { - splitHedString: splitHedString, - parseHedString: parseHedString, - parseHedStrings: parseHedStrings, -}