diff --git a/CHANGELOG.md b/CHANGELOG.md index ef11ad0..5eda652 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # Changelog +## 0.10.0 + +- EDF, EDF+, BDF and BDF+ (`.edf`, `.bdf`): the electrophysiology container + clinical and research rigs write. Flavour and continuity, bit depth, start + date resolved to a four-digit year from the EDF+ recording field, the EDF+ + patient and recording subfields, record count and duration, and per signal + the label, units, physical and digital range, samples per record, derived + rate, transducer and prefiltering. The annotations channel is named and kept + out of the recording's sampling rate. Verified on a PhysioNet Sleep-EDF + recording and against pyedflib. +- BrainVision (`.vhdr`, `.vmrk`): header and marker files, one of the three + container formats BIDS allows for EEG and iEEG. Version, data file and + orientation, channel count, sampling interval and rate, binary format and + byte order, data points and duration, per-channel name, reference, + resolution and unit, coordinates present; and from the marker file the + counts per type, the first markers and the segment start timestamp. + Cross-checked against mne on all 64 non-empty `.vhdr` files in + bids-standard/bids-examples; all 64 agreed. +- SpikeGLX (`.meta`): the run metadata beside every Neuropixels binary. + Stream type and kind, sample rate, AP/LF/sync channel counts, run name with + gate and trigger index, size, duration and derived sample count, probe type, + model, part number, serial, slot, port and dock, and microvolts per bit for + the probe generations the metadata reference defines it for. Per-channel + tables are counted, not copied. Verified against neo on Neuropixels 1.0 and + 2.0 files; a 2016 Phase 3A file that neo cannot open still decodes. +- Neuralynx (`.ncs`, `.nev`, `.nse`, `.ntt`, `.nvt`): the 16 KiB ASCII header, + in both the `##` comment-line dialect of Cheetah before 5.6.4 and the + property dialect of 5.7 onwards and Pegasus. File type and record kind, + record size, application and version, channel name, sampling rate, AD range + and microvolts per bit, DSP filters, open and close times. Checked against + python-neo's header grammar on four generations of file. +- Open Ephys (`structure.oebin`): the JSON manifest of a binary-format + recording. GUI version, continuous streams with folder, stream and processor + names, sample rate, channel count and uniform scaling, plus event and spike + streams. Verified on three real manifests from GUI 0.4.4.1, 0.4.5 and 0.6.0. +- BIDS sidecars (`.json`, `.tsv`): `dataset_description.json`, JSON metadata + sidecars, column data dictionaries, and the tabular files (events, + participants, sessions, samples, scans, channels, electrodes, optodes). + Both extensions are generic, so a file is claimed only when it carries a key + the standard defines or one of its column signatures. Swept over the whole + bids-standard/bids-examples corpus: 5853 files decoded, no exception, and + what declined is headerless derivative tables and non-core derivative JSON. +- `.json` and `.tsv` are now registered extensions. Dispatch reaches a decoder + for any file with those extensions; a name-registered decoder (`zarr.json`, + `.zattrs`, `attributes.json`) still wins, and non-BIDS content is declined. + ## 0.9.0 - NIfTI-2: the 540-byte header (`n+2` / `ni2` magic, 64-bit dims, double diff --git a/README.md b/README.md index cc395c9..c8bd2a3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Read the metadata of a scientific file and return its fields (dimensions, data type, pixel size, columns, row count) as a dict, without reading the rest of the file. Decodes formats across cryo-EM, light microscopy and light-sheet imaging, arrays, tabular data, flow cytometry, mass spec, sequencing, genome annotation, -and structural biology (the full list is below). The decode functions have no +structural biology, and electrophysiology (the full list is below). The decode functions have no dependencies; separate reader functions fetch the bytes from a file or a URL: the leading bytes for most formats, the trailing bytes for Parquet (whose schema is in a footer), and a bounded handful of reads wherever the pointers lead for @@ -111,6 +111,54 @@ Decoders today: study/series description. Reads technical fields only, never patient identifiers. +Electrophysiology and BIDS (added in 0.10.0). What an EEG, iEEG or Neuropixels +rig writes beside its raw samples, and the sidecars that describe a dataset +organised to the Brain Imaging Data Structure: + +- **EDF / EDF+ / BDF / BDF+** (`.edf`, `.bdf`): the clinical and research + electrophysiology container. Flavour and continuity (`EDF+C` / `EDF+D`), bit + depth, start date and time (resolved to a four-digit year from the EDF+ + recording field), the EDF+ patient and recording subfields, data record + count and duration, recording length, and per signal the label, units, + physical and digital range, samples per record, derived sampling rate, + transducer and prefiltering. The annotations channel is named and kept out + of the recording's sampling rate. Cross-checked against pyedflib. +- **BrainVision** (`.vhdr`, `.vmrk`): Brain Products' header and marker files, + one of the three container formats BIDS allows for EEG and iEEG. Format + version, data file and orientation, channel count, sampling interval and + rate, binary format and byte order, data points and duration, per-channel + name, reference, resolution and unit, and whether electrode coordinates are + present; from the marker file, the marker count, the count per type, the + first markers and the segment start timestamp. Cross-checked against mne on + 64 public files. +- **SpikeGLX** (`.meta`): the run metadata SpikeGLX writes beside every + Neuropixels binary, which is the only description that headerless int16 + matrix has. Stream type and kind, sample rate, channel counts split into AP, + LF and sync, run name with gate and trigger index, file size and duration, + derived sample count, probe type, model, part number and serial, slot, port + and dock, and the microvolts per bit for the two probe generations the + metadata reference defines it for. The per-channel tables are counted, not + copied. Cross-checked against neo. +- **Neuralynx** (`.ncs`, `.nev`, `.nse`, `.ntt`, `.nvt`): the 16 KiB ASCII + header every Cheetah and Pegasus file opens with, in both dialects (the + older `##` comment lines with `-CheetahRev`, and the newer properties with + `-ApplicationName` and `-TimeCreated`). File type and record kind, record + size, application and version, channel name, sampling rate, AD range and + microvolts per bit, DSP filter settings, and the open and close times. + Checked against python-neo's header grammar. +- **Open Ephys** (`structure.oebin`): the JSON manifest of a binary-format + recording directory, the only description of its headerless `.dat` + matrices. GUI version, continuous streams with folder, stream and processor + names, sample rate, channel count and the scaling where it is uniform + across the stream, plus the event and spike streams. +- **BIDS sidecars** (`.json`, `.tsv`): `dataset_description.json`, the JSON + metadata sidecars, the column data dictionaries, and the tabular files + (events, participants, sessions, samples, scans, channels, electrodes, + optodes). Both extensions are generic, so a file is claimed only when it + carries a key the standard defines or one of its column signatures; key + names are kept exactly as the standard spells them. Swept over the whole + bids-standard/bids-examples corpus. + Light microscopy and light-sheet (added in 0.6.0; most of these follow internal pointers, see "Pointer-based formats" below): @@ -414,6 +462,11 @@ re-decoding. layouts and tested on constructed files; their tests say so. Olympus OIB (an OLE compound document) and OIR, Hamamatsu DCIMG, and raw `.bin` / `.dat` / `.raw` exports (which have no header to read) are not decoded. +- **Neuralynx has no public sample** that was reachable, so its fixtures are + headers built to the per-version grammar documented in python-neo's + `NlxHeader` and parsed by neo, not copies of a rig's output. The binary + records after the header are not read, so a file's record count is not + reported. - **Legacy ND2** (JPEG2000 based) is recognised but not described. - BAM's BGZF framing and per-record structure are not handled; plain gzip is. - **Output is not a standard.** The fields are an ad-hoc dict, not an diff --git a/pyproject.toml b/pyproject.toml index c4f3f26..5bc8d83 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "scigantic-headers" -version = "0.9.0" +version = "0.10.0" description = "Decode scientific file headers (cryo-EM, light microscopy and light-sheet imaging incl. TIFF/OME-TIFF, CZI, HDF5/Imaris/BigDataViewer, LIF, ND2, Zarr/N5; tabular, flow cytometry, mass spec, sequencing, structural biology) into typed fields. Pure, zero-dependency, with bounded readers that follow internal pointers without downloading the file." readme = "README.md" requires-python = ">=3.9" diff --git a/src/scigantic_headers/__init__.py b/src/scigantic_headers/__init__.py index 3dfa1df..223984c 100644 --- a/src/scigantic_headers/__init__.py +++ b/src/scigantic_headers/__init__.py @@ -14,6 +14,8 @@ from .a3m import decode_a3m from .acquisition import Finding, compare_acquisition from .bed import decode_bed +from .bids import decode_bids_json, decode_bids_tsv +from .brainvision import decode_brainvision_vhdr, decode_brainvision_vmrk from .czi import decode_czi from .hdf5 import decode_hdf5 from .ics import decode_ics @@ -29,6 +31,7 @@ from .zarr import decode_n5_attributes, decode_zarr_json, decode_zarray, decode_zattrs, decode_zgroup from .cryosparc import parse_cryosparc_optics, read_cryosparc_optics from .dicom import decode_dicom +from .edf import decode_edf from .epu import decode_epu_xml, epu_pixel_size_candidates from .fastq import decode_fastq from .fcs import decode_fcs @@ -37,10 +40,13 @@ from .illumina import decode_illumina_run from .mmcif import decode_mmcif from .mzml import decode_mzml +from .neuralynx import decode_neuralynx +from .openephys import decode_openephys_oebin from .optics import read_session_optics from .parquet import decode_parquet from .pdb import decode_pdb from .sam import decode_sam +from .spikeglx import decode_spikeglx_meta from .vcf import decode_vcf from .decoders import ( HEADER_BYTES, @@ -89,6 +95,9 @@ "decode_parquet", "decode_fcs", "decode_mzml", "decode_a3m", "decode_fastq", "decode_illumina_run", "decode_vcf", "decode_sam", "decode_pdb", "decode_mmcif", "decode_genbank", "decode_gff", "decode_bed", "decode_dicom", + "decode_edf", "decode_brainvision_vhdr", "decode_brainvision_vmrk", + "decode_spikeglx_meta", "decode_neuralynx", "decode_openephys_oebin", + "decode_bids_json", "decode_bids_tsv", "decode_czi", "decode_hdf5", "decode_ics", "decode_klb", "decode_lif", "decode_nd2", "decode_nrrd", "decode_obf", "decode_tiff", "parse_ome_xml", "decode_bdv_xml", "decode_ome_xml", "decode_xml_sidecar", diff --git a/src/scigantic_headers/bids.py b/src/scigantic_headers/bids.py new file mode 100644 index 0000000..36fa7c0 --- /dev/null +++ b/src/scigantic_headers/bids.py @@ -0,0 +1,422 @@ +"""BIDS sidecar decoding: `dataset_description.json`, JSON metadata sidecars +and the tabular `.tsv` files. + +The Brain Imaging Data Structure stores the science in ordinary neuroimaging +and electrophysiology files and everything about it in plain sidecars beside +them. A NIfTI volume does not record its repetition time, a BrainVision +triplet does not record the task, and no raw file records who the subject was: +those live in the sidecars, so a pipeline that reads only the data files sees +a session it cannot describe. + +`.json` and `.tsv` are maximally generic extensions, so both decoders decline +anything that is not BIDS-shaped: a JSON sidecar must carry at least one key +the standard defines, and a TSV must have one of the standard's column +signatures (`onset`+`duration` for events, `participant_id` for the subject +table, and so on). Anything else costs one bounded read and returns nothing. + +BIDS key names are kept exactly as the standard spells them rather than +recased to this library's usual convention: these are the names the standard, +its validator and every downstream tool use, and renaming them would make a +record impossible to match against the specification. + +Spec: https://bids-specification.readthedocs.io/ +""" + +import json +from typing import Dict, List, Optional, Tuple + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# A participants table or an events file runs to thousands of rows; what is +# read is reported as a sample, never as a file total. +BIDS_READ_BYTES = 256 * 1024 + +_KEY_CAP = 128 +_LIST_CAP = 16 +_COLUMN_CAP = 64 +_LEVEL_CAP = 32 +_TEXT_CAP = 512 + +# Keys the standard defines that no other JSON is likely to carry. One of +# these must be present for a `.json` to be claimed as a BIDS sidecar. +_SIDECAR_KEYS = frozenset({ + # MRI acquisition + "RepetitionTime", "EchoTime", "EchoTime1", "EchoTime2", "FlipAngle", "InversionTime", + "MagneticFieldStrength", "ScanningSequence", "SequenceVariant", "SequenceName", + "PulseSequenceType", "SliceTiming", "SliceEncodingDirection", "PhaseEncodingDirection", + "EffectiveEchoSpacing", "TotalReadoutTime", "DwellTime", "MultibandAccelerationFactor", + "ParallelReductionFactorInPlane", "ParallelAcquisitionTechnique", "PartialFourier", + "RepetitionTimeExcitation", "RepetitionTimePreparation", "MTState", "NonlinearGradientCorrection", + "B0FieldIdentifier", "B0FieldSource", "IntendedFor", "AnatomicalLandmarkCoordinates", + # Task and electrophysiology + "TaskName", "SamplingFrequency", "PowerLineFrequency", "RecordingDuration", "RecordingType", + "EpochLength", "SoftwareFilters", "HardwareFilters", "EEGReference", "EEGChannelCount", + "EEGGround", "EEGPlacementScheme", "iEEGReference", "iEEGGround", "iEEGPlacementScheme", + "iEEGElectrodeGroups", "ECOGChannelCount", "SEEGChannelCount", "MEGChannelCount", + "MEGREFChannelCount", "DewarPosition", "DigitizedLandmarks", "DigitizedHeadPoints", + "ContinuousHeadLocalization", "TriggerChannelCount", "MiscChannelCount", "EMGChannelCount", + "NIRSChannelCount", "NIRSSourceOptodeCount", "NIRSDetectorOptodeCount", + # Coordinate systems + "EEGCoordinateSystem", "iEEGCoordinateSystem", "MEGCoordinateSystem", + "NIRSCoordinateSystem", "FiducialsCoordinateSystem", + # PET + "TracerName", "TracerRadionuclide", "InjectedRadioactivity", "ModeOfAdministration", + "FrameTimesStart", "FrameDuration", "ReconMethodName", "AcquisitionMode", "ScanStart", + # Microscopy + "PixelSize", "PixelSizeUnits", "ChunkTransformationMatrix", "SampleEnvironment", + "SampleStaining", "ImageAcquisitionProtocol", + # Continuous recordings beside an imaging run (physio, stim, eye tracking) + "Columns", "StartTime", "PhysioType", + # Derivatives + "SpatialReference", "SkullStripped", "RawSources", +}) + +# A coordinate-system sidecar names its space in a key suffixed this way +# (`EEGCoordinateSystem`, `EMGCoordinateUnits`, ...). Matching the suffix +# rather than listing every modality keeps a new one from being missed. +_COORDINATE_SUFFIXES = ("CoordinateSystem", "CoordinateUnits", "CoordinateSystemDescription") + +# Carried verbatim into the record when present, in this order. +_SIDECAR_REPORTED = ( + "TaskName", "TaskDescription", "Modality", "Manufacturer", "ManufacturersModelName", + "InstitutionName", "DeviceSerialNumber", "StationName", "SoftwareVersions", + "MagneticFieldStrength", "RepetitionTime", "EchoTime", "FlipAngle", "InversionTime", + "ScanningSequence", "SequenceVariant", "SequenceName", "PulseSequenceType", + "SliceEncodingDirection", "PhaseEncodingDirection", "EffectiveEchoSpacing", + "TotalReadoutTime", "MultibandAccelerationFactor", "ParallelReductionFactorInPlane", + "PartialFourier", "BodyPartExamined", "MRAcquisitionType", + "SamplingFrequency", "PowerLineFrequency", "RecordingDuration", "RecordingType", + "EpochLength", "EEGReference", "EEGGround", "EEGPlacementScheme", + "iEEGReference", "iEEGGround", "iEEGPlacementScheme", "iEEGElectrodeGroups", + "EEGChannelCount", "ECOGChannelCount", "SEEGChannelCount", "EOGChannelCount", + "ECGChannelCount", "EMGChannelCount", "MiscChannelCount", "TriggerChannelCount", + "MEGChannelCount", "MEGREFChannelCount", "DewarPosition", "ContinuousHeadLocalization", + "EEGCoordinateSystem", "iEEGCoordinateSystem", "MEGCoordinateSystem", + "NIRSCoordinateSystem", "FiducialsCoordinateSystem", + "TracerName", "TracerRadionuclide", "InjectedRadioactivity", "ModeOfAdministration", + "ReconMethodName", "AcquisitionMode", "ScanStart", "Units", + "SpatialReference", "SkullStripped", "RawSources", + "Columns", "StartTime", "PhysioType", + "PixelSize", "PixelSizeUnits", "BodyPart", "SampleEnvironment", "SampleStaining", +) + +# Which part of the standard a sidecar belongs to, decided by the first +# matching group. Order matters: an iEEG sidecar also carries EEG keys. +_MODALITIES: Tuple[Tuple[str, Tuple[str, ...]], ...] = ( + ("ieeg", ("iEEGReference", "iEEGGround", "iEEGPlacementScheme", "iEEGElectrodeGroups", + "iEEGCoordinateSystem", "ECOGChannelCount", "SEEGChannelCount")), + ("meg", ("MEGChannelCount", "MEGREFChannelCount", "DewarPosition", "MEGCoordinateSystem", + "ContinuousHeadLocalization")), + ("nirs", ("NIRSChannelCount", "NIRSSourceOptodeCount", "NIRSDetectorOptodeCount", + "NIRSCoordinateSystem")), + ("eeg", ("EEGReference", "EEGGround", "EEGChannelCount", "EEGPlacementScheme", + "EEGCoordinateSystem")), + ("pet", ("TracerName", "TracerRadionuclide", "InjectedRadioactivity", "FrameTimesStart", + "ReconMethodName", "ModeOfAdministration")), + ("micr", ("PixelSize", "PixelSizeUnits", "ChunkTransformationMatrix", "SampleStaining", + "SampleEnvironment")), + ("mri", ("RepetitionTime", "EchoTime", "FlipAngle", "MagneticFieldStrength", + "ScanningSequence", "PulseSequenceType", "SliceTiming", "PhaseEncodingDirection", + "EffectiveEchoSpacing", "InversionTime", "MRAcquisitionType")), +) + +# Column signatures, in order; the first whose required columns are all +# present names the file. +_TABLES: Tuple[Tuple[str, Tuple[str, ...]], ...] = ( + ("events", ("onset", "duration")), + ("participants", ("participant_id",)), + ("sessions", ("session_id",)), + ("samples", ("sample_id",)), + ("scans", ("filename",)), + ("electrodes", ("name", "x", "y", "z")), + ("optodes", ("name", "type", "x", "y", "z")), + ("channels", ("name", "type", "units")), +) + + +def _scalar(value: object) -> bool: + return isinstance(value, (str, int, float, bool)) + + +def _carry(fields: Dict[str, object], key: str, value: object) -> None: + """Copy one JSON value into the record: scalars verbatim (long strings + truncated), short scalar lists verbatim, anything longer as a count.""" + if isinstance(value, str): + fields[key] = value[:_TEXT_CAP] + elif isinstance(value, bool) or isinstance(value, int): + fields[key] = value + elif isinstance(value, float): + finite = _finite(value) + if finite is not None: + fields[key] = finite + elif isinstance(value, list): + if len(value) <= _LIST_CAP and all(_scalar(v) for v in value): + fields[key] = value + else: + fields[key + "Count"] = len(value) + + +def _dataset_description(obj: dict) -> DecodedHeader: + fields: Dict[str, object] = {"bidsFileType": "datasetDescription"} + for key in ("Name", "BIDSVersion", "HEDVersion", "DatasetType", "License", "DatasetDOI"): + if key in obj: + _carry(fields, key, obj[key]) + for key, name in ( + ("Authors", "authors"), ("Funding", "funding"), + ("ReferencesAndLinks", "referencesAndLinks"), ("EthicsApprovals", "ethicsApprovals"), + ): + value = obj.get(key) + if isinstance(value, list): + fields[name + "Count"] = len(value) + entries = [v for v in value if isinstance(v, str)] + if entries: + fields[name] = [e[:_TEXT_CAP] for e in entries[:_LIST_CAP]] + generated = obj.get("GeneratedBy") + if isinstance(generated, list): + names = [] + for entry in generated: + if not isinstance(entry, dict): + continue + label = entry.get("Name") + version = entry.get("Version") + if isinstance(label, str): + names.append(f"{label} {version}" if isinstance(version, str) else label) + if names: + fields["generatedBy"] = names[:_LIST_CAP] + sources = obj.get("SourceDatasets") + if isinstance(sources, list): + fields["sourceDatasetCount"] = len(sources) + for key in ("Acknowledgements", "HowToAcknowledge"): + if isinstance(obj.get(key), str): + fields[key] = obj[key][:_TEXT_CAP] + fields["keyCount"] = len(obj) + + name = fields.get("Name") + parts = ["BIDS dataset"] + if isinstance(name, str) and name: + parts.append(name) + version = fields.get("BIDSVersion") + if isinstance(version, str): + parts.append(f"BIDS {version}") + kind = fields.get("DatasetType") + if isinstance(kind, str): + parts.append(kind) + return DecodedHeader(format="bids-dataset", summary=", ".join(parts), fields=fields) + + +def _data_dictionary(obj: dict) -> Optional[DecodedHeader]: + """A sidecar that describes the columns of a `.tsv` beside it: every value + is an object carrying `Description`, `LongName`, `Units` or `Levels`.""" + columns = [ + k for k, v in obj.items() + if isinstance(v, dict) and ({"Description", "LongName", "Units", "Levels", "HED"} & set(v)) + ] + if not columns or len(columns) * 2 < len(obj): + return None + fields: Dict[str, object] = { + "bidsFileType": "dataDictionary", + "columnCount": len(columns), + "columns": columns[:_COLUMN_CAP], + } + described: Dict[str, object] = {} + for name in columns[:_COLUMN_CAP]: + entry = obj[name] + out: Dict[str, object] = {} + for key in ("LongName", "Description", "Units"): + if isinstance(entry.get(key), str): + out[key] = entry[key][:_TEXT_CAP] + levels = entry.get("Levels") + if isinstance(levels, dict): + out["levelCount"] = len(levels) + out["levels"] = sorted(levels)[:_LEVEL_CAP] + if out: + described[name] = out + if described: + fields["columnDescriptions"] = described + return DecodedHeader( + format="bids-dictionary", + summary=f"BIDS data dictionary, {len(columns)} columns", + fields=fields, + ) + + +def _coordinate_keys(obj: dict) -> List[str]: + return [k for k in obj if k.endswith(_COORDINATE_SUFFIXES)] + + +def _sidecar(obj: dict) -> Optional[DecodedHeader]: + coordinates = _coordinate_keys(obj) + if not (_SIDECAR_KEYS & set(obj)) and not coordinates: + return None + fields: Dict[str, object] = {"bidsFileType": "sidecar"} + if coordinates: + fields["bidsModality"] = "coordsystem" + else: + for modality, keys in _MODALITIES: + if any(k in obj for k in keys): + fields["bidsModality"] = modality + break + for key in _SIDECAR_REPORTED: + if key in obj: + _carry(fields, key, obj[key]) + for key in coordinates: + if key not in fields: + _carry(fields, key, obj[key]) + timing = obj.get("SliceTiming") + if isinstance(timing, list): + fields["sliceCount"] = len(timing) + frames = obj.get("FrameTimesStart") + if isinstance(frames, list): + fields["frameCount"] = len(frames) + intended = obj.get("IntendedFor") + if isinstance(intended, list): + fields["intendedForCount"] = len(intended) + elif isinstance(intended, str): + fields["intendedForCount"] = 1 + # A physio or eye-tracking sidecar is a hybrid: recording metadata plus a + # description object per column of the `.tsv.gz` beside it. + described = [k for k, v in obj.items() if isinstance(v, dict) and ({"Description", "Units", "Levels"} & set(v))] + if described: + fields["columnDescriptionCount"] = len(described) + fields["keyCount"] = len(obj) + fields["keys"] = sorted(obj)[:_KEY_CAP] + + parts = ["BIDS sidecar"] + modality = fields.get("bidsModality") + if isinstance(modality, str): + parts.append(modality) + task = fields.get("TaskName") + if isinstance(task, str) and task: + parts.append(f"task {task}") + for key, unit in (("RepetitionTime", "s TR"), ("SamplingFrequency", "Hz")): + value = fields.get(key) + if isinstance(value, (int, float)) and not isinstance(value, bool): + parts.append(f"{_number(float(value))} {unit}") + return DecodedHeader(format="bids-sidecar", summary=", ".join(parts), fields=fields) + + +def decode_bids_json(data: bytes) -> Optional[DecodedHeader]: + try: + # A BOM is common in sidecars written on Windows and is not valid JSON. + obj = json.loads(data.decode("utf-8", "replace").lstrip("\ufeff")) + except ValueError: + return None + if not isinstance(obj, dict): + return None + if "BIDSVersion" in obj: + return _dataset_description(obj) + sidecar = _sidecar(obj) + if sidecar is not None: + return sidecar + return _data_dictionary(obj) + + +def _rows(data: bytes) -> Tuple[List[List[str]], bool]: + """Tab-separated rows from the leading read, and whether the read holds the + whole file. A row cut in half by the read boundary is dropped.""" + text = data.decode("utf-8", "replace").lstrip("\ufeff") + complete = len(data) < BIDS_READ_BYTES + lines = text.split("\n") + if not complete and lines: + lines = lines[:-1] + rows = [line.rstrip("\r").split("\t") for line in lines if line.strip()] + return rows, complete + + +def _floats(rows: List[List[str]], index: int) -> List[float]: + out = [] + for row in rows: + if index >= len(row): + continue + try: + value = _finite(float(row[index])) + except ValueError: + continue + if value is not None: + out.append(value) + return out + + +def decode_bids_tsv(data: bytes) -> Optional[DecodedHeader]: + rows, complete = _rows(data) + if not rows: + return None + columns = [c.strip() for c in rows[0]] + # A trailing tab on the header line leaves an empty name; that is a + # formatting slip, not a different file, so it is dropped. + while columns and not columns[-1]: + columns.pop() + if not columns or any(not c for c in columns): + return None + lookup = {c: i for i, c in enumerate(columns)} + kind = next((name for name, required in _TABLES if all(c in lookup for c in required)), None) + if kind is None: + return None + body = [r for r in rows[1:] if len(r) > 1] + + fields: Dict[str, object] = { + "bidsFileType": kind, + "columnCount": len(columns), + "columns": columns[:_COLUMN_CAP], + "rowsRead": len(body), + "rowsComplete": complete, + } + if kind == "events": + onsets = _floats(body, lookup["onset"]) + if onsets: + fields["onsetFirstSeconds"] = onsets[0] + fields["onsetLastSeconds"] = onsets[-1] + durations = _floats(body, lookup["duration"]) + if durations: + fields["durationMinSeconds"] = min(durations) + fields["durationMaxSeconds"] = max(durations) + if "trial_type" in lookup: + fields.update(_counts(body, lookup["trial_type"], "trialTypes")) + elif kind == "channels": + fields.update(_counts(body, lookup["type"], "channelTypes")) + if "sampling_frequency" in lookup: + rates = sorted({v for v in _floats(body, lookup["sampling_frequency"])}) + if len(rates) == 1: + fields["samplingRateHz"] = rates[0] + elif rates: + fields["samplingRatesHz"] = rates[:_LIST_CAP] + elif kind in ("participants", "samples", "sessions", "electrodes", "optodes"): + fields[{"participants": "participantCount", "samples": "sampleCount", + "sessions": "sessionCount", "electrodes": "electrodeCount", + "optodes": "optodeCount"}[kind]] = len(body) + + noun = {"events": "event", "participants": "participant", "samples": "sample", + "sessions": "session", "scans": "scan", "channels": "channel", + "electrodes": "electrode", "optodes": "optode"}[kind] + if len(body) != 1: + noun += "s" + suffix = "" if complete else " read" + return DecodedHeader( + format="bids-table", + summary=f"BIDS {kind} table, {len(body)} {noun}{suffix}, {len(columns)} columns", + fields=fields, + ) + + +def _counts(rows: List[List[str]], index: int, name: str) -> Dict[str, object]: + """Value counts for one column, most common first.""" + counts: Dict[str, int] = {} + for row in rows: + if index >= len(row): + continue + value = row[index].strip() + if not value or value == "n/a": + continue + counts[value] = counts.get(value, 0) + 1 + if not counts: + return {} + ordered = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0])) + return {name: dict(ordered[:_LEVEL_CAP]), name + "Distinct": len(counts)} + + +def _number(value: float) -> str: + return str(int(value)) if value == int(value) else f"{value:g}" + + +register_decoder(["json"], decode_bids_json, read=Read(leading=BIDS_READ_BYTES)) +register_decoder(["tsv"], decode_bids_tsv, read=Read(leading=BIDS_READ_BYTES)) diff --git a/src/scigantic_headers/brainvision.py b/src/scigantic_headers/brainvision.py new file mode 100644 index 0000000..2fbc894 --- /dev/null +++ b/src/scigantic_headers/brainvision.py @@ -0,0 +1,286 @@ +"""BrainVision header (`.vhdr`) and marker (`.vmrk`) decoding. + +Brain Products' format is a triplet: an INI-style `.vhdr` describing the +recording, a `.vmrk` holding the event markers, and a raw `.eeg` holding the +samples. The two text files are the whole description, which is why BIDS +names BrainVision one of its three allowed EEG and iEEG container formats. + +Both files are read as text and both decline anything whose first line is not +their own magic sentence, so a stray INI file under either extension costs one +bounded read and nothing more. Sample data is never touched. + +Spec: BrainVision Core Data Format 1.0, Brain Products GmbH. +""" + +import re +from typing import Dict, List, Optional, Tuple + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# A header with 256 channels and a coordinates section is tens of KB; markers +# run much longer, and a marker file past this is reported as sampled. +BRAINVISION_READ_BYTES = 256 * 1024 + +_HEADER_MAGIC = "Brain Vision Data Exchange Header File" +_MARKER_MAGIC = "Brain Vision Data Exchange Marker File" +_VERSION = re.compile(r"Version\s+([0-9.]+)") +_CHANNEL = re.compile(r"^Ch(\d+)$", re.IGNORECASE) +_MARKER = re.compile(r"^Mk(\d+)$", re.IGNORECASE) +# The "New Segment" marker carries the wall-clock start as YYYYMMDDhhmmssffffff. +_SEGMENT_DATE = re.compile(r"^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{6})?$") + +# Channel names and marker descriptions escape a comma as \1. +_COMMA = "\\1" + +_CHANNEL_DETAIL = 64 +_NAME_CAP = 512 +_MARKER_DETAIL = 16 +_MARKER_TYPE_CAP = 32 + +# Sample width in bytes, for turning a file size into a sample count. +_BINARY_FORMATS = { + "INT_16": 2, "UINT_16": 2, "INT_32": 4, "UINT_32": 4, + "IEEE_FLOAT_32": 4, "IEEE_FLOAT_64": 8, +} + + +def _sections(text: str) -> Tuple[Dict[str, List[Tuple[str, str]]], Optional[str]]: + """The file as `{section: [(key, value), ...]}`, plus the free text of the + `[Comment]` section. Lines starting with `;` are comments; a line with no + `=` outside `[Comment]` is ignored, which is how the spec's own commentary + lines (`Data orientation: MULTIPLEXED=ch1,pt1 ...`) are skipped.""" + out: Dict[str, List[Tuple[str, str]]] = {} + comment: List[str] = [] + section = "" + for raw in text.splitlines(): + line = raw.strip() + if line.startswith("[") and line.endswith("]"): + section = line[1:-1].strip().lower() + out.setdefault(section, []) + continue + if section == "comment": + comment.append(raw) + continue + if not line or line.startswith(";"): + continue + key, sep, value = line.partition("=") + if not sep: + continue + out.setdefault(section, []).append((key.strip(), value.strip())) + body = "\n".join(comment).strip() + return out, body or None + + +def _lookup(sections: Dict[str, List[Tuple[str, str]]], section: str, key: str) -> Optional[str]: + for k, v in sections.get(section, ()): + if k.lower() == key.lower(): + return v + return None + + +def _int(text: Optional[str]) -> Optional[int]: + if text is None: + return None + try: + return int(text.strip()) + except ValueError: + return None + + +def _float(text: Optional[str]) -> Optional[float]: + if text is None: + return None + try: + return _finite(float(text.strip().replace(",", "."))) + except ValueError: + return None + + +def _unescape(text: str) -> str: + return text.replace(_COMMA, ",") + + +def _split(value: str, count: int) -> List[str]: + """A comma-separated entry padded to `count` fields; trailing fields are + optional in the spec and simply absent in most files.""" + parts = [p.strip() for p in value.split(",")] + return parts + [""] * (count - len(parts)) + + +def decode_brainvision_vhdr(data: bytes) -> Optional[DecodedHeader]: + text = data.decode("utf-8", "replace") + if not text.lstrip("").startswith(_HEADER_MAGIC): + return None + sections, comment = _sections(text) + + fields: Dict[str, object] = {} + version = _VERSION.search(text.splitlines()[0]) + if version: + fields["brainVisionVersion"] = version.group(1) + + for key, name in ( + ("DataFile", "dataFile"), ("MarkerFile", "markerFile"), + ("DataFormat", "dataFormat"), ("DataOrientation", "dataOrientation"), + ("DataType", "dataType"), ("Codepage", "codepage"), + ): + value = _lookup(sections, "common infos", key) + if value: + fields[name] = value + + channel_count = _int(_lookup(sections, "common infos", "NumberOfChannels")) + if channel_count is not None: + fields["channelCount"] = channel_count + interval = _float(_lookup(sections, "common infos", "SamplingInterval")) + rate = None + if interval: + fields["samplingIntervalMicroseconds"] = interval + rate = _finite(1_000_000.0 / interval) + if rate is not None: + fields["samplingRateHz"] = rate + points = _int(_lookup(sections, "common infos", "DataPoints")) + if points is not None: + fields["dataPoints"] = points + if rate: + duration = _finite(points / rate) + if duration is not None: + fields["durationSeconds"] = duration + for key, name in (("SegmentDataPoints", "segmentDataPoints"), ("AveragedSegments", "averagedSegments")): + value = _int(_lookup(sections, "common infos", key)) + if value is not None: + fields[name] = value + averaged = _lookup(sections, "common infos", "Averaged") + if averaged: + fields["averaged"] = averaged.upper() == "YES" + + binary_format = _lookup(sections, "binary infos", "BinaryFormat") + if binary_format: + fields["binaryFormat"] = binary_format + width = _BINARY_FORMATS.get(binary_format.upper()) + if width: + fields["bytesPerSample"] = width + big_endian = _lookup(sections, "binary infos", "UseBigEndianOrder") + if big_endian: + fields["byteOrder"] = "big" if big_endian.upper() == "YES" else "little" + elif binary_format: + # The spec's default, and what every writer in the wild emits. + fields["byteOrder"] = "little" + for key, name in ( + ("DecimalSymbol", "decimalSymbol"), ("SkipLines", "skipLines"), ("SkipColumns", "skipColumns"), + ): + value = _lookup(sections, "ascii infos", key) + if value: + fields[name] = value + + names: List[str] = [] + channels: List[Dict[str, object]] = [] + resolutions = set() + for key, value in sections.get("channel infos", ()): + if not _CHANNEL.match(key): + continue + name, reference, resolution, unit = _split(value, 4)[:4] + name = _unescape(name) + names.append(name) + entry: Dict[str, object] = {"name": name} + if reference: + entry["reference"] = _unescape(reference) + value_resolution = _float(resolution) + if value_resolution is not None: + entry["resolution"] = value_resolution + resolutions.add(value_resolution) + if unit: + entry["unit"] = _unescape(unit) + channels.append(entry) + if names: + fields["channelNames"] = names[:_NAME_CAP] + if channels: + fields["channels"] = channels[:_CHANNEL_DETAIL] + fields["channelsRead"] = len(channels) + if len(resolutions) == 1: + # No unit column means microvolts, which is the format's default. + fields["resolution"] = resolutions.pop() + if any(_CHANNEL.match(k) for k, _ in sections.get("coordinates", ())): + fields["hasCoordinates"] = True + if comment: + fields["comment"] = comment[:1024] + + parts = ["BrainVision"] + if channel_count is not None: + parts.append(f"{channel_count} channels") + elif channels: + parts.append(f"{len(channels)} channels") + if rate: + parts.append(f"{_number(rate)} Hz") + tail = [str(fields[k]) for k in ("binaryFormat", "dataOrientation") if k in fields] + summary = ", ".join(parts) + if tail: + summary += ", " + " ".join(tail).lower() + return DecodedHeader(format="brainvision", summary=summary, fields=fields) + + +def decode_brainvision_vmrk(data: bytes) -> Optional[DecodedHeader]: + text = data.decode("utf-8", "replace") + if not text.lstrip("").startswith(_MARKER_MAGIC): + return None + sections, _ = _sections(text) + + fields: Dict[str, object] = {} + version = _VERSION.search(text.splitlines()[0]) + if version: + fields["brainVisionVersion"] = version.group(1) + for key, name in (("DataFile", "dataFile"), ("Codepage", "codepage")): + value = _lookup(sections, "common infos", key) + if value: + fields[name] = value + + markers: List[Dict[str, object]] = [] + types: Dict[str, int] = {} + read = 0 + for key, value in sections.get("marker infos", ()): + if not _MARKER.match(key): + continue + read += 1 + kind, description, position, size, channel, date = _split(value, 6)[:6] + kind, description = _unescape(kind), _unescape(description) + types[kind] = types.get(kind, 0) + 1 + entry: Dict[str, object] = {"type": kind} + if description: + entry["description"] = description + for name, raw in (("position", position), ("size", size), ("channel", channel)): + parsed = _int(raw) + if parsed is not None: + entry[name] = parsed + if date and "segmentStartTime" not in fields: + stamp = _SEGMENT_DATE.match(date) + if stamp: + y, mo, d, h, mi, s, micro = stamp.groups() + iso = f"{y}-{mo}-{d}T{h}:{mi}:{s}" + if micro: + iso += f".{micro}" + fields["segmentStartTime"] = iso + markers.append(entry) + + # The read is bounded, so this is what the leading bytes hold, not a file + # total: a long marker file is cut off and says so. + fields["markersRead"] = read + fields["markersComplete"] = len(data) < BRAINVISION_READ_BYTES + if markers: + fields["markers"] = markers[:_MARKER_DETAIL] + if types: + ordered = sorted(types.items(), key=lambda kv: (-kv[1], kv[0])) + fields["markerTypes"] = dict(ordered[:_MARKER_TYPE_CAP]) + + noun = "marker" if read == 1 else "markers" + summary = f"BrainVision markers, {read} {noun}" + if not fields["markersComplete"]: + summary += " read" + if types: + summary += ", " + " ".join(f"{k} x{v}" for k, v in ordered[:3]) + return DecodedHeader(format="brainvision-markers", summary=summary, fields=fields) + + +def _number(value: float) -> str: + return str(int(value)) if value == int(value) else f"{value:g}" + + +register_decoder(["vhdr"], decode_brainvision_vhdr, read=Read(leading=BRAINVISION_READ_BYTES)) +register_decoder(["vmrk"], decode_brainvision_vmrk, read=Read(leading=BRAINVISION_READ_BYTES)) diff --git a/src/scigantic_headers/edf.py b/src/scigantic_headers/edf.py new file mode 100644 index 0000000..e3364cc --- /dev/null +++ b/src/scigantic_headers/edf.py @@ -0,0 +1,292 @@ +"""EDF, EDF+, BDF and BDF+ header decoding. + +The European Data Format is what clinical and research electrophysiology rigs +write: polysomnography, EEG, EMG, ECG. BDF is BioSemi's 24-bit variant of the +same layout. Both open with a 256-byte ASCII record describing the recording, +followed by one 256-byte block per signal holding that signal's label, units, +calibration and sample count. Everything needed to describe a session is in +those bytes; the samples that follow are never read here. + +The signal header is column-major, not one block per signal: all labels, then +all transducers, then all physical dimensions, and so on. A short read is +therefore partial in every column at once, which `headerComplete` reports. + +EDF+ keeps structured subfields in the two free-text fields (patient and +recording) and carries an unabbreviated start date there, which is the only +way to tell 1989 from 2089 in a file whose header date is `24.04.89`. + +Specs: https://www.edfplus.info/specs/edf.html and +https://www.biosemi.com/faq/file_format.htm +""" + +import re +from typing import Dict, List, Optional, Tuple + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# 256 bytes fixed plus 256 per signal. 256 KiB covers 1023 signals; a clinical +# montage is tens of channels and a dense BDF cap is 256, so this is headroom, +# and a file with more signals still decodes as far as the read goes. +EDF_READ_BYTES = 256 * 1024 + +_FIXED_BYTES = 256 +_SIGNAL_BYTES = 256 +# Signals described in full. A long montage is listed by label instead. +_SIGNAL_DETAIL = 32 +_LABEL_CAP = 256 + +_BDF_MAGIC = b"\xffBIOSEMI" +_EDF_MAGIC = b"0 " + +_DATE = re.compile(r"^(\d{2})\.(\d{2})\.(\d{2})$") +_TIME = re.compile(r"^(\d{2})\.(\d{2})\.(\d{2})$") +# EDF+ recording field: "Startdate 24-APR-1989 hospital technician equipment". +_STARTDATE = re.compile(r"^Startdate (\d{2})-([A-Za-z]{3})-(\d{4})\b") +_MONTHS = { + "JAN": 1, "FEB": 2, "MAR": 3, "APR": 4, "MAY": 5, "JUN": 6, + "JUL": 7, "AUG": 8, "SEP": 9, "OCT": 10, "NOV": 11, "DEC": 12, +} +# The reserved label of the EDF+/BDF+ annotations channel. A channel is +# recognised by this label alone, including in a legacy file whose reserved +# field does not say EDF+: the label is reserved either way, and a channel +# carrying it holds timestamped text, not samples, so it is kept out of the +# recording's sampling rate. +_ANNOTATIONS = ("EDF Annotations", "BDF Annotations") + + +def _text(data: bytes, offset: int, width: int) -> str: + """One fixed-width ASCII field, trailing padding removed. EDF is ASCII but + writers do emit Latin-1 accents in names, which never raises here.""" + return data[offset:offset + width].decode("latin-1").strip() + + +def _int(text: str) -> Optional[int]: + try: + return int(text.strip()) + except ValueError: + return None + + +def _float(text: str) -> Optional[float]: + try: + return _finite(float(text.strip())) + except ValueError: + return None + + +def _start_datetime(date_text: str, time_text: str, recording: str) -> Optional[str]: + """ISO-8601 local start, or None when either field is not a real date. + + The header's two-digit year is clipped by the spec: 85-99 is 19xx, 00-84 is + 20xx. An EDF+ recording field overrides it with the four-digit year, which + is what files written before 1985 or after 2084 rely on.""" + d, t = _DATE.match(date_text), _TIME.match(time_text) + if not d or not t: + return None + day, month, yy = int(d.group(1)), int(d.group(2)), int(d.group(3)) + year = 1900 + yy if yy >= 85 else 2000 + yy + m = _STARTDATE.match(recording) + if m and m.group(2).upper() in _MONTHS: + day, month, year = int(m.group(1)), _MONTHS[m.group(2).upper()], int(m.group(3)) + hour, minute, second = int(t.group(1)), int(t.group(2)), int(t.group(3)) + if not (1 <= month <= 12 and 1 <= day <= 31 and hour < 24 and minute < 60 and second < 61): + return None + return f"{year:04d}-{month:02d}-{day:02d}T{hour:02d}:{minute:02d}:{second:02d}" + + +def _patient_subfields(patient: str) -> Dict[str, object]: + """EDF+ splits the patient field into code, sex, birthdate and name, space + separated, `X` for unknown. A plain EDF file keeps free text there, which + has no subfields and is left alone.""" + parts = patient.split(" ") + if len(parts) < 4: + return {} + code, sex, birth, name = parts[0], parts[1], parts[2], " ".join(parts[3:]) + if sex not in ("M", "F", "X"): + return {} + out: Dict[str, object] = {} + if code != "X": + out["subjectCode"] = code + if sex != "X": + out["subjectSex"] = sex + if birth != "X": + out["subjectBirthdate"] = birth + if name and name != "X": + out["subjectName"] = name + return out + + +def _recording_subfields(recording: str) -> Dict[str, object]: + """EDF+ recording field: `Startdate + `, again `X` for unknown.""" + if not _STARTDATE.match(recording): + return {} + parts = recording.split(" ") + out: Dict[str, object] = {} + for key, idx in (("hospitalCode", 2), ("technician", 3), ("equipment", 4)): + if len(parts) > idx and parts[idx] != "X": + out[key] = parts[idx] + return out + + +def _column(data: bytes, offset: int, width: int, count: int) -> Tuple[List[str], int]: + """One column of the signal header: `count` fields of `width` bytes from + `offset`. Returns the fields the read actually holds and the offset of the + next column, which is computed from the full count so a short read does not + shift the columns that follow.""" + out = [] + for i in range(count): + start = offset + i * width + if start + width > len(data): + break + out.append(data[start:start + width].decode("latin-1").strip()) + return out, offset + count * width + + +def _flavour(kind: str, reserved: str) -> str: + """`EDF`, `EDF+C`, `EDF+D` or the BDF equivalents. The reserved field names + the continuity: C for one uninterrupted recording, D for interrupted.""" + tag = reserved.split(" ")[0].upper() if reserved else "" + if tag in (f"{kind}+C", f"{kind}+D"): + return tag + return kind + + +def decode_edf(data: bytes) -> Optional[DecodedHeader]: + if len(data) < _FIXED_BYTES: + return None + version = data[:8] + if version == _EDF_MAGIC: + kind, bit_depth = "EDF", 16 + elif version == _BDF_MAGIC: + kind, bit_depth = "BDF", 24 + else: + return None + + header_bytes = _int(_text(data, 184, 8)) + signal_count = _int(_text(data, 252, 4)) + if signal_count is None or signal_count < 0 or signal_count > 65536: + return None + # The two counts are redundant by construction, which is what makes them a + # cheap validity check on bytes that are otherwise all free text. + if header_bytes != _FIXED_BYTES * (signal_count + 1): + return None + + patient = _text(data, 8, 80) + recording = _text(data, 88, 80) + reserved = _text(data, 192, 44) + records = _int(_text(data, 236, 8)) + record_seconds = _float(_text(data, 244, 8)) + + fields: Dict[str, object] = { + "edfType": _flavour(kind, reserved), + "bitDepth": bit_depth, + "headerBytes": header_bytes, + "signalCount": signal_count, + } + start = _start_datetime(_text(data, 168, 8), _text(data, 176, 8), recording) + if start: + fields["startDateTime"] = start + if patient: + fields["patient"] = patient + fields.update(_patient_subfields(patient)) + if recording: + fields["recording"] = recording + fields.update(_recording_subfields(recording)) + if reserved: + fields["reserved"] = reserved + # -1 is the spec's "still being written, count unknown". + if records is not None and records >= 0: + fields["numDataRecords"] = records + if record_seconds is not None: + fields["dataRecordDurationSeconds"] = record_seconds + + labels, off = _column(data, _FIXED_BYTES, 16, signal_count) + transducers, off = _column(data, off, 80, signal_count) + dimensions, off = _column(data, off, 8, signal_count) + phys_min, off = _column(data, off, 8, signal_count) + phys_max, off = _column(data, off, 8, signal_count) + dig_min, off = _column(data, off, 8, signal_count) + dig_max, off = _column(data, off, 8, signal_count) + prefilters, off = _column(data, off, 80, signal_count) + samples, off = _column(data, off, 8, signal_count) + + fields["headerComplete"] = len(data) >= header_bytes + if labels: + fields["signalLabels"] = labels[:_LABEL_CAP] + + signals: List[Dict[str, object]] = [] + rates = set() + annotation_count = 0 + for i in range(min(len(labels), signal_count)): + label = labels[i] + entry: Dict[str, object] = {"label": label} + if i < len(dimensions) and dimensions[i]: + entry["physicalDimension"] = dimensions[i] + for key, column in ( + ("physicalMin", phys_min), ("physicalMax", phys_max), + ): + if i < len(column): + value = _float(column[i]) + if value is not None: + entry[key] = value + for key, column in (("digitalMin", dig_min), ("digitalMax", dig_max)): + if i < len(column): + value = _int(column[i]) + if value is not None: + entry[key] = value + per_record = _int(samples[i]) if i < len(samples) else None + if per_record is not None: + entry["samplesPerRecord"] = per_record + if record_seconds: + rate = _finite(per_record / record_seconds) + if rate is not None: + entry["samplingRateHz"] = rate + if label not in _ANNOTATIONS: + rates.add(rate) + if i < len(transducers) and transducers[i]: + entry["transducer"] = transducers[i] + if i < len(prefilters) and prefilters[i]: + entry["prefiltering"] = prefilters[i] + if label in _ANNOTATIONS: + annotation_count += 1 + entry["annotations"] = True + signals.append(entry) + + if signals: + fields["signals"] = signals[:_SIGNAL_DETAIL] + if annotation_count: + fields["annotationSignalCount"] = annotation_count + if len(rates) == 1: + fields["samplingRateHz"] = rates.pop() + duration = None + if records is not None and records >= 0 and record_seconds: + duration = _finite(records * record_seconds) + if duration is not None: + fields["durationSeconds"] = duration + + parts = [f"{fields['edfType']} recording", f"{signal_count} signals"] + if duration is not None: + parts.append(_duration(duration)) + rate = fields.get("samplingRateHz") + if isinstance(rate, float): + parts.append(f"{_number(rate)} Hz") + return DecodedHeader(format="edf", summary=", ".join(parts), fields=fields) + + +def _number(value: float) -> str: + """A rate or count without a trailing `.0`, so 100.0 Hz reads as 100 Hz.""" + return str(int(value)) if value == int(value) else f"{value:g}" + + +def _duration(seconds: float) -> str: + """`h:mm:ss` for a recording that runs an hour or more, else `m:ss`.""" + total = int(seconds) + hours, rest = divmod(total, 3600) + minutes, secs = divmod(rest, 60) + if hours: + return f"{hours}:{minutes:02d}:{secs:02d}" + return f"{minutes}:{secs:02d}" + + +register_decoder(["edf", "bdf"], decode_edf, read=Read(leading=EDF_READ_BYTES)) diff --git a/src/scigantic_headers/neuralynx.py b/src/scigantic_headers/neuralynx.py new file mode 100644 index 0000000..fd032e9 --- /dev/null +++ b/src/scigantic_headers/neuralynx.py @@ -0,0 +1,248 @@ +"""Neuralynx Cheetah and Pegasus file header decoding. + +Every Neuralynx acquisition file, whatever it holds, opens with the same +16 KiB ASCII header followed by fixed-size binary records: continuously +sampled channels (`.ncs`), events (`.nev`), single-electrode and tetrode +spikes (`.nse`, `.ntt`) and video tracking (`.nvt`). The header is the whole +description, and it is the same 16384 bytes in every file the rig writes. + +Two header dialects exist and both are read here. Cheetah before 5.6.4 wrote +the file name and open/close times as `##` comment lines and the application +version as `-CheetahRev`; 5.7 onwards and Pegasus write them as ordinary +`-Key Value` properties (`-OriginalFileName`, `-TimeCreated`, `-TimeClosed`, +`-ApplicationName Cheetah "5.7.4"`). + +Checked against the header grammar in python-neo's `NlxHeader`, which is the +reference reader for this format. +""" + +import re +from typing import Dict, List, Optional + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# The header is exactly this long in every Neuralynx file, NUL padded. +NEURALYNX_HEADER_BYTES = 16 * 1024 + +_MAGIC = b"########" +# `-Key Value`, where the value runs to end of line and may hold spaces. +_PROPERTY = re.compile(r"^-(\S+)[ \t]*(.*)$") +# `## File Name: C:\...\CSC1.ncs` and `## File Name C:\...`, both seen. +_FILENAME = re.compile(r"^## File Name:?\s+(.*)$") +# `## Time Opened (m/d/y): 11/28/2016 (h:m:s.ms) 21:50:33.322` and the +# `Date Opened: (mm/dd/yyy): ... At Time: ...` spelling neuraview writes. +_TIMESTAMP = re.compile( + r"^## (?:Time|Date) (Opened|Closed):*\s*\((?:m/d/y|mm/dd/yyy)\):\s*(\S+)\s+" + r"(?:\(h:m:s\.ms\)|At Time:)\s*(\S+)" +) +# `-ApplicationName Cheetah "5.7.4"`. +_APPLICATION = re.compile(r'^(\S+)\s+"([^"]*)"$') + +_FIELD_CAP = 128 + +_STRINGS = ( + ("FileType", "fileType"), ("FileVersion", "fileVersion"), + ("AcqEntName", "channelName"), ("ProbeName", "probeName"), + ("HardwareSubSystemName", "hardwareSubSystemName"), + ("HardwareSubSystemType", "hardwareSubSystemType"), + ("AcquisitionSystem", "acquisitionSystem"), ("ReferenceChannel", "referenceChannel"), + ("SessionUUID", "sessionUuid"), ("FileUUID", "fileUuid"), + ("DspLowCutFilterType", "dspLowCutFilterType"), + ("DspHighCutFilterType", "dspHighCutFilterType"), + ("NLX_Base_Class_Type", "baseClassType"), +) +_INTS = ( + ("RecordSize", "recordBytes"), ("ADMaxValue", "adMaxValue"), + ("NumADChannels", "adChannelCount"), ("ADChannel", "adChannel"), + ("WaveformLength", "waveformSamples"), ("AlignmentPt", "alignmentPoint"), + ("DspLowCutNumTaps", "dspLowCutNumTaps"), ("DspHighCutNumTaps", "dspHighCutNumTaps"), +) +_FLOATS = ( + ("SamplingFrequency", "samplingRateHz"), ("ADBitVolts", "adBitVolts"), + ("DspLowCutFrequency", "dspLowCutFrequencyHz"), + ("DspHighCutFrequency", "dspHighCutFrequencyHz"), +) +_BOOLS = ( + ("DSPLowCutFilterEnabled", "dspLowCutFilterEnabled"), + ("DSPHighCutFilterEnabled", "dspHighCutFilterEnabled"), + ("InputInverted", "inputInverted"), + ("DspDelayCompensation", "dspDelayCompensation"), +) +# File type to the kind of record that follows the header. +_RECORD_KINDS = { + "CSC": "continuous", "Event": "event", "Spike": "spike", "Video": "video", +} + + +def _first(values: Optional[List[str]]) -> Optional[str]: + """Several channels in one file repeat a key once per channel; the first is + the one a single-value field can carry. Cheetah quotes any value that holds + spaces, and the quotes are not part of it.""" + if not values: + return None + value = values[0] + if len(value) >= 2 and value[0] == '"' and value[-1] == '"': + return value[1:-1] + return value + + +def _number(text: str) -> Optional[float]: + """A value that may be a bare number or a space-separated per-channel list; + the first entry is taken.""" + token = text.split(" ")[0].strip() + try: + return _finite(float(token)) + except ValueError: + return None + + +def _iso(date: str, time: str) -> Optional[str]: + """`11/28/2016` plus `21:50:33.322` to ISO-8601, or `2017/02/16` plus + `17:56:04` from the property form.""" + if "/" in date: + parts = date.split("/") + if len(parts) != 3: + return None + if len(parts[0]) == 4: + year, month, day = parts + else: + month, day, year = parts + elif "-" in date: + split = date.split("-") + if len(split) != 3: + return None + year, month, day = split + else: + return None + try: + y, m, d = int(year), int(month), int(day) + except ValueError: + return None + if not (1 <= m <= 12 and 1 <= d <= 31): + return None + clock = time.split(":") + if len(clock) != 3: + return None + try: + hh, mm = int(clock[0]), int(clock[1]) + ss = float(clock[2]) + except ValueError: + return None + if hh > 23 or mm > 59 or ss >= 61: + return None + seconds = f"{ss:06.3f}".rstrip("0").rstrip(".") if ss % 1 else f"{int(ss):02d}" + return f"{y:04d}-{m:02d}-{d:02d}T{hh:02d}:{mm:02d}:{seconds}" + + +def decode_neuralynx(data: bytes) -> Optional[DecodedHeader]: + if not data.startswith(_MAGIC): + return None + header = data[:NEURALYNX_HEADER_BYTES].split(b"\x00", 1)[0].decode("latin-1") + if "Neuralynx" not in header[:256]: + return None + + properties: Dict[str, List[str]] = {} + fields: Dict[str, object] = {} + for line in header.splitlines(): + line = line.rstrip() + if not line: + continue + name = _FILENAME.match(line) + if name: + fields.setdefault("originalFileName", name.group(1).strip()) + continue + stamp = _TIMESTAMP.match(line) + if stamp: + when = _iso(stamp.group(2), stamp.group(3)) + if when: + fields["timeOpened" if stamp.group(1) == "Opened" else "timeClosed"] = when + continue + prop = _PROPERTY.match(line) + if prop: + properties.setdefault(prop.group(1), []).append(prop.group(2).strip()) + + for key, name in _STRINGS: + value = _first(properties.get(key)) + if value: + fields[name] = value + for key, name in _INTS: + value = _first(properties.get(key)) + if value is None: + continue + number = _number(value) + if number is not None and number == int(number): + fields[name] = int(number) + for key, name in _FLOATS: + value = _first(properties.get(key)) + if value is None: + continue + number = _number(value) + if number is not None: + fields[name] = number + for key, name in _BOOLS: + value = _first(properties.get(key)) + if value in ("True", "False"): + fields[name] = value == "True" + for key, name in (("InputRange", "inputRange"), ("OriginalFileName", "originalFileName")): + value = _first(properties.get(key)) + if value: + fields[name] = value + + # Application and version: `-CheetahRev 5.5.1` on older files, + # `-ApplicationName Cheetah "5.7.4"` on newer ones. + revision = _first(properties.get("CheetahRev")) + application = _first(properties.get("ApplicationName")) + if revision: + fields["applicationName"] = "Cheetah" + fields["applicationVersion"] = revision + elif application: + match = _APPLICATION.match(application) + if match: + fields["applicationName"], fields["applicationVersion"] = match.group(1), match.group(2) + else: + fields["applicationName"] = application + elif "baseClassType" in fields: + fields["applicationName"] = "BML" + + for key, name in (("TimeCreated", "timeOpened"), ("TimeClosed", "timeClosed")): + value = _first(properties.get(key)) + if not value: + continue + parts = value.split() + if len(parts) == 2: + when = _iso(parts[0], parts[1]) + if when: + fields[name] = when + + bit_volts = fields.get("adBitVolts") + if isinstance(bit_volts, float) and bit_volts > 0: + microvolts = _finite(bit_volts * 1e6) + if microvolts is not None: + fields["microvoltsPerBit"] = microvolts + file_type = fields.get("fileType") + if isinstance(file_type, str) and file_type in _RECORD_KINDS: + fields["recordKind"] = _RECORD_KINDS[file_type] + fields["headerBytes"] = NEURALYNX_HEADER_BYTES + fields["propertyCount"] = len(properties) + if properties: + fields["propertyNames"] = sorted(properties)[:_FIELD_CAP] + + parts = [f"Neuralynx {file_type or 'file'}"] + channel = fields.get("channelName") + if channel: + parts.append(str(channel)) + rate = fields.get("samplingRateHz") + if isinstance(rate, float): + parts.append(f"{str(int(rate)) if rate == int(rate) else f'{rate:g}'} Hz") + application_name = fields.get("applicationName") + if application_name: + version = fields.get("applicationVersion") + parts.append(f"{application_name} {version}" if version else str(application_name)) + return DecodedHeader(format="neuralynx", summary=", ".join(parts), fields=fields) + + +register_decoder( + ["ncs", "nev", "nse", "ntt", "nvt"], + decode_neuralynx, + read=Read(leading=NEURALYNX_HEADER_BYTES), +) diff --git a/src/scigantic_headers/openephys.py b/src/scigantic_headers/openephys.py new file mode 100644 index 0000000..ff3d6d8 --- /dev/null +++ b/src/scigantic_headers/openephys.py @@ -0,0 +1,167 @@ +"""Open Ephys binary-format recording manifest (`structure.oebin`) decoding. + +The Open Ephys GUI's binary format writes each recording as a directory: raw +`continuous.dat` matrices, event and spike directories, and one JSON manifest +named `structure.oebin` that describes all of them. The matrices carry no +header of their own, so the manifest is the only description of the sample +rate, the channel count and the per-channel scaling that exists. + +One manifest covers every stream a record node wrote, so a Neuropixels session +lists AP and LF side by side with the event lines. Per-channel entries run to +hundreds of KB; this reports what is uniform across a stream (scaling, units) +and the counts, not the per-channel table. + +Format: https://open-ephys.github.io/gui-docs/User-Manual/Recording-data/Binary-format.html +""" + +import json +from typing import Dict, List, Optional + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# A 384-channel stream is ~100 KB of per-channel entries; a record node with +# several probes is several times that. A manifest past this cannot be parsed +# as JSON at all, so the decoder declines rather than describe half of one. +OPENEPHYS_READ_BYTES = 2 * 1024 * 1024 + +_STREAM_DETAIL = 16 +_EVENT_DETAIL = 16 + + +def _number(value: object) -> Optional[float]: + if isinstance(value, bool) or not isinstance(value, (int, float)): + return None + return _finite(float(value)) + + +def _uniform(entries: List[dict], key: str) -> Optional[object]: + """The one value every channel in a stream agrees on, or None when they + differ. Reporting a mixed scaling as if it were a single number would be + worse than reporting none.""" + seen = {e.get(key) for e in entries if isinstance(e, dict) and e.get(key) not in (None, "")} + return seen.pop() if len(seen) == 1 else None + + +def _continuous(entry: dict) -> Dict[str, object]: + out: Dict[str, object] = {} + for key, name in ( + ("folder_name", "folderName"), ("stream_name", "streamName"), + ("source_processor_name", "sourceProcessorName"), + ("recorded_processor", "recordedProcessor"), + ): + value = entry.get(key) + if isinstance(value, str) and value: + out[name] = value + for key, name in ( + ("source_processor_id", "sourceProcessorId"), + ("recorded_processor_id", "recordedProcessorId"), + ("num_channels", "channelCount"), + ): + value = entry.get(key) + if isinstance(value, int) and not isinstance(value, bool): + out[name] = value + rate = _number(entry.get("sample_rate")) + if rate is not None: + out["samplingRateHz"] = rate + channels = [c for c in entry.get("channels", []) if isinstance(c, dict)] + if channels: + out["channelsListed"] = len(channels) + bit_volts = _number(_uniform(channels, "bit_volts")) + if bit_volts is not None: + out["bitVolts"] = bit_volts + units = _uniform(channels, "units") + if isinstance(units, str): + out["units"] = units + first = channels[0].get("channel_name") + if isinstance(first, str) and first: + out["firstChannelName"] = first + return out + + +def _event(entry: dict) -> Dict[str, object]: + out: Dict[str, object] = {} + for key, name in ( + ("folder_name", "folderName"), ("channel_name", "channelName"), + ("type", "type"), ("stream_name", "streamName"), + ("source_processor", "sourceProcessor"), ("description", "description"), + ): + value = entry.get(key) + if isinstance(value, str) and value: + out[name] = value + for key, name in (("num_channels", "channelCount"),): + value = entry.get(key) + if isinstance(value, int) and not isinstance(value, bool): + out[name] = value + rate = _number(entry.get("sample_rate")) + if rate is not None: + out["samplingRateHz"] = rate + return out + + +def decode_openephys_oebin(data: bytes) -> Optional[DecodedHeader]: + try: + manifest = json.loads(data.decode("utf-8", "replace")) + except ValueError: + return None + if not isinstance(manifest, dict): + return None + # A manifest always declares at least one of the three record classes, and + # nothing else writes this shape, so requiring one keeps a stray JSON out. + if not any(isinstance(manifest.get(k), list) for k in ("continuous", "events", "spikes")): + return None + + fields: Dict[str, object] = {} + version = manifest.get("GUI version") + if isinstance(version, str) and version: + fields["guiVersion"] = version + + continuous = [e for e in manifest.get("continuous", []) if isinstance(e, dict)] + events = [e for e in manifest.get("events", []) if isinstance(e, dict)] + spikes = [e for e in manifest.get("spikes", []) if isinstance(e, dict)] + if not (continuous or events or spikes) and "GUI version" not in manifest: + return None + + fields["continuousStreams"] = len(continuous) + fields["eventStreams"] = len(events) + fields["spikeStreams"] = len(spikes) + + described = [_continuous(e) for e in continuous] + if described: + fields["continuous"] = described[:_STREAM_DETAIL] + total = sum(int(d["channelCount"]) for d in described if isinstance(d.get("channelCount"), int)) + if total: + fields["totalContinuousChannels"] = total + rates = {d["samplingRateHz"] for d in described if isinstance(d.get("samplingRateHz"), float)} + if len(rates) == 1: + fields["samplingRateHz"] = rates.pop() + elif rates: + fields["samplingRatesHz"] = sorted(rates) + names = [d["streamName"] for d in described if isinstance(d.get("streamName"), str)] + if names: + fields["streamNames"] = names[:_STREAM_DETAIL] + processors = sorted({ + d["sourceProcessorName"] for d in described if isinstance(d.get("sourceProcessorName"), str) + }) + if processors: + fields["sourceProcessors"] = processors[:_STREAM_DETAIL] + if events: + fields["events"] = [_event(e) for e in events][:_EVENT_DETAIL] + if spikes: + fields["spikes"] = [_event(e) for e in spikes][:_EVENT_DETAIL] + + parts = ["Open Ephys recording"] + if continuous: + plural = "" if len(continuous) == 1 else "s" + parts.append(f"{len(continuous)} continuous stream{plural}") + if total: + parts.append(f"{total} channels") + rate = fields.get("samplingRateHz") + if isinstance(rate, float): + parts.append(f"{str(int(rate)) if rate == int(rate) else f'{rate:g}'} Hz") + if events: + plural = "" if len(events) == 1 else "s" + parts.append(f"{len(events)} event stream{plural}") + return DecodedHeader(format="openephys-oebin", summary=", ".join(parts), fields=fields) + + +register_decoder(["oebin"], decode_openephys_oebin, read=Read(leading=OPENEPHYS_READ_BYTES)) diff --git a/src/scigantic_headers/spikeglx.py b/src/scigantic_headers/spikeglx.py new file mode 100644 index 0000000..e1b1660 --- /dev/null +++ b/src/scigantic_headers/spikeglx.py @@ -0,0 +1,261 @@ +"""SpikeGLX run metadata (`.meta`) decoding. + +SpikeGLX is the acquisition program for Neuropixels probes. Every binary it +writes has a `.meta` sidecar beside it: plain `key=value` lines, no sections, +holding the sample rate, the channel layout, the probe identity and the run's +size and duration. The binary itself is a headerless int16 matrix, so this +sidecar is the only description of it that exists. + +`.meta` is a generic extension, so this declines anything that does not carry +SpikeGLX's own required keys (`nSavedChans` plus one of the sample-rate keys). + +Keys prefixed with `~` hold a parenthesised table, one entry per channel +(`imroTbl`, `snsChanMap`, `snsGeomMap`). Those run to tens of KB and say +nothing a record needs, so only their entry counts are reported. + +Reference: https://billkarsh.github.io/SpikeGLX/Sgl_help/Metadata_30.html +""" + +import re +from typing import Dict, List, Optional + +from .decoders import DecodedHeader, Read, _finite, register_decoder + +# The per-channel tables dominate the file: a 384-channel snsGeomMap is ~20 KB, +# and a 4-shank run with every table present is larger again. +SPIKEGLX_READ_BYTES = 256 * 1024 + +_SAMPLE_RATE_KEYS = ("imSampRate", "niSampRate", "obSampRate") +# `_g_t`, which is how SpikeGLX names every file it writes. +_RUN = re.compile(r"^(?P.+)_g(?P\d+)_t(?P\d+|cat)$") +_TABLE_ENTRY = re.compile(r"\)\(") + +# imDatPrb_type values documented in the metadata reference. Only the three +# that are unambiguous are named; any other type is reported as its number +# and its part number, which the probe table resolves exactly. +_PROBE_MODELS = { + 0: "Neuropixels 1.0", + 21: "Neuropixels 2.0 (1 shank)", + 24: "Neuropixels 2.0 (4 shank)", +} + +# Verbatim keys worth carrying into a record, with the name they take there. +_STRINGS = ( + ("typeThis", "streamType"), ("appVersion", "appVersion"), + ("fileName", "originalFileName"), ("fileCreateTime", "fileCreateTime"), + ("gateMode", "gateMode"), ("trigMode", "trigMode"), + ("imDatPrb_pn", "probePartNumber"), ("imDatPrb_sn", "probeSerial"), + ("imDatApi", "imecApiVersion"), ("imDatBsc_pn", "basestationPartNumber"), + ("imDatHs_pn", "headstagePartNumber"), ("snsSaveChanSubset", "savedChannelSubset"), + ("imRoFile", "imroFile"), ("imCalibrated", "calibrated"), +) +_INTS = ( + ("nSavedChans", "channelCount"), ("fileSizeBytes", "fileSizeBytes"), + ("firstSample", "firstSample"), ("imMaxInt", "maxInt"), + ("imDatPrb_type", "probeType"), ("imDatPrb_slot", "probeSlot"), + ("imDatPrb_port", "probePort"), ("imDatPrb_dock", "probeDock"), +) +_FLOATS = ( + ("fileTimeSecs", "durationSeconds"), ("imAiRangeMax", "analogRangeMaxVolts"), + ("imAiRangeMin", "analogRangeMinVolts"), ("niAiRangeMax", "analogRangeMaxVolts"), +) + + +def _parse(text: str) -> Dict[str, str]: + out: Dict[str, str] = {} + for line in text.splitlines(): + key, sep, value = line.partition("=") + if not sep: + continue + out[key.strip()] = value.strip() + return out + + +def _int(meta: Dict[str, str], key: str) -> Optional[int]: + raw = meta.get(key) + if raw is None: + return None + try: + return int(raw) + except ValueError: + return None + + +def _float(meta: Dict[str, str], key: str) -> Optional[float]: + raw = meta.get(key) + if raw is None: + return None + try: + return _finite(float(raw)) + except ValueError: + return None + + +def _counts(meta: Dict[str, str], key: str, names: List[str]) -> Dict[str, object]: + """A comma-separated channel-count triple (`snsApLfSy` = AP, LF, sync) into + named fields.""" + raw = meta.get(key) + if not raw: + return {} + parts = raw.split(",") + if len(parts) != len(names): + return {} + out: Dict[str, object] = {} + for name, part in zip(names, parts): + try: + out[name] = int(part) + except ValueError: + return {} + return out + + +def _table_entries(value: str) -> Optional[int]: + """Entries in a `~key=(header)(e1)(e2)...` table, not counting the leading + header element.""" + if not value.startswith("(") or not value.endswith(")"): + return None + return len(_TABLE_ENTRY.findall(value)) + + +def _stream_kind(name: str) -> Dict[str, object]: + """Run name, gate and trigger index, device and stream, read back out of + the original file name SpikeGLX recorded.""" + stem = name.replace("\\", "/").rsplit("/", 1)[-1] + if stem.lower().endswith(".bin"): + stem = stem[:-4] + parts = stem.split(".") + out: Dict[str, object] = {} + if len(parts) > 1 and parts[-1] in ("ap", "lf"): + out["stream"] = parts[-1] + parts = parts[:-1] + if len(parts) > 1 and (parts[-1].startswith("imec") or parts[-1].startswith("obx") or parts[-1] == "nidq"): + out["device"] = parts[-1] + parts = parts[:-1] + run = _RUN.match(parts[0]) + if run: + out["runName"] = run.group("run") + out["gateIndex"] = int(run.group("gate")) + if run.group("trigger") != "cat": + out["triggerIndex"] = int(run.group("trigger")) + else: + out["concatenated"] = True + elif parts[0]: + out["runName"] = parts[0] + return out + + +def _microvolts_per_bit(meta: Dict[str, str], fields: Dict[str, object]) -> Optional[float]: + """Volts per ADC count scaled to microvolts, for the two cases the metadata + reference defines without consulting the probe table. + + Neuropixels 1.0 divides the full-scale range by 512 counts and by the AP + gain in the first `imroTbl` entry. Neuropixels 2.0 has a fixed gain and + divides by `imMaxInt` instead. Any other probe is left alone rather than + guessed at.""" + full_scale = fields.get("analogRangeMaxVolts") + if not isinstance(full_scale, float) or full_scale <= 0: + return None + probe_type = fields.get("probeType") + if probe_type == 0: + gain = fields.get("apGain") + if not isinstance(gain, (int, float)) or gain <= 0: + return None + return _finite(full_scale * 1e6 / 512.0 / float(gain)) + max_int = fields.get("maxInt") + if probe_type in (21, 24) and isinstance(max_int, int) and max_int > 0: + gain = _float(meta, "imChan0apGain") or 80.0 + if gain <= 0: + return None + return _finite(full_scale * 1e6 / max_int / gain) + return None + + +def decode_spikeglx_meta(data: bytes) -> Optional[DecodedHeader]: + meta = _parse(data.decode("latin-1")) + if "nSavedChans" not in meta: + return None + rate_key = next((k for k in _SAMPLE_RATE_KEYS if k in meta), None) + if rate_key is None: + return None + + fields: Dict[str, object] = {} + for key, name in _STRINGS: + if meta.get(key): + fields[name] = meta[key] + for key, name in _INTS: + value = _int(meta, key) + if value is not None: + fields[name] = value + for key, name in _FLOATS: + if name in fields: + continue + value = _float(meta, key) + if value is not None: + fields[name] = value + + rate = _float(meta, rate_key) + if rate: + fields["samplingRateHz"] = rate + fields.update(_counts(meta, "snsApLfSy", ["apChannels", "lfChannels", "syncChannels"])) + fields.update(_counts(meta, "snsXaDwSy", ["analogChannels", "digitalChannels", "syncChannels"])) + fields.update(_counts(meta, "snsMnMaXaDw", ["multiplexedChannels", "auxAnalogChannels", "analogChannels", "digitalChannels"])) + fields.update(_counts(meta, "acqApLfSy", ["acquiredApChannels", "acquiredLfChannels", "acquiredSyncChannels"])) + + channels = fields.get("channelCount") + size = fields.get("fileSizeBytes") + if isinstance(channels, int) and channels > 0 and isinstance(size, int) and size > 0: + # The binary is int16, one sample per channel per tick, no header. + fields["sampleCount"] = size // 2 // channels + + if isinstance(fields.get("probeType"), int): + model = _PROBE_MODELS.get(fields["probeType"]) + if model: + fields["probeModel"] = model + + for key in ("imroTbl", "snsChanMap", "snsGeomMap", "snsShankMap"): + entries = _table_entries(meta.get("~" + key, "")) + if entries: + fields[key + "Entries"] = entries + # The first imroTbl row is `chan bank refid apgain lfgain apfilt` on a 1.0 + # probe; a 2.0 row is shorter and carries no gain, which this skips. + imro = meta.get("~imroTbl", "") + if imro.startswith("("): + rows = imro[1:-1].split(")(") if imro.endswith(")") else [] + if len(rows) > 1: + row = rows[1].split(" ") + if len(row) >= 6: + try: + fields["apGain"] = int(row[3]) + fields["lfGain"] = int(row[4]) + except ValueError: + pass + + uv = _microvolts_per_bit(meta, fields) + if uv is not None: + fields["microvoltsPerBit"] = uv + if meta.get("fileName"): + fields.update(_stream_kind(meta["fileName"])) + fields["keyCount"] = len(meta) + + kind = fields.get("streamType") or "spikeglx" + stream = fields.get("stream") + label = f"SpikeGLX {kind}{'.' + str(stream) if stream else ''}" + parts = [label] + if isinstance(channels, int): + parts.append(f"{channels} channels") + if rate: + parts.append(f"{_number(rate)} Hz") + duration = fields.get("durationSeconds") + if isinstance(duration, float): + parts.append(f"{_number(duration)} s") + model = fields.get("probeModel") or fields.get("probePartNumber") + if model: + parts.append(str(model)) + return DecodedHeader(format="spikeglx", summary=", ".join(parts), fields=fields) + + +def _number(value: float) -> str: + return str(int(value)) if value == int(value) else f"{value:g}" + + +register_decoder(["meta"], decode_spikeglx_meta, read=Read(leading=SPIKEGLX_READ_BYTES)) diff --git a/tests/fixtures/bids-cases.json b/tests/fixtures/bids-cases.json new file mode 100644 index 0000000..9dd331f --- /dev/null +++ b/tests/fixtures/bids-cases.json @@ -0,0 +1,425 @@ +{ + "_comment": "Real sidecars from the bids-standard/bids-examples corpus (master). The whole corpus was swept at generation time: 5853 files decoded with no exception, and the 328 that declined are headerless derivative tables (motion, timeseries, mixing, physio) and non-core derivative JSON, which this decoder is not meant to claim.", + "cases": [ + { + "name": "ds000248/dataset_description.json (MNE sample dataset description)", + "key": "dataset_description.json", + "hex": "7b0a20202020224e616d65223a20224d4e452073616d706c652064617461736574222c0a20202020224249445356657273696f6e223a2022312e342e30222c0a20202020224461746173657454797065223a2022726177222c0a20202020224c6963656e7365223a2022434330222c0a2020202022417574686f7273223a205b0a202020202020202022416c6578616e647265204772616d666f7274222c0a2020202020202020224d61747469205320485c75303065346d5c75303065346c5c7530306534696e656e220a202020205d2c0a202020202241636b6e6f776c656467656d656e7473223a2022416c6578616e647265204772616d666f72742c204d61696e616b204a61732c20616e642053746566616e20417070656c686f666620707265706172656420616e64207570646174656420746865206461746120696e204249445320666f726d61742e222c0a2020202022486f77546f41636b6e6f776c65646765223a2022496620796f75207265666572656e63652074686973206461746173657420696e2061207075626c69636174696f6e2c20706c656173652061636b6e6f776c656467652069747320617574686f727320616e642063697465204d4e45207061706572733a20412e204772616d666f72742c204d2e204c75657373692c20452e204c6172736f6e2c20442e20456e67656d616e6e2c20442e205374726f686d656965722c20432e2042726f646265636b2c204c2e205061726b6b6f6e656e2c204d2e20485c75303065346d5c75303065346c5c7530306534696e656e2c204d4e4520736f66747761726520666f722070726f63657373696e67204d454720616e642045454720646174612c204e6575726f496d6167652c20566f6c756d652038362c203120466562727561727920323031342c205061676573203434362d3436302c204953534e20313035332d3831313920616e6420412e204772616d666f72742c204d2e204c75657373692c20452e204c6172736f6e2c20442e20456e67656d616e6e2c20442e205374726f686d656965722c20432e2042726f646265636b2c20522e20476f6a2c204d2e204a61732c20542e2042726f6f6b732c204c2e205061726b6b6f6e656e2c204d2e20485c75303065346d5c75303065346c5c7530306534696e656e2c204d454720616e6420454547206461746120616e616c797369732077697468204d4e452d507974686f6e2c2046726f6e746965727320696e204e6575726f736369656e63652c20566f6c756d6520372c20323031332c204953534e20313636322d34353358222c0a202020202246756e64696e67223a205b0a2020202020202020224e494820355230314542303039303438222c0a2020202020202020224e494820315230314542303039303438222c0a2020202020202020224e4948205230314542303036333835222c0a2020202020202020224e4948203152303148443430373132222c0a2020202020202020224e494820315230314e533434333139222c0a2020202020202020224e494820325230314e533337343632222c0a2020202020202020224e4948205034314542303135383936222c0a202020202020202022414e522d31312d494445582d303030332d3032222c0a2020202020202020224552432d5374472d323633353834222c0a2020202020202020224552432d5374472d363736393433222c0a202020202020202022414e522d31342d4e4555432d303030322d3031220a202020205d2c0a20202020225265666572656e636573416e644c696e6b73223a205b0a20202020202020202268747470733a2f2f646f692e6f72672f31302e313031362f6a2e6e6575726f696d6167652e323031342e30322e303137222c0a20202020202020202268747470733a2f2f646f692e6f72672f31302e333338392f666e696e732e323031332e3030323637222c0a20202020202020202268747470733a2f2f6d6e652e746f6f6c732f737461626c652f6f766572766965772f64617461736574735f696e6465782e68746d6c2373616d706c65220a202020205d2c0a202020202244617461736574444f49223a202231302e31383131322f6f70656e6e6575726f2e64733030303234382e76312e322e34220a7d0a", + "expected": { + "format": "bids-dataset", + "summary": "BIDS dataset, MNE sample dataset, BIDS 1.4.0, raw", + "fields": { + "bidsFileType": "datasetDescription", + "Name": "MNE sample dataset", + "BIDSVersion": "1.4.0", + "DatasetType": "raw", + "License": "CC0", + "DatasetDOI": "10.18112/openneuro.ds000248.v1.2.4", + "authorsCount": 2, + "authors": [ + "Alexandre Gramfort", + "Matti S H\u00e4m\u00e4l\u00e4inen" + ], + "fundingCount": 11, + "funding": [ + "NIH 5R01EB009048", + "NIH 1R01EB009048", + "NIH R01EB006385", + "NIH 1R01HD40712", + "NIH 1R01NS44319", + "NIH 2R01NS37462", + "NIH P41EB015896", + "ANR-11-IDEX-0003-02", + "ERC-StG-263584", + "ERC-StG-676943", + "ANR-14-NEUC-0002-01" + ], + "referencesAndLinksCount": 3, + "referencesAndLinks": [ + "https://doi.org/10.1016/j.neuroimage.2014.02.017", + "https://doi.org/10.3389/fnins.2013.00267", + "https://mne.tools/stable/overview/datasets_index.html#sample" + ], + "Acknowledgements": "Alexandre Gramfort, Mainak Jas, and Stefan Appelhoff prepared and updated the data in BIDS format.", + "HowToAcknowledge": "If you reference this dataset in a publication, please acknowledge its authors and cite MNE papers: A. Gramfort, M. Luessi, E. Larson, D. Engemann, D. Strohmeier, C. Brodbeck, L. Parkkonen, M. H\u00e4m\u00e4l\u00e4inen, MNE software for processing MEG and EEG data, NeuroImage, Volume 86, 1 February 2014, Pages 446-460, ISSN 1053-8119 and A. Gramfort, M. Luessi, E. Larson, D. Engemann, D. Strohmeier, C. Brodbeck, R. Goj, M. Jas, T. Brooks, L. Parkkonen, M. H\u00e4m\u00e4l\u00e4inen, MEG and EEG data analysis with MNE-Python, Frontiers in", + "keyCount": 10 + } + } + }, + { + "name": "ds001/participants.tsv (participant table)", + "key": "participants.tsv", + "hex": "7061727469636970616e745f696409736578096167650a7375622d303109460932360a7375622d3032094d0932340a7375622d303309460932370a7375622d303409460932300a7375622d3035094d0932320a7375622d303609460932360a7375622d3037094d0932340a7375622d3038094d0932310a7375622d3039094d0932360a7375622d313009460932310a7375622d313109460932340a7375622d313209460932320a7375622d313309460932310a7375622d313409460933300a7375622d313509460932340a7375622d3136094d0931390a", + "expected": { + "format": "bids-table", + "summary": "BIDS participants table, 16 participants, 3 columns", + "fields": { + "bidsFileType": "participants", + "columnCount": 3, + "columns": [ + "participant_id", + "sex", + "age" + ], + "rowsRead": 16, + "rowsComplete": true, + "participantCount": 16 + } + } + }, + { + "name": "ds001/sub-01/func/sub-01_task-balloonanalogrisktask_run-01_events.tsv (events with trial_type)", + "key": "sub-01_task-balloonanalogrisktask_run-01_events.tsv", + "hex": "6f6e736574096475726174696f6e09747269616c5f7479706509636173685f64656d65616e09636f6e74726f6c5f70756d70735f64656d65616e096578706c6f64655f64656d65616e0970756d70735f64656d65616e09726573706f6e73655f74696d650a302e30363109302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009322e3432300a342e39353809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3537380a372e31373909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3736360a31302e34313609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009302e3834300a31332e34313909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009312e3436320a31362e37353409302e373732096578706c6f64655f64656d65616e096e2f61096e2f6109312e373030096e2f61096e2f610a32342e39303509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009312e3239350a32372e34353409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009312e3038330a33302e31313109302e37373209636173685f64656d65616e092d342e303030096e2f61096e2f61096e2f6109312e3439380a33382e34343909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e35303009302e3635360a34312e30323809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009302e3635320a34342e35323909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009302e3836340a34372e36393209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e35303009312e3930390a35312e31303209302e37373209636173685f64656d65616e092d322e303030096e2f61096e2f61096e2f6109312e3033350a35392e30333109302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009302e3833330a36312e38353009302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3533360a36332e35313609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009312e3038350a36372e30303709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009302e3738360a36392e36393309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009322e3033360a37342e32383609302e37373209636173685f64656d65616e092d312e303030096e2f61096e2f61096e2f6109302e3630330a38322e39343009302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e35303009312e3130390a38362e31323409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e35303009302e3534310a38382e36343809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009312e3030310a39312e36343209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009312e3337350a39342e37343209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e35303009312e3333310a39382e39383909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e35303009312e3534390a3130322e34313609302e37373209636173685f64656d65616e09302e303030096e2f61096e2f61096e2f6109322e3030390a3130382e34343509302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d352e303030096e2f61096e2f6109312e3035330a3131312e33303809302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d342e303030096e2f61096e2f6109302e3333330a3131342e30343409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d332e303030096e2f61096e2f6109302e3237300a3131372e33303209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e303030096e2f61096e2f6109302e3430340a3132302e36333809302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e303030096e2f61096e2f6109302e3333320a3132332e30393609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e303030096e2f61096e2f6109302e3631300a3132342e39313509302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e303030096e2f61096e2f6109312e3038370a3132382e34323909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e303030096e2f61096e2f6109312e3032390a3133302e36383709302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109332e303030096e2f61096e2f6109312e3639390a3133332e39313909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109342e303030096e2f61096e2f6109302e3334370a3133362e30333409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109352e303030096e2f61096e2f6109312e3635350a3135322e33373909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009312e3332370a3135362e32383709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009302e3337310a3135372e38393909302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d312e333030096e2f61096e2f610a3136322e32343109302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d332e30303009302e3534350a3136352e37333209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009312e3031360a3136382e37363309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3633390a3137312e37383609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3536380a3137342e32313309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009312e3034350a3137372e36323709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009302e3735390a3137392e35303209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109332e30303009312e3235320a3138322e34393009302e37373209636173685f64656d65616e09312e303030096e2f61096e2f61096e2f6109312e3330340a3139302e35313709302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d352e353030096e2f61096e2f6109302e3531370a3139332e35393509302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d342e353030096e2f61096e2f6109302e3338330a3139362e35363009302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d332e353030096e2f61096e2f6109302e3431300a3139392e38333709302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e353030096e2f61096e2f6109302e3339370a3230312e38383609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e353030096e2f61096e2f6109302e3538380a3230352e34383209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d302e353030096e2f61096e2f6109302e3837320a3230392e33363209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e353030096e2f61096e2f6109312e3539350a3231332e38313309302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e353030096e2f61096e2f6109322e3335380a3231392e31313609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e353030096e2f61096e2f6109312e3131300a3232322e38393909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109332e353030096e2f61096e2f6109312e3837320a3232352e39363609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109342e353030096e2f61096e2f6109312e3236390a3232382e38343209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109352e353030096e2f61096e2f6109302e3737370a3233392e39313609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d352e30303009302e3732370a3234322e35373709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d342e30303009302e3538360a3234342e34383809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d332e30303009302e3835390a3234382e31323009302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009302e3336330a3234392e38303809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3731350a3235312e38323809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3631350a3235342e33383309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009302e3633360a3235362e37383609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009312e3137310a3236302e31303209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109332e30303009302e3833300a3236322e33323909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109342e30303009312e3234320a3236352e33333309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109352e30303009312e3131370a3236392e32313809302e373732096578706c6f64655f64656d65616e096e2f61096e2f6109372e373030096e2f61096e2f610a3237352e34373509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d342e30303009302e3439370a3237372e37343409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d332e30303009302e3639310a3237392e37303209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009302e3833300a3238332e32313609302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009312e3134300a3238352e37313509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3834300a3238382e37333909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009302e3733300a3239312e38333709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009302e3737350a3239332e37323709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109332e30303009312e3037370a3239362e38353909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109342e30303009312e3236340a3239392e38353709302e37373209636173685f64656d65616e09332e303030096e2f61096e2f61096e2f6109302e3836360a3330362e31303509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009312e3033340a3330392e39333009302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d322e333030096e2f61096e2f610a3331382e32333509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3630390a3332302e34343209302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d322e333030096e2f61096e2f610a3333312e31363709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d332e30303009302e3830340a3333332e39393809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009302e3834370a3333372e38363409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3936340a3334312e30393309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3931390a3334332e31323409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009312e3739320a3334362e37363209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009302e3838320a3335302e34323409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109332e30303009312e3135360a3335332e36383209302e37373209636173685f64656d65616e09312e303030096e2f61096e2f61096e2f6109302e3833340a3335382e38333909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009302e3832390a3336322e32343809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009312e3030340a3336342e36323609302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d312e333030096e2f61096e2f610a3336392e38373709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d342e30303009302e3339320a3337312e39313909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d332e30303009302e3730390a3337342e33363709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009312e3532360a3337382e31333109302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009302e3639370a3338312e34343909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3838340a3338332e35303309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009312e3130390a3338372e30393709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009312e3530380a3339302e35313409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109332e30303009302e3831390a3339322e37373809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109342e30303009312e3235310a3339352e34333609302e37373209636173685f64656d65616e09332e303030096e2f61096e2f61096e2f6109312e3034380a3430362e30373109302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e303030096e2f61096e2f6109312e3135380a3430382e34353709302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e303030096e2f61096e2f6109302e3436300a3431302e35353309302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e303030096e2f61096e2f6109302e3436390a3431322e39333009302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e303030096e2f61096e2f6109302e3337310a3431352e36363009302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e303030096e2f61096e2f6109302e3332310a3432322e34363309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d322e30303009302e3833300a3432352e30373309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e30303009312e3038340a3432372e33373409302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009312e3136370a3433302e36323209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e30303009312e3933350a3433332e39363509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109322e30303009312e3833320a3433372e35333009302e37373209636173685f64656d65616e092d312e303030096e2f61096e2f61096e2f6109312e3831310a3434372e38393909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d332e353030096e2f61096e2f6109312e3131350a3435302e31363409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e353030096e2f61096e2f6109302e3830320a3435332e36373809302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e353030096e2f61096e2f6109302e3536370a3435352e33383909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d302e353030096e2f61096e2f6109312e3436340a3435392e32323309302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e353030096e2f61096e2f6109302e3533350a3436302e39363109302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e353030096e2f61096e2f6109312e3632310a3436332e39373409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e353030096e2f61096e2f6109312e3836330a3436372e32363609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109332e353030096e2f61096e2f6109302e3636380a3437382e35333909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d342e353030096e2f61096e2f6109312e3230320a3438322e34393409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d332e353030096e2f61096e2f6109302e3536300a3438342e32343009302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e353030096e2f61096e2f6109312e3339300a3438382e34343409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e353030096e2f61096e2f6109302e3733300a3439312e30363409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d302e353030096e2f61096e2f6109302e3538320a3439342e35393409302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e353030096e2f61096e2f6109312e3330300a3439382e36333909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e353030096e2f61096e2f6109302e3736320a3530322e32393909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e353030096e2f61096e2f6109302e3637340a3530352e36323309302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109332e353030096e2f61096e2f6109312e3033310a3530382e30353509302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109342e353030096e2f61096e2f6109312e3635350a3532342e30363709302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d322e353030096e2f61096e2f6109302e3735350a3532372e30313609302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d312e353030096e2f61096e2f6109312e3231340a3533312e31373209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f61092d302e353030096e2f61096e2f6109302e3432360a3533332e37353209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109302e353030096e2f61096e2f6109312e3434360a3533372e34313209302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109312e353030096e2f61096e2f6109302e3832360a3533392e38323909302e37373209636f6e74726f6c5f70756d70735f64656d65616e096e2f6109322e353030096e2f61096e2f6109312e3032350a3534382e38333809302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e30303009302e3832350a3535322e34313809302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d322e333030096e2f61096e2f610a3535352e35393709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e35303009312e3133370a3535392e32303309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009302e3634340a3536312e35333709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009302e3836310a3536342e36373909302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e35303009302e3437320a3536362e39303909302e373732096578706c6f64655f64656d65616e096e2f61096e2f6109302e373030096e2f61096e2f610a3537312e37383309302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009302e3438300a3537352e32323209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009302e3438300a3537382e36303309302e373732096578706c6f64655f64656d65616e096e2f61096e2f61092d312e333030096e2f61096e2f610a3538362e34373509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d312e35303009302e3533310a3538392e35393209302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f61092d302e35303009302e3839350a3539332e35333709302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109302e35303009312e3037380a3539372e32353509302e3737320970756d70735f64656d65616e096e2f61096e2f61096e2f6109312e35303009302e3736380a3630302e34303909302e373732096578706c6f64655f64656d65616e096e2f61096e2f6109302e373030096e2f61096e2f610a", + "expected": { + "format": "bids-table", + "summary": "BIDS events table, 158 events, 8 columns", + "fields": { + "bidsFileType": "events", + "columnCount": 8, + "columns": [ + "onset", + "duration", + "trial_type", + "cash_demean", + "control_pumps_demean", + "explode_demean", + "pumps_demean", + "response_time" + ], + "rowsRead": 158, + "rowsComplete": true, + "onsetFirstSeconds": 0.061, + "onsetLastSeconds": 600.409, + "durationMinSeconds": 0.772, + "durationMaxSeconds": 0.772, + "trialTypes": { + "pumps_demean": 87, + "control_pumps_demean": 52, + "explode_demean": 10, + "cash_demean": 9 + }, + "trialTypesDistinct": 4 + } + } + }, + { + "name": "7t_trt/task-rest_acq-prefrontal_bold.json (fMRI BOLD sidecar with slice timing)", + "key": "task-rest_acq-prefrontal_bold.json", + "hex": "7b0a2020202022436f6741746c61734944223a202268747470733a2f2f7777772e636f676e697469766561746c61732e6f72672f69642f74726d5f34633861383334373739383833222c0a20202020224563686f54696d65223a20302e3032362c0a20202020224566666563746976654563686f53706163696e67223a20302e30303033323939383934343033333739303932342c0a20202020225068617365456e636f64696e67446972656374696f6e223a20226a2d222c0a202020202252657065746974696f6e54696d65223a20342e302c0a2020202022536c696365456e636f64696e67446972656374696f6e223a20226b222c0a2020202022536c69636554696d696e67223a205b0a2020202020202020332e3931352c0a2020202020202020332e3831352c0a2020202020202020332e3731352c0a2020202020202020332e3631352c0a2020202020202020332e3531352c0a2020202020202020332e3431332c0a2020202020202020332e3331322c0a2020202020202020332e3231322c0a2020202020202020332e3131322c0a2020202020202020332e3031332c0a2020202020202020322e3931332c0a2020202020202020322e38312c0a2020202020202020322e37312c0a2020202020202020322e36312c0a2020202020202020322e35312c0a2020202020202020322e34312c0a2020202020202020322e33312c0a2020202020202020322e32312c0a2020202020202020322e3130382c0a2020202020202020322e3030382c0a2020202020202020312e3930382c0a2020202020202020312e3830382c0a2020202020202020312e3730372c0a2020202020202020312e3630382c0a2020202020202020312e3530352c0a2020202020202020312e3430352c0a2020202020202020312e3330352c0a2020202020202020312e3230352c0a2020202020202020312e3130352c0a2020202020202020312e3030352c0a2020202020202020302e3930322c0a2020202020202020302e3830322c0a2020202020202020302e3730332c0a2020202020202020302e3630332c0a2020202020202020302e3530322c0a2020202020202020302e3430322c0a2020202020202020302e3330322c0a2020202020202020302e322c0a2020202020202020302e312c0a2020202020202020302e300a202020205d2c0a20202020225461736b4e616d65223a202252657374220a7d0a", + "expected": { + "format": "bids-sidecar", + "summary": "BIDS sidecar, mri, task Rest, 4 s TR", + "fields": { + "bidsFileType": "sidecar", + "bidsModality": "mri", + "TaskName": "Rest", + "RepetitionTime": 4.0, + "EchoTime": 0.026, + "SliceEncodingDirection": "k", + "PhaseEncodingDirection": "j-", + "EffectiveEchoSpacing": 0.00032998944033790924, + "sliceCount": 40, + "keyCount": 8, + "keys": [ + "CogAtlasID", + "EchoTime", + "EffectiveEchoSpacing", + "PhaseEncodingDirection", + "RepetitionTime", + "SliceEncodingDirection", + "SliceTiming", + "TaskName" + ] + } + } + }, + { + "name": "ds000117/acq-mprage_T1w.json (anatomical sidecar)", + "key": "acq-mprage_T1w.json", + "hex": "7b0a2022496e506c616e655068617365456e636f64696e67446972656374696f6e4449434f4d223a2022524f57222c0a2022496e76657273696f6e54696d65223a20302e392c0a2022496d616765436f6d6d656e7473223a202256222c0a202250726f636564757265537465704465736372697074696f6e223a20224342555f4e6575726f696d6167696e67222c0a202244657669636553657269616c4e756d626572223a20223335313139222c0a20224163717569736974696f6e4d61747269785045223a203234362c0a20224d616e756661637475726572734d6f64656c4e616d65223a20225472696f54696d222c0a202250726f746f636f6c4e616d65223a20224342555f4d5052414745222c0a202252657065746974696f6e54696d65223a20322e32352c0a20225068617365456e636f64696e675374657073223a203231352c0a20224d524163717569736974696f6e54797065223a20223344222c0a2022506172616c6c656c526564756374696f6e466163746f72496e506c616e65223a20322c0a2022536c696365546869636b6e657373223a20312c0a20224163717569736974696f6e4e756d626572223a20312c0a2022496e737469747574696f6e4e616d65223a20224d524320436f676e6974696f6e20616e6420427261696e20536369656e63657320556e6974222c0a20224477656c6c54696d65223a20382e35652d30362c0a202250756c736553657175656e636544657461696c73223a2022255369656d656e73536571255f74666c222c0a20225363616e6e696e6753657175656e6365223a202247525f4952222c0a20224d616e756661637475726572223a20225369656d656e73222c0a2022436f6e76657273696f6e536f667477617265223a202264636d326e696978222c0a202250657263656e745068617365464f56223a203130302c0a20225265636f6e4d61747269785045223a203235362c0a2022466c6970416e676c65223a20392c0a2022436f6e76657273696f6e536f66747761726556657273696f6e223a202276312e302e323031373132313520474343342e342e37222c0a20225365726965734465736372697074696f6e223a20224342555f4d5052414745222c0a20225061727469616c466f7572696572223a20302e3837352c0a2022496e737469747574696f6e41646472657373223a20223135204368617563657220526f61642c2043616d62726964676520434232203745462c20554b222c0a202253657175656e63654e616d65223a20225f74666c3364315f6e73222c0a20224d61676e657469634669656c64537472656e677468223a20332c0a2022496d61676554797065223a205b0a2020224f524947494e414c222c0a2020225052494d415259222c0a2020224d222c0a2020224e44222c0a2020224e4f524d220a205d2c0a202252656365697665436f696c4e616d65223a2022486561644d6174726978222c0a20224563686f54696d65223a20302e30303239382c0a202253657175656e636556617269616e74223a202253505f4d505f4f5350222c0a202250686173655265736f6c7574696f6e223a20302e39362c0a2022426173655265736f6c7574696f6e223a203235362c0a2022506978656c42616e647769647468223a203233302c0a20225363616e4f7074696f6e73223a202249525f504650222c0a2022536f66747761726556657273696f6e73223a202273796e676f5f4d525f423135222c0a202253746174696f6e4e616d65223a20224d52433335313139222c0a20224d6f64616c697479223a20224d52222c0a202250617469656e74506f736974696f6e223a2022484653222c0a202250756c736553657175656e636554797065223a20224d5052414745220a7d", + "expected": { + "format": "bids-sidecar", + "summary": "BIDS sidecar, mri, 2.25 s TR", + "fields": { + "bidsFileType": "sidecar", + "bidsModality": "mri", + "Modality": "MR", + "Manufacturer": "Siemens", + "ManufacturersModelName": "TrioTim", + "InstitutionName": "MRC Cognition and Brain Sciences Unit", + "DeviceSerialNumber": "35119", + "StationName": "MRC35119", + "SoftwareVersions": "syngo_MR_B15", + "MagneticFieldStrength": 3, + "RepetitionTime": 2.25, + "EchoTime": 0.00298, + "FlipAngle": 9, + "InversionTime": 0.9, + "ScanningSequence": "GR_IR", + "SequenceVariant": "SP_MP_OSP", + "SequenceName": "_tfl3d1_ns", + "PulseSequenceType": "MPRAGE", + "ParallelReductionFactorInPlane": 2, + "PartialFourier": 0.875, + "MRAcquisitionType": "3D", + "keyCount": 42, + "keys": [ + "AcquisitionMatrixPE", + "AcquisitionNumber", + "BaseResolution", + "ConversionSoftware", + "ConversionSoftwareVersion", + "DeviceSerialNumber", + "DwellTime", + "EchoTime", + "FlipAngle", + "ImageComments", + "ImageType", + "InPlanePhaseEncodingDirectionDICOM", + "InstitutionAddress", + "InstitutionName", + "InversionTime", + "MRAcquisitionType", + "MagneticFieldStrength", + "Manufacturer", + "ManufacturersModelName", + "Modality", + "ParallelReductionFactorInPlane", + "PartialFourier", + "PatientPosition", + "PercentPhaseFOV", + "PhaseEncodingSteps", + "PhaseResolution", + "PixelBandwidth", + "ProcedureStepDescription", + "ProtocolName", + "PulseSequenceDetails", + "PulseSequenceType", + "ReceiveCoilName", + "ReconMatrixPE", + "RepetitionTime", + "ScanOptions", + "ScanningSequence", + "SequenceName", + "SequenceVariant", + "SeriesDescription", + "SliceThickness", + "SoftwareVersions", + "StationName" + ] + } + } + }, + { + "name": "ieeg_filtered_speech/sub-cm4/ieeg/sub-cm4_task-FilteredSpeech_ieeg.json (iEEG sidecar)", + "key": "sub-cm4_task-FilteredSpeech_ieeg.json", + "hex": "7b0a20202020225461736b4e616d65223a202246696c7465726564537065656368222c0a20202020224d616e756661637475726572223a20226e2f61222c0a2020202022506f7765724c696e654672657175656e6379223a2036302c0a202020202253616d706c696e674672657175656e6379223a20313030302c0a2020202022536f66747761726546696c74657273223a20226e2f61222c0a20202020225265636f7264696e674475726174696f6e223a20313230342e3034312c0a20202020225265636f7264696e6754797065223a2022636f6e74696e756f7573222c0a202020202245434f474368616e6e656c436f756e74223a20302c0a2020202022534545474368616e6e656c436f756e74223a20302c0a20202020224545474368616e6e656c436f756e74223a2036342c0a2020202022454f474368616e6e656c436f756e74223a20302c0a20202020224543474368616e6e656c436f756e74223a20302c0a2020202022454d474368616e6e656c436f756e74223a20302c0a20202020224d6973634368616e6e656c436f756e74223a20302c0a2020202022547269676765724368616e6e656c436f756e74223a20302c0a2020202022694545475265666572656e6365223a2022636f6d6d6f6e2061766572616765220a7d0a", + "expected": { + "format": "bids-sidecar", + "summary": "BIDS sidecar, ieeg, task FilteredSpeech, 1000 Hz", + "fields": { + "bidsFileType": "sidecar", + "bidsModality": "ieeg", + "TaskName": "FilteredSpeech", + "Manufacturer": "n/a", + "SamplingFrequency": 1000, + "PowerLineFrequency": 60, + "RecordingDuration": 1204.041, + "RecordingType": "continuous", + "iEEGReference": "common average", + "EEGChannelCount": 64, + "ECOGChannelCount": 0, + "SEEGChannelCount": 0, + "EOGChannelCount": 0, + "ECGChannelCount": 0, + "EMGChannelCount": 0, + "MiscChannelCount": 0, + "TriggerChannelCount": 0, + "keyCount": 16, + "keys": [ + "ECGChannelCount", + "ECOGChannelCount", + "EEGChannelCount", + "EMGChannelCount", + "EOGChannelCount", + "Manufacturer", + "MiscChannelCount", + "PowerLineFrequency", + "RecordingDuration", + "RecordingType", + "SEEGChannelCount", + "SamplingFrequency", + "SoftwareFilters", + "TaskName", + "TriggerChannelCount", + "iEEGReference" + ] + } + } + }, + { + "name": "ieeg_filtered_speech/sub-cm4/ieeg/sub-cm4_task-FilteredSpeech_channels.tsv (channels table)", + "key": "sub-cm4_task-FilteredSpeech_channels.tsv", + "hex": "6e616d65097479706509756e697473096c6f775f6375746f666609686967685f6375746f66660973616d706c696e675f6672657175656e6379096e6f746368097265666572656e6365096465736372697074696f6e097374617475730967726f75700a47310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520966726f6e74616c2d7375706572696f7209676f6f6409312e300a47320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d7375706572696f720962616409312e300a47330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d7375706572696f7209676f6f6409312e300a47340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d7375706572696f7209676f6f6409312e300a47350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d7375706572696f7209676f6f6409312e300a47360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a47370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a47380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a47390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520966726f6e74616c2d7375706572696f7209676f6f6409312e300a4731300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d7375706572696f7209676f6f6409312e300a4731310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d7375706572696f7209676f6f6409312e300a4731320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d7375706572696f7209676f6f6409312e300a4731330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d7375706572696f7209676f6f6409312e300a4731340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a4731350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a4731360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d7375706572696f7209676f6f6409312e300a4731370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520966726f6e74616c2d6d656469616c09676f6f6409312e300a4731380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4731390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4732300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4732310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4732320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c09676f6f6409312e300a4732330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c09676f6f6409312e300a4732340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c09676f6f6409312e300a4732350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4732360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4732370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4732380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4732390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4733300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c09676f6f6409312e300a4733310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c09676f6f6409312e300a4733320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d6d656469616c0962616409312e300a4733330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4733340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152097072656d6f746f722d6d656469616c09676f6f6409312e300a4733350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4733360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4733370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d6d656469616c09676f6f6409312e300a4733380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d696e666572696f7209676f6f6409312e300a4733390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d696e666572696f7209676f6f6409312e300a4734300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d0943415209706172696574616c2d696e666572696f7209676f6f6409312e300a4734310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520966726f6e74616c2d696e666572696f7209676f6f6409312e300a4734320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520966726f6e74616c2d696e666572696f7209676f6f6409312e300a4734330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d696e666572696f7209676f6f6409312e300a4734340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d696e666572696f7209676f6f6409312e300a4734350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d09434152096d6f746f722d696e666572696f7209676f6f6409312e300a4734360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a4734370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a4734380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d706f73746572696f7209676f6f6409312e300a544734390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735350945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d7375706572696f7209676f6f6409312e300a544735360945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d706f73746572696f7209676f6f6409312e300a544735370945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544735380945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544735390945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544736300945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544736310945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544736320945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544736330945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d6d656469616c09676f6f6409312e300a544736340945434f47096d5609302e3031096e2f6109313030302e30095b36302c203132302c203138305d094341520974656d706f72616c2d706f73746572696f720962616409312e300a", + "expected": { + "format": "bids-table", + "summary": "BIDS channels table, 64 channels, 11 columns", + "fields": { + "bidsFileType": "channels", + "columnCount": 11, + "columns": [ + "name", + "type", + "units", + "low_cutoff", + "high_cutoff", + "sampling_frequency", + "notch", + "reference", + "description", + "status", + "group" + ], + "rowsRead": 64, + "rowsComplete": true, + "channelTypes": { + "ECOG": 64 + }, + "channelTypesDistinct": 1, + "samplingRateHz": 1000.0 + } + } + }, + { + "name": "ieeg_filtered_speech/sub-cm4/ieeg/sub-cm4_electrodes.tsv (electrodes table)", + "key": "sub-cm4_electrodes.tsv", + "hex": "6e616d6509780979097a0973697a6509747970650a4731093432312e300938352e30096e2f61093409737572666163650a4732093338372e300937392e30096e2f61093409737572666163650a4733093335312e300938302e30096e2f61093409737572666163650a4734093331362e300938342e30096e2f61093409737572666163650a4735093237372e300938322e30096e2f61093409737572666163650a4736093234322e300938312e30096e2f61093409737572666163650a4737093230362e300939302e30096e2f61093409737572666163650a4738093137322e30093130302e30096e2f61093409737572666163650a4739093432312e30093131362e30096e2f61093409737572666163650a473130093338362e30093131352e30096e2f61093409737572666163650a473131093335302e30093130322e30096e2f61093409737572666163650a473132093331362e30093130392e30096e2f61093409737572666163650a473133093237372e30093131302e30096e2f61093409737572666163650a473134093234312e30093131372e30096e2f61093409737572666163650a473135093230372e30093132302e30096e2f61093409737572666163650a473136093137312e30093132302e30096e2f61093409737572666163650a473137093432302e30093134382e30096e2f61093409737572666163650a473138093338372e30093134332e30096e2f61093409737572666163650a473139093334392e30093134332e30096e2f61093409737572666163650a473230093331382e30093134362e30096e2f61093409737572666163650a473231093237382e30093134322e30096e2f61093409737572666163650a473232093234302e30093134382e30096e2f61093409737572666163650a473233093230362e30093134362e30096e2f61093409737572666163650a473234093137302e30093135342e30096e2f61093409737572666163650a473235093338382e30093136322e30096e2f61093409737572666163650a473236093339302e30093137342e30096e2f61093409737572666163650a473237093335302e30093137352e30096e2f61093409737572666163650a473238093331332e30093137322e30096e2f61093409737572666163650a473239093238332e30093137342e30096e2f61093409737572666163650a473330093234352e30093138322e30096e2f61093409737572666163650a473331093230372e30093139352e30096e2f61093409737572666163650a473332093137352e30093139332e30096e2f61093409737572666163650a473333093339302e30093230312e30096e2f61093409737572666163650a473334093339302e30093230392e30096e2f61093409737572666163650a473335093335322e30093230342e30096e2f61093409737572666163650a473336093332302e30093230362e30096e2f61093409737572666163650a473337093238342e30093230372e30096e2f61093409737572666163650a473338093235302e30093230392e30096e2f61093409737572666163650a473339093230382e30093231342e30096e2f61093409737572666163650a473430093137362e30093231312e30096e2f61093409737572666163650a473431093432372e30093233352e30096e2f61093409737572666163650a473432093339322e30093234312e30096e2f61093409737572666163650a473433093335362e30093233372e30096e2f61093409737572666163650a473434093332342e30093234332e30096e2f61093409737572666163650a473435093239302e30093234372e30096e2f61093409737572666163650a473436093234392e30093235302e30096e2f61093409737572666163650a473437093231372e30093235302e30096e2f61093409737572666163650a473438093138382e30093236362e30096e2f61093409737572666163650a54473439093339382e30093331302e30096e2f61093409737572666163650a54473530093336372e30093331322e30096e2f61093409737572666163650a54473531093333332e30093330362e30096e2f61093409737572666163650a54473532093239342e30093330312e30096e2f61093409737572666163650a54473533093236312e30093239372e30096e2f61093409737572666163650a54473534093232362e30093239312e30096e2f61093409737572666163650a54473535093230302e30093237382e30096e2f61093409737572666163650a54473536093136352e30093237362e30096e2f61093409737572666163650a54473537093339362e30093333342e30096e2f61093409737572666163650a54473538093336312e30093334342e30096e2f61093409737572666163650a54473539093332362e30093334302e30096e2f61093409737572666163650a54473630093239312e30093333362e30096e2f61093409737572666163650a54473631093235362e30093332382e30096e2f61093409737572666163650a54473632093232312e30093332342e30096e2f61093409737572666163650a54473633093138362e30093331342e30096e2f61093409737572666163650a54473634093135392e30093330392e30096e2f61093409737572666163650a", + "expected": { + "format": "bids-table", + "summary": "BIDS electrodes table, 64 electrodes, 6 columns", + "fields": { + "bidsFileType": "electrodes", + "columnCount": 6, + "columns": [ + "name", + "x", + "y", + "z", + "size", + "type" + ], + "rowsRead": 64, + "rowsComplete": true, + "electrodeCount": 64 + } + } + }, + { + "name": "ieeg_filtered_speech/sub-cm4/ieeg/sub-cm4_task-FilteredSpeech_events.json (events data dictionary)", + "key": "sub-cm4_task-FilteredSpeech_events.json", + "hex": "7b0a2020202022747269616c5f7068617365223a207b0a2020202020202020224c6f6e674e616d65223a2022547269616c20506861736520696e206f6e652072756e222c0a2020202020202020224465736372697074696f6e223a2022576865746865722074686520747269616c20776173206265666f7265206f722061667465722074686520756e66696c7465726564207370656563682c206f722077686574686572206974202a7761732a2074686520756e66696c746572656420737065656368220a202020207d2c0a2020202022747269616c5f6e756d223a207b0a2020202020202020224c6f6e674e616d65223a2022547269616c204e756d626572222c0a2020202020202020224465736372697074696f6e223a202254686520747269616c20746f2077686963682074686520736574206f66206265662f6d69642f616674206576656e747320636f72726573706f6e6473220a202020207d2c0a202020202266696c745f74797065223a207b0a2020202020202020224c6f6e674e616d65223a202246696c7465722074797065222c0a2020202020202020224465736372697074696f6e223a20225468652074797065206f6620736f756e642066696c746572696e67207573656420746f206465677261646520746865207374696d756c7573220a202020207d2c0a20202020226e6f6973655f7374696d223a207b0a2020202020202020224c6f6e674e616d65223a20224e6f697365207374696d756c6174696f6e222c0a2020202020202020224465736372697074696f6e223a20225768657468657220746865206d6964646c6520736f756e6420776173206e6f69736520286e6f206c696e6775697374696320636f6e7465787420676976656e29206f7220756e66696c746572656420737065656368202866756c6c206c696e6775697374696320636f6e74656e7429220a202020207d0a7d0a", + "expected": { + "format": "bids-dictionary", + "summary": "BIDS data dictionary, 4 columns", + "fields": { + "bidsFileType": "dataDictionary", + "columnCount": 4, + "columns": [ + "trial_phase", + "trial_num", + "filt_type", + "noise_stim" + ], + "columnDescriptions": { + "trial_phase": { + "LongName": "Trial Phase in one run", + "Description": "Whether the trial was before or after the unfiltered speech, or whether it *was* the unfiltered speech" + }, + "trial_num": { + "LongName": "Trial Number", + "Description": "The trial to which the set of bef/mid/aft events corresponds" + }, + "filt_type": { + "LongName": "Filter type", + "Description": "The type of sound filtering used to degrade the stimulus" + }, + "noise_stim": { + "LongName": "Noise stimulation", + "Description": "Whether the middle sound was noise (no linguistic context given) or unfiltered speech (full linguistic content)" + } + } + } + } + }, + { + "name": "ds000248/sub-01/sub-01_scans.tsv (scans table with a UTF-8 BOM)", + "key": "sub-01_scans.tsv", + "hex": "efbbbf66696c656e616d65096163715f74696d650a6d65672f7375622d30315f7461736b2d617564696f76697375616c5f72756e2d30315f6d65672e66696609313932312d30382d31365431393a30313a31302e3732303130305a", + "expected": { + "format": "bids-table", + "summary": "BIDS scans table, 1 scan, 2 columns", + "fields": { + "bidsFileType": "scans", + "columnCount": 2, + "columns": [ + "filename", + "acq_time" + ], + "rowsRead": 1, + "rowsComplete": true + } + } + }, + { + "name": "eeg_ds003645s_hed_demo/sub-004/ses-1/sub-004_ses-1_coordsystem.json (MEG and EEG coordinate system)", + "key": "sub-004_ses-1_coordsystem.json", + "hex": "7b0d0a20224d4547436f6f7264696e61746553797374656d223a2022456c656b74614e6575726f6d6167222c0d0a20224d4547436f6f7264696e617465556e697473223a20226d6d222c0d0a20224d4547436f6f7264696e61746553797374656d4465736372697074696f6e223a2022566563746f72566965773a20313032204d61676e65746f6d65746572732c2032303420506c616e61722047726164696f6d6574657273222c0d0a2022454547436f6f7264696e61746553797374656d223a2022456c656b74614e6575726f6d6167222c0d0a2022454547436f6f7264696e617465556e697473223a20226d6d222c0d0a2022454547436f6f7264696e61746553797374656d4465736372697074696f6e223a2022373020456173796361702073697465732c20726f7567686c7920636f72726573706f6e64696e6720746f20657874656e6465642031302d32302073797374656d3a2073656520687474703a2f2f696d6167696e672e6d72632d6362752e63616d2e61632e756b2f6d65672f566563746f72766965774465736372697074696f6e234545476c6162656c73222c0d0a20224469676974697a656448656164506f696e7473223a20227375622d30335f7365732d6d65675f6865616473686170652e706f73222c0d0a20224469676974697a656448656164506f696e7473436f6f7264696e61746553797374656d223a2022456c656b74614e6575726f6d6167222c0d0a20224469676974697a656448656164506f696e7473436f6f7264696e617465556e697473223a20226d6d222c0d0a20224469676974697a656448656164506f696e7473436f6f7264696e61746553797374656d4465736372697074696f6e223a202248656164706f696e747320696e636c7564652061726373206f6620706f696e747320616c6f6e672066726f6e74206f66206865616420616e642061726f756e64206e6f73652c2061732077656c6c2061732063656e747265206f662037302045454720656c656374726f64657320737072656164206163726f7373207363616c702c20776869636820616c736f2068656c7020646566696e65206865616473686170652e204265776172652074686174206e6f736520706f696e74732063616e206269617320636f726567697374726174696f6e2077697468204d5249206966204d524920696d61676520646f6573206e6f7420696e636c75646520616c6c206f6620746865206e6f73652e222c0d0a2022416e61746f6d6963616c4c616e646d61726b436f6f7264696e61746573223a207b0d0a2020224c5041223a205b2d37322e32322c302c305d2c0d0a202022525041223a205b37332e30392c302c305d2c0d0a2020224e6173696f6e223a205b302c3130332e33362c305d0d0a207d2c0d0a2022416e61746f6d6963616c4c616e646d61726b436f6f7264696e61746553797374656d223a2022456c656b74614e6575726f6d6167222c0d0a2022416e61746f6d6963616c4c616e646d61726b436f6f7264696e617465556e697473223a20226d6d222c0d0a2022416e61746f6d6963616c4c616e646d61726b436f6f7264696e61746553797374656d4465736372697074696f6e223a2022466f7220696d61676573206f6620616e61746f6d6963616c206c616e646d61726b732c2073656520687474703a2f2f696d6167696e672e6d72632d6362752e63616d2e61632e756b2f6d65672f5375626a6563745072657061726174696f6e222c0d0a202248656164436f696c436f6f7264696e61746573223a207b0d0a202022636f696c31223a205b36352e3334323437312c35332e3038303233312c38352e3633343934375d2c0d0a202022636f696c32223a205b31312e3434373333362c3131322e3835313431312c34392e3132373431395d2c0d0a202022636f696c33223a205b2d32362e3139373832332c31322e3837333032342c3133322e3438303038355d2c0d0a202022636f696c34223a205b372e3236353430342c2d37312e31373333342c38352e33383438393830303030303030315d2c0d0a202022636f696c35223a205b2d37342e3333383630372c382e3733323439393030303030303030312c38332e3630333036395d0d0a207d2c0d0a202248656164436f696c436f6f7264696e61746553797374656d223a2022456c656b74614e6575726f6d6167222c0d0a202248656164436f696c436f6f7264696e617465556e697473223a20226d6d222c0d0a202248656164436f696c436f6f7264696e61746553797374656d4465736372697074696f6e223a2022352048504920636f696c732075736564222c0d0a2022466964756369616c734465736372697074696f6e223a2022466f7220696d61676573206f6620616e61746f6d6963616c206c616e646d61726b732c2073656520687474703a2f2f696d6167696e672e6d72632d6362752e63616d2e61632e756b2f6d65672f5375626a6563745072657061726174696f6e220d0a7d0a", + "expected": { + "format": "bids-sidecar", + "summary": "BIDS sidecar, coordsystem", + "fields": { + "bidsFileType": "sidecar", + "bidsModality": "coordsystem", + "EEGCoordinateSystem": "ElektaNeuromag", + "MEGCoordinateSystem": "ElektaNeuromag", + "MEGCoordinateUnits": "mm", + "MEGCoordinateSystemDescription": "VectorView: 102 Magnetometers, 204 Planar Gradiometers", + "EEGCoordinateUnits": "mm", + "EEGCoordinateSystemDescription": "70 Easycap sites, roughly corresponding to extended 10-20 system: see http://imaging.mrc-cbu.cam.ac.uk/meg/VectorviewDescription#EEGlabels", + "DigitizedHeadPointsCoordinateSystem": "ElektaNeuromag", + "DigitizedHeadPointsCoordinateUnits": "mm", + "DigitizedHeadPointsCoordinateSystemDescription": "Headpoints include arcs of points along front of head and around nose, as well as centre of 70 EEG electrodes spread across scalp, which also help define headshape. Beware that nose points can bias coregistration with MRI if MRI image does not include all of the nose.", + "AnatomicalLandmarkCoordinateSystem": "ElektaNeuromag", + "AnatomicalLandmarkCoordinateUnits": "mm", + "AnatomicalLandmarkCoordinateSystemDescription": "For images of anatomical landmarks, see http://imaging.mrc-cbu.cam.ac.uk/meg/SubjectPreparation", + "HeadCoilCoordinateSystem": "ElektaNeuromag", + "HeadCoilCoordinateUnits": "mm", + "HeadCoilCoordinateSystemDescription": "5 HPI coils used", + "keyCount": 19, + "keys": [ + "AnatomicalLandmarkCoordinateSystem", + "AnatomicalLandmarkCoordinateSystemDescription", + "AnatomicalLandmarkCoordinateUnits", + "AnatomicalLandmarkCoordinates", + "DigitizedHeadPoints", + "DigitizedHeadPointsCoordinateSystem", + "DigitizedHeadPointsCoordinateSystemDescription", + "DigitizedHeadPointsCoordinateUnits", + "EEGCoordinateSystem", + "EEGCoordinateSystemDescription", + "EEGCoordinateUnits", + "FiducialsDescription", + "HeadCoilCoordinateSystem", + "HeadCoilCoordinateSystemDescription", + "HeadCoilCoordinateUnits", + "HeadCoilCoordinates", + "MEGCoordinateSystem", + "MEGCoordinateSystemDescription", + "MEGCoordinateUnits" + ] + } + } + } + ] +} diff --git a/tests/fixtures/brainvision-cases.json b/tests/fixtures/brainvision-cases.json new file mode 100644 index 0000000..d44a042 --- /dev/null +++ b/tests/fixtures/brainvision-cases.json @@ -0,0 +1,930 @@ +{ + "_comment": "Real BrainVision header and marker files from the bids-standard/bids-examples corpus (github.com/bids-standard/bids-examples, master). Channel count, sampling rate and channel names were checked against mne 1.13.2's read_raw_brainvision on all 64 non-empty `.vhdr` files in that corpus at generation time; all 64 agreed.", + "cases": [ + { + "name": "sub-cm4_task-FilteredSpeech_ieeg.vhdr (MNE-Python via philistine, 61 iEEG channels, IEEE_FLOAT_32)", + "key": "sub-cm4_task-FilteredSpeech_ieeg.vhdr", + "hex": "427261696e20566973696f6e20446174612045786368616e6765204865616465722046696c652056657273696f6e20312e300a3b4578706f727465642066726f6d204d4e452d507974686f6e207573696e67207068696c697374696e6520302e310a0a5b436f6d6d6f6e20496e666f735d0a436f6465706167653d5554462d380a4461746146696c653d7375622d636d345f7461736b2d46696c74657265645370656563685f696565672e6565670a4d61726b657246696c653d7375622d636d345f7461736b2d46696c74657265645370656563685f696565672e766d726b0a44617461466f726d61743d42494e4152590a44617461206f7269656e746174696f6e3a204d554c5449504c455845443d6368312c7074312c206368322c707431202e2e2e0a446174614f7269656e746174696f6e3d4d554c5449504c455845440a4e756d6265724f664368616e6e656c733d36310a3b2053616d706c696e6720696e74657276616c20696e206d6963726f7365636f6e64730a53616d706c696e67496e74657276616c3d313030300a0a5b42696e61727920496e666f735d0a42696e617279466f726d61743d494545455f464c4f41545f33320a0a5b4368616e6e656c20496e666f735d0a3b204561636820656e7472793a2043683c4368616e6e656c206e756d6265723e3d3c4e616d653e2c3c5265666572656e6365206368616e6e656c206e616d653e2c0a3b203c5265736f6c7574696f6e20696e206d6963726f766f6c74733e2c3c46757475726520657874656e73696f6e732e2e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20736f6d65206669656c6473206d69676874206265206f6d69747465642028656d707479292e0a3b20436f6d6d617320696e206368616e6e656c206e616d65732061726520636f64656420617320225c31222e0a4368313d47312c2c302e310a4368323d47332c2c302e310a4368333d47342c2c302e310a4368343d47352c2c302e310a4368353d47362c2c302e310a4368363d47372c2c302e310a4368373d47382c2c302e310a4368383d47392c2c302e310a4368393d4731302c2c302e310a436831303d4731312c2c302e310a436831313d4731322c2c302e310a436831323d4731332c2c302e310a436831333d4731342c2c302e310a436831343d4731352c2c302e310a436831353d4731362c2c302e310a436831363d4731372c2c302e310a436831373d4731382c2c302e310a436831383d4731392c2c302e310a436831393d4732302c2c302e310a436832303d4732312c2c302e310a436832313d4732322c2c302e310a436832323d4732332c2c302e310a436832333d4732342c2c302e310a436832343d4732352c2c302e310a436832353d4732362c2c302e310a436832363d4732372c2c302e310a436832373d4732382c2c302e310a436832383d4732392c2c302e310a436832393d4733302c2c302e310a436833303d4733312c2c302e310a436833313d4733332c2c302e310a436833323d4733342c2c302e310a436833333d4733352c2c302e310a436833343d4733362c2c302e310a436833353d4733372c2c302e310a436833363d4733382c2c302e310a436833373d4733392c2c302e310a436833383d4734302c2c302e310a436833393d4734312c2c302e310a436834303d4734322c2c302e310a436834313d4734332c2c302e310a436834323d4734342c2c302e310a436834333d4734352c2c302e310a436834343d4734362c2c302e310a436834353d4734372c2c302e310a436834363d4734382c2c302e310a436834373d544734392c2c302e310a436834383d544735302c2c302e310a436834393d544735312c2c302e310a436835303d544735322c2c302e310a436835313d544735332c2c302e310a436835323d544735342c2c302e310a436835333d544735352c2c302e310a436835343d544735362c2c302e310a436835353d544735372c2c302e310a436835363d544735382c2c302e310a436835373d544735392c2c302e310a436835383d544736302c2c302e310a436835393d544736312c2c302e310a436836303d544736322c2c302e310a436836313d544736332c2c302e310a0a5b436f6d6d656e745d0a0a", + "expected": { + "format": "brainvision", + "summary": "BrainVision, 61 channels, 1000 Hz, ieee_float_32 multiplexed", + "fields": { + "brainVisionVersion": "1.0", + "dataFile": "sub-cm4_task-FilteredSpeech_ieeg.eeg", + "markerFile": "sub-cm4_task-FilteredSpeech_ieeg.vmrk", + "dataFormat": "BINARY", + "dataOrientation": "MULTIPLEXED", + "codepage": "UTF-8", + "channelCount": 61, + "samplingIntervalMicroseconds": 1000.0, + "samplingRateHz": 1000.0, + "binaryFormat": "IEEE_FLOAT_32", + "bytesPerSample": 4, + "byteOrder": "little", + "channelNames": [ + "G1", + "G3", + "G4", + "G5", + "G6", + "G7", + "G8", + "G9", + "G10", + "G11", + "G12", + "G13", + "G14", + "G15", + "G16", + "G17", + "G18", + "G19", + "G20", + "G21", + "G22", + "G23", + "G24", + "G25", + "G26", + "G27", + "G28", + "G29", + "G30", + "G31", + "G33", + "G34", + "G35", + "G36", + "G37", + "G38", + "G39", + "G40", + "G41", + "G42", + "G43", + "G44", + "G45", + "G46", + "G47", + "G48", + "TG49", + "TG50", + "TG51", + "TG52", + "TG53", + "TG54", + "TG55", + "TG56", + "TG57", + "TG58", + "TG59", + "TG60", + "TG61", + "TG62", + "TG63" + ], + "channels": [ + { + "name": "G1", + "resolution": 0.1 + }, + { + "name": "G3", + "resolution": 0.1 + }, + { + "name": "G4", + "resolution": 0.1 + }, + { + "name": "G5", + "resolution": 0.1 + }, + { + "name": "G6", + "resolution": 0.1 + }, + { + "name": "G7", + "resolution": 0.1 + }, + { + "name": "G8", + "resolution": 0.1 + }, + { + "name": "G9", + "resolution": 0.1 + }, + { + "name": "G10", + "resolution": 0.1 + }, + { + "name": "G11", + "resolution": 0.1 + }, + { + "name": "G12", + "resolution": 0.1 + }, + { + "name": "G13", + "resolution": 0.1 + }, + { + "name": "G14", + "resolution": 0.1 + }, + { + "name": "G15", + "resolution": 0.1 + }, + { + "name": "G16", + "resolution": 0.1 + }, + { + "name": "G17", + "resolution": 0.1 + }, + { + "name": "G18", + "resolution": 0.1 + }, + { + "name": "G19", + "resolution": 0.1 + }, + { + "name": "G20", + "resolution": 0.1 + }, + { + "name": "G21", + "resolution": 0.1 + }, + { + "name": "G22", + "resolution": 0.1 + }, + { + "name": "G23", + "resolution": 0.1 + }, + { + "name": "G24", + "resolution": 0.1 + }, + { + "name": "G25", + "resolution": 0.1 + }, + { + "name": "G26", + "resolution": 0.1 + }, + { + "name": "G27", + "resolution": 0.1 + }, + { + "name": "G28", + "resolution": 0.1 + }, + { + "name": "G29", + "resolution": 0.1 + }, + { + "name": "G30", + "resolution": 0.1 + }, + { + "name": "G31", + "resolution": 0.1 + }, + { + "name": "G33", + "resolution": 0.1 + }, + { + "name": "G34", + "resolution": 0.1 + }, + { + "name": "G35", + "resolution": 0.1 + }, + { + "name": "G36", + "resolution": 0.1 + }, + { + "name": "G37", + "resolution": 0.1 + }, + { + "name": "G38", + "resolution": 0.1 + }, + { + "name": "G39", + "resolution": 0.1 + }, + { + "name": "G40", + "resolution": 0.1 + }, + { + "name": "G41", + "resolution": 0.1 + }, + { + "name": "G42", + "resolution": 0.1 + }, + { + "name": "G43", + "resolution": 0.1 + }, + { + "name": "G44", + "resolution": 0.1 + }, + { + "name": "G45", + "resolution": 0.1 + }, + { + "name": "G46", + "resolution": 0.1 + }, + { + "name": "G47", + "resolution": 0.1 + }, + { + "name": "G48", + "resolution": 0.1 + }, + { + "name": "TG49", + "resolution": 0.1 + }, + { + "name": "TG50", + "resolution": 0.1 + }, + { + "name": "TG51", + "resolution": 0.1 + }, + { + "name": "TG52", + "resolution": 0.1 + }, + { + "name": "TG53", + "resolution": 0.1 + }, + { + "name": "TG54", + "resolution": 0.1 + }, + { + "name": "TG55", + "resolution": 0.1 + }, + { + "name": "TG56", + "resolution": 0.1 + }, + { + "name": "TG57", + "resolution": 0.1 + }, + { + "name": "TG58", + "resolution": 0.1 + }, + { + "name": "TG59", + "resolution": 0.1 + }, + { + "name": "TG60", + "resolution": 0.1 + }, + { + "name": "TG61", + "resolution": 0.1 + }, + { + "name": "TG62", + "resolution": 0.1 + }, + { + "name": "TG63", + "resolution": 0.1 + } + ], + "channelsRead": 61, + "resolution": 0.1 + } + } + }, + { + "name": "sub-cm4_task-FilteredSpeech_ieeg.vmrk", + "key": "sub-cm4_task-FilteredSpeech_ieeg.vmrk", + "hex": "427261696e20566973696f6e20446174612045786368616e6765204d61726b65722046696c652c2056657273696f6e20312e300a3b4578706f727465642066726f6d204d4e452d507974686f6e207573696e67207068696c697374696e6520302e310a0a5b436f6d6d6f6e20496e666f735d0a436f6465706167653d5554462d380a4461746146696c653d7375622d636d345f7461736b2d46696c74657265645370656563685f696565672e6565670a0a5b4d61726b657220496e666f735d0a3b204561636820656e7472793a204d6b3c4d61726b6572206e756d6265723e3d3c547970653e2c3c4465736372697074696f6e3e2c3c506f736974696f6e20696e206461746120706f696e74733e2c0a3b203c53697a6520696e206461746120706f696e74733e2c203c4368616e6e656c206e756d626572202830203d206d61726b65722069732072656c6174656420746f20616c6c206368616e6e656c73293e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20736f6d65206669656c6473206d69676874206265206f6d69747465642028656d707479292e0a3b20436f6d6d617320696e2074797065206f72206465736372697074696f6e20746578742061726520636f64656420617320225c31222e0a4d6b313d4e6577205365676d656e742c2c312c312c302c300a", + "expected": { + "format": "brainvision-markers", + "summary": "BrainVision markers, 1 marker, New Segment x1", + "fields": { + "brainVisionVersion": "1.0", + "dataFile": "sub-cm4_task-FilteredSpeech_ieeg.eeg", + "codepage": "UTF-8", + "markersRead": 1, + "markersComplete": true, + "markers": [ + { + "type": "New Segment", + "position": 1, + "size": 1, + "channel": 0 + } + ], + "markerTypes": { + "New Segment": 1 + } + } + } + }, + { + "name": "sub-05_task-matchingpennies_eeg.vhdr (BrainVision Recorder original, INT_16 with a resolution per channel)", + "key": "sub-05_task-matchingpennies_eeg.vhdr", + "hex": "427261696e20566973696f6e20446174612045786368616e6765204865616465722046696c652056657273696f6e20312e300a3b4578706f727465642066726f6d204d4e452d507974686f6e207573696e67207068696c697374696e6520302e3161322b6465760a0a5b436f6d6d6f6e20496e666f735d0a436f6465706167653d5554462d380a4461746146696c653d7375622d30355f7461736b2d6d61746368696e6770656e6e6965735f6565672e6565670a4d61726b657246696c653d7375622d30355f7461736b2d6d61746368696e6770656e6e6965735f6565672e766d726b0a44617461466f726d61743d42494e4152590a44617461206f7269656e746174696f6e3a204d554c5449504c455845443d6368312c7074312c206368322c707431202e2e2e0a446174614f7269656e746174696f6e3d4d554c5449504c455845440a4e756d6265724f664368616e6e656c733d31300a3b2053616d706c696e6720696e74657276616c20696e206d6963726f7365636f6e64730a53616d706c696e67496e74657276616c3d3230300a0a5b42696e61727920496e666f735d0a42696e617279466f726d61743d494545455f464c4f41545f33320a0a5b4368616e6e656c20496e666f735d0a3b204561636820656e7472793a2043683c4368616e6e656c206e756d6265723e3d3c4e616d653e2c3c5265666572656e6365206368616e6e656c206e616d653e2c0a3b203c5265736f6c7574696f6e20696e206d6963726f766f6c74733e2c3c46757475726520657874656e73696f6e732e2e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20736f6d65206669656c6473206d69676874206265206f6d69747465642028656d707479292e0a3b20436f6d6d617320696e206368616e6e656c206e616d65732061726520636f64656420617320225c31222e0a4368313d4643352c2c302e310a4368323d4643312c2c302e310a4368333d43332c2c302e310a4368343d4350352c2c302e310a4368353d4350312c2c302e310a4368363d4643322c2c302e310a4368373d4643362c2c302e310a4368383d43342c2c302e310a4368393d4350322c2c302e310a436831303d4350362c2c302e310a0a5b436f6d6d656e745d0a0a", + "expected": { + "format": "brainvision", + "summary": "BrainVision, 10 channels, 5000 Hz, ieee_float_32 multiplexed", + "fields": { + "brainVisionVersion": "1.0", + "dataFile": "sub-05_task-matchingpennies_eeg.eeg", + "markerFile": "sub-05_task-matchingpennies_eeg.vmrk", + "dataFormat": "BINARY", + "dataOrientation": "MULTIPLEXED", + "codepage": "UTF-8", + "channelCount": 10, + "samplingIntervalMicroseconds": 200.0, + "samplingRateHz": 5000.0, + "binaryFormat": "IEEE_FLOAT_32", + "bytesPerSample": 4, + "byteOrder": "little", + "channelNames": [ + "FC5", + "FC1", + "C3", + "CP5", + "CP1", + "FC2", + "FC6", + "C4", + "CP2", + "CP6" + ], + "channels": [ + { + "name": "FC5", + "resolution": 0.1 + }, + { + "name": "FC1", + "resolution": 0.1 + }, + { + "name": "C3", + "resolution": 0.1 + }, + { + "name": "CP5", + "resolution": 0.1 + }, + { + "name": "CP1", + "resolution": 0.1 + }, + { + "name": "FC2", + "resolution": 0.1 + }, + { + "name": "FC6", + "resolution": 0.1 + }, + { + "name": "C4", + "resolution": 0.1 + }, + { + "name": "CP2", + "resolution": 0.1 + }, + { + "name": "CP6", + "resolution": 0.1 + } + ], + "channelsRead": 10, + "resolution": 0.1 + } + } + }, + { + "name": "sub-05_task-matchingpennies_eeg.vmrk", + "key": "sub-05_task-matchingpennies_eeg.vmrk", + "hex": "427261696e20566973696f6e20446174612045786368616e6765204d61726b65722046696c652c2056657273696f6e20312e300a3b4578706f727465642066726f6d204d4e452d507974686f6e207573696e67207068696c697374696e6520302e3161322b6465760a0a5b436f6d6d6f6e20496e666f735d0a436f6465706167653d5554462d380a4461746146696c653d7375622d30355f7461736b2d6d61746368696e6770656e6e6965735f6565672e6565670a0a5b4d61726b657220496e666f735d0a3b204561636820656e7472793a204d6b3c4d61726b6572206e756d6265723e3d3c547970653e2c3c4465736372697074696f6e3e2c3c506f736974696f6e20696e206461746120706f696e74733e2c0a3b203c53697a6520696e206461746120706f696e74733e2c203c4368616e6e656c206e756d626572202830203d206d61726b65722069732072656c6174656420746f20616c6c206368616e6e656c73293e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20736f6d65206669656c6473206d69676874206265206f6d69747465642028656d707479292e0a3b20436f6d6d617320696e2074797065206f72206465736372697074696f6e20746578742061726520636f64656420617320225c31222e0a4d6b313d4e6577205365676d656e742c2c312c312c302c300a4d6b323d5374696d756c75732c53322c39303737382c312c300a4d6b333d5374696d756c75732c53322c3131343936312c312c300a4d6b343d5374696d756c75732c53312c3133373831392c312c300a4d6b353d5374696d756c75732c53322c3137383236302c312c300a4d6b363d5374696d756c75732c53322c3230313239372c312c300a4d6b373d5374696d756c75732c53312c3234353038312c312c300a4d6b383d5374696d756c75732c53322c3238393131362c312c300a4d6b393d5374696d756c75732c53322c3331313836342c312c300a4d6b31303d5374696d756c75732c53312c3333373936392c312c300a4d6b31313d5374696d756c75732c53322c3430303531322c312c300a4d6b31323d5374696d756c75732c53312c3432333336342c312c300a4d6b31333d5374696d756c75732c53312c3434363536392c312c300a4d6b31343d5374696d756c75732c53322c3436393536372c312c300a4d6b31353d5374696d756c75732c53312c3439323737312c312c300a4d6b31363d5374696d756c75732c53322c3533323934362c312c300a4d6b31373d5374696d756c75732c53322c3535353731342c312c300a4d6b31383d5374696d756c75732c53322c3537383831382c312c300a4d6b31393d5374696d756c75732c53322c3630313833322c312c300a4d6b32303d5374696d756c75732c53322c3632353138342c312c300a4d6b32313d5374696d756c75732c53312c3634383238352c312c300a4d6b32323d5374696d756c75732c53312c3637313135372c312c300a4d6b32333d5374696d756c75732c53312c3731323138392c312c300a4d6b32343d5374696d756c75732c53322c3733353138342c312c300a4d6b32353d5374696d756c75732c53322c3735383435332c312c300a4d6b32363d5374696d756c75732c53312c3738313330342c312c300a4d6b32373d5374696d756c75732c53322c3830343233372c312c300a4d6b32383d5374696d756c75732c53322c3832373038382c312c300a4d6b32393d5374696d756c75732c53322c3835303336302c312c300a4d6b33303d5374696d756c75732c53312c3837333435392c312c300a4d6b33313d5374696d756c75732c53312c3839363232342c312c300a4d6b33323d5374696d756c75732c53312c3931393433302c312c300a4d6b33333d5374696d756c75732c53322c3934323334332c312c300a4d6b33343d5374696d756c75732c53322c3936353532372c312c300a4d6b33353d5374696d756c75732c53322c3938383635302c312c300a4d6b33363d5374696d756c75732c53322c313031313634342c312c300a4d6b33373d5374696d756c75732c53322c313035323539342c312c300a4d6b33383d5374696d756c75732c53312c313037353336332c312c300a4d6b33393d5374696d756c75732c53322c313039383534382c312c300a4d6b34303d5374696d756c75732c53312c313132313635302c312c300a4d6b34313d5374696d756c75732c53312c313134343638362c312c300a4d6b34323d5374696d756c75732c53322c313136373837302c312c300a4d6b34333d5374696d756c75732c53322c313139303838372c312c300a4d6b34343d5374696d756c75732c53322c313231333936372c312c300a4d6b34353d5374696d756c75732c53312c313233373432332c312c300a4d6b34363d5374696d756c75732c53322c313236303532342c312c300a4d6b34373d5374696d756c75732c53312c313330303937332c312c300a4d6b34383d5374696d756c75732c53312c313332343035342c312c300a4d6b34393d5374696d756c75732c53322c313334363831392c312c300a4d6b35303d5374696d756c75732c53322c313336393735312c312c300a4d6b35313d5374696d756c75732c53312c313339323638372c312c300a4d6b35323d5374696d756c75732c53312c313431353839312c312c300a4d6b35333d5374696d756c75732c53312c313433383939342c312c300a4d6b35343d5374696d756c75732c53312c313436323234302c312c300a4d6b35353d5374696d756c75732c53312c313438353531302c312c300a4d6b35363d5374696d756c75732c53312c313530383436342c312c300a4d6b35373d5374696d756c75732c53312c313533313730382c312c300a4d6b35383d5374696d756c75732c53312c313535343735332c312c300a4d6b35393d5374696d756c75732c53312c313537373439332c312c300a4d6b36303d5374696d756c75732c53322c313630303638332c312c300a4d6b36313d5374696d756c75732c53312c313632333738302c312c300a4d6b36323d5374696d756c75732c53312c313634363635302c312c300a4d6b36333d5374696d756c75732c53312c313636393438312c312c300a4d6b36343d5374696d756c75732c53322c313639323530302c312c300a4d6b36353d5374696d756c75732c53322c313731353638342c312c300a4d6b36363d5374696d756c75732c53312c313733383730322c312c300a4d6b36373d5374696d756c75732c53322c313736313535322c312c300a4d6b36383d5374696d756c75732c53312c313738343430332c312c300a4d6b36393d5374696d756c75732c53322c313830373530342c312c300a4d6b37303d5374696d756c75732c53322c313833303630382c312c300a4d6b37313d5374696d756c75732c53312c313835333731362c312c300a4d6b37323d5374696d756c75732c53322c313837363536332c312c300a4d6b37333d5374696d756c75732c53322c313930303035362c312c300a4d6b37343d5374696d756c75732c53322c313934303632372c312c300a4d6b37353d5374696d756c75732c53312c313936343036312c312c300a4d6b37363d5374696d756c75732c53322c313938363832392c312c300a4d6b37373d5374696d756c75732c53322c323031303433302c312c300a4d6b37383d5374696d756c75732c53312c323033333738312c312c300a4d6b37393d5374696d756c75732c53312c323035373231362c312c300a4d6b38303d5374696d756c75732c53312c323130313437382c312c300a4d6b38313d5374696d756c75732c53322c323132343530312c312c300a4d6b38323d5374696d756c75732c53322c323134373435322c312c300a4d6b38333d5374696d756c75732c53312c323137303330322c312c300a4d6b38343d5374696d756c75732c53322c323231333735322c312c300a4d6b38353d5374696d756c75732c53312c323233363835342c312c300a4d6b38363d5374696d756c75732c53322c323235393837312c312c300a4d6b38373d5374696d756c75732c53312c323238333232312c312c300a4d6b38383d5374696d756c75732c53312c323330363234302c312c300a4d6b38393d5374696d756c75732c53312c323332393537342c312c300a4d6b39303d5374696d756c75732c53322c323335323637352c312c300a4d6b39313d5374696d756c75732c53322c323337353639362c312c300a4d6b39323d5374696d756c75732c53312c323339383732372c312c300a4d6b39333d5374696d756c75732c53312c323432313931312c312c300a4d6b39343d5374696d756c75732c53312c323434353031322c312c300a4d6b39353d5374696d756c75732c53322c323436373836332c312c300a4d6b39363d5374696d756c75732c53322c323439303936352c312c300a4d6b39373d5374696d756c75732c53322c323531343233322c312c300a4d6b39383d5374696d756c75732c53312c323533373136362c312c300a4d6b39393d5374696d756c75732c53312c323537383236342c312c300a4d6b3130303d5374696d756c75732c53322c323630313435302c312c300a4d6b3130313d5374696d756c75732c53312c323632343436382c312c300a4d6b3130323d5374696d756c75732c53322c333730323730312c312c300a4d6b3130333d5374696d756c75732c53322c333732353633362c312c300a4d6b3130343d5374696d756c75732c53322c333734383536392c312c300a4d6b3130353d5374696d756c75732c53312c333737313432302c312c300a4d6b3130363d5374696d756c75732c53322c333739343630352c312c300a4d6b3130373d5374696d756c75732c53312c333833353330312c312c300a4d6b3130383d5374696d756c75732c53322c333835383635372c312c300a4d6b3130393d5374696d756c75732c53322c333838313637312c312c300a4d6b3131303d5374696d756c75732c53312c333930343630342c312c300a4d6b3131313d5374696d756c75732c53312c333932373730362c312c300a4d6b3131323d5374696d756c75732c53322c333935303732342c312c300a4d6b3131333d5374696d756c75732c53312c333937343031342c312c300a4d6b3131343d5374696d756c75732c53312c333939373033312c312c300a4d6b3131353d5374696d756c75732c53312c343031393934342c312c300a4d6b3131363d5374696d756c75732c53312c343034333034342c312c300a4d6b3131373d5374696d756c75732c53312c343036363030312c312c300a4d6b3131383d5374696d756c75732c53322c343038393136332c312c300a4d6b3131393d5374696d756c75732c53312c343131323031342c312c300a4d6b3132303d5374696d756c75732c53322c343133353033312c312c300a4d6b3132313d5374696d756c75732c53312c343135373739382c312c300a4d6b3132323d5374696d756c75732c53322c343138303733322c312c300a4d6b3132333d5374696d756c75732c53312c343230333638382c312c300a4d6b3132343d5374696d756c75732c53322c343232373031382c312c300a4d6b3132353d5374696d756c75732c53312c343234393836392c312c300a4d6b3132363d5374696d756c75732c53312c343237333035332c312c300a4d6b3132373d5374696d756c75732c53322c343239353938372c312c300a4d6b3132383d5374696d756c75732c53312c343331393139362c312c300a4d6b3132393d5374696d756c75732c53312c343334323032322c312c300a4d6b3133303d5374696d756c75732c53322c343336353337372c312c300a4d6b3133313d5374696d756c75732c53312c343338383232352c312c300a4d6b3133323d5374696d756c75732c53312c343431313037352c312c300a4d6b3133333d5374696d756c75732c53312c343433333836332c312c300a4d6b3133343d5374696d756c75732c53312c343435373131312c312c300a4d6b3133353d5374696d756c75732c53322c343438303331372c312c300a4d6b3133363d5374696d756c75732c53312c343530333331322c312c300a4d6b3133373d5374696d756c75732c53312c343532363433352c312c300a4d6b3133383d5374696d756c75732c53312c343534393539382c312c300a4d6b3133393d5374696d756c75732c53312c343537323533312c312c300a4d6b3134303d5374696d756c75732c53312c343539353633332c312c300a4d6b3134313d5374696d756c75732c53322c343631383733332c312c300a4d6b3134323d5374696d756c75732c53312c343634313530352c312c300a4d6b3134333d5374696d756c75732c53322c343636343531392c312c300a4d6b3134343d5374696d756c75732c53312c343638373632302c312c300a4d6b3134353d5374696d756c75732c53312c343731303732312c312c300a4d6b3134363d5374696d756c75732c53312c343733333736362c312c300a4d6b3134373d5374696d756c75732c53312c343735363637332c312c300a4d6b3134383d5374696d756c75732c53322c343737393532342c312c300a4d6b3134393d5374696d756c75732c53322c343830323634352c312c300a4d6b3135303d5374696d756c75732c53312c343832363035392c312c300a4d6b3135313d5374696d756c75732c53312c343837383031352c312c300a4d6b3135323d5374696d756c75732c53322c343930303738322c312c300a4d6b3135333d5374696d756c75732c53312c343932333633342c312c300a4d6b3135343d5374696d756c75732c53322c343934363430312c312c300a4d6b3135353d5374696d756c75732c53312c343936393333352c312c300a4d6b3135363d5374696d756c75732c53322c343939323337332c312c300a4d6b3135373d5374696d756c75732c53312c353031353730362c312c300a4d6b3135383d5374696d756c75732c53312c353033383535342c312c300a4d6b3135393d5374696d756c75732c53312c353036313531302c312c300a4d6b3136303d5374696d756c75732c53312c353038343235362c312c300a4d6b3136313d5374696d756c75732c53312c353132353337332c312c300a4d6b3136323d5374696d756c75732c53312c353134383232322c312c300a4d6b3136333d5374696d756c75732c53322c353137313332332c312c300a4d6b3136343d5374696d756c75732c53312c353139343434362c312c300a4d6b3136353d5374696d756c75732c53312c353231373338302c312c300a4d6b3136363d5374696d756c75732c53312c353234303536342c312c300a4d6b3136373d5374696d756c75732c53322c353236333536302c312c300a4d6b3136383d5374696d756c75732c53312c353238363537382c312c300a4d6b3136393d5374696d756c75732c53312c353330393336372c312c300a4d6b3137303d5374696d756c75732c53312c353333323533302c312c300a4d6b3137313d5374696d756c75732c53322c353335353338312c312c300a4d6b3137323d5374696d756c75732c53312c353337383438362c312c300a4d6b3137333d5374696d756c75732c53312c353430313530312c312c300a4d6b3137343d5374696d756c75732c53322c353432343630302c312c300a4d6b3137353d5374696d756c75732c53312c353434373533352c312c300a4d6b3137363d5374696d756c75732c53312c353437303731392c312c300a4d6b3137373d5374696d756c75732c53312c353439333635332c312c300a4d6b3137383d5374696d756c75732c53312c353531363932312c312c300a4d6b3137393d5374696d756c75732c53312c353533393737312c312c300a4d6b3138303d5374696d756c75732c53312c353536323738392c312c300a4d6b3138313d5374696d756c75732c53322c353633333638302c312c300a4d6b3138323d5374696d756c75732c53312c353635363737392c312c300a4d6b3138333d5374696d756c75732c53312c353637393837392c312c300a4d6b3138343d5374696d756c75732c53312c353730323732392c312c300a4d6b3138353d5374696d756c75732c53322c353732353931342c312c300a4d6b3138363d5374696d756c75732c53312c353739373234312c312c300a4d6b3138373d5374696d756c75732c53312c353832303036392c312c300a4d6b3138383d5374696d756c75732c53312c353834333038372c312c300a4d6b3138393d5374696d756c75732c53312c353836363032312c312c300a4d6b3139303d5374696d756c75732c53322c353838393337352c312c300a4d6b3139313d5374696d756c75732c53312c353931323438312c312c300a4d6b3139323d5374696d756c75732c53312c353934343538312c312c300a4d6b3139333d5374696d756c75732c53312c353939303033332c312c300a4d6b3139343d5374696d756c75732c53322c363031323838332c312c300a4d6b3139353d5374696d756c75732c53312c363033353735372c312c300a4d6b3139363d5374696d756c75732c53322c363035383636392c312c300a4d6b3139373d5374696d756c75732c53312c363038313935382c312c300a4d6b3139383d5374696d756c75732c53312c363130343837322c312c300a4d6b3139393d5374696d756c75732c53322c363132373838372c312c300a4d6b3230303d5374696d756c75732c53312c363135343832352c312c300a4d6b3230313d5374696d756c75732c53322c363139383633302c312c300a4d6b3230323d5374696d756c75732c53312c363730373939382c312c300a4d6b3230333d5374696d756c75732c53322c363733313033382c312c300a4d6b3230343d5374696d756c75732c53322c363735343238332c312c300a4d6b3230353d5374696d756c75732c53322c363737373135362c312c300a4d6b3230363d5374696d756c75732c53312c363830303438352c312c300a4d6b3230373d5374696d756c75732c53312c363832333237352c312c300a4d6b3230383d5374696d756c75732c53312c363834363138392c312c300a4d6b3230393d5374696d756c75732c53322c363836393533382c312c300a4d6b3231303d5374696d756c75732c53312c363839323535352c312c300a4d6b3231313d5374696d756c75732c53312c363931353734302c312c300a4d6b3231323d5374696d756c75732c53322c363933383539312c312c300a4d6b3231333d5374696d756c75732c53312c363936313639322c312c300a4d6b3231343d5374696d756c75732c53322c363938343936302c312c300a4d6b3231353d5374696d756c75732c53312c373030383036302c312c300a4d6b3231363d5374696d756c75732c53312c373033303933322c312c300a4d6b3231373d5374696d756c75732c53312c373035343230302c312c300a4d6b3231383d5374696d756c75732c53312c373037373131332c312c300a4d6b3231393d5374696d756c75732c53322c373039393938362c312c300a4d6b3232303d5374696d756c75732c53312c373132333036352c312c300a4d6b3232313d5374696d756c75732c53322c373134363137302c312c300a4d6b3232323d5374696d756c75732c53312c373136393237302c312c300a4d6b3232333d5374696d756c75732c53312c373139323338392c312c300a4d6b3232343d5374696d756c75732c53322c373231353330332c312c300a4d6b3232353d5374696d756c75732c53322c373235363433392c312c300a4d6b3232363d5374696d756c75732c53312c373237393534302c312c300a4d6b3232373d5374696d756c75732c53322c373330323631392c312c300a4d6b3232383d5374696d756c75732c53312c373332353439322c312c300a4d6b3232393d5374696d756c75732c53322c373334383235382c312c300a4d6b3233303d5374696d756c75732c53312c373337313137312c312c300a4d6b3233313d5374696d756c75732c53312c373430353131372c312c300a4d6b3233323d5374696d756c75732c53322c373432373938362c312c300a4d6b3233333d5374696d756c75732c53312c373435303733332c312c300a4d6b3233343d5374696d756c75732c53312c373437343038342c312c300a4d6b3233353d5374696d756c75732c53322c373439373132322c312c300a4d6b3233363d5374696d756c75732c53312c373532303131392c312c300a4d6b3233373d5374696d756c75732c53322c373534333232312c312c300a4d6b3233383d5374696d756c75732c53312c373536363637352c312c300a4d6b3233393d5374696d756c75732c53322c373538393833392c312c300a4d6b3234303d5374696d756c75732c53312c373631333033302c312c300a4d6b3234313d5374696d756c75732c53312c373633363132362c312c300a4d6b3234323d5374696d756c75732c53322c373635393134322c312c300a4d6b3234333d5374696d756c75732c53312c373732353133302c312c300a4d6b3234343d5374696d756c75732c53312c373734383034332c312c300a4d6b3234353d5374696d756c75732c53322c373737313134342c312c300a4d6b3234363d5374696d756c75732c53312c373739343138332c312c300a4d6b3234373d5374696d756c75732c53322c373831373236322c312c300a4d6b3234383d5374696d756c75732c53312c373834303131332c312c300a4d6b3234393d5374696d756c75732c53322c373836333034382c312c300a4d6b3235303d5374696d756c75732c53312c373930333833322c312c300a4d6b3235313d5374696d756c75732c53322c373932363935312c312c300a4d6b3235323d5374696d756c75732c53312c373935303033312c312c300a4d6b3235333d5374696d756c75732c53312c373937333133312c312c300a4d6b3235343d5374696d756c75732c53322c373939363135302c312c300a4d6b3235353d5374696d756c75732c53312c383031393235302c312c300a4d6b3235363d5374696d756c75732c53312c383035323534382c312c300a4d6b3235373d5374696d756c75732c53322c383037353337372c312c300a4d6b3235383d5374696d756c75732c53322c383130383831392c312c300a4d6b3235393d5374696d756c75732c53312c383135313335332c312c300a4d6b3236303d5374696d756c75732c53322c383139323231362c312c300a4d6b3236313d5374696d756c75732c53312c383231353135312c312c300a4d6b3236323d5374696d756c75732c53312c383233383235322c312c300a4d6b3236333d5374696d756c75732c53312c383236313335322c312c300a4d6b3236343d5374696d756c75732c53312c383238343230332c312c300a4d6b3236353d5374696d756c75732c53322c383330373332352c312c300a4d6b3236363d5374696d756c75732c53312c383333303332322c312c300a4d6b3236373d5374696d756c75732c53312c383335383334332c312c300a4d6b3236383d5374696d756c75732c53312c383338313631342c312c300a4d6b3236393d5374696d756c75732c53322c383430343838322c312c300a4d6b3237303d5374696d756c75732c53312c383434353638312c312c300a4d6b3237313d5374696d756c75732c53322c383436383932372c312c300a4d6b3237323d5374696d756c75732c53312c383439313737392c312c300a4d6b3237333d5374696d756c75732c53312c383531353036382c312c300a4d6b3237343d5374696d756c75732c53322c383533383036352c312c300a4d6b3237353d5374696d756c75732c53312c383536313136362c312c300a4d6b3237363d5374696d756c75732c53312c383538343039392c312c300a4d6b3237373d5374696d756c75732c53312c383631393034332c312c300a4d6b3237383d5374696d756c75732c53312c383635303438342c312c300a4d6b3237393d5374696d756c75732c53322c383637333334312c312c300a4d6b3238303d5374696d756c75732c53312c383639363236382c312c300a4d6b3238313d5374696d756c75732c53322c383731393330382c312c300a4d6b3238323d5374696d756c75732c53312c383736303036372c312c300a4d6b3238333d5374696d756c75732c53322c383738333431392c312c300a4d6b3238343d5374696d756c75732c53312c383830363531382c312c300a4d6b3238353d5374696d756c75732c53312c383832393337302c312c300a4d6b3238363d5374696d756c75732c53312c383835333133392c312c300a4d6b3238373d5374696d756c75732c53312c383839343038362c312c300a4d6b3238383d5374696d756c75732c53322c383931373138372c312c300a4d6b3238393d5374696d756c75732c53322c383934303033382c312c300a4d6b3239303d5374696d756c75732c53312c383936333535362c312c300a4d6b3239313d5374696d756c75732c53312c383938363834352c312c300a4d6b3239323d5374696d756c75732c53312c393034393536312c312c300a4d6b3239333d5374696d756c75732c53312c393037323734352c312c300a4d6b3239343d5374696d756c75732c53312c393039353832342c312c300a4d6b3239353d5374696d756c75732c53322c393131383736332c312c300a4d6b3239363d5374696d756c75732c53312c393134313639362c312c300a4d6b3239373d5374696d756c75732c53322c393136343632372c312c300a4d6b3239383d5374696d756c75732c53322c393138373732372c312c300a4d6b3239393d5374696d756c75732c53312c393231303931332c312c300a4d6b3330303d5374696d756c75732c53322c393233343230322c312c300a4d6b3330313d5374696d756c75732c53312c393235373437302c312c300a", + "expected": { + "format": "brainvision-markers", + "summary": "BrainVision markers, 301 markers, Stimulus x300 New Segment x1", + "fields": { + "brainVisionVersion": "1.0", + "dataFile": "sub-05_task-matchingpennies_eeg.eeg", + "codepage": "UTF-8", + "markersRead": 301, + "markersComplete": true, + "markers": [ + { + "type": "New Segment", + "position": 1, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 90778, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 114961, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 137819, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 178260, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 201297, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 245081, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 289116, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 311864, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 337969, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 400512, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 423364, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 446569, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 469567, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S1", + "position": 492771, + "size": 1, + "channel": 0 + }, + { + "type": "Stimulus", + "description": "S2", + "position": 532946, + "size": 1, + "channel": 0 + } + ], + "markerTypes": { + "Stimulus": 300, + "New Segment": 1 + } + } + } + }, + { + "name": "sub-35_task-rest_eeg.vhdr (Version 2.0, VECTORIZED, with DataPoints and electrode coordinates)", + "key": "sub-35_task-rest_eeg.vhdr", + "hex": "427261696e20566973696f6e20446174612045786368616e6765204865616465722046696c652056657273696f6e20322e300a3b204461746120637265617465642066726f6d20686973746f727920706174683a2032303133303432343335303030322f52617720446174612f45646974204d61726b6572732f736574207363616e206d61726b6572732f5363616e6e657220417274696661637420436f7272656374696f6e2f46696c746572732f50756c736520417274696661637420436f7272656374696f6e2f50756c736520417274696661637420436f7272656374696f6e0a0a5b436f6d6d6f6e20496e666f735d0a436f6465706167653d5554462d380a4461746146696c653d7375622d33355f7461736b2d726573745f6565672e6461740a4d61726b657246696c653d7375622d33355f7461736b2d726573745f6565672e766d726b0a44617461466f726d61743d42494e4152590a3b2044617461206f7269656e746174696f6e3a20564543544f52495a45443d6368312c7074312c206368312c7074322e2e2e2c204d554c5449504c455845443d6368312c7074312c206368322c707431202e2e2e0a446174614f7269656e746174696f6e3d564543544f52495a45440a44617461547970653d54494d45444f4d41494e0a4e756d6265724f664368616e6e656c733d36340a44617461506f696e74733d3139373233350a3b2053616d706c696e6720696e74657276616c20696e206d6963726f7365636f6e64732069662074696d6520646f6d61696e2028636f6e7665727420746f20486572747a3a0a3b2031303030303030202f2053616d706c696e67496e74657276616c29206f7220696e20486572747a206966206672657175656e637920646f6d61696e3a0a53616d706c696e67496e74657276616c3d343030300a0a5b5573657220496e666f735d0a3b204561636820656e7472793a2050726f703c4e756d6265723e3d3c547970653e2c3c4e616d653e2c3c56616c75653e2c3c56616c7565323e2c2e2e2e2c3c56616c75654e3e0a3b2050726f7065727479206e756d626572206d75737420626520756e697175652e2054797065732063616e20626520696e742c2073696e676c652c20737472696e672c20626f6f6c2c20627974652c20646f75626c652c2075696e740a3b206f7220617272617973206f662074686f73652c20696e6469636174656420696e742d6172726179206574630a3b2041727261792074797065732068617665206d6f7265207468616e206f6e652076616c75652c206e756d626572206f662076616c7565732064657465726d696e65732073697a65206f662061727261792e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20636f6d6d617320696e20737472696e677320617265207772697474656e205c310a0a5b42696e61727920496e666f735d0a42696e617279466f726d61743d494545455f464c4f41545f33320a0a5b4368616e6e656c20496e666f735d0a3b204561636820656e7472793a2043683c4368616e6e656c206e756d6265723e3d3c4e616d653e2c3c5265666572656e6365206368616e6e656c206e616d653e2c0a3b203c5265736f6c7574696f6e20696e2022556e6974223e2c3c556e69743e2c2046757475726520657874656e73696f6e732e2e2e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20736f6d65206669656c6473206d69676874206265206f6d69747465642028656d707479292e0a3b20436f6d6d617320696e206368616e6e656c206e616d65732061726520636f64656420617320225c31222e0a4368313d4670312c2c2cc2b5560a4368323d4670322c2c2cc2b5560a4368333d46332c2c2cc2b5560a4368343d46342c2c2cc2b5560a4368353d43332c2c2cc2b5560a4368363d43342c2c2cc2b5560a4368373d50332c2c2cc2b5560a4368383d50342c2c2cc2b5560a4368393d4f312c2c2cc2b5560a436831303d4f322c2c2cc2b5560a436831313d46372c2c2cc2b5560a436831323d46382c2c2cc2b5560a436831333d54372c2c2cc2b5560a436831343d54382c2c2cc2b5560a436831353d50372c2c2cc2b5560a436831363d50382c2c2cc2b5560a436831373d467a2c2c2cc2b5560a436831383d437a2c2c2cc2b5560a436831393d507a2c2c2cc2b5560a436832303d4f7a2c2c2cc2b5560a436832313d4643312c2c2cc2b5560a436832323d4643322c2c2cc2b5560a436832333d4350312c2c2cc2b5560a436832343d4350322c2c2cc2b5560a436832353d4643352c2c2cc2b5560a436832363d4643362c2c2cc2b5560a436832373d4350352c2c2cc2b5560a436832383d4350362c2c2cc2b5560a436832393d5450392c2c2cc2b5560a436833303d545031302c2c2cc2b5560a436833313d504f7a2c2c2cc2b5560a436833323d4543472c2c2cc2b5560a436833333d4146332c2c2cc2b5560a436833343d4146342c2c2cc2b5560a436833353d4643332c2c2cc2b5560a436833363d4643342c2c2cc2b5560a436833373d4350332c2c2cc2b5560a436833383d4350342c2c2cc2b5560a436833393d504f332c2c2cc2b5560a436834303d504f342c2c2cc2b5560a436834313d46352c2c2cc2b5560a436834323d46362c2c2cc2b5560a436834333d43352c2c2cc2b5560a436834343d43362c2c2cc2b5560a436834353d50352c2c2cc2b5560a436834363d50362c2c2cc2b5560a436834373d4146372c2c2cc2b5560a436834383d4146382c2c2cc2b5560a436834393d4654372c2c2cc2b5560a436835303d4654382c2c2cc2b5560a436835313d5450372c2c2cc2b5560a436835323d5450382c2c2cc2b5560a436835333d504f372c2c2cc2b5560a436835343d504f382c2c2cc2b5560a436835353d4654392c2c2cc2b5560a436835363d465431302c2c2cc2b5560a436835373d50392c2c2cc2b5560a436835383d5031302c2c2cc2b5560a436835393d504f392c2c2cc2b5560a436836303d504f31302c2c2cc2b5560a436836313d4f392c2c2cc2b5560a436836323d4f31302c2c2cc2b5560a436836333d46707a2c2c2cc2b5560a436836343d43507a2c2c2cc2b5560a0a5b4368616e6e656c205573657220496e666f735d0a3b204561636820656e7472793a2050726f703c4e756d6265723e3d43683c4368616e6e656c4e756d6265723e2c3c547970653e2c3c4e616d653e2c3c56616c75653e2c3c56616c7565323e2c2e2e2e2c3c56616c75654e3e0a3b2050726f7065727479206e756d626572206d75737420626520756e697175652e2054797065732063616e20626520696e742c2073696e676c652c20737472696e672c20626f6f6c2c20627974652c20646f75626c652c2075696e740a3b206f7220617272617973206f662074686f73652c20696e6469636174656420696e742d6172726179206574630a3b2041727261792074797065732068617665206d6f7265207468616e206f6e652076616c75652c206e756d626572206f662076616c7565732064657465726d696e65732073697a65206f662061727261792e0a3b204669656c6473206172652064656c696d6974656420627920636f6d6d61732c20636f6d6d617320696e20737472696e677320617265207772697474656e205c310a3b2050726f70657274696573206172652061737369676e656420746f206368616e6e656c73207573696e67207468656972206368616e6e656c206e756d6265722e0a0a5b436f6f7264696e617465735d0a3b204561636820656e7472793a2043683c4368616e6e656c206e756d6265723e3d3c5261646975733e2c3c54686574613e2c3c5068693e0a4368313d312c2d39302c2d37320a4368323d312c39302c37320a4368333d312c2d36302c2d35310a4368343d312c36302c35310a4368353d312c2d34352c300a4368363d312c34352c300a4368373d312c2d36302c35310a4368383d312c36302c2d35310a4368393d312c2d39302c37320a436831303d312c39302c2d37320a436831313d312c2d39302c2d33360a436831323d312c39302c33360a436831333d312c2d39302c300a436831343d312c39302c300a436831353d312c2d39302c33360a436831363d312c39302c2d33360a436831373d312c34352c39300a436831383d312c302c300a436831393d312c34352c2d39300a436832303d312c39302c2d39300a436832313d312c2d33312c2d34360a436832323d312c33312c34360a436832333d312c2d33312c34360a436832343d312c33312c2d34360a436832353d312c2d36392c2d32310a436832363d312c36392c32310a436832373d312c2d36392c32310a436832383d312c36392c2d32310a436832393d312c2d3131332c31380a436833303d312c3131332c2d31380a436833313d312c36372c2d39300a436833323d302c302c300a436833333d312c2d37342c2d36380a436833343d312c37342c36380a436833353d312c2d34392c2d32390a436833363d312c34392c32390a436833373d312c2d34392c32390a436833383d312c34392c2d32390a436833393d312c2d37342c36380a436834303d312c37342c2d36380a436834313d312c2d37342c2d34310a436834323d312c37342c34310a436834333d312c2d36382c300a436834343d312c36382c300a436834353d312c2d37342c34310a436834363d312c37342c2d34310a436834373d312c2d39302c2d35340a436834383d312c39302c35340a436834393d312c2d39302c2d31380a436835303d312c39302c31380a436835313d312c2d39302c31380a436835323d312c39302c2d31380a436835333d312c2d39302c35340a436835343d312c39302c2d35340a436835353d312c2d3131332c2d31380a436835363d312c3131332c31380a436835373d312c2d3131332c33360a436835383d312c3131332c2d33360a436835393d312c2d3131332c35340a436836303d312c3131332c2d35340a436836313d312c2d3131322c37320a436836323d312c3131322c2d37320a436836333d312c39302c39300a436836343d312c32322c2d39300a", + "expected": { + "format": "brainvision", + "summary": "BrainVision, 64 channels, 250 Hz, ieee_float_32 vectorized", + "fields": { + "brainVisionVersion": "2.0", + "dataFile": "sub-35_task-rest_eeg.dat", + "markerFile": "sub-35_task-rest_eeg.vmrk", + "dataFormat": "BINARY", + "dataOrientation": "VECTORIZED", + "dataType": "TIMEDOMAIN", + "codepage": "UTF-8", + "channelCount": 64, + "samplingIntervalMicroseconds": 4000.0, + "samplingRateHz": 250.0, + "dataPoints": 197235, + "durationSeconds": 788.94, + "binaryFormat": "IEEE_FLOAT_32", + "bytesPerSample": 4, + "byteOrder": "little", + "channelNames": [ + "Fp1", + "Fp2", + "F3", + "F4", + "C3", + "C4", + "P3", + "P4", + "O1", + "O2", + "F7", + "F8", + "T7", + "T8", + "P7", + "P8", + "Fz", + "Cz", + "Pz", + "Oz", + "FC1", + "FC2", + "CP1", + "CP2", + "FC5", + "FC6", + "CP5", + "CP6", + "TP9", + "TP10", + "POz", + "ECG", + "AF3", + "AF4", + "FC3", + "FC4", + "CP3", + "CP4", + "PO3", + "PO4", + "F5", + "F6", + "C5", + "C6", + "P5", + "P6", + "AF7", + "AF8", + "FT7", + "FT8", + "TP7", + "TP8", + "PO7", + "PO8", + "FT9", + "FT10", + "P9", + "P10", + "PO9", + "PO10", + "O9", + "O10", + "Fpz", + "CPz" + ], + "channels": [ + { + "name": "Fp1", + "unit": "\u00b5V" + }, + { + "name": "Fp2", + "unit": "\u00b5V" + }, + { + "name": "F3", + "unit": "\u00b5V" + }, + { + "name": "F4", + "unit": "\u00b5V" + }, + { + "name": "C3", + "unit": "\u00b5V" + }, + { + "name": "C4", + "unit": "\u00b5V" + }, + { + "name": "P3", + "unit": "\u00b5V" + }, + { + "name": "P4", + "unit": "\u00b5V" + }, + { + "name": "O1", + "unit": "\u00b5V" + }, + { + "name": "O2", + "unit": "\u00b5V" + }, + { + "name": "F7", + "unit": "\u00b5V" + }, + { + "name": "F8", + "unit": "\u00b5V" + }, + { + "name": "T7", + "unit": "\u00b5V" + }, + { + "name": "T8", + "unit": "\u00b5V" + }, + { + "name": "P7", + "unit": "\u00b5V" + }, + { + "name": "P8", + "unit": "\u00b5V" + }, + { + "name": "Fz", + "unit": "\u00b5V" + }, + { + "name": "Cz", + "unit": "\u00b5V" + }, + { + "name": "Pz", + "unit": "\u00b5V" + }, + { + "name": "Oz", + "unit": "\u00b5V" + }, + { + "name": "FC1", + "unit": "\u00b5V" + }, + { + "name": "FC2", + "unit": "\u00b5V" + }, + { + "name": "CP1", + "unit": "\u00b5V" + }, + { + "name": "CP2", + "unit": "\u00b5V" + }, + { + "name": "FC5", + "unit": "\u00b5V" + }, + { + "name": "FC6", + "unit": "\u00b5V" + }, + { + "name": "CP5", + "unit": "\u00b5V" + }, + { + "name": "CP6", + "unit": "\u00b5V" + }, + { + "name": "TP9", + "unit": "\u00b5V" + }, + { + "name": "TP10", + "unit": "\u00b5V" + }, + { + "name": "POz", + "unit": "\u00b5V" + }, + { + "name": "ECG", + "unit": "\u00b5V" + }, + { + "name": "AF3", + "unit": "\u00b5V" + }, + { + "name": "AF4", + "unit": "\u00b5V" + }, + { + "name": "FC3", + "unit": "\u00b5V" + }, + { + "name": "FC4", + "unit": "\u00b5V" + }, + { + "name": "CP3", + "unit": "\u00b5V" + }, + { + "name": "CP4", + "unit": "\u00b5V" + }, + { + "name": "PO3", + "unit": "\u00b5V" + }, + { + "name": "PO4", + "unit": "\u00b5V" + }, + { + "name": "F5", + "unit": "\u00b5V" + }, + { + "name": "F6", + "unit": "\u00b5V" + }, + { + "name": "C5", + "unit": "\u00b5V" + }, + { + "name": "C6", + "unit": "\u00b5V" + }, + { + "name": "P5", + "unit": "\u00b5V" + }, + { + "name": "P6", + "unit": "\u00b5V" + }, + { + "name": "AF7", + "unit": "\u00b5V" + }, + { + "name": "AF8", + "unit": "\u00b5V" + }, + { + "name": "FT7", + "unit": "\u00b5V" + }, + { + "name": "FT8", + "unit": "\u00b5V" + }, + { + "name": "TP7", + "unit": "\u00b5V" + }, + { + "name": "TP8", + "unit": "\u00b5V" + }, + { + "name": "PO7", + "unit": "\u00b5V" + }, + { + "name": "PO8", + "unit": "\u00b5V" + }, + { + "name": "FT9", + "unit": "\u00b5V" + }, + { + "name": "FT10", + "unit": "\u00b5V" + }, + { + "name": "P9", + "unit": "\u00b5V" + }, + { + "name": "P10", + "unit": "\u00b5V" + }, + { + "name": "PO9", + "unit": "\u00b5V" + }, + { + "name": "PO10", + "unit": "\u00b5V" + }, + { + "name": "O9", + "unit": "\u00b5V" + }, + { + "name": "O10", + "unit": "\u00b5V" + }, + { + "name": "Fpz", + "unit": "\u00b5V" + }, + { + "name": "CPz", + "unit": "\u00b5V" + } + ], + "channelsRead": 64, + "hasCoordinates": true + } + } + } + ] +} diff --git a/tests/fixtures/edf-cases.json b/tests/fixtures/edf-cases.json new file mode 100644 index 0000000..c607452 --- /dev/null +++ b/tests/fixtures/edf-cases.json @@ -0,0 +1,695 @@ +{ + "_comment": "Headers only (256 bytes plus 256 per signal), cut from real files. The first is the PhysioNet Sleep-EDF Expanded cassette recording SC4001E0-PSG.edf, fetched by Range request; the rest were written by pyedflib 0.1.42. Every expected value in those five was checked against pyedflib's own reader at generation time. The PhysioNet case was not: pyedflib refuses to open a file whose samples are absent, and PhysioNet truncated every attempt to download all 48 MB of it. Its header is self-checking (declared header bytes 2048 = 256 x (7 + 1), records x duration = 79500 s) and its fields were read against the Sleep-EDF documentation. Two intended differences from pyedflib: it hides the EDF+ annotations channel from its signal list, so its count is this one minus annotationSignalCount, and its start time carries the sub-second offset that lives in the annotations record, not in the header.", + "cases": [ + { + "name": "PhysioNet Sleep-EDF SC4001E0-PSG.edf (real, 7 signals)", + "key": "SC4001E0-PSG.edf", + "hex": "302020202020202058204620582046656d616c655f333379722020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020205374617274646174652032342d4150522d31393839205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202032342e30342e383931362e31332e30303230343820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202032363530202020203330202020202020372020204545472046707a2d437a20202020202045454720507a2d4f7a20202020202020454f4720686f72697a6f6e74616c202052657370206f726f2d6e6173616c2020454d47207375626d656e74616c20202054656d702072656374616c20202020204576656e74206d61726b65722020202041672d4167436c20656c656374726f646573202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202041672d4167436c20656c656374726f646573202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202041672d4167436c20656c656374726f64657320202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204f72616c2d6e6173616c20746865726d6973746f72732020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202041672d4167436c20656c656374726f646573202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202052656374616c20746865726d6973746f722020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204d61726b657220627574746f6e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202075562020202020207556202020202020755620202020202020202020202020207556202020202020446567432020202020202020202020202d313932202020202d313937202020202d313030392020202d323034382020202d3520202020202033342020202020202d3230343720202031393220202020203139362020202020313030392020202032303437202020203520202020202020343020202020202032303438202020202d323034382020202d323034382020202d323034382020202d323034382020202d323530302020202d323834392020202d32303437202020323034372020202032303437202020203230343720202020323034372020202032353030202020203237333120202020323034382020202048503a302e35487a204c503a313030487a205b656e68616e6365642063617373657474652042575d2020202020202020202020202020202020202020202020202020202020202020202020202020202048503a302e35487a204c503a313030487a205b656e68616e6365642063617373657474652042575d2020202020202020202020202020202020202020202020202020202020202020202020202020202048503a302e35487a204c503a313030487a205b656e68616e6365642063617373657474652042575d2020202020202020202020202020202020202020202020202020202020202020202020202020202048503a302e3033487a204c503a302e39487a202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202048503a3136487a2052656374696669636174696f6e204c503a302e37487a20202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020486f6c6420647572696e672032207365636f6e6473202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202033303030202020203330303020202020333030302020202033302020202020203330202020202020333020202020202033302020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "EDF recording, 7 signals, 22:05:00", + "fields": { + "edfType": "EDF", + "bitDepth": 16, + "headerBytes": 2048, + "signalCount": 7, + "startDateTime": "1989-04-24T16:13:00", + "patient": "X F X Female_33yr", + "subjectSex": "F", + "subjectName": "Female_33yr", + "recording": "Startdate 24-APR-1989 X X X", + "numDataRecords": 2650, + "dataRecordDurationSeconds": 30.0, + "headerComplete": true, + "signalLabels": [ + "EEG Fpz-Cz", + "EEG Pz-Oz", + "EOG horizontal", + "Resp oro-nasal", + "EMG submental", + "Temp rectal", + "Event marker" + ], + "signals": [ + { + "label": "EEG Fpz-Cz", + "physicalDimension": "uV", + "physicalMin": -192.0, + "physicalMax": 192.0, + "digitalMin": -2048, + "digitalMax": 2047, + "samplesPerRecord": 3000, + "samplingRateHz": 100.0, + "transducer": "Ag-AgCl electrodes", + "prefiltering": "HP:0.5Hz LP:100Hz [enhanced cassette BW]" + }, + { + "label": "EEG Pz-Oz", + "physicalDimension": "uV", + "physicalMin": -197.0, + "physicalMax": 196.0, + "digitalMin": -2048, + "digitalMax": 2047, + "samplesPerRecord": 3000, + "samplingRateHz": 100.0, + "transducer": "Ag-AgCl electrodes", + "prefiltering": "HP:0.5Hz LP:100Hz [enhanced cassette BW]" + }, + { + "label": "EOG horizontal", + "physicalDimension": "uV", + "physicalMin": -1009.0, + "physicalMax": 1009.0, + "digitalMin": -2048, + "digitalMax": 2047, + "samplesPerRecord": 3000, + "samplingRateHz": 100.0, + "transducer": "Ag-AgCl electrodes", + "prefiltering": "HP:0.5Hz LP:100Hz [enhanced cassette BW]" + }, + { + "label": "Resp oro-nasal", + "physicalMin": -2048.0, + "physicalMax": 2047.0, + "digitalMin": -2048, + "digitalMax": 2047, + "samplesPerRecord": 30, + "samplingRateHz": 1.0, + "transducer": "Oral-nasal thermistors", + "prefiltering": "HP:0.03Hz LP:0.9Hz" + }, + { + "label": "EMG submental", + "physicalDimension": "uV", + "physicalMin": -5.0, + "physicalMax": 5.0, + "digitalMin": -2500, + "digitalMax": 2500, + "samplesPerRecord": 30, + "samplingRateHz": 1.0, + "transducer": "Ag-AgCl electrodes", + "prefiltering": "HP:16Hz Rectification LP:0.7Hz" + }, + { + "label": "Temp rectal", + "physicalDimension": "DegC", + "physicalMin": 34.0, + "physicalMax": 40.0, + "digitalMin": -2849, + "digitalMax": 2731, + "samplesPerRecord": 30, + "samplingRateHz": 1.0, + "transducer": "Rectal thermistor" + }, + { + "label": "Event marker", + "physicalMin": -2047.0, + "physicalMax": 2048.0, + "digitalMin": -2047, + "digitalMax": 2048, + "samplesPerRecord": 30, + "samplingRateHz": 1.0, + "transducer": "Marker button", + "prefiltering": "Hold during 2 seconds" + } + ], + "durationSeconds": 79500.0 + } + } + }, + { + "name": "pyedflib test_generator.edf (EDF+C, 11 signals plus annotations)", + "key": "test_generator.edf", + "hex": "302020202020202061626378797a3939204d2033302d4a554e2d313936392048616e735f4d756c6c65722070617469656e7420202020202020202020202020202020202020202020202020202020202020202020202020205374617274646174652030342d4150522d323031312044722e5f58204d722e5f53706f74747920746573745f67656e657261746f7220756e697420746573742066696c6520202020202020202020202030342e30342e313131322e35372e303233333238202020204544462b4320202020202020202020202020202020202020202020202020202020202020202020202020202036303020202020203120202020202020313220207371756172657761766520202020202072616d7020202020202020202020202070756c736520202020202020202020206e6f697365202020202020202020202073696e65203120487a2020202020202073696e65203820487a2020202020202073696e6520382e3137373720487a202073696e6520382e3520487a202020202073696e6520313520487a20202020202073696e6520313720487a20202020202073696e6520353020487a20202020202045444620416e6e6f746174696f6e73207472616e73312020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202020202020202020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d312020202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031202020202020202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d33323736382020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020707265312020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203537202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "EDF+C recording, 12 signals, 10:00, 200 Hz", + "fields": { + "edfType": "EDF+C", + "bitDepth": 16, + "headerBytes": 3328, + "signalCount": 12, + "startDateTime": "2011-04-04T12:57:02", + "patient": "abcxyz99 M 30-JUN-1969 Hans_Muller patient", + "subjectCode": "abcxyz99", + "subjectSex": "M", + "subjectBirthdate": "30-JUN-1969", + "subjectName": "Hans_Muller patient", + "recording": "Startdate 04-APR-2011 Dr._X Mr._Spotty test_generator unit test file", + "hospitalCode": "Dr._X", + "technician": "Mr._Spotty", + "equipment": "test_generator", + "reserved": "EDF+C", + "numDataRecords": 600, + "dataRecordDurationSeconds": 1.0, + "headerComplete": true, + "signalLabels": [ + "squarewave", + "ramp", + "pulse", + "noise", + "sine 1 Hz", + "sine 8 Hz", + "sine 8.1777 Hz", + "sine 8.5 Hz", + "sine 15 Hz", + "sine 17 Hz", + "sine 50 Hz", + "EDF Annotations" + ], + "signals": [ + { + "label": "squarewave", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0, + "transducer": "trans1", + "prefiltering": "pre1" + }, + { + "label": "ramp", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "pulse", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "noise", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 1 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8.1777 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8.5 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 15 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 17 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 50 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "EDF Annotations", + "physicalMin": -1.0, + "physicalMax": 1.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 57, + "samplingRateHz": 57.0, + "annotations": true + } + ], + "annotationSignalCount": 1, + "samplingRateHz": 200.0, + "durationSeconds": 600.0 + } + } + }, + { + "name": "pyedflib test_legacy.edf (plain EDF carrying an annotations channel)", + "key": "test_legacy.edf", + "hex": "30202020202020204c65676163792070617469656e74206465736372697074696f6e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020204c6567616379207265636f7264696e67206465736372697074696f6e2020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202030342e30342e313131322e35372e30323333323820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202036303020202020203120202020202020313220207371756172657761766520202020202072616d7020202020202020202020202070756c736520202020202020202020206e6f697365202020202020202020202073696e65203120487a2020202020202073696e65203820487a2020202020202073696e6520382e3137373720487a202073696e6520382e3520487a202020202073696e6520313520487a20202020202073696e6520313720487a20202020202073696e6520353020487a20202020202045444620416e6e6f746174696f6e73207472616e73312020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202020202020202020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d313030302020202d312020202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031303030202020203130303020202020313030302020202031202020202020202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d333237363820202d33323736382020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020333237363720202033323736372020203332373637202020707265312020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203230302020202020323030202020202032303020202020203537202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "EDF recording, 12 signals, 10:00, 200 Hz", + "fields": { + "edfType": "EDF", + "bitDepth": 16, + "headerBytes": 3328, + "signalCount": 12, + "startDateTime": "2011-04-04T12:57:02", + "patient": "Legacy patient description", + "recording": "Legacy recording description", + "numDataRecords": 600, + "dataRecordDurationSeconds": 1.0, + "headerComplete": true, + "signalLabels": [ + "squarewave", + "ramp", + "pulse", + "noise", + "sine 1 Hz", + "sine 8 Hz", + "sine 8.1777 Hz", + "sine 8.5 Hz", + "sine 15 Hz", + "sine 17 Hz", + "sine 50 Hz", + "EDF Annotations" + ], + "signals": [ + { + "label": "squarewave", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0, + "transducer": "trans1", + "prefiltering": "pre1" + }, + { + "label": "ramp", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "pulse", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "noise", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 1 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8.1777 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 8.5 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 15 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 17 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "sine 50 Hz", + "physicalDimension": "uV", + "physicalMin": -1000.0, + "physicalMax": 1000.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 200, + "samplingRateHz": 200.0 + }, + { + "label": "EDF Annotations", + "physicalMin": -1.0, + "physicalMax": 1.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 57, + "samplingRateHz": 57.0, + "annotations": true + } + ], + "annotationSignalCount": 1, + "samplingRateHz": 200.0, + "durationSeconds": 600.0 + } + } + }, + { + "name": "pyedflib test_subsecond.edf (EDF+C, one signal)", + "key": "test_subsecond.edf", + "hex": "30202020202020205820462032302d4a414e2d3139393820582c58202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020205374617274646174652032342d4a414e2d32303230205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202032342e30312e323030342e30352e353637363820202020204544462b4320202020202020202020202020202020202020202020202020202020202020202020202020202036393820202020203120202020202020322020204670312020202020202020202020202045444620416e6e6f746174696f6e7320202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207556202020202020202020202020202038373131202020202d312020202020202d3837313120202031202020202020202d333237363820202d3332373638202033323736372020203332373637202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020203132382020202020323020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "EDF+C recording, 2 signals, 11:38, 128 Hz", + "fields": { + "edfType": "EDF+C", + "bitDepth": 16, + "headerBytes": 768, + "signalCount": 2, + "startDateTime": "2020-01-24T04:05:56", + "patient": "X F 20-JAN-1998 X,X", + "subjectSex": "F", + "subjectBirthdate": "20-JAN-1998", + "subjectName": "X,X", + "recording": "Startdate 24-JAN-2020 X X X", + "reserved": "EDF+C", + "numDataRecords": 698, + "dataRecordDurationSeconds": 1.0, + "headerComplete": true, + "signalLabels": [ + "Fp1", + "EDF Annotations" + ], + "signals": [ + { + "label": "Fp1", + "physicalDimension": "uV", + "physicalMin": 8711.0, + "physicalMax": -8711.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 128, + "samplingRateHz": 128.0 + }, + { + "label": "EDF Annotations", + "physicalMin": -1.0, + "physicalMax": 1.0, + "digitalMin": -32768, + "digitalMax": 32767, + "samplesPerRecord": 20, + "samplingRateHz": 20.0, + "annotations": true + } + ], + "annotationSignalCount": 1, + "samplingRateHz": 128.0, + "durationSeconds": 698.0 + } + } + }, + { + "name": "pyedflib test_generator.bdf (BDF+C, 24-bit BioSemi)", + "key": "test_generator.bdf", + "hex": "ff42494f53454d4958205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020205374617274646174652030312d4a414e2d32303030205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202030312e30312e303030302e30302e303031373932202020204244462b43202020202020202020202020202020202020202020202020202020202020202020202020202020333020202020202031202020202020203620202073696e652035487a2020202020202020737175617265203133487a202020202072616d702037487a202020202020202070696e6b206e6f6973652020202020207768697465206e6f697365202020202042444620416e6e6f746174696f6e73202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202020202020202020202d333030302020202d333030302020202d333030302020202d333030302020202d333030302020202d312020202020203330303020202020333030302020202033303030202020203330303020202020333030302020202031202020202020202d383338383630382d383338383630382d383338383630382d383338383630382d383338383630382d38333838363038383338383630372038333838363037203833383836303720383338383630372038333838363037203833383836303720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020313030302020202038303020202020203530302020202020393735202020202039393920202020203338202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "BDF+C recording, 6 signals, 0:30", + "fields": { + "edfType": "BDF+C", + "bitDepth": 24, + "headerBytes": 1792, + "signalCount": 6, + "startDateTime": "2000-01-01T00:00:00", + "patient": "X X X X", + "recording": "Startdate 01-JAN-2000 X X X", + "reserved": "BDF+C", + "numDataRecords": 30, + "dataRecordDurationSeconds": 1.0, + "headerComplete": true, + "signalLabels": [ + "sine 5Hz", + "square 13Hz", + "ramp 7Hz", + "pink noise", + "white noise", + "BDF Annotations" + ], + "signals": [ + { + "label": "sine 5Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 1000, + "samplingRateHz": 1000.0 + }, + { + "label": "square 13Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 800, + "samplingRateHz": 800.0 + }, + { + "label": "ramp 7Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 500, + "samplingRateHz": 500.0 + }, + { + "label": "pink noise", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 975, + "samplingRateHz": 975.0 + }, + { + "label": "white noise", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 999, + "samplingRateHz": 999.0 + }, + { + "label": "BDF Annotations", + "physicalMin": -1.0, + "physicalMax": 1.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 38, + "samplingRateHz": 38.0, + "annotations": true + } + ], + "annotationSignalCount": 1, + "durationSeconds": 30.0 + } + } + }, + { + "name": "pyedflib test_generator_datarec_generator_0_5.bdf (half-second data records)", + "key": "test_generator_datarec_generator_0_5.bdf", + "hex": "ff42494f53454d4958205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020205374617274646174652030312d4a414e2d32303030205820582058202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202030312e30312e303030302e30302e303031373932202020204244462b432020202020202020202020202020202020202020202020202020202020202020202020202020203630202020202020302e3520202020203620202073696e65203130487a20202020202020737175617265203236487a202020202072616d70203134487a2020202020202070696e6b206e6f6973652020202020207768697465206e6f697365202020202042444620416e6e6f746174696f6e73202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020207556202020202020755620202020202075562020202020207556202020202020755620202020202020202020202020202d333030302020202d333030302020202d333030302020202d333030302020202d333030302020202d312020202020203330303020202020333030302020202033303030202020203330303020202020333030302020202031202020202020202d383338383630382d383338383630382d383338383630382d383338383630382d383338383630382d38333838363038383338383630372038333838363037203833383836303720383338383630372038333838363037203833383836303720202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020313030302020202038303020202020203530302020202020393735202020202039393920202020203338202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", + "expected": { + "format": "edf", + "summary": "BDF+C recording, 6 signals, 0:30", + "fields": { + "edfType": "BDF+C", + "bitDepth": 24, + "headerBytes": 1792, + "signalCount": 6, + "startDateTime": "2000-01-01T00:00:00", + "patient": "X X X X", + "recording": "Startdate 01-JAN-2000 X X X", + "reserved": "BDF+C", + "numDataRecords": 60, + "dataRecordDurationSeconds": 0.5, + "headerComplete": true, + "signalLabels": [ + "sine 10Hz", + "square 26Hz", + "ramp 14Hz", + "pink noise", + "white noise", + "BDF Annotations" + ], + "signals": [ + { + "label": "sine 10Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 1000, + "samplingRateHz": 2000.0 + }, + { + "label": "square 26Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 800, + "samplingRateHz": 1600.0 + }, + { + "label": "ramp 14Hz", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 500, + "samplingRateHz": 1000.0 + }, + { + "label": "pink noise", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 975, + "samplingRateHz": 1950.0 + }, + { + "label": "white noise", + "physicalDimension": "uV", + "physicalMin": -3000.0, + "physicalMax": 3000.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 999, + "samplingRateHz": 1998.0 + }, + { + "label": "BDF Annotations", + "physicalMin": -1.0, + "physicalMax": 1.0, + "digitalMin": -8388608, + "digitalMax": 8388607, + "samplesPerRecord": 38, + "samplingRateHz": 76.0, + "annotations": true + } + ], + "annotationSignalCount": 1, + "durationSeconds": 30.0 + } + } + } + ] +} diff --git a/tests/fixtures/neuralynx-cases.json b/tests/fixtures/neuralynx-cases.json new file mode 100644 index 0000000..fe93b4d --- /dev/null +++ b/tests/fixtures/neuralynx-cases.json @@ -0,0 +1,306 @@ +{ + "_comment": "Headers built to the per-version grammar documented in python-neo's NlxHeader (neo 0.14.6), the reference reader for this format; no public Neuralynx file was reachable to copy. neo parsed all four and agreed on application, version, file type, sampling rate, microvolts per bit, channel name, record size and the open/close times (neo prints those to microseconds, this to milliseconds, the same instant). The last case keeps the 16 KiB of NUL padding a real file has; the others are the header text, which decodes identically.", + "cases": [ + { + "name": "Cheetah 5.5.1 CSC1.ncs (## comment-line dialect, -CheetahRev)", + "key": "CSC1.ncs", + "hex": "2323232323232323204e657572616c796e7820446174612046696c65204865616465720a23232046696c65204e616d6520433a5c43686565746168446174615c323031332d31312d32395f31372d30352d30355c435343312e6e63730a23232054696d65204f70656e656420286d2f642f79293a2031312f32392f32303133202028683a6d3a732e6d73292031373a353a31362e3739330a23232054696d6520436c6f73656420286d2f642f79293a2031312f32392f32303133202028683a6d3a732e6d73292031383a333a31332e3630330a0a2d4368656574616852657620352e352e310a0a2d416371456e744e616d6520435343310a2d46696c6554797065204353430a2d5265636f726453697a6520313034340a0a2d486172647761726553756253797374656d4e616d652041637153797374656d310a2d486172647761726553756253797374656d54797065204469676974616c4c796e7853580a2d53616d706c696e674672657175656e63792033323030300a2d41444d617856616c75652033323736370a2d4144426974566f6c747320302e3030303030303033303531373537383132350a0a2d41444368616e6e656c20300a2d496e70757452616e676520313030300a2d496e707574496e76657274656420547275650a0a2d4453504c6f7743757446696c746572456e61626c656420547275650a2d4473704c6f774375744672657175656e637920302e310a2d4473704c6f774375744e756d5461707320300a2d4473704c6f7743757446696c746572547970652044434f0a2d4453504869676843757446696c746572456e61626c656420547275650a2d447370486967684375744672657175656e637920393030300a2d447370486967684375744e756d546170732036340a2d4473704869676843757446696c74657254797065204649520a2d44737044656c6179436f6d70656e736174696f6e20456e61626c65640a2d44737046696c74657244656c61795fb573203938340a", + "expected": { + "format": "neuralynx", + "summary": "Neuralynx CSC, CSC1, 32000 Hz, Cheetah 5.5.1", + "fields": { + "originalFileName": "C:\\CheetahData\\2013-11-29_17-05-05\\CSC1.ncs", + "timeOpened": "2013-11-29T17:05:16.793", + "timeClosed": "2013-11-29T18:03:13.603", + "fileType": "CSC", + "channelName": "CSC1", + "hardwareSubSystemName": "AcqSystem1", + "hardwareSubSystemType": "DigitalLynxSX", + "dspLowCutFilterType": "DCO", + "dspHighCutFilterType": "FIR", + "recordBytes": 1044, + "adMaxValue": 32767, + "adChannel": 0, + "dspLowCutNumTaps": 0, + "dspHighCutNumTaps": 64, + "samplingRateHz": 32000.0, + "adBitVolts": 3.0517578125e-08, + "dspLowCutFrequencyHz": 0.1, + "dspHighCutFrequencyHz": 9000.0, + "dspLowCutFilterEnabled": true, + "dspHighCutFilterEnabled": true, + "inputInverted": true, + "inputRange": "1000", + "applicationName": "Cheetah", + "applicationVersion": "5.5.1", + "microvoltsPerBit": 0.030517578125, + "recordKind": "continuous", + "headerBytes": 16384, + "propertyCount": 22, + "propertyNames": [ + "ADBitVolts", + "ADChannel", + "ADMaxValue", + "AcqEntName", + "CheetahRev", + "DSPHighCutFilterEnabled", + "DSPLowCutFilterEnabled", + "DspDelayCompensation", + "DspFilterDelay_\u00b5s", + "DspHighCutFilterType", + "DspHighCutFrequency", + "DspHighCutNumTaps", + "DspLowCutFilterType", + "DspLowCutFrequency", + "DspLowCutNumTaps", + "FileType", + "HardwareSubSystemName", + "HardwareSubSystemType", + "InputInverted", + "InputRange", + "RecordSize", + "SamplingFrequency" + ] + } + } + }, + { + "name": "Cheetah 5.7.4 CSC1.ncs (property dialect, -ApplicationName)", + "key": "CSC1.ncs", + "hex": "2323232323232323204e657572616c796e7820446174612046696c65204865616465720a2d46696c6554797065204353430a2d46696c6556657273696f6e20332e340a2d46696c65555549442062396161643063392d633761302d346532362d386531632d6238623963356433663063610a2d53657373696f6e555549442033663264636135382d316566632d346436322d613561392d6161376337396531663162610a2d50726f62654e616d650a2d4f726967696e616c46696c654e616d652022433a5c43686565746168446174615c323031372d30322d31365f31372d35352d35355c435343312e6e6373220a2d54696d654372656174656420323031372f30322f31362031373a35363a30340a2d54696d65436c6f73656420323031372f30322f31362031383a30313a31380a0a2d5265636f726453697a6520313034340a2d4170706c69636174696f6e4e616d6520436865657461682022352e372e3420446576656c6f706d656e74220a2d4163717569736974696f6e53797374656d2041637153797374656d31204469676974616c4c796e7853580a2d5265666572656e63654368616e6e656c2022536f757263652030205265666572656e63652030220a2d53616d706c696e674672657175656e63792033323030300a2d41444d617856616c75652033323736370a2d4144426974566f6c747320302e3030303030303033363632313039333735303030303030330a0a2d416371456e744e616d6520435343310a2d4e756d41444368616e6e656c7320310a2d41444368616e6e656c20300a2d496e70757452616e676520313230300a2d496e707574496e76657274656420547275650a0a2d4453504c6f7743757446696c746572456e61626c656420547275650a2d4473704c6f774375744672657175656e637920302e310a2d4473704c6f774375744e756d5461707320300a2d4473704c6f7743757446696c746572547970652044434f0a2d4453504869676843757446696c746572456e61626c656420547275650a2d447370486967684375744672657175656e637920393030300a2d447370486967684375744e756d546170732036340a2d4473704869676843757446696c74657254797065204649520a2d44737044656c6179436f6d70656e736174696f6e20456e61626c65640a2d44737046696c74657244656c61795fb573203938340a", + "expected": { + "format": "neuralynx", + "summary": "Neuralynx CSC, CSC1, 32000 Hz, Cheetah 5.7.4 Development", + "fields": { + "fileType": "CSC", + "fileVersion": "3.4", + "channelName": "CSC1", + "acquisitionSystem": "AcqSystem1 DigitalLynxSX", + "referenceChannel": "Source 0 Reference 0", + "sessionUuid": "3f2dca58-1efc-4d62-a5a9-aa7c79e1f1ba", + "fileUuid": "b9aad0c9-c7a0-4e26-8e1c-b8b9c5d3f0ca", + "dspLowCutFilterType": "DCO", + "dspHighCutFilterType": "FIR", + "recordBytes": 1044, + "adMaxValue": 32767, + "adChannelCount": 1, + "adChannel": 0, + "dspLowCutNumTaps": 0, + "dspHighCutNumTaps": 64, + "samplingRateHz": 32000.0, + "adBitVolts": 3.6621093750000003e-08, + "dspLowCutFrequencyHz": 0.1, + "dspHighCutFrequencyHz": 9000.0, + "dspLowCutFilterEnabled": true, + "dspHighCutFilterEnabled": true, + "inputInverted": true, + "inputRange": "1200", + "originalFileName": "C:\\CheetahData\\2017-02-16_17-55-55\\CSC1.ncs", + "applicationName": "Cheetah", + "applicationVersion": "5.7.4 Development", + "timeOpened": "2017-02-16T17:56:04", + "timeClosed": "2017-02-16T18:01:18", + "microvoltsPerBit": 0.03662109375, + "recordKind": "continuous", + "headerBytes": 16384, + "propertyCount": 30, + "propertyNames": [ + "ADBitVolts", + "ADChannel", + "ADMaxValue", + "AcqEntName", + "AcquisitionSystem", + "ApplicationName", + "DSPHighCutFilterEnabled", + "DSPLowCutFilterEnabled", + "DspDelayCompensation", + "DspFilterDelay_\u00b5s", + "DspHighCutFilterType", + "DspHighCutFrequency", + "DspHighCutNumTaps", + "DspLowCutFilterType", + "DspLowCutFrequency", + "DspLowCutNumTaps", + "FileType", + "FileUUID", + "FileVersion", + "InputInverted", + "InputRange", + "NumADChannels", + "OriginalFileName", + "ProbeName", + "RecordSize", + "ReferenceChannel", + "SamplingFrequency", + "SessionUUID", + "TimeClosed", + "TimeCreated" + ] + } + } + }, + { + "name": "Pegasus 2.1.1 Events_0008.nev", + "key": "Events_0008.nev", + "hex": "2323232323232323204e657572616c796e7820446174612046696c65204865616465720a2d46696c6554797065204576656e740a2d46696c6556657273696f6e20332e340a2d46696c65555549442032623261396433652d366136392d346639612d386431352d3561336632623965306634310a2d4f726967696e616c46696c654e616d6520443a5c5065676173757320446174615c44725f4e4d5c313930325c323031392d30362d32385f31372d33362d35305c4576656e74735f303030382e6e65760a2d54696d654372656174656420323031392f30362f32382031373a33363a35300a2d54696d65436c6f73656420323031392f30362f32382031373a34353a34380a0a2d5265636f726453697a65203138340a2d4170706c69636174696f6e4e616d6520506567617375732022322e312e31220a2d4163717569736974696f6e53797374656d2041637153797374656d3120506567617375730a2d416371456e744e616d65204576656e74730a", + "expected": { + "format": "neuralynx", + "summary": "Neuralynx Event, Events, Pegasus 2.1.1", + "fields": { + "fileType": "Event", + "fileVersion": "3.4", + "channelName": "Events", + "acquisitionSystem": "AcqSystem1 Pegasus", + "fileUuid": "2b2a9d3e-6a69-4f9a-8d15-5a3f2b9e0f41", + "recordBytes": 184, + "originalFileName": "D:\\Pegasus Data\\Dr_NM\\1902\\2019-06-28_17-36-50\\Events_0008.nev", + "applicationName": "Pegasus", + "applicationVersion": "2.1.1", + "timeOpened": "2019-06-28T17:36:50", + "timeClosed": "2019-06-28T17:45:48", + "recordKind": "event", + "headerBytes": 16384, + "propertyCount": 10, + "propertyNames": [ + "AcqEntName", + "AcquisitionSystem", + "ApplicationName", + "FileType", + "FileUUID", + "FileVersion", + "OriginalFileName", + "RecordSize", + "TimeClosed", + "TimeCreated" + ] + } + } + }, + { + "name": "Cheetah 5.6.3 TT1.ntt (tetrode, four ADBitVolts)", + "key": "TT1.ntt", + "hex": "2323232323232323204e657572616c796e7820446174612046696c65204865616465720a23232046696c65204e616d6520433a5c43686565746168446174615c323031362d31312d32385f32312d35302d30305c5454312e6e74740a23232054696d65204f70656e656420286d2f642f79293a2031312f32382f32303136202028683a6d3a732e6d73292032313a35303a33332e3332320a23232054696d6520436c6f73656420286d2f642f79293a2031312f32382f32303136202028683a6d3a732e6d73292032323a34343a34312e3134350a0a2d4368656574616852657620352e362e330a0a2d416371456e744e616d65205454310a2d46696c6554797065205370696b650a2d5265636f726453697a65203330340a2d53616d706c696e674672657175656e63792033323030300a2d41444d617856616c75652033323736370a2d4144426974566f6c747320302e30303030303030333636323130393337353030303030303320302e30303030303030333636323130393337353030303030303320302e30303030303030333636323130393337353030303030303320302e3030303030303033363632313039333735303030303030330a2d4e756d41444368616e6e656c7320340a2d41444368616e6e656c20302031203220330a2d496e70757452616e676520313230302031323030203132303020313230300a2d496e707574496e76657274656420547275650a2d57617665666f726d4c656e6774682033320a2d416c69676e6d656e74507420380a2d54687265736856616c2035302035302035302035300a2d4d696e52657472696767657253616d706c65732031320a2d5370696b6552657472696767657254696d65203337350a2d4475616c5468726573686f6c64696e672046616c73650a", + "expected": { + "format": "neuralynx", + "summary": "Neuralynx Spike, TT1, 32000 Hz, Cheetah 5.6.3", + "fields": { + "originalFileName": "C:\\CheetahData\\2016-11-28_21-50-00\\TT1.ntt", + "timeOpened": "2016-11-28T21:50:33.322", + "timeClosed": "2016-11-28T22:44:41.145", + "fileType": "Spike", + "channelName": "TT1", + "recordBytes": 304, + "adMaxValue": 32767, + "adChannelCount": 4, + "adChannel": 0, + "waveformSamples": 32, + "alignmentPoint": 8, + "samplingRateHz": 32000.0, + "adBitVolts": 3.6621093750000003e-08, + "inputInverted": true, + "inputRange": "1200 1200 1200 1200", + "applicationName": "Cheetah", + "applicationVersion": "5.6.3", + "microvoltsPerBit": 0.03662109375, + "recordKind": "spike", + "headerBytes": 16384, + "propertyCount": 17, + "propertyNames": [ + "ADBitVolts", + "ADChannel", + "ADMaxValue", + "AcqEntName", + "AlignmentPt", + "CheetahRev", + "DualThresholding", + "FileType", + "InputInverted", + "InputRange", + "MinRetriggerSamples", + "NumADChannels", + "RecordSize", + "SamplingFrequency", + "SpikeRetriggerTime", + "ThreshVal", + "WaveformLength" + ] + } + } + }, + { + "name": "Cheetah 5.7.4 CSC1.ncs with the real 16 KiB NUL padding", + "key": "CSC1.ncs", + "hex": "2323232323232323204e657572616c796e7820446174612046696c65204865616465720a2d46696c6554797065204353430a2d46696c6556657273696f6e20332e340a2d46696c65555549442062396161643063392d633761302d346532362d386531632d6238623963356433663063610a2d53657373696f6e555549442033663264636135382d316566632d346436322d613561392d6161376337396531663162610a2d50726f62654e616d650a2d4f726967696e616c46696c654e616d652022433a5c43686565746168446174615c323031372d30322d31365f31372d35352d35355c435343312e6e6373220a2d54696d654372656174656420323031372f30322f31362031373a35363a30340a2d54696d65436c6f73656420323031372f30322f31362031383a30313a31380a0a2d5265636f726453697a6520313034340a2d4170706c69636174696f6e4e616d6520436865657461682022352e372e3420446576656c6f706d656e74220a2d4163717569736974696f6e53797374656d2041637153797374656d31204469676974616c4c796e7853580a2d5265666572656e63654368616e6e656c2022536f757263652030205265666572656e63652030220a2d53616d706c696e674672657175656e63792033323030300a2d41444d617856616c75652033323736370a2d4144426974566f6c747320302e3030303030303033363632313039333735303030303030330a0a2d416371456e744e616d6520435343310a2d4e756d41444368616e6e656c7320310a2d41444368616e6e656c20300a2d496e70757452616e676520313230300a2d496e707574496e76657274656420547275650a0a2d4453504c6f7743757446696c746572456e61626c656420547275650a2d4473704c6f774375744672657175656e637920302e310a2d4473704c6f774375744e756d5461707320300a2d4473704c6f7743757446696c746572547970652044434f0a2d4453504869676843757446696c746572456e61626c656420547275650a2d447370486967684375744672657175656e637920393030300a2d447370486967684375744e756d546170732036340a2d4473704869676843757446696c74657254797065204649520a2d44737044656c6179436f6d70656e736174696f6e20456e61626c65640a2d44737046696c74657244656c61795fb573203938340a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "expected": { + "format": "neuralynx", + "summary": "Neuralynx CSC, CSC1, 32000 Hz, Cheetah 5.7.4 Development", + "fields": { + "fileType": "CSC", + "fileVersion": "3.4", + "channelName": "CSC1", + "acquisitionSystem": "AcqSystem1 DigitalLynxSX", + "referenceChannel": "Source 0 Reference 0", + "sessionUuid": "3f2dca58-1efc-4d62-a5a9-aa7c79e1f1ba", + "fileUuid": "b9aad0c9-c7a0-4e26-8e1c-b8b9c5d3f0ca", + "dspLowCutFilterType": "DCO", + "dspHighCutFilterType": "FIR", + "recordBytes": 1044, + "adMaxValue": 32767, + "adChannelCount": 1, + "adChannel": 0, + "dspLowCutNumTaps": 0, + "dspHighCutNumTaps": 64, + "samplingRateHz": 32000.0, + "adBitVolts": 3.6621093750000003e-08, + "dspLowCutFrequencyHz": 0.1, + "dspHighCutFrequencyHz": 9000.0, + "dspLowCutFilterEnabled": true, + "dspHighCutFilterEnabled": true, + "inputInverted": true, + "inputRange": "1200", + "originalFileName": "C:\\CheetahData\\2017-02-16_17-55-55\\CSC1.ncs", + "applicationName": "Cheetah", + "applicationVersion": "5.7.4 Development", + "timeOpened": "2017-02-16T17:56:04", + "timeClosed": "2017-02-16T18:01:18", + "microvoltsPerBit": 0.03662109375, + "recordKind": "continuous", + "headerBytes": 16384, + "propertyCount": 30, + "propertyNames": [ + "ADBitVolts", + "ADChannel", + "ADMaxValue", + "AcqEntName", + "AcquisitionSystem", + "ApplicationName", + "DSPHighCutFilterEnabled", + "DSPLowCutFilterEnabled", + "DspDelayCompensation", + "DspFilterDelay_\u00b5s", + "DspHighCutFilterType", + "DspHighCutFrequency", + "DspHighCutNumTaps", + "DspLowCutFilterType", + "DspLowCutFrequency", + "DspLowCutNumTaps", + "FileType", + "FileUUID", + "FileVersion", + "InputInverted", + "InputRange", + "NumADChannels", + "OriginalFileName", + "ProbeName", + "RecordSize", + "ReferenceChannel", + "SamplingFrequency", + "SessionUUID", + "TimeClosed", + "TimeCreated" + ] + } + } + } + ] +} diff --git a/tests/fixtures/openephys-cases.json b/tests/fixtures/openephys-cases.json new file mode 100644 index 0000000..f0fc72c --- /dev/null +++ b/tests/fixtures/openephys-cases.json @@ -0,0 +1,190 @@ +{ + "_comment": "Real structure.oebin manifests: the Open Ephys GUI's own Resources/DataFiles copy (open-ephys/plugin-GUI, four demo streams), a Neuropixels session from neuroinformatics-unit/spikewrap (GUI 0.6.0, 385 channels, mixed bit_volts so no uniform scaling is claimed) and a Rhythm FPGA session from chrelli/3DDD_social_mouse_tracker.", + "cases": [ + { + "name": "open-ephys/plugin-GUI Resources/DataFiles/structure.oebin", + "key": "structure.oebin", + "hex": "7b0a202020224755492076657273696f6e223a22302e342e35222c0a20202022636f6e74696e756f7573223a5b0a2020202020207b0a20202020202020202022666f6c6465725f6e616d65223a22646174615f73747265616d5f73696e655f776176652f222c0a2020202020202020202273616d706c655f72617465223a34303030302c0a20202020202020202022736f757263655f70726f636573736f725f6e616d65223a2244656d6f20736f75726365222c0a20202020202020202022736f757263655f70726f636573736f725f6964223a3130302c0a20202020202020202022736f757263655f70726f636573736f725f7375625f696478223a302c0a202020202020202020227265636f726465645f70726f636573736f72223a2244656d6f20736f75726365222c0a202020202020202020227265636f726465645f70726f636573736f725f6964223a3130302c0a202020202020202020226e756d5f6368616e6e656c73223a31362c0a202020202020202020226368616e6e656c73223a5b0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434830222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434831222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434832222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434833222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434834222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434835222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a350a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434836222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a362c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a360a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434837222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a372c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a370a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434838222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a382c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a380a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434839222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a392c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a390a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483130222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483131222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483132222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483133222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483134222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483135222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31350a2020202020202020202020207d0a2020202020202020205d0a2020202020207d2c0a2020202020207b0a20202020202020202022666f6c6465725f6e616d65223a22646174615f73747265616d5f313663685f636f727465782f222c0a2020202020202020202273616d706c655f72617465223a34303030302c0a20202020202020202022736f757263655f70726f636573736f725f6e616d65223a2244656d6f20736f75726365222c0a20202020202020202022736f757263655f70726f636573736f725f6964223a3130302c0a20202020202020202022736f757263655f70726f636573736f725f7375625f696478223a312c0a202020202020202020227265636f726465645f70726f636573736f72223a2244656d6f20736f75726365222c0a202020202020202020227265636f726465645f70726f636573736f725f6964223a3130302c0a202020202020202020226e756d5f6368616e6e656c73223a31362c0a202020202020202020226368616e6e656c73223a5b0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434830222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434831222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434832222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434833222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434834222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434835222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a350a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434836222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a362c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a360a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434837222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a372c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a370a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434838222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a382c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a380a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434839222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a392c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a390a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483130222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483131222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483132222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483133222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483134222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483135222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31350a2020202020202020202020207d0a2020202020202020205d0a2020202020207d2c0a2020202020207b0a20202020202020202022666f6c6465725f6e616d65223a22646174615f73747265616d5f313663685f686970706f63616d7075732f222c0a2020202020202020202273616d706c655f72617465223a34303030302c0a20202020202020202022736f757263655f70726f636573736f725f6e616d65223a2244656d6f20736f75726365222c0a20202020202020202022736f757263655f70726f636573736f725f6964223a3130302c0a20202020202020202022736f757263655f70726f636573736f725f7375625f696478223a322c0a202020202020202020227265636f726465645f70726f636573736f72223a2244656d6f20736f75726365222c0a202020202020202020227265636f726465645f70726f636573736f725f6964223a3130302c0a202020202020202020226e756d5f6368616e6e656c73223a31362c0a202020202020202020226368616e6e656c73223a5b0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434830222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434831222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434832222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434833222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434834222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434835222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a350a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434836222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a362c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a360a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434837222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a372c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a370a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434838222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a382c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a380a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434839222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a392c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a390a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483130222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483131222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483132222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483133222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483134222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483135222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31350a2020202020202020202020207d0a2020202020202020205d0a2020202020207d2c0a2020202020207b0a20202020202020202022666f6c6465725f6e616d65223a226368697270735f31365f6368616e6e656c735f417434306b487a222c0a2020202020202020202273616d706c655f72617465223a34303030302c0a20202020202020202022736f757263655f70726f636573736f725f6e616d65223a2244656d6f20736f75726365222c0a20202020202020202022736f757263655f70726f636573736f725f6964223a3130302c0a20202020202020202022736f757263655f70726f636573736f725f7375625f696478223a332c0a202020202020202020227265636f726465645f70726f636573736f72223a2244656d6f20736f75726365222c0a202020202020202020227265636f726465645f70726f636573736f725f6964223a3130302c0a202020202020202020226e756d5f6368616e6e656c73223a31362c0a202020202020202020226368616e6e656c73223a5b0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434830222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434831222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434832222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434833222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434834222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434835222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a350a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434836222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a362c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a360a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434837222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a372c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a370a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434838222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a382c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a380a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a22434839222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a392c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a390a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483130222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31302c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31300a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483131222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31312c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31310a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483132222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31322c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31320a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483133222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31332c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31330a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483134222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31342c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31340a2020202020202020202020207d2c0a2020202020202020202020207b0a202020202020202020202020202020226368616e6e656c5f6e616d65223a2243483135222c0a202020202020202020202020202020226465736372697074696f6e223a2244656d6f2064617461206368616e6e656c222c0a202020202020202020202020202020226964656e746966696572223a2267656e65726963646174612e636f6e74696e756f7573222c0a20202020202020202020202020202022686973746f7279223a2244656d6f20736f75726365222c0a202020202020202020202020202020226269745f766f6c7473223a302e30352c0a20202020202020202020202020202022756e697473223a227556222c0a20202020202020202020202020202022736f757263655f70726f636573736f725f696e646578223a31352c0a202020202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a31350a2020202020202020202020207d0a2020202020202020205d0a2020202020207d0a2020205d2c0a202020226576656e7473223a5b0a0a2020205d2c0a202020227370696b6573223a5b0a0a2020205d0a7d", + "expected": { + "format": "openephys-oebin", + "summary": "Open Ephys recording, 4 continuous streams, 64 channels, 40000 Hz", + "fields": { + "guiVersion": "0.4.5", + "continuousStreams": 4, + "eventStreams": 0, + "spikeStreams": 0, + "continuous": [ + { + "folderName": "data_stream_sine_wave/", + "sourceProcessorName": "Demo source", + "recordedProcessor": "Demo source", + "sourceProcessorId": 100, + "recordedProcessorId": 100, + "channelCount": 16, + "samplingRateHz": 40000.0, + "channelsListed": 16, + "bitVolts": 0.05, + "units": "uV", + "firstChannelName": "CH0" + }, + { + "folderName": "data_stream_16ch_cortex/", + "sourceProcessorName": "Demo source", + "recordedProcessor": "Demo source", + "sourceProcessorId": 100, + "recordedProcessorId": 100, + "channelCount": 16, + "samplingRateHz": 40000.0, + "channelsListed": 16, + "bitVolts": 0.05, + "units": "uV", + "firstChannelName": "CH0" + }, + { + "folderName": "data_stream_16ch_hippocampus/", + "sourceProcessorName": "Demo source", + "recordedProcessor": "Demo source", + "sourceProcessorId": 100, + "recordedProcessorId": 100, + "channelCount": 16, + "samplingRateHz": 40000.0, + "channelsListed": 16, + "bitVolts": 0.05, + "units": "uV", + "firstChannelName": "CH0" + }, + { + "folderName": "chirps_16_channels_At40kHz", + "sourceProcessorName": "Demo source", + "recordedProcessor": "Demo source", + "sourceProcessorId": 100, + "recordedProcessorId": 100, + "channelCount": 16, + "samplingRateHz": 40000.0, + "channelsListed": 16, + "bitVolts": 0.05, + "units": "uV", + "firstChannelName": "CH0" + } + ], + "totalContinuousChannels": 64, + "samplingRateHz": 40000.0, + "sourceProcessors": [ + "Demo source" + ] + } + } + }, + { + "name": "spikewrap example_tiny_data Neuropixels structure.oebin", + "key": "structure.oebin", + "hex": "7b0a20202020224755492076657273696f6e223a2022302e362e30222c0a2020202022636f6e74696e756f7573223a205b0a2020202020207b0a202020202020202022666f6c6465725f6e616d65223a20224e6575726f7069782d5058492d3130302e50726f6265412d41502f222c0a20202020202020202273616d706c655f72617465223a2033303030302e302c0a202020202020202022736f757263655f70726f636573736f725f6e616d65223a20224e6575726f7069782d505849222c0a202020202020202022736f757263655f70726f636573736f725f6964223a203130302c0a20202020202020202273747265616d5f6e616d65223a202250726f6265412d4150222c0a2020202020202020227265636f726465645f70726f636573736f72223a20225265636f7264204e6f6465222c0a2020202020202020227265636f726465645f70726f636573736f725f6964223a203130342c0a2020202020202020226e756d5f6368616e6e656c73223a203338352c0a2020202020202020226368616e6e656c73223a205b0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415031222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415032222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415033222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415034222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415035222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415036222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415037222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415038222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a2022415039222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503130222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503131222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503132222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503133222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503134222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503135222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503136222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503137222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503138222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503139222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503230222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503231222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503232222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503233222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503234222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503235222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503236222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503237222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503238222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503239222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503330222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503331222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503332222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503333222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503334222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503335222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503336222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503337222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503338222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503339222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503430222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503431222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503432222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503433222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503434222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503435222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503436222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503437222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503438222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503439222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503530222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503531222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503532222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503533222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503534222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503535222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503536222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503537222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503538222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503539222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503630222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503631222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503632222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503633222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503634222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503635222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503636222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503637222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503638222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503639222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503730222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503731222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503732222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503733222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503734222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503735222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503736222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503737222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503738222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503739222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503830222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503831222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503832222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503833222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503834222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503835222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503836222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503837222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503838222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503839222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503930222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503931222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503932222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503933222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503934222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503935222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503936222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503937222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503938222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241503939222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313030222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313031222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313032222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313033222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313034222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313035222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313036222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313037222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313038222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313039222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313130222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313131222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313132222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313133222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313134222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313135222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313136222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313137222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313138222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313139222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313230222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313231222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313232222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313233222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313234222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313235222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313236222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313237222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313238222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313239222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313330222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313331222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313332222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313333222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313334222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313335222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313336222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313337222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313338222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313339222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313430222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313431222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313432222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313433222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313434222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313435222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313436222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313437222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313438222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313439222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313530222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313531222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313532222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313533222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313534222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313535222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313536222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313537222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313538222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313539222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313630222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313631222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313632222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313633222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313634222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313635222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313636222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313637222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313638222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313639222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313730222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313731222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313732222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313733222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313734222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313735222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313736222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313737222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313738222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313739222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313830222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313831222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313832222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313833222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313834222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313835222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313836222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313837222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313838222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313839222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313930222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313931222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313932222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313933222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313934222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313935222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313936222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313937222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313938222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150313939222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323030222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323031222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323032222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323033222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323034222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323035222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323036222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323037222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323038222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323039222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323130222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323131222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323132222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323133222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323134222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323135222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323136222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323137222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323138222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323139222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323230222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323231222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323232222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323233222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323234222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323235222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323236222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323237222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323238222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323239222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323330222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323331222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323332222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323333222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323334222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323335222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323336222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323337222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323338222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323339222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323430222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323431222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323432222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323433222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323434222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323435222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323436222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323437222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323438222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323439222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323530222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323531222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323532222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323533222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323534222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323535222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323536222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323537222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323538222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323539222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323630222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323631222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323632222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323633222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323634222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323635222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323636222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323637222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323638222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323639222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323730222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323731222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323732222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323733222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323734222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323735222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323736222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323737222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323738222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323739222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323830222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323831222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323832222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323833222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323834222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323835222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323836222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323837222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323838222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323839222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323930222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323931222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323932222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323933222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323934222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323935222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323936222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323937222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323938222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150323939222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333030222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333031222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333032222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333033222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333034222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333035222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333036222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333037222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333038222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333039222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333130222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333131222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333132222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333133222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333134222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333135222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333136222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333137222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333138222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333139222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333230222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333231222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333232222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333233222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333234222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333235222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333236222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333237222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333238222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333239222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333330222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333331222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333332222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333333222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333334222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333335222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333336222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333337222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333338222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333339222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333430222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333431222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333432222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333433222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333434222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333435222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333436222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333437222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333438222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333439222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333530222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333531222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333532222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333533222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333534222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333535222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333536222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333537222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333538222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333539222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333630222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333631222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333632222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333633222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333634222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333635222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333636222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333637222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333638222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333639222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333730222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333731222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333732222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333733222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333734222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333735222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333736222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333737222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333738222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333739222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333830222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333831222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333832222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333833222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a20224150333834222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c7320656c656374726f6465222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20302e313934393939393932383437343432362c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d2c0a202020202020202020207b0a202020202020202020202020226368616e6e656c5f6e616d65223a202241505f53594e43222c0a202020202020202020202020226465736372697074696f6e223a20224e6575726f706978656c732073796e63206c696e652028636f6e74696e756f75736c792073616d706c656429222c0a202020202020202020202020226964656e746966696572223a2022222c0a20202020202020202020202022686973746f7279223a20224e6575726f7069782d505849202d3e204d6572676572202d3e205265636f7264204e6f6465222c0a202020202020202020202020226269745f766f6c7473223a20312e302c0a20202020202020202020202022756e697473223a2022220a202020202020202020207d0a20202020202020205d0a2020202020207d0a202020205d2c0a20202020226576656e7473223a205b0a2020202020207b0a202020202020202022666f6c6465725f6e616d65223a20224e6575726f7069782d5058492d3130302e50726f6265412d41502f54544c2f222c0a2020202020202020226368616e6e656c5f6e616d65223a20224e6575726f706978656c73205058492053796e63222c0a2020202020202020226465736372697074696f6e223a2022537461747573206f6620534d412073796e63206c696e65206f6e205058492063617264222c0a2020202020202020226964656e746966696572223a20226e6575726f706978656c732e73796e63222c0a20202020202020202273616d706c655f72617465223a2033303030302e302c0a20202020202020202274797065223a2022696e743136222c0a202020202020202022736f757263655f70726f636573736f72223a20224e6575726f7069782d505849222c0a20202020202020202273747265616d5f6e616d65223a202250726f6265412d4150222c0a202020202020202022696e697469616c5f7374617465223a20300a2020202020207d2c0a2020202020207b0a202020202020202022666f6c6465725f6e616d65223a20224d65737361676543656e7465722f222c0a2020202020202020226368616e6e656c5f6e616d65223a20224d65737361676573222c0a2020202020202020226465736372697074696f6e223a202242726f61646361737473206d657373616765732066726f6d20746865204d65737361676543656e746572222c0a2020202020202020226964656e746966696572223a20226d65737361676563656e7465722e6576656e7473222c0a20202020202020202273616d706c655f72617465223a2033303030302e302c0a20202020202020202274797065223a2022737472696e67222c0a202020202020202022736f757263655f70726f636573736f72223a20224d6573736167652043656e746572222c0a20202020202020202273747265616d5f6e616d65223a2022505849652d36333431220a2020202020207d0a202020205d2c0a20202020227370696b6573223a205b5d0a20207d0a", + "expected": { + "format": "openephys-oebin", + "summary": "Open Ephys recording, 1 continuous stream, 385 channels, 30000 Hz, 2 event streams", + "fields": { + "guiVersion": "0.6.0", + "continuousStreams": 1, + "eventStreams": 2, + "spikeStreams": 0, + "continuous": [ + { + "folderName": "Neuropix-PXI-100.ProbeA-AP/", + "streamName": "ProbeA-AP", + "sourceProcessorName": "Neuropix-PXI", + "recordedProcessor": "Record Node", + "sourceProcessorId": 100, + "recordedProcessorId": 104, + "channelCount": 385, + "samplingRateHz": 30000.0, + "channelsListed": 385, + "firstChannelName": "AP1" + } + ], + "totalContinuousChannels": 385, + "samplingRateHz": 30000.0, + "streamNames": [ + "ProbeA-AP" + ], + "sourceProcessors": [ + "Neuropix-PXI" + ], + "events": [ + { + "folderName": "Neuropix-PXI-100.ProbeA-AP/TTL/", + "channelName": "Neuropixels PXI Sync", + "type": "int16", + "streamName": "ProbeA-AP", + "sourceProcessor": "Neuropix-PXI", + "description": "Status of SMA sync line on PXI card", + "samplingRateHz": 30000.0 + }, + { + "folderName": "MessageCenter/", + "channelName": "Messages", + "type": "string", + "streamName": "PXIe-6341", + "sourceProcessor": "Message Center", + "description": "Broadcasts messages from the MessageCenter", + "samplingRateHz": 30000.0 + } + ] + } + } + }, + { + "name": "3DDD_social_mouse_tracker Rhythm FPGA structure.oebin", + "key": "structure.oebin", + "hex": "7b0d0a20202020224755492076657273696f6e223a2022302e342e342e31222c0d0a2020202022636f6e74696e756f7573223a205b0d0a2020202020207b0d0a202020202020202022666f6c6465725f6e616d65223a202252687974686d5f465047412d3130302e302f222c0d0a20202020202020202273616d706c655f72617465223a2033303030302c0d0a202020202020202022736f757263655f70726f636573736f725f6e616d65223a202252687974686d2046504741222c0d0a202020202020202022736f757263655f70726f636573736f725f6964223a203130302c0d0a202020202020202022736f757263655f70726f636573736f725f7375625f696478223a20302c0d0a2020202020202020227265636f726465645f70726f636573736f72223a202252687974686d2046504741222c0d0a2020202020202020227265636f726465645f70726f636573736f725f6964223a203130302c0d0a2020202020202020226e756d5f6368616e6e656c73223a2033352c0d0a2020202020202020226368616e6e656c73223a205b0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434831222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20302c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20300d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434832222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20312c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20310d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434833222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20322c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20320d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434834222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20332c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20330d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434835222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20342c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20340d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434836222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20352c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20350d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434837222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20362c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20360d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434838222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20372c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20370d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a2022434839222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20382c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20380d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483130222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a20392c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a20390d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483131222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031302c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031300d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483132222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031312c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031310d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483133222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031322c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031320d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483134222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031332c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031330d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483135222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031342c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031340d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483136222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031352c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031350d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483137222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031362c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031360d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483138222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031372c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031370d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483139222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031382c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031380d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483230222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2031392c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2031390d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483231222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032302c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032300d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483232222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032312c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032310d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483233222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032322c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032320d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483234222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032332c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032330d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483235222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032342c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032340d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483236222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032352c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032350d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483237222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032362c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032360d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483238222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032372c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032370d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483239222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032382c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032380d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483330222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2032392c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2032390d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483331222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2033302c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2033300d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202243483332222c0d0a202020202020202020202020226465736372697074696f6e223a20224865616473746167652064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20302e31393439393939393238343734343236332c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2033312c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2033310d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202241555831222c0d0a202020202020202020202020226465736372697074696f6e223a2022417578696c6961722064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20332e37343030303031303139373035303837652d3030352c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2033322c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2033320d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202241555832222c0d0a202020202020202020202020226465736372697074696f6e223a2022417578696c6961722064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20332e37343030303031303139373035303837652d3030352c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2033332c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2033330d0a202020202020202020207d2c0d0a202020202020202020207b0d0a202020202020202020202020226368616e6e656c5f6e616d65223a202241555833222c0d0a202020202020202020202020226465736372697074696f6e223a2022417578696c6961722064617461206368616e6e656c222c0d0a202020202020202020202020226964656e746966696572223a202267656e65726963646174612e636f6e74696e756f7573222c0d0a20202020202020202020202022686973746f7279223a202252687974686d2046504741222c0d0a202020202020202020202020226269745f766f6c7473223a20332e37343030303031303139373035303837652d3030352c0d0a20202020202020202020202022756e697473223a20227556222c0d0a20202020202020202020202022736f757263655f70726f636573736f725f696e646578223a2033342c0d0a202020202020202020202020227265636f726465645f70726f636573736f725f696e646578223a2033340d0a202020202020202020207d0d0a20202020202020205d0d0a2020202020207d0d0a202020205d2c0d0a20202020226576656e7473223a205b0d0a2020202020207b0d0a202020202020202022666f6c6465725f6e616d65223a202252687974686d5f465047412d3130302e302f54544c5f312f222c0d0a2020202020202020226368616e6e656c5f6e616d65223a202252687974686d204650474120736f757263652054544c206576656e747320696e707574222c0d0a2020202020202020226465736372697074696f6e223a202254544c204576656e747320636f6d696e672066726f6d2074686520686172647761726520736f757263652070726f636573736f72205c2252687974686d20465047415c22222c0d0a2020202020202020226964656e746966696572223a2022736f757263656576656e74222c0d0a20202020202020202273616d706c655f72617465223a2033303030302c0d0a20202020202020202274797065223a2022696e743136222c0d0a2020202020202020226e756d5f6368616e6e656c73223a20382c0d0a202020202020202022736f757263655f70726f636573736f72223a202252687974686d2046504741220d0a2020202020207d2c0d0a2020202020207b0d0a202020202020202022666f6c6465725f6e616d65223a20224d6573736167655f43656e7465722d3930342e302f544558545f67726f75705f312f222c0d0a2020202020202020226368616e6e656c5f6e616d65223a2022475549204d65737361676573222c0d0a2020202020202020226465736372697074696f6e223a20224d657373616765732066726f6d2074686520475549204d6573736167652043656e746572222c0d0a2020202020202020226964656e746966696572223a202267656e657269636576656e74222c0d0a20202020202020202273616d706c655f72617465223a2033303030302c0d0a20202020202020202274797065223a2022737472696e67222c0d0a2020202020202020226e756d5f6368616e6e656c73223a20312c0d0a202020202020202022736f757263655f70726f636573736f72223a20224d6573736167652043656e746572220d0a2020202020207d0d0a202020205d2c0d0a20202020227370696b6573223a205b5d0d0a20207d", + "expected": { + "format": "openephys-oebin", + "summary": "Open Ephys recording, 1 continuous stream, 35 channels, 30000 Hz, 2 event streams", + "fields": { + "guiVersion": "0.4.4.1", + "continuousStreams": 1, + "eventStreams": 2, + "spikeStreams": 0, + "continuous": [ + { + "folderName": "Rhythm_FPGA-100.0/", + "sourceProcessorName": "Rhythm FPGA", + "recordedProcessor": "Rhythm FPGA", + "sourceProcessorId": 100, + "recordedProcessorId": 100, + "channelCount": 35, + "samplingRateHz": 30000.0, + "channelsListed": 35, + "units": "uV", + "firstChannelName": "CH1" + } + ], + "totalContinuousChannels": 35, + "samplingRateHz": 30000.0, + "sourceProcessors": [ + "Rhythm FPGA" + ], + "events": [ + { + "folderName": "Rhythm_FPGA-100.0/TTL_1/", + "channelName": "Rhythm FPGA source TTL events input", + "type": "int16", + "sourceProcessor": "Rhythm FPGA", + "description": "TTL Events coming from the hardware source processor \"Rhythm FPGA\"", + "channelCount": 8, + "samplingRateHz": 30000.0 + }, + { + "folderName": "Message_Center-904.0/TEXT_group_1/", + "channelName": "GUI Messages", + "type": "string", + "sourceProcessor": "Message Center", + "description": "Messages from the GUI Message Center", + "channelCount": 1, + "samplingRateHz": 30000.0 + } + ] + } + } + } + ] +} diff --git a/tests/fixtures/spikeglx-cases.json b/tests/fixtures/spikeglx-cases.json new file mode 100644 index 0000000..4606cf1 --- /dev/null +++ b/tests/fixtures/spikeglx-cases.json @@ -0,0 +1,153 @@ +{ + "_comment": "Real SpikeGLX run metadata. imec0.ap (NP2010, four-shank Neuropixels 2.0) is from int-brain-lab/viewephys; sample3B2 (Phase 3B2, Neuropixels 1.0) from int-brain-lab/ibl-neuropixel; sample3 (2016 Phase 3A, before typeThis existed) from flatironinstitute/ironclust. Channel count, sampling rate, sample count and microvoltsPerBit were checked against neo 0.14.6's extract_stream_info on the first two; neo raises KeyError on the 2016 file, which this decoder still describes.", + "cases": [ + { + "name": "IBL 1119617_LSE1_shank12_g0_t0.imec0.ap.meta (Neuropixels 2.0, 4 shank)", + "key": "1119617_LSE1_shank12_g0_t0.exported.imec0.ap.meta", + "hex": "61637141704c6653793d3338342c302c310a61707056657273696f6e3d32303235303332350a66696c6543726561746554696d653d323032332d30342d31355431353a35363a35310a66696c654e616d653d433a2f55736572732f4a6f652f4465736b746f702f313131393631375f4c5345315f7368616e6b31325f67305f696d6563302f313131393631375f4c5345315f7368616e6b31325f67305f74302e6578706f727465642e696d6563302e61702e62696e0a66696c65534841313d453632414136364441324545303531324343453233313639463130454537334345373430454136390a66696c6553697a6542797465733d353737353030300a66696c6554696d65536563733d302e32350a666972737453616d706c653d3731373536320a676174654d6f64653d496d6d6564696174650a696d416952616e67654d61783d302e350a696d416952616e67654d696e3d2d302e350a696d43616c696272617465643d747275650a696d4461744170693d332e35370a696d44617442735f66773d322e302e3136380a696d4461744273635f66773d332e322e3137360a696d4461744273635f68773d322e320a696d4461744273635f706e3d4e50325f514253435f30300a696d4461744273635f736e3d32323439313138370a696d44617446785f68773d312e380a696d44617446785f706e3d4e504d5f464c45585f300a696d44617446785f736e3d300a696d44617448735f68773d322e31300a696d44617448735f706e3d4e504d5f48535f33300a696d44617448735f736e3d32323035303032340a696d4461745072625f646f636b3d310a696d4461745072625f706e3d4e50323031300a696d4461745072625f706f72743d320a696d4461745072625f736c6f743d320a696d4461745072625f736e3d32303430333331343837310a696d4461745072625f747970653d32340a696d497353767952756e3d66616c73650a696d4c4544456e61626c653d66616c73650a696d4d6178496e743d383139320a696d53616d70526174653d33303030300a696d53746462793d0a696d5376794d6178426e6b3d2d310a696d537679536563506572426e6b3d33350a696d547267526973696e673d747275650a696d547267536f757263653d300a696d726f46696c653d433a2f55736572732f70726f62655f6163717569736974696f6e2f446f776e6c6f6164732f52656c656173655f7632303233303332302d706861736533302f52656c656173655f7632303233303332302d706861736533302f494d524f5f5461626c65732f6e7069785f7368616e6b31322e696d726f0a6e44617461446972733d310a6e53617665644368616e733d3338350a736e7341704c6653793d3338342c302c310a736e73536176654368616e5375627365743d303a3338340a73796e63496d496e707574536c6f743d320a73796e63536f757263654964783d300a73796e63536f75726365506572696f643d310a747269674d6f64653d496d6d6564696174650a74797065496d456e61626c65643d310a747970654e69456e61626c65643d300a747970654f62456e61626c65643d300a74797065546869733d696d65630a757365724e6f7465733d0a7e696d726f54626c3d2832342c333834292830203220302030203936292831203220302030203937292832203220302030203938292833203220302030203939292834203220302030203130302928352032203020302031303129283620322030203020313032292837203220302030203130332928382032203020302031303429283920322030203020313035292831302032203020302031303629283131203220302030203130372928313220322030203020313038292831332032203020302031303929283134203220302030203131302928313520322030203020313131292831362032203020302031313229283137203220302030203131332928313820322030203020313134292831392032203020302031313529283230203220302030203131362928323120322030203020313137292832322032203020302031313829283233203220302030203131392928323420322030203020313230292832352032203020302031323129283236203220302030203132322928323720322030203020313233292832382032203020302031323429283239203220302030203132352928333020322030203020313236292833312032203020302031323729283332203220302030203132382928333320322030203020313239292833342032203020302031333029283335203220302030203133312928333620322030203020313332292833372032203020302031333329283338203220302030203133342928333920322030203020313335292834302032203020302031333629283431203220302030203133372928343220322030203020313338292834332032203020302031333929283434203220302030203134302928343520322030203020313431292834362032203020302031343229283437203220302030203134332928343820312030203020302928343920312030203020312928353020312030203020322928353120312030203020332928353220312030203020342928353320312030203020352928353420312030203020362928353520312030203020372928353620312030203020382928353720312030203020392928353820312030203020313029283539203120302030203131292836302031203020302031322928363120312030203020313329283632203120302030203134292836332031203020302031352928363420312030203020313629283635203120302030203137292836362031203020302031382928363720312030203020313929283638203120302030203230292836392031203020302032312928373020312030203020323229283731203120302030203233292837322031203020302032342928373320312030203020323529283734203120302030203236292837352031203020302032372928373620312030203020323829283737203120302030203239292837382031203020302033302928373920312030203020333129283830203120302030203332292838312031203020302033332928383220312030203020333429283833203120302030203335292838342031203020302033362928383520312030203020333729283836203120302030203338292838372031203020302033392928383820312030203020343029283839203120302030203431292839302031203020302034322928393120312030203020343329283932203120302030203434292839332031203020302034352928393420312030203020343629283935203120302030203437292839362032203020302031343429283937203220302030203134352928393820322030203020313436292839392032203020302031343729283130302032203020302031343829283130312032203020302031343929283130322032203020302031353029283130332032203020302031353129283130342032203020302031353229283130352032203020302031353329283130362032203020302031353429283130372032203020302031353529283130382032203020302031353629283130392032203020302031353729283131302032203020302031353829283131312032203020302031353929283131322032203020302031363029283131332032203020302031363129283131342032203020302031363229283131352032203020302031363329283131362032203020302031363429283131372032203020302031363529283131382032203020302031363629283131392032203020302031363729283132302032203020302031363829283132312032203020302031363929283132322032203020302031373029283132332032203020302031373129283132342032203020302031373229283132352032203020302031373329283132362032203020302031373429283132372032203020302031373529283132382032203020302031373629283132392032203020302031373729283133302032203020302031373829283133312032203020302031373929283133322032203020302031383029283133332032203020302031383129283133342032203020302031383229283133352032203020302031383329283133362032203020302031383429283133372032203020302031383529283133382032203020302031383629283133392032203020302031383729283134302032203020302031383829283134312032203020302031383929283134322032203020302031393029283134332032203020302031393129283134342031203020302034382928313435203120302030203439292831343620312030203020353029283134372031203020302035312928313438203120302030203532292831343920312030203020353329283135302031203020302035342928313531203120302030203535292831353220312030203020353629283135332031203020302035372928313534203120302030203538292831353520312030203020353929283135362031203020302036302928313537203120302030203631292831353820312030203020363229283135392031203020302036332928313630203120302030203634292831363120312030203020363529283136322031203020302036362928313633203120302030203637292831363420312030203020363829283136352031203020302036392928313636203120302030203730292831363720312030203020373129283136382031203020302037322928313639203120302030203733292831373020312030203020373429283137312031203020302037352928313732203120302030203736292831373320312030203020373729283137342031203020302037382928313735203120302030203739292831373620312030203020383029283137372031203020302038312928313738203120302030203832292831373920312030203020383329283138302031203020302038342928313831203120302030203835292831383220312030203020383629283138332031203020302038372928313834203120302030203838292831383520312030203020383929283138362031203020302039302928313837203120302030203931292831383820312030203020393229283138392031203020302039332928313930203120302030203934292831393120312030203020393529283139322032203020302030292831393320322030203020312928313934203220302030203229283139352032203020302033292831393620322030203020342928313937203220302030203529283139382032203020302036292831393920322030203020372928323030203220302030203829283230312032203020302039292832303220322030203020313029283230332032203020302031312928323034203220302030203132292832303520322030203020313329283230362032203020302031342928323037203220302030203135292832303820322030203020313629283230392032203020302031372928323130203220302030203138292832313120322030203020313929283231322032203020302032302928323133203220302030203231292832313420322030203020323229283231352032203020302032332928323136203220302030203234292832313720322030203020323529283231382032203020302032362928323139203220302030203237292832323020322030203020323829283232312032203020302032392928323232203220302030203330292832323320322030203020333129283232342032203020302033322928323235203220302030203333292832323620322030203020333429283232372032203020302033352928323238203220302030203336292832323920322030203020333729283233302032203020302033382928323331203220302030203339292832333220322030203020343029283233332032203020302034312928323334203220302030203432292832333520322030203020343329283233362032203020302034342928323337203220302030203435292832333820322030203020343629283233392032203020302034372928323430203120302030203936292832343120312030203020393729283234322031203020302039382928323433203120302030203939292832343420312030203020313030292832343520312030203020313031292832343620312030203020313032292832343720312030203020313033292832343820312030203020313034292832343920312030203020313035292832353020312030203020313036292832353120312030203020313037292832353220312030203020313038292832353320312030203020313039292832353420312030203020313130292832353520312030203020313131292832353620312030203020313132292832353720312030203020313133292832353820312030203020313134292832353920312030203020313135292832363020312030203020313136292832363120312030203020313137292832363220312030203020313138292832363320312030203020313139292832363420312030203020313230292832363520312030203020313231292832363620312030203020313232292832363720312030203020313233292832363820312030203020313234292832363920312030203020313235292832373020312030203020313236292832373120312030203020313237292832373220312030203020313238292832373320312030203020313239292832373420312030203020313330292832373520312030203020313331292832373620312030203020313332292832373720312030203020313333292832373820312030203020313334292832373920312030203020313335292832383020312030203020313336292832383120312030203020313337292832383220312030203020313338292832383320312030203020313339292832383420312030203020313430292832383520312030203020313431292832383620312030203020313432292832383720312030203020313433292832383820322030203020343829283238392032203020302034392928323930203220302030203530292832393120322030203020353129283239322032203020302035322928323933203220302030203533292832393420322030203020353429283239352032203020302035352928323936203220302030203536292832393720322030203020353729283239382032203020302035382928323939203220302030203539292833303020322030203020363029283330312032203020302036312928333032203220302030203632292833303320322030203020363329283330342032203020302036342928333035203220302030203635292833303620322030203020363629283330372032203020302036372928333038203220302030203638292833303920322030203020363929283331302032203020302037302928333131203220302030203731292833313220322030203020373229283331332032203020302037332928333134203220302030203734292833313520322030203020373529283331362032203020302037362928333137203220302030203737292833313820322030203020373829283331392032203020302037392928333230203220302030203830292833323120322030203020383129283332322032203020302038322928333233203220302030203833292833323420322030203020383429283332352032203020302038352928333236203220302030203836292833323720322030203020383729283332382032203020302038382928333239203220302030203839292833333020322030203020393029283333312032203020302039312928333332203220302030203932292833333320322030203020393329283333342032203020302039342928333335203220302030203935292833333620312030203020313434292833333720312030203020313435292833333820312030203020313436292833333920312030203020313437292833343020312030203020313438292833343120312030203020313439292833343220312030203020313530292833343320312030203020313531292833343420312030203020313532292833343520312030203020313533292833343620312030203020313534292833343720312030203020313535292833343820312030203020313536292833343920312030203020313537292833353020312030203020313538292833353120312030203020313539292833353220312030203020313630292833353320312030203020313631292833353420312030203020313632292833353520312030203020313633292833353620312030203020313634292833353720312030203020313635292833353820312030203020313636292833353920312030203020313637292833363020312030203020313638292833363120312030203020313639292833363220312030203020313730292833363320312030203020313731292833363420312030203020313732292833363520312030203020313733292833363620312030203020313734292833363720312030203020313735292833363820312030203020313736292833363920312030203020313737292833373020312030203020313738292833373120312030203020313739292833373220312030203020313830292833373320312030203020313831292833373420312030203020313832292833373520312030203020313833292833373620312030203020313834292833373720312030203020313835292833373820312030203020313836292833373920312030203020313837292833383020312030203020313838292833383120312030203020313839292833383220312030203020313930292833383320312030203020313931290a7e6d757854626c3d2832342c31362928302031203332203333203634203635203936203937203132382031323920313630203136312031393220313933203232342032323520323536203235372032383820323839203332302033323120333532203335332928322033203334203335203636203637203938203939203133302031333120313632203136332031393420313935203232362032323720323538203235392032393020323931203332322033323320333534203335352928342035203336203337203638203639203130302031303120313332203133332031363420313635203139362031393720323238203232392032363020323631203239322032393320333234203332352033353620333537292836203720333820333920373020373120313032203130332031333420313335203136362031363720313938203139392032333020323331203236322032363320323934203239352033323620333237203335382033353929283820392034302034312037322037332031303420313035203133362031333720313638203136392032303020323031203233322032333320323634203236352032393620323937203332382033323920333630203336312928313020313120343220343320373420373520313036203130372031333820313339203137302031373120323032203230332032333420323335203236362032363720323938203239392033333020333331203336322033363329283132203133203434203435203736203737203130382031303920313430203134312031373220313733203230342032303520323336203233372032363820323639203330302033303120333332203333332033363420333635292831342031352034362034372037382037392031313020313131203134322031343320313734203137352032303620323037203233382032333920323730203237312033303220333033203333342033333520333636203336372928313620313720343820343920383020383120313132203131332031343420313435203137362031373720323038203230392032343020323431203237322032373320333034203330352033333620333337203336382033363929283138203139203530203531203832203833203131342031313520313436203134372031373820313739203231302032313120323432203234332032373420323735203330362033303720333338203333392033373020333731292832302032312035322035332038342038352031313620313137203134382031343920313830203138312032313220323133203234342032343520323736203237372033303820333039203334302033343120333732203337332928323220323320353420353520383620383720313138203131392031353020313531203138322031383320323134203231352032343620323437203237382032373920333130203331312033343220333433203337342033373529283234203235203536203537203838203839203132302031323120313532203135332031383420313835203231362032313720323438203234392032383020323831203331322033313320333434203334352033373620333737292832362032372035382035392039302039312031323220313233203135342031353520313836203138372032313820323139203235302032353120323832203238332033313420333135203334362033343720333738203337392928323820323920363020363120393220393320313234203132352031353620313537203138382031383920323230203232312032353220323533203238342032383520333136203331372033343820333439203338302033383129283330203331203632203633203934203935203132362031323720313538203135392031393020313931203232322032323320323534203235352032383620323837203331382033313920333530203335312033383220333833290a7e736e734368616e4d61703d283338342c302c3129284150303b303a32383829284150313b313a32383929284150323b323a32393029284150333b333a32393129284150343b343a32393229284150353b353a32393329284150363b363a32393429284150373b373a32393529284150383b383a32393629284150393b393a3239372928415031303b31303a3239382928415031313b31313a3239392928415031323b31323a3330302928415031333b31333a3330312928415031343b31343a3330322928415031353b31353a3330332928415031363b31363a3330342928415031373b31373a3330352928415031383b31383a3330362928415031393b31393a3330372928415032303b32303a3330382928415032313b32313a3330392928415032323b32323a3331302928415032333b32333a3331312928415032343b32343a3331322928415032353b32353a3331332928415032363b32363a3331342928415032373b32373a3331352928415032383b32383a3331362928415032393b32393a3331372928415033303b33303a3331382928415033313b33313a3331392928415033323b33323a3332302928415033333b33333a3332312928415033343b33343a3332322928415033353b33353a3332332928415033363b33363a3332342928415033373b33373a3332352928415033383b33383a3332362928415033393b33393a3332372928415034303b34303a3332382928415034313b34313a3332392928415034323b34323a3333302928415034333b34333a3333312928415034343b34343a3333322928415034353b34353a3333332928415034363b34363a3333342928415034373b34373a3333352928415034383b34383a302928415034393b34393a312928415035303b35303a322928415035313b35313a332928415035323b35323a342928415035333b35333a352928415035343b35343a362928415035353b35353a372928415035363b35363a382928415035373b35373a392928415035383b35383a31302928415035393b35393a31312928415036303b36303a31322928415036313b36313a31332928415036323b36323a31342928415036333b36333a31352928415036343b36343a31362928415036353b36353a31372928415036363b36363a31382928415036373b36373a31392928415036383b36383a32302928415036393b36393a32312928415037303b37303a32322928415037313b37313a32332928415037323b37323a32342928415037333b37333a32352928415037343b37343a32362928415037353b37353a32372928415037363b37363a32382928415037373b37373a32392928415037383b37383a33302928415037393b37393a33312928415038303b38303a33322928415038313b38313a33332928415038323b38323a33342928415038333b38333a33352928415038343b38343a33362928415038353b38353a33372928415038363b38363a33382928415038373b38373a33392928415038383b38383a34302928415038393b38393a34312928415039303b39303a34322928415039313b39313a34332928415039323b39323a34342928415039333b39333a34352928415039343b39343a34362928415039353b39353a34372928415039363b39363a3333362928415039373b39373a3333372928415039383b39383a3333382928415039393b39393a333339292841503130303b3130303a333430292841503130313b3130313a333431292841503130323b3130323a333432292841503130333b3130333a333433292841503130343b3130343a333434292841503130353b3130353a333435292841503130363b3130363a333436292841503130373b3130373a333437292841503130383b3130383a333438292841503130393b3130393a333439292841503131303b3131303a333530292841503131313b3131313a333531292841503131323b3131323a333532292841503131333b3131333a333533292841503131343b3131343a333534292841503131353b3131353a333535292841503131363b3131363a333536292841503131373b3131373a333537292841503131383b3131383a333538292841503131393b3131393a333539292841503132303b3132303a333630292841503132313b3132313a333631292841503132323b3132323a333632292841503132333b3132333a333633292841503132343b3132343a333634292841503132353b3132353a333635292841503132363b3132363a333636292841503132373b3132373a333637292841503132383b3132383a333638292841503132393b3132393a333639292841503133303b3133303a333730292841503133313b3133313a333731292841503133323b3133323a333732292841503133333b3133333a333733292841503133343b3133343a333734292841503133353b3133353a333735292841503133363b3133363a333736292841503133373b3133373a333737292841503133383b3133383a333738292841503133393b3133393a333739292841503134303b3134303a333830292841503134313b3134313a333831292841503134323b3134323a333832292841503134333b3134333a333833292841503134343b3134343a3438292841503134353b3134353a3439292841503134363b3134363a3530292841503134373b3134373a3531292841503134383b3134383a3532292841503134393b3134393a3533292841503135303b3135303a3534292841503135313b3135313a3535292841503135323b3135323a3536292841503135333b3135333a3537292841503135343b3135343a3538292841503135353b3135353a3539292841503135363b3135363a3630292841503135373b3135373a3631292841503135383b3135383a3632292841503135393b3135393a3633292841503136303b3136303a3634292841503136313b3136313a3635292841503136323b3136323a3636292841503136333b3136333a3637292841503136343b3136343a3638292841503136353b3136353a3639292841503136363b3136363a3730292841503136373b3136373a3731292841503136383b3136383a3732292841503136393b3136393a3733292841503137303b3137303a3734292841503137313b3137313a3735292841503137323b3137323a3736292841503137333b3137333a3737292841503137343b3137343a3738292841503137353b3137353a3739292841503137363b3137363a3830292841503137373b3137373a3831292841503137383b3137383a3832292841503137393b3137393a3833292841503138303b3138303a3834292841503138313b3138313a3835292841503138323b3138323a3836292841503138333b3138333a3837292841503138343b3138343a3838292841503138353b3138353a3839292841503138363b3138363a3930292841503138373b3138373a3931292841503138383b3138383a3932292841503138393b3138393a3933292841503139303b3139303a3934292841503139313b3139313a3935292841503139323b3139323a313932292841503139333b3139333a313933292841503139343b3139343a313934292841503139353b3139353a313935292841503139363b3139363a313936292841503139373b3139373a313937292841503139383b3139383a313938292841503139393b3139393a313939292841503230303b3230303a323030292841503230313b3230313a323031292841503230323b3230323a323032292841503230333b3230333a323033292841503230343b3230343a323034292841503230353b3230353a323035292841503230363b3230363a323036292841503230373b3230373a323037292841503230383b3230383a323038292841503230393b3230393a323039292841503231303b3231303a323130292841503231313b3231313a323131292841503231323b3231323a323132292841503231333b3231333a323133292841503231343b3231343a323134292841503231353b3231353a323135292841503231363b3231363a323136292841503231373b3231373a323137292841503231383b3231383a323138292841503231393b3231393a323139292841503232303b3232303a323230292841503232313b3232313a323231292841503232323b3232323a323232292841503232333b3232333a323233292841503232343b3232343a323234292841503232353b3232353a323235292841503232363b3232363a323236292841503232373b3232373a323237292841503232383b3232383a323238292841503232393b3232393a323239292841503233303b3233303a323330292841503233313b3233313a323331292841503233323b3233323a323332292841503233333b3233333a323333292841503233343b3233343a323334292841503233353b3233353a323335292841503233363b3233363a323336292841503233373b3233373a323337292841503233383b3233383a323338292841503233393b3233393a323339292841503234303b3234303a3936292841503234313b3234313a3937292841503234323b3234323a3938292841503234333b3234333a3939292841503234343b3234343a313030292841503234353b3234353a313031292841503234363b3234363a313032292841503234373b3234373a313033292841503234383b3234383a313034292841503234393b3234393a313035292841503235303b3235303a313036292841503235313b3235313a313037292841503235323b3235323a313038292841503235333b3235333a313039292841503235343b3235343a313130292841503235353b3235353a313131292841503235363b3235363a313132292841503235373b3235373a313133292841503235383b3235383a313134292841503235393b3235393a313135292841503236303b3236303a313136292841503236313b3236313a313137292841503236323b3236323a313138292841503236333b3236333a313139292841503236343b3236343a313230292841503236353b3236353a313231292841503236363b3236363a313232292841503236373b3236373a313233292841503236383b3236383a313234292841503236393b3236393a313235292841503237303b3237303a313236292841503237313b3237313a313237292841503237323b3237323a313238292841503237333b3237333a313239292841503237343b3237343a313330292841503237353b3237353a313331292841503237363b3237363a313332292841503237373b3237373a313333292841503237383b3237383a313334292841503237393b3237393a313335292841503238303b3238303a313336292841503238313b3238313a313337292841503238323b3238323a313338292841503238333b3238333a313339292841503238343b3238343a313430292841503238353b3238353a313431292841503238363b3238363a313432292841503238373b3238373a313433292841503238383b3238383a323430292841503238393b3238393a323431292841503239303b3239303a323432292841503239313b3239313a323433292841503239323b3239323a323434292841503239333b3239333a323435292841503239343b3239343a323436292841503239353b3239353a323437292841503239363b3239363a323438292841503239373b3239373a323439292841503239383b3239383a323530292841503239393b3239393a323531292841503330303b3330303a323532292841503330313b3330313a323533292841503330323b3330323a323534292841503330333b3330333a323535292841503330343b3330343a323536292841503330353b3330353a323537292841503330363b3330363a323538292841503330373b3330373a323539292841503330383b3330383a323630292841503330393b3330393a323631292841503331303b3331303a323632292841503331313b3331313a323633292841503331323b3331323a323634292841503331333b3331333a323635292841503331343b3331343a323636292841503331353b3331353a323637292841503331363b3331363a323638292841503331373b3331373a323639292841503331383b3331383a323730292841503331393b3331393a323731292841503332303b3332303a323732292841503332313b3332313a323733292841503332323b3332323a323734292841503332333b3332333a323735292841503332343b3332343a323736292841503332353b3332353a323737292841503332363b3332363a323738292841503332373b3332373a323739292841503332383b3332383a323830292841503332393b3332393a323831292841503333303b3333303a323832292841503333313b3333313a323833292841503333323b3333323a323834292841503333333b3333333a323835292841503333343b3333343a323836292841503333353b3333353a323837292841503333363b3333363a313434292841503333373b3333373a313435292841503333383b3333383a313436292841503333393b3333393a313437292841503334303b3334303a313438292841503334313b3334313a313439292841503334323b3334323a313530292841503334333b3334333a313531292841503334343b3334343a313532292841503334353b3334353a313533292841503334363b3334363a313534292841503334373b3334373a313535292841503334383b3334383a313536292841503334393b3334393a313537292841503335303b3335303a313538292841503335313b3335313a313539292841503335323b3335323a313630292841503335333b3335333a313631292841503335343b3335343a313632292841503335353b3335353a313633292841503335363b3335363a313634292841503335373b3335373a313635292841503335383b3335383a313636292841503335393b3335393a313637292841503336303b3336303a313638292841503336313b3336313a313639292841503336323b3336323a313730292841503336333b3336333a313731292841503336343b3336343a313732292841503336353b3336353a313733292841503336363b3336363a313734292841503336373b3336373a313735292841503336383b3336383a313736292841503336393b3336393a313737292841503337303b3337303a313738292841503337313b3337313a313739292841503337323b3337323a313830292841503337333b3337333a313831292841503337343b3337343a313832292841503337353b3337353a313833292841503337363b3337363a313834292841503337373b3337373a313835292841503337383b3337383a313836292841503337393b3337393a313837292841503338303b3338303a313838292841503338313b3338313a313839292841503338323b3338323a313930292841503338333b3338333a31393129285359303b3338343a333834290a7e736e7347656f6d4d61703d284e50323031302c342c3235302c37302928323a32373a3732303a312928323a35393a3732303a312928323a32373a3733353a312928323a35393a3733353a312928323a32373a3735303a312928323a35393a3735303a312928323a32373a3736353a312928323a35393a3736353a312928323a32373a3738303a312928323a35393a3738303a312928323a32373a3739353a312928323a35393a3739353a312928323a32373a3831303a312928323a35393a3831303a312928323a32373a3832353a312928323a35393a3832353a312928323a32373a3834303a312928323a35393a3834303a312928323a32373a3835353a312928323a35393a3835353a312928323a32373a3837303a312928323a35393a3837303a312928323a32373a3838353a312928323a35393a3838353a312928323a32373a3930303a312928323a35393a3930303a312928323a32373a3931353a312928323a35393a3931353a312928323a32373a3933303a312928323a35393a3933303a312928323a32373a3934353a312928323a35393a3934353a312928323a32373a3936303a312928323a35393a3936303a312928323a32373a3937353a312928323a35393a3937353a312928323a32373a3939303a312928323a35393a3939303a312928323a32373a313030353a312928323a35393a313030353a312928323a32373a313032303a312928323a35393a313032303a312928323a32373a313033353a312928323a35393a313033353a312928323a32373a313035303a312928323a35393a313035303a312928323a32373a313036353a312928323a35393a313036353a312928313a32373a303a312928313a35393a303a312928313a32373a31353a312928313a35393a31353a312928313a32373a33303a312928313a35393a33303a312928313a32373a34353a312928313a35393a34353a312928313a32373a36303a312928313a35393a36303a312928313a32373a37353a312928313a35393a37353a312928313a32373a39303a312928313a35393a39303a312928313a32373a3130353a312928313a35393a3130353a312928313a32373a3132303a312928313a35393a3132303a312928313a32373a3133353a312928313a35393a3133353a312928313a32373a3135303a312928313a35393a3135303a312928313a32373a3136353a312928313a35393a3136353a312928313a32373a3138303a312928313a35393a3138303a312928313a32373a3139353a312928313a35393a3139353a312928313a32373a3231303a312928313a35393a3231303a312928313a32373a3232353a312928313a35393a3232353a312928313a32373a3234303a312928313a35393a3234303a312928313a32373a3235353a312928313a35393a3235353a312928313a32373a3237303a312928313a35393a3237303a312928313a32373a3238353a312928313a35393a3238353a312928313a32373a3330303a312928313a35393a3330303a312928313a32373a3331353a312928313a35393a3331353a312928313a32373a3333303a312928313a35393a3333303a312928313a32373a3334353a312928313a35393a3334353a312928323a32373a313038303a312928323a35393a313038303a312928323a32373a313039353a312928323a35393a313039353a312928323a32373a313131303a312928323a35393a313131303a312928323a32373a313132353a312928323a35393a313132353a312928323a32373a313134303a312928323a35393a313134303a312928323a32373a313135353a312928323a35393a313135353a312928323a32373a313137303a312928323a35393a313137303a312928323a32373a313138353a312928323a35393a313138353a312928323a32373a313230303a312928323a35393a313230303a312928323a32373a313231353a312928323a35393a313231353a312928323a32373a313233303a312928323a35393a313233303a312928323a32373a313234353a312928323a35393a313234353a312928323a32373a313236303a312928323a35393a313236303a312928323a32373a313237353a312928323a35393a313237353a312928323a32373a313239303a312928323a35393a313239303a312928323a32373a313330353a312928323a35393a313330353a302928323a32373a313332303a312928323a35393a313332303a312928323a32373a313333353a312928323a35393a313333353a312928323a32373a313335303a312928323a35393a313335303a312928323a32373a313336353a312928323a35393a313336353a312928323a32373a313338303a312928323a35393a313338303a312928323a32373a313339353a312928323a35393a313339353a312928323a32373a313431303a312928323a35393a313431303a312928323a32373a313432353a312928323a35393a313432353a312928313a32373a3336303a312928313a35393a3336303a312928313a32373a3337353a312928313a35393a3337353a312928313a32373a3339303a312928313a35393a3339303a312928313a32373a3430353a312928313a35393a3430353a312928313a32373a3432303a312928313a35393a3432303a312928313a32373a3433353a312928313a35393a3433353a312928313a32373a3435303a312928313a35393a3435303a312928313a32373a3436353a312928313a35393a3436353a312928313a32373a3438303a312928313a35393a3438303a312928313a32373a3439353a312928313a35393a3439353a312928313a32373a3531303a312928313a35393a3531303a312928313a32373a3532353a312928313a35393a3532353a312928313a32373a3534303a312928313a35393a3534303a312928313a32373a3535353a312928313a35393a3535353a312928313a32373a3537303a312928313a35393a3537303a312928313a32373a3538353a312928313a35393a3538353a312928313a32373a3630303a312928313a35393a3630303a312928313a32373a3631353a312928313a35393a3631353a312928313a32373a3633303a312928313a35393a3633303a312928313a32373a3634353a312928313a35393a3634353a312928313a32373a3636303a312928313a35393a3636303a312928313a32373a3637353a312928313a35393a3637353a312928313a32373a3639303a312928313a35393a3639303a312928313a32373a3730353a312928313a35393a3730353a312928323a32373a303a312928323a35393a303a312928323a32373a31353a312928323a35393a31353a312928323a32373a33303a312928323a35393a33303a312928323a32373a34353a312928323a35393a34353a312928323a32373a36303a312928323a35393a36303a312928323a32373a37353a312928323a35393a37353a312928323a32373a39303a312928323a35393a39303a312928323a32373a3130353a312928323a35393a3130353a312928323a32373a3132303a312928323a35393a3132303a312928323a32373a3133353a312928323a35393a3133353a312928323a32373a3135303a312928323a35393a3135303a312928323a32373a3136353a312928323a35393a3136353a312928323a32373a3138303a312928323a35393a3138303a312928323a32373a3139353a312928323a35393a3139353a312928323a32373a3231303a312928323a35393a3231303a312928323a32373a3232353a312928323a35393a3232353a312928323a32373a3234303a312928323a35393a3234303a312928323a32373a3235353a312928323a35393a3235353a312928323a32373a3237303a312928323a35393a3237303a312928323a32373a3238353a312928323a35393a3238353a312928323a32373a3330303a312928323a35393a3330303a312928323a32373a3331353a312928323a35393a3331353a312928323a32373a3333303a312928323a35393a3333303a312928323a32373a3334353a312928323a35393a3334353a312928313a32373a3732303a312928313a35393a3732303a312928313a32373a3733353a312928313a35393a3733353a312928313a32373a3735303a312928313a35393a3735303a312928313a32373a3736353a312928313a35393a3736353a312928313a32373a3738303a312928313a35393a3738303a312928313a32373a3739353a312928313a35393a3739353a312928313a32373a3831303a312928313a35393a3831303a312928313a32373a3832353a312928313a35393a3832353a312928313a32373a3834303a312928313a35393a3834303a312928313a32373a3835353a312928313a35393a3835353a312928313a32373a3837303a312928313a35393a3837303a312928313a32373a3838353a312928313a35393a3838353a312928313a32373a3930303a312928313a35393a3930303a312928313a32373a3931353a312928313a35393a3931353a312928313a32373a3933303a312928313a35393a3933303a312928313a32373a3934353a312928313a35393a3934353a312928313a32373a3936303a312928313a35393a3936303a312928313a32373a3937353a312928313a35393a3937353a312928313a32373a3939303a312928313a35393a3939303a312928313a32373a313030353a312928313a35393a313030353a312928313a32373a313032303a312928313a35393a313032303a312928313a32373a313033353a312928313a35393a313033353a312928313a32373a313035303a312928313a35393a313035303a312928313a32373a313036353a312928313a35393a313036353a312928323a32373a3336303a312928323a35393a3336303a312928323a32373a3337353a312928323a35393a3337353a312928323a32373a3339303a312928323a35393a3339303a312928323a32373a3430353a312928323a35393a3430353a312928323a32373a3432303a312928323a35393a3432303a312928323a32373a3433353a312928323a35393a3433353a312928323a32373a3435303a312928323a35393a3435303a312928323a32373a3436353a312928323a35393a3436353a312928323a32373a3438303a312928323a35393a3438303a312928323a32373a3439353a312928323a35393a3439353a312928323a32373a3531303a312928323a35393a3531303a312928323a32373a3532353a312928323a35393a3532353a312928323a32373a3534303a312928323a35393a3534303a312928323a32373a3535353a312928323a35393a3535353a312928323a32373a3537303a312928323a35393a3537303a312928323a32373a3538353a312928323a35393a3538353a312928323a32373a3630303a312928323a35393a3630303a312928323a32373a3631353a312928323a35393a3631353a312928323a32373a3633303a312928323a35393a3633303a312928323a32373a3634353a312928323a35393a3634353a312928323a32373a3636303a312928323a35393a3636303a312928323a32373a3637353a312928323a35393a3637353a312928323a32373a3639303a312928323a35393a3639303a312928323a32373a3730353a312928323a35393a3730353a312928313a32373a313038303a312928313a35393a313038303a312928313a32373a313039353a312928313a35393a313039353a312928313a32373a313131303a312928313a35393a313131303a312928313a32373a313132353a312928313a35393a313132353a312928313a32373a313134303a312928313a35393a313134303a312928313a32373a313135353a312928313a35393a313135353a312928313a32373a313137303a312928313a35393a313137303a312928313a32373a313138353a312928313a35393a313138353a312928313a32373a313230303a312928313a35393a313230303a312928313a32373a313231353a312928313a35393a313231353a312928313a32373a313233303a312928313a35393a313233303a312928313a32373a313234353a312928313a35393a313234353a312928313a32373a313236303a312928313a35393a313236303a312928313a32373a313237353a312928313a35393a313237353a312928313a32373a313239303a312928313a35393a313239303a312928313a32373a313330353a312928313a35393a313330353a312928313a32373a313332303a312928313a35393a313332303a312928313a32373a313333353a312928313a35393a313333353a312928313a32373a313335303a312928313a35393a313335303a312928313a32373a313336353a312928313a35393a313336353a312928313a32373a313338303a312928313a35393a313338303a312928313a32373a313339353a312928313a35393a313339353a312928313a32373a313431303a312928313a35393a313431303a312928313a32373a313432353a312928313a35393a313432353a31290a7e736e735368616e6b4d61703d28342c322c3634302928323a303a34383a312928323a313a34383a312928323a303a34393a312928323a313a34393a312928323a303a35303a312928323a313a35303a312928323a303a35313a312928323a313a35313a312928323a303a35323a312928323a313a35323a312928323a303a35333a312928323a313a35333a312928323a303a35343a312928323a313a35343a312928323a303a35353a312928323a313a35353a312928323a303a35363a312928323a313a35363a312928323a303a35373a312928323a313a35373a312928323a303a35383a312928323a313a35383a312928323a303a35393a312928323a313a35393a312928323a303a36303a312928323a313a36303a312928323a303a36313a312928323a313a36313a312928323a303a36323a312928323a313a36323a312928323a303a36333a312928323a313a36333a312928323a303a36343a312928323a313a36343a312928323a303a36353a312928323a313a36353a312928323a303a36363a312928323a313a36363a312928323a303a36373a312928323a313a36373a312928323a303a36383a312928323a313a36383a312928323a303a36393a312928323a313a36393a312928323a303a37303a312928323a313a37303a312928323a303a37313a312928323a313a37313a312928313a303a303a312928313a313a303a312928313a303a313a312928313a313a313a312928313a303a323a312928313a313a323a312928313a303a333a312928313a313a333a312928313a303a343a312928313a313a343a312928313a303a353a312928313a313a353a312928313a303a363a312928313a313a363a312928313a303a373a312928313a313a373a312928313a303a383a312928313a313a383a312928313a303a393a312928313a313a393a312928313a303a31303a312928313a313a31303a312928313a303a31313a312928313a313a31313a312928313a303a31323a312928313a313a31323a312928313a303a31333a312928313a313a31333a312928313a303a31343a312928313a313a31343a312928313a303a31353a312928313a313a31353a312928313a303a31363a312928313a313a31363a312928313a303a31373a312928313a313a31373a312928313a303a31383a312928313a313a31383a312928313a303a31393a312928313a313a31393a312928313a303a32303a312928313a313a32303a312928313a303a32313a312928313a313a32313a312928313a303a32323a312928313a313a32323a312928313a303a32333a312928313a313a32333a312928323a303a37323a312928323a313a37323a312928323a303a37333a312928323a313a37333a312928323a303a37343a312928323a313a37343a312928323a303a37353a312928323a313a37353a312928323a303a37363a312928323a313a37363a312928323a303a37373a312928323a313a37373a312928323a303a37383a312928323a313a37383a312928323a303a37393a312928323a313a37393a312928323a303a38303a312928323a313a38303a312928323a303a38313a312928323a313a38313a312928323a303a38323a312928323a313a38323a312928323a303a38333a312928323a313a38333a312928323a303a38343a312928323a313a38343a312928323a303a38353a312928323a313a38353a312928323a303a38363a312928323a313a38363a312928323a303a38373a312928323a313a38373a302928323a303a38383a312928323a313a38383a312928323a303a38393a312928323a313a38393a312928323a303a39303a312928323a313a39303a312928323a303a39313a312928323a313a39313a312928323a303a39323a312928323a313a39323a312928323a303a39333a312928323a313a39333a312928323a303a39343a312928323a313a39343a312928323a303a39353a312928323a313a39353a312928313a303a32343a312928313a313a32343a312928313a303a32353a312928313a313a32353a312928313a303a32363a312928313a313a32363a312928313a303a32373a312928313a313a32373a312928313a303a32383a312928313a313a32383a312928313a303a32393a312928313a313a32393a312928313a303a33303a312928313a313a33303a312928313a303a33313a312928313a313a33313a312928313a303a33323a312928313a313a33323a312928313a303a33333a312928313a313a33333a312928313a303a33343a312928313a313a33343a312928313a303a33353a312928313a313a33353a312928313a303a33363a312928313a313a33363a312928313a303a33373a312928313a313a33373a312928313a303a33383a312928313a313a33383a312928313a303a33393a312928313a313a33393a312928313a303a34303a312928313a313a34303a312928313a303a34313a312928313a313a34313a312928313a303a34323a312928313a313a34323a312928313a303a34333a312928313a313a34333a312928313a303a34343a312928313a313a34343a312928313a303a34353a312928313a313a34353a312928313a303a34363a312928313a313a34363a312928313a303a34373a312928313a313a34373a312928323a303a303a312928323a313a303a312928323a303a313a312928323a313a313a312928323a303a323a312928323a313a323a312928323a303a333a312928323a313a333a312928323a303a343a312928323a313a343a312928323a303a353a312928323a313a353a312928323a303a363a312928323a313a363a312928323a303a373a312928323a313a373a312928323a303a383a312928323a313a383a312928323a303a393a312928323a313a393a312928323a303a31303a312928323a313a31303a312928323a303a31313a312928323a313a31313a312928323a303a31323a312928323a313a31323a312928323a303a31333a312928323a313a31333a312928323a303a31343a312928323a313a31343a312928323a303a31353a312928323a313a31353a312928323a303a31363a312928323a313a31363a312928323a303a31373a312928323a313a31373a312928323a303a31383a312928323a313a31383a312928323a303a31393a312928323a313a31393a312928323a303a32303a312928323a313a32303a312928323a303a32313a312928323a313a32313a312928323a303a32323a312928323a313a32323a312928323a303a32333a312928323a313a32333a312928313a303a34383a312928313a313a34383a312928313a303a34393a312928313a313a34393a312928313a303a35303a312928313a313a35303a312928313a303a35313a312928313a313a35313a312928313a303a35323a312928313a313a35323a312928313a303a35333a312928313a313a35333a312928313a303a35343a312928313a313a35343a312928313a303a35353a312928313a313a35353a312928313a303a35363a312928313a313a35363a312928313a303a35373a312928313a313a35373a312928313a303a35383a312928313a313a35383a312928313a303a35393a312928313a313a35393a312928313a303a36303a312928313a313a36303a312928313a303a36313a312928313a313a36313a312928313a303a36323a312928313a313a36323a312928313a303a36333a312928313a313a36333a312928313a303a36343a312928313a313a36343a312928313a303a36353a312928313a313a36353a312928313a303a36363a312928313a313a36363a312928313a303a36373a312928313a313a36373a312928313a303a36383a312928313a313a36383a312928313a303a36393a312928313a313a36393a312928313a303a37303a312928313a313a37303a312928313a303a37313a312928313a313a37313a312928323a303a32343a312928323a313a32343a312928323a303a32353a312928323a313a32353a312928323a303a32363a312928323a313a32363a312928323a303a32373a312928323a313a32373a312928323a303a32383a312928323a313a32383a312928323a303a32393a312928323a313a32393a312928323a303a33303a312928323a313a33303a312928323a303a33313a312928323a313a33313a312928323a303a33323a312928323a313a33323a312928323a303a33333a312928323a313a33333a312928323a303a33343a312928323a313a33343a312928323a303a33353a312928323a313a33353a312928323a303a33363a312928323a313a33363a312928323a303a33373a312928323a313a33373a312928323a303a33383a312928323a313a33383a312928323a303a33393a312928323a313a33393a312928323a303a34303a312928323a313a34303a312928323a303a34313a312928323a313a34313a312928323a303a34323a312928323a313a34323a312928323a303a34333a312928323a313a34333a312928323a303a34343a312928323a313a34343a312928323a303a34353a312928323a313a34353a312928323a303a34363a312928323a313a34363a312928323a303a34373a312928323a313a34373a312928313a303a37323a312928313a313a37323a312928313a303a37333a312928313a313a37333a312928313a303a37343a312928313a313a37343a312928313a303a37353a312928313a313a37353a312928313a303a37363a312928313a313a37363a312928313a303a37373a312928313a313a37373a312928313a303a37383a312928313a313a37383a312928313a303a37393a312928313a313a37393a312928313a303a38303a312928313a313a38303a312928313a303a38313a312928313a313a38313a312928313a303a38323a312928313a313a38323a312928313a303a38333a312928313a313a38333a312928313a303a38343a312928313a313a38343a312928313a303a38353a312928313a313a38353a312928313a303a38363a312928313a313a38363a312928313a303a38373a312928313a313a38373a312928313a303a38383a312928313a313a38383a312928313a303a38393a312928313a313a38393a312928313a303a39303a312928313a313a39303a312928313a303a39313a312928313a313a39313a312928313a303a39323a312928313a313a39323a312928313a303a39333a312928313a313a39333a312928313a303a39343a312928313a313a39343a312928313a303a39353a312928313a313a39353a31290a", + "expected": { + "format": "spikeglx", + "summary": "SpikeGLX imec.ap, 385 channels, 30000 Hz, 0.25 s, Neuropixels 2.0 (4 shank)", + "fields": { + "streamType": "imec", + "appVersion": "20250325", + "originalFileName": "C:/Users/Joe/Desktop/1119617_LSE1_shank12_g0_imec0/1119617_LSE1_shank12_g0_t0.exported.imec0.ap.bin", + "fileCreateTime": "2023-04-15T15:56:51", + "gateMode": "Immediate", + "trigMode": "Immediate", + "probePartNumber": "NP2010", + "probeSerial": "20403314871", + "imecApiVersion": "3.57", + "basestationPartNumber": "NP2_QBSC_00", + "headstagePartNumber": "NPM_HS_30", + "savedChannelSubset": "0:384", + "calibrated": "true", + "channelCount": 385, + "fileSizeBytes": 5775000, + "firstSample": 717562, + "maxInt": 8192, + "probeType": 24, + "probeSlot": 2, + "probePort": 2, + "probeDock": 1, + "durationSeconds": 0.25, + "analogRangeMaxVolts": 0.5, + "analogRangeMinVolts": -0.5, + "samplingRateHz": 30000.0, + "apChannels": 384, + "lfChannels": 0, + "syncChannels": 1, + "acquiredApChannels": 384, + "acquiredLfChannels": 0, + "acquiredSyncChannels": 1, + "sampleCount": 7500, + "probeModel": "Neuropixels 2.0 (4 shank)", + "imroTblEntries": 384, + "snsChanMapEntries": 385, + "snsGeomMapEntries": 384, + "snsShankMapEntries": 384, + "microvoltsPerBit": 0.762939453125, + "stream": "ap", + "device": "imec0", + "runName": "1119617_LSE1_shank12", + "gateIndex": 0, + "triggerIndex": 0, + "keyCount": 58 + } + } + }, + { + "name": "IBL sample3B2_exported.imec0.ap.meta (Neuropixels 1.0, concatenated run)", + "key": "sample3B2_exported.imec0.ap.meta", + "hex": "61637141704c6653793d3338342c3338342c310a61707056657273696f6e3d32303139303732340a6361745456616c733d302c3739390a66696c6543726561746554696d653d323032302d30322d32345430373a33363a32370a66696c6543726561746554696d655f6f726967696e616c3d323031392d30352d33315431363a31343a30340a66696c654e616d653d483a2f63617467745f53433032335f3035333131395f67302f53433032335f3035333131395f67305f696d6563302f53433032335f3035333131395f67305f746361742e6578706f727465642e696d6563302e61702e62696e0a66696c65534841313d443941363733413034413330453630393439453337334642423535323542394637393443373332310a66696c6553697a6542797465733d313831313938393733320a66696c6554696d65536563733d39392e39393939373931363635353239350a666972737453616d706c653d3139383233393238300a676174654d6f64653d496d6d6564696174650a696d416952616e67654d61783d302e360a696d416952616e67654d696e3d2d302e360a696d43616c696272617465643d747275650a696d4461744170693d312e31350a696d44617442735f66773d312e312e3132330a696d4461744273635f66773d312e302e3135310a696d4461744273635f68773d312e390a696d4461744273635f706e3d4e50325f514253435f30300a696d4461744273635f736e3d3134340a696d44617446785f68773d312e320a696d44617446785f706e3d4e50325f464c45585f300a696d44617448735f66773d352e310a696d44617448735f706e3d4e50325f48535f33300a696d44617448735f736e3d3236320a696d4461745072625f706e3d5052425f315f325f303438305f320a696d4461745072625f706f72743d310a696d4461745072625f736c6f743d320a696d4461745072625f736e3d31373231363730333335320a696d4461745072625f747970653d300a696d4c4544456e61626c653d66616c73650a696d526f46696c653d0a696d53616d70526174653d32393939392e38333632350a696d53746462793d0a696d547267526973696e673d747275650a696d547267536f757263653d300a6e53617665644368616e733d3330320a736e7341704c6653793d3330312c302c310a736e73536176654368616e5375627365743d303a3330302c3736380a73796e63496d496e707574536c6f743d320a73796e63536f757263654964783d320a73796e63536f75726365506572696f643d310a74726754544c41494368616e3d310a74726754544c4269743d300a74726754544c496e61726f773d350a74726754544c4973416e616c6f673d747275650a74726754544c49734e496e663d747275650a74726754544c4d617267696e533d302e350a74726754544c4d6f64653d320a74726754544c4e483d31300a74726754544c52656672616374533d302e350a74726754544c53747265616d3d6e6964710a74726754544c54483d302e350a74726754544c5468726573683d312e310a747269674d6f64653d54544c0a74797065496d456e61626c65643d340a747970654e69456e61626c65643d310a74797065546869733d696d65630a757365724e6f7465733d696d6563303a206c65667420616c6d3b20696d6563313a20726967687420616c6d3b20696d6563323a206c656674206d6964627261696e3b20696d6563333a207269676874206d6964627261696e0a7e696d726f54626c3d28302c33383429283020302030203530302032353020312928312030203020353030203235302031292832203020302035303020323530203129283320302030203530302032353020312928342030203020353030203235302031292835203020302035303020323530203129283620302030203530302032353020312928372030203020353030203235302031292838203020302035303020323530203129283920302030203530302032353020312928313020302030203530302032353020312928313120302030203530302032353020312928313220302030203530302032353020312928313320302030203530302032353020312928313420302030203530302032353020312928313520302030203530302032353020312928313620302030203530302032353020312928313720302030203530302032353020312928313820302030203530302032353020312928313920302030203530302032353020312928323020302030203530302032353020312928323120302030203530302032353020312928323220302030203530302032353020312928323320302030203530302032353020312928323420302030203530302032353020312928323520302030203530302032353020312928323620302030203530302032353020312928323720302030203530302032353020312928323820302030203530302032353020312928323920302030203530302032353020312928333020302030203530302032353020312928333120302030203530302032353020312928333220302030203530302032353020312928333320302030203530302032353020312928333420302030203530302032353020312928333520302030203530302032353020312928333620302030203530302032353020312928333720302030203530302032353020312928333820302030203530302032353020312928333920302030203530302032353020312928343020302030203530302032353020312928343120302030203530302032353020312928343220302030203530302032353020312928343320302030203530302032353020312928343420302030203530302032353020312928343520302030203530302032353020312928343620302030203530302032353020312928343720302030203530302032353020312928343820302030203530302032353020312928343920302030203530302032353020312928353020302030203530302032353020312928353120302030203530302032353020312928353220302030203530302032353020312928353320302030203530302032353020312928353420302030203530302032353020312928353520302030203530302032353020312928353620302030203530302032353020312928353720302030203530302032353020312928353820302030203530302032353020312928353920302030203530302032353020312928363020302030203530302032353020312928363120302030203530302032353020312928363220302030203530302032353020312928363320302030203530302032353020312928363420302030203530302032353020312928363520302030203530302032353020312928363620302030203530302032353020312928363720302030203530302032353020312928363820302030203530302032353020312928363920302030203530302032353020312928373020302030203530302032353020312928373120302030203530302032353020312928373220302030203530302032353020312928373320302030203530302032353020312928373420302030203530302032353020312928373520302030203530302032353020312928373620302030203530302032353020312928373720302030203530302032353020312928373820302030203530302032353020312928373920302030203530302032353020312928383020302030203530302032353020312928383120302030203530302032353020312928383220302030203530302032353020312928383320302030203530302032353020312928383420302030203530302032353020312928383520302030203530302032353020312928383620302030203530302032353020312928383720302030203530302032353020312928383820302030203530302032353020312928383920302030203530302032353020312928393020302030203530302032353020312928393120302030203530302032353020312928393220302030203530302032353020312928393320302030203530302032353020312928393420302030203530302032353020312928393520302030203530302032353020312928393620302030203530302032353020312928393720302030203530302032353020312928393820302030203530302032353020312928393920302030203530302032353020312928313030203020302035303020323530203129283130312030203020353030203235302031292831303220302030203530302032353020312928313033203020302035303020323530203129283130342030203020353030203235302031292831303520302030203530302032353020312928313036203020302035303020323530203129283130372030203020353030203235302031292831303820302030203530302032353020312928313039203020302035303020323530203129283131302030203020353030203235302031292831313120302030203530302032353020312928313132203020302035303020323530203129283131332030203020353030203235302031292831313420302030203530302032353020312928313135203020302035303020323530203129283131362030203020353030203235302031292831313720302030203530302032353020312928313138203020302035303020323530203129283131392030203020353030203235302031292831323020302030203530302032353020312928313231203020302035303020323530203129283132322030203020353030203235302031292831323320302030203530302032353020312928313234203020302035303020323530203129283132352030203020353030203235302031292831323620302030203530302032353020312928313237203020302035303020323530203129283132382030203020353030203235302031292831323920302030203530302032353020312928313330203020302035303020323530203129283133312030203020353030203235302031292831333220302030203530302032353020312928313333203020302035303020323530203129283133342030203020353030203235302031292831333520302030203530302032353020312928313336203020302035303020323530203129283133372030203020353030203235302031292831333820302030203530302032353020312928313339203020302035303020323530203129283134302030203020353030203235302031292831343120302030203530302032353020312928313432203020302035303020323530203129283134332030203020353030203235302031292831343420302030203530302032353020312928313435203020302035303020323530203129283134362030203020353030203235302031292831343720302030203530302032353020312928313438203020302035303020323530203129283134392030203020353030203235302031292831353020302030203530302032353020312928313531203020302035303020323530203129283135322030203020353030203235302031292831353320302030203530302032353020312928313534203020302035303020323530203129283135352030203020353030203235302031292831353620302030203530302032353020312928313537203020302035303020323530203129283135382030203020353030203235302031292831353920302030203530302032353020312928313630203020302035303020323530203129283136312030203020353030203235302031292831363220302030203530302032353020312928313633203020302035303020323530203129283136342030203020353030203235302031292831363520302030203530302032353020312928313636203020302035303020323530203129283136372030203020353030203235302031292831363820302030203530302032353020312928313639203020302035303020323530203129283137302030203020353030203235302031292831373120302030203530302032353020312928313732203020302035303020323530203129283137332030203020353030203235302031292831373420302030203530302032353020312928313735203020302035303020323530203129283137362030203020353030203235302031292831373720302030203530302032353020312928313738203020302035303020323530203129283137392030203020353030203235302031292831383020302030203530302032353020312928313831203020302035303020323530203129283138322030203020353030203235302031292831383320302030203530302032353020312928313834203020302035303020323530203129283138352030203020353030203235302031292831383620302030203530302032353020312928313837203020302035303020323530203129283138382030203020353030203235302031292831383920302030203530302032353020312928313930203020302035303020323530203129283139312030203020353030203235302031292831393220302030203530302032353020312928313933203020302035303020323530203129283139342030203020353030203235302031292831393520302030203530302032353020312928313936203020302035303020323530203129283139372030203020353030203235302031292831393820302030203530302032353020312928313939203020302035303020323530203129283230302030203020353030203235302031292832303120302030203530302032353020312928323032203020302035303020323530203129283230332030203020353030203235302031292832303420302030203530302032353020312928323035203020302035303020323530203129283230362030203020353030203235302031292832303720302030203530302032353020312928323038203020302035303020323530203129283230392030203020353030203235302031292832313020302030203530302032353020312928323131203020302035303020323530203129283231322030203020353030203235302031292832313320302030203530302032353020312928323134203020302035303020323530203129283231352030203020353030203235302031292832313620302030203530302032353020312928323137203020302035303020323530203129283231382030203020353030203235302031292832313920302030203530302032353020312928323230203020302035303020323530203129283232312030203020353030203235302031292832323220302030203530302032353020312928323233203020302035303020323530203129283232342030203020353030203235302031292832323520302030203530302032353020312928323236203020302035303020323530203129283232372030203020353030203235302031292832323820302030203530302032353020312928323239203020302035303020323530203129283233302030203020353030203235302031292832333120302030203530302032353020312928323332203020302035303020323530203129283233332030203020353030203235302031292832333420302030203530302032353020312928323335203020302035303020323530203129283233362030203020353030203235302031292832333720302030203530302032353020312928323338203020302035303020323530203129283233392030203020353030203235302031292832343020302030203530302032353020312928323431203020302035303020323530203129283234322030203020353030203235302031292832343320302030203530302032353020312928323434203020302035303020323530203129283234352030203020353030203235302031292832343620302030203530302032353020312928323437203020302035303020323530203129283234382030203020353030203235302031292832343920302030203530302032353020312928323530203020302035303020323530203129283235312030203020353030203235302031292832353220302030203530302032353020312928323533203020302035303020323530203129283235342030203020353030203235302031292832353520302030203530302032353020312928323536203020302035303020323530203129283235372030203020353030203235302031292832353820302030203530302032353020312928323539203020302035303020323530203129283236302030203020353030203235302031292832363120302030203530302032353020312928323632203020302035303020323530203129283236332030203020353030203235302031292832363420302030203530302032353020312928323635203020302035303020323530203129283236362030203020353030203235302031292832363720302030203530302032353020312928323638203020302035303020323530203129283236392030203020353030203235302031292832373020302030203530302032353020312928323731203020302035303020323530203129283237322030203020353030203235302031292832373320302030203530302032353020312928323734203020302035303020323530203129283237352030203020353030203235302031292832373620302030203530302032353020312928323737203020302035303020323530203129283237382030203020353030203235302031292832373920302030203530302032353020312928323830203020302035303020323530203129283238312030203020353030203235302031292832383220302030203530302032353020312928323833203020302035303020323530203129283238342030203020353030203235302031292832383520302030203530302032353020312928323836203020302035303020323530203129283238372030203020353030203235302031292832383820302030203530302032353020312928323839203020302035303020323530203129283239302030203020353030203235302031292832393120302030203530302032353020312928323932203020302035303020323530203129283239332030203020353030203235302031292832393420302030203530302032353020312928323935203020302035303020323530203129283239362030203020353030203235302031292832393720302030203530302032353020312928323938203020302035303020323530203129283239392030203020353030203235302031292833303020302030203530302032353020312928333031203020302035303020323530203129283330322030203020353030203235302031292833303320302030203530302032353020312928333034203020302035303020323530203129283330352030203020353030203235302031292833303620302030203530302032353020312928333037203020302035303020323530203129283330382030203020353030203235302031292833303920302030203530302032353020312928333130203020302035303020323530203129283331312030203020353030203235302031292833313220302030203530302032353020312928333133203020302035303020323530203129283331342030203020353030203235302031292833313520302030203530302032353020312928333136203020302035303020323530203129283331372030203020353030203235302031292833313820302030203530302032353020312928333139203020302035303020323530203129283332302030203020353030203235302031292833323120302030203530302032353020312928333232203020302035303020323530203129283332332030203020353030203235302031292833323420302030203530302032353020312928333235203020302035303020323530203129283332362030203020353030203235302031292833323720302030203530302032353020312928333238203020302035303020323530203129283332392030203020353030203235302031292833333020302030203530302032353020312928333331203020302035303020323530203129283333322030203020353030203235302031292833333320302030203530302032353020312928333334203020302035303020323530203129283333352030203020353030203235302031292833333620302030203530302032353020312928333337203020302035303020323530203129283333382030203020353030203235302031292833333920302030203530302032353020312928333430203020302035303020323530203129283334312030203020353030203235302031292833343220302030203530302032353020312928333433203020302035303020323530203129283334342030203020353030203235302031292833343520302030203530302032353020312928333436203020302035303020323530203129283334372030203020353030203235302031292833343820302030203530302032353020312928333439203020302035303020323530203129283335302030203020353030203235302031292833353120302030203530302032353020312928333532203020302035303020323530203129283335332030203020353030203235302031292833353420302030203530302032353020312928333535203020302035303020323530203129283335362030203020353030203235302031292833353720302030203530302032353020312928333538203020302035303020323530203129283335392030203020353030203235302031292833363020302030203530302032353020312928333631203020302035303020323530203129283336322030203020353030203235302031292833363320302030203530302032353020312928333634203020302035303020323530203129283336352030203020353030203235302031292833363620302030203530302032353020312928333637203020302035303020323530203129283336382030203020353030203235302031292833363920302030203530302032353020312928333730203020302035303020323530203129283337312030203020353030203235302031292833373220302030203530302032353020312928333733203020302035303020323530203129283337342030203020353030203235302031292833373520302030203530302032353020312928333736203020302035303020323530203129283337372030203020353030203235302031292833373820302030203530302032353020312928333739203020302035303020323530203129283338302030203020353030203235302031292833383120302030203530302032353020312928333832203020302035303020323530203129283338332030203020353030203235302031290a7e736e734368616e4d61703d283338342c3338342c3129284150303b303a3029284150313b313a3129284150323b323a3229284150333b333a3329284150343b343a3429284150353b353a3529284150363b363a3629284150373b373a3729284150383b383a3829284150393b393a392928415031303b31303a31302928415031313b31313a31312928415031323b31323a31322928415031333b31333a31332928415031343b31343a31342928415031353b31353a31352928415031363b31363a31362928415031373b31373a31372928415031383b31383a31382928415031393b31393a31392928415032303b32303a32302928415032313b32313a32312928415032323b32323a32322928415032333b32333a32332928415032343b32343a32342928415032353b32353a32352928415032363b32363a32362928415032373b32373a32372928415032383b32383a32382928415032393b32393a32392928415033303b33303a33302928415033313b33313a33312928415033323b33323a33322928415033333b33333a33332928415033343b33343a33342928415033353b33353a33352928415033363b33363a33362928415033373b33373a33372928415033383b33383a33382928415033393b33393a33392928415034303b34303a34302928415034313b34313a34312928415034323b34323a34322928415034333b34333a34332928415034343b34343a34342928415034353b34353a34352928415034363b34363a34362928415034373b34373a34372928415034383b34383a34382928415034393b34393a34392928415035303b35303a35302928415035313b35313a35312928415035323b35323a35322928415035333b35333a35332928415035343b35343a35342928415035353b35353a35352928415035363b35363a35362928415035373b35373a35372928415035383b35383a35382928415035393b35393a35392928415036303b36303a36302928415036313b36313a36312928415036323b36323a36322928415036333b36333a36332928415036343b36343a36342928415036353b36353a36352928415036363b36363a36362928415036373b36373a36372928415036383b36383a36382928415036393b36393a36392928415037303b37303a37302928415037313b37313a37312928415037323b37323a37322928415037333b37333a37332928415037343b37343a37342928415037353b37353a37352928415037363b37363a37362928415037373b37373a37372928415037383b37383a37382928415037393b37393a37392928415038303b38303a38302928415038313b38313a38312928415038323b38323a38322928415038333b38333a38332928415038343b38343a38342928415038353b38353a38352928415038363b38363a38362928415038373b38373a38372928415038383b38383a38382928415038393b38393a38392928415039303b39303a39302928415039313b39313a39312928415039323b39323a39322928415039333b39333a39332928415039343b39343a39342928415039353b39353a39352928415039363b39363a39362928415039373b39373a39372928415039383b39383a39382928415039393b39393a3939292841503130303b3130303a313030292841503130313b3130313a313031292841503130323b3130323a313032292841503130333b3130333a313033292841503130343b3130343a313034292841503130353b3130353a313035292841503130363b3130363a313036292841503130373b3130373a313037292841503130383b3130383a313038292841503130393b3130393a313039292841503131303b3131303a313130292841503131313b3131313a313131292841503131323b3131323a313132292841503131333b3131333a313133292841503131343b3131343a313134292841503131353b3131353a313135292841503131363b3131363a313136292841503131373b3131373a313137292841503131383b3131383a313138292841503131393b3131393a313139292841503132303b3132303a313230292841503132313b3132313a313231292841503132323b3132323a313232292841503132333b3132333a313233292841503132343b3132343a313234292841503132353b3132353a313235292841503132363b3132363a313236292841503132373b3132373a313237292841503132383b3132383a313238292841503132393b3132393a313239292841503133303b3133303a313330292841503133313b3133313a313331292841503133323b3133323a313332292841503133333b3133333a313333292841503133343b3133343a313334292841503133353b3133353a313335292841503133363b3133363a313336292841503133373b3133373a313337292841503133383b3133383a313338292841503133393b3133393a313339292841503134303b3134303a313430292841503134313b3134313a313431292841503134323b3134323a313432292841503134333b3134333a313433292841503134343b3134343a313434292841503134353b3134353a313435292841503134363b3134363a313436292841503134373b3134373a313437292841503134383b3134383a313438292841503134393b3134393a313439292841503135303b3135303a313530292841503135313b3135313a313531292841503135323b3135323a313532292841503135333b3135333a313533292841503135343b3135343a313534292841503135353b3135353a313535292841503135363b3135363a313536292841503135373b3135373a313537292841503135383b3135383a313538292841503135393b3135393a313539292841503136303b3136303a313630292841503136313b3136313a313631292841503136323b3136323a313632292841503136333b3136333a313633292841503136343b3136343a313634292841503136353b3136353a313635292841503136363b3136363a313636292841503136373b3136373a313637292841503136383b3136383a313638292841503136393b3136393a313639292841503137303b3137303a313730292841503137313b3137313a313731292841503137323b3137323a313732292841503137333b3137333a313733292841503137343b3137343a313734292841503137353b3137353a313735292841503137363b3137363a313736292841503137373b3137373a313737292841503137383b3137383a313738292841503137393b3137393a313739292841503138303b3138303a313830292841503138313b3138313a313831292841503138323b3138323a313832292841503138333b3138333a313833292841503138343b3138343a313834292841503138353b3138353a313835292841503138363b3138363a313836292841503138373b3138373a313837292841503138383b3138383a313838292841503138393b3138393a313839292841503139303b3139303a313930292841503139313b3139313a313931292841503139323b3139323a313932292841503139333b3139333a313933292841503139343b3139343a313934292841503139353b3139353a313935292841503139363b3139363a313936292841503139373b3139373a313937292841503139383b3139383a313938292841503139393b3139393a313939292841503230303b3230303a323030292841503230313b3230313a323031292841503230323b3230323a323032292841503230333b3230333a323033292841503230343b3230343a323034292841503230353b3230353a323035292841503230363b3230363a323036292841503230373b3230373a323037292841503230383b3230383a323038292841503230393b3230393a323039292841503231303b3231303a323130292841503231313b3231313a323131292841503231323b3231323a323132292841503231333b3231333a323133292841503231343b3231343a323134292841503231353b3231353a323135292841503231363b3231363a323136292841503231373b3231373a323137292841503231383b3231383a323138292841503231393b3231393a323139292841503232303b3232303a323230292841503232313b3232313a323231292841503232323b3232323a323232292841503232333b3232333a323233292841503232343b3232343a323234292841503232353b3232353a323235292841503232363b3232363a323236292841503232373b3232373a323237292841503232383b3232383a323238292841503232393b3232393a323239292841503233303b3233303a323330292841503233313b3233313a323331292841503233323b3233323a323332292841503233333b3233333a323333292841503233343b3233343a323334292841503233353b3233353a323335292841503233363b3233363a323336292841503233373b3233373a323337292841503233383b3233383a323338292841503233393b3233393a323339292841503234303b3234303a323430292841503234313b3234313a323431292841503234323b3234323a323432292841503234333b3234333a323433292841503234343b3234343a323434292841503234353b3234353a323435292841503234363b3234363a323436292841503234373b3234373a323437292841503234383b3234383a323438292841503234393b3234393a323439292841503235303b3235303a323530292841503235313b3235313a323531292841503235323b3235323a323532292841503235333b3235333a323533292841503235343b3235343a323534292841503235353b3235353a323535292841503235363b3235363a323536292841503235373b3235373a323537292841503235383b3235383a323538292841503235393b3235393a323539292841503236303b3236303a323630292841503236313b3236313a323631292841503236323b3236323a323632292841503236333b3236333a323633292841503236343b3236343a323634292841503236353b3236353a323635292841503236363b3236363a323636292841503236373b3236373a323637292841503236383b3236383a323638292841503236393b3236393a323639292841503237303b3237303a323730292841503237313b3237313a323731292841503237323b3237323a323732292841503237333b3237333a323733292841503237343b3237343a323734292841503237353b3237353a323735292841503237363b3237363a323736292841503237373b3237373a323737292841503237383b3237383a323738292841503237393b3237393a323739292841503238303b3238303a323830292841503238313b3238313a323831292841503238323b3238323a323832292841503238333b3238333a323833292841503238343b3238343a323834292841503238353b3238353a323835292841503238363b3238363a323836292841503238373b3238373a323837292841503238383b3238383a323838292841503238393b3238393a323839292841503239303b3239303a323930292841503239313b3239313a323931292841503239323b3239323a323932292841503239333b3239333a323933292841503239343b3239343a323934292841503239353b3239353a323935292841503239363b3239363a323936292841503239373b3239373a323937292841503239383b3239383a323938292841503239393b3239393a323939292841503330303b3330303a33303029285359303b3736383a373638290a7e736e735368616e6b4d61703d28312c322c3438302928303a303a303a312928303a313a303a312928303a303a313a312928303a313a313a312928303a303a323a312928303a313a323a312928303a303a333a312928303a313a333a312928303a303a343a312928303a313a343a312928303a303a353a312928303a313a353a312928303a303a363a312928303a313a363a312928303a303a373a312928303a313a373a312928303a303a383a312928303a313a383a312928303a303a393a312928303a313a393a312928303a303a31303a312928303a313a31303a312928303a303a31313a312928303a313a31313a312928303a303a31323a312928303a313a31323a312928303a303a31333a312928303a313a31333a312928303a303a31343a312928303a313a31343a312928303a303a31353a312928303a313a31353a312928303a303a31363a312928303a313a31363a312928303a303a31373a312928303a313a31373a312928303a303a31383a312928303a313a31383a312928303a303a31393a312928303a313a31393a312928303a303a32303a312928303a313a32303a312928303a303a32313a312928303a313a32313a312928303a303a32323a312928303a313a32323a312928303a303a32333a312928303a313a32333a312928303a303a32343a312928303a313a32343a312928303a303a32353a312928303a313a32353a312928303a303a32363a312928303a313a32363a312928303a303a32373a312928303a313a32373a312928303a303a32383a312928303a313a32383a312928303a303a32393a312928303a313a32393a312928303a303a33303a312928303a313a33303a312928303a303a33313a312928303a313a33313a312928303a303a33323a312928303a313a33323a312928303a303a33333a312928303a313a33333a312928303a303a33343a312928303a313a33343a312928303a303a33353a312928303a313a33353a312928303a303a33363a312928303a313a33363a312928303a303a33373a312928303a313a33373a312928303a303a33383a312928303a313a33383a312928303a303a33393a312928303a313a33393a312928303a303a34303a312928303a313a34303a312928303a303a34313a312928303a313a34313a312928303a303a34323a312928303a313a34323a312928303a303a34333a312928303a313a34333a312928303a303a34343a312928303a313a34343a312928303a303a34353a312928303a313a34353a312928303a303a34363a312928303a313a34363a312928303a303a34373a312928303a313a34373a312928303a303a34383a312928303a313a34383a312928303a303a34393a312928303a313a34393a312928303a303a35303a312928303a313a35303a312928303a303a35313a312928303a313a35313a312928303a303a35323a312928303a313a35323a312928303a303a35333a312928303a313a35333a312928303a303a35343a312928303a313a35343a312928303a303a35353a312928303a313a35353a312928303a303a35363a312928303a313a35363a312928303a303a35373a312928303a313a35373a312928303a303a35383a312928303a313a35383a312928303a303a35393a312928303a313a35393a312928303a303a36303a312928303a313a36303a312928303a303a36313a312928303a313a36313a312928303a303a36323a312928303a313a36323a312928303a303a36333a312928303a313a36333a312928303a303a36343a312928303a313a36343a312928303a303a36353a312928303a313a36353a312928303a303a36363a312928303a313a36363a312928303a303a36373a312928303a313a36373a312928303a303a36383a312928303a313a36383a312928303a303a36393a312928303a313a36393a312928303a303a37303a312928303a313a37303a312928303a303a37313a312928303a313a37313a312928303a303a37323a312928303a313a37323a312928303a303a37333a312928303a313a37333a312928303a303a37343a312928303a313a37343a312928303a303a37353a312928303a313a37353a312928303a303a37363a312928303a313a37363a312928303a303a37373a312928303a313a37373a312928303a303a37383a312928303a313a37383a312928303a303a37393a312928303a313a37393a312928303a303a38303a312928303a313a38303a312928303a303a38313a312928303a313a38313a312928303a303a38323a312928303a313a38323a312928303a303a38333a312928303a313a38333a312928303a303a38343a312928303a313a38343a312928303a303a38353a312928303a313a38353a312928303a303a38363a312928303a313a38363a312928303a303a38373a312928303a313a38373a312928303a303a38383a312928303a313a38383a312928303a303a38393a312928303a313a38393a312928303a303a39303a312928303a313a39303a312928303a303a39313a312928303a313a39313a312928303a303a39323a312928303a313a39323a312928303a303a39333a312928303a313a39333a312928303a303a39343a312928303a313a39343a312928303a303a39353a312928303a313a39353a302928303a303a39363a312928303a313a39363a312928303a303a39373a312928303a313a39373a312928303a303a39383a312928303a313a39383a312928303a303a39393a312928303a313a39393a312928303a303a3130303a312928303a313a3130303a312928303a303a3130313a312928303a313a3130313a312928303a303a3130323a312928303a313a3130323a312928303a303a3130333a312928303a313a3130333a312928303a303a3130343a312928303a313a3130343a312928303a303a3130353a312928303a313a3130353a312928303a303a3130363a312928303a313a3130363a312928303a303a3130373a312928303a313a3130373a312928303a303a3130383a312928303a313a3130383a312928303a303a3130393a312928303a313a3130393a312928303a303a3131303a312928303a313a3131303a312928303a303a3131313a312928303a313a3131313a312928303a303a3131323a312928303a313a3131323a312928303a303a3131333a312928303a313a3131333a312928303a303a3131343a312928303a313a3131343a312928303a303a3131353a312928303a313a3131353a312928303a303a3131363a312928303a313a3131363a312928303a303a3131373a312928303a313a3131373a312928303a303a3131383a312928303a313a3131383a312928303a303a3131393a312928303a313a3131393a312928303a303a3132303a312928303a313a3132303a312928303a303a3132313a312928303a313a3132313a312928303a303a3132323a312928303a313a3132323a312928303a303a3132333a312928303a313a3132333a312928303a303a3132343a312928303a313a3132343a312928303a303a3132353a312928303a313a3132353a312928303a303a3132363a312928303a313a3132363a312928303a303a3132373a312928303a313a3132373a312928303a303a3132383a312928303a313a3132383a312928303a303a3132393a312928303a313a3132393a312928303a303a3133303a312928303a313a3133303a312928303a303a3133313a312928303a313a3133313a312928303a303a3133323a312928303a313a3133323a312928303a303a3133333a312928303a313a3133333a312928303a303a3133343a312928303a313a3133343a312928303a303a3133353a312928303a313a3133353a312928303a303a3133363a312928303a313a3133363a312928303a303a3133373a312928303a313a3133373a312928303a303a3133383a312928303a313a3133383a312928303a303a3133393a312928303a313a3133393a312928303a303a3134303a312928303a313a3134303a312928303a303a3134313a312928303a313a3134313a312928303a303a3134323a312928303a313a3134323a312928303a303a3134333a312928303a313a3134333a312928303a303a3134343a312928303a313a3134343a312928303a303a3134353a312928303a313a3134353a312928303a303a3134363a312928303a313a3134363a312928303a303a3134373a312928303a313a3134373a312928303a303a3134383a312928303a313a3134383a312928303a303a3134393a312928303a313a3134393a312928303a303a3135303a31290a", + "expected": { + "format": "spikeglx", + "summary": "SpikeGLX imec.ap, 302 channels, 29999.8 Hz, 100 s, Neuropixels 1.0", + "fields": { + "streamType": "imec", + "appVersion": "20190724", + "originalFileName": "H:/catgt_SC023_053119_g0/SC023_053119_g0_imec0/SC023_053119_g0_tcat.exported.imec0.ap.bin", + "fileCreateTime": "2020-02-24T07:36:27", + "gateMode": "Immediate", + "trigMode": "TTL", + "probePartNumber": "PRB_1_2_0480_2", + "probeSerial": "17216703352", + "imecApiVersion": "1.15", + "basestationPartNumber": "NP2_QBSC_00", + "headstagePartNumber": "NP2_HS_30", + "savedChannelSubset": "0:300,768", + "calibrated": "true", + "channelCount": 302, + "fileSizeBytes": 1811989732, + "firstSample": 198239280, + "probeType": 0, + "probeSlot": 2, + "probePort": 1, + "durationSeconds": 99.99997916655295, + "analogRangeMaxVolts": 0.6, + "analogRangeMinVolts": -0.6, + "samplingRateHz": 29999.83625, + "apChannels": 301, + "lfChannels": 0, + "syncChannels": 1, + "acquiredApChannels": 384, + "acquiredLfChannels": 384, + "acquiredSyncChannels": 1, + "sampleCount": 2999983, + "probeModel": "Neuropixels 1.0", + "imroTblEntries": 384, + "snsChanMapEntries": 302, + "snsShankMapEntries": 301, + "apGain": 500, + "lfGain": 250, + "microvoltsPerBit": 2.34375, + "stream": "ap", + "device": "imec0", + "runName": "SC023_053119", + "gateIndex": 0, + "concatenated": true, + "keyCount": 62 + } + } + }, + { + "name": "ironclust sample3.meta (2016 Phase 3A, no typeThis)", + "key": "sample3.meta", + "hex": "61637141704c6653793d3338342c3338342c310d0a61707056657273696f6e3d32303136303330310d0a66696c6543726561746554696d653d323031362d30332d32365431333a30333a30300d0a66696c654e616d653d433a2f55736572732f6c616261646d696e2f4465736b746f702f414e4d3334303136382f32303136303332362d313330335f326d696e5f4578745265665f67305f74302e696d65632e62696e0d0a66696c65534841313d333145374134463644313444303544353845313046443643414533433130314643324145393841420d0a66696c6553697a6542797465733d353533363830303030300d0a66696c6554696d65536563733d3132300d0a676174654d6f64653d496d6d6564696174650d0a696d416952616e67654d61783d302e360d0a696d416952616e67654d696e3d2d302e360d0a696d50726f62654f70743d320d0a696d50726f6265534e3d3530333937303834340d0a696d526f46696c653d433a2f55736572732f6c616261646d696e2f4465736b746f702f5370696b65474c5835335f4f666c6f4b696c6c2f4150323530305f4c4650323530305f4578745265662e696d726f0d0a696d53616d70526174653d33303030300d0a696d536f667453746172743d747275650d0a696d566572734150493d332e300d0a696d5665727342733d302e300d0a696d566572734877723d332e310d0a696d6870466c743d3330300d0a6e53617665644368616e733d3736390d0a736e7341704c6653793d3338342c3338342c310d0a736e73536176654368616e5375627365743d616c6c0d0a747269674d6f64653d496d6d6564696174650d0a74797065456e61626c65643d696d65630d0a74797065546869733d696d65630d0a7e696d726f54626c3d28302c322c33383429283020302030203235303020323530302928312030203020323530302032353030292832203020302032353030203235303029283320302030203235303020323530302928342030203020323530302032353030292835203020302032353030203235303029283620302030203235303020323530302928372030203020323530302032353030292838203020302032353030203235303029283920302030203235303020323530302928313020302030203235303020323530302928313120302030203235303020323530302928313220302030203235303020323530302928313320302030203235303020323530302928313420302030203235303020323530302928313520302030203235303020323530302928313620302030203235303020323530302928313720302030203235303020323530302928313820302030203235303020323530302928313920302030203235303020323530302928323020302030203235303020323530302928323120302030203235303020323530302928323220302030203235303020323530302928323320302030203235303020323530302928323420302030203235303020323530302928323520302030203235303020323530302928323620302030203235303020323530302928323720302030203235303020323530302928323820302030203235303020323530302928323920302030203235303020323530302928333020302030203235303020323530302928333120302030203235303020323530302928333220302030203235303020323530302928333320302030203235303020323530302928333420302030203235303020323530302928333520302030203235303020323530302928333620302030203235303020323530302928333720302030203235303020323530302928333820302030203235303020323530302928333920302030203235303020323530302928343020302030203235303020323530302928343120302030203235303020323530302928343220302030203235303020323530302928343320302030203235303020323530302928343420302030203235303020323530302928343520302030203235303020323530302928343620302030203235303020323530302928343720302030203235303020323530302928343820302030203235303020323530302928343920302030203235303020323530302928353020302030203235303020323530302928353120302030203235303020323530302928353220302030203235303020323530302928353320302030203235303020323530302928353420302030203235303020323530302928353520302030203235303020323530302928353620302030203235303020323530302928353720302030203235303020323530302928353820302030203235303020323530302928353920302030203235303020323530302928363020302030203235303020323530302928363120302030203235303020323530302928363220302030203235303020323530302928363320302030203235303020323530302928363420302030203235303020323530302928363520302030203235303020323530302928363620302030203235303020323530302928363720302030203235303020323530302928363820302030203235303020323530302928363920302030203235303020323530302928373020302030203235303020323530302928373120302030203235303020323530302928373220302030203235303020323530302928373320302030203235303020323530302928373420302030203235303020323530302928373520302030203235303020323530302928373620302030203235303020323530302928373720302030203235303020323530302928373820302030203235303020323530302928373920302030203235303020323530302928383020302030203235303020323530302928383120302030203235303020323530302928383220302030203235303020323530302928383320302030203235303020323530302928383420302030203235303020323530302928383520302030203235303020323530302928383620302030203235303020323530302928383720302030203235303020323530302928383820302030203235303020323530302928383920302030203235303020323530302928393020302030203235303020323530302928393120302030203235303020323530302928393220302030203235303020323530302928393320302030203235303020323530302928393420302030203235303020323530302928393520302030203235303020323530302928393620302030203235303020323530302928393720302030203235303020323530302928393820302030203235303020323530302928393920302030203235303020323530302928313030203020302032353030203235303029283130312030203020323530302032353030292831303220302030203235303020323530302928313033203020302032353030203235303029283130342030203020323530302032353030292831303520302030203235303020323530302928313036203020302032353030203235303029283130372030203020323530302032353030292831303820302030203235303020323530302928313039203020302032353030203235303029283131302030203020323530302032353030292831313120302030203235303020323530302928313132203020302032353030203235303029283131332030203020323530302032353030292831313420302030203235303020323530302928313135203020302032353030203235303029283131362030203020323530302032353030292831313720302030203235303020323530302928313138203020302032353030203235303029283131392030203020323530302032353030292831323020302030203235303020323530302928313231203020302032353030203235303029283132322030203020323530302032353030292831323320302030203235303020323530302928313234203020302032353030203235303029283132352030203020323530302032353030292831323620302030203235303020323530302928313237203020302032353030203235303029283132382030203020323530302032353030292831323920302030203235303020323530302928313330203020302032353030203235303029283133312030203020323530302032353030292831333220302030203235303020323530302928313333203020302032353030203235303029283133342030203020323530302032353030292831333520302030203235303020323530302928313336203020302032353030203235303029283133372030203020323530302032353030292831333820302030203235303020323530302928313339203020302032353030203235303029283134302030203020323530302032353030292831343120302030203235303020323530302928313432203020302032353030203235303029283134332030203020323530302032353030292831343420302030203235303020323530302928313435203020302032353030203235303029283134362030203020323530302032353030292831343720302030203235303020323530302928313438203020302032353030203235303029283134392030203020323530302032353030292831353020302030203235303020323530302928313531203020302032353030203235303029283135322030203020323530302032353030292831353320302030203235303020323530302928313534203020302032353030203235303029283135352030203020323530302032353030292831353620302030203235303020323530302928313537203020302032353030203235303029283135382030203020323530302032353030292831353920302030203235303020323530302928313630203020302032353030203235303029283136312030203020323530302032353030292831363220302030203235303020323530302928313633203020302032353030203235303029283136342030203020323530302032353030292831363520302030203235303020323530302928313636203020302032353030203235303029283136372030203020323530302032353030292831363820302030203235303020323530302928313639203020302032353030203235303029283137302030203020323530302032353030292831373120302030203235303020323530302928313732203020302032353030203235303029283137332030203020323530302032353030292831373420302030203235303020323530302928313735203020302032353030203235303029283137362030203020323530302032353030292831373720302030203235303020323530302928313738203020302032353030203235303029283137392030203020323530302032353030292831383020302030203235303020323530302928313831203020302032353030203235303029283138322030203020323530302032353030292831383320302030203235303020323530302928313834203020302032353030203235303029283138352030203020323530302032353030292831383620302030203235303020323530302928313837203020302032353030203235303029283138382030203020323530302032353030292831383920302030203235303020323530302928313930203020302032353030203235303029283139312030203020323530302032353030292831393220302030203235303020323530302928313933203020302032353030203235303029283139342030203020323530302032353030292831393520302030203235303020323530302928313936203020302032353030203235303029283139372030203020323530302032353030292831393820302030203235303020323530302928313939203020302032353030203235303029283230302030203020323530302032353030292832303120302030203235303020323530302928323032203020302032353030203235303029283230332030203020323530302032353030292832303420302030203235303020323530302928323035203020302032353030203235303029283230362030203020323530302032353030292832303720302030203235303020323530302928323038203020302032353030203235303029283230392030203020323530302032353030292832313020302030203235303020323530302928323131203020302032353030203235303029283231322030203020323530302032353030292832313320302030203235303020323530302928323134203020302032353030203235303029283231352030203020323530302032353030292832313620302030203235303020323530302928323137203020302032353030203235303029283231382030203020323530302032353030292832313920302030203235303020323530302928323230203020302032353030203235303029283232312030203020323530302032353030292832323220302030203235303020323530302928323233203020302032353030203235303029283232342030203020323530302032353030292832323520302030203235303020323530302928323236203020302032353030203235303029283232372030203020323530302032353030292832323820302030203235303020323530302928323239203020302032353030203235303029283233302030203020323530302032353030292832333120302030203235303020323530302928323332203020302032353030203235303029283233332030203020323530302032353030292832333420302030203235303020323530302928323335203020302032353030203235303029283233362030203020323530302032353030292832333720302030203235303020323530302928323338203020302032353030203235303029283233392030203020323530302032353030292832343020302030203235303020323530302928323431203020302032353030203235303029283234322030203020323530302032353030292832343320302030203235303020323530302928323434203020302032353030203235303029283234352030203020323530302032353030292832343620302030203235303020323530302928323437203020302032353030203235303029283234382030203020323530302032353030292832343920302030203235303020323530302928323530203020302032353030203235303029283235312030203020323530302032353030292832353220302030203235303020323530302928323533203020302032353030203235303029283235342030203020323530302032353030292832353520302030203235303020323530302928323536203020302032353030203235303029283235372030203020323530302032353030292832353820302030203235303020323530302928323539203020302032353030203235303029283236302030203020323530302032353030292832363120302030203235303020323530302928323632203020302032353030203235303029283236332030203020323530302032353030292832363420302030203235303020323530302928323635203020302032353030203235303029283236362030203020323530302032353030292832363720302030203235303020323530302928323638203020302032353030203235303029283236392030203020323530302032353030292832373020302030203235303020323530302928323731203020302032353030203235303029283237322030203020323530302032353030292832373320302030203235303020323530302928323734203020302032353030203235303029283237352030203020323530302032353030292832373620302030203235303020323530302928323737203020302032353030203235303029283237382030203020323530302032353030292832373920302030203235303020323530302928323830203020302032353030203235303029283238312030203020323530302032353030292832383220302030203235303020323530302928323833203020302032353030203235303029283238342030203020323530302032353030292832383520302030203235303020323530302928323836203020302032353030203235303029283238372030203020323530302032353030292832383820302030203235303020323530302928323839203020302032353030203235303029283239302030203020323530302032353030292832393120302030203235303020323530302928323932203020302032353030203235303029283239332030203020323530302032353030292832393420302030203235303020323530302928323935203020302032353030203235303029283239362030203020323530302032353030292832393720302030203235303020323530302928323938203020302032353030203235303029283239392030203020323530302032353030292833303020302030203235303020323530302928333031203020302032353030203235303029283330322030203020323530302032353030292833303320302030203235303020323530302928333034203020302032353030203235303029283330352030203020323530302032353030292833303620302030203235303020323530302928333037203020302032353030203235303029283330382030203020323530302032353030292833303920302030203235303020323530302928333130203020302032353030203235303029283331312030203020323530302032353030292833313220302030203235303020323530302928333133203020302032353030203235303029283331342030203020323530302032353030292833313520302030203235303020323530302928333136203020302032353030203235303029283331372030203020323530302032353030292833313820302030203235303020323530302928333139203020302032353030203235303029283332302030203020323530302032353030292833323120302030203235303020323530302928333232203020302032353030203235303029283332332030203020323530302032353030292833323420302030203235303020323530302928333235203020302032353030203235303029283332362030203020323530302032353030292833323720302030203235303020323530302928333238203020302032353030203235303029283332392030203020323530302032353030292833333020302030203235303020323530302928333331203020302032353030203235303029283333322030203020323530302032353030292833333320302030203235303020323530302928333334203020302032353030203235303029283333352030203020323530302032353030292833333620302030203235303020323530302928333337203020302032353030203235303029283333382030203020323530302032353030292833333920302030203235303020323530302928333430203020302032353030203235303029283334312030203020323530302032353030292833343220302030203235303020323530302928333433203020302032353030203235303029283334342030203020323530302032353030292833343520302030203235303020323530302928333436203020302032353030203235303029283334372030203020323530302032353030292833343820302030203235303020323530302928333439203020302032353030203235303029283335302030203020323530302032353030292833353120302030203235303020323530302928333532203020302032353030203235303029283335332030203020323530302032353030292833353420302030203235303020323530302928333535203020302032353030203235303029283335362030203020323530302032353030292833353720302030203235303020323530302928333538203020302032353030203235303029283335392030203020323530302032353030292833363020302030203235303020323530302928333631203020302032353030203235303029283336322030203020323530302032353030292833363320302030203235303020323530302928333634203020302032353030203235303029283336352030203020323530302032353030292833363620302030203235303020323530302928333637203020302032353030203235303029283336382030203020323530302032353030292833363920302030203235303020323530302928333730203020302032353030203235303029283337312030203020323530302032353030292833373220302030203235303020323530302928333733203020302032353030203235303029283337342030203020323530302032353030292833373520302030203235303020323530302928333736203020302032353030203235303029283337372030203020323530302032353030292833373820302030203235303020323530302928333739203020302032353030203235303029283338302030203020323530302032353030292833383120302030203235303020323530302928333832203020302032353030203235303029283338332030203020323530302032353030290d0a7e736e734368616e4d61703d283338342c3338342c3129284150303b303a3029284150313b313a3129284150323b323a3229284150333b333a3329284150343b343a3429284150353b353a3529284150363b363a3629284150373b373a3729284150383b383a3829284150393b393a392928415031303b31303a31302928415031313b31313a31312928415031323b31323a31322928415031333b31333a31332928415031343b31343a31342928415031353b31353a31352928415031363b31363a31362928415031373b31373a31372928415031383b31383a31382928415031393b31393a31392928415032303b32303a32302928415032313b32313a32312928415032323b32323a32322928415032333b32333a32332928415032343b32343a32342928415032353b32353a32352928415032363b32363a32362928415032373b32373a32372928415032383b32383a32382928415032393b32393a32392928415033303b33303a33302928415033313b33313a33312928415033323b33323a33322928415033333b33333a33332928415033343b33343a33342928415033353b33353a33352928415033363b33363a33362928415033373b33373a33372928415033383b33383a33382928415033393b33393a33392928415034303b34303a34302928415034313b34313a34312928415034323b34323a34322928415034333b34333a34332928415034343b34343a34342928415034353b34353a34352928415034363b34363a34362928415034373b34373a34372928415034383b34383a34382928415034393b34393a34392928415035303b35303a35302928415035313b35313a35312928415035323b35323a35322928415035333b35333a35332928415035343b35343a35342928415035353b35353a35352928415035363b35363a35362928415035373b35373a35372928415035383b35383a35382928415035393b35393a35392928415036303b36303a36302928415036313b36313a36312928415036323b36323a36322928415036333b36333a36332928415036343b36343a36342928415036353b36353a36352928415036363b36363a36362928415036373b36373a36372928415036383b36383a36382928415036393b36393a36392928415037303b37303a37302928415037313b37313a37312928415037323b37323a37322928415037333b37333a37332928415037343b37343a37342928415037353b37353a37352928415037363b37363a37362928415037373b37373a37372928415037383b37383a37382928415037393b37393a37392928415038303b38303a38302928415038313b38313a38312928415038323b38323a38322928415038333b38333a38332928415038343b38343a38342928415038353b38353a38352928415038363b38363a38362928415038373b38373a38372928415038383b38383a38382928415038393b38393a38392928415039303b39303a39302928415039313b39313a39312928415039323b39323a39322928415039333b39333a39332928415039343b39343a39342928415039353b39353a39352928415039363b39363a39362928415039373b39373a39372928415039383b39383a39382928415039393b39393a3939292841503130303b3130303a313030292841503130313b3130313a313031292841503130323b3130323a313032292841503130333b3130333a313033292841503130343b3130343a313034292841503130353b3130353a313035292841503130363b3130363a313036292841503130373b3130373a313037292841503130383b3130383a313038292841503130393b3130393a313039292841503131303b3131303a313130292841503131313b3131313a313131292841503131323b3131323a313132292841503131333b3131333a313133292841503131343b3131343a313134292841503131353b3131353a313135292841503131363b3131363a313136292841503131373b3131373a313137292841503131383b3131383a313138292841503131393b3131393a313139292841503132303b3132303a313230292841503132313b3132313a313231292841503132323b3132323a313232292841503132333b3132333a313233292841503132343b3132343a313234292841503132353b3132353a313235292841503132363b3132363a313236292841503132373b3132373a313237292841503132383b3132383a313238292841503132393b3132393a313239292841503133303b3133303a313330292841503133313b3133313a313331292841503133323b3133323a313332292841503133333b3133333a313333292841503133343b3133343a313334292841503133353b3133353a313335292841503133363b3133363a313336292841503133373b3133373a313337292841503133383b3133383a313338292841503133393b3133393a313339292841503134303b3134303a313430292841503134313b3134313a313431292841503134323b3134323a313432292841503134333b3134333a313433292841503134343b3134343a313434292841503134353b3134353a313435292841503134363b3134363a313436292841503134373b3134373a313437292841503134383b3134383a313438292841503134393b3134393a313439292841503135303b3135303a313530292841503135313b3135313a313531292841503135323b3135323a313532292841503135333b3135333a313533292841503135343b3135343a313534292841503135353b3135353a313535292841503135363b3135363a313536292841503135373b3135373a313537292841503135383b3135383a313538292841503135393b3135393a313539292841503136303b3136303a313630292841503136313b3136313a313631292841503136323b3136323a313632292841503136333b3136333a313633292841503136343b3136343a313634292841503136353b3136353a313635292841503136363b3136363a313636292841503136373b3136373a313637292841503136383b3136383a313638292841503136393b3136393a313639292841503137303b3137303a313730292841503137313b3137313a313731292841503137323b3137323a313732292841503137333b3137333a313733292841503137343b3137343a313734292841503137353b3137353a313735292841503137363b3137363a313736292841503137373b3137373a313737292841503137383b3137383a313738292841503137393b3137393a313739292841503138303b3138303a313830292841503138313b3138313a313831292841503138323b3138323a313832292841503138333b3138333a313833292841503138343b3138343a313834292841503138353b3138353a313835292841503138363b3138363a313836292841503138373b3138373a313837292841503138383b3138383a313838292841503138393b3138393a313839292841503139303b3139303a313930292841503139313b3139313a313931292841503139323b3139323a313932292841503139333b3139333a313933292841503139343b3139343a313934292841503139353b3139353a313935292841503139363b3139363a313936292841503139373b3139373a313937292841503139383b3139383a313938292841503139393b3139393a313939292841503230303b3230303a323030292841503230313b3230313a323031292841503230323b3230323a323032292841503230333b3230333a323033292841503230343b3230343a323034292841503230353b3230353a323035292841503230363b3230363a323036292841503230373b3230373a323037292841503230383b3230383a323038292841503230393b3230393a323039292841503231303b3231303a323130292841503231313b3231313a323131292841503231323b3231323a323132292841503231333b3231333a323133292841503231343b3231343a323134292841503231353b3231353a323135292841503231363b3231363a323136292841503231373b3231373a323137292841503231383b3231383a323138292841503231393b3231393a323139292841503232303b3232303a323230292841503232313b3232313a323231292841503232323b3232323a323232292841503232333b3232333a323233292841503232343b3232343a323234292841503232353b3232353a323235292841503232363b3232363a323236292841503232373b3232373a323237292841503232383b3232383a323238292841503232393b3232393a323239292841503233303b3233303a323330292841503233313b3233313a323331292841503233323b3233323a323332292841503233333b3233333a323333292841503233343b3233343a323334292841503233353b3233353a323335292841503233363b3233363a323336292841503233373b3233373a323337292841503233383b3233383a323338292841503233393b3233393a323339292841503234303b3234303a323430292841503234313b3234313a323431292841503234323b3234323a323432292841503234333b3234333a323433292841503234343b3234343a323434292841503234353b3234353a323435292841503234363b3234363a323436292841503234373b3234373a323437292841503234383b3234383a323438292841503234393b3234393a323439292841503235303b3235303a323530292841503235313b3235313a323531292841503235323b3235323a323532292841503235333b3235333a323533292841503235343b3235343a323534292841503235353b3235353a323535292841503235363b3235363a323536292841503235373b3235373a323537292841503235383b3235383a323538292841503235393b3235393a323539292841503236303b3236303a323630292841503236313b3236313a323631292841503236323b3236323a323632292841503236333b3236333a323633292841503236343b3236343a323634292841503236353b3236353a323635292841503236363b3236363a323636292841503236373b3236373a323637292841503236383b3236383a323638292841503236393b3236393a323639292841503237303b3237303a323730292841503237313b3237313a323731292841503237323b3237323a323732292841503237333b3237333a323733292841503237343b3237343a323734292841503237353b3237353a323735292841503237363b3237363a323736292841503237373b3237373a323737292841503237383b3237383a323738292841503237393b3237393a323739292841503238303b3238303a323830292841503238313b3238313a323831292841503238323b3238323a323832292841503238333b3238333a323833292841503238343b3238343a323834292841503238353b3238353a323835292841503238363b3238363a323836292841503238373b3238373a323837292841503238383b3238383a323838292841503238393b3238393a323839292841503239303b3239303a323930292841503239313b3239313a323931292841503239323b3239323a323932292841503239333b3239333a323933292841503239343b3239343a323934292841503239353b3239353a323935292841503239363b3239363a323936292841503239373b3239373a323937292841503239383b3239383a323938292841503239393b3239393a323939292841503330303b3330303a333030292841503330313b3330313a333031292841503330323b3330323a333032292841503330333b3330333a333033292841503330343b3330343a333034292841503330353b3330353a333035292841503330363b3330363a333036292841503330373b3330373a333037292841503330383b3330383a333038292841503330393b3330393a333039292841503331303b3331303a333130292841503331313b3331313a333131292841503331323b3331323a333132292841503331333b3331333a333133292841503331343b3331343a333134292841503331353b3331353a333135292841503331363b3331363a333136292841503331373b3331373a333137292841503331383b3331383a333138292841503331393b3331393a333139292841503332303b3332303a333230292841503332313b3332313a333231292841503332323b3332323a333232292841503332333b3332333a333233292841503332343b3332343a333234292841503332353b3332353a333235292841503332363b3332363a333236292841503332373b3332373a333237292841503332383b3332383a333238292841503332393b3332393a333239292841503333303b3333303a333330292841503333313b3333313a333331292841503333323b3333323a333332292841503333333b3333333a333333292841503333343b3333343a333334292841503333353b3333353a333335292841503333363b3333363a333336292841503333373b3333373a333337292841503333383b3333383a333338292841503333393b3333393a333339292841503334303b3334303a333430292841503334313b3334313a333431292841503334323b3334323a333432292841503334333b3334333a333433292841503334343b3334343a333434292841503334353b3334353a333435292841503334363b3334363a333436292841503334373b3334373a333437292841503334383b3334383a333438292841503334393b3334393a333439292841503335303b3335303a333530292841503335313b3335313a333531292841503335323b3335323a333532292841503335333b3335333a333533292841503335343b3335343a333534292841503335353b3335353a333535292841503335363b3335363a333536292841503335373b3335373a333537292841503335383b3335383a333538292841503335393b3335393a333539292841503336303b3336303a333630292841503336313b3336313a333631292841503336323b3336323a333632292841503336333b3336333a333633292841503336343b3336343a333634292841503336353b3336353a333635292841503336363b3336363a333636292841503336373b3336373a333637292841503336383b3336383a333638292841503336393b3336393a333639292841503337303b3337303a333730292841503337313b3337313a333731292841503337323b3337323a333732292841503337333b3337333a333733292841503337343b3337343a333734292841503337353b3337353a333735292841503337363b3337363a333736292841503337373b3337373a333737292841503337383b3337383a333738292841503337393b3337393a333739292841503338303b3338303a333830292841503338313b3338313a333831292841503338323b3338323a333832292841503338333b3338333a33383329284c46303b3338343a33383429284c46313b3338353a33383529284c46323b3338363a33383629284c46333b3338373a33383729284c46343b3338383a33383829284c46353b3338393a33383929284c46363b3339303a33393029284c46373b3339313a33393129284c46383b3339323a33393229284c46393b3339333a33393329284c4631303b3339343a33393429284c4631313b3339353a33393529284c4631323b3339363a33393629284c4631333b3339373a33393729284c4631343b3339383a33393829284c4631353b3339393a33393929284c4631363b3430303a34303029284c4631373b3430313a34303129284c4631383b3430323a34303229284c4631393b3430333a34303329284c4632303b3430343a34303429284c4632313b3430353a34303529284c4632323b3430363a34303629284c4632333b3430373a34303729284c4632343b3430383a34303829284c4632353b3430393a34303929284c4632363b3431303a34313029284c4632373b3431313a34313129284c4632383b3431323a34313229284c4632393b3431333a34313329284c4633303b3431343a34313429284c4633313b3431353a34313529284c4633323b3431363a34313629284c4633333b3431373a34313729284c4633343b3431383a34313829284c4633353b3431393a34313929284c4633363b3432303a34323029284c4633373b3432313a34323129284c4633383b3432323a34323229284c4633393b3432333a34323329284c4634303b3432343a34323429284c4634313b3432353a34323529284c4634323b3432363a34323629284c4634333b3432373a34323729284c4634343b3432383a34323829284c4634353b3432393a34323929284c4634363b3433303a34333029284c4634373b3433313a34333129284c4634383b3433323a34333229284c4634393b3433333a34333329284c4635303b3433343a34333429284c4635313b3433353a34333529284c4635323b3433363a34333629284c4635333b3433373a34333729284c4635343b3433383a34333829284c4635353b3433393a34333929284c4635363b3434303a34343029284c4635373b3434313a34343129284c4635383b3434323a34343229284c4635393b3434333a34343329284c4636303b3434343a34343429284c4636313b3434353a34343529284c4636323b3434363a34343629284c4636333b3434373a34343729284c4636343b3434383a34343829284c4636353b3434393a34343929284c4636363b3435303a34353029284c4636373b3435313a34353129284c4636383b3435323a34353229284c4636393b3435333a34353329284c4637303b3435343a34353429284c4637313b3435353a34353529284c4637323b3435363a34353629284c4637333b3435373a34353729284c4637343b3435383a34353829284c4637353b3435393a34353929284c4637363b3436303a34363029284c4637373b3436313a34363129284c4637383b3436323a34363229284c4637393b3436333a34363329284c4638303b3436343a34363429284c4638313b3436353a34363529284c4638323b3436363a34363629284c4638333b3436373a34363729284c4638343b3436383a34363829284c4638353b3436393a34363929284c4638363b3437303a34373029284c4638373b3437313a34373129284c4638383b3437323a34373229284c4638393b3437333a34373329284c4639303b3437343a34373429284c4639313b3437353a34373529284c4639323b3437363a34373629284c4639333b3437373a34373729284c4639343b3437383a34373829284c4639353b3437393a34373929284c4639363b3438303a34383029284c4639373b3438313a34383129284c4639383b3438323a34383229284c4639393b3438333a34383329284c463130303b3438343a34383429284c463130313b3438353a34383529284c463130323b3438363a34383629284c463130333b3438373a34383729284c463130343b3438383a34383829284c463130353b3438393a34383929284c463130363b3439303a34393029284c463130373b3439313a34393129284c463130383b3439323a34393229284c463130393b3439333a34393329284c463131303b3439343a34393429284c463131313b3439353a34393529284c463131323b3439363a34393629284c463131333b3439373a34393729284c463131343b3439383a34393829284c463131353b3439393a34393929284c463131363b3530303a35303029284c463131373b3530313a35303129284c463131383b3530323a35303229284c463131393b3530333a35303329284c463132303b3530343a35303429284c463132313b3530353a35303529284c463132323b3530363a35303629284c463132333b3530373a35303729284c463132343b3530383a35303829284c463132353b3530393a35303929284c463132363b3531303a35313029284c463132373b3531313a35313129284c463132383b3531323a35313229284c463132393b3531333a35313329284c463133303b3531343a35313429284c463133313b3531353a35313529284c463133323b3531363a35313629284c463133333b3531373a35313729284c463133343b3531383a35313829284c463133353b3531393a35313929284c463133363b3532303a35323029284c463133373b3532313a35323129284c463133383b3532323a35323229284c463133393b3532333a35323329284c463134303b3532343a35323429284c463134313b3532353a35323529284c463134323b3532363a35323629284c463134333b3532373a35323729284c463134343b3532383a35323829284c463134353b3532393a35323929284c463134363b3533303a35333029284c463134373b3533313a35333129284c463134383b3533323a35333229284c463134393b3533333a35333329284c463135303b3533343a35333429284c463135313b3533353a35333529284c463135323b3533363a35333629284c463135333b3533373a35333729284c463135343b3533383a35333829284c463135353b3533393a35333929284c463135363b3534303a35343029284c463135373b3534313a35343129284c463135383b3534323a35343229284c463135393b3534333a35343329284c463136303b3534343a35343429284c463136313b3534353a35343529284c463136323b3534363a35343629284c463136333b3534373a35343729284c463136343b3534383a35343829284c463136353b3534393a35343929284c463136363b3535303a35353029284c463136373b3535313a35353129284c463136383b3535323a35353229284c463136393b3535333a35353329284c463137303b3535343a35353429284c463137313b3535353a35353529284c463137323b3535363a35353629284c463137333b3535373a35353729284c463137343b3535383a35353829284c463137353b3535393a35353929284c463137363b3536303a35363029284c463137373b3536313a35363129284c463137383b3536323a35363229284c463137393b3536333a35363329284c463138303b3536343a35363429284c463138313b3536353a35363529284c463138323b3536363a35363629284c463138333b3536373a35363729284c463138343b3536383a35363829284c463138353b3536393a35363929284c463138363b3537303a35373029284c463138373b3537313a35373129284c463138383b3537323a35373229284c463138393b3537333a35373329284c463139303b3537343a35373429284c463139313b3537353a35373529284c463139323b3537363a35373629284c463139333b3537373a35373729284c463139343b3537383a35373829284c463139353b3537393a35373929284c463139363b3538303a35383029284c463139373b3538313a35383129284c463139383b3538323a35383229284c463139393b3538333a35383329284c463230303b3538343a35383429284c463230313b3538353a35383529284c463230323b3538363a35383629284c463230333b3538373a35383729284c463230343b3538383a35383829284c463230353b3538393a35383929284c463230363b3539303a35393029284c463230373b3539313a35393129284c463230383b3539323a35393229284c463230393b3539333a35393329284c463231303b3539343a35393429284c463231313b3539353a35393529284c463231323b3539363a35393629284c463231333b3539373a35393729284c463231343b3539383a35393829284c463231353b3539393a35393929284c463231363b3630303a36303029284c463231373b3630313a36303129284c463231383b3630323a36303229284c463231393b3630333a36303329284c463232303b3630343a36303429284c463232313b3630353a36303529284c463232323b3630363a36303629284c463232333b3630373a36303729284c463232343b3630383a36303829284c463232353b3630393a36303929284c463232363b3631303a36313029284c463232373b3631313a36313129284c463232383b3631323a36313229284c463232393b3631333a36313329284c463233303b3631343a36313429284c463233313b3631353a36313529284c463233323b3631363a36313629284c463233333b3631373a36313729284c463233343b3631383a36313829284c463233353b3631393a36313929284c463233363b3632303a36323029284c463233373b3632313a36323129284c463233383b3632323a36323229284c463233393b3632333a36323329284c463234303b3632343a36323429284c463234313b3632353a36323529284c463234323b3632363a36323629284c463234333b3632373a36323729284c463234343b3632383a36323829284c463234353b3632393a36323929284c463234363b3633303a36333029284c463234373b3633313a36333129284c463234383b3633323a36333229284c463234393b3633333a36333329284c463235303b3633343a36333429284c463235313b3633353a36333529284c463235323b3633363a36333629284c463235333b3633373a36333729284c463235343b3633383a36333829284c463235353b3633393a36333929284c463235363b3634303a36343029284c463235373b3634313a36343129284c463235383b3634323a36343229284c463235393b3634333a36343329284c463236303b3634343a36343429284c463236313b3634353a36343529284c463236323b3634363a36343629284c463236333b3634373a36343729284c463236343b3634383a36343829284c463236353b3634393a36343929284c463236363b3635303a36353029284c463236373b3635313a36353129284c463236383b3635323a36353229284c463236393b3635333a36353329284c463237303b3635343a36353429284c463237313b3635353a36353529284c463237323b3635363a36353629284c463237333b3635373a36353729284c463237343b3635383a36353829284c463237353b3635393a36353929284c463237363b3636303a36363029284c463237373b3636313a36363129284c463237383b3636323a36363229284c463237393b3636333a36363329284c463238303b3636343a36363429284c463238313b3636353a36363529284c463238323b3636363a36363629284c463238333b3636373a36363729284c463238343b3636383a36363829284c463238353b3636393a36363929284c463238363b3637303a36373029284c463238373b3637313a36373129284c463238383b3637323a36373229284c463238393b3637333a36373329284c463239303b3637343a36373429284c463239313b3637353a36373529284c463239323b3637363a36373629284c463239333b3637373a36373729284c463239343b3637383a36373829284c463239353b3637393a36373929284c463239363b3638303a36383029284c463239373b3638313a36383129284c463239383b3638323a36383229284c463239393b3638333a36383329284c463330303b3638343a36383429284c463330313b3638353a36383529284c463330323b3638363a36383629284c463330333b3638373a36383729284c463330343b3638383a36383829284c463330353b3638393a36383929284c463330363b3639303a36393029284c463330373b3639313a36393129284c463330383b3639323a36393229284c463330393b3639333a36393329284c463331303b3639343a36393429284c463331313b3639353a36393529284c463331323b3639363a36393629284c463331333b3639373a36393729284c463331343b3639383a36393829284c463331353b3639393a36393929284c463331363b3730303a37303029284c463331373b3730313a37303129284c463331383b3730323a37303229284c463331393b3730333a37303329284c463332303b3730343a37303429284c463332313b3730353a37303529284c463332323b3730363a37303629284c463332333b3730373a37303729284c463332343b3730383a37303829284c463332353b3730393a37303929284c463332363b3731303a37313029284c463332373b3731313a37313129284c463332383b3731323a37313229284c463332393b3731333a37313329284c463333303b3731343a37313429284c463333313b3731353a37313529284c463333323b3731363a37313629284c463333333b3731373a37313729284c463333343b3731383a37313829284c463333353b3731393a37313929284c463333363b3732303a37323029284c463333373b3732313a37323129284c463333383b3732323a37323229284c463333393b3732333a37323329284c463334303b3732343a37323429284c463334313b3732353a37323529284c463334323b3732363a37323629284c463334333b3732373a37323729284c463334343b3732383a37323829284c463334353b3732393a37323929284c463334363b3733303a37333029284c463334373b3733313a37333129284c463334383b3733323a37333229284c463334393b3733333a37333329284c463335303b3733343a37333429284c463335313b3733353a37333529284c463335323b3733363a37333629284c463335333b3733373a37333729284c463335343b3733383a37333829284c463335353b3733393a37333929284c463335363b3734303a37343029284c463335373b3734313a37343129284c463335383b3734323a37343229284c463335393b3734333a37343329284c463336303b3734343a37343429284c463336313b3734353a37343529284c463336323b3734363a37343629284c463336333b3734373a37343729284c463336343b3734383a37343829284c463336353b3734393a37343929284c463336363b3735303a37353029284c463336373b3735313a37353129284c463336383b3735323a37353229284c463336393b3735333a37353329284c463337303b3735343a37353429284c463337313b3735353a37353529284c463337323b3735363a37353629284c463337333b3735373a37353729284c463337343b3735383a37353829284c463337353b3735393a37353929284c463337363b3736303a37363029284c463337373b3736313a37363129284c463337383b3736323a37363229284c463337393b3736333a37363329284c463338303b3736343a37363429284c463338313b3736353a37363529284c463338323b3736363a37363629284c463338333b3736373a37363729285359303b3736383a373638290d0a", + "expected": { + "format": "spikeglx", + "summary": "SpikeGLX imec, 769 channels, 30000 Hz, 120 s", + "fields": { + "streamType": "imec", + "appVersion": "20160301", + "originalFileName": "C:/Users/labadmin/Desktop/ANM340168/20160326-1303_2min_ExtRef_g0_t0.imec.bin", + "fileCreateTime": "2016-03-26T13:03:00", + "gateMode": "Immediate", + "trigMode": "Immediate", + "savedChannelSubset": "all", + "imroFile": "C:/Users/labadmin/Desktop/SpikeGLX53_OfloKill/AP2500_LFP2500_ExtRef.imro", + "channelCount": 769, + "fileSizeBytes": 5536800000, + "durationSeconds": 120.0, + "analogRangeMaxVolts": 0.6, + "analogRangeMinVolts": -0.6, + "samplingRateHz": 30000.0, + "apChannels": 384, + "lfChannels": 384, + "syncChannels": 1, + "acquiredApChannels": 384, + "acquiredLfChannels": 384, + "acquiredSyncChannels": 1, + "sampleCount": 3600000, + "imroTblEntries": 384, + "snsChanMapEntries": 769, + "device": "imec", + "runName": "20160326-1303_2min_ExtRef", + "gateIndex": 0, + "triggerIndex": 0, + "keyCount": 27 + } + } + } + ] +} diff --git a/tests/test_bids.py b/tests/test_bids.py new file mode 100644 index 0000000..7d30dfe --- /dev/null +++ b/tests/test_bids.py @@ -0,0 +1,122 @@ +"""BIDS sidecar decoding. + +Golden: tests/fixtures/bids-cases.json, real files from the +bids-standard/bids-examples corpus. The whole corpus was swept when the +fixture was made: 5853 `.json` and `.tsv` files decoded with no exception, and +the files that declined are the headerless derivative tables (motion, +timeseries, mixing, physio) and non-core derivative JSON this decoder is not +meant to claim. +""" + +import json +import os + +from scigantic_headers import decode_bids_json, decode_bids_tsv, decode_bytes, has_decoder_for +from scigantic_headers.bids import BIDS_READ_BYTES +from scigantic_headers.decoders import read_for + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "bids-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return bytes.fromhex(next(c for c in CASES if name in c["name"])["hex"]) + + +def test_extensions_registered(): + assert has_decoder_for("sub-01/func/sub-01_bold.json") + assert has_decoder_for("participants.tsv") + assert read_for("x.json").leading == BIDS_READ_BYTES + # A name-dispatched decoder still wins over the .json extension. + assert decode_bytes("zarr.json", b'{"zarr_format": 3, "node_type": "group"}') is not None + + +def test_golden_fixture_matches(): + assert len(CASES) >= 11 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_dataset_description(): + d = decode_bids_json(_case("dataset_description")) + assert d.format == "bids-dataset" + assert d.summary == "BIDS dataset, MNE sample dataset, BIDS 1.4.0, raw" + f = d.fields + assert f["BIDSVersion"] == "1.4.0" and f["License"] == "CC0" + assert f["authorsCount"] == 2 and f["fundingCount"] == 11 + assert f["DatasetDOI"] == "10.18112/openneuro.ds000248.v1.2.4" + + +def test_mri_sidecar(): + f = decode_bids_json(_case("fMRI BOLD")).fields + assert f["bidsModality"] == "mri" and f["TaskName"] == "Rest" + assert f["RepetitionTime"] == 4.0 and f["EchoTime"] == 0.026 + # SliceTiming is 40 numbers; the count is reported, not the list. + assert f["sliceCount"] == 40 and "SliceTiming" not in f + + +def test_ieeg_sidecar(): + d = decode_bids_json(_case("iEEG sidecar")) + assert d.summary == "BIDS sidecar, ieeg, task FilteredSpeech, 1000 Hz" + f = d.fields + # iEEG keys win over the EEG keys the same file also carries. + assert f["bidsModality"] == "ieeg" + assert f["iEEGReference"] == "common average" and f["EEGChannelCount"] == 64 + assert f["RecordingDuration"] == 1204.041 + + +def test_coordinate_system_sidecar(): + f = decode_bids_json(_case("coordinate system")).fields + assert f["bidsModality"] == "coordsystem" + assert f["MEGCoordinateSystem"] == "ElektaNeuromag" + assert f["HeadCoilCoordinateUnits"] == "mm" + + +def test_data_dictionary(): + d = decode_bids_json(_case("data dictionary")) + assert d.format == "bids-dictionary" and d.fields["columnCount"] == 4 + assert "Description" in next(iter(d.fields["columnDescriptions"].values())) + + +def test_events_table(): + d = decode_bids_tsv(_case("events with trial_type")) + assert d.format == "bids-table" + f = d.fields + assert f["bidsFileType"] == "events" and f["rowsRead"] == 158 + assert f["rowsComplete"] is True and f["columns"][0] == "onset" + assert f["onsetFirstSeconds"] == 0.061 and f["onsetLastSeconds"] == 600.409 + assert f["trialTypesDistinct"] == 4 and sum(f["trialTypes"].values()) == 158 + + +def test_channels_and_electrodes_tables(): + channels = decode_bids_tsv(_case("channels table")).fields + assert channels["bidsFileType"] == "channels" and channels["samplingRateHz"] == 1000.0 + assert channels["channelTypesDistinct"] == 1 + electrodes = decode_bids_tsv(_case("electrodes table")).fields + assert electrodes["bidsFileType"] == "electrodes" and electrodes["electrodeCount"] == 64 + + +def test_byte_order_mark_does_not_hide_the_columns(): + f = decode_bids_tsv(_case("UTF-8 BOM")).fields + assert f["bidsFileType"] == "scans" and f["columns"] == ["filename", "acq_time"] + + +def test_truncated_table_says_so(): + data = _case("events with trial_type") + assert len(data) < BIDS_READ_BYTES + # Simulate a file longer than the bounded read. + padded = data + b"\n" + b"0.0\t0.0\tpad\tn/a\tn/a\tn/a\t0\t0" * 20000 + f = decode_bids_tsv(padded[:BIDS_READ_BYTES]).fields + assert f["rowsComplete"] is False + assert "read" in decode_bids_tsv(padded[:BIDS_READ_BYTES]).summary + + +def test_declines_non_bids(): + assert decode_bids_json(b"") is None + assert decode_bids_json(b"[1, 2, 3]") is None + assert decode_bids_json(b'{"name": "pkg", "version": "1.0.0"}') is None + assert decode_bids_tsv(b"a\tb\tc\n1\t2\t3\n") is None + assert decode_bids_tsv(b"") is None diff --git a/tests/test_brainvision.py b/tests/test_brainvision.py new file mode 100644 index 0000000..fd1de93 --- /dev/null +++ b/tests/test_brainvision.py @@ -0,0 +1,109 @@ +"""BrainVision header and marker decoding. + +Golden: tests/fixtures/brainvision-cases.json, real files from the +bids-standard/bids-examples corpus. Channel count, sampling rate and channel +names were checked against mne 1.13.2's read_raw_brainvision on all 64 +non-empty `.vhdr` files in that corpus when the fixture was made; all 64 +agreed. +""" + +import json +import os + +from scigantic_headers import ( + decode_brainvision_vhdr, + decode_brainvision_vmrk, + decode_bytes, + has_decoder_for, +) +from scigantic_headers.brainvision import BRAINVISION_READ_BYTES +from scigantic_headers.decoders import read_for + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "brainvision-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return bytes.fromhex(next(c for c in CASES if name in c["name"])["hex"]) + + +def test_extensions_registered(): + assert has_decoder_for("eeg/sub-01_eeg.vhdr") and has_decoder_for("eeg/sub-01_eeg.vmrk") + assert read_for("x.vhdr").leading == BRAINVISION_READ_BYTES + + +def test_golden_fixture_matches(): + assert len(CASES) >= 5 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_version_1_header(): + d = decode_brainvision_vhdr(_case("sub-cm4")) + assert d.format == "brainvision" + assert d.summary == "BrainVision, 61 channels, 1000 Hz, ieee_float_32 multiplexed" + f = d.fields + assert f["brainVisionVersion"] == "1.0" and f["channelCount"] == 61 + assert f["samplingIntervalMicroseconds"] == 1000.0 and f["samplingRateHz"] == 1000.0 + assert f["binaryFormat"] == "IEEE_FLOAT_32" and f["bytesPerSample"] == 4 + assert f["byteOrder"] == "little" and f["dataOrientation"] == "MULTIPLEXED" + assert f["dataFile"] == "sub-cm4_task-FilteredSpeech_ieeg.eeg" + assert f["channelNames"][0] == "G1" and len(f["channelNames"]) == 61 + assert f["channels"][0] == {"name": "G1", "resolution": 0.1} + assert f["resolution"] == 0.1 + + +def test_version_2_vectorized_header_with_coordinates(): + f = decode_brainvision_vhdr(_case("sub-35")).fields + assert f["brainVisionVersion"] == "2.0" and f["dataOrientation"] == "VECTORIZED" + assert f["dataType"] == "TIMEDOMAIN" and f["channelCount"] == 64 + assert f["samplingRateHz"] == 250.0 and f["dataPoints"] == 197235 + assert f["durationSeconds"] == 197235 / 250.0 + assert f["hasCoordinates"] is True + + +def test_markers(): + d = decode_brainvision_vmrk(_case("sub-05_task-matchingpennies_eeg.vmrk")) + assert d.format == "brainvision-markers" + f = d.fields + assert f["markersRead"] == 301 and f["markersComplete"] is True + assert f["markerTypes"] == {"Stimulus": 300, "New Segment": 1} + assert len(f["markers"]) == 16 # detail is capped; the counts are not + assert f["markers"][0]["type"] == "New Segment" + + +def test_marker_segment_timestamp(): + # `Mk1=New Segment,,1,1,0,20131129170516793000` carries the wall clock. + text = ( + "Brain Vision Data Exchange Marker File, Version 1.0\n" + "\n[Common Infos]\nDataFile=x.eeg\n" + "\n[Marker Infos]\n" + "Mk1=New Segment,,1,1,0,20131129170516793000\n" + "Mk2=Stimulus,S 1,1024,1,0\n" + ).encode() + f = decode_brainvision_vmrk(text).fields + assert f["segmentStartTime"] == "2013-11-29T17:05:16.793000" + assert f["markers"][1] == {"type": "Stimulus", "description": "S 1", "position": 1024, + "size": 1, "channel": 0} + + +def test_escaped_comma_in_channel_name(): + text = ( + "Brain Vision Data Exchange Header File Version 1.0\n" + "\n[Common Infos]\nNumberOfChannels=1\nSamplingInterval=1000\n" + "\n[Channel Infos]\nCh1=Fp1\\1ref,,0.1,uV\n" + ).encode() + f = decode_brainvision_vhdr(text).fields + assert f["channelNames"] == ["Fp1,ref"] + assert f["channels"][0]["unit"] == "uV" + + +def test_rejects_other_ini_files(): + assert decode_brainvision_vhdr(b"[Common Infos]\nNumberOfChannels=1\n") is None + assert decode_brainvision_vhdr(b"") is None + # A marker file is not a header file and vice versa. + assert decode_brainvision_vhdr(_case("sub-05_task-matchingpennies_eeg.vmrk")) is None + assert decode_brainvision_vmrk(_case("sub-cm4_task-FilteredSpeech_ieeg.vhdr")) is None diff --git a/tests/test_edf.py b/tests/test_edf.py new file mode 100644 index 0000000..7f6276e --- /dev/null +++ b/tests/test_edf.py @@ -0,0 +1,118 @@ +"""EDF/EDF+ and BDF/BDF+ header decoding. + +Golden: tests/fixtures/edf-cases.json. The first case is the real header of the +PhysioNet Sleep-EDF Expanded cassette recording SC4001E0-PSG.edf; the rest were +written by pyedflib 0.1.42, and every expected value in those five was checked +against pyedflib's own reader when the fixture was made, with two known and +intended differences: pyedflib hides the annotations channel from its signal +list, and its start time carries the sub-second offset that lives in the +annotations record rather than the header this decoder reads. The PhysioNet +case could not be checked that way, since pyedflib refuses a file whose samples +are absent and PhysioNet truncated every attempt to fetch all 48 MB; its header +is self-checking instead (see test_physionet_sleep_cassette_header). +""" + +import json +import os + +from scigantic_headers import decode_bytes, decode_edf, has_decoder_for +from scigantic_headers.decoders import read_for +from scigantic_headers.edf import EDF_READ_BYTES +from scigantic_headers.sources import is_decodable + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "edf-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return next(c for c in CASES if name in c["name"]) + + +def test_extensions_registered(): + assert has_decoder_for("sleep/SC4001E0-PSG.edf") and has_decoder_for("rec.bdf") + assert is_decodable("sleep/SC4001E0-PSG.edf.gz") + assert read_for("x.edf").leading == EDF_READ_BYTES + + +def test_golden_fixture_matches(): + assert len(CASES) >= 6 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_physionet_sleep_cassette_header(): + d = decode_edf(bytes.fromhex(_case("SC4001E0")["hex"])) + assert d.format == "edf" + assert d.summary == "EDF recording, 7 signals, 22:05:00" + f = d.fields + assert f["edfType"] == "EDF" and f["bitDepth"] == 16 + assert f["signalCount"] == 7 and f["headerBytes"] == 256 * 8 + assert f["numDataRecords"] == 2650 and f["dataRecordDurationSeconds"] == 30.0 + assert f["durationSeconds"] == 79500.0 and f["headerComplete"] is True + # The header date is 24.04.89; only the EDF+ recording field says 1989. + assert f["startDateTime"] == "1989-04-24T16:13:00" + assert f["recording"] == "Startdate 24-APR-1989 X X X" + assert f["subjectSex"] == "F" and f["subjectName"] == "Female_33yr" + assert f["signalLabels"][0] == "EEG Fpz-Cz" and f["signalLabels"][-1] == "Event marker" + eeg = f["signals"][0] + assert eeg["physicalDimension"] == "uV" and eeg["samplesPerRecord"] == 3000 + assert eeg["samplingRateHz"] == 100.0 and eeg["digitalMin"] == -2048 + assert eeg["transducer"] == "Ag-AgCl electrodes" + # Channels run at 100 Hz and 1 Hz, so no single rate is claimed. + assert "samplingRateHz" not in f + + +def test_edf_plus_annotations_channel(): + f = decode_edf(bytes.fromhex(_case("test_generator.edf")["hex"])).fields + assert f["edfType"] == "EDF+C" and f["annotationSignalCount"] == 1 + assert f["signals"][-1]["label"] == "EDF Annotations" + assert f["signals"][-1]["annotations"] is True + # The annotations channel is kept out of the recording's sampling rate. + assert f["samplingRateHz"] == 200.0 + + +def test_legacy_edf_with_annotations_channel(): + # Reserved field is blank, so this is plain EDF, but it still carries the + # reserved annotations label; the label alone identifies the channel. + f = decode_edf(bytes.fromhex(_case("test_legacy.edf")["hex"])).fields + assert f["edfType"] == "EDF" and f["annotationSignalCount"] == 1 + assert f["samplingRateHz"] == 200.0 + + +def test_bdf_is_24_bit(): + d = decode_edf(bytes.fromhex(_case("test_generator.bdf")["hex"])) + f = d.fields + assert f["edfType"] == "BDF+C" and f["bitDepth"] == 24 + assert f["signals"][0]["digitalMin"] == -8388608 + assert f["signals"][0]["digitalMax"] == 8388607 + assert f["annotationSignalCount"] == 1 + + +def test_fractional_data_record_duration(): + f = decode_edf(bytes.fromhex(_case("datarec_generator_0_5")["hex"])).fields + assert f["dataRecordDurationSeconds"] == 0.5 + assert f["durationSeconds"] == f["numDataRecords"] * 0.5 + + +def test_rejects_non_edf(): + assert decode_edf(b"") is None + assert decode_edf(b"\x00" * 1024) is None + # Right magic, but the two redundant counts disagree. + bad = bytearray(b" " * 256) + bad[:8] = b"0 " + bad[184:192] = b"9999 " + bad[252:256] = b"2 " + assert decode_edf(bytes(bad)) is None + + +def test_truncated_signal_header_is_reported(): + full = bytes.fromhex(_case("SC4001E0")["hex"]) + d = decode_edf(full[:256 + 100]) + assert d is not None and d.fields["headerComplete"] is False + assert d.fields["signalCount"] == 7 + # The columns are laid out one after another, so a short read loses the + # later ones entirely rather than truncating each signal. + assert len(d.fields.get("signalLabels", [])) < 7 diff --git a/tests/test_fuzz.py b/tests/test_fuzz.py index 0d86f9e..8c7fc1b 100644 --- a/tests/test_fuzz.py +++ b/tests/test_fuzz.py @@ -20,6 +20,7 @@ decode_nifti_header, decode_npy_header, ) +from scigantic_headers.edf import decode_edf from scigantic_headers.decoders import _DECODERS_BY_EXT, _DECODERS_BY_NAME SEED = 1729 @@ -48,7 +49,7 @@ def _assert_valid_or_none(result): def _seed_magic(rng, kind): - n = rng.randint(0, 1200) + n = rng.randint(0, 2400) buf = bytearray(rng.getrandbits(8) for _ in range(n)) if kind == "mrc" and len(buf) >= 212: buf[208:212] = b"MAP " @@ -59,6 +60,13 @@ def _seed_magic(rng, kind): elif kind == "nifti" and len(buf) >= 348: struct.pack_into(" reaches pixdim + elif kind in ("edf", "bdf") and len(buf) >= 2048: + # Magic, plus the two counts that must agree, so the decoder gets past + # its validity check and into the ASCII field parsing. + signals = rng.randint(0, 6) + buf[0:8] = b"0 " if kind == "edf" else b"\xffBIOSEMI" + buf[184:192] = b"%-8d" % (256 * (signals + 1)) + buf[252:256] = b"%-4d" % signals elif kind == "nifti2" and len(buf) >= 540: struct.pack_into(" reaches the 64-bit dims @@ -82,6 +90,8 @@ def test_decode_bytes_total_over_random(): ("npy", decode_npy_header), ("nifti", decode_nifti_header), ("nifti2", decode_nifti_header), + ("edf", decode_edf), + ("bdf", decode_edf), ]) def test_decoders_total_on_magic_seeded(kind, fn): # Buffers that pass the magic check and drive the field-parsing paths where diff --git a/tests/test_neuralynx.py b/tests/test_neuralynx.py new file mode 100644 index 0000000..858410a --- /dev/null +++ b/tests/test_neuralynx.py @@ -0,0 +1,95 @@ +"""Neuralynx Cheetah and Pegasus header decoding. + +Golden: tests/fixtures/neuralynx-cases.json. No public Neuralynx file was +reachable to copy, so each case is a header built to the per-version grammar +documented in python-neo's NlxHeader, the reference reader for this format. +neo 0.14.6 parsed all four and agreed on application, version, file type, +sampling rate, microvolts per bit, channel name, record size and the open and +close times. The last case keeps the 16 KiB of NUL padding a real file has. +""" + +import json +import os + +from scigantic_headers import decode_bytes, decode_neuralynx, has_decoder_for +from scigantic_headers.decoders import read_for +from scigantic_headers.neuralynx import NEURALYNX_HEADER_BYTES + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "neuralynx-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return bytes.fromhex(next(c for c in CASES if name in c["name"])["hex"]) + + +def test_extensions_registered(): + for ext in ("ncs", "nev", "nse", "ntt", "nvt"): + assert has_decoder_for(f"session/CSC1.{ext}") + assert read_for("x.ncs").leading == NEURALYNX_HEADER_BYTES + + +def test_golden_fixture_matches(): + assert len(CASES) >= 5 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_comment_line_dialect(): + d = decode_neuralynx(_case("Cheetah 5.5.1")) + assert d.format == "neuralynx" + assert d.summary == "Neuralynx CSC, CSC1, 32000 Hz, Cheetah 5.5.1" + f = d.fields + assert f["applicationName"] == "Cheetah" and f["applicationVersion"] == "5.5.1" + assert f["fileType"] == "CSC" and f["recordKind"] == "continuous" + assert f["channelName"] == "CSC1" and f["recordBytes"] == 1044 + assert f["samplingRateHz"] == 32000.0 and f["adMaxValue"] == 32767 + assert f["microvoltsPerBit"] == 0.030517578125 + assert f["timeOpened"] == "2013-11-29T17:05:16.793" + assert f["timeClosed"] == "2013-11-29T18:03:13.603" + assert f["dspLowCutFilterEnabled"] is True and f["inputInverted"] is True + assert f["headerBytes"] == NEURALYNX_HEADER_BYTES + + +def test_property_dialect(): + f = decode_neuralynx(_case("Cheetah 5.7.4 CSC1.ncs (property")).fields + # `-ApplicationName Cheetah "5.7.4 Development"` splits into both. + assert f["applicationName"] == "Cheetah" + assert f["applicationVersion"] == "5.7.4 Development" + assert f["fileVersion"] == "3.4" + assert f["timeOpened"] == "2017-02-16T17:56:04" + assert f["originalFileName"] == "C:\\CheetahData\\2017-02-16_17-55-55\\CSC1.ncs" + # A quoted value is stored without its quotes. + assert f["referenceChannel"] == "Source 0 Reference 0" + + +def test_pegasus_event_file(): + f = decode_neuralynx(_case("Pegasus")).fields + assert f["applicationName"] == "Pegasus" and f["applicationVersion"] == "2.1.1" + assert f["fileType"] == "Event" and f["recordKind"] == "event" + assert f["recordBytes"] == 184 + assert "samplingRateHz" not in f + + +def test_tetrode_repeats_keys_per_channel(): + f = decode_neuralynx(_case("tetrode")).fields + assert f["fileType"] == "Spike" and f["recordKind"] == "spike" + assert f["adChannelCount"] == 4 and f["waveformSamples"] == 32 + # Four ADBitVolts on one line; the first is the value a scalar field takes. + assert f["microvoltsPerBit"] == 0.03662109375 + assert f["inputRange"] == "1200 1200 1200 1200" + + +def test_nul_padding_decodes_the_same(): + padded = _case("NUL padding") + assert len(padded) == NEURALYNX_HEADER_BYTES + assert decode_neuralynx(padded) == decode_neuralynx(_case("property")) + + +def test_rejects_other_files(): + assert decode_neuralynx(b"") is None + assert decode_neuralynx(b"########" + b" not a neuralynx file\n") is None + assert decode_neuralynx(b"-FileType CSC\n-SamplingFrequency 32000\n") is None diff --git a/tests/test_openephys.py b/tests/test_openephys.py new file mode 100644 index 0000000..c05c48f --- /dev/null +++ b/tests/test_openephys.py @@ -0,0 +1,76 @@ +"""Open Ephys binary-format manifest decoding. + +Golden: tests/fixtures/openephys-cases.json, three real `structure.oebin` +files: the GUI's own demo manifest (0.4.5, four streams), a Neuropixels +session written by GUI 0.6.0, and a Rhythm FPGA session from GUI 0.4.4.1. +""" + +import json +import os + +from scigantic_headers import decode_bytes, decode_openephys_oebin, has_decoder_for +from scigantic_headers.decoders import read_for +from scigantic_headers.openephys import OPENEPHYS_READ_BYTES + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "openephys-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return bytes.fromhex(next(c for c in CASES if name in c["name"])["hex"]) + + +def test_extension_registered(): + assert has_decoder_for("recording1/structure.oebin") + assert read_for("structure.oebin").leading == OPENEPHYS_READ_BYTES + + +def test_golden_fixture_matches(): + assert len(CASES) >= 3 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_four_demo_streams(): + d = decode_openephys_oebin(_case("plugin-GUI")) + assert d.format == "openephys-oebin" + assert d.summary == "Open Ephys recording, 4 continuous streams, 64 channels, 40000 Hz" + f = d.fields + assert f["guiVersion"] == "0.4.5" and f["continuousStreams"] == 4 + assert f["totalContinuousChannels"] == 64 and f["samplingRateHz"] == 40000.0 + first = f["continuous"][0] + assert first["folderName"] == "data_stream_sine_wave/" + assert first["channelCount"] == 16 and first["channelsListed"] == 16 + assert first["bitVolts"] == 0.05 and first["units"] == "uV" + assert first["sourceProcessorName"] == "Demo source" + + +def test_neuropixels_session(): + f = decode_openephys_oebin(_case("spikewrap")).fields + assert f["guiVersion"] == "0.6.0" and f["continuousStreams"] == 1 + assert f["totalContinuousChannels"] == 385 + assert f["streamNames"] == ["ProbeA-AP"] + assert f["sourceProcessors"] == ["Neuropix-PXI"] + # The sync channel scales differently from the 384 probe channels, so no + # single bitVolts is claimed for the stream. + assert "bitVolts" not in f["continuous"][0] + assert f["eventStreams"] == 2 + assert f["events"][0]["channelName"] == "Neuropixels PXI Sync" + + +def test_rhythm_fpga_session(): + f = decode_openephys_oebin(_case("3DDD")).fields + assert f["guiVersion"] == "0.4.4.1" and f["totalContinuousChannels"] == 35 + assert f["continuous"][0]["sourceProcessorName"] == "Rhythm FPGA" + + +def test_rejects_other_json(): + assert decode_openephys_oebin(b"") is None + assert decode_openephys_oebin(b"[]") is None + assert decode_openephys_oebin(b'{"name": "package"}') is None + # Record lists present but all empty, and no GUI version: nothing to describe. + assert decode_openephys_oebin(b'{"continuous": [], "events": []}') is None + assert decode_openephys_oebin(b'{"GUI version": "0.6.0", "continuous": []}') is not None diff --git a/tests/test_spikeglx.py b/tests/test_spikeglx.py new file mode 100644 index 0000000..ce0cab1 --- /dev/null +++ b/tests/test_spikeglx.py @@ -0,0 +1,85 @@ +"""SpikeGLX run metadata decoding. + +Golden: tests/fixtures/spikeglx-cases.json, three real `.meta` files spanning +nine years of the format. Channel count, sampling rate, sample count and +microvolts per bit were checked against neo 0.14.6's extract_stream_info on +the two modern ones when the fixture was made; neo raises KeyError on the 2016 +Phase 3A file, which this decoder still describes. +""" + +import json +import os + +from scigantic_headers import decode_bytes, decode_spikeglx_meta, has_decoder_for +from scigantic_headers.decoders import read_for +from scigantic_headers.spikeglx import SPIKEGLX_READ_BYTES + +FIX = os.path.join(os.path.dirname(__file__), "fixtures", "spikeglx-cases.json") + +with open(FIX) as _fh: + CASES = json.load(_fh)["cases"] + + +def _case(name): + return bytes.fromhex(next(c for c in CASES if name in c["name"])["hex"]) + + +def test_extension_registered(): + assert has_decoder_for("run_g0_t0.imec0.ap.meta") + assert read_for("x.meta").leading == SPIKEGLX_READ_BYTES + + +def test_golden_fixture_matches(): + assert len(CASES) >= 3 + for case in CASES: + d = decode_bytes(case["key"], bytes.fromhex(case["hex"])) + assert d is not None and d.to_dict() == case["expected"], case["name"] + + +def test_neuropixels_2_four_shank(): + d = decode_spikeglx_meta(_case("1119617")) + assert d.format == "spikeglx" + assert d.summary == ("SpikeGLX imec.ap, 385 channels, 30000 Hz, 0.25 s, " + "Neuropixels 2.0 (4 shank)") + f = d.fields + assert f["channelCount"] == 385 and f["samplingRateHz"] == 30000.0 + assert f["apChannels"] == 384 and f["syncChannels"] == 1 + assert f["probeType"] == 24 and f["probePartNumber"] == "NP2010" + assert f["probeSerial"] == "20403314871" and f["maxInt"] == 8192 + # int16 samples, no header: 5775000 / 2 / 385. + assert f["sampleCount"] == 7500 + # imAiRangeMax / imMaxInt / fixed 2.0 gain, in microvolts; neo agrees. + assert f["microvoltsPerBit"] == 0.762939453125 + assert f["runName"] == "1119617_LSE1_shank12" + assert f["gateIndex"] == 0 and f["triggerIndex"] == 0 + assert f["device"] == "imec0" and f["stream"] == "ap" + # The per-channel tables are counted, never copied. + assert f["snsGeomMapEntries"] == 384 and "snsGeomMap" not in f + + +def test_neuropixels_1_gain_from_imro_table(): + f = decode_spikeglx_meta(_case("sample3B2")).fields + assert f["probeType"] == 0 and f["probeModel"] == "Neuropixels 1.0" + assert f["apGain"] == 500 and f["lfGain"] == 250 + # imAiRangeMax / 512 / apGain, in microvolts; neo agrees. + assert f["microvoltsPerBit"] == 2.34375 + # A CatGT-concatenated run is `_g0_tcat`, with no trigger index. + assert f["concatenated"] is True and "triggerIndex" not in f + assert f["runName"] == "SC023_053119" + + +def test_phase_3a_file_without_type_key(): + f = decode_spikeglx_meta(_case("sample3.meta")).fields + assert f["channelCount"] == 769 and f["samplingRateHz"] == 30000.0 + assert f["apChannels"] == 384 and f["lfChannels"] == 384 + # No imDatPrb_type and no imMaxInt, so no scaling is claimed. + assert "probeType" not in f and "microvoltsPerBit" not in f + assert f["durationSeconds"] == 120.0 + + +def test_rejects_other_meta_files(): + assert decode_spikeglx_meta(b"") is None + assert decode_spikeglx_meta(b"name=value\nother=1\n") is None + # nSavedChans without a sample rate is not enough to claim the file. + assert decode_spikeglx_meta(b"nSavedChans=385\n") is None + assert decode_spikeglx_meta(b"nSavedChans=385\nimSampRate=30000\n") is not None diff --git a/tests/test_zarr.py b/tests/test_zarr.py index 075d4a6..f605d6a 100644 --- a/tests/test_zarr.py +++ b/tests/test_zarr.py @@ -43,8 +43,11 @@ def test_sidecar_names_dispatch(key): assert is_decodable(key) is True -def test_unrelated_json_name_is_not_claimed(): - assert has_decoder_for("x/config.json") is False +def test_unrelated_json_content_is_not_claimed(): + # The .json extension is registered (BIDS sidecars are content-sniffed + # under it), so dispatch reaches a decoder; no zarr name matches and the + # content is not BIDS, so nothing is claimed. + assert decode_bytes("x/config.json", b'{"debug": true, "port": 8080}') is None # ── IDR 6001240 (OME-NGFF 0.4, Zarr v2) ───────────────────────────────────────