diff --git a/components/collator/README.md b/components/collator/README.md index d9efb82635e..d2ef6a67f75 100644 --- a/components/collator/README.md +++ b/components/collator/README.md @@ -20,7 +20,7 @@ Create a directory `$PROJECTS/localicu` Create a directory `$PROJECTS/icu-build` and `cd` into it. -Run `../icu/icu4c/source/runConfigureICU --enable-debug Linux --prefix /opt/Projects/localicu --enable-static` +Run `../icu/icu4c/source/runConfigureICU --enable-debug Linux --prefix $PROJECTS/localicu --enable-static` Run `make` diff --git a/components/collator/src/lib.rs b/components/collator/src/lib.rs index ef495def545..c47eb454ff1 100644 --- a/components/collator/src/lib.rs +++ b/components/collator/src/lib.rs @@ -39,7 +39,7 @@ //! //! Create a directory `$PROJECTS/icu-build` and `cd` into it. //! -//! Run `../icu/icu4c/source/runConfigureICU --enable-debug Linux --prefix /opt/Projects/localicu --enable-static` +//! Run `../icu/icu4c/source/runConfigureICU --enable-debug Linux --prefix $PROJECTS/localicu --enable-static` //! //! Run `make` //! diff --git a/components/normalizer/src/lib.rs b/components/normalizer/src/lib.rs index 1984f2a79cf..d6b5e862bc0 100644 --- a/components/normalizer/src/lib.rs +++ b/components/normalizer/src/lib.rs @@ -78,6 +78,7 @@ use alloc::string::String; use alloc::vec::Vec; use core::char::REPLACEMENT_CHARACTER; use icu_char16trie::char16trie::Char16Trie; +use icu_char16trie::char16trie::Char16TrieIterator; use icu_char16trie::char16trie::TrieResult; use icu_codepointtrie::CodePointTrie; use icu_properties::maps::{CodePointMapData, CodePointMapDataBorrowed}; @@ -94,6 +95,7 @@ use provider::CompatibilityDecompositionTablesV1Marker; use provider::CompositionPassthroughV1; use provider::DecompositionSupplementV1; use provider::DecompositionTablesV1; +use provider::NonRecursiveDecompositionSupplementV1Marker; #[cfg(any(test, feature = "experimental"))] use provider::Uts46CompositionPassthroughV1Marker; use smallvec::SmallVec; @@ -245,6 +247,70 @@ fn in_inclusive_range(c: char, start: char, end: char) -> bool { u32::from(c).wrapping_sub(u32::from(start)) <= (u32::from(end) - u32::from(start)) } +/// Performs canonical composition (including Hangul) on a pair of +/// characters or returns `None` if these characters don't compose. +/// Composition exclusions are taken into account. +#[inline] +fn compose(iter: Char16TrieIterator, starter: char, second: char) -> Option { + let v = u32::from(second).wrapping_sub(HANGUL_V_BASE); + if v >= HANGUL_JAMO_LIMIT - HANGUL_V_BASE { + return compose_non_hangul(iter, starter, second); + } + if v < HANGUL_V_COUNT { + let l = u32::from(starter).wrapping_sub(HANGUL_L_BASE); + if l < HANGUL_L_COUNT { + let lv = l * HANGUL_N_COUNT + v * HANGUL_T_COUNT; + // Safe, because the inputs are known to be in range. + return Some(unsafe { char::from_u32_unchecked(HANGUL_S_BASE + lv) }); + } + return None; + } + if in_inclusive_range(second, '\u{11A8}', '\u{11C2}') { + let lv = u32::from(starter).wrapping_sub(HANGUL_S_BASE); + if lv < HANGUL_S_COUNT && lv % HANGUL_T_COUNT == 0 { + let lvt = lv + (u32::from(second) - HANGUL_T_BASE); + // Safe, because the inputs are known to be in range. + return Some(unsafe { char::from_u32_unchecked(HANGUL_S_BASE + lvt) }); + } + } + None +} + +/// Performs (non-Hangul) canonical composition on a pair of characters +/// or returns `None` if these characters don't compose. Composition +/// exclusions are taken into account. +fn compose_non_hangul(mut iter: Char16TrieIterator, starter: char, second: char) -> Option { + // To make the trie smaller, the pairs are stored second character first. + // Given how this method is used in ways where it's known that `second` + // is or isn't a starter. We could potentially split the trie into two + // tries depending on whether `second` is a starter. + match iter.next(second) { + TrieResult::NoMatch => None, + TrieResult::NoValue => match iter.next(starter) { + TrieResult::NoMatch => None, + TrieResult::FinalValue(i) => { + if let Some(c) = char::from_u32(i as u32) { + Some(c) + } else { + // GIGO case + debug_assert!(false); + None + } + } + TrieResult::NoValue | TrieResult::Intermediate(_) => { + // GIGO case + debug_assert!(false); + None + } + }, + TrieResult::FinalValue(_) | TrieResult::Intermediate(_) => { + // GIGO case + debug_assert!(false); + None + } + } +} + /// Pack a `char` and a `CanonicalCombiningClass` in /// 32 bits (the former in the lower 24 bits and the /// latter in the high 8 bits). The latter is @@ -819,66 +885,17 @@ where /// Performs canonical composition (including Hangul) on a pair of /// characters or returns `None` if these characters don't compose. /// Composition exclusions are taken into account. - #[inline] + #[inline(always)] pub fn compose(&self, starter: char, second: char) -> Option { - let v = u32::from(second).wrapping_sub(HANGUL_V_BASE); - if v >= HANGUL_JAMO_LIMIT - HANGUL_V_BASE { - return self.compose_non_hangul(starter, second); - } - if v < HANGUL_V_COUNT { - let l = u32::from(starter).wrapping_sub(HANGUL_L_BASE); - if l < HANGUL_L_COUNT { - let lv = l * HANGUL_N_COUNT + v * HANGUL_T_COUNT; - // Safe, because the inputs are known to be in range. - return Some(unsafe { char::from_u32_unchecked(HANGUL_S_BASE + lv) }); - } - return None; - } - if in_inclusive_range(second, '\u{11A8}', '\u{11C2}') { - let lv = u32::from(starter).wrapping_sub(HANGUL_S_BASE); - if lv < HANGUL_S_COUNT && lv % HANGUL_T_COUNT == 0 { - let lvt = lv + (u32::from(second) - HANGUL_T_BASE); - // Safe, because the inputs are known to be in range. - return Some(unsafe { char::from_u32_unchecked(HANGUL_S_BASE + lvt) }); - } - } - None + compose(self.canonical_compositions.iter(), starter, second) } /// Performs (non-Hangul) canonical composition on a pair of characters /// or returns `None` if these characters don't compose. Composition /// exclusions are taken into account. + #[inline(always)] fn compose_non_hangul(&self, starter: char, second: char) -> Option { - let mut iter = self.canonical_compositions.iter(); - // To make the trie smaller, the pairs are stored second character first. - // Given how this method is used in ways where it's known that `second` - // is or isn't a starter. We could potentially split the trie into two - // tries depending on whether `second` is a starter. - match iter.next(second) { - TrieResult::NoMatch => None, - TrieResult::NoValue => match iter.next(starter) { - TrieResult::NoMatch => None, - TrieResult::FinalValue(i) => { - if let Some(c) = char::from_u32(i as u32) { - Some(c) - } else { - // GIGO case - debug_assert!(false); - None - } - } - TrieResult::NoValue | TrieResult::Intermediate(_) => { - // GIGO case - debug_assert!(false); - None - } - }, - TrieResult::FinalValue(_) | TrieResult::Intermediate(_) => { - // GIGO case - debug_assert!(false); - None - } - } + compose_non_hangul(self.canonical_compositions.iter(), starter, second) } } @@ -1573,5 +1590,272 @@ impl ComposingNormalizer { normalizer_methods!(); } +/// A struct for providing the raw canonical composition operation. +/// +/// Callers should generally use `ComposingNormalizer` instead of this API. +/// However, this API is provided for callers such as HarfBuzz that specifically +/// want access to the raw canonical composition operation e.g. for use in a +/// glyph-availability-guided custom normalizer. +pub struct CanonicalComposition { + canonical_compositions: DataPayload, +} + +impl CanonicalComposition { + /// Performs canonical composition (including Hangul) on a pair of + /// characters or returns `None` if these characters don't compose. + /// Composition exclusions are taken into account. + /// + /// ``` + /// let data_provider = icu_testdata::get_provider(); + /// let comp = icu_normalizer::CanonicalComposition::try_new(&data_provider).unwrap(); + /// + /// assert_eq!(comp.compose('a', 'b'), None); // Just two non-composing starters + /// assert_eq!(comp.compose('a', '\u{0308}'), Some('ä')); + /// assert_eq!(comp.compose('ẹ', '\u{0302}'), Some('ệ')); + /// assert_eq!(comp.compose('𝅗', '𝅥'), None); // Composition exclusion + /// assert_eq!(comp.compose('ে', 'া'), Some('ো')); // Second is starter + /// assert_eq!(comp.compose('ᄀ', 'ᅡ'), Some('가')); // Hangul LV + /// assert_eq!(comp.compose('가', 'ᆨ'), Some('각')); // Hangul LVT + /// ``` + #[inline(always)] + pub fn compose(&self, starter: char, second: char) -> Option { + compose( + self.canonical_compositions + .get() + .canonical_compositions + .iter(), + starter, + second, + ) + } + + /// Construct from data provider. + pub fn try_new(data_provider: &D) -> Result + where + D: ResourceProvider + ?Sized, + { + let canonical_compositions: DataPayload = data_provider + .load_resource(&DataRequest::default())? + .take_payload()?; + Ok(CanonicalComposition { + canonical_compositions, + }) + } +} + +/// The outcome of non-recursive canonical decomposition of a character. +#[allow(clippy::exhaustive_enums)] +#[derive(Debug, PartialEq, Eq)] +pub enum Decomposed { + /// The character is its own canonical decomposition. + Default, + /// The character decomposes to a single different character. + Singleton(char), + /// The character decomposes to two characters. + Expansion(char, char), +} + +/// A struct for providing the raw (non-recursive) canonical decomposition operation. +/// +/// Callers should generally use `DecomposingNormalizer` instead of this API. +/// However, this API is provided for callers such as HarfBuzz that specifically +/// want access to non-recursive canonical decomposition e.g. for use in a +/// glyph-availability-guided custom normalizer. +pub struct CanonicalDecomposition { + decompositions: DataPayload, + tables: DataPayload, + non_recursive: DataPayload, +} + +impl CanonicalDecomposition { + /// Performs non-recursive canonical decomposition (including for Hangul). + /// + /// ``` + /// use icu_normalizer::Decomposed; + /// let data_provider = icu_testdata::get_provider(); + /// let decomp = icu_normalizer::CanonicalDecomposition::try_new(&data_provider).unwrap(); + /// + /// assert_eq!(decomp.decompose('e'), Decomposed::Default); + /// assert_eq!( + /// decomp.decompose('ệ'), + /// Decomposed::Expansion('ẹ', '\u{0302}') + /// ); + /// assert_eq!(decomp.decompose('각'), Decomposed::Expansion('가', 'ᆨ')); + /// assert_eq!(decomp.decompose('\u{212B}'), Decomposed::Singleton('Å')); // ANGSTROM SIGN + /// assert_eq!(decomp.decompose('\u{2126}'), Decomposed::Singleton('Ω')); // OHM SIGN + /// assert_eq!(decomp.decompose('\u{1F71}'), Decomposed::Singleton('ά')); // oxia + /// ``` + #[inline] + pub fn decompose(&self, c: char) -> Decomposed { + let lvt = u32::from(c).wrapping_sub(HANGUL_S_BASE); + if lvt >= HANGUL_S_COUNT { + return self.decompose_non_hangul(c); + } + let t = lvt % HANGUL_T_COUNT; + if t == 0 { + let l = lvt / HANGUL_N_COUNT; + let v = (lvt % HANGUL_N_COUNT) / HANGUL_T_COUNT; + // Safe because values known to be in range + return Decomposed::Expansion( + unsafe { char::from_u32_unchecked(HANGUL_L_BASE + l) }, + unsafe { char::from_u32_unchecked(HANGUL_V_BASE + v) }, + ); + } + let lv = lvt - t; + // Safe because values known to be in range + Decomposed::Expansion( + unsafe { char::from_u32_unchecked(HANGUL_S_BASE + lv) }, + unsafe { char::from_u32_unchecked(HANGUL_T_BASE + t) }, + ) + } + + /// Performs non-recursive canonical decomposition except Hangul syllables + /// are reported as `Decomposed::Default`. + #[inline(always)] + fn decompose_non_hangul(&self, c: char) -> Decomposed { + let decomposition = self.decompositions.get().trie.get(u32::from(c)); + if decomposition == 0 { + return Decomposed::Default; + } + // The loop is only broken out of as goto forward + #[allow(clippy::never_loop)] + loop { + let high = (decomposition >> 16) as u16; + let low = decomposition as u16; + if high != 0 && low != 0 { + // Decomposition into two BMP characters: starter and non-starter + if in_inclusive_range(c, '\u{1F71}', '\u{1FFB}') { + // Look in the other trie due to oxia singleton + // mappings to corresponding character with tonos. + break; + } else if c == '\u{212B}' { + // ANGSTROM SIGN + return Decomposed::Singleton('\u{00C5}'); + } + return Decomposed::Expansion(char_from_u16(high), char_from_u16(low)); + } + if high != 0 { + // Decomposition into one BMP character + return Decomposed::Singleton(char_from_u16(high)); + } + // Complex decomposition + // Format for 16-bit value: + // 15..13: length minus two for 16-bit case and length minus one for + // the 32-bit case. Length 8 needs to fit in three bits in + // the 16-bit case, and this way the value is future-proofed + // up to 9 in the 16-bit case. Zero is unused and length one + // in the 16-bit case goes directly into the trie. + // 12: 1 if all trailing characters are guaranteed non-starters, + // 0 if no guarantees about non-starterness. + // Note: The bit choice is this way around to allow for + // dynamically falling back to not having this but instead + // having one more bit for length by merely choosing + // different masks. + // 11..0: Start offset in storage. The offset is to the logical + // sequence of scalars16, scalars32, supplementary_scalars16, + // supplementary_scalars32. + let offset = usize::from(low & 0xFFF); + let tables = self.tables.get(); + if offset < tables.scalars16.len() { + if usize::from(low >> 13) != 0 { + // i.e. logical len isn't 2 + break; + } + if let Some(first) = tables.scalars16.get(offset) { + if let Some(second) = tables.scalars16.get(offset + 1) { + // Two BMP starters + return Decomposed::Expansion(char_from_u16(first), char_from_u16(second)); + } + } + // GIGO case + debug_assert!(false); + return Decomposed::Default; + } + let len = usize::from(low >> 13) + 1; + if len > 2 { + break; + } + let offset24 = offset - tables.scalars16.len(); + if let Some(first) = tables.scalars24.get(offset24) { + let first_c = char_from_u24(first); + if len == 1 { + return Decomposed::Singleton(first_c); + } + if let Some(second) = tables.scalars24.get(offset24 + 1) { + let second_c = char_from_u24(second); + return Decomposed::Expansion(first_c, second_c); + } + } + // GIGO case + debug_assert!(false); + return Decomposed::Default; + } + let non_recursive = self.non_recursive.get(); + let non_recursive_decomposition = non_recursive.trie.get(u32::from(c)); + if non_recursive_decomposition == 0 { + // GIGO case + debug_assert!(false); + return Decomposed::Default; + } + let high = (non_recursive_decomposition >> 16) as u16; + let low = non_recursive_decomposition as u16; + if high != 0 && low != 0 { + // Decomposition into two BMP characters + return Decomposed::Expansion(char_from_u16(high), char_from_u16(low)); + } + if high != 0 { + // Decomposition into one BMP character + return Decomposed::Singleton(char_from_u16(high)); + } + // Decomposition into two non-BMP characters + // Low is offset into a table plus one to keep it non-zero. + let offset = usize::from(low - 1); + if let Some(first) = non_recursive.scalars24.get(offset) { + if let Some(second) = non_recursive.scalars24.get(offset + 1) { + return Decomposed::Expansion(char_from_u24(first), char_from_u24(second)); + } + } + // GIGO case + debug_assert!(false); + Decomposed::Default + } + + /// Construct from data provider. + pub fn try_new(data_provider: &D) -> Result + where + D: ResourceProvider + + ResourceProvider + + ResourceProvider + + ?Sized, + { + let decompositions: DataPayload = data_provider + .load_resource(&DataRequest::default())? + .take_payload()?; + let tables: DataPayload = data_provider + .load_resource(&DataRequest::default())? + .take_payload()?; + + if tables.get().scalars16.len() + tables.get().scalars24.len() > 0xFFF { + // The data is from a future where there exists a normalization flavor whose + // complex decompositions take more than 0xFFF but fewer than 0x1FFF code points + // of space. If a good use case from such a decomposition flavor arises, we can + // dynamically change the bit masks so that the length mask becomes 0x1FFF instead + // of 0xFFF and the all-non-starters mask becomes 0 instead of 0x1000. However, + // since for now the masks are hard-coded, error out. + return Err(NormalizerError::FutureExtension); + } + + let non_recursive: DataPayload = data_provider + .load_resource(&DataRequest::default())? + .take_payload()?; + + Ok(CanonicalDecomposition { + decompositions, + tables, + non_recursive, + }) + } +} + #[cfg(all(test, feature = "serde"))] mod tests; diff --git a/components/normalizer/src/provider.rs b/components/normalizer/src/provider.rs index 0fe882ec25f..e5a544300a6 100644 --- a/components/normalizer/src/provider.rs +++ b/components/normalizer/src/provider.rs @@ -124,3 +124,19 @@ pub struct CompositionPassthroughV1<'data> { #[cfg_attr(feature = "serde", serde(borrow))] pub potential_passthrough_and_not_backward_combining: UnicodeSet<'data>, } + +/// Non-recursive canonical decompositions that differ from +/// `DecompositionDataV1`. +#[icu_provider::data_struct(NonRecursiveDecompositionSupplementV1Marker = "normalizer/decomp@1")] +#[derive(Debug, PartialEq, Clone)] +#[cfg_attr(feature = "datagen", derive(serde::Serialize, databake::Bake), databake(path = icu_normalizer::provider))] +#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +pub struct NonRecursiveDecompositionSupplementV1<'data> { + /// Trie for the supplementary non-recursive decompositions + #[cfg_attr(feature = "serde", serde(borrow))] + pub trie: CodePointTrie<'data, u32>, + /// Decompositions with at least one character outside + /// the BMP + #[cfg_attr(feature = "serde", serde(borrow))] + pub scalars24: ZeroVec<'data, U24>, +} diff --git a/components/normalizer/src/tests.rs b/components/normalizer/src/tests.rs index 189ccb427f5..28a8108d2d2 100644 --- a/components/normalizer/src/tests.rs +++ b/components/normalizer/src/tests.rs @@ -2,7 +2,10 @@ // called LICENSE at the top level of the ICU4X source tree // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). +use crate::CanonicalComposition; +use crate::CanonicalDecomposition; use crate::ComposingNormalizer; +use crate::Decomposed; use crate::DecomposingNormalizer; #[test] @@ -340,3 +343,67 @@ fn test_hangul() { assert!(norm_iter.eq("A\u{AC1B}".chars())); } } + +#[test] +fn test_canonical_composition() { + let data_provider = icu_testdata::get_provider(); + let comp = CanonicalComposition::try_new(&data_provider).unwrap(); + + assert_eq!(comp.compose('a', 'b'), None); // Just two starters + + assert_eq!(comp.compose('a', '\u{0308}'), Some('ä')); + assert_eq!(comp.compose('A', '\u{0308}'), Some('Ä')); + assert_eq!(comp.compose('ẹ', '\u{0302}'), Some('ệ')); + assert_eq!(comp.compose('Ẹ', '\u{0302}'), Some('Ệ')); + assert_eq!(comp.compose('\u{1D157}', '\u{1D165}'), None); // Composition exclusion + + assert_eq!(comp.compose('ে', 'া'), Some('ো')); // Second is starter; BMP + assert_eq!(comp.compose('𑄱', '𑄧'), Some('𑄮')); // Second is starter; non-BMP + + assert_eq!(comp.compose('ᄀ', 'ᅡ'), Some('가')); // Hangul LV + assert_eq!(comp.compose('가', 'ᆨ'), Some('각')); // Hangul LVT +} + +#[test] +fn test_canonical_decomposition() { + let data_provider = icu_testdata::get_provider(); + let decomp = CanonicalDecomposition::try_new(&data_provider).unwrap(); + + assert_eq!( + decomp.decompose('ä'), + Decomposed::Expansion('a', '\u{0308}') + ); + assert_eq!( + decomp.decompose('Ä'), + Decomposed::Expansion('A', '\u{0308}') + ); + assert_eq!( + decomp.decompose('ệ'), + Decomposed::Expansion('ẹ', '\u{0302}') + ); + assert_eq!( + decomp.decompose('Ệ'), + Decomposed::Expansion('Ẹ', '\u{0302}') + ); + assert_eq!( + decomp.decompose('\u{1D15E}'), + Decomposed::Expansion('\u{1D157}', '\u{1D165}') + ); + assert_eq!(decomp.decompose('ো'), Decomposed::Expansion('ে', 'া')); + assert_eq!(decomp.decompose('𑄮'), Decomposed::Expansion('𑄱', '𑄧')); + assert_eq!(decomp.decompose('가'), Decomposed::Expansion('ᄀ', 'ᅡ')); + assert_eq!(decomp.decompose('각'), Decomposed::Expansion('가', 'ᆨ')); + + assert_eq!(decomp.decompose('\u{212B}'), Decomposed::Singleton('Å')); // ANGSTROM SIGN + assert_eq!(decomp.decompose('\u{2126}'), Decomposed::Singleton('Ω')); // OHM SIGN + + assert_eq!(decomp.decompose('\u{1F71}'), Decomposed::Singleton('ά')); // oxia + assert_eq!( + decomp.decompose('\u{1F72}'), + Decomposed::Expansion('ε', '\u{0300}') + ); // not oxia but in the oxia range + assert_eq!( + decomp.decompose('ά'), + Decomposed::Expansion('α', '\u{0301}') + ); // tonos +} diff --git a/provider/datagen/src/registry.rs b/provider/datagen/src/registry.rs index b496d79cf63..426c23b99ee 100644 --- a/provider/datagen/src/registry.rs +++ b/provider/datagen/src/registry.rs @@ -44,6 +44,8 @@ pub fn all_keys() -> Vec { icu_normalizer::provider::CompatibilityCompositionPassthroughV1Marker::KEY, #[cfg(feature = "experimental")] icu_normalizer::provider::Uts46CompositionPassthroughV1Marker::KEY, + #[cfg(feature = "experimental")] + icu_normalizer::provider::NonRecursiveDecompositionSupplementV1Marker::KEY, ]; v.extend(icu_properties::provider::ALL_KEYS); #[cfg(feature = "experimental")] @@ -190,6 +192,7 @@ macro_rules! create_datagen_provider { $crate::transform::icuexport::normalizer::CanonicalCompositionPassthroughProvider, $crate::transform::icuexport::normalizer::CompatibilityCompositionPassthroughProvider, $crate::transform::icuexport::normalizer::Uts46CompositionPassthroughProvider, + $crate::transform::icuexport::normalizer::NonRecursiveDecompositionSupplementProvider, $crate::transform::icuexport::ucase::CaseMappingDataProvider, $crate::transform::icuexport::uprops::EnumeratedPropertyCodePointTrieProvider, $crate::transform::icuexport::uprops::ScriptWithExtensionsPropertyProvider, diff --git a/provider/datagen/src/transform/icuexport/normalizer/mod.rs b/provider/datagen/src/transform/icuexport/normalizer/mod.rs index 2369962a9bc..26a507b98b5 100644 --- a/provider/datagen/src/transform/icuexport/normalizer/mod.rs +++ b/provider/datagen/src/transform/icuexport/normalizer/mod.rs @@ -191,6 +191,39 @@ macro_rules! normalization_canonical_compositions_provider { }; } +macro_rules! normalization_non_recursive_decomposition_supplement_provider { + ($marker:ident, $provider:ident, $file_name:literal) => { + normalization_provider!( + $marker, + $provider, + NonRecursiveDecompositionSupplement, + $file_name, + { + let trie = CodePointTrie::::try_from(&toml_data.trie) + .map_err(|e| DataError::custom("trie conversion").with_display_context(&e))?; + let mut scalars24: Vec = Vec::new(); + for &u in toml_data.scalars32.iter() { + scalars24.push( + u.try_into() + .map_err(|_| DataError::custom("scalars24 conversion"))?, + ); + } + + Ok(DataResponse { + metadata: DataResponseMetadata::default(), + payload: Some(DataPayload::from_owned( + NonRecursiveDecompositionSupplementV1 { + trie, + scalars24: ZeroVec::alloc_from_slice(&scalars24), + }, + )), + }) + }, + toml_data // simply matches the identifier in the above block + ); + }; +} + normalization_data_provider!( CanonicalDecompositionDataV1Marker, CanonicalDecompositionDataProvider, @@ -257,3 +290,9 @@ normalization_canonical_compositions_provider!( CanonicalCompositionsProvider, "compositions" ); + +normalization_non_recursive_decomposition_supplement_provider!( + NonRecursiveDecompositionSupplementV1Marker, + NonRecursiveDecompositionSupplementProvider, + "decompositionex" +); diff --git a/provider/datagen/src/transform/icuexport/normalizer/normalizer_serde.rs b/provider/datagen/src/transform/icuexport/normalizer/normalizer_serde.rs index 32cc91cb100..8516b8303e5 100644 --- a/provider/datagen/src/transform/icuexport/normalizer/normalizer_serde.rs +++ b/provider/datagen/src/transform/icuexport/normalizer/normalizer_serde.rs @@ -31,3 +31,9 @@ pub struct CompositionPassthrough { pub struct CanonicalCompositions { pub compositions: Vec, } + +#[derive(serde::Deserialize)] +pub struct NonRecursiveDecompositionSupplement { + pub trie: CodePointTrieToml, + pub scalars32: Vec, +} diff --git a/provider/testdata/data/baked/any.rs b/provider/testdata/data/baked/any.rs index d5df1f6369f..afc5e632dac 100644 --- a/provider/testdata/data/baked/any.rs +++ b/provider/testdata/data/baked/any.rs @@ -49,6 +49,8 @@ impl AnyProvider for BakedDataProvider { ::icu_normalizer::provider::CompatibilityDecompositionSupplementV1Marker::KEY.get_hash(); const COMPATIBILITYDECOMPOSITIONTABLESV1MARKER: ::icu_provider::ResourceKeyHash = ::icu_normalizer::provider::CompatibilityDecompositionTablesV1Marker::KEY.get_hash(); + const NONRECURSIVEDECOMPOSITIONSUPPLEMENTV1MARKER: ::icu_provider::ResourceKeyHash = + ::icu_normalizer::provider::NonRecursiveDecompositionSupplementV1Marker::KEY.get_hash(); const UTS46COMPOSITIONPASSTHROUGHV1MARKER: ::icu_provider::ResourceKeyHash = ::icu_normalizer::provider::Uts46CompositionPassthroughV1Marker::KEY.get_hash(); const UTS46DECOMPOSITIONSUPPLEMENTV1MARKER: ::icu_provider::ResourceKeyHash = @@ -252,6 +254,9 @@ impl AnyProvider for BakedDataProvider { COMPATIBILITYDECOMPOSITIONTABLESV1MARKER => AnyPayload::from_static_ref::< <::icu_normalizer::provider::CompatibilityDecompositionTablesV1Marker as DataMarker>::Yokeable, >(litemap_slice_get(normalizer::nfkdex_v1::DATA, key, req)?), + NONRECURSIVEDECOMPOSITIONSUPPLEMENTV1MARKER => AnyPayload::from_static_ref::< + <::icu_normalizer::provider::NonRecursiveDecompositionSupplementV1Marker as DataMarker>::Yokeable, + >(litemap_slice_get(normalizer::decomp_v1::DATA, key, req)?), UTS46COMPOSITIONPASSTHROUGHV1MARKER => AnyPayload::from_static_ref::< <::icu_normalizer::provider::Uts46CompositionPassthroughV1Marker as DataMarker>::Yokeable, >(litemap_slice_get(normalizer::uts46_v1::DATA, key, req)?), diff --git a/provider/testdata/data/baked/mod.rs b/provider/testdata/data/baked/mod.rs index 68bf63157c7..e8aa026f762 100644 --- a/provider/testdata/data/baked/mod.rs +++ b/provider/testdata/data/baked/mod.rs @@ -497,6 +497,19 @@ impl ResourceProvider<::icu_normalizer::provider::CompatibilityDecompositionTabl Ok (DataResponse { metadata : Default :: default () , payload : Some (DataPayload :: from_owned (zerofrom :: ZeroFrom :: zero_from (litemap_slice_get (normalizer :: nfkdex_v1 :: DATA , < :: icu_normalizer :: provider :: CompatibilityDecompositionTablesV1Marker as ResourceMarker > :: KEY , req) ? ,))) , }) } } +impl ResourceProvider<::icu_normalizer::provider::NonRecursiveDecompositionSupplementV1Marker> + for BakedDataProvider +{ + fn load_resource( + &self, + req: &DataRequest, + ) -> Result< + DataResponse<::icu_normalizer::provider::NonRecursiveDecompositionSupplementV1Marker>, + DataError, + > { + Ok (DataResponse { metadata : Default :: default () , payload : Some (DataPayload :: from_owned (zerofrom :: ZeroFrom :: zero_from (litemap_slice_get (normalizer :: decomp_v1 :: DATA , < :: icu_normalizer :: provider :: NonRecursiveDecompositionSupplementV1Marker as ResourceMarker > :: KEY , req) ? ,))) , }) + } +} impl ResourceProvider<::icu_normalizer::provider::Uts46CompositionPassthroughV1Marker> for BakedDataProvider { diff --git a/provider/testdata/data/baked/normalizer/decomp_v1.rs b/provider/testdata/data/baked/normalizer/decomp_v1.rs new file mode 100644 index 00000000000..186b7d94cd0 --- /dev/null +++ b/provider/testdata/data/baked/normalizer/decomp_v1.rs @@ -0,0 +1,296 @@ +// @generated +type DataStruct = & 'static < :: icu_normalizer :: provider :: NonRecursiveDecompositionSupplementV1Marker as :: icu_provider :: DataMarker > :: Yokeable ; +pub static DATA: &[(&str, DataStruct)] = &[("und", UND)]; +static UND: DataStruct = &::icu_normalizer::provider::NonRecursiveDecompositionSupplementV1 { + trie: ::icu_codepointtrie::CodePointTrie::from_parts( + ::icu_codepointtrie::CodePointTrieHeader { + high_start: 119296u32, + shifted12_high_start: 30u16, + index3_null_offset: 15u16, + data_null_offset: 0u32, + null_value: 0u32, + trie_type: ::icu_codepointtrie::TrieType::Small, + }, + unsafe { + ::zerovec::ZeroVec::from_bytes_unchecked(&[ + 0u8, 0u8, 64u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 107u8, 0u8, + 167u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 217u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 14u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 49u8, 1u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 11u8, 1u8, 27u8, 1u8, 27u8, 1u8, 30u8, 1u8, 27u8, 1u8, 27u8, 1u8, 27u8, 1u8, 60u8, + 1u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 64u8, 0u8, 80u8, 0u8, 96u8, 0u8, + 112u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, + 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, + 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 107u8, 0u8, 123u8, + 0u8, 139u8, 0u8, 155u8, 0u8, 167u8, 0u8, 183u8, 0u8, 199u8, 0u8, 215u8, 0u8, 0u8, + 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, + 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, + 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 217u8, 0u8, 233u8, 0u8, 249u8, 0u8, + 9u8, 1u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, + 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, + 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, + 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, + 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 14u8, 1u8, 30u8, 1u8, 46u8, 1u8, 62u8, 1u8, 0u8, + 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, + 0u8, 0u8, 16u8, 0u8, 32u8, 0u8, 48u8, 0u8, 49u8, 1u8, 65u8, 1u8, 81u8, 1u8, 97u8, + 1u8, 105u8, 1u8, 117u8, 1u8, 131u8, 1u8, 147u8, 1u8, 157u8, 1u8, 173u8, 1u8, 187u8, + 1u8, 197u8, 1u8, 0u8, 0u8, 0u8, 0u8, 209u8, 1u8, 225u8, 1u8, 241u8, 1u8, 1u8, 2u8, + 17u8, 2u8, 33u8, 2u8, 47u8, 2u8, 63u8, 2u8, 77u8, 2u8, 93u8, 2u8, 109u8, 2u8, + 123u8, 2u8, 139u8, 2u8, 155u8, 2u8, 171u8, 2u8, 187u8, 2u8, 203u8, 2u8, 219u8, 2u8, + 234u8, 2u8, 250u8, 2u8, 10u8, 3u8, 26u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 38u8, 3u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 54u8, 3u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 59u8, 3u8, 75u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 72u8, + 0u8, 104u8, 0u8, 132u8, 0u8, 132u8, 0u8, 132u8, 0u8, 132u8, 0u8, 152u8, 0u8, 132u8, + 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, + 184u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, + 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, + 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, + 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, + 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 216u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, + 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 15u8, 0u8, 235u8, 0u8, 238u8, 255u8, + ]) + }, + unsafe { + ::zerovec::ZeroVec::from_bytes_unchecked(&[ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 4u8, 3u8, 220u8, 0u8, 4u8, 3u8, 252u8, 0u8, 1u8, 3u8, 220u8, 0u8, 1u8, 3u8, 252u8, + 0u8, 12u8, 3u8, 220u8, 0u8, 12u8, 3u8, 252u8, 0u8, 0u8, 3u8, 220u8, 0u8, 0u8, 3u8, + 252u8, 0u8, 0u8, 0u8, 0u8, 0u8, 4u8, 3u8, 196u8, 0u8, 4u8, 3u8, 228u8, 0u8, 4u8, + 3u8, 38u8, 2u8, 4u8, 3u8, 39u8, 2u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 4u8, + 3u8, 234u8, 1u8, 4u8, 3u8, 235u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 197u8, 0u8, 1u8, 3u8, 229u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 4u8, 3u8, 214u8, 0u8, 4u8, 3u8, 246u8, 0u8, 4u8, + 3u8, 213u8, 0u8, 4u8, 3u8, 245u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 4u8, + 3u8, 46u8, 2u8, 4u8, 3u8, 47u8, 2u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 202u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 203u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 213u8, 12u8, 202u8, 12u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 202u8, 13u8, 220u8, + 13u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 199u8, 0u8, 1u8, 3u8, 231u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 18u8, 1u8, 0u8, 3u8, 19u8, + 1u8, 1u8, 3u8, 18u8, 1u8, 1u8, 3u8, 19u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 6u8, 3u8, 40u8, 2u8, 6u8, 3u8, 41u8, + 2u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 207u8, 0u8, 1u8, 3u8, 239u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 4u8, 3u8, 54u8, 30u8, 4u8, 3u8, 55u8, 30u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 213u8, 0u8, 1u8, 3u8, 245u8, + 0u8, 8u8, 3u8, 213u8, 0u8, 8u8, 3u8, 245u8, 0u8, 0u8, 3u8, 76u8, 1u8, 0u8, 3u8, + 77u8, 1u8, 1u8, 3u8, 76u8, 1u8, 1u8, 3u8, 77u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 4u8, 3u8, 90u8, 30u8, 4u8, 3u8, + 91u8, 30u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 7u8, 3u8, 90u8, 1u8, 7u8, 3u8, 91u8, 1u8, 7u8, 3u8, 96u8, 1u8, 7u8, 3u8, + 97u8, 1u8, 7u8, 3u8, 98u8, 30u8, 7u8, 3u8, 99u8, 30u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 104u8, 1u8, 1u8, + 3u8, 105u8, 1u8, 8u8, 3u8, 106u8, 1u8, 8u8, 3u8, 107u8, 1u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 194u8, 0u8, + 1u8, 3u8, 226u8, 0u8, 0u8, 3u8, 194u8, 0u8, 0u8, 3u8, 226u8, 0u8, 9u8, 3u8, 194u8, + 0u8, 9u8, 3u8, 226u8, 0u8, 3u8, 3u8, 194u8, 0u8, 3u8, 3u8, 226u8, 0u8, 2u8, 3u8, + 160u8, 30u8, 2u8, 3u8, 161u8, 30u8, 1u8, 3u8, 2u8, 1u8, 1u8, 3u8, 3u8, 1u8, 0u8, + 3u8, 2u8, 1u8, 0u8, 3u8, 3u8, 1u8, 9u8, 3u8, 2u8, 1u8, 9u8, 3u8, 3u8, 1u8, 3u8, + 3u8, 2u8, 1u8, 3u8, 3u8, 3u8, 1u8, 6u8, 3u8, 160u8, 30u8, 6u8, 3u8, 161u8, 30u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 202u8, 0u8, 1u8, 3u8, 234u8, 0u8, + 0u8, 3u8, 202u8, 0u8, 0u8, 3u8, 234u8, 0u8, 9u8, 3u8, 202u8, 0u8, 9u8, 3u8, 234u8, + 0u8, 3u8, 3u8, 202u8, 0u8, 3u8, 3u8, 234u8, 0u8, 2u8, 3u8, 184u8, 30u8, 2u8, 3u8, + 185u8, 30u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 1u8, 3u8, 212u8, 0u8, 1u8, 3u8, 244u8, 0u8, 0u8, 3u8, 212u8, 0u8, 0u8, + 3u8, 244u8, 0u8, 9u8, 3u8, 212u8, 0u8, 9u8, 3u8, 244u8, 0u8, 3u8, 3u8, 212u8, 0u8, + 3u8, 3u8, 244u8, 0u8, 2u8, 3u8, 204u8, 30u8, 2u8, 3u8, 205u8, 30u8, 1u8, 3u8, + 160u8, 1u8, 1u8, 3u8, 161u8, 1u8, 0u8, 3u8, 160u8, 1u8, 0u8, 3u8, 161u8, 1u8, 9u8, + 3u8, 160u8, 1u8, 9u8, 3u8, 161u8, 1u8, 3u8, 3u8, 160u8, 1u8, 3u8, 3u8, 161u8, 1u8, + 35u8, 3u8, 160u8, 1u8, 35u8, 3u8, 161u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 175u8, 1u8, 1u8, 3u8, 176u8, + 1u8, 0u8, 3u8, 175u8, 1u8, 0u8, 3u8, 176u8, 1u8, 9u8, 3u8, 175u8, 1u8, 9u8, 3u8, + 176u8, 1u8, 3u8, 3u8, 175u8, 1u8, 3u8, 3u8, 176u8, 1u8, 35u8, 3u8, 175u8, 1u8, + 35u8, 3u8, 176u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 0u8, 31u8, + 0u8, 3u8, 1u8, 31u8, 1u8, 3u8, 0u8, 31u8, 1u8, 3u8, 1u8, 31u8, 66u8, 3u8, 0u8, + 31u8, 66u8, 3u8, 1u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 8u8, + 31u8, 0u8, 3u8, 9u8, 31u8, 1u8, 3u8, 8u8, 31u8, 1u8, 3u8, 9u8, 31u8, 66u8, 3u8, + 8u8, 31u8, 66u8, 3u8, 9u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, + 16u8, 31u8, 0u8, 3u8, 17u8, 31u8, 1u8, 3u8, 16u8, 31u8, 1u8, 3u8, 17u8, 31u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 3u8, 24u8, 31u8, 0u8, 3u8, 25u8, 31u8, 1u8, 3u8, 24u8, 31u8, 1u8, 3u8, 25u8, 31u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 32u8, 31u8, 0u8, 3u8, 33u8, 31u8, + 1u8, 3u8, 32u8, 31u8, 1u8, 3u8, 33u8, 31u8, 66u8, 3u8, 32u8, 31u8, 66u8, 3u8, 33u8, + 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 40u8, 31u8, 0u8, 3u8, 41u8, + 31u8, 1u8, 3u8, 40u8, 31u8, 1u8, 3u8, 41u8, 31u8, 66u8, 3u8, 40u8, 31u8, 66u8, 3u8, + 41u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 48u8, 31u8, 0u8, 3u8, + 49u8, 31u8, 1u8, 3u8, 48u8, 31u8, 1u8, 3u8, 49u8, 31u8, 66u8, 3u8, 48u8, 31u8, + 66u8, 3u8, 49u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 56u8, + 31u8, 0u8, 3u8, 57u8, 31u8, 1u8, 3u8, 56u8, 31u8, 1u8, 3u8, 57u8, 31u8, 66u8, 3u8, + 56u8, 31u8, 66u8, 3u8, 57u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 3u8, 64u8, 31u8, 0u8, 3u8, 65u8, 31u8, 1u8, 3u8, 64u8, 31u8, 1u8, 3u8, 65u8, 31u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 3u8, 72u8, 31u8, 0u8, 3u8, 73u8, 31u8, 1u8, 3u8, 72u8, 31u8, 1u8, 3u8, 73u8, + 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 80u8, 31u8, 0u8, 3u8, 81u8, + 31u8, 1u8, 3u8, 80u8, 31u8, 1u8, 3u8, 81u8, 31u8, 66u8, 3u8, 80u8, 31u8, 66u8, 3u8, + 81u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, + 89u8, 31u8, 0u8, 0u8, 0u8, 0u8, 1u8, 3u8, 89u8, 31u8, 0u8, 0u8, 0u8, 0u8, 66u8, + 3u8, 89u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 96u8, 31u8, 0u8, + 3u8, 97u8, 31u8, 1u8, 3u8, 96u8, 31u8, 1u8, 3u8, 97u8, 31u8, 66u8, 3u8, 96u8, 31u8, + 66u8, 3u8, 97u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 104u8, + 31u8, 0u8, 3u8, 105u8, 31u8, 1u8, 3u8, 104u8, 31u8, 1u8, 3u8, 105u8, 31u8, 66u8, + 3u8, 104u8, 31u8, 66u8, 3u8, 105u8, 31u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 172u8, 3u8, + 0u8, 3u8, 181u8, 3u8, 0u8, 0u8, 173u8, 3u8, 0u8, 3u8, 183u8, 3u8, 0u8, 0u8, 174u8, + 3u8, 0u8, 3u8, 185u8, 3u8, 0u8, 0u8, 175u8, 3u8, 0u8, 3u8, 191u8, 3u8, 0u8, 0u8, + 204u8, 3u8, 0u8, 3u8, 197u8, 3u8, 0u8, 0u8, 205u8, 3u8, 0u8, 3u8, 201u8, 3u8, 0u8, + 0u8, 206u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 69u8, 3u8, 0u8, 31u8, + 69u8, 3u8, 1u8, 31u8, 69u8, 3u8, 2u8, 31u8, 69u8, 3u8, 3u8, 31u8, 69u8, 3u8, 4u8, + 31u8, 69u8, 3u8, 5u8, 31u8, 69u8, 3u8, 6u8, 31u8, 69u8, 3u8, 7u8, 31u8, 69u8, 3u8, + 8u8, 31u8, 69u8, 3u8, 9u8, 31u8, 69u8, 3u8, 10u8, 31u8, 69u8, 3u8, 11u8, 31u8, + 69u8, 3u8, 12u8, 31u8, 69u8, 3u8, 13u8, 31u8, 69u8, 3u8, 14u8, 31u8, 69u8, 3u8, + 15u8, 31u8, 69u8, 3u8, 32u8, 31u8, 69u8, 3u8, 33u8, 31u8, 69u8, 3u8, 34u8, 31u8, + 69u8, 3u8, 35u8, 31u8, 69u8, 3u8, 36u8, 31u8, 69u8, 3u8, 37u8, 31u8, 69u8, 3u8, + 38u8, 31u8, 69u8, 3u8, 39u8, 31u8, 69u8, 3u8, 40u8, 31u8, 69u8, 3u8, 41u8, 31u8, + 69u8, 3u8, 42u8, 31u8, 69u8, 3u8, 43u8, 31u8, 69u8, 3u8, 44u8, 31u8, 69u8, 3u8, + 45u8, 31u8, 69u8, 3u8, 46u8, 31u8, 69u8, 3u8, 47u8, 31u8, 69u8, 3u8, 96u8, 31u8, + 69u8, 3u8, 97u8, 31u8, 69u8, 3u8, 98u8, 31u8, 69u8, 3u8, 99u8, 31u8, 69u8, 3u8, + 100u8, 31u8, 69u8, 3u8, 101u8, 31u8, 69u8, 3u8, 102u8, 31u8, 69u8, 3u8, 103u8, + 31u8, 69u8, 3u8, 104u8, 31u8, 69u8, 3u8, 105u8, 31u8, 69u8, 3u8, 106u8, 31u8, 69u8, + 3u8, 107u8, 31u8, 69u8, 3u8, 108u8, 31u8, 69u8, 3u8, 109u8, 31u8, 69u8, 3u8, 110u8, + 31u8, 69u8, 3u8, 111u8, 31u8, 6u8, 3u8, 177u8, 3u8, 4u8, 3u8, 177u8, 3u8, 69u8, + 3u8, 112u8, 31u8, 69u8, 3u8, 177u8, 3u8, 69u8, 3u8, 172u8, 3u8, 0u8, 0u8, 0u8, 0u8, + 66u8, 3u8, 177u8, 3u8, 69u8, 3u8, 182u8, 31u8, 6u8, 3u8, 145u8, 3u8, 4u8, 3u8, + 145u8, 3u8, 0u8, 3u8, 145u8, 3u8, 0u8, 0u8, 134u8, 3u8, 69u8, 3u8, 145u8, 3u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 185u8, 3u8, 0u8, 0u8, 0u8, 0u8, 66u8, 3u8, 168u8, 0u8, + 69u8, 3u8, 116u8, 31u8, 69u8, 3u8, 183u8, 3u8, 69u8, 3u8, 174u8, 3u8, 0u8, 0u8, + 0u8, 0u8, 66u8, 3u8, 183u8, 3u8, 69u8, 3u8, 198u8, 31u8, 0u8, 3u8, 149u8, 3u8, 0u8, + 0u8, 136u8, 3u8, 0u8, 3u8, 151u8, 3u8, 0u8, 0u8, 137u8, 3u8, 69u8, 3u8, 151u8, 3u8, + 0u8, 3u8, 191u8, 31u8, 1u8, 3u8, 191u8, 31u8, 66u8, 3u8, 191u8, 31u8, 6u8, 3u8, + 185u8, 3u8, 4u8, 3u8, 185u8, 3u8, 0u8, 3u8, 202u8, 3u8, 0u8, 0u8, 144u8, 3u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 66u8, 3u8, 185u8, 3u8, 66u8, 3u8, 202u8, 3u8, + 6u8, 3u8, 153u8, 3u8, 4u8, 3u8, 153u8, 3u8, 0u8, 3u8, 153u8, 3u8, 0u8, 0u8, 138u8, + 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, 3u8, 254u8, 31u8, 1u8, 3u8, 254u8, 31u8, 66u8, 3u8, + 254u8, 31u8, 6u8, 3u8, 197u8, 3u8, 4u8, 3u8, 197u8, 3u8, 0u8, 3u8, 203u8, 3u8, 0u8, + 0u8, 176u8, 3u8, 19u8, 3u8, 193u8, 3u8, 20u8, 3u8, 193u8, 3u8, 66u8, 3u8, 197u8, + 3u8, 66u8, 3u8, 203u8, 3u8, 6u8, 3u8, 165u8, 3u8, 4u8, 3u8, 165u8, 3u8, 0u8, 3u8, + 165u8, 3u8, 0u8, 0u8, 142u8, 3u8, 20u8, 3u8, 161u8, 3u8, 0u8, 3u8, 168u8, 0u8, 0u8, + 0u8, 133u8, 3u8, 0u8, 0u8, 96u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 69u8, + 3u8, 124u8, 31u8, 69u8, 3u8, 201u8, 3u8, 69u8, 3u8, 206u8, 3u8, 0u8, 0u8, 0u8, 0u8, + 66u8, 3u8, 201u8, 3u8, 69u8, 3u8, 246u8, 31u8, 0u8, 3u8, 159u8, 3u8, 0u8, 0u8, + 140u8, 3u8, 0u8, 3u8, 169u8, 3u8, 0u8, 0u8, 143u8, 3u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 193u8, 5u8, 73u8, 251u8, + 194u8, 5u8, 73u8, 251u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 17u8, 0u8, 0u8, + 0u8, 15u8, 0u8, 0u8, 0u8, 13u8, 0u8, 0u8, 0u8, 11u8, 0u8, 0u8, 0u8, 9u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 7u8, 0u8, 0u8, 0u8, 5u8, 0u8, 0u8, 0u8, 3u8, 0u8, 0u8, + 0u8, 1u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 0u8, + ]) + }, + ), + scalars24: unsafe { + ::zerovec::ZeroVec::from_bytes_unchecked(&[ + 188u8, 209u8, 1u8, 111u8, 209u8, 1u8, 187u8, 209u8, 1u8, 111u8, 209u8, 1u8, 188u8, + 209u8, 1u8, 110u8, 209u8, 1u8, 187u8, 209u8, 1u8, 110u8, 209u8, 1u8, 95u8, 209u8, 1u8, + 114u8, 209u8, 1u8, 95u8, 209u8, 1u8, 113u8, 209u8, 1u8, 95u8, 209u8, 1u8, 112u8, 209u8, + 1u8, 95u8, 209u8, 1u8, 111u8, 209u8, 1u8, 95u8, 209u8, 1u8, 110u8, 209u8, 1u8, + ]) + }, +}; diff --git a/provider/testdata/data/baked/normalizer/mod.rs b/provider/testdata/data/baked/normalizer/mod.rs index aa5cbb67114..8f1b8bfce24 100644 --- a/provider/testdata/data/baked/normalizer/mod.rs +++ b/provider/testdata/data/baked/normalizer/mod.rs @@ -1,5 +1,6 @@ // @generated pub mod comp_v1; +pub mod decomp_v1; pub mod nfc_v1; pub mod nfd_v1; pub mod nfdex_v1; diff --git a/provider/testdata/data/icuexport/norm/small/decompositionex.toml b/provider/testdata/data/icuexport/norm/small/decompositionex.toml new file mode 100644 index 00000000000..6548ebca57a --- /dev/null +++ b/provider/testdata/data/icuexport/norm/small/decompositionex.toml @@ -0,0 +1,100 @@ +# Copyright (C) 2021 and later: Unicode, Inc. and others. +# License & terms of use: http://www.unicode.org/copyright.html +# +# file name: decompositionex +# +# machine-generated by: icuexportdata.cpp + +scalars32 = [ + 0x1d1bc,0x1d16f,0x1d1bb,0x1d16f,0x1d1bc,0x1d16e,0x1d1bb,0x1d16e,0x1d15f,0x1d172,0x1d15f,0x1d171,0x1d15f,0x1d170,0x1d15f,0x1d16f, + 0x1d15f,0x1d16e +] +[trie] +index = [ + 0,0x40,0,0,0,0,0,0x6b,0xa7,0,0,0,0,0,0xd9,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0x10e,0,0,0,0x131,0,0,0,0,0,0,0,0, + 0x10b,0x11b,0x11b,0x11e,0x11b,0x11b,0x11b,0x13c,0,0x10,0x20,0x30,0x40,0x50,0x60,0x70, + 0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, + 0,0x10,0x20,0x30,0x6b,0x7b,0x8b,0x9b,0xa7,0xb7,0xc7,0xd7,0,0x10,0x20,0x30, + 0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, + 0xd9,0xe9,0xf9,0x109,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, + 0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30,0,0x10,0x20,0x30, + 0,0x10,0x20,0x30,0x10e,0x11e,0x12e,0x13e,0,0x10,0x20,0x30,0,0x10,0x20,0x30, + 0,0x10,0x20,0x30,0x131,0x141,0x151,0x161,0x169,0x175,0x183,0x193,0x19d,0x1ad,0x1bb,0x1c5, + 0,0,0x1d1,0x1e1,0x1f1,0x201,0x211,0x221,0x22f,0x23f,0x24d,0x25d,0x26d,0x27b,0x28b,0x29b, + 0x2ab,0x2bb,0x2cb,0x2db,0x2ea,0x2fa,0x30a,0x31a,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0x326,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0x336,0,0,0,0,0x33b,0x34b,0,0,0,0x48,0x68,0x84,0x84,0x84, + 0x84,0x98,0x84,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xb8,0xf,0xf,0xf,0xf,0xf, + 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf, + 0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xf,0xd8,0xf,0xf,0xf,0xf, + 0xf,0xf,0xf,0xf,0xeb,0xffee +] +data_32 = [ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0xdc0304,0xfc0304,0xdc0301,0xfc0301,0xdc030c,0xfc030c,0xdc0300,0xfc0300,0,0xc40304,0xe40304,0x2260304,0x2270304,0,0,0, + 0,0,0,0,0,0,0,0x1ea0304,0x1eb0304,0,0,0,0,0,0,0, + 0,0,0,0,0,0xc50301,0xe50301,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0xd60304,0xf60304,0xd50304,0xf50304,0,0,0x22e0304,0x22f0304,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0x3ca0301,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0x3cb0301,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0xcca0cd5,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xddc0dca,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0xc70301,0xe70301,0,0,0,0,0,0,0x1120300,0x1130300,0x1120301,0x1130301,0,0,0, + 0,0x2280306,0x2290306,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0xcf0301,0xef0301,0,0,0,0,0,0,0,0,0x1e360304,0x1e370304,0,0,0, + 0,0,0,0,0,0,0,0,0,0xd50301,0xf50301,0xd50308,0xf50308,0x14c0300,0x14d0300,0x14c0301, + 0x14d0301,0,0,0,0,0,0,0,0,0x1e5a0304,0x1e5b0304,0,0,0,0,0x15a0307, + 0x15b0307,0x1600307,0x1610307,0x1e620307,0x1e630307,0,0,0,0,0,0,0,0,0x1680301,0x1690301,0x16a0308, + 0x16b0308,0,0,0,0,0xc20301,0xe20301,0xc20300,0xe20300,0xc20309,0xe20309,0xc20303,0xe20303,0x1ea00302,0x1ea10302,0x1020301, + 0x1030301,0x1020300,0x1030300,0x1020309,0x1030309,0x1020303,0x1030303,0x1ea00306,0x1ea10306,0,0,0,0,0,0,0xca0301, + 0xea0301,0xca0300,0xea0300,0xca0309,0xea0309,0xca0303,0xea0303,0x1eb80302,0x1eb90302,0,0,0,0,0,0,0, + 0,0xd40301,0xf40301,0xd40300,0xf40300,0xd40309,0xf40309,0xd40303,0xf40303,0x1ecc0302,0x1ecd0302,0x1a00301,0x1a10301,0x1a00300,0x1a10300,0x1a00309, + 0x1a10309,0x1a00303,0x1a10303,0x1a00323,0x1a10323,0,0,0,0,0x1af0301,0x1b00301,0x1af0300,0x1b00300,0x1af0309,0x1b00309,0x1af0303, + 0x1b00303,0x1af0323,0x1b00323,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0x1f000300,0x1f010300,0x1f000301,0x1f010301,0x1f000342,0x1f010342,0,0,0x1f080300,0x1f090300,0x1f080301,0x1f090301,0x1f080342,0x1f090342,0, + 0,0x1f100300,0x1f110300,0x1f100301,0x1f110301,0,0,0,0,0x1f180300,0x1f190300,0x1f180301,0x1f190301,0,0,0x1f200300, + 0x1f210300,0x1f200301,0x1f210301,0x1f200342,0x1f210342,0,0,0x1f280300,0x1f290300,0x1f280301,0x1f290301,0x1f280342,0x1f290342,0,0,0x1f300300, + 0x1f310300,0x1f300301,0x1f310301,0x1f300342,0x1f310342,0,0,0x1f380300,0x1f390300,0x1f380301,0x1f390301,0x1f380342,0x1f390342,0,0,0x1f400300, + 0x1f410300,0x1f400301,0x1f410301,0,0,0,0,0x1f480300,0x1f490300,0x1f480301,0x1f490301,0,0,0x1f500300,0x1f510300,0x1f500301, + 0x1f510301,0x1f500342,0x1f510342,0,0,0,0x1f590300,0,0x1f590301,0,0x1f590342,0,0,0x1f600300,0x1f610300,0x1f600301, + 0x1f610301,0x1f600342,0x1f610342,0,0,0x1f680300,0x1f690300,0x1f680301,0x1f690301,0x1f680342,0x1f690342,0,0x3ac0000,0x3b50300,0x3ad0000,0x3b70300, + 0x3ae0000,0x3b90300,0x3af0000,0x3bf0300,0x3cc0000,0x3c50300,0x3cd0000,0x3c90300,0x3ce0000,0,0,0x1f000345,0x1f010345,0x1f020345,0x1f030345,0x1f040345, + 0x1f050345,0x1f060345,0x1f070345,0x1f080345,0x1f090345,0x1f0a0345,0x1f0b0345,0x1f0c0345,0x1f0d0345,0x1f0e0345,0x1f0f0345,0x1f200345,0x1f210345,0x1f220345,0x1f230345,0x1f240345, + 0x1f250345,0x1f260345,0x1f270345,0x1f280345,0x1f290345,0x1f2a0345,0x1f2b0345,0x1f2c0345,0x1f2d0345,0x1f2e0345,0x1f2f0345,0x1f600345,0x1f610345,0x1f620345,0x1f630345,0x1f640345, + 0x1f650345,0x1f660345,0x1f670345,0x1f680345,0x1f690345,0x1f6a0345,0x1f6b0345,0x1f6c0345,0x1f6d0345,0x1f6e0345,0x1f6f0345,0x3b10306,0x3b10304,0x1f700345,0x3b10345,0x3ac0345, + 0,0x3b10342,0x1fb60345,0x3910306,0x3910304,0x3910300,0x3860000,0x3910345,0,0x3b90000,0,0xa80342,0x1f740345,0x3b70345,0x3ae0345,0, + 0x3b70342,0x1fc60345,0x3950300,0x3880000,0x3970300,0x3890000,0x3970345,0x1fbf0300,0x1fbf0301,0x1fbf0342,0x3b90306,0x3b90304,0x3ca0300,0x3900000,0,0, + 0x3b90342,0x3ca0342,0x3990306,0x3990304,0x3990300,0x38a0000,0,0x1ffe0300,0x1ffe0301,0x1ffe0342,0x3c50306,0x3c50304,0x3cb0300,0x3b00000,0x3c10313,0x3c10314, + 0x3c50342,0x3cb0342,0x3a50306,0x3a50304,0x3a50300,0x38e0000,0x3a10314,0xa80300,0x3850000,0x600000,0,0,0x1f7c0345,0x3c90345,0x3ce0345,0, + 0x3c90342,0x1ff60345,0x39f0300,0x38c0000,0x3a90300,0x38f0000,0,0,0,0,0,0,0,0,0,0, + 0,0,0xfb4905c1,0xfb4905c2,0,0,0x11,0xf,0xd,0xb,9,0,0,0,0,0, + 0,0,0,0,0,0,0,0,7,5,3,1,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0 +] +indexLength = 326 +dataLength = 859 +highStart = 0x1d200 +shifted12HighStart = 0x1e +type = 1 +valueWidth = 1 +index3NullOffset = 0xf +dataNullOffset = 0x0 +nullValue = 0x0 diff --git a/provider/testdata/data/json/fingerprints.csv b/provider/testdata/data/json/fingerprints.csv index 5332f219090..9db448999cb 100644 --- a/provider/testdata/data/json/fingerprints.csv +++ b/provider/testdata/data/json/fingerprints.csv @@ -923,6 +923,7 @@ list/unit@1, und, 267B, ab8cc47b97781d052232b4c5ea96b5fa6a0370262ae18cba539dd349 locale_canonicalizer/aliases@1, und, 18500B, 231601ea4c6b6ce73165ffbc5c0d9d448625d677cee0733cb00af2ec32a5d2ef locale_canonicalizer/likelysubtags@1, und, 87515B, 6f6ee5eacd835e2eeb53e32e42a85fb9f6ef3957cd38436e635c8b9c0f3d373d normalizer/comp@1, und, 29836B, 634be78f876811cd829efa0d9e2ff29d28b8f13696b527df30c7ef6f36820a47 +normalizer/decomp@1, und, 14378B, 25065fed55263cf13bcf9bd11384512ab4a6b041b58a14cdd6a80ddbd722c26c normalizer/nfc@1, und, 5802B, f2be11a3cb8b2cbafd8b813a84fcbe37c415ab707ac287e1c5c5f1d99222e821 normalizer/nfd@1, und, 62051B, c07e1669fed58be2bcc596baa7a2b7ec27fcaf3f2a80f9f2eb987a455fd2288d normalizer/nfdex@1, und, 13980B, e112222c10c299a907eba832c013258902c59f175d2d8cc8cad4975509100235 diff --git a/provider/testdata/data/json/normalizer/decomp@1/und.json b/provider/testdata/data/json/normalizer/decomp@1/und.json new file mode 100644 index 00000000000..1f076796b09 --- /dev/null +++ b/provider/testdata/data/json/normalizer/decomp@1/und.json @@ -0,0 +1,1293 @@ +{ + "trie": { + "header": { + "high_start": 119296, + "shifted12_high_start": 30, + "index3_null_offset": 15, + "data_null_offset": 0, + "null_value": 0, + "trie_type": "Small" + }, + "index": [ + 0, + 64, + 0, + 0, + 0, + 0, + 0, + 107, + 167, + 0, + 0, + 0, + 0, + 0, + 217, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 270, + 0, + 0, + 0, + 305, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 267, + 283, + 283, + 286, + 283, + 283, + 283, + 316, + 0, + 16, + 32, + 48, + 64, + 80, + 96, + 112, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 107, + 123, + 139, + 155, + 167, + 183, + 199, + 215, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 217, + 233, + 249, + 265, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 270, + 286, + 302, + 318, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 0, + 16, + 32, + 48, + 305, + 321, + 337, + 353, + 361, + 373, + 387, + 403, + 413, + 429, + 443, + 453, + 0, + 0, + 465, + 481, + 497, + 513, + 529, + 545, + 559, + 575, + 589, + 605, + 621, + 635, + 651, + 667, + 683, + 699, + 715, + 731, + 746, + 762, + 778, + 794, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 806, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 822, + 0, + 0, + 0, + 0, + 827, + 843, + 0, + 0, + 0, + 72, + 104, + 132, + 132, + 132, + 132, + 152, + 132, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 184, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 216, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 15, + 235, + 65518 + ], + "data": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14418692, + 16515844, + 14418689, + 16515841, + 14418700, + 16515852, + 14418688, + 16515840, + 0, + 12845828, + 14942980, + 36045572, + 36111108, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 32113412, + 32178948, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 12911361, + 15008513, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 14025476, + 16122628, + 13959940, + 16057092, + 0, + 0, + 36569860, + 36635396, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 63570689, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 63636225, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 214568149, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 232525258, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13042433, + 15139585, + 0, + 0, + 0, + 0, + 0, + 0, + 17957632, + 18023168, + 17957633, + 18023169, + 0, + 0, + 0, + 0, + 36176646, + 36242182, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13566721, + 15663873, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 506856196, + 506921732, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13959937, + 16057089, + 13959944, + 16057096, + 21758720, + 21824256, + 21758721, + 21824257, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 509215492, + 509281028, + 0, + 0, + 0, + 0, + 22676231, + 22741767, + 23069447, + 23134983, + 509739783, + 509805319, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 23593729, + 23659265, + 23724808, + 23790344, + 0, + 0, + 0, + 0, + 12714753, + 14811905, + 12714752, + 14811904, + 12714761, + 14811913, + 12714755, + 14811907, + 513803010, + 513868546, + 16909057, + 16974593, + 16909056, + 16974592, + 16909065, + 16974601, + 16909059, + 16974595, + 513803014, + 513868550, + 0, + 0, + 0, + 0, + 0, + 0, + 13239041, + 15336193, + 13239040, + 15336192, + 13239049, + 15336201, + 13239043, + 15336195, + 515375874, + 515441410, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 13894401, + 15991553, + 13894400, + 15991552, + 13894409, + 15991561, + 13894403, + 15991555, + 516686594, + 516752130, + 27263745, + 27329281, + 27263744, + 27329280, + 27263753, + 27329289, + 27263747, + 27329283, + 27263779, + 27329315, + 0, + 0, + 0, + 0, + 28246785, + 28312321, + 28246784, + 28312320, + 28246793, + 28312329, + 28246787, + 28312323, + 28246819, + 28312355, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 520094464, + 520160000, + 520094465, + 520160001, + 520094530, + 520160066, + 0, + 0, + 520618752, + 520684288, + 520618753, + 520684289, + 520618818, + 520684354, + 0, + 0, + 521143040, + 521208576, + 521143041, + 521208577, + 0, + 0, + 0, + 0, + 521667328, + 521732864, + 521667329, + 521732865, + 0, + 0, + 522191616, + 522257152, + 522191617, + 522257153, + 522191682, + 522257218, + 0, + 0, + 522715904, + 522781440, + 522715905, + 522781441, + 522715970, + 522781506, + 0, + 0, + 523240192, + 523305728, + 523240193, + 523305729, + 523240258, + 523305794, + 0, + 0, + 523764480, + 523830016, + 523764481, + 523830017, + 523764546, + 523830082, + 0, + 0, + 524288768, + 524354304, + 524288769, + 524354305, + 0, + 0, + 0, + 0, + 524813056, + 524878592, + 524813057, + 524878593, + 0, + 0, + 525337344, + 525402880, + 525337345, + 525402881, + 525337410, + 525402946, + 0, + 0, + 0, + 525927168, + 0, + 525927169, + 0, + 525927234, + 0, + 0, + 526385920, + 526451456, + 526385921, + 526451457, + 526385986, + 526451522, + 0, + 0, + 526910208, + 526975744, + 526910209, + 526975745, + 526910274, + 526975810, + 0, + 61603840, + 62194432, + 61669376, + 62325504, + 61734912, + 62456576, + 61800448, + 62849792, + 63700992, + 63243008, + 63766528, + 63505152, + 63832064, + 0, + 0, + 520094533, + 520160069, + 520225605, + 520291141, + 520356677, + 520422213, + 520487749, + 520553285, + 520618821, + 520684357, + 520749893, + 520815429, + 520880965, + 520946501, + 521012037, + 521077573, + 522191685, + 522257221, + 522322757, + 522388293, + 522453829, + 522519365, + 522584901, + 522650437, + 522715973, + 522781509, + 522847045, + 522912581, + 522978117, + 523043653, + 523109189, + 523174725, + 526385989, + 526451525, + 526517061, + 526582597, + 526648133, + 526713669, + 526779205, + 526844741, + 526910277, + 526975813, + 527041349, + 527106885, + 527172421, + 527237957, + 527303493, + 527369029, + 61932294, + 61932292, + 527434565, + 61932357, + 61604677, + 0, + 61932354, + 532022085, + 59835142, + 59835140, + 59835136, + 59113472, + 59835205, + 0, + 62455808, + 0, + 11010882, + 527696709, + 62325573, + 61735749, + 0, + 62325570, + 533070661, + 60097280, + 59244544, + 60228352, + 59310080, + 60228421, + 532611840, + 532611841, + 532611906, + 62456582, + 62456580, + 63570688, + 59768832, + 0, + 0, + 62456642, + 63570754, + 60359430, + 60359428, + 60359424, + 59375616, + 0, + 536740608, + 536740609, + 536740674, + 63243014, + 63243012, + 63636224, + 61865984, + 62980883, + 62980884, + 63243074, + 63636290, + 61145862, + 61145860, + 61145856, + 59637760, + 60883732, + 11010816, + 59047936, + 6291456, + 0, + 0, + 528220997, + 63505221, + 63832901, + 0, + 63505218, + 536216389, + 60752640, + 59506688, + 61408000, + 59703296, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 4215866817, + 4215866818, + 0, + 0, + 17, + 15, + 13, + 11, + 9, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 7, + 5, + 3, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ] + }, + "scalars24": [ + [ + 188, + 209, + 1 + ], + [ + 111, + 209, + 1 + ], + [ + 187, + 209, + 1 + ], + [ + 111, + 209, + 1 + ], + [ + 188, + 209, + 1 + ], + [ + 110, + 209, + 1 + ], + [ + 187, + 209, + 1 + ], + [ + 110, + 209, + 1 + ], + [ + 95, + 209, + 1 + ], + [ + 114, + 209, + 1 + ], + [ + 95, + 209, + 1 + ], + [ + 113, + 209, + 1 + ], + [ + 95, + 209, + 1 + ], + [ + 112, + 209, + 1 + ], + [ + 95, + 209, + 1 + ], + [ + 111, + 209, + 1 + ], + [ + 95, + 209, + 1 + ], + [ + 110, + 209, + 1 + ] + ] +} diff --git a/provider/testdata/data/postcard/fingerprints.csv b/provider/testdata/data/postcard/fingerprints.csv index 511a44b3266..8688cda712c 100644 --- a/provider/testdata/data/postcard/fingerprints.csv +++ b/provider/testdata/data/postcard/fingerprints.csv @@ -923,6 +923,7 @@ list/unit@1, und, 17B, 5b9f632a33abd67185c088f662de58929ec350487d7855e8a78ee9eb4 locale_canonicalizer/aliases@1, und, 8988B, 3e2ad76382e532d7c87771c78bd75e1e4c4abbbc5f436e7e1091fae157391bd4 locale_canonicalizer/likelysubtags@1, und, 18793B, c4c5a1819d8e3ca8f1cabdd3548b6e1ba311586a0f7e1c50c90d93bc97263eae normalizer/comp@1, und, 5092B, bb6312f594d6d73110877a3b4fe8717849fa852d2d7ad2a0be07f3518cc848bc +normalizer/decomp@1, und, 4155B, 6e407fdf0c526c7d9f0173e542fd09f4bfe7f3007e88d5072eb9d6d0a9a17f86 normalizer/nfc@1, und, 2194B, 1013e6b016935c66e008c39375c6bd4da65e7780a007f96a4a1a61495fa09720 normalizer/nfd@1, und, 18579B, ad4a03a631dbc7e978451a189b154ab6287453611b31d8e51cae251e52f1bdc9 normalizer/nfdex@1, und, 2051B, 5b3b10bb1a5580c882bdefd57809bb8acb7de3b21fae52637a4a198572af1a53 diff --git a/provider/testdata/data/testdata.postcard b/provider/testdata/data/testdata.postcard index f975aa4bbb5..1aa09a2bd7b 100644 Binary files a/provider/testdata/data/testdata.postcard and b/provider/testdata/data/testdata.postcard differ