rust S…#rustc 1.98.1 (48a229cea 2026-09-01)СћЪЦЭRLё.хSлAњwjL-df1bddb45adbe94bСБђ‰<х%Z‰>И64‡ЫV`-2d2ab9fb0fe1def5СŠћ   is_xid_startСis_xid_continueСtablesСAlign8С ѓAlign64С ѓUNICODE_VERSIONС ASCII_STARTСASCII_CONTINUEСCHUNKС ZERO_STARTС ZERO_CONTINUEС TRIE_STARTС  TRIE_CONTINUEС LEAFС" T  ”ѕ —ѕќх5ѕѕѕd€+_Сўџџўџџ!0x7fffffe07fffffe0000000000000000Сџўџџ‡ўџџф!0x7fffffe87fffffe03ff000000000000С@64Сд17Сд17Сџд511Сд1793С д7968Смї +јѓ iKц;Ѓ`‹нdнkrфИ н(—ѓ Џ 6GК6ymнaнho ћЗ|ч\ пt‘] Э\Ё] є,Ў] в$Е]"КlЛ]  ЅTЪ] ‘lж]  €Tх]  ќЅeќІЃ [![github]](https://github.com/dtolnay/unicode-ident) [![crates-io]](https://crates.io/crates/unicode-ident) [![docs-rs]](https://docs.rs/unicode-ident)СЇќЋjg [github]: https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=githubСќ–nk [crates-io]: https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rustСќ…mj [docs-rs]: https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rsСѓDї
С€ќ„NK Implementation of [Unicode Standard Annex #31][tr31] for determining whichСќг@= `char` values are valid in programming language identifiers.С”ќ˜1. [tr31]: https://www.unicode.org/reports/tr31/СЪќЮNK This crate is a better optimized implementation of the older `unicode-xid`СќLI crate. This crate uses less static storage, and is able to classify bothСќъPM ASCII and non-ASCII codepoints with better performance, 6× faster thanС”Л `unicode-xid`.СЮDвЦлќп  ## Comparison of performanceС€ќ„JG The following table shows a comparison between five Unicode identifierСЄЯ implementations.Сфќш$! - `unicode-ident` is this crate;Сќ IF - [`unicode-xid`] is a widely used crate run by the "unicode-rs" org;Сќз C@ - `ucd-trie` and `fst` are two data structures supported by theСф›  [`ucd-generate`] tool;СќИ =: - [`roaring`] is a Rust implementation of Roaring bitmap.Сі ќњ PM The *static storage* column shows the total size of `static` tables that theСќЫ =: crate bakes into your binary, measured in 1000s of bytes.С‰ ќ JG The remaining columns show the **cost per call** to evaluate whether aСќи GD single `char` has the XID\_Start or XID\_Continue Unicode property,Сќ  MJ comparing across different ratios of ASCII to non-ASCII codepoints in theС|ю  input data.Сў ќ‚>; [`unicode-xid`]: https://github.com/unicode-rs/unicode-xidСќС@= [`ucd-generate`]: https://github.com/BurntSushi/ucd-generateСќ‚<9 [`roaring`]: https://github.com/RoaringBitmap/roaring-rsСПќУA> | | static storage | 0% nonascii | 1% | 10% | 100% nonascii |Сь… |---|---|---|---|---|---|СќЃLI | **`unicode-ident`** | 10.3 K | 0.36 ns | 0.37 ns | 0.37 ns | 0.43 ns |Сќ№JG | **`unicode-xid`** | 12.2 K | 1.63 ns | 1.70 ns | 1.82 ns | 4.56 ns |СќЛGD | **`ucd-trie`** | 10.8 K | 1.01 ns | 0.73 ns | 0.97 ns | 1.09 ns |СќƒA> | **`fst`** | 149 K | 22.0 ns | 21.9 ns | 20.9 ns | 10.5 ns |СќХFC | **`roaring`** | 66.1 K | 1.91 ns | 1.90 ns | 1.94 ns | 2.67 ns |СŒќNK Source code for the benchmark is provided in the *bench* directory of thisСќп:7 repo and may be repeated by running `cargo criterion`.СšDžЦЇќЋ$! ## Comparison of data structuresСаЄд #### unicode-xidСщќэOL They use a sorted array of character ranges, and do a binary search to lookСќНB? up whether a given character lands inside one of those ranges.С€\„ ```rustСќ" # const _: &str = stringify! {СќГ63 static XID_Continue_table: [(char, char); 763] = [Сќъ%" ('\u{30}', '\u{39}'), // 0-9Сќ%" ('\u{41}', '\u{5a}'), // A-ZС<Ж # "С\О т€ІС<ЪŽ&ќв# ('\u{e0100}', '\u{e01ef}'),С4і ];СD§ # };С<† ```СŽќ’LI The static storage used by this data structure scales with the number ofСќпLI contiguous ranges of identifier codepoints in Unicode. Every table entryСќЌLI consumes 8 bytes, because it consists of a pair of 32-bit `char` values.Сљќ§IF In some ranges of the Unicode codepoint space, this is quite a sparseСќЧKH representation – there are some ranges where tens of thousands ofСќ“MJ adjacent codepoints are all valid identifier characters. In other places,СќсLI the representation is quite inefficient. A characater like `ТЕ` (U+00B5)СќЎLI which is surrounded by non-identifier codepoints consumes 64 bits in theСќћ:7 table, while it would be just 1 bit in a dense bitmap.СЖќКNK On a system with 64-byte cache lines, binary searching the table touches 7Сќ‰FC cache lines on average. Each cache line fits only 8 table entries.СќаNK Additionally, the branching performed during the binary search is probablyСќŸ1. mostly unpredictable to the branch predictor.СбќеMJ Overall, the crate ends up being about 6× slower on non-ASCII inputСќЃ " compared to the fastest crate.СЦ ќЪ NK A potential improvement would be to pack the table entries more compactly.Сќ™!OL Rust's `char` type is a 21-bit integer padded to 32 bits, which means everyСќщ!LI table entry is holding 22 bits of wasted space, adding up to 3.9 K. TheyСќЖ"MJ could instead fit every table entry into 6 bytes, leaving out some of theСќ„#PM padding, for a 25% improvement in space used. With some cleverness it may beСќе#KH possible to fit in 5 bytes or even 4 bytes by storing a low char and anСќЁ$NK extent, instead of low char and high char. I don't expect that performanceСќ№$PM would improve much but this could be the most efficient for space across allСќС%30 the libraries, needing only about 7 K to store.Сѕ%Œљ% #### ucd-trieС‹&ќ&KH Their data structure is a compressed trie set specifically tailored forСќл&@= Unicode codepoints. The design is credited to Raph Levien inСмœ' [rust-lang/rust#33098].СИ'ќМ'HE [rust-lang/rust#33098]: https://github.com/rust-lang/rust/pull/33098С…(\‰(А$Ф•( pub struct TrieSet {СќЎ()& tree1_level1: &'static [u64; 32],Сќи()& tree2_level1: &'static [u8; 992],Сќ‚)%" tree2_level2: &'static [u64],СќЈ))& tree3_level1: &'static [u8; 256],Сќв)$! tree3_level2: &'static [u8],Сќї)%" tree3_level3: &'static [u64],С,* }С<Ѓ*‹'Ћ*ќЏ*PM It represents codepoint sets using a trie to achieve prefix compression. TheСќ€+KH final states of the trie are embedded in leaves or "chunks", where eachСќЬ+NK chunk is a 64-bit integer. Each bit position of the integer corresponds toСќ›,MJ whether a particular codepoint is in the set or not. These chunks are notСќщ,OL just a compact representation of the final states of the trie, but are alsoСќЙ-IF a form of suffix compression. In particular, if multiple ranges of 64Сќƒ.PM contiguous codepoints have the same Unicode properties, then they all map toСќд.2/ the same chunk in the final level of the trie.С‡/ќ‹/NK Being tailored for Unicode codepoints, this trie is partitioned into threeСќк/OL disjoint sets: tree1, tree2, tree3. The first set corresponds to codepointsСќЊ0FC \[0, 0x800), the second \[0x800, 0x10000) and the third \[0x10000,Сќё0NK 0x110000). These partitions conveniently correspond to the space of 1 or 2СќР1MJ byte UTF-8 encoded codepoints, 3 byte UTF-8 encoded codepoints and 4 byteСќŽ2+( UTF-8 encoded codepoints, respectively.СК2ќО2OL Lookups in this data structure are significantly more efficient than binaryСќŽ3PM search. A lookup touches either 1, 2, or 3 cache lines based on which of theСќп3&# trie partitions is being accessed.С†4ќŠ4PM One possible performance improvement would be for this crate to expose a wayСќл4LI to query based on a UTF-8 encoded string, returning the Unicode propertyСќЈ5PM corresponding to the first character in the string. Without such an API, theСќљ5NK caller is required to tokenize their UTF-8 encoded input data into `char`,СќШ6MJ hand the `char` into `ucd-trie`, only for `ucd-trie` to undo that work byСќ–7OL converting back into the variable-length representation for trie traversal.Сц7dъ7 #### fstСї7ќћ7LI Uses a [finite state transducer][fst]. This representation is built intoСќШ8JG [ucd-generate] but I am not aware of any advantage over the `ucd-trie`Сќ“9MJ representation. In particular `ucd-trie` is optimized for storing UnicodeСќс9" properties while `fst` is not.С„:ќˆ:,) [fst]: https://github.com/BurntSushi/fstСќЕ:>; [ucd-generate]: https://github.com/BurntSushi/ucd-generateСє:ќј:MJ As far as I can tell, the main thing that causes `fst` to have large sizeСќЦ;MJ and slow lookups for this use case relative to `ucd-trie` is that it doesСќ”DA structure designed for storing sets of 32-bit unsigned integers.С§>ќ?63 [Roaring Bitmap]: https://roaringbitmap.org/about/СИ?ќМ?PM Roaring bitmaps are compressed bitmaps which tend to outperform conventionalСќ@PM compressed bitmaps such as WAH, EWAH or Concise. In some instances, they canСќо@IF be hundreds of times faster and they often offer significantly betterС„ЈA compression.СЙAќНAIF In this use case the performance was reasonably competitive but stillСќ‡BIF substantially slower than the Unicode-optimized crates. Meanwhile theСќбBOL compression was significantly worse, requiring 6× as much storage forСМЁC the data structure.СЙCќНCPM I also benchmarked the [`croaring`] crate which is an FFI wrapper around theСќŽDMJ C reference implementation of Roaring Bitmap. This crate was consistentlyСќмDPM about 15% slower than pure-Rust `roaring`, which could just be FFI overhead.Сќ­E" I did not investigate further.СаEќдE30 [`croaring`]: https://crates.io/crates/croaringСˆFДŒF #### unicode-identСЃFќЇFOL This crate is most similar to the `ucd-trie` library, in that it's based onСќїFOL bitmaps stored in the leafs of a trie representation, achieving both prefixСќЧG'$ compression and suffix compression.СяGфѓG The key differences are:СHќ”HPM - Uses a single 2-level trie, rather than 3 disjoint partitions of differentСŒхH depth each.СќїHEB - Uses significantly larger chunks: 512 bits rather than 64 bits.СќНIEB - Compresses the XID\_Start and XID\_Continue properties togetherСќƒJOL simultaneously, rather than duplicating identical trie leaf chunks acrossСtгJ the two.СтJќцJOL The following diagram show the XID\_Start and XID\_Continue Unicode booleanСќЖK85 properties in uncompressed form, in row-major order:СяK\ѓK СќџK41 СDДL СќНL  СќоMЃ  СL‚O СdŒO
XID_StartXID_Continue
XID_Start bitmapXID_Continue bitmap
С™OќOPM Uncompressed, these would take 140 K to store, which is beyond what would beСќюOMJ reasonable. However, as you can see there is a large degree of similarityСќМPDA between the two bitmaps and across the rows, which lends well toС„QЂW’Qќ–QNK This crate stores one 512-bit "row" of the above bitmaps in the leaf levelСќхQOL of a trie, and a single additional level to index into the leafs. There areСќЕR52 134 unique 512-bit chunks across the two bitmaps.СыRќяROL The chunk size of 512 bits is selected as the size that minimizes the totalСќПSLI size of the data structure. A smaller chunk, like 256 or 128 bits, wouldСќŒTKH achieve better deduplication but require a larger index. A larger chunkСќиTIF would increase redundancy in the leaf bitmaps. 512 bit chunks are theСќЂU:7 optimum for total size of the index plus leaf bitmaps.СнUќсUQN The chunk data is compressed using the Kuhnт€“Munkres algorithm for bipartiteСќГVOL matching to eliminate redundancies between the second half of any chunk andСќƒWEB the first half of any other chunk. This achieves an additional 9%СќЩWPM compression of the leaf level, leaving 122 chunks that can be indexed at theСќšXLI half-chunk level using an 8-bit index. Note that this is not the same asСќчXIF using chunks which are half the size, because it does not necessitateСќБY/, raising the size of the trie's first level.СсYќхYOL In contrast to binary search or the `ucd-trie` crate, performing lookups inСќЕZIF this data structure is straight-line code with no need for branching.Сќ‹[?$https://docs.rs/unicode-ident/1.0.26Сl’[ ћOЗ_ пp Эƒ є– вЉ"КО  Ѕг ‘ш  €ћ  OOOєи\_lќ\ppƒƒ––ЉЉООггшшћћќД^%ќѕ]>; Whether the character has the Unicode property XID\_Start.СdЛ^Bџ chСШ^ќ‡b(ќХaA> Whether the character has the Unicode property XID\_Continue.С|ŽbBџ иxžbTУ\у skipСlД\„В\4Ч\ "N4‰ўЦн iKц;Ѓ`‹нBџNRнBџ н`bd“нЮ<ЪД{ вўЏ 6GК6ymнўBџЮIнўBџ н`bdенќх'|я­ќœ"\­фќф%tѕфьА,Сдќ…"T–дќЎ%lПдќл/Tэјѓ iKц;Ѓ`‹ѕдџ€ !%+/26:>ЎCGKЊЊЊЊЊЊЊЊЊЊЊЊыЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊORVZЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊPъ^bdhlp0tvz~‚†ŠŽ’–šžЊЋЂЄлЊЊЉЊЊЊЊЊЊAЊАзЊГЧЗЊЊЊЊЊЊЊЊЊЊЊЊЊЊЛЊ)Ф&НРЩЫБвжнсхщЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊэЊЊЊЊЊЊЊЊяЊЊЊЊЊЊЊЊЊЊёЊЊЊЊЊЊЊЊЊЊЊЊЊЊѓЊиЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊѕЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊї џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€…дќ•3lЇјѓ iKц;Ѓ`‹ѕдˆ #(-/48<@ЎEIMЊЊЊЊЊЊЊЊЊЊЊЊыЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊOTX\ЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊPъ`bfjnr0tx|€„ˆŒ”˜œ ЊЋЂЄлЊЊ­ЊЊЊЊЊЊAЊАаЊЕЇЙЊЊЊЊЊЊЊЊЊЊЊЊЊЊЛЊ)Ф&НУІСОЦЩЭЯБдкпучщЅЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊэЊЊЊЊЊЊЊЊяЊЊЊЊЊЊЊЊЊЊёЊЊЊЊЊЊЊЊЊЊЊЊЊЊѓЊиЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊѕЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊЊїџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџˆ$ТдќЃw+$Еw—ѓ Џ 6GК6ymѕд Р>џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџУџPпИ@зџџћџџџџџџџџџПџџџџџџџџџџџџџџџџџџџџџџџџџУџPџџџџџџџџџџџџџџпИРзџџћџџџџџџџџџПџџџџџџџџџџџџџџџџџќџџџџџџџџџџџџџџџџџџџџўџџџџџџџџџџџ‡џџџџџџџџџџџџџџџџћќџџџџџџџџџџџџџџџџџџџџўџџџџџџџџўџџџџПЖџџџ‡џџџџџРўџџџџџџџџџџџ/`Рœ§џџџрџџџџџџџџџџ?ќџџџ0џџџџџџџџџџУџџџџџџџџџџџџяŸџ§џŸџџџџџџџчџџџџџџџџџџџџџџџџџџ?$џџ?џџџџџџџўџџџџџ№џџџџџџ#џўџсŸљџџ§Х#@Аџџџџџ?џџџџџџџў€џџџџџџџџџћџџџџџџџџџџџџџџџЯџўџяŸљџџ§ХѓŸy€АЯџPр‡љџџ§m^рПћџџ§э#рŸљџџ§э#АшЧ=жЧџю‡љџџ§mг‡9^Рџ?юПћџџ§эѓП;ЯџўюŸљџџ§эѓŸ9јАЯџьЧ=жЧџУЧ=Рџрп§џџ§џ#7сп§џџ§я#p№п§џџџџ'@p€ќрџќџџћ/џп§џџ§џѓп=`7Яџяп§џџ§яѓп=`pЯџџп§џџџџџп}№€Яџќюџќџџћ/„_џРџ ўџџџџџжїџџЏџ _№џўџџџўџџџџџџџџжїџџЏџџ?_џѓџ Тџўџџџўџпџџўџџџ@џџџџџ€?ўџџџџџџџџџрўџџџџџџџџџџїрџџџџџўџџџџџџџџџџџџџџџџрўџ>ўџџџџџџџџџцўџџџџџџџџџџџрџџџџџўџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџјџџџџџџџџ џџџџџ€џџџ?џџџџџџџџџџ€џќџџџџџџџџџџџџљџџџџџџџџџ?ўџџџџџџџџџџџ№Пџџџџџџџџџџџџџџ€џќџџџџџџџџџџџџљџџџџџџџџџ?ўџЛїџџџџџџџџќџџџџџќhќџџ?џџџџџ№џџџџџ€пџ|џџџџџџџџџџџџџџџџџџџ?џџџџшџџџџџ?џџџџџџџџџџџџџџџ€џџџџџџџџџїџџФџџџџџџb>8џ~~~џџџџџїџ3џџџџџџџџџџџџџџџџџџџџџ?џџџќџџџџџџџџ8џџ|~~~џџџџџїџ3џџџџџџџџџџџџџџџ7џџџџџџџџџџџџџџ?џџџџџџџџџџџџџј џ§_лџџџџџџџџџџџџџјџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџјрџ§_лџџџџџџџџџџџџџјџџџџџџџџџџџџџџџџ?№џџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџќџџџџџџџŠЊџџџџџџџџџџџџџџџўџџўџџРџџџџџџ?џџџќќќџџџџрŠЊџџџџџџџџџџџџџџџџўџџ‡ўџџрџџџџџџџџџџќќќџяџџџџЗџ?џ?џџџџџџџџџџџџџџџџџџџџџџяџџџџЗџ?џ?џџџџџџџџџџџџџџџџџџџџџ џџџџџџџџџџџџџрџџџџџџџ?џџџ?џџџџџ>џџџџџџџџџџџџџрџџџџџџџџџџџ?џџџџџ>џџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџїџїЗџћџћџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџїџїЗџћџћџџџџџџ?§џџџџП‘џџ?џџџџџџџ7џџ?џџџџџџџџџџџџџРяўџџ?џџџџџџџўџџџџџџџџ?џџ?џџџџo№яўџџ?‡џџџџџџџўџџџџџџџџ?џџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџќџџ?€џџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?Оџџ?џџџџџќўџџџџ€џџ?џџџџџџџџџџџќјўџџџџџџ€џџџџџџ?џџџџјџџџџџџ&јџџџџџџџџјџџџџџџџGјџџџџџџџџџџџџџРџ?€џџџџџџџџџџџџџџџџџпџ№џџџџOџџџџџџџџоџџџћџџ€НџПџџџџџџрŸљџџ§э#рџKџџџџП џџћџџџџРНџПџџџџџџџџџяŸљџџ§эћŸ9рЯџKџџџџПџЅїџџџџџџ€€џџџџџџАџџџџџџџџџџџџџџџУџџџџџџџџПџџџџџџџ?џ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџчџџџџџџџџџџџџџџџ€ђoџџџ€џќџџџџ џџџџџџџџџџџџџџџџ€ђoџџџПљџџќџџџџџќјџџџџ№џџџџџ џџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџ#џџџџџџџџџџџџџџџџ§џџџќџџџћџџџџ@П§џџџџџџџџџ§џџџџџџќџџџќџџўћџџџџДџџП§џџџћџџџџџџџџџєџ§џџџџџџџ§џџџџЧџџџџџџџџџџџџџџџрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ??џџџџ??џЊџџџ?џџџџџџп_мЯџмџџџџџџџџџџџџџџџџџџџџџџџџрџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџјџџрџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџјџџрџџџџџџџџџџџџџљџџџџџџџџџџџјџ |џџџџџџџџџџџљџџџџџџџџџџџ‡џџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ€рујч<џџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџcяo˜џџџџџџџџџџџџџџџпџџџџџџџџпdоџыяџџџџџџџПчппџџџ{_ќ§џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ§џџїџџџїџџпџџџпџџџџџџџџ§џџџ§џџїџџџџџџџџџџџџџџџџџџџџџџџ§џџїџџџїџџпџџџпџџџџџџџџ§џџџ§џџїЯџџџџџџџџџџџџјџџџџџ јўџџџџџџџџџџџџџџџ?џџџџџ€?@џџљлџџџџџџџ?€џџџџџџ?џCџџџ?џџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџЗ?Рoџџџџџџ?Рoџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяџџџ–ўї „ъ–Њ–її^џћџюћџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ?џџџџџџџџџџџџџџџџџџџџџџџ~џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџР>$ШwдK unicode-xidС)https://github.com/unicode-rs/unicode-xidС ucd-generateС!https://crates.io/crates/croaringС]https://img.shields.io/badge/crates.io-fc8d62?style=for-the-badge&labelColor=555555&logo=rustС(https://github.com/dtolnay/unicode-identС crates-ioС&https://crates.io/crates/unicode-identС^https://img.shields.io/badge/docs.rs-66c2a5?style=for-the-badge&labelColor=555555&logo=docs.rsСrust-lang/rust#33098С,https://github.com/rust-lang/rust/pull/33098Сfinite state transducerС%https://www.unicode.org/reports/tr31/СУлглcroaringСgithubСšнЧн’мИм+https://github.com/RoaringBitmap/roaring-rsСуоќоUnicode Standard Annex #31СЩпУл https://roaringbitmap.org/about/Сџп’мŒрšнroaringСЏруоhttps://docs.rs/unicode-identСырЩпRoaring BitmapС–сџпŒр*https://github.com/BurntSushi/ucd-generateСгсЏр\https://img.shields.io/badge/github-8da0cb?style=for-the-badge&labelColor=555555&logo=githubСdocs-rsСысыр!https://github.com/BurntSushi/fstС™т–смОтгс€ољтенкуыс­пђу™тглмОтИм€оЧненкуљтќо­пђу`Иgх9‰и”v­_”ПŽI&иђ‰Э‡—nNбŠ"iFтОЮЕц”pYу!˜š‹$ЃйЂЅћЪЦ=їћ_sJ*b•ъ%„<Е᭘бЎlаяЙ’vн@˜ƒмНaѕќ›Ђ:“в! –ƒиВ1RPƒTг)˜2њЦЁ‚аы$IšМѓpФђй•P9˜™G ВјLхиГAŸВfZ  ‰ншкчВˆ J$ГъŸh4RъС;ъЙyHі4н?+ЏюНщQіWмѕš~д ѓnDЎяѕ=)Эвфя@ћlWšіёЛ)YКв;kд—,*7ьAТCмр“є{Ьш†Ѕ.Х_O. aТшЃŒ‹#Pіх1чv „kœає‹у :ѓЃ;Ї;Ў;Б;З;Н;У;Щ;Я;е;л;у;e<ч<=А=Х=W>n>‚>—>Ћ>Р>е>ъ>ЎAJр: =]=> ' '    п:C<Ш<===В=Ы=&>Y>r>†>›>Џ>Ф>й>?ЦA2J š; ;Ѓ;Њ;Ў;Д;К;Р;Ц;Ь;в;и;о;`<у<=f=Ÿ=Ќ=Т= >F>S>i>}>’>Ї>Л>а>х>šAЉAJJВm;Ї;Б;З;Н;У;Щ;Я;е;л;+<А<џ<=i=Ё=А=Ч=>H>W>n>‚>—>Ћ>Р>е>ъ>ЎAJP<е<1=’=Љ=М=с=9>P>c>y>Ž>Ѓ>З>Ь>с> ?ЄAЮAJ:JМmJ<Я<=Š=Ѓ=Д=Ю=1>J>[>s>ˆ>>Б>Ц>л>?žAШA J4JЖmR<з<C=˜=Р=ъ=?>g>{>>Ѕ>Й>Ю>у> ?ІAаAJD<Щ<^=‚=>)>/<Д<k=>ю>ВAJЋ=R>LЬнQЩоѓ5ЫHP–==>IfЂжы+BMjІкя/FV<л<J?BzJн:§<=Х=S=њ=E=ь=ˆ‹’–šžЂІЊЎВЖКОбчє !%,3I[p|ЁВЖЪЮйV=§=СmЈAJРm йwѕдеwѕдљW ѕћnѕљnѕ"%м `Иgх9‰ЋXСђ™WЂ„ rustfmt::skipСљ<[`Иgх9‰#Ћ9vЭ•кe{щzэz{3{ўz#{U{№ODHT $@Зо,*7ьAТCZ  ‰ншкчВˆ J$ГћЪЦ=їћ_—nNбŠ"G ВјLхњЦЁ‚аы$%„<Еб­˜б ѕ=)Эвфя@ќ›Ђ:“в! Ѕ.Х_O. a „kœає‹#$ЃйЂЅщQіWмѕš~@˜ƒмНaѕ иГAŸВfи”v­_”ПŽ”pYу!˜š‹sJ*b•ъТшЃŒ‹#P!`Иgх9‰іх1чv "ƒTг)˜24н?+ЏюНYКв;kд—д ѓnDЎяI&иђ‰Э‡–ƒиВ1RP IšМѓpФъŸh4RћlWšіёЛ)ЎlаяЙ’vн ђй•P9˜™ъС;ъЙyHімр“є{Ьш†iFтОЮЕцџ!џџџџџџџџtџY/r h 0џџџRџџ?zџ3GEu(џ@џ џџ^KџwџџџC()џџn{Cџsџџ!џџџџџџџџtџY/r]/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26/src/tables.rsСO/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26С]/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26/src/tables.rsС чЖКщ Ў|Ое5ГsZчќчќЁQ@3+,6HK$0),;ddddddddddddddddddddddddddddddd^?dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 8ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddя†ШЯ<­Й3)u8$шНIХZ/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26/src/lib.rsСO/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26СZ/root/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.26/src/lib.rsС !ђ†xКUќˆьИ…Р§ІeІeœЇkon OA2OMQ !K%JD>Q>KHN?A=BMKHBGO; %PC #7&& $ MMMJLNMM;OGO2N#OPMNQLOQ4LAI **&*%&QLONPJQ3OPGON,PQ'QMQONP MKN#-?NNLO'IE7QQJJJPQNQ#4PP(QFFPP9 5 ЁЄ QNEOP6PMLJ;RPFQMJ0PJ @   (d?(5 &/GQB+8 &5GQЦЁVЄJе—ЇЕВp•­Љ8T ы~м‚x86_64-unknown-linux-gnuСЄђY‹ћ›ГЃКќYЙЛО unicode_identС-de61ca3b509bd8dfС`Иgх9‰žŠRІф$ #i0$?#$$F#HF$$H$HHB#,F.$2H2,$$HH-#F**$*H*$HХаrust-end-file