From cb242cbfc1bcf677f0929003e90ef949ef674cff Mon Sep 17 00:00:00 2001 From: Younies Mahmoud Date: Thu, 7 Dec 2023 14:05:35 +0100 Subject: [PATCH] Implement MeasureUnit (#4360) --- Cargo.lock | 5 +- experimental/unitsconversion/Cargo.toml | 1 + experimental/unitsconversion/src/lib.rs | 16 + .../unitsconversion/src/measureunit.rs | 129 + experimental/unitsconversion/src/power.rs | 28 + experimental/unitsconversion/src/provider.rs | 66 +- experimental/unitsconversion/src/si_prefix.rs | 93 + .../src/transform/cldr/units/helpers.rs | 19 +- .../datagen/src/transform/cldr/units/info.rs | 95 +- .../tests/data/json/units/info@1/und.json | 2226 +++++++++++++++-- .../tests/data/postcard/fingerprints.csv | 2 +- 11 files changed, 2494 insertions(+), 186 deletions(-) create mode 100644 experimental/unitsconversion/src/measureunit.rs create mode 100644 experimental/unitsconversion/src/power.rs create mode 100644 experimental/unitsconversion/src/si_prefix.rs diff --git a/Cargo.lock b/Cargo.lock index 6e90be1c440..ebee8202522 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2104,6 +2104,7 @@ dependencies = [ "icu_locid", "icu_provider", "serde", + "smallvec", "zerotrie", "zerovec", ] @@ -3173,9 +3174,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" dependencies = [ "serde", ] diff --git a/experimental/unitsconversion/Cargo.toml b/experimental/unitsconversion/Cargo.toml index 67010e79701..4f1e7c05353 100644 --- a/experimental/unitsconversion/Cargo.toml +++ b/experimental/unitsconversion/Cargo.toml @@ -26,6 +26,7 @@ displaydoc = { version = "0.2.3", default-features = false } icu_locid = { workspace = true } icu_provider = { workspace = true, features = ["macros"] } serde = { version = "1.0", default-features = false, features = ["derive", "alloc"], optional = true } +smallvec = "1.11.2" zerotrie = { workspace = true, features = ["yoke", "zerofrom"] } zerovec = { workspace = true, features = ["yoke"] } diff --git a/experimental/unitsconversion/src/lib.rs b/experimental/unitsconversion/src/lib.rs index 529e07a2325..bbf29812649 100644 --- a/experimental/unitsconversion/src/lib.rs +++ b/experimental/unitsconversion/src/lib.rs @@ -6,4 +6,20 @@ extern crate alloc; +pub mod measureunit; +pub mod power; pub mod provider; +pub mod si_prefix; + +/// Represents the possible errors that can occur during the measurement unit operations. +pub enum ConversionError { + /// The unit is not valid. + /// This can happen if the unit id is not following the CLDR specification. + /// For example, `meter` is a valid unit id, but `metre` is not. + InvalidUnit, + + /// The conversion is not valid. + /// This can happen if the units are not compatible. + /// For example, `meter` and `foot` are compatible, but `meter` and `second` are not. + InvalidConversion, +} diff --git a/experimental/unitsconversion/src/measureunit.rs b/experimental/unitsconversion/src/measureunit.rs new file mode 100644 index 00000000000..fce1bb3bfa6 --- /dev/null +++ b/experimental/unitsconversion/src/measureunit.rs @@ -0,0 +1,129 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +use smallvec::SmallVec; +use zerotrie::ZeroTrie; +use zerovec::ZeroVec; + +use crate::{ + power::get_power, + provider::{Base, MeasureUnitItem, SiPrefix}, + si_prefix::{get_si_prefix_base_ten, get_si_prefix_base_two}, + ConversionError, +}; + +// TODO(#4369): split this struct to two structs: MeasureUnitParser for parsing the identifier and MeasureUnit to represent the unit. +// TODO NOTE: the MeasureUnitParser takes the trie and the ConverterFactory takes the full payload and an instance of MeasureUnitParser. +pub struct MeasureUnit { + /// Contains the processed units. + pub contained_units: SmallVec<[MeasureUnitItem; 8]>, +} + +impl MeasureUnit { + // TODO: complete all the cases for the prefixes. + // TODO: consider using a trie for the prefixes. + /// Extracts the SI prefix. + /// NOTE: + /// if the prefix is found, the function will return (SiPrefix, part without the prefix string). + /// if the prefix is not found, the function will return (SiPrefix { power: 0, base: Base::Decimal }, part). + fn get_si_prefix(part: &str) -> (SiPrefix, &str) { + let (si_prefix_base_10, part) = get_si_prefix_base_ten(part); + if si_prefix_base_10 != 0 { + return ( + SiPrefix { + power: si_prefix_base_10, + base: Base::Decimal, + }, + part, + ); + } + + let (si_prefix_base_2, part) = get_si_prefix_base_two(part); + if si_prefix_base_2 != 0 { + return ( + SiPrefix { + power: si_prefix_base_2, + base: Base::Binary, + }, + part, + ); + } + + ( + SiPrefix { + power: 0, + base: Base::Decimal, + }, + part, + ) + } + + /// Get the unit id. + /// NOTE: + /// if the unit id is found, the function will return (unit id, part without the unit id and without `-` at the beginning of the remaining part if it exists). + /// if the unit id is not found, the function will return None. + fn get_unit_id<'data>(part: &'data str, trie: &ZeroTrie>) -> Option { + trie.get(part.as_bytes()) + } + + /// Process a part of an identifier. + /// For example, if the whole identifier is: "square-kilometer-per-second", + /// this function will be called for "square-kilometer" with sign (1) and "second" with sign (-1). + fn analyze_identifier_part( + identifier_part: &str, + sign: i8, + result: &mut Vec, + trie: &ZeroTrie>, + ) -> Result<(), ConversionError> { + if identifier_part.is_empty() { + return Ok(()); + } + let mut identifier_split = identifier_part.split('-'); + while let Some(mut part) = identifier_split.next() { + let power = match get_power(part) { + Some(power) => { + part = identifier_split + .next() + .ok_or(ConversionError::InvalidUnit)?; + power + } + None => 1, + }; + + let (si_prefix, identifier_after_si) = Self::get_si_prefix(part); + let unit_id = + Self::get_unit_id(identifier_after_si, trie).ok_or(ConversionError::InvalidUnit)?; + + result.push(MeasureUnitItem { + power: sign * power, + si_prefix, + unit_id: unit_id as u16, + }); + } + + Ok(()) + } + + // TODO: add test cases for this function. + /// Process an identifier. + pub fn try_from_identifier<'data>( + identifier: &'data str, + trie: &ZeroTrie>, + ) -> Result, ConversionError> { + if identifier.starts_with('-') { + return Err(ConversionError::InvalidUnit); + } + + let (num_part, den_part) = identifier + .split_once("per-") + .map(|(num_part, den_part)| (num_part.strip_suffix('-').unwrap_or(num_part), den_part)) + .unwrap_or((identifier, "")); + + let mut measure_unit_items = Vec::::new(); + + Self::analyze_identifier_part(num_part, 1, &mut measure_unit_items, trie)?; + Self::analyze_identifier_part(den_part, -1, &mut measure_unit_items, trie)?; + Ok(measure_unit_items) + } +} diff --git a/experimental/unitsconversion/src/power.rs b/experimental/unitsconversion/src/power.rs new file mode 100644 index 00000000000..c47b781bb29 --- /dev/null +++ b/experimental/unitsconversion/src/power.rs @@ -0,0 +1,28 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +// TODO: consider returning Option<(u8, &str)> instead of (1, part) for the case when the power is not found. +// TODO: complete all the cases for the powers. +// TODO: consider using a trie for the powers. +/// Converts a power string to a power. +pub fn get_power(part: &str) -> Option { + match part { + "pow1" => Some(1), + "square" | "pow2" => Some(2), + "cubic" | "pow3" => Some(3), + "pow4" => Some(4), + "pow5" => Some(5), + "pow6" => Some(6), + "pow7" => Some(7), + "pow8" => Some(8), + "pow9" => Some(9), + "pow10" => Some(10), + "pow11" => Some(11), + "pow12" => Some(12), + "pow13" => Some(13), + "pow14" => Some(14), + "pow15" => Some(15), + _ => None, + } +} diff --git a/experimental/unitsconversion/src/provider.rs b/experimental/unitsconversion/src/provider.rs index c435be3eaba..be51ecd15a9 100644 --- a/experimental/unitsconversion/src/provider.rs +++ b/experimental/unitsconversion/src/provider.rs @@ -9,7 +9,6 @@ //! //! Read more about data providers: [`icu_provider`] -use alloc::borrow::Cow; use icu_provider::prelude::*; use zerotrie::ZeroTrie; use zerovec::{VarZeroVec, ZeroVec}; @@ -37,7 +36,7 @@ pub const KEYS: &[DataKey] = &[UnitsInfoV1Marker::KEY]; pub struct UnitsInfoV1<'data> { /// Maps from unit name (e.g. foot) to it is conversion information. #[cfg_attr(feature = "serde", serde(borrow))] - pub units_conversion_map: ZeroTrie>, + pub units_conversion_trie: ZeroTrie>, /// Contains the conversion information, such as the conversion rate and the base unit. /// For example, the conversion information for the unit `foot` is `1 foot = 0.3048 meter`. @@ -66,9 +65,9 @@ pub struct UnitsInfoV1<'data> { )] #[zerovec::derive(Debug)] pub struct ConversionInfo<'data> { - /// Contains the base unit which the unit is converted to. + /// Contains the base unit (after parsing) which what the unit is converted to. #[cfg_attr(feature = "serde", serde(borrow))] - pub base_unit: Cow<'data, str>, + pub basic_units: ZeroVec<'data, MeasureUnitItem>, /// Represents the numerator of the conversion factor. #[cfg_attr(feature = "serde", serde(borrow))] @@ -129,3 +128,62 @@ pub enum Exactness { Exact = 0, Approximate = 1, } + +#[zerovec::make_ule(BaseULE)] +#[cfg_attr( + feature = "datagen", + derive(serde::Serialize, databake::Bake), + databake(path = icu_unitsconversion::provider), +)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Default)] +#[repr(u8)] +pub enum Base { + /// The base of the si prefix is 10. + #[default] + Decimal = 0, + + /// The base of the si prefix is 2. + Binary = 1, +} + +/// Represents an Item of a MeasureUnit. +/// For example, the MeasureUnit `kilometer-per-square-second` contains two items: +/// 1. `kilometer` with power 1 and prefix 3 with base 10. +/// 2. `second` with power -2 and prefix `NotExist`. +#[zerovec::make_ule(MeasureUnitItemULE)] +#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Default)] +#[cfg_attr( + feature = "datagen", + derive(serde::Serialize, databake::Bake), + databake(path = icu_unitsconversion::provider), +)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +pub struct MeasureUnitItem { + /// The power of the unit. + pub power: i8, + + /// The si base of the unit. + pub si_prefix: SiPrefix, + + /// The id of the unit. + pub unit_id: u16, +} + +// TODO: Consider reducing the size of this struct while implementing the ULE. +/// Represents the SI prefix. +#[zerovec::make_ule(SiPrefixULE)] +#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq, Default)] +#[cfg_attr( + feature = "datagen", + derive(serde::Serialize, databake::Bake), + databake(path = icu_unitsconversion::provider), +)] +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +pub struct SiPrefix { + /// The absolute value of the power of the si prefix. + pub power: i8, + + /// The base of the si prefix. + pub base: Base, +} diff --git a/experimental/unitsconversion/src/si_prefix.rs b/experimental/unitsconversion/src/si_prefix.rs new file mode 100644 index 00000000000..87d5d7448bb --- /dev/null +++ b/experimental/unitsconversion/src/si_prefix.rs @@ -0,0 +1,93 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +// TODO: consider returning Option<(i8, &str)> instead of (0, part) for the case when the prefix is not found. +// TODO: consider using a trie for the prefixes. +// TODO: complete all the cases for the prefixes. +/// Extracts the SI prefix of base 10. +/// NOTE: +/// if the prefix is found, the function will return (power, part without the prefix). +/// if the prefix is not found, the function will return (0, part). +pub fn get_si_prefix_base_ten(part: &str) -> (i8, &str) { + if let Some(part) = part.strip_prefix("quetta") { + (30, part) + } else if let Some(part) = part.strip_prefix("ronna") { + (27, part) + } else if let Some(part) = part.strip_prefix("yotta") { + (24, part) + } else if let Some(part) = part.strip_prefix("zetta") { + (21, part) + } else if let Some(part) = part.strip_prefix("exa") { + (18, part) + } else if let Some(part) = part.strip_prefix("peta") { + (15, part) + } else if let Some(part) = part.strip_prefix("tera") { + (12, part) + } else if let Some(part) = part.strip_prefix("giga") { + (9, part) + } else if let Some(part) = part.strip_prefix("mega") { + (6, part) + } else if let Some(part) = part.strip_prefix("kilo") { + (3, part) + } else if let Some(part) = part.strip_prefix("hecto") { + (2, part) + } else if let Some(part) = part.strip_prefix("deca") { + (1, part) + } else if let Some(part) = part.strip_prefix("deci") { + (-1, part) + } else if let Some(part) = part.strip_prefix("centi") { + (-2, part) + } else if let Some(part) = part.strip_prefix("milli") { + (-3, part) + } else if let Some(part) = part.strip_prefix("micro") { + (-6, part) + } else if let Some(part) = part.strip_prefix("nano") { + (-9, part) + } else if let Some(part) = part.strip_prefix("pico") { + (-12, part) + } else if let Some(part) = part.strip_prefix("femto") { + (-15, part) + } else if let Some(part) = part.strip_prefix("atto") { + (-18, part) + } else if let Some(part) = part.strip_prefix("zepto") { + (-21, part) + } else if let Some(part) = part.strip_prefix("yocto") { + (-24, part) + } else if let Some(part) = part.strip_prefix("ronto") { + (-27, part) + } else if let Some(part) = part.strip_prefix("quecto") { + (-30, part) + } else { + (0, part) + } +} + +// TODO: consider returning Option<(i8, &str)> instead of (0, part) for the case when the prefix is not found. +// TODO: consider using a trie for the prefixes. +// TODO: complete all the cases for the prefixes. +/// Extracts the SI prefix of base 2. +/// NOTE: +/// if the prefix is found, the function will return (power, part without the prefix). +/// if the prefix is not found, the function will return (0, part). +pub fn get_si_prefix_base_two(part: &str) -> (i8, &str) { + if let Some(part) = part.strip_prefix("kibi") { + (10, part) + } else if let Some(part) = part.strip_prefix("mebi") { + (20, part) + } else if let Some(part) = part.strip_prefix("gibi") { + (30, part) + } else if let Some(part) = part.strip_prefix("tebi") { + (40, part) + } else if let Some(part) = part.strip_prefix("pebi") { + (50, part) + } else if let Some(part) = part.strip_prefix("exbi") { + (60, part) + } else if let Some(part) = part.strip_prefix("zebi") { + (70, part) + } else if let Some(part) = part.strip_prefix("yobi") { + (80, part) + } else { + (0, part) + } +} diff --git a/provider/datagen/src/transform/cldr/units/helpers.rs b/provider/datagen/src/transform/cldr/units/helpers.rs index 7d5f3a8cab9..58dc0d18551 100644 --- a/provider/datagen/src/transform/cldr/units/helpers.rs +++ b/provider/datagen/src/transform/cldr/units/helpers.rs @@ -8,8 +8,11 @@ use std::collections::{BTreeMap, VecDeque}; use fraction::GenericFraction; use icu_provider::DataError; +use icu_unitsconversion::measureunit::MeasureUnit; use icu_unitsconversion::provider::{ConversionInfo, Exactness, Sign}; use num_bigint::BigUint; +use zerotrie::ZeroTrie; +use zerovec::ZeroVec; use crate::transform::cldr::cldr_serde::units::units_constants::Constant; @@ -143,11 +146,12 @@ fn to_str_vec(string_vec: &[String]) -> Vec<&str> { } /// Extracts the conversion info from a base unit, factor and offset. -pub fn extract_conversion_info( +pub fn extract_conversion_info<'data>( base_unit: &str, - factor: ScientificNumber, - offset: ScientificNumber, -) -> Result { + factor: &ScientificNumber, + offset: &ScientificNumber, + trie: &ZeroTrie>, +) -> Result, DataError> { let factor_fraction = convert_slices_to_fraction( &to_str_vec(&factor.clean_num), &to_str_vec(&factor.clean_den), @@ -167,8 +171,13 @@ pub fn extract_conversion_info( Exactness::Approximate }; + let base_unit = match MeasureUnit::try_from_identifier(base_unit, trie) { + Ok(base_unit) => base_unit, + Err(_) => return Err(DataError::custom("the base unit is not valid")), + }; + Ok(ConversionInfo { - base_unit: base_unit.into(), + basic_units: ZeroVec::from_iter(base_unit), factor_num: factor_num.into(), factor_den: factor_den.into(), factor_sign, diff --git a/provider/datagen/src/transform/cldr/units/info.rs b/provider/datagen/src/transform/cldr/units/info.rs index 3ed3af4c3a9..d415ad73fab 100644 --- a/provider/datagen/src/transform/cldr/units/info.rs +++ b/provider/datagen/src/transform/cldr/units/info.rs @@ -2,9 +2,12 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). -use std::{borrow::Cow, collections::BTreeMap}; +use std::collections::BTreeMap; -use crate::transform::cldr::cldr_serde::{self}; +use crate::transform::cldr::{ + cldr_serde::{self}, + units::helpers::ScientificNumber, +}; use fraction::{GenericFraction, Zero}; use icu_provider::{ datagen::IterableDataProvider, DataError, DataLocale, DataPayload, DataProvider, DataRequest, @@ -34,7 +37,13 @@ impl DataProvider for crate::DatagenProvider { let convert_units = &units_data.supplemental.convert_units.convert_units; let mut conversion_info_map = BTreeMap::, usize>::new(); - let mut convert_units_vec = Vec::::new(); + struct ConversionInfoPreProcessing<'a> { + base_unit: &'a str, + factor_scientific: ScientificNumber, + offset_scientific: ScientificNumber, + } + + let mut convert_units_vec = Vec::::new(); for (unit_name, convert_unit) in convert_units { let base_unit = convert_unit.base_unit.as_str(); let factor = match convert_unit.factor { @@ -46,28 +55,39 @@ impl DataProvider for crate::DatagenProvider { None => "0", }; - let factor_scientific = process_factor(factor, &clean_constants_map)?; - let offset_scientific = process_factor(offset, &clean_constants_map)?; - let convert_unit_index = convert_units_vec.len(); - convert_units_vec.push(extract_conversion_info( + convert_units_vec.push(ConversionInfoPreProcessing { base_unit, - factor_scientific, - offset_scientific, - )?); + factor_scientific: process_factor(factor, &clean_constants_map)?, + offset_scientific: process_factor(offset, &clean_constants_map)?, + }); conversion_info_map.insert(unit_name.as_bytes().to_vec(), convert_unit_index); } + let units_conversion_trie = ZeroTrieSimpleAscii::try_from(&conversion_info_map) + .map_err(|e| { + DataError::custom("Could not create ZeroTrie from units.json data") + .with_display_context(&e) + })? + .convert_store() + .into_zerotrie(); + + let convert_infos = convert_units_vec + .iter() + .map(|convert_unit| { + extract_conversion_info( + convert_unit.base_unit, + &convert_unit.factor_scientific, + &convert_unit.offset_scientific, + &units_conversion_trie, + ) + }) + .collect::, DataError>>()?; + let result = UnitsInfoV1 { - units_conversion_map: ZeroTrieSimpleAscii::try_from(&conversion_info_map) - .map_err(|e| { - DataError::custom("Could not create ZeroTrie from units.json data") - .with_display_context(&e) - })? - .convert_store() - .into_zerotrie(), - convert_infos: VarZeroVec::from(&convert_units_vec), + units_conversion_trie, + convert_infos: VarZeroVec::from(&convert_infos), }; Ok(DataResponse { @@ -104,7 +124,7 @@ fn test_basic() { .unwrap(); let units_info = und.get().to_owned(); - let units_info_map = &units_info.units_conversion_map; + let units_info_map = &units_info.units_conversion_trie; let convert_units = &units_info.convert_infos; let meter_index = units_info_map.get("meter").unwrap(); @@ -115,10 +135,33 @@ fn test_basic() { let meter_convert: ConversionInfo = ZeroFrom::zero_from(meter_convert_ule); assert_eq!(meter_convert.factor_sign, Sign::Positive); + let meter_convert_base_unit = meter_convert.basic_units.to_owned(); + assert_eq!( + meter_convert_base_unit.get(0).unwrap().unit_id, + meter_index as u16 + ); + assert_eq!( + meter_convert.factor_num, + ZeroVec::from(big_one.to_bytes_le()) + ); + assert_eq!( + meter_convert.factor_den, + ZeroVec::from(big_one.to_bytes_le()) + ); assert_eq!( meter_convert, ConversionInfo { - base_unit: Cow::Borrowed("meter"), + basic_units: { + let base_unit = vec![MeasureUnitItem { + power: 1, + si_prefix: SiPrefix { + power: 0, + base: Base::Decimal, + }, + unit_id: meter_index as u16, + }]; + ZeroVec::from_iter(base_unit.into_iter()) + }, factor_sign: Sign::Positive, factor_num: ZeroVec::from(big_one.to_bytes_le()), factor_den: ZeroVec::from(big_one.to_bytes_le()), @@ -137,7 +180,17 @@ fn test_basic() { assert_eq!( foot_convert, ConversionInfo { - base_unit: Cow::Borrowed("meter"), + basic_units: { + let base_unit = vec![MeasureUnitItem { + power: 1, + si_prefix: SiPrefix { + power: 0, + base: Base::Decimal, + }, + unit_id: meter_index as u16, + }]; + ZeroVec::from_iter(base_unit.into_iter()) + }, factor_sign: Sign::Positive, factor_num: ZeroVec::from(ft_to_m.numer().unwrap().to_bytes_le()), factor_den: ZeroVec::from(ft_to_m.denom().unwrap().to_bytes_le()), diff --git a/provider/datagen/tests/data/json/units/info@1/und.json b/provider/datagen/tests/data/json/units/info@1/und.json index f8767213785..2a50d1225a7 100644 --- a/provider/datagen/tests/data/json/units/info@1/und.json +++ b/provider/datagen/tests/data/json/units/info@1/und.json @@ -1,5 +1,5 @@ { - "units_conversion_map": { + "units_conversion_trie": { "100-kilometer": 0, "acre": 1, "ampere": 2, @@ -155,7 +155,16 @@ }, "convert_infos": [ { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 160, 134, @@ -175,7 +184,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 146, 58, @@ -198,7 +216,16 @@ "exactness": "Exact" }, { - "base_unit": "ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -216,7 +243,16 @@ "exactness": "Exact" }, { - "base_unit": "revolution", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 1 ], @@ -235,7 +271,16 @@ "exactness": "Exact" }, { - "base_unit": "revolution", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 1 ], @@ -255,7 +300,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 108, 90, @@ -277,7 +331,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-per-meter-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 205, 139, @@ -297,7 +376,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-per-meter-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 160, 134, @@ -317,7 +421,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 141, 25, @@ -343,7 +456,16 @@ "exactness": "Exact" }, { - "base_unit": "per-second", + "basic_units": [ + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -361,7 +483,16 @@ "exactness": "Exact" }, { - "base_unit": "bit", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 10 + } + ], "factor_num": [ 1 ], @@ -379,7 +510,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 183, 111, @@ -404,7 +560,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 55, 188, @@ -429,7 +610,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 144, 1 @@ -448,7 +638,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 127, 157, @@ -475,7 +674,16 @@ "exactness": "Exact" }, { - "base_unit": "bit", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 10 + } + ], "factor_num": [ 8 ], @@ -493,7 +701,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 11, 2 @@ -512,7 +745,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 227, 40 @@ -532,7 +790,16 @@ "exactness": "Exact" }, { - "base_unit": "candela", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 18 + } + ], "factor_num": [ 1 ], @@ -550,7 +817,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 1 ], @@ -569,7 +845,16 @@ "exactness": "Exact" }, { - "base_unit": "kelvin", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 72 + } + ], "factor_num": [ 1 ], @@ -588,7 +873,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 100 ], @@ -606,7 +900,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 29, 49 @@ -626,7 +929,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 128, 79, @@ -646,7 +958,24 @@ "exactness": "Exact" }, { - "base_unit": "second-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -664,7 +993,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -690,7 +1028,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -709,7 +1056,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -728,7 +1084,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 11, 26, @@ -765,7 +1130,16 @@ "exactness": "Approximate" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 128, 81, @@ -785,7 +1159,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 128, 81, @@ -805,7 +1188,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 10 ], @@ -823,7 +1215,16 @@ "exactness": "Exact" }, { - "base_unit": "revolution", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 1 ], @@ -842,7 +1243,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -868,7 +1278,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 209, 239, @@ -892,7 +1311,16 @@ "exactness": "Exact" }, { - "base_unit": "pixel", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 108 + } + ], "factor_num": [ 1 ], @@ -910,7 +1338,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -936,7 +1373,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 51, 179, @@ -963,7 +1409,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 232, 3 @@ -982,7 +1437,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 0, 0, @@ -1010,7 +1474,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 116, 82, @@ -1030,7 +1503,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 129, 114, @@ -1060,7 +1558,16 @@ "exactness": "Exact" }, { - "base_unit": "em", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 42 + } + ], "factor_num": [ 1 ], @@ -1078,7 +1585,16 @@ "exactness": "Exact" }, { - "base_unit": "kelvin", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 72 + } + ], "factor_num": [ 5 ], @@ -1097,7 +1613,40 @@ "exactness": "Exact" }, { - "base_unit": "pow4-second-square-ampere-per-kilogram-square-meter", + "basic_units": [ + { + "power": 4, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + }, + { + "power": -1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1115,7 +1664,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 119, 4 @@ -1135,7 +1693,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -1161,7 +1728,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 209, 239, @@ -1185,7 +1761,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 88, 16 @@ -1204,7 +1805,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 125, 1 @@ -1224,7 +1834,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 0, 117, @@ -1244,7 +1863,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 3 ], @@ -1263,7 +1891,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 58, 98 @@ -1282,7 +1919,24 @@ "exactness": "Exact" }, { - "base_unit": "meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 37, 254, @@ -1303,7 +1957,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -1328,7 +1991,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 209, 239, @@ -1351,7 +2023,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-per-meter-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 0, 160, @@ -1379,7 +2076,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 19, 224, @@ -1403,7 +2109,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 1 ], @@ -1422,7 +2137,24 @@ "exactness": "Exact" }, { - "base_unit": "square-meter-per-square-second", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -1440,7 +2172,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 16, 39 @@ -1459,7 +2200,40 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second-square-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -1477,7 +2251,24 @@ "exactness": "Exact" }, { - "base_unit": "revolution-per-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -1495,7 +2286,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-cubic-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 39, 92, @@ -1524,7 +2340,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 16, 14 @@ -1543,7 +2368,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 127 ], @@ -1562,7 +2396,16 @@ "exactness": "Exact" }, { - "base_unit": "item", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 66 + } + ], "factor_num": [ 1 ], @@ -1580,7 +2423,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 203, 76, @@ -1606,7 +2458,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 40 ], @@ -1624,7 +2485,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -1642,7 +2528,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -1660,7 +2555,24 @@ "exactness": "Exact" }, { - "base_unit": "item-per-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 66 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 0, 0, @@ -1687,7 +2599,16 @@ "exactness": "Exact" }, { - "base_unit": "kelvin", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 72 + } + ], "factor_num": [ 1 ], @@ -1705,7 +2626,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 24 ], @@ -1723,7 +2653,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 1 ], @@ -1741,7 +2680,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 37, 254, @@ -1762,7 +2726,24 @@ "exactness": "Exact" }, { - "base_unit": "meter-per-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 207, 1 @@ -1782,7 +2763,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 97, 9 @@ -1802,7 +2792,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1822,7 +2821,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 192, 70, @@ -1846,7 +2854,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1865,7 +2882,32 @@ "exactness": "Exact" }, { - "base_unit": "candela-square-meter-per-square-meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 18 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1883,7 +2925,24 @@ "exactness": "Exact" }, { - "base_unit": "candela-per-square-meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 18 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1901,7 +2960,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -1919,7 +2987,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 208, 17, @@ -1939,7 +3016,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 16, 39 @@ -1958,7 +3044,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 60 ], @@ -1976,7 +3071,16 @@ "exactness": "Exact" }, { - "base_unit": "item", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 66 + } + ], "factor_num": [ 0, 0, @@ -2003,7 +3107,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 1 ], @@ -2021,7 +3134,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 1 ], @@ -2039,7 +3161,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 60, 7 @@ -2058,7 +3189,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -2076,7 +3232,24 @@ "exactness": "Exact" }, { - "base_unit": "item-per-kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 66 + }, + { + "power": -1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 0, 0, @@ -2108,7 +3281,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-per-square-meter-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 43, 163, @@ -2132,7 +3330,40 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-cubic-second-square-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -2150,7 +3381,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 3 ], @@ -2170,7 +3410,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 133, 32, @@ -2194,7 +3443,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 115, 221, @@ -2217,7 +3475,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 0, 160, @@ -2248,7 +3515,32 @@ "exactness": "Approximate" }, { - "base_unit": "kilogram-per-meter-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -2266,7 +3558,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -2284,7 +3585,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -2303,7 +3613,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -2323,7 +3642,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -2342,7 +3670,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -2369,7 +3706,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -2394,7 +3740,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 209, 239, @@ -2417,7 +3772,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -2436,7 +3800,16 @@ "exactness": "Exact" }, { - "base_unit": "pixel", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 108 + } + ], "factor_num": [ 1 ], @@ -2454,7 +3827,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 127 ], @@ -2474,7 +3856,16 @@ "exactness": "Exact" }, { - "base_unit": "portion", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 110 + } + ], "factor_num": [ 1 ], @@ -2492,7 +3883,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 133, 32, @@ -2516,7 +3916,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 57, 169, @@ -2544,7 +3969,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -2569,7 +4003,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 209, 239, @@ -2592,7 +4035,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 1 ], @@ -2610,7 +4062,16 @@ "exactness": "Exact" }, { - "base_unit": "revolution", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 48, 121, @@ -2634,7 +4095,16 @@ "exactness": "Approximate" }, { - "base_unit": "kelvin", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 72 + } + ], "factor_num": [ 5 ], @@ -2652,7 +4122,16 @@ "exactness": "Exact" }, { - "base_unit": "revolution", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 1 ], @@ -2670,7 +4149,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 128, 202 @@ -2689,7 +4177,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -2708,7 +4205,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 29, 49 @@ -2728,7 +4234,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 97, 9 @@ -2750,7 +4265,16 @@ "exactness": "Exact" }, { - "base_unit": "square-meter", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 224, 46 @@ -2769,7 +4293,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -2787,7 +4320,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 97, 9 @@ -2809,7 +4351,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 5 ], @@ -2827,7 +4378,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 4 ], @@ -2845,7 +4405,40 @@ "exactness": "Exact" }, { - "base_unit": "cubic-second-square-ampere-per-kilogram-square-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + }, + { + "power": -1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 1 ], @@ -2863,7 +4456,24 @@ "exactness": "Exact" }, { - "base_unit": "square-meter-per-square-second", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -2881,7 +4491,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 57, 169, @@ -2908,7 +4527,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-cubic-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 0, 0, @@ -2937,7 +4581,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 0, 0, @@ -2967,7 +4620,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 32, 138, @@ -2988,7 +4650,16 @@ "exactness": "Exact" }, { - "base_unit": "square-revolution", + "basic_units": [ + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 118 + } + ], "factor_num": [ 0, 105, @@ -3019,7 +4690,16 @@ "exactness": "Approximate" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 163, 227, @@ -3043,7 +4723,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 2 ], @@ -3062,7 +4751,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 153, 25, @@ -3088,7 +4786,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 51, 179, @@ -3114,7 +4821,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-per-square-second-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -3132,7 +4864,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 208, 128, @@ -3153,7 +4910,16 @@ "exactness": "Exact" }, { - "base_unit": "cubic-meter", + "basic_units": [ + { + "power": 3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 97, 9 @@ -3174,7 +4940,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 133, 32, @@ -3196,7 +4971,16 @@ "exactness": "Exact" }, { - "base_unit": "kilogram", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + } + ], "factor_num": [ 232, 3 @@ -3215,7 +4999,40 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-cubic-second-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -3233,7 +5050,32 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-cubic-second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -3, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 1 ], @@ -3251,7 +5093,40 @@ "exactness": "Exact" }, { - "base_unit": "kilogram-square-meter-per-square-second-ampere", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 3, + "base": "Decimal" + }, + "unit_id": 58 + }, + { + "power": 2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + }, + { + "power": -2, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + }, + { + "power": -1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 2 + } + ], "factor_num": [ 1 ], @@ -3269,7 +5144,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 128, 58, @@ -3289,7 +5173,16 @@ "exactness": "Exact" }, { - "base_unit": "second", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 124 + } + ], "factor_num": [ 128, 58, @@ -3309,7 +5202,16 @@ "exactness": "Exact" }, { - "base_unit": "meter", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 83 + } + ], "factor_num": [ 119, 4 @@ -3329,7 +5231,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 1 ], @@ -3347,7 +5258,16 @@ "exactness": "Exact" }, { - "base_unit": "year", + "basic_units": [ + { + "power": 1, + "si_prefix": { + "power": 0, + "base": "Decimal" + }, + "unit_id": 150 + } + ], "factor_num": [ 1 ], diff --git a/provider/datagen/tests/data/postcard/fingerprints.csv b/provider/datagen/tests/data/postcard/fingerprints.csv index e1343be74ce..7ebce7fb438 100644 --- a/provider/datagen/tests/data/postcard/fingerprints.csv +++ b/provider/datagen/tests/data/postcard/fingerprints.csv @@ -5649,4 +5649,4 @@ transliterator/rules@1, und-x-und-t-und-d0-test-m0-niels-s0-test, 1769B, 4540044 transliterator/rules@1, und-x-und-t-und-d0-test-m0-rectesta-s0-test, 369B, 69c41d4b5c828833 transliterator/rules@1, und-x-und-t-und-d0-test-m0-rectestr-s0-test, 237B, 3345ed066cbb729f transliterator/rules@1, und-x-und-t-und-latn-d0-ascii, 27083B, bb4fc0b86c032865 -units/info@1, und, 8946B, 3799c2f43c4acfe1 +units/info@1, und, 7910B, 45432a2a50879033