diff --git a/Cargo.lock b/Cargo.lock index 23f0bd451a4..347a4c52dab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -495,15 +495,6 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" -[[package]] -name = "html-escape" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15315cfa9503e9aa85a477138eff76a1b203a430703548052c330b69d8d8c205" -dependencies = [ - "utf8-width", -] - [[package]] name = "hurl" version = "2.0.0-SNAPSHOT" @@ -521,9 +512,9 @@ dependencies = [ "glob", "hex", "hex-literal", - "html-escape", "hurl_core", "indexmap", + "lazy_static", "libflate", "libxml", "md5", @@ -1192,12 +1183,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "utf8-width" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" - [[package]] name = "vcpkg" version = "0.2.15" diff --git a/integration/tests_ok/filter.html b/integration/tests_ok/filter.html index 809228d9231..34062bc4403 100644 --- a/integration/tests_ok/filter.html +++ b/integration/tests_ok/filter.html @@ -3,7 +3,7 @@ HTTP 200 [Captures] url: jsonpath "$.url" -html: jsonpath "$.html" +text: jsonpath "$.text" [Asserts] jsonpath "$.list" count == 3 jsonpath "$.message" regex /Hello (.*)!/ == "Bob" @@ -11,10 +11,12 @@ jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" variable "url" urlEncode urlDecode == "{{url}}" -jsonpath "$.html" == "a > b && a < c" -jsonpath "$.html" htmlEscape == "a &gt; b &amp;&amp; a &lt; c" -jsonpath "$.encoded_html" htmlUnescape == "a > b && a < c" -variable "html" htmlEscape htmlUnescape == "{{html}}" +jsonpath "$.text" == "a > b && a < c" +jsonpath "$.text" htmlEscape == "a &gt; b &amp;&amp; a &lt; c" +jsonpath "$.escaped_html[0]" htmlUnescape == "a > b && a < c" +jsonpath "$.escaped_html[1]" htmlUnescape == "Foo © bar 𝌆 baz ☃ qux" +jsonpath "$.escaped_html[2]" htmlUnescape == "A foo" +variable "text" htmlEscape htmlUnescape == "{{text}}" jsonpath "$.id" toInt == 123 jsonpath "$.score" toInt == 1 { @@ -22,8 +24,12 @@ "message": "Hello Bob!", "url": "https://mozilla.org/?x=шеллы", "encoded_url": "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", - "html": "a > b && a < c", - "encoded_html": "a &gt; b &amp;&amp; a &lt; c", + "text": "a > b && a < c", + "escaped_html": [ + "a &gt; b &amp;&amp; a &lt; c", + "Foo &#xA9; bar &#x1D306; baz &#x2603; qux", + "&#65 foo" + ], "id": "123", "score": 1.6 } diff --git a/integration/tests_ok/filter.hurl b/integration/tests_ok/filter.hurl index 3c71a462b10..eeaa69d61d9 100644 --- a/integration/tests_ok/filter.hurl +++ b/integration/tests_ok/filter.hurl @@ -3,7 +3,7 @@ GET http://localhost:8000/filter HTTP 200 [Captures] url: jsonpath "$.url" -html: jsonpath "$.html" +text: jsonpath "$.text" [Asserts] jsonpath "$.list" count == 3 jsonpath "$.message" regex /Hello (.*)!/ == "Bob" @@ -11,10 +11,12 @@ jsonpath "$.url" == "https://mozilla.org/?x=шеллы" jsonpath "$.url" urlEncode == "https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B" jsonpath "$.encoded_url" urlDecode == "https://mozilla.org/?x=шеллы" variable "url" urlEncode urlDecode == "{{url}}" -jsonpath "$.html" == "a > b && a < c" -jsonpath "$.html" htmlEscape == "a > b && a < c" -jsonpath "$.encoded_html" htmlUnescape == "a > b && a < c" -variable "html" htmlEscape htmlUnescape == "{{html}}" +jsonpath "$.text" == "a > b && a < c" +jsonpath "$.text" htmlEscape == "a > b && a < c" +jsonpath "$.escaped_html[0]" htmlUnescape == "a > b && a < c" +jsonpath "$.escaped_html[1]" htmlUnescape == "Foo © bar 𝌆 baz ☃ qux" +jsonpath "$.escaped_html[2]" htmlUnescape == "A foo" +variable "text" htmlEscape htmlUnescape == "{{text}}" jsonpath "$.id" toInt == 123 jsonpath "$.score" toInt == 1 { @@ -22,8 +24,12 @@ jsonpath "$.score" toInt == 1 "message": "Hello Bob!", "url": "https://mozilla.org/?x=шеллы", "encoded_url": "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", - "html": "a > b && a < c", - "encoded_html": "a > b && a < c", + "text": "a > b && a < c", + "escaped_html": [ + "a > b && a < c", + "Foo © bar 𝌆 baz ☃ qux", + "A foo" + ], "id": "123", "score": 1.6 } diff --git a/integration/tests_ok/filter.json b/integration/tests_ok/filter.json index f203c5e5a71..5076c33c2a0 100644 --- a/integration/tests_ok/filter.json +++ b/integration/tests_ok/filter.json @@ -1 +1 @@ -{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/filter"},"response":{"status":200,"captures":[{"name":"url","query":{"type":"jsonpath","expr":"$.url"}},{"name":"html","query":{"type":"jsonpath","expr":"$.html"}}],"asserts":[{"query":{"type":"jsonpath","expr":"$.list"},"filters":[{"type":"count"}],"predicate":{"type":"equal","value":3}},{"query":{"type":"jsonpath","expr":"$.message"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello (.*)!"}}],"predicate":{"type":"equal","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.url"},"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"equal","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"variable","name":"url"},"filters":[{"type":"urlEncode"},{"type":"urlDecode"}],"predicate":{"type":"equal","value":"{{url}}"}},{"query":{"type":"jsonpath","expr":"$.html"},"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"jsonpath","expr":"$.html"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"jsonpath","expr":"$.encoded_html"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"variable","name":"html"},"filters":[{"type":"htmlEscape"},{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"{{html}}"}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":123}},{"query":{"type":"jsonpath","expr":"$.score"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":1}}],"body":{"type":"json","value":{"list":[1,2,3],"message":"Hello Bob!","url":"https://mozilla.org/?x=шеллы","encoded_url":"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B","html":"a > b && a < c","encoded_html":"a > b && a < c","id":"123","score":1.6}}}}]} +{"entries":[{"request":{"method":"GET","url":"http://localhost:8000/filter"},"response":{"status":200,"captures":[{"name":"url","query":{"type":"jsonpath","expr":"$.url"}},{"name":"text","query":{"type":"jsonpath","expr":"$.text"}}],"asserts":[{"query":{"type":"jsonpath","expr":"$.list"},"filters":[{"type":"count"}],"predicate":{"type":"equal","value":3}},{"query":{"type":"jsonpath","expr":"$.message"},"filters":[{"type":"regex","expr":{"type":"regex","value":"Hello (.*)!"}}],"predicate":{"type":"equal","value":"Bob"}},{"query":{"type":"jsonpath","expr":"$.url"},"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"jsonpath","expr":"$.url"},"filters":[{"type":"urlEncode"}],"predicate":{"type":"equal","value":"https%3A//mozilla.org/%3Fx%3D%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"}},{"query":{"type":"jsonpath","expr":"$.encoded_url"},"filters":[{"type":"urlDecode"}],"predicate":{"type":"equal","value":"https://mozilla.org/?x=шеллы"}},{"query":{"type":"variable","name":"url"},"filters":[{"type":"urlEncode"},{"type":"urlDecode"}],"predicate":{"type":"equal","value":"{{url}}"}},{"query":{"type":"jsonpath","expr":"$.text"},"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"jsonpath","expr":"$.text"},"filters":[{"type":"htmlEscape"}],"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[0]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"a > b && a < c"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[1]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"Foo © bar 𝌆 baz ☃ qux"}},{"query":{"type":"jsonpath","expr":"$.escaped_html[2]"},"filters":[{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"A foo"}},{"query":{"type":"variable","name":"text"},"filters":[{"type":"htmlEscape"},{"type":"htmlUnescape"}],"predicate":{"type":"equal","value":"{{text}}"}},{"query":{"type":"jsonpath","expr":"$.id"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":123}},{"query":{"type":"jsonpath","expr":"$.score"},"filters":[{"type":"toInt"}],"predicate":{"type":"equal","value":1}}],"body":{"type":"json","value":{"list":[1,2,3],"message":"Hello Bob!","url":"https://mozilla.org/?x=шеллы","encoded_url":"https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B","text":"a > b && a < c","escaped_html":["a > b && a < c","Foo © bar 𝌆 baz ☃ qux","A foo"],"id":"123","score":1.6}}}}]} diff --git a/integration/tests_ok/filter.out b/integration/tests_ok/filter.out new file mode 100644 index 00000000000..dd0488d10e6 --- /dev/null +++ b/integration/tests_ok/filter.out @@ -0,0 +1,14 @@ +{ + "list": [1,2,3], + "message": "Hello Bob!", + "url": "https://mozilla.org/?x=шеллы", + "encoded_url": "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", + "text": "a > b && a < c", + "escaped_html": [ + "a > b && a < c", + "Foo © bar 𝌆 baz ☃ qux", + "A foo" + ], + "id": "123", + "score": 1.6 +} \ No newline at end of file diff --git a/integration/tests_ok/filter.py b/integration/tests_ok/filter.py index 1a61846b09d..7678c47343f 100644 --- a/integration/tests_ok/filter.py +++ b/integration/tests_ok/filter.py @@ -8,8 +8,12 @@ def filter(): "message": "Hello Bob!", "url": "https://mozilla.org/?x=шеллы", "encoded_url": "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B", - "html": "a > b && a < c", - "encoded_html": "a > b && a < c", + "text": "a > b && a < c", + "escaped_html": [ + "a > b && a < c", + "Foo © bar 𝌆 baz ☃ qux", + "A foo" + ], "id": "123", "score": 1.6 }""" diff --git a/packages/hurl/Cargo.toml b/packages/hurl/Cargo.toml index 7d7e4cded61..0d2ce947bc6 100644 --- a/packages/hurl/Cargo.toml +++ b/packages/hurl/Cargo.toml @@ -29,7 +29,6 @@ float-cmp = "0.9.0" glob = "0.3.0" hex = "0.4.3" hex-literal = "0.3.4" -html-escape = "0.2.12" hurl_core = { version = "2.0.0-SNAPSHOT", path = "../hurl_core" } indexmap = "1.9.2" libflate = "1.2.0" @@ -42,7 +41,7 @@ serde_json = "1.0.89" sha2 = "0.10.6" url = "2.3.1" xmltree = { version = "0.10.3", features = ["attribute-order"] } - +lazy_static = "1.4.0" [target.'cfg(unix)'.dependencies] termion = "2.0.1" diff --git a/packages/hurl/src/html/entities.rs b/packages/hurl/src/html/entities.rs new file mode 100644 index 00000000000..3c5ce2526c0 --- /dev/null +++ b/packages/hurl/src/html/entities.rs @@ -0,0 +1,2262 @@ +/* + * Hurl (https://hurl.dev) + * Copyright (C) 2022 Orange + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +use lazy_static::lazy_static; +use std::collections::HashMap; + +// HTML5 named character references +// +// Generated from https://html.spec.whatwg.org/entities.json and +// https://html.spec.whatwg.org/multipage/named-characters.html. +// Map HTML5 named character references to the equivalent Unicode character(s). +lazy_static! { + pub static ref HTML5_ENTITIES: HashMap<&'static str, &'static str> = { + let mut m = HashMap::new(); + m.insert("AElig", "\u{C6}"); + m.insert("AElig;", "\u{C6}"); + m.insert("AMP", "\u{26}"); + m.insert("AMP;", "\u{26}"); + m.insert("Aacute", "\u{C1}"); + m.insert("Aacute;", "\u{C1}"); + m.insert("Abreve;", "\u{102}"); + m.insert("Acirc", "\u{C2}"); + m.insert("Acirc;", "\u{C2}"); + m.insert("Acy;", "\u{410}"); + m.insert("Afr;", "\u{1D504}"); + m.insert("Agrave", "\u{C0}"); + m.insert("Agrave;", "\u{C0}"); + m.insert("Alpha;", "\u{391}"); + m.insert("Amacr;", "\u{100}"); + m.insert("And;", "\u{2A53}"); + m.insert("Aogon;", "\u{104}"); + m.insert("Aopf;", "\u{1D538}"); + m.insert("ApplyFunction;", "\u{2061}"); + m.insert("Aring", "\u{C5}"); + m.insert("Aring;", "\u{C5}"); + m.insert("Ascr;", "\u{1D49C}"); + m.insert("Assign;", "\u{2254}"); + m.insert("Atilde", "\u{C3}"); + m.insert("Atilde;", "\u{C3}"); + m.insert("Auml", "\u{C4}"); + m.insert("Auml;", "\u{C4}"); + m.insert("Backslash;", "\u{2216}"); + m.insert("Barv;", "\u{2AE7}"); + m.insert("Barwed;", "\u{2306}"); + m.insert("Bcy;", "\u{411}"); + m.insert("Because;", "\u{2235}"); + m.insert("Bernoullis;", "\u{212C}"); + m.insert("Beta;", "\u{392}"); + m.insert("Bfr;", "\u{1D505}"); + m.insert("Bopf;", "\u{1D539}"); + m.insert("Breve;", "\u{2D8}"); + m.insert("Bscr;", "\u{212C}"); + m.insert("Bumpeq;", "\u{224E}"); + m.insert("CHcy;", "\u{427}"); + m.insert("COPY", "\u{A9}"); + m.insert("COPY;", "\u{A9}"); + m.insert("Cacute;", "\u{106}"); + m.insert("Cap;", "\u{22D2}"); + m.insert("CapitalDifferentialD;", "\u{2145}"); + m.insert("Cayleys;", "\u{212D}"); + m.insert("Ccaron;", "\u{10C}"); + m.insert("Ccedil", "\u{C7}"); + m.insert("Ccedil;", "\u{C7}"); + m.insert("Ccirc;", "\u{108}"); + m.insert("Cconint;", "\u{2230}"); + m.insert("Cdot;", "\u{10A}"); + m.insert("Cedilla;", "\u{B8}"); + m.insert("CenterDot;", "\u{B7}"); + m.insert("Cfr;", "\u{212D}"); + m.insert("Chi;", "\u{3A7}"); + m.insert("CircleDot;", "\u{2299}"); + m.insert("CircleMinus;", "\u{2296}"); + m.insert("CirclePlus;", "\u{2295}"); + m.insert("CircleTimes;", "\u{2297}"); + m.insert("ClockwiseContourIntegral;", "\u{2232}"); + m.insert("CloseCurlyDoubleQuote;", "\u{201D}"); + m.insert("CloseCurlyQuote;", "\u{2019}"); + m.insert("Colon;", "\u{2237}"); + m.insert("Colone;", "\u{2A74}"); + m.insert("Congruent;", "\u{2261}"); + m.insert("Conint;", "\u{222F}"); + m.insert("ContourIntegral;", "\u{222E}"); + m.insert("Copf;", "\u{2102}"); + m.insert("Coproduct;", "\u{2210}"); + m.insert("CounterClockwiseContourIntegral;", "\u{2233}"); + m.insert("Cross;", "\u{2A2F}"); + m.insert("Cscr;", "\u{1D49E}"); + m.insert("Cup;", "\u{22D3}"); + m.insert("CupCap;", "\u{224D}"); + m.insert("DD;", "\u{2145}"); + m.insert("DDotrahd;", "\u{2911}"); + m.insert("DJcy;", "\u{402}"); + m.insert("DScy;", "\u{405}"); + m.insert("DZcy;", "\u{40F}"); + m.insert("Dagger;", "\u{2021}"); + m.insert("Darr;", "\u{21A1}"); + m.insert("Dashv;", "\u{2AE4}"); + m.insert("Dcaron;", "\u{10E}"); + m.insert("Dcy;", "\u{414}"); + m.insert("Del;", "\u{2207}"); + m.insert("Delta;", "\u{394}"); + m.insert("Dfr;", "\u{1D507}"); + m.insert("DiacriticalAcute;", "\u{B4}"); + m.insert("DiacriticalDot;", "\u{2D9}"); + m.insert("DiacriticalDoubleAcute;", "\u{2DD}"); + m.insert("DiacriticalGrave;", "\u{60}"); + m.insert("DiacriticalTilde;", "\u{2DC}"); + m.insert("Diamond;", "\u{22C4}"); + m.insert("DifferentialD;", "\u{2146}"); + m.insert("Dopf;", "\u{1D53B}"); + m.insert("Dot;", "\u{A8}"); + m.insert("DotDot;", "\u{20DC}"); + m.insert("DotEqual;", "\u{2250}"); + m.insert("DoubleContourIntegral;", "\u{222F}"); + m.insert("DoubleDot;", "\u{A8}"); + m.insert("DoubleDownArrow;", "\u{21D3}"); + m.insert("DoubleLeftArrow;", "\u{21D0}"); + m.insert("DoubleLeftRightArrow;", "\u{21D4}"); + m.insert("DoubleLeftTee;", "\u{2AE4}"); + m.insert("DoubleLongLeftArrow;", "\u{27F8}"); + m.insert("DoubleLongLeftRightArrow;", "\u{27FA}"); + m.insert("DoubleLongRightArrow;", "\u{27F9}"); + m.insert("DoubleRightArrow;", "\u{21D2}"); + m.insert("DoubleRightTee;", "\u{22A8}"); + m.insert("DoubleUpArrow;", "\u{21D1}"); + m.insert("DoubleUpDownArrow;", "\u{21D5}"); + m.insert("DoubleVerticalBar;", "\u{2225}"); + m.insert("DownArrow;", "\u{2193}"); + m.insert("DownArrowBar;", "\u{2913}"); + m.insert("DownArrowUpArrow;", "\u{21F5}"); + m.insert("DownBreve;", "\u{311}"); + m.insert("DownLeftRightVector;", "\u{2950}"); + m.insert("DownLeftTeeVector;", "\u{295E}"); + m.insert("DownLeftVector;", "\u{21BD}"); + m.insert("DownLeftVectorBar;", "\u{2956}"); + m.insert("DownRightTeeVector;", "\u{295F}"); + m.insert("DownRightVector;", "\u{21C1}"); + m.insert("DownRightVectorBar;", "\u{2957}"); + m.insert("DownTee;", "\u{22A4}"); + m.insert("DownTeeArrow;", "\u{21A7}"); + m.insert("Downarrow;", "\u{21D3}"); + m.insert("Dscr;", "\u{1D49F}"); + m.insert("Dstrok;", "\u{110}"); + m.insert("ENG;", "\u{14A}"); + m.insert("ETH", "\u{D0}"); + m.insert("ETH;", "\u{D0}"); + m.insert("Eacute", "\u{C9}"); + m.insert("Eacute;", "\u{C9}"); + m.insert("Ecaron;", "\u{11A}"); + m.insert("Ecirc", "\u{CA}"); + m.insert("Ecirc;", "\u{CA}"); + m.insert("Ecy;", "\u{42D}"); + m.insert("Edot;", "\u{116}"); + m.insert("Efr;", "\u{1D508}"); + m.insert("Egrave", "\u{C8}"); + m.insert("Egrave;", "\u{C8}"); + m.insert("Element;", "\u{2208}"); + m.insert("Emacr;", "\u{112}"); + m.insert("EmptySmallSquare;", "\u{25FB}"); + m.insert("EmptyVerySmallSquare;", "\u{25AB}"); + m.insert("Eogon;", "\u{118}"); + m.insert("Eopf;", "\u{1D53C}"); + m.insert("Epsilon;", "\u{395}"); + m.insert("Equal;", "\u{2A75}"); + m.insert("EqualTilde;", "\u{2242}"); + m.insert("Equilibrium;", "\u{21CC}"); + m.insert("Escr;", "\u{2130}"); + m.insert("Esim;", "\u{2A73}"); + m.insert("Eta;", "\u{397}"); + m.insert("Euml", "\u{CB}"); + m.insert("Euml;", "\u{CB}"); + m.insert("Exists;", "\u{2203}"); + m.insert("ExponentialE;", "\u{2147}"); + m.insert("Fcy;", "\u{424}"); + m.insert("Ffr;", "\u{1D509}"); + m.insert("FilledSmallSquare;", "\u{25FC}"); + m.insert("FilledVerySmallSquare;", "\u{25AA}"); + m.insert("Fopf;", "\u{1D53D}"); + m.insert("ForAll;", "\u{2200}"); + m.insert("Fouriertrf;", "\u{2131}"); + m.insert("Fscr;", "\u{2131}"); + m.insert("GJcy;", "\u{403}"); + m.insert("GT", "\u{3E}"); + m.insert("GT;", "\u{3E}"); + m.insert("Gamma;", "\u{393}"); + m.insert("Gammad;", "\u{3DC}"); + m.insert("Gbreve;", "\u{11E}"); + m.insert("Gcedil;", "\u{122}"); + m.insert("Gcirc;", "\u{11C}"); + m.insert("Gcy;", "\u{413}"); + m.insert("Gdot;", "\u{120}"); + m.insert("Gfr;", "\u{1D50A}"); + m.insert("Gg;", "\u{22D9}"); + m.insert("Gopf;", "\u{1D53E}"); + m.insert("GreaterEqual;", "\u{2265}"); + m.insert("GreaterEqualLess;", "\u{22DB}"); + m.insert("GreaterFullEqual;", "\u{2267}"); + m.insert("GreaterGreater;", "\u{2AA2}"); + m.insert("GreaterLess;", "\u{2277}"); + m.insert("GreaterSlantEqual;", "\u{2A7E}"); + m.insert("GreaterTilde;", "\u{2273}"); + m.insert("Gscr;", "\u{1D4A2}"); + m.insert("Gt;", "\u{226B}"); + m.insert("HARDcy;", "\u{42A}"); + m.insert("Hacek;", "\u{2C7}"); + m.insert("Hat;", "\u{5E}"); + m.insert("Hcirc;", "\u{124}"); + m.insert("Hfr;", "\u{210C}"); + m.insert("HilbertSpace;", "\u{210B}"); + m.insert("Hopf;", "\u{210D}"); + m.insert("HorizontalLine;", "\u{2500}"); + m.insert("Hscr;", "\u{210B}"); + m.insert("Hstrok;", "\u{126}"); + m.insert("HumpDownHump;", "\u{224E}"); + m.insert("HumpEqual;", "\u{224F}"); + m.insert("IEcy;", "\u{415}"); + m.insert("IJlig;", "\u{132}"); + m.insert("IOcy;", "\u{401}"); + m.insert("Iacute", "\u{CD}"); + m.insert("Iacute;", "\u{CD}"); + m.insert("Icirc", "\u{CE}"); + m.insert("Icirc;", "\u{CE}"); + m.insert("Icy;", "\u{418}"); + m.insert("Idot;", "\u{130}"); + m.insert("Ifr;", "\u{2111}"); + m.insert("Igrave", "\u{CC}"); + m.insert("Igrave;", "\u{CC}"); + m.insert("Im;", "\u{2111}"); + m.insert("Imacr;", "\u{12A}"); + m.insert("ImaginaryI;", "\u{2148}"); + m.insert("Implies;", "\u{21D2}"); + m.insert("Int;", "\u{222C}"); + m.insert("Integral;", "\u{222B}"); + m.insert("Intersection;", "\u{22C2}"); + m.insert("InvisibleComma;", "\u{2063}"); + m.insert("InvisibleTimes;", "\u{2062}"); + m.insert("Iogon;", "\u{12E}"); + m.insert("Iopf;", "\u{1D540}"); + m.insert("Iota;", "\u{399}"); + m.insert("Iscr;", "\u{2110}"); + m.insert("Itilde;", "\u{128}"); + m.insert("Iukcy;", "\u{406}"); + m.insert("Iuml", "\u{CF}"); + m.insert("Iuml;", "\u{CF}"); + m.insert("Jcirc;", "\u{134}"); + m.insert("Jcy;", "\u{419}"); + m.insert("Jfr;", "\u{1D50D}"); + m.insert("Jopf;", "\u{1D541}"); + m.insert("Jscr;", "\u{1D4A5}"); + m.insert("Jsercy;", "\u{408}"); + m.insert("Jukcy;", "\u{404}"); + m.insert("KHcy;", "\u{425}"); + m.insert("KJcy;", "\u{40C}"); + m.insert("Kappa;", "\u{39A}"); + m.insert("Kcedil;", "\u{136}"); + m.insert("Kcy;", "\u{41A}"); + m.insert("Kfr;", "\u{1D50E}"); + m.insert("Kopf;", "\u{1D542}"); + m.insert("Kscr;", "\u{1D4A6}"); + m.insert("LJcy;", "\u{409}"); + m.insert("LT", "\u{3C}"); + m.insert("LT;", "\u{3C}"); + m.insert("Lacute;", "\u{139}"); + m.insert("Lambda;", "\u{39B}"); + m.insert("Lang;", "\u{27EA}"); + m.insert("Laplacetrf;", "\u{2112}"); + m.insert("Larr;", "\u{219E}"); + m.insert("Lcaron;", "\u{13D}"); + m.insert("Lcedil;", "\u{13B}"); + m.insert("Lcy;", "\u{41B}"); + m.insert("LeftAngleBracket;", "\u{27E8}"); + m.insert("LeftArrow;", "\u{2190}"); + m.insert("LeftArrowBar;", "\u{21E4}"); + m.insert("LeftArrowRightArrow;", "\u{21C6}"); + m.insert("LeftCeiling;", "\u{2308}"); + m.insert("LeftDoubleBracket;", "\u{27E6}"); + m.insert("LeftDownTeeVector;", "\u{2961}"); + m.insert("LeftDownVector;", "\u{21C3}"); + m.insert("LeftDownVectorBar;", "\u{2959}"); + m.insert("LeftFloor;", "\u{230A}"); + m.insert("LeftRightArrow;", "\u{2194}"); + m.insert("LeftRightVector;", "\u{294E}"); + m.insert("LeftTee;", "\u{22A3}"); + m.insert("LeftTeeArrow;", "\u{21A4}"); + m.insert("LeftTeeVector;", "\u{295A}"); + m.insert("LeftTriangle;", "\u{22B2}"); + m.insert("LeftTriangleBar;", "\u{29CF}"); + m.insert("LeftTriangleEqual;", "\u{22B4}"); + m.insert("LeftUpDownVector;", "\u{2951}"); + m.insert("LeftUpTeeVector;", "\u{2960}"); + m.insert("LeftUpVector;", "\u{21BF}"); + m.insert("LeftUpVectorBar;", "\u{2958}"); + m.insert("LeftVector;", "\u{21BC}"); + m.insert("LeftVectorBar;", "\u{2952}"); + m.insert("Leftarrow;", "\u{21D0}"); + m.insert("Leftrightarrow;", "\u{21D4}"); + m.insert("LessEqualGreater;", "\u{22DA}"); + m.insert("LessFullEqual;", "\u{2266}"); + m.insert("LessGreater;", "\u{2276}"); + m.insert("LessLess;", "\u{2AA1}"); + m.insert("LessSlantEqual;", "\u{2A7D}"); + m.insert("LessTilde;", "\u{2272}"); + m.insert("Lfr;", "\u{1D50F}"); + m.insert("Ll;", "\u{22D8}"); + m.insert("Lleftarrow;", "\u{21DA}"); + m.insert("Lmidot;", "\u{13F}"); + m.insert("LongLeftArrow;", "\u{27F5}"); + m.insert("LongLeftRightArrow;", "\u{27F7}"); + m.insert("LongRightArrow;", "\u{27F6}"); + m.insert("Longleftarrow;", "\u{27F8}"); + m.insert("Longleftrightarrow;", "\u{27FA}"); + m.insert("Longrightarrow;", "\u{27F9}"); + m.insert("Lopf;", "\u{1D543}"); + m.insert("LowerLeftArrow;", "\u{2199}"); + m.insert("LowerRightArrow;", "\u{2198}"); + m.insert("Lscr;", "\u{2112}"); + m.insert("Lsh;", "\u{21B0}"); + m.insert("Lstrok;", "\u{141}"); + m.insert("Lt;", "\u{226A}"); + m.insert("Map;", "\u{2905}"); + m.insert("Mcy;", "\u{41C}"); + m.insert("MediumSpace;", "\u{205F}"); + m.insert("Mellintrf;", "\u{2133}"); + m.insert("Mfr;", "\u{1D510}"); + m.insert("MinusPlus;", "\u{2213}"); + m.insert("Mopf;", "\u{1D544}"); + m.insert("Mscr;", "\u{2133}"); + m.insert("Mu;", "\u{39C}"); + m.insert("NJcy;", "\u{40A}"); + m.insert("Nacute;", "\u{143}"); + m.insert("Ncaron;", "\u{147}"); + m.insert("Ncedil;", "\u{145}"); + m.insert("Ncy;", "\u{41D}"); + m.insert("NegativeMediumSpace;", "\u{200B}"); + m.insert("NegativeThickSpace;", "\u{200B}"); + m.insert("NegativeThinSpace;", "\u{200B}"); + m.insert("NegativeVeryThinSpace;", "\u{200B}"); + m.insert("NestedGreaterGreater;", "\u{226B}"); + m.insert("NestedLessLess;", "\u{226A}"); + m.insert("NewLine;", "\u{A}"); + m.insert("Nfr;", "\u{1D511}"); + m.insert("NoBreak;", "\u{2060}"); + m.insert("NonBreakingSpace;", "\u{A0}"); + m.insert("Nopf;", "\u{2115}"); + m.insert("Not;", "\u{2AEC}"); + m.insert("NotCongruent;", "\u{2262}"); + m.insert("NotCupCap;", "\u{226D}"); + m.insert("NotDoubleVerticalBar;", "\u{2226}"); + m.insert("NotElement;", "\u{2209}"); + m.insert("NotEqual;", "\u{2260}"); + m.insert("NotEqualTilde;", "\u{2242}\u{338}"); + m.insert("NotExists;", "\u{2204}"); + m.insert("NotGreater;", "\u{226F}"); + m.insert("NotGreaterEqual;", "\u{2271}"); + m.insert("NotGreaterFullEqual;", "\u{2267}\u{338}"); + m.insert("NotGreaterGreater;", "\u{226B}\u{338}"); + m.insert("NotGreaterLess;", "\u{2279}"); + m.insert("NotGreaterSlantEqual;", "\u{2A7E}\u{338}"); + m.insert("NotGreaterTilde;", "\u{2275}"); + m.insert("NotHumpDownHump;", "\u{224E}\u{338}"); + m.insert("NotHumpEqual;", "\u{224F}\u{338}"); + m.insert("NotLeftTriangle;", "\u{22EA}"); + m.insert("NotLeftTriangleBar;", "\u{29CF}\u{338}"); + m.insert("NotLeftTriangleEqual;", "\u{22EC}"); + m.insert("NotLess;", "\u{226E}"); + m.insert("NotLessEqual;", "\u{2270}"); + m.insert("NotLessGreater;", "\u{2278}"); + m.insert("NotLessLess;", "\u{226A}\u{338}"); + m.insert("NotLessSlantEqual;", "\u{2A7D}\u{338}"); + m.insert("NotLessTilde;", "\u{2274}"); + m.insert("NotNestedGreaterGreater;", "\u{2AA2}\u{338}"); + m.insert("NotNestedLessLess;", "\u{2AA1}\u{338}"); + m.insert("NotPrecedes;", "\u{2280}"); + m.insert("NotPrecedesEqual;", "\u{2AAF}\u{338}"); + m.insert("NotPrecedesSlantEqual;", "\u{22E0}"); + m.insert("NotReverseElement;", "\u{220C}"); + m.insert("NotRightTriangle;", "\u{22EB}"); + m.insert("NotRightTriangleBar;", "\u{29D0}\u{338}"); + m.insert("NotRightTriangleEqual;", "\u{22ED}"); + m.insert("NotSquareSubset;", "\u{228F}\u{338}"); + m.insert("NotSquareSubsetEqual;", "\u{22E2}"); + m.insert("NotSquareSuperset;", "\u{2290}\u{338}"); + m.insert("NotSquareSupersetEqual;", "\u{22E3}"); + m.insert("NotSubset;", "\u{2282}\u{20D2}"); + m.insert("NotSubsetEqual;", "\u{2288}"); + m.insert("NotSucceeds;", "\u{2281}"); + m.insert("NotSucceedsEqual;", "\u{2AB0}\u{338}"); + m.insert("NotSucceedsSlantEqual;", "\u{22E1}"); + m.insert("NotSucceedsTilde;", "\u{227F}\u{338}"); + m.insert("NotSuperset;", "\u{2283}\u{20D2}"); + m.insert("NotSupersetEqual;", "\u{2289}"); + m.insert("NotTilde;", "\u{2241}"); + m.insert("NotTildeEqual;", "\u{2244}"); + m.insert("NotTildeFullEqual;", "\u{2247}"); + m.insert("NotTildeTilde;", "\u{2249}"); + m.insert("NotVerticalBar;", "\u{2224}"); + m.insert("Nscr;", "\u{1D4A9}"); + m.insert("Ntilde", "\u{D1}"); + m.insert("Ntilde;", "\u{D1}"); + m.insert("Nu;", "\u{39D}"); + m.insert("OElig;", "\u{152}"); + m.insert("Oacute", "\u{D3}"); + m.insert("Oacute;", "\u{D3}"); + m.insert("Ocirc", "\u{D4}"); + m.insert("Ocirc;", "\u{D4}"); + m.insert("Ocy;", "\u{41E}"); + m.insert("Odblac;", "\u{150}"); + m.insert("Ofr;", "\u{1D512}"); + m.insert("Ograve", "\u{D2}"); + m.insert("Ograve;", "\u{D2}"); + m.insert("Omacr;", "\u{14C}"); + m.insert("Omega;", "\u{3A9}"); + m.insert("Omicron;", "\u{39F}"); + m.insert("Oopf;", "\u{1D546}"); + m.insert("OpenCurlyDoubleQuote;", "\u{201C}"); + m.insert("OpenCurlyQuote;", "\u{2018}"); + m.insert("Or;", "\u{2A54}"); + m.insert("Oscr;", "\u{1D4AA}"); + m.insert("Oslash", "\u{D8}"); + m.insert("Oslash;", "\u{D8}"); + m.insert("Otilde", "\u{D5}"); + m.insert("Otilde;", "\u{D5}"); + m.insert("Otimes;", "\u{2A37}"); + m.insert("Ouml", "\u{D6}"); + m.insert("Ouml;", "\u{D6}"); + m.insert("OverBar;", "\u{203E}"); + m.insert("OverBrace;", "\u{23DE}"); + m.insert("OverBracket;", "\u{23B4}"); + m.insert("OverParenthesis;", "\u{23DC}"); + m.insert("PartialD;", "\u{2202}"); + m.insert("Pcy;", "\u{41F}"); + m.insert("Pfr;", "\u{1D513}"); + m.insert("Phi;", "\u{3A6}"); + m.insert("Pi;", "\u{3A0}"); + m.insert("PlusMinus;", "\u{B1}"); + m.insert("Poincareplane;", "\u{210C}"); + m.insert("Popf;", "\u{2119}"); + m.insert("Pr;", "\u{2ABB}"); + m.insert("Precedes;", "\u{227A}"); + m.insert("PrecedesEqual;", "\u{2AAF}"); + m.insert("PrecedesSlantEqual;", "\u{227C}"); + m.insert("PrecedesTilde;", "\u{227E}"); + m.insert("Prime;", "\u{2033}"); + m.insert("Product;", "\u{220F}"); + m.insert("Proportion;", "\u{2237}"); + m.insert("Proportional;", "\u{221D}"); + m.insert("Pscr;", "\u{1D4AB}"); + m.insert("Psi;", "\u{3A8}"); + m.insert("QUOT", "\u{22}"); + m.insert("QUOT;", "\u{22}"); + m.insert("Qfr;", "\u{1D514}"); + m.insert("Qopf;", "\u{211A}"); + m.insert("Qscr;", "\u{1D4AC}"); + m.insert("RBarr;", "\u{2910}"); + m.insert("REG", "\u{AE}"); + m.insert("REG;", "\u{AE}"); + m.insert("Racute;", "\u{154}"); + m.insert("Rang;", "\u{27EB}"); + m.insert("Rarr;", "\u{21A0}"); + m.insert("Rarrtl;", "\u{2916}"); + m.insert("Rcaron;", "\u{158}"); + m.insert("Rcedil;", "\u{156}"); + m.insert("Rcy;", "\u{420}"); + m.insert("Re;", "\u{211C}"); + m.insert("ReverseElement;", "\u{220B}"); + m.insert("ReverseEquilibrium;", "\u{21CB}"); + m.insert("ReverseUpEquilibrium;", "\u{296F}"); + m.insert("Rfr;", "\u{211C}"); + m.insert("Rho;", "\u{3A1}"); + m.insert("RightAngleBracket;", "\u{27E9}"); + m.insert("RightArrow;", "\u{2192}"); + m.insert("RightArrowBar;", "\u{21E5}"); + m.insert("RightArrowLeftArrow;", "\u{21C4}"); + m.insert("RightCeiling;", "\u{2309}"); + m.insert("RightDoubleBracket;", "\u{27E7}"); + m.insert("RightDownTeeVector;", "\u{295D}"); + m.insert("RightDownVector;", "\u{21C2}"); + m.insert("RightDownVectorBar;", "\u{2955}"); + m.insert("RightFloor;", "\u{230B}"); + m.insert("RightTee;", "\u{22A2}"); + m.insert("RightTeeArrow;", "\u{21A6}"); + m.insert("RightTeeVector;", "\u{295B}"); + m.insert("RightTriangle;", "\u{22B3}"); + m.insert("RightTriangleBar;", "\u{29D0}"); + m.insert("RightTriangleEqual;", "\u{22B5}"); + m.insert("RightUpDownVector;", "\u{294F}"); + m.insert("RightUpTeeVector;", "\u{295C}"); + m.insert("RightUpVector;", "\u{21BE}"); + m.insert("RightUpVectorBar;", "\u{2954}"); + m.insert("RightVector;", "\u{21C0}"); + m.insert("RightVectorBar;", "\u{2953}"); + m.insert("Rightarrow;", "\u{21D2}"); + m.insert("Ropf;", "\u{211D}"); + m.insert("RoundImplies;", "\u{2970}"); + m.insert("Rrightarrow;", "\u{21DB}"); + m.insert("Rscr;", "\u{211B}"); + m.insert("Rsh;", "\u{21B1}"); + m.insert("RuleDelayed;", "\u{29F4}"); + m.insert("SHCHcy;", "\u{429}"); + m.insert("SHcy;", "\u{428}"); + m.insert("SOFTcy;", "\u{42C}"); + m.insert("Sacute;", "\u{15A}"); + m.insert("Sc;", "\u{2ABC}"); + m.insert("Scaron;", "\u{160}"); + m.insert("Scedil;", "\u{15E}"); + m.insert("Scirc;", "\u{15C}"); + m.insert("Scy;", "\u{421}"); + m.insert("Sfr;", "\u{1D516}"); + m.insert("ShortDownArrow;", "\u{2193}"); + m.insert("ShortLeftArrow;", "\u{2190}"); + m.insert("ShortRightArrow;", "\u{2192}"); + m.insert("ShortUpArrow;", "\u{2191}"); + m.insert("Sigma;", "\u{3A3}"); + m.insert("SmallCircle;", "\u{2218}"); + m.insert("Sopf;", "\u{1D54A}"); + m.insert("Sqrt;", "\u{221A}"); + m.insert("Square;", "\u{25A1}"); + m.insert("SquareIntersection;", "\u{2293}"); + m.insert("SquareSubset;", "\u{228F}"); + m.insert("SquareSubsetEqual;", "\u{2291}"); + m.insert("SquareSuperset;", "\u{2290}"); + m.insert("SquareSupersetEqual;", "\u{2292}"); + m.insert("SquareUnion;", "\u{2294}"); + m.insert("Sscr;", "\u{1D4AE}"); + m.insert("Star;", "\u{22C6}"); + m.insert("Sub;", "\u{22D0}"); + m.insert("Subset;", "\u{22D0}"); + m.insert("SubsetEqual;", "\u{2286}"); + m.insert("Succeeds;", "\u{227B}"); + m.insert("SucceedsEqual;", "\u{2AB0}"); + m.insert("SucceedsSlantEqual;", "\u{227D}"); + m.insert("SucceedsTilde;", "\u{227F}"); + m.insert("SuchThat;", "\u{220B}"); + m.insert("Sum;", "\u{2211}"); + m.insert("Sup;", "\u{22D1}"); + m.insert("Superset;", "\u{2283}"); + m.insert("SupersetEqual;", "\u{2287}"); + m.insert("Supset;", "\u{22D1}"); + m.insert("THORN", "\u{DE}"); + m.insert("THORN;", "\u{DE}"); + m.insert("TRADE;", "\u{2122}"); + m.insert("TSHcy;", "\u{40B}"); + m.insert("TScy;", "\u{426}"); + m.insert("Tab;", "\u{9}"); + m.insert("Tau;", "\u{3A4}"); + m.insert("Tcaron;", "\u{164}"); + m.insert("Tcedil;", "\u{162}"); + m.insert("Tcy;", "\u{422}"); + m.insert("Tfr;", "\u{1D517}"); + m.insert("Therefore;", "\u{2234}"); + m.insert("Theta;", "\u{398}"); + m.insert("ThickSpace;", "\u{205F}\u{200A}"); + m.insert("ThinSpace;", "\u{2009}"); + m.insert("Tilde;", "\u{223C}"); + m.insert("TildeEqual;", "\u{2243}"); + m.insert("TildeFullEqual;", "\u{2245}"); + m.insert("TildeTilde;", "\u{2248}"); + m.insert("Topf;", "\u{1D54B}"); + m.insert("TripleDot;", "\u{20DB}"); + m.insert("Tscr;", "\u{1D4AF}"); + m.insert("Tstrok;", "\u{166}"); + m.insert("Uacute", "\u{DA}"); + m.insert("Uacute;", "\u{DA}"); + m.insert("Uarr;", "\u{219F}"); + m.insert("Uarrocir;", "\u{2949}"); + m.insert("Ubrcy;", "\u{40E}"); + m.insert("Ubreve;", "\u{16C}"); + m.insert("Ucirc", "\u{DB}"); + m.insert("Ucirc;", "\u{DB}"); + m.insert("Ucy;", "\u{423}"); + m.insert("Udblac;", "\u{170}"); + m.insert("Ufr;", "\u{1D518}"); + m.insert("Ugrave", "\u{D9}"); + m.insert("Ugrave;", "\u{D9}"); + m.insert("Umacr;", "\u{16A}"); + m.insert("UnderBar;", "\u{5F}"); + m.insert("UnderBrace;", "\u{23DF}"); + m.insert("UnderBracket;", "\u{23B5}"); + m.insert("UnderParenthesis;", "\u{23DD}"); + m.insert("Union;", "\u{22C3}"); + m.insert("UnionPlus;", "\u{228E}"); + m.insert("Uogon;", "\u{172}"); + m.insert("Uopf;", "\u{1D54C}"); + m.insert("UpArrow;", "\u{2191}"); + m.insert("UpArrowBar;", "\u{2912}"); + m.insert("UpArrowDownArrow;", "\u{21C5}"); + m.insert("UpDownArrow;", "\u{2195}"); + m.insert("UpEquilibrium;", "\u{296E}"); + m.insert("UpTee;", "\u{22A5}"); + m.insert("UpTeeArrow;", "\u{21A5}"); + m.insert("Uparrow;", "\u{21D1}"); + m.insert("Updownarrow;", "\u{21D5}"); + m.insert("UpperLeftArrow;", "\u{2196}"); + m.insert("UpperRightArrow;", "\u{2197}"); + m.insert("Upsi;", "\u{3D2}"); + m.insert("Upsilon;", "\u{3A5}"); + m.insert("Uring;", "\u{16E}"); + m.insert("Uscr;", "\u{1D4B0}"); + m.insert("Utilde;", "\u{168}"); + m.insert("Uuml", "\u{DC}"); + m.insert("Uuml;", "\u{DC}"); + m.insert("VDash;", "\u{22AB}"); + m.insert("Vbar;", "\u{2AEB}"); + m.insert("Vcy;", "\u{412}"); + m.insert("Vdash;", "\u{22A9}"); + m.insert("Vdashl;", "\u{2AE6}"); + m.insert("Vee;", "\u{22C1}"); + m.insert("Verbar;", "\u{2016}"); + m.insert("Vert;", "\u{2016}"); + m.insert("VerticalBar;", "\u{2223}"); + m.insert("VerticalLine;", "\u{7C}"); + m.insert("VerticalSeparator;", "\u{2758}"); + m.insert("VerticalTilde;", "\u{2240}"); + m.insert("VeryThinSpace;", "\u{200A}"); + m.insert("Vfr;", "\u{1D519}"); + m.insert("Vopf;", "\u{1D54D}"); + m.insert("Vscr;", "\u{1D4B1}"); + m.insert("Vvdash;", "\u{22AA}"); + m.insert("Wcirc;", "\u{174}"); + m.insert("Wedge;", "\u{22C0}"); + m.insert("Wfr;", "\u{1D51A}"); + m.insert("Wopf;", "\u{1D54E}"); + m.insert("Wscr;", "\u{1D4B2}"); + m.insert("Xfr;", "\u{1D51B}"); + m.insert("Xi;", "\u{39E}"); + m.insert("Xopf;", "\u{1D54F}"); + m.insert("Xscr;", "\u{1D4B3}"); + m.insert("YAcy;", "\u{42F}"); + m.insert("YIcy;", "\u{407}"); + m.insert("YUcy;", "\u{42E}"); + m.insert("Yacute", "\u{DD}"); + m.insert("Yacute;", "\u{DD}"); + m.insert("Ycirc;", "\u{176}"); + m.insert("Ycy;", "\u{42B}"); + m.insert("Yfr;", "\u{1D51C}"); + m.insert("Yopf;", "\u{1D550}"); + m.insert("Yscr;", "\u{1D4B4}"); + m.insert("Yuml;", "\u{178}"); + m.insert("ZHcy;", "\u{416}"); + m.insert("Zacute;", "\u{179}"); + m.insert("Zcaron;", "\u{17D}"); + m.insert("Zcy;", "\u{417}"); + m.insert("Zdot;", "\u{17B}"); + m.insert("ZeroWidthSpace;", "\u{200B}"); + m.insert("Zeta;", "\u{396}"); + m.insert("Zfr;", "\u{2128}"); + m.insert("Zopf;", "\u{2124}"); + m.insert("Zscr;", "\u{1D4B5}"); + m.insert("aacute", "\u{E1}"); + m.insert("aacute;", "\u{E1}"); + m.insert("abreve;", "\u{103}"); + m.insert("ac;", "\u{223E}"); + m.insert("acE;", "\u{223E}\u{333}"); + m.insert("acd;", "\u{223F}"); + m.insert("acirc", "\u{E2}"); + m.insert("acirc;", "\u{E2}"); + m.insert("acute", "\u{B4}"); + m.insert("acute;", "\u{B4}"); + m.insert("acy;", "\u{430}"); + m.insert("aelig", "\u{E6}"); + m.insert("aelig;", "\u{E6}"); + m.insert("af;", "\u{2061}"); + m.insert("afr;", "\u{1D51E}"); + m.insert("agrave", "\u{E0}"); + m.insert("agrave;", "\u{E0}"); + m.insert("alefsym;", "\u{2135}"); + m.insert("aleph;", "\u{2135}"); + m.insert("alpha;", "\u{3B1}"); + m.insert("amacr;", "\u{101}"); + m.insert("amalg;", "\u{2A3F}"); + m.insert("amp", "\u{26}"); + m.insert("amp;", "\u{26}"); + m.insert("and;", "\u{2227}"); + m.insert("andand;", "\u{2A55}"); + m.insert("andd;", "\u{2A5C}"); + m.insert("andslope;", "\u{2A58}"); + m.insert("andv;", "\u{2A5A}"); + m.insert("ang;", "\u{2220}"); + m.insert("ange;", "\u{29A4}"); + m.insert("angle;", "\u{2220}"); + m.insert("angmsd;", "\u{2221}"); + m.insert("angmsdaa;", "\u{29A8}"); + m.insert("angmsdab;", "\u{29A9}"); + m.insert("angmsdac;", "\u{29AA}"); + m.insert("angmsdad;", "\u{29AB}"); + m.insert("angmsdae;", "\u{29AC}"); + m.insert("angmsdaf;", "\u{29AD}"); + m.insert("angmsdag;", "\u{29AE}"); + m.insert("angmsdah;", "\u{29AF}"); + m.insert("angrt;", "\u{221F}"); + m.insert("angrtvb;", "\u{22BE}"); + m.insert("angrtvbd;", "\u{299D}"); + m.insert("angsph;", "\u{2222}"); + m.insert("angst;", "\u{C5}"); + m.insert("angzarr;", "\u{237C}"); + m.insert("aogon;", "\u{105}"); + m.insert("aopf;", "\u{1D552}"); + m.insert("ap;", "\u{2248}"); + m.insert("apE;", "\u{2A70}"); + m.insert("apacir;", "\u{2A6F}"); + m.insert("ape;", "\u{224A}"); + m.insert("apid;", "\u{224B}"); + m.insert("apos;", "\u{27}"); + m.insert("approx;", "\u{2248}"); + m.insert("approxeq;", "\u{224A}"); + m.insert("aring", "\u{E5}"); + m.insert("aring;", "\u{E5}"); + m.insert("ascr;", "\u{1D4B6}"); + m.insert("ast;", "\u{2A}"); + m.insert("asymp;", "\u{2248}"); + m.insert("asympeq;", "\u{224D}"); + m.insert("atilde", "\u{E3}"); + m.insert("atilde;", "\u{E3}"); + m.insert("auml", "\u{E4}"); + m.insert("auml;", "\u{E4}"); + m.insert("awconint;", "\u{2233}"); + m.insert("awint;", "\u{2A11}"); + m.insert("bNot;", "\u{2AED}"); + m.insert("backcong;", "\u{224C}"); + m.insert("backepsilon;", "\u{3F6}"); + m.insert("backprime;", "\u{2035}"); + m.insert("backsim;", "\u{223D}"); + m.insert("backsimeq;", "\u{22CD}"); + m.insert("barvee;", "\u{22BD}"); + m.insert("barwed;", "\u{2305}"); + m.insert("barwedge;", "\u{2305}"); + m.insert("bbrk;", "\u{23B5}"); + m.insert("bbrktbrk;", "\u{23B6}"); + m.insert("bcong;", "\u{224C}"); + m.insert("bcy;", "\u{431}"); + m.insert("bdquo;", "\u{201E}"); + m.insert("becaus;", "\u{2235}"); + m.insert("because;", "\u{2235}"); + m.insert("bemptyv;", "\u{29B0}"); + m.insert("bepsi;", "\u{3F6}"); + m.insert("bernou;", "\u{212C}"); + m.insert("beta;", "\u{3B2}"); + m.insert("beth;", "\u{2136}"); + m.insert("between;", "\u{226C}"); + m.insert("bfr;", "\u{1D51F}"); + m.insert("bigcap;", "\u{22C2}"); + m.insert("bigcirc;", "\u{25EF}"); + m.insert("bigcup;", "\u{22C3}"); + m.insert("bigodot;", "\u{2A00}"); + m.insert("bigoplus;", "\u{2A01}"); + m.insert("bigotimes;", "\u{2A02}"); + m.insert("bigsqcup;", "\u{2A06}"); + m.insert("bigstar;", "\u{2605}"); + m.insert("bigtriangledown;", "\u{25BD}"); + m.insert("bigtriangleup;", "\u{25B3}"); + m.insert("biguplus;", "\u{2A04}"); + m.insert("bigvee;", "\u{22C1}"); + m.insert("bigwedge;", "\u{22C0}"); + m.insert("bkarow;", "\u{290D}"); + m.insert("blacklozenge;", "\u{29EB}"); + m.insert("blacksquare;", "\u{25AA}"); + m.insert("blacktriangle;", "\u{25B4}"); + m.insert("blacktriangledown;", "\u{25BE}"); + m.insert("blacktriangleleft;", "\u{25C2}"); + m.insert("blacktriangleright;", "\u{25B8}"); + m.insert("blank;", "\u{2423}"); + m.insert("blk12;", "\u{2592}"); + m.insert("blk14;", "\u{2591}"); + m.insert("blk34;", "\u{2593}"); + m.insert("block;", "\u{2588}"); + m.insert("bne;", "\u{3D}\u{20E5}"); + m.insert("bnequiv;", "\u{2261}\u{20E5}"); + m.insert("bnot;", "\u{2310}"); + m.insert("bopf;", "\u{1D553}"); + m.insert("bot;", "\u{22A5}"); + m.insert("bottom;", "\u{22A5}"); + m.insert("bowtie;", "\u{22C8}"); + m.insert("boxDL;", "\u{2557}"); + m.insert("boxDR;", "\u{2554}"); + m.insert("boxDl;", "\u{2556}"); + m.insert("boxDr;", "\u{2553}"); + m.insert("boxH;", "\u{2550}"); + m.insert("boxHD;", "\u{2566}"); + m.insert("boxHU;", "\u{2569}"); + m.insert("boxHd;", "\u{2564}"); + m.insert("boxHu;", "\u{2567}"); + m.insert("boxUL;", "\u{255D}"); + m.insert("boxUR;", "\u{255A}"); + m.insert("boxUl;", "\u{255C}"); + m.insert("boxUr;", "\u{2559}"); + m.insert("boxV;", "\u{2551}"); + m.insert("boxVH;", "\u{256C}"); + m.insert("boxVL;", "\u{2563}"); + m.insert("boxVR;", "\u{2560}"); + m.insert("boxVh;", "\u{256B}"); + m.insert("boxVl;", "\u{2562}"); + m.insert("boxVr;", "\u{255F}"); + m.insert("boxbox;", "\u{29C9}"); + m.insert("boxdL;", "\u{2555}"); + m.insert("boxdR;", "\u{2552}"); + m.insert("boxdl;", "\u{2510}"); + m.insert("boxdr;", "\u{250C}"); + m.insert("boxh;", "\u{2500}"); + m.insert("boxhD;", "\u{2565}"); + m.insert("boxhU;", "\u{2568}"); + m.insert("boxhd;", "\u{252C}"); + m.insert("boxhu;", "\u{2534}"); + m.insert("boxminus;", "\u{229F}"); + m.insert("boxplus;", "\u{229E}"); + m.insert("boxtimes;", "\u{22A0}"); + m.insert("boxuL;", "\u{255B}"); + m.insert("boxuR;", "\u{2558}"); + m.insert("boxul;", "\u{2518}"); + m.insert("boxur;", "\u{2514}"); + m.insert("boxv;", "\u{2502}"); + m.insert("boxvH;", "\u{256A}"); + m.insert("boxvL;", "\u{2561}"); + m.insert("boxvR;", "\u{255E}"); + m.insert("boxvh;", "\u{253C}"); + m.insert("boxvl;", "\u{2524}"); + m.insert("boxvr;", "\u{251C}"); + m.insert("bprime;", "\u{2035}"); + m.insert("breve;", "\u{2D8}"); + m.insert("brvbar", "\u{A6}"); + m.insert("brvbar;", "\u{A6}"); + m.insert("bscr;", "\u{1D4B7}"); + m.insert("bsemi;", "\u{204F}"); + m.insert("bsim;", "\u{223D}"); + m.insert("bsime;", "\u{22CD}"); + m.insert("bsol;", "\u{5C}"); + m.insert("bsolb;", "\u{29C5}"); + m.insert("bsolhsub;", "\u{27C8}"); + m.insert("bull;", "\u{2022}"); + m.insert("bullet;", "\u{2022}"); + m.insert("bump;", "\u{224E}"); + m.insert("bumpE;", "\u{2AAE}"); + m.insert("bumpe;", "\u{224F}"); + m.insert("bumpeq;", "\u{224F}"); + m.insert("cacute;", "\u{107}"); + m.insert("cap;", "\u{2229}"); + m.insert("capand;", "\u{2A44}"); + m.insert("capbrcup;", "\u{2A49}"); + m.insert("capcap;", "\u{2A4B}"); + m.insert("capcup;", "\u{2A47}"); + m.insert("capdot;", "\u{2A40}"); + m.insert("caps;", "\u{2229}\u{FE00}"); + m.insert("caret;", "\u{2041}"); + m.insert("caron;", "\u{2C7}"); + m.insert("ccaps;", "\u{2A4D}"); + m.insert("ccaron;", "\u{10D}"); + m.insert("ccedil", "\u{E7}"); + m.insert("ccedil;", "\u{E7}"); + m.insert("ccirc;", "\u{109}"); + m.insert("ccups;", "\u{2A4C}"); + m.insert("ccupssm;", "\u{2A50}"); + m.insert("cdot;", "\u{10B}"); + m.insert("cedil", "\u{B8}"); + m.insert("cedil;", "\u{B8}"); + m.insert("cemptyv;", "\u{29B2}"); + m.insert("cent", "\u{A2}"); + m.insert("cent;", "\u{A2}"); + m.insert("centerdot;", "\u{B7}"); + m.insert("cfr;", "\u{1D520}"); + m.insert("chcy;", "\u{447}"); + m.insert("check;", "\u{2713}"); + m.insert("checkmark;", "\u{2713}"); + m.insert("chi;", "\u{3C7}"); + m.insert("cir;", "\u{25CB}"); + m.insert("cirE;", "\u{29C3}"); + m.insert("circ;", "\u{2C6}"); + m.insert("circeq;", "\u{2257}"); + m.insert("circlearrowleft;", "\u{21BA}"); + m.insert("circlearrowright;", "\u{21BB}"); + m.insert("circledR;", "\u{AE}"); + m.insert("circledS;", "\u{24C8}"); + m.insert("circledast;", "\u{229B}"); + m.insert("circledcirc;", "\u{229A}"); + m.insert("circleddash;", "\u{229D}"); + m.insert("cire;", "\u{2257}"); + m.insert("cirfnint;", "\u{2A10}"); + m.insert("cirmid;", "\u{2AEF}"); + m.insert("cirscir;", "\u{29C2}"); + m.insert("clubs;", "\u{2663}"); + m.insert("clubsuit;", "\u{2663}"); + m.insert("colon;", "\u{3A}"); + m.insert("colone;", "\u{2254}"); + m.insert("coloneq;", "\u{2254}"); + m.insert("comma;", "\u{2C}"); + m.insert("commat;", "\u{40}"); + m.insert("comp;", "\u{2201}"); + m.insert("compfn;", "\u{2218}"); + m.insert("complement;", "\u{2201}"); + m.insert("complexes;", "\u{2102}"); + m.insert("cong;", "\u{2245}"); + m.insert("congdot;", "\u{2A6D}"); + m.insert("conint;", "\u{222E}"); + m.insert("copf;", "\u{1D554}"); + m.insert("coprod;", "\u{2210}"); + m.insert("copy", "\u{A9}"); + m.insert("copy;", "\u{A9}"); + m.insert("copysr;", "\u{2117}"); + m.insert("crarr;", "\u{21B5}"); + m.insert("cross;", "\u{2717}"); + m.insert("cscr;", "\u{1D4B8}"); + m.insert("csub;", "\u{2ACF}"); + m.insert("csube;", "\u{2AD1}"); + m.insert("csup;", "\u{2AD0}"); + m.insert("csupe;", "\u{2AD2}"); + m.insert("ctdot;", "\u{22EF}"); + m.insert("cudarrl;", "\u{2938}"); + m.insert("cudarrr;", "\u{2935}"); + m.insert("cuepr;", "\u{22DE}"); + m.insert("cuesc;", "\u{22DF}"); + m.insert("cularr;", "\u{21B6}"); + m.insert("cularrp;", "\u{293D}"); + m.insert("cup;", "\u{222A}"); + m.insert("cupbrcap;", "\u{2A48}"); + m.insert("cupcap;", "\u{2A46}"); + m.insert("cupcup;", "\u{2A4A}"); + m.insert("cupdot;", "\u{228D}"); + m.insert("cupor;", "\u{2A45}"); + m.insert("cups;", "\u{222A}\u{FE00}"); + m.insert("curarr;", "\u{21B7}"); + m.insert("curarrm;", "\u{293C}"); + m.insert("curlyeqprec;", "\u{22DE}"); + m.insert("curlyeqsucc;", "\u{22DF}"); + m.insert("curlyvee;", "\u{22CE}"); + m.insert("curlywedge;", "\u{22CF}"); + m.insert("curren", "\u{A4}"); + m.insert("curren;", "\u{A4}"); + m.insert("curvearrowleft;", "\u{21B6}"); + m.insert("curvearrowright;", "\u{21B7}"); + m.insert("cuvee;", "\u{22CE}"); + m.insert("cuwed;", "\u{22CF}"); + m.insert("cwconint;", "\u{2232}"); + m.insert("cwint;", "\u{2231}"); + m.insert("cylcty;", "\u{232D}"); + m.insert("dArr;", "\u{21D3}"); + m.insert("dHar;", "\u{2965}"); + m.insert("dagger;", "\u{2020}"); + m.insert("daleth;", "\u{2138}"); + m.insert("darr;", "\u{2193}"); + m.insert("dash;", "\u{2010}"); + m.insert("dashv;", "\u{22A3}"); + m.insert("dbkarow;", "\u{290F}"); + m.insert("dblac;", "\u{2DD}"); + m.insert("dcaron;", "\u{10F}"); + m.insert("dcy;", "\u{434}"); + m.insert("dd;", "\u{2146}"); + m.insert("ddagger;", "\u{2021}"); + m.insert("ddarr;", "\u{21CA}"); + m.insert("ddotseq;", "\u{2A77}"); + m.insert("deg", "\u{B0}"); + m.insert("deg;", "\u{B0}"); + m.insert("delta;", "\u{3B4}"); + m.insert("demptyv;", "\u{29B1}"); + m.insert("dfisht;", "\u{297F}"); + m.insert("dfr;", "\u{1D521}"); + m.insert("dharl;", "\u{21C3}"); + m.insert("dharr;", "\u{21C2}"); + m.insert("diam;", "\u{22C4}"); + m.insert("diamond;", "\u{22C4}"); + m.insert("diamondsuit;", "\u{2666}"); + m.insert("diams;", "\u{2666}"); + m.insert("die;", "\u{A8}"); + m.insert("digamma;", "\u{3DD}"); + m.insert("disin;", "\u{22F2}"); + m.insert("div;", "\u{F7}"); + m.insert("divide", "\u{F7}"); + m.insert("divide;", "\u{F7}"); + m.insert("divideontimes;", "\u{22C7}"); + m.insert("divonx;", "\u{22C7}"); + m.insert("djcy;", "\u{452}"); + m.insert("dlcorn;", "\u{231E}"); + m.insert("dlcrop;", "\u{230D}"); + m.insert("dollar;", "\u{24}"); + m.insert("dopf;", "\u{1D555}"); + m.insert("dot;", "\u{2D9}"); + m.insert("doteq;", "\u{2250}"); + m.insert("doteqdot;", "\u{2251}"); + m.insert("dotminus;", "\u{2238}"); + m.insert("dotplus;", "\u{2214}"); + m.insert("dotsquare;", "\u{22A1}"); + m.insert("doublebarwedge;", "\u{2306}"); + m.insert("downarrow;", "\u{2193}"); + m.insert("downdownarrows;", "\u{21CA}"); + m.insert("downharpoonleft;", "\u{21C3}"); + m.insert("downharpoonright;", "\u{21C2}"); + m.insert("drbkarow;", "\u{2910}"); + m.insert("drcorn;", "\u{231F}"); + m.insert("drcrop;", "\u{230C}"); + m.insert("dscr;", "\u{1D4B9}"); + m.insert("dscy;", "\u{455}"); + m.insert("dsol;", "\u{29F6}"); + m.insert("dstrok;", "\u{111}"); + m.insert("dtdot;", "\u{22F1}"); + m.insert("dtri;", "\u{25BF}"); + m.insert("dtrif;", "\u{25BE}"); + m.insert("duarr;", "\u{21F5}"); + m.insert("duhar;", "\u{296F}"); + m.insert("dwangle;", "\u{29A6}"); + m.insert("dzcy;", "\u{45F}"); + m.insert("dzigrarr;", "\u{27FF}"); + m.insert("eDDot;", "\u{2A77}"); + m.insert("eDot;", "\u{2251}"); + m.insert("eacute", "\u{E9}"); + m.insert("eacute;", "\u{E9}"); + m.insert("easter;", "\u{2A6E}"); + m.insert("ecaron;", "\u{11B}"); + m.insert("ecir;", "\u{2256}"); + m.insert("ecirc", "\u{EA}"); + m.insert("ecirc;", "\u{EA}"); + m.insert("ecolon;", "\u{2255}"); + m.insert("ecy;", "\u{44D}"); + m.insert("edot;", "\u{117}"); + m.insert("ee;", "\u{2147}"); + m.insert("efDot;", "\u{2252}"); + m.insert("efr;", "\u{1D522}"); + m.insert("eg;", "\u{2A9A}"); + m.insert("egrave", "\u{E8}"); + m.insert("egrave;", "\u{E8}"); + m.insert("egs;", "\u{2A96}"); + m.insert("egsdot;", "\u{2A98}"); + m.insert("el;", "\u{2A99}"); + m.insert("elinters;", "\u{23E7}"); + m.insert("ell;", "\u{2113}"); + m.insert("els;", "\u{2A95}"); + m.insert("elsdot;", "\u{2A97}"); + m.insert("emacr;", "\u{113}"); + m.insert("empty;", "\u{2205}"); + m.insert("emptyset;", "\u{2205}"); + m.insert("emptyv;", "\u{2205}"); + m.insert("emsp13;", "\u{2004}"); + m.insert("emsp14;", "\u{2005}"); + m.insert("emsp;", "\u{2003}"); + m.insert("eng;", "\u{14B}"); + m.insert("ensp;", "\u{2002}"); + m.insert("eogon;", "\u{119}"); + m.insert("eopf;", "\u{1D556}"); + m.insert("epar;", "\u{22D5}"); + m.insert("eparsl;", "\u{29E3}"); + m.insert("eplus;", "\u{2A71}"); + m.insert("epsi;", "\u{3B5}"); + m.insert("epsilon;", "\u{3B5}"); + m.insert("epsiv;", "\u{3F5}"); + m.insert("eqcirc;", "\u{2256}"); + m.insert("eqcolon;", "\u{2255}"); + m.insert("eqsim;", "\u{2242}"); + m.insert("eqslantgtr;", "\u{2A96}"); + m.insert("eqslantless;", "\u{2A95}"); + m.insert("equals;", "\u{3D}"); + m.insert("equest;", "\u{225F}"); + m.insert("equiv;", "\u{2261}"); + m.insert("equivDD;", "\u{2A78}"); + m.insert("eqvparsl;", "\u{29E5}"); + m.insert("erDot;", "\u{2253}"); + m.insert("erarr;", "\u{2971}"); + m.insert("escr;", "\u{212F}"); + m.insert("esdot;", "\u{2250}"); + m.insert("esim;", "\u{2242}"); + m.insert("eta;", "\u{3B7}"); + m.insert("eth", "\u{F0}"); + m.insert("eth;", "\u{F0}"); + m.insert("euml", "\u{EB}"); + m.insert("euml;", "\u{EB}"); + m.insert("euro;", "\u{20AC}"); + m.insert("excl;", "\u{21}"); + m.insert("exist;", "\u{2203}"); + m.insert("expectation;", "\u{2130}"); + m.insert("exponentiale;", "\u{2147}"); + m.insert("fallingdotseq;", "\u{2252}"); + m.insert("fcy;", "\u{444}"); + m.insert("female;", "\u{2640}"); + m.insert("ffilig;", "\u{FB03}"); + m.insert("fflig;", "\u{FB00}"); + m.insert("ffllig;", "\u{FB04}"); + m.insert("ffr;", "\u{1D523}"); + m.insert("filig;", "\u{FB01}"); + m.insert("fjlig;", "\u{66}\u{6A}"); + m.insert("flat;", "\u{266D}"); + m.insert("fllig;", "\u{FB02}"); + m.insert("fltns;", "\u{25B1}"); + m.insert("fnof;", "\u{192}"); + m.insert("fopf;", "\u{1D557}"); + m.insert("forall;", "\u{2200}"); + m.insert("fork;", "\u{22D4}"); + m.insert("forkv;", "\u{2AD9}"); + m.insert("fpartint;", "\u{2A0D}"); + m.insert("frac12", "\u{BD}"); + m.insert("frac12;", "\u{BD}"); + m.insert("frac13;", "\u{2153}"); + m.insert("frac14", "\u{BC}"); + m.insert("frac14;", "\u{BC}"); + m.insert("frac15;", "\u{2155}"); + m.insert("frac16;", "\u{2159}"); + m.insert("frac18;", "\u{215B}"); + m.insert("frac23;", "\u{2154}"); + m.insert("frac25;", "\u{2156}"); + m.insert("frac34", "\u{BE}"); + m.insert("frac34;", "\u{BE}"); + m.insert("frac35;", "\u{2157}"); + m.insert("frac38;", "\u{215C}"); + m.insert("frac45;", "\u{2158}"); + m.insert("frac56;", "\u{215A}"); + m.insert("frac58;", "\u{215D}"); + m.insert("frac78;", "\u{215E}"); + m.insert("frasl;", "\u{2044}"); + m.insert("frown;", "\u{2322}"); + m.insert("fscr;", "\u{1D4BB}"); + m.insert("gE;", "\u{2267}"); + m.insert("gEl;", "\u{2A8C}"); + m.insert("gacute;", "\u{1F5}"); + m.insert("gamma;", "\u{3B3}"); + m.insert("gammad;", "\u{3DD}"); + m.insert("gap;", "\u{2A86}"); + m.insert("gbreve;", "\u{11F}"); + m.insert("gcirc;", "\u{11D}"); + m.insert("gcy;", "\u{433}"); + m.insert("gdot;", "\u{121}"); + m.insert("ge;", "\u{2265}"); + m.insert("gel;", "\u{22DB}"); + m.insert("geq;", "\u{2265}"); + m.insert("geqq;", "\u{2267}"); + m.insert("geqslant;", "\u{2A7E}"); + m.insert("ges;", "\u{2A7E}"); + m.insert("gescc;", "\u{2AA9}"); + m.insert("gesdot;", "\u{2A80}"); + m.insert("gesdoto;", "\u{2A82}"); + m.insert("gesdotol;", "\u{2A84}"); + m.insert("gesl;", "\u{22DB}\u{FE00}"); + m.insert("gesles;", "\u{2A94}"); + m.insert("gfr;", "\u{1D524}"); + m.insert("gg;", "\u{226B}"); + m.insert("ggg;", "\u{22D9}"); + m.insert("gimel;", "\u{2137}"); + m.insert("gjcy;", "\u{453}"); + m.insert("gl;", "\u{2277}"); + m.insert("glE;", "\u{2A92}"); + m.insert("gla;", "\u{2AA5}"); + m.insert("glj;", "\u{2AA4}"); + m.insert("gnE;", "\u{2269}"); + m.insert("gnap;", "\u{2A8A}"); + m.insert("gnapprox;", "\u{2A8A}"); + m.insert("gne;", "\u{2A88}"); + m.insert("gneq;", "\u{2A88}"); + m.insert("gneqq;", "\u{2269}"); + m.insert("gnsim;", "\u{22E7}"); + m.insert("gopf;", "\u{1D558}"); + m.insert("grave;", "\u{60}"); + m.insert("gscr;", "\u{210A}"); + m.insert("gsim;", "\u{2273}"); + m.insert("gsime;", "\u{2A8E}"); + m.insert("gsiml;", "\u{2A90}"); + m.insert("gt", "\u{3E}"); + m.insert("gt;", "\u{3E}"); + m.insert("gtcc;", "\u{2AA7}"); + m.insert("gtcir;", "\u{2A7A}"); + m.insert("gtdot;", "\u{22D7}"); + m.insert("gtlPar;", "\u{2995}"); + m.insert("gtquest;", "\u{2A7C}"); + m.insert("gtrapprox;", "\u{2A86}"); + m.insert("gtrarr;", "\u{2978}"); + m.insert("gtrdot;", "\u{22D7}"); + m.insert("gtreqless;", "\u{22DB}"); + m.insert("gtreqqless;", "\u{2A8C}"); + m.insert("gtrless;", "\u{2277}"); + m.insert("gtrsim;", "\u{2273}"); + m.insert("gvertneqq;", "\u{2269}\u{FE00}"); + m.insert("gvnE;", "\u{2269}\u{FE00}"); + m.insert("hArr;", "\u{21D4}"); + m.insert("hairsp;", "\u{200A}"); + m.insert("half;", "\u{BD}"); + m.insert("hamilt;", "\u{210B}"); + m.insert("hardcy;", "\u{44A}"); + m.insert("harr;", "\u{2194}"); + m.insert("harrcir;", "\u{2948}"); + m.insert("harrw;", "\u{21AD}"); + m.insert("hbar;", "\u{210F}"); + m.insert("hcirc;", "\u{125}"); + m.insert("hearts;", "\u{2665}"); + m.insert("heartsuit;", "\u{2665}"); + m.insert("hellip;", "\u{2026}"); + m.insert("hercon;", "\u{22B9}"); + m.insert("hfr;", "\u{1D525}"); + m.insert("hksearow;", "\u{2925}"); + m.insert("hkswarow;", "\u{2926}"); + m.insert("hoarr;", "\u{21FF}"); + m.insert("homtht;", "\u{223B}"); + m.insert("hookleftarrow;", "\u{21A9}"); + m.insert("hookrightarrow;", "\u{21AA}"); + m.insert("hopf;", "\u{1D559}"); + m.insert("horbar;", "\u{2015}"); + m.insert("hscr;", "\u{1D4BD}"); + m.insert("hslash;", "\u{210F}"); + m.insert("hstrok;", "\u{127}"); + m.insert("hybull;", "\u{2043}"); + m.insert("hyphen;", "\u{2010}"); + m.insert("iacute", "\u{ED}"); + m.insert("iacute;", "\u{ED}"); + m.insert("ic;", "\u{2063}"); + m.insert("icirc", "\u{EE}"); + m.insert("icirc;", "\u{EE}"); + m.insert("icy;", "\u{438}"); + m.insert("iecy;", "\u{435}"); + m.insert("iexcl", "\u{A1}"); + m.insert("iexcl;", "\u{A1}"); + m.insert("iff;", "\u{21D4}"); + m.insert("ifr;", "\u{1D526}"); + m.insert("igrave", "\u{EC}"); + m.insert("igrave;", "\u{EC}"); + m.insert("ii;", "\u{2148}"); + m.insert("iiiint;", "\u{2A0C}"); + m.insert("iiint;", "\u{222D}"); + m.insert("iinfin;", "\u{29DC}"); + m.insert("iiota;", "\u{2129}"); + m.insert("ijlig;", "\u{133}"); + m.insert("imacr;", "\u{12B}"); + m.insert("image;", "\u{2111}"); + m.insert("imagline;", "\u{2110}"); + m.insert("imagpart;", "\u{2111}"); + m.insert("imath;", "\u{131}"); + m.insert("imof;", "\u{22B7}"); + m.insert("imped;", "\u{1B5}"); + m.insert("in;", "\u{2208}"); + m.insert("incare;", "\u{2105}"); + m.insert("infin;", "\u{221E}"); + m.insert("infintie;", "\u{29DD}"); + m.insert("inodot;", "\u{131}"); + m.insert("int;", "\u{222B}"); + m.insert("intcal;", "\u{22BA}"); + m.insert("integers;", "\u{2124}"); + m.insert("intercal;", "\u{22BA}"); + m.insert("intlarhk;", "\u{2A17}"); + m.insert("intprod;", "\u{2A3C}"); + m.insert("iocy;", "\u{451}"); + m.insert("iogon;", "\u{12F}"); + m.insert("iopf;", "\u{1D55A}"); + m.insert("iota;", "\u{3B9}"); + m.insert("iprod;", "\u{2A3C}"); + m.insert("iquest", "\u{BF}"); + m.insert("iquest;", "\u{BF}"); + m.insert("iscr;", "\u{1D4BE}"); + m.insert("isin;", "\u{2208}"); + m.insert("isinE;", "\u{22F9}"); + m.insert("isindot;", "\u{22F5}"); + m.insert("isins;", "\u{22F4}"); + m.insert("isinsv;", "\u{22F3}"); + m.insert("isinv;", "\u{2208}"); + m.insert("it;", "\u{2062}"); + m.insert("itilde;", "\u{129}"); + m.insert("iukcy;", "\u{456}"); + m.insert("iuml", "\u{EF}"); + m.insert("iuml;", "\u{EF}"); + m.insert("jcirc;", "\u{135}"); + m.insert("jcy;", "\u{439}"); + m.insert("jfr;", "\u{1D527}"); + m.insert("jmath;", "\u{237}"); + m.insert("jopf;", "\u{1D55B}"); + m.insert("jscr;", "\u{1D4BF}"); + m.insert("jsercy;", "\u{458}"); + m.insert("jukcy;", "\u{454}"); + m.insert("kappa;", "\u{3BA}"); + m.insert("kappav;", "\u{3F0}"); + m.insert("kcedil;", "\u{137}"); + m.insert("kcy;", "\u{43A}"); + m.insert("kfr;", "\u{1D528}"); + m.insert("kgreen;", "\u{138}"); + m.insert("khcy;", "\u{445}"); + m.insert("kjcy;", "\u{45C}"); + m.insert("kopf;", "\u{1D55C}"); + m.insert("kscr;", "\u{1D4C0}"); + m.insert("lAarr;", "\u{21DA}"); + m.insert("lArr;", "\u{21D0}"); + m.insert("lAtail;", "\u{291B}"); + m.insert("lBarr;", "\u{290E}"); + m.insert("lE;", "\u{2266}"); + m.insert("lEg;", "\u{2A8B}"); + m.insert("lHar;", "\u{2962}"); + m.insert("lacute;", "\u{13A}"); + m.insert("laemptyv;", "\u{29B4}"); + m.insert("lagran;", "\u{2112}"); + m.insert("lambda;", "\u{3BB}"); + m.insert("lang;", "\u{27E8}"); + m.insert("langd;", "\u{2991}"); + m.insert("langle;", "\u{27E8}"); + m.insert("lap;", "\u{2A85}"); + m.insert("laquo", "\u{AB}"); + m.insert("laquo;", "\u{AB}"); + m.insert("larr;", "\u{2190}"); + m.insert("larrb;", "\u{21E4}"); + m.insert("larrbfs;", "\u{291F}"); + m.insert("larrfs;", "\u{291D}"); + m.insert("larrhk;", "\u{21A9}"); + m.insert("larrlp;", "\u{21AB}"); + m.insert("larrpl;", "\u{2939}"); + m.insert("larrsim;", "\u{2973}"); + m.insert("larrtl;", "\u{21A2}"); + m.insert("lat;", "\u{2AAB}"); + m.insert("latail;", "\u{2919}"); + m.insert("late;", "\u{2AAD}"); + m.insert("lates;", "\u{2AAD}\u{FE00}"); + m.insert("lbarr;", "\u{290C}"); + m.insert("lbbrk;", "\u{2772}"); + m.insert("lbrace;", "\u{7B}"); + m.insert("lbrack;", "\u{5B}"); + m.insert("lbrke;", "\u{298B}"); + m.insert("lbrksld;", "\u{298F}"); + m.insert("lbrkslu;", "\u{298D}"); + m.insert("lcaron;", "\u{13E}"); + m.insert("lcedil;", "\u{13C}"); + m.insert("lceil;", "\u{2308}"); + m.insert("lcub;", "\u{7B}"); + m.insert("lcy;", "\u{43B}"); + m.insert("ldca;", "\u{2936}"); + m.insert("ldquo;", "\u{201C}"); + m.insert("ldquor;", "\u{201E}"); + m.insert("ldrdhar;", "\u{2967}"); + m.insert("ldrushar;", "\u{294B}"); + m.insert("ldsh;", "\u{21B2}"); + m.insert("le;", "\u{2264}"); + m.insert("leftarrow;", "\u{2190}"); + m.insert("leftarrowtail;", "\u{21A2}"); + m.insert("leftharpoondown;", "\u{21BD}"); + m.insert("leftharpoonup;", "\u{21BC}"); + m.insert("leftleftarrows;", "\u{21C7}"); + m.insert("leftrightarrow;", "\u{2194}"); + m.insert("leftrightarrows;", "\u{21C6}"); + m.insert("leftrightharpoons;", "\u{21CB}"); + m.insert("leftrightsquigarrow;", "\u{21AD}"); + m.insert("leftthreetimes;", "\u{22CB}"); + m.insert("leg;", "\u{22DA}"); + m.insert("leq;", "\u{2264}"); + m.insert("leqq;", "\u{2266}"); + m.insert("leqslant;", "\u{2A7D}"); + m.insert("les;", "\u{2A7D}"); + m.insert("lescc;", "\u{2AA8}"); + m.insert("lesdot;", "\u{2A7F}"); + m.insert("lesdoto;", "\u{2A81}"); + m.insert("lesdotor;", "\u{2A83}"); + m.insert("lesg;", "\u{22DA}\u{FE00}"); + m.insert("lesges;", "\u{2A93}"); + m.insert("lessapprox;", "\u{2A85}"); + m.insert("lessdot;", "\u{22D6}"); + m.insert("lesseqgtr;", "\u{22DA}"); + m.insert("lesseqqgtr;", "\u{2A8B}"); + m.insert("lessgtr;", "\u{2276}"); + m.insert("lesssim;", "\u{2272}"); + m.insert("lfisht;", "\u{297C}"); + m.insert("lfloor;", "\u{230A}"); + m.insert("lfr;", "\u{1D529}"); + m.insert("lg;", "\u{2276}"); + m.insert("lgE;", "\u{2A91}"); + m.insert("lhard;", "\u{21BD}"); + m.insert("lharu;", "\u{21BC}"); + m.insert("lharul;", "\u{296A}"); + m.insert("lhblk;", "\u{2584}"); + m.insert("ljcy;", "\u{459}"); + m.insert("ll;", "\u{226A}"); + m.insert("llarr;", "\u{21C7}"); + m.insert("llcorner;", "\u{231E}"); + m.insert("llhard;", "\u{296B}"); + m.insert("lltri;", "\u{25FA}"); + m.insert("lmidot;", "\u{140}"); + m.insert("lmoust;", "\u{23B0}"); + m.insert("lmoustache;", "\u{23B0}"); + m.insert("lnE;", "\u{2268}"); + m.insert("lnap;", "\u{2A89}"); + m.insert("lnapprox;", "\u{2A89}"); + m.insert("lne;", "\u{2A87}"); + m.insert("lneq;", "\u{2A87}"); + m.insert("lneqq;", "\u{2268}"); + m.insert("lnsim;", "\u{22E6}"); + m.insert("loang;", "\u{27EC}"); + m.insert("loarr;", "\u{21FD}"); + m.insert("lobrk;", "\u{27E6}"); + m.insert("longleftarrow;", "\u{27F5}"); + m.insert("longleftrightarrow;", "\u{27F7}"); + m.insert("longmapsto;", "\u{27FC}"); + m.insert("longrightarrow;", "\u{27F6}"); + m.insert("looparrowleft;", "\u{21AB}"); + m.insert("looparrowright;", "\u{21AC}"); + m.insert("lopar;", "\u{2985}"); + m.insert("lopf;", "\u{1D55D}"); + m.insert("loplus;", "\u{2A2D}"); + m.insert("lotimes;", "\u{2A34}"); + m.insert("lowast;", "\u{2217}"); + m.insert("lowbar;", "\u{5F}"); + m.insert("loz;", "\u{25CA}"); + m.insert("lozenge;", "\u{25CA}"); + m.insert("lozf;", "\u{29EB}"); + m.insert("lpar;", "\u{28}"); + m.insert("lparlt;", "\u{2993}"); + m.insert("lrarr;", "\u{21C6}"); + m.insert("lrcorner;", "\u{231F}"); + m.insert("lrhar;", "\u{21CB}"); + m.insert("lrhard;", "\u{296D}"); + m.insert("lrm;", "\u{200E}"); + m.insert("lrtri;", "\u{22BF}"); + m.insert("lsaquo;", "\u{2039}"); + m.insert("lscr;", "\u{1D4C1}"); + m.insert("lsh;", "\u{21B0}"); + m.insert("lsim;", "\u{2272}"); + m.insert("lsime;", "\u{2A8D}"); + m.insert("lsimg;", "\u{2A8F}"); + m.insert("lsqb;", "\u{5B}"); + m.insert("lsquo;", "\u{2018}"); + m.insert("lsquor;", "\u{201A}"); + m.insert("lstrok;", "\u{142}"); + m.insert("lt", "\u{3C}"); + m.insert("lt;", "\u{3C}"); + m.insert("ltcc;", "\u{2AA6}"); + m.insert("ltcir;", "\u{2A79}"); + m.insert("ltdot;", "\u{22D6}"); + m.insert("lthree;", "\u{22CB}"); + m.insert("ltimes;", "\u{22C9}"); + m.insert("ltlarr;", "\u{2976}"); + m.insert("ltquest;", "\u{2A7B}"); + m.insert("ltrPar;", "\u{2996}"); + m.insert("ltri;", "\u{25C3}"); + m.insert("ltrie;", "\u{22B4}"); + m.insert("ltrif;", "\u{25C2}"); + m.insert("lurdshar;", "\u{294A}"); + m.insert("luruhar;", "\u{2966}"); + m.insert("lvertneqq;", "\u{2268}\u{FE00}"); + m.insert("lvnE;", "\u{2268}\u{FE00}"); + m.insert("mDDot;", "\u{223A}"); + m.insert("macr", "\u{AF}"); + m.insert("macr;", "\u{AF}"); + m.insert("male;", "\u{2642}"); + m.insert("malt;", "\u{2720}"); + m.insert("maltese;", "\u{2720}"); + m.insert("map;", "\u{21A6}"); + m.insert("mapsto;", "\u{21A6}"); + m.insert("mapstodown;", "\u{21A7}"); + m.insert("mapstoleft;", "\u{21A4}"); + m.insert("mapstoup;", "\u{21A5}"); + m.insert("marker;", "\u{25AE}"); + m.insert("mcomma;", "\u{2A29}"); + m.insert("mcy;", "\u{43C}"); + m.insert("mdash;", "\u{2014}"); + m.insert("measuredangle;", "\u{2221}"); + m.insert("mfr;", "\u{1D52A}"); + m.insert("mho;", "\u{2127}"); + m.insert("micro", "\u{B5}"); + m.insert("micro;", "\u{B5}"); + m.insert("mid;", "\u{2223}"); + m.insert("midast;", "\u{2A}"); + m.insert("midcir;", "\u{2AF0}"); + m.insert("middot", "\u{B7}"); + m.insert("middot;", "\u{B7}"); + m.insert("minus;", "\u{2212}"); + m.insert("minusb;", "\u{229F}"); + m.insert("minusd;", "\u{2238}"); + m.insert("minusdu;", "\u{2A2A}"); + m.insert("mlcp;", "\u{2ADB}"); + m.insert("mldr;", "\u{2026}"); + m.insert("mnplus;", "\u{2213}"); + m.insert("models;", "\u{22A7}"); + m.insert("mopf;", "\u{1D55E}"); + m.insert("mp;", "\u{2213}"); + m.insert("mscr;", "\u{1D4C2}"); + m.insert("mstpos;", "\u{223E}"); + m.insert("mu;", "\u{3BC}"); + m.insert("multimap;", "\u{22B8}"); + m.insert("mumap;", "\u{22B8}"); + m.insert("nGg;", "\u{22D9}\u{338}"); + m.insert("nGt;", "\u{226B}\u{20D2}"); + m.insert("nGtv;", "\u{226B}\u{338}"); + m.insert("nLeftarrow;", "\u{21CD}"); + m.insert("nLeftrightarrow;", "\u{21CE}"); + m.insert("nLl;", "\u{22D8}\u{338}"); + m.insert("nLt;", "\u{226A}\u{20D2}"); + m.insert("nLtv;", "\u{226A}\u{338}"); + m.insert("nRightarrow;", "\u{21CF}"); + m.insert("nVDash;", "\u{22AF}"); + m.insert("nVdash;", "\u{22AE}"); + m.insert("nabla;", "\u{2207}"); + m.insert("nacute;", "\u{144}"); + m.insert("nang;", "\u{2220}\u{20D2}"); + m.insert("nap;", "\u{2249}"); + m.insert("napE;", "\u{2A70}\u{338}"); + m.insert("napid;", "\u{224B}\u{338}"); + m.insert("napos;", "\u{149}"); + m.insert("napprox;", "\u{2249}"); + m.insert("natur;", "\u{266E}"); + m.insert("natural;", "\u{266E}"); + m.insert("naturals;", "\u{2115}"); + m.insert("nbsp", "\u{A0}"); + m.insert("nbsp;", "\u{A0}"); + m.insert("nbump;", "\u{224E}\u{338}"); + m.insert("nbumpe;", "\u{224F}\u{338}"); + m.insert("ncap;", "\u{2A43}"); + m.insert("ncaron;", "\u{148}"); + m.insert("ncedil;", "\u{146}"); + m.insert("ncong;", "\u{2247}"); + m.insert("ncongdot;", "\u{2A6D}\u{338}"); + m.insert("ncup;", "\u{2A42}"); + m.insert("ncy;", "\u{43D}"); + m.insert("ndash;", "\u{2013}"); + m.insert("ne;", "\u{2260}"); + m.insert("neArr;", "\u{21D7}"); + m.insert("nearhk;", "\u{2924}"); + m.insert("nearr;", "\u{2197}"); + m.insert("nearrow;", "\u{2197}"); + m.insert("nedot;", "\u{2250}\u{338}"); + m.insert("nequiv;", "\u{2262}"); + m.insert("nesear;", "\u{2928}"); + m.insert("nesim;", "\u{2242}\u{338}"); + m.insert("nexist;", "\u{2204}"); + m.insert("nexists;", "\u{2204}"); + m.insert("nfr;", "\u{1D52B}"); + m.insert("ngE;", "\u{2267}\u{338}"); + m.insert("nge;", "\u{2271}"); + m.insert("ngeq;", "\u{2271}"); + m.insert("ngeqq;", "\u{2267}\u{338}"); + m.insert("ngeqslant;", "\u{2A7E}\u{338}"); + m.insert("nges;", "\u{2A7E}\u{338}"); + m.insert("ngsim;", "\u{2275}"); + m.insert("ngt;", "\u{226F}"); + m.insert("ngtr;", "\u{226F}"); + m.insert("nhArr;", "\u{21CE}"); + m.insert("nharr;", "\u{21AE}"); + m.insert("nhpar;", "\u{2AF2}"); + m.insert("ni;", "\u{220B}"); + m.insert("nis;", "\u{22FC}"); + m.insert("nisd;", "\u{22FA}"); + m.insert("niv;", "\u{220B}"); + m.insert("njcy;", "\u{45A}"); + m.insert("nlArr;", "\u{21CD}"); + m.insert("nlE;", "\u{2266}\u{338}"); + m.insert("nlarr;", "\u{219A}"); + m.insert("nldr;", "\u{2025}"); + m.insert("nle;", "\u{2270}"); + m.insert("nleftarrow;", "\u{219A}"); + m.insert("nleftrightarrow;", "\u{21AE}"); + m.insert("nleq;", "\u{2270}"); + m.insert("nleqq;", "\u{2266}\u{338}"); + m.insert("nleqslant;", "\u{2A7D}\u{338}"); + m.insert("nles;", "\u{2A7D}\u{338}"); + m.insert("nless;", "\u{226E}"); + m.insert("nlsim;", "\u{2274}"); + m.insert("nlt;", "\u{226E}"); + m.insert("nltri;", "\u{22EA}"); + m.insert("nltrie;", "\u{22EC}"); + m.insert("nmid;", "\u{2224}"); + m.insert("nopf;", "\u{1D55F}"); + m.insert("not", "\u{AC}"); + m.insert("not;", "\u{AC}"); + m.insert("notin;", "\u{2209}"); + m.insert("notinE;", "\u{22F9}\u{338}"); + m.insert("notindot;", "\u{22F5}\u{338}"); + m.insert("notinva;", "\u{2209}"); + m.insert("notinvb;", "\u{22F7}"); + m.insert("notinvc;", "\u{22F6}"); + m.insert("notni;", "\u{220C}"); + m.insert("notniva;", "\u{220C}"); + m.insert("notnivb;", "\u{22FE}"); + m.insert("notnivc;", "\u{22FD}"); + m.insert("npar;", "\u{2226}"); + m.insert("nparallel;", "\u{2226}"); + m.insert("nparsl;", "\u{2AFD}\u{20E5}"); + m.insert("npart;", "\u{2202}\u{338}"); + m.insert("npolint;", "\u{2A14}"); + m.insert("npr;", "\u{2280}"); + m.insert("nprcue;", "\u{22E0}"); + m.insert("npre;", "\u{2AAF}\u{338}"); + m.insert("nprec;", "\u{2280}"); + m.insert("npreceq;", "\u{2AAF}\u{338}"); + m.insert("nrArr;", "\u{21CF}"); + m.insert("nrarr;", "\u{219B}"); + m.insert("nrarrc;", "\u{2933}\u{338}"); + m.insert("nrarrw;", "\u{219D}\u{338}"); + m.insert("nrightarrow;", "\u{219B}"); + m.insert("nrtri;", "\u{22EB}"); + m.insert("nrtrie;", "\u{22ED}"); + m.insert("nsc;", "\u{2281}"); + m.insert("nsccue;", "\u{22E1}"); + m.insert("nsce;", "\u{2AB0}\u{338}"); + m.insert("nscr;", "\u{1D4C3}"); + m.insert("nshortmid;", "\u{2224}"); + m.insert("nshortparallel;", "\u{2226}"); + m.insert("nsim;", "\u{2241}"); + m.insert("nsime;", "\u{2244}"); + m.insert("nsimeq;", "\u{2244}"); + m.insert("nsmid;", "\u{2224}"); + m.insert("nspar;", "\u{2226}"); + m.insert("nsqsube;", "\u{22E2}"); + m.insert("nsqsupe;", "\u{22E3}"); + m.insert("nsub;", "\u{2284}"); + m.insert("nsubE;", "\u{2AC5}\u{338}"); + m.insert("nsube;", "\u{2288}"); + m.insert("nsubset;", "\u{2282}\u{20D2}"); + m.insert("nsubseteq;", "\u{2288}"); + m.insert("nsubseteqq;", "\u{2AC5}\u{338}"); + m.insert("nsucc;", "\u{2281}"); + m.insert("nsucceq;", "\u{2AB0}\u{338}"); + m.insert("nsup;", "\u{2285}"); + m.insert("nsupE;", "\u{2AC6}\u{338}"); + m.insert("nsupe;", "\u{2289}"); + m.insert("nsupset;", "\u{2283}\u{20D2}"); + m.insert("nsupseteq;", "\u{2289}"); + m.insert("nsupseteqq;", "\u{2AC6}\u{338}"); + m.insert("ntgl;", "\u{2279}"); + m.insert("ntilde", "\u{F1}"); + m.insert("ntilde;", "\u{F1}"); + m.insert("ntlg;", "\u{2278}"); + m.insert("ntriangleleft;", "\u{22EA}"); + m.insert("ntrianglelefteq;", "\u{22EC}"); + m.insert("ntriangleright;", "\u{22EB}"); + m.insert("ntrianglerighteq;", "\u{22ED}"); + m.insert("nu;", "\u{3BD}"); + m.insert("num;", "\u{23}"); + m.insert("numero;", "\u{2116}"); + m.insert("numsp;", "\u{2007}"); + m.insert("nvDash;", "\u{22AD}"); + m.insert("nvHarr;", "\u{2904}"); + m.insert("nvap;", "\u{224D}\u{20D2}"); + m.insert("nvdash;", "\u{22AC}"); + m.insert("nvge;", "\u{2265}\u{20D2}"); + m.insert("nvgt;", "\u{3E}\u{20D2}"); + m.insert("nvinfin;", "\u{29DE}"); + m.insert("nvlArr;", "\u{2902}"); + m.insert("nvle;", "\u{2264}\u{20D2}"); + m.insert("nvlt;", "\u{3C}\u{20D2}"); + m.insert("nvltrie;", "\u{22B4}\u{20D2}"); + m.insert("nvrArr;", "\u{2903}"); + m.insert("nvrtrie;", "\u{22B5}\u{20D2}"); + m.insert("nvsim;", "\u{223C}\u{20D2}"); + m.insert("nwArr;", "\u{21D6}"); + m.insert("nwarhk;", "\u{2923}"); + m.insert("nwarr;", "\u{2196}"); + m.insert("nwarrow;", "\u{2196}"); + m.insert("nwnear;", "\u{2927}"); + m.insert("oS;", "\u{24C8}"); + m.insert("oacute", "\u{F3}"); + m.insert("oacute;", "\u{F3}"); + m.insert("oast;", "\u{229B}"); + m.insert("ocir;", "\u{229A}"); + m.insert("ocirc", "\u{F4}"); + m.insert("ocirc;", "\u{F4}"); + m.insert("ocy;", "\u{43E}"); + m.insert("odash;", "\u{229D}"); + m.insert("odblac;", "\u{151}"); + m.insert("odiv;", "\u{2A38}"); + m.insert("odot;", "\u{2299}"); + m.insert("odsold;", "\u{29BC}"); + m.insert("oelig;", "\u{153}"); + m.insert("ofcir;", "\u{29BF}"); + m.insert("ofr;", "\u{1D52C}"); + m.insert("ogon;", "\u{2DB}"); + m.insert("ograve", "\u{F2}"); + m.insert("ograve;", "\u{F2}"); + m.insert("ogt;", "\u{29C1}"); + m.insert("ohbar;", "\u{29B5}"); + m.insert("ohm;", "\u{3A9}"); + m.insert("oint;", "\u{222E}"); + m.insert("olarr;", "\u{21BA}"); + m.insert("olcir;", "\u{29BE}"); + m.insert("olcross;", "\u{29BB}"); + m.insert("oline;", "\u{203E}"); + m.insert("olt;", "\u{29C0}"); + m.insert("omacr;", "\u{14D}"); + m.insert("omega;", "\u{3C9}"); + m.insert("omicron;", "\u{3BF}"); + m.insert("omid;", "\u{29B6}"); + m.insert("ominus;", "\u{2296}"); + m.insert("oopf;", "\u{1D560}"); + m.insert("opar;", "\u{29B7}"); + m.insert("operp;", "\u{29B9}"); + m.insert("oplus;", "\u{2295}"); + m.insert("or;", "\u{2228}"); + m.insert("orarr;", "\u{21BB}"); + m.insert("ord;", "\u{2A5D}"); + m.insert("order;", "\u{2134}"); + m.insert("orderof;", "\u{2134}"); + m.insert("ordf", "\u{AA}"); + m.insert("ordf;", "\u{AA}"); + m.insert("ordm", "\u{BA}"); + m.insert("ordm;", "\u{BA}"); + m.insert("origof;", "\u{22B6}"); + m.insert("oror;", "\u{2A56}"); + m.insert("orslope;", "\u{2A57}"); + m.insert("orv;", "\u{2A5B}"); + m.insert("oscr;", "\u{2134}"); + m.insert("oslash", "\u{F8}"); + m.insert("oslash;", "\u{F8}"); + m.insert("osol;", "\u{2298}"); + m.insert("otilde", "\u{F5}"); + m.insert("otilde;", "\u{F5}"); + m.insert("otimes;", "\u{2297}"); + m.insert("otimesas;", "\u{2A36}"); + m.insert("ouml", "\u{F6}"); + m.insert("ouml;", "\u{F6}"); + m.insert("ovbar;", "\u{233D}"); + m.insert("par;", "\u{2225}"); + m.insert("para", "\u{B6}"); + m.insert("para;", "\u{B6}"); + m.insert("parallel;", "\u{2225}"); + m.insert("parsim;", "\u{2AF3}"); + m.insert("parsl;", "\u{2AFD}"); + m.insert("part;", "\u{2202}"); + m.insert("pcy;", "\u{43F}"); + m.insert("percnt;", "\u{25}"); + m.insert("period;", "\u{2E}"); + m.insert("permil;", "\u{2030}"); + m.insert("perp;", "\u{22A5}"); + m.insert("pertenk;", "\u{2031}"); + m.insert("pfr;", "\u{1D52D}"); + m.insert("phi;", "\u{3C6}"); + m.insert("phiv;", "\u{3D5}"); + m.insert("phmmat;", "\u{2133}"); + m.insert("phone;", "\u{260E}"); + m.insert("pi;", "\u{3C0}"); + m.insert("pitchfork;", "\u{22D4}"); + m.insert("piv;", "\u{3D6}"); + m.insert("planck;", "\u{210F}"); + m.insert("planckh;", "\u{210E}"); + m.insert("plankv;", "\u{210F}"); + m.insert("plus;", "\u{2B}"); + m.insert("plusacir;", "\u{2A23}"); + m.insert("plusb;", "\u{229E}"); + m.insert("pluscir;", "\u{2A22}"); + m.insert("plusdo;", "\u{2214}"); + m.insert("plusdu;", "\u{2A25}"); + m.insert("pluse;", "\u{2A72}"); + m.insert("plusmn", "\u{B1}"); + m.insert("plusmn;", "\u{B1}"); + m.insert("plussim;", "\u{2A26}"); + m.insert("plustwo;", "\u{2A27}"); + m.insert("pm;", "\u{B1}"); + m.insert("pointint;", "\u{2A15}"); + m.insert("popf;", "\u{1D561}"); + m.insert("pound", "\u{A3}"); + m.insert("pound;", "\u{A3}"); + m.insert("pr;", "\u{227A}"); + m.insert("prE;", "\u{2AB3}"); + m.insert("prap;", "\u{2AB7}"); + m.insert("prcue;", "\u{227C}"); + m.insert("pre;", "\u{2AAF}"); + m.insert("prec;", "\u{227A}"); + m.insert("precapprox;", "\u{2AB7}"); + m.insert("preccurlyeq;", "\u{227C}"); + m.insert("preceq;", "\u{2AAF}"); + m.insert("precnapprox;", "\u{2AB9}"); + m.insert("precneqq;", "\u{2AB5}"); + m.insert("precnsim;", "\u{22E8}"); + m.insert("precsim;", "\u{227E}"); + m.insert("prime;", "\u{2032}"); + m.insert("primes;", "\u{2119}"); + m.insert("prnE;", "\u{2AB5}"); + m.insert("prnap;", "\u{2AB9}"); + m.insert("prnsim;", "\u{22E8}"); + m.insert("prod;", "\u{220F}"); + m.insert("profalar;", "\u{232E}"); + m.insert("profline;", "\u{2312}"); + m.insert("profsurf;", "\u{2313}"); + m.insert("prop;", "\u{221D}"); + m.insert("propto;", "\u{221D}"); + m.insert("prsim;", "\u{227E}"); + m.insert("prurel;", "\u{22B0}"); + m.insert("pscr;", "\u{1D4C5}"); + m.insert("psi;", "\u{3C8}"); + m.insert("puncsp;", "\u{2008}"); + m.insert("qfr;", "\u{1D52E}"); + m.insert("qint;", "\u{2A0C}"); + m.insert("qopf;", "\u{1D562}"); + m.insert("qprime;", "\u{2057}"); + m.insert("qscr;", "\u{1D4C6}"); + m.insert("quaternions;", "\u{210D}"); + m.insert("quatint;", "\u{2A16}"); + m.insert("quest;", "\u{3F}"); + m.insert("questeq;", "\u{225F}"); + m.insert("quot", "\u{22}"); + m.insert("quot;", "\u{22}"); + m.insert("rAarr;", "\u{21DB}"); + m.insert("rArr;", "\u{21D2}"); + m.insert("rAtail;", "\u{291C}"); + m.insert("rBarr;", "\u{290F}"); + m.insert("rHar;", "\u{2964}"); + m.insert("race;", "\u{223D}\u{331}"); + m.insert("racute;", "\u{155}"); + m.insert("radic;", "\u{221A}"); + m.insert("raemptyv;", "\u{29B3}"); + m.insert("rang;", "\u{27E9}"); + m.insert("rangd;", "\u{2992}"); + m.insert("range;", "\u{29A5}"); + m.insert("rangle;", "\u{27E9}"); + m.insert("raquo", "\u{BB}"); + m.insert("raquo;", "\u{BB}"); + m.insert("rarr;", "\u{2192}"); + m.insert("rarrap;", "\u{2975}"); + m.insert("rarrb;", "\u{21E5}"); + m.insert("rarrbfs;", "\u{2920}"); + m.insert("rarrc;", "\u{2933}"); + m.insert("rarrfs;", "\u{291E}"); + m.insert("rarrhk;", "\u{21AA}"); + m.insert("rarrlp;", "\u{21AC}"); + m.insert("rarrpl;", "\u{2945}"); + m.insert("rarrsim;", "\u{2974}"); + m.insert("rarrtl;", "\u{21A3}"); + m.insert("rarrw;", "\u{219D}"); + m.insert("ratail;", "\u{291A}"); + m.insert("ratio;", "\u{2236}"); + m.insert("rationals;", "\u{211A}"); + m.insert("rbarr;", "\u{290D}"); + m.insert("rbbrk;", "\u{2773}"); + m.insert("rbrace;", "\u{7D}"); + m.insert("rbrack;", "\u{5D}"); + m.insert("rbrke;", "\u{298C}"); + m.insert("rbrksld;", "\u{298E}"); + m.insert("rbrkslu;", "\u{2990}"); + m.insert("rcaron;", "\u{159}"); + m.insert("rcedil;", "\u{157}"); + m.insert("rceil;", "\u{2309}"); + m.insert("rcub;", "\u{7D}"); + m.insert("rcy;", "\u{440}"); + m.insert("rdca;", "\u{2937}"); + m.insert("rdldhar;", "\u{2969}"); + m.insert("rdquo;", "\u{201D}"); + m.insert("rdquor;", "\u{201D}"); + m.insert("rdsh;", "\u{21B3}"); + m.insert("real;", "\u{211C}"); + m.insert("realine;", "\u{211B}"); + m.insert("realpart;", "\u{211C}"); + m.insert("reals;", "\u{211D}"); + m.insert("rect;", "\u{25AD}"); + m.insert("reg", "\u{AE}"); + m.insert("reg;", "\u{AE}"); + m.insert("rfisht;", "\u{297D}"); + m.insert("rfloor;", "\u{230B}"); + m.insert("rfr;", "\u{1D52F}"); + m.insert("rhard;", "\u{21C1}"); + m.insert("rharu;", "\u{21C0}"); + m.insert("rharul;", "\u{296C}"); + m.insert("rho;", "\u{3C1}"); + m.insert("rhov;", "\u{3F1}"); + m.insert("rightarrow;", "\u{2192}"); + m.insert("rightarrowtail;", "\u{21A3}"); + m.insert("rightharpoondown;", "\u{21C1}"); + m.insert("rightharpoonup;", "\u{21C0}"); + m.insert("rightleftarrows;", "\u{21C4}"); + m.insert("rightleftharpoons;", "\u{21CC}"); + m.insert("rightrightarrows;", "\u{21C9}"); + m.insert("rightsquigarrow;", "\u{219D}"); + m.insert("rightthreetimes;", "\u{22CC}"); + m.insert("ring;", "\u{2DA}"); + m.insert("risingdotseq;", "\u{2253}"); + m.insert("rlarr;", "\u{21C4}"); + m.insert("rlhar;", "\u{21CC}"); + m.insert("rlm;", "\u{200F}"); + m.insert("rmoust;", "\u{23B1}"); + m.insert("rmoustache;", "\u{23B1}"); + m.insert("rnmid;", "\u{2AEE}"); + m.insert("roang;", "\u{27ED}"); + m.insert("roarr;", "\u{21FE}"); + m.insert("robrk;", "\u{27E7}"); + m.insert("ropar;", "\u{2986}"); + m.insert("ropf;", "\u{1D563}"); + m.insert("roplus;", "\u{2A2E}"); + m.insert("rotimes;", "\u{2A35}"); + m.insert("rpar;", "\u{29}"); + m.insert("rpargt;", "\u{2994}"); + m.insert("rppolint;", "\u{2A12}"); + m.insert("rrarr;", "\u{21C9}"); + m.insert("rsaquo;", "\u{203A}"); + m.insert("rscr;", "\u{1D4C7}"); + m.insert("rsh;", "\u{21B1}"); + m.insert("rsqb;", "\u{5D}"); + m.insert("rsquo;", "\u{2019}"); + m.insert("rsquor;", "\u{2019}"); + m.insert("rthree;", "\u{22CC}"); + m.insert("rtimes;", "\u{22CA}"); + m.insert("rtri;", "\u{25B9}"); + m.insert("rtrie;", "\u{22B5}"); + m.insert("rtrif;", "\u{25B8}"); + m.insert("rtriltri;", "\u{29CE}"); + m.insert("ruluhar;", "\u{2968}"); + m.insert("rx;", "\u{211E}"); + m.insert("sacute;", "\u{15B}"); + m.insert("sbquo;", "\u{201A}"); + m.insert("sc;", "\u{227B}"); + m.insert("scE;", "\u{2AB4}"); + m.insert("scap;", "\u{2AB8}"); + m.insert("scaron;", "\u{161}"); + m.insert("sccue;", "\u{227D}"); + m.insert("sce;", "\u{2AB0}"); + m.insert("scedil;", "\u{15F}"); + m.insert("scirc;", "\u{15D}"); + m.insert("scnE;", "\u{2AB6}"); + m.insert("scnap;", "\u{2ABA}"); + m.insert("scnsim;", "\u{22E9}"); + m.insert("scpolint;", "\u{2A13}"); + m.insert("scsim;", "\u{227F}"); + m.insert("scy;", "\u{441}"); + m.insert("sdot;", "\u{22C5}"); + m.insert("sdotb;", "\u{22A1}"); + m.insert("sdote;", "\u{2A66}"); + m.insert("seArr;", "\u{21D8}"); + m.insert("searhk;", "\u{2925}"); + m.insert("searr;", "\u{2198}"); + m.insert("searrow;", "\u{2198}"); + m.insert("sect", "\u{A7}"); + m.insert("sect;", "\u{A7}"); + m.insert("semi;", "\u{3B}"); + m.insert("seswar;", "\u{2929}"); + m.insert("setminus;", "\u{2216}"); + m.insert("setmn;", "\u{2216}"); + m.insert("sext;", "\u{2736}"); + m.insert("sfr;", "\u{1D530}"); + m.insert("sfrown;", "\u{2322}"); + m.insert("sharp;", "\u{266F}"); + m.insert("shchcy;", "\u{449}"); + m.insert("shcy;", "\u{448}"); + m.insert("shortmid;", "\u{2223}"); + m.insert("shortparallel;", "\u{2225}"); + m.insert("shy", "\u{AD}"); + m.insert("shy;", "\u{AD}"); + m.insert("sigma;", "\u{3C3}"); + m.insert("sigmaf;", "\u{3C2}"); + m.insert("sigmav;", "\u{3C2}"); + m.insert("sim;", "\u{223C}"); + m.insert("simdot;", "\u{2A6A}"); + m.insert("sime;", "\u{2243}"); + m.insert("simeq;", "\u{2243}"); + m.insert("simg;", "\u{2A9E}"); + m.insert("simgE;", "\u{2AA0}"); + m.insert("siml;", "\u{2A9D}"); + m.insert("simlE;", "\u{2A9F}"); + m.insert("simne;", "\u{2246}"); + m.insert("simplus;", "\u{2A24}"); + m.insert("simrarr;", "\u{2972}"); + m.insert("slarr;", "\u{2190}"); + m.insert("smallsetminus;", "\u{2216}"); + m.insert("smashp;", "\u{2A33}"); + m.insert("smeparsl;", "\u{29E4}"); + m.insert("smid;", "\u{2223}"); + m.insert("smile;", "\u{2323}"); + m.insert("smt;", "\u{2AAA}"); + m.insert("smte;", "\u{2AAC}"); + m.insert("smtes;", "\u{2AAC}\u{FE00}"); + m.insert("softcy;", "\u{44C}"); + m.insert("sol;", "\u{2F}"); + m.insert("solb;", "\u{29C4}"); + m.insert("solbar;", "\u{233F}"); + m.insert("sopf;", "\u{1D564}"); + m.insert("spades;", "\u{2660}"); + m.insert("spadesuit;", "\u{2660}"); + m.insert("spar;", "\u{2225}"); + m.insert("sqcap;", "\u{2293}"); + m.insert("sqcaps;", "\u{2293}\u{FE00}"); + m.insert("sqcup;", "\u{2294}"); + m.insert("sqcups;", "\u{2294}\u{FE00}"); + m.insert("sqsub;", "\u{228F}"); + m.insert("sqsube;", "\u{2291}"); + m.insert("sqsubset;", "\u{228F}"); + m.insert("sqsubseteq;", "\u{2291}"); + m.insert("sqsup;", "\u{2290}"); + m.insert("sqsupe;", "\u{2292}"); + m.insert("sqsupset;", "\u{2290}"); + m.insert("sqsupseteq;", "\u{2292}"); + m.insert("squ;", "\u{25A1}"); + m.insert("square;", "\u{25A1}"); + m.insert("squarf;", "\u{25AA}"); + m.insert("squf;", "\u{25AA}"); + m.insert("srarr;", "\u{2192}"); + m.insert("sscr;", "\u{1D4C8}"); + m.insert("ssetmn;", "\u{2216}"); + m.insert("ssmile;", "\u{2323}"); + m.insert("sstarf;", "\u{22C6}"); + m.insert("star;", "\u{2606}"); + m.insert("starf;", "\u{2605}"); + m.insert("straightepsilon;", "\u{3F5}"); + m.insert("straightphi;", "\u{3D5}"); + m.insert("strns;", "\u{AF}"); + m.insert("sub;", "\u{2282}"); + m.insert("subE;", "\u{2AC5}"); + m.insert("subdot;", "\u{2ABD}"); + m.insert("sube;", "\u{2286}"); + m.insert("subedot;", "\u{2AC3}"); + m.insert("submult;", "\u{2AC1}"); + m.insert("subnE;", "\u{2ACB}"); + m.insert("subne;", "\u{228A}"); + m.insert("subplus;", "\u{2ABF}"); + m.insert("subrarr;", "\u{2979}"); + m.insert("subset;", "\u{2282}"); + m.insert("subseteq;", "\u{2286}"); + m.insert("subseteqq;", "\u{2AC5}"); + m.insert("subsetneq;", "\u{228A}"); + m.insert("subsetneqq;", "\u{2ACB}"); + m.insert("subsim;", "\u{2AC7}"); + m.insert("subsub;", "\u{2AD5}"); + m.insert("subsup;", "\u{2AD3}"); + m.insert("succ;", "\u{227B}"); + m.insert("succapprox;", "\u{2AB8}"); + m.insert("succcurlyeq;", "\u{227D}"); + m.insert("succeq;", "\u{2AB0}"); + m.insert("succnapprox;", "\u{2ABA}"); + m.insert("succneqq;", "\u{2AB6}"); + m.insert("succnsim;", "\u{22E9}"); + m.insert("succsim;", "\u{227F}"); + m.insert("sum;", "\u{2211}"); + m.insert("sung;", "\u{266A}"); + m.insert("sup1", "\u{B9}"); + m.insert("sup1;", "\u{B9}"); + m.insert("sup2", "\u{B2}"); + m.insert("sup2;", "\u{B2}"); + m.insert("sup3", "\u{B3}"); + m.insert("sup3;", "\u{B3}"); + m.insert("sup;", "\u{2283}"); + m.insert("supE;", "\u{2AC6}"); + m.insert("supdot;", "\u{2ABE}"); + m.insert("supdsub;", "\u{2AD8}"); + m.insert("supe;", "\u{2287}"); + m.insert("supedot;", "\u{2AC4}"); + m.insert("suphsol;", "\u{27C9}"); + m.insert("suphsub;", "\u{2AD7}"); + m.insert("suplarr;", "\u{297B}"); + m.insert("supmult;", "\u{2AC2}"); + m.insert("supnE;", "\u{2ACC}"); + m.insert("supne;", "\u{228B}"); + m.insert("supplus;", "\u{2AC0}"); + m.insert("supset;", "\u{2283}"); + m.insert("supseteq;", "\u{2287}"); + m.insert("supseteqq;", "\u{2AC6}"); + m.insert("supsetneq;", "\u{228B}"); + m.insert("supsetneqq;", "\u{2ACC}"); + m.insert("supsim;", "\u{2AC8}"); + m.insert("supsub;", "\u{2AD4}"); + m.insert("supsup;", "\u{2AD6}"); + m.insert("swArr;", "\u{21D9}"); + m.insert("swarhk;", "\u{2926}"); + m.insert("swarr;", "\u{2199}"); + m.insert("swarrow;", "\u{2199}"); + m.insert("swnwar;", "\u{292A}"); + m.insert("szlig", "\u{DF}"); + m.insert("szlig;", "\u{DF}"); + m.insert("target;", "\u{2316}"); + m.insert("tau;", "\u{3C4}"); + m.insert("tbrk;", "\u{23B4}"); + m.insert("tcaron;", "\u{165}"); + m.insert("tcedil;", "\u{163}"); + m.insert("tcy;", "\u{442}"); + m.insert("tdot;", "\u{20DB}"); + m.insert("telrec;", "\u{2315}"); + m.insert("tfr;", "\u{1D531}"); + m.insert("there4;", "\u{2234}"); + m.insert("therefore;", "\u{2234}"); + m.insert("theta;", "\u{3B8}"); + m.insert("thetasym;", "\u{3D1}"); + m.insert("thetav;", "\u{3D1}"); + m.insert("thickapprox;", "\u{2248}"); + m.insert("thicksim;", "\u{223C}"); + m.insert("thinsp;", "\u{2009}"); + m.insert("thkap;", "\u{2248}"); + m.insert("thksim;", "\u{223C}"); + m.insert("thorn", "\u{FE}"); + m.insert("thorn;", "\u{FE}"); + m.insert("tilde;", "\u{2DC}"); + m.insert("times", "\u{D7}"); + m.insert("times;", "\u{D7}"); + m.insert("timesb;", "\u{22A0}"); + m.insert("timesbar;", "\u{2A31}"); + m.insert("timesd;", "\u{2A30}"); + m.insert("tint;", "\u{222D}"); + m.insert("toea;", "\u{2928}"); + m.insert("top;", "\u{22A4}"); + m.insert("topbot;", "\u{2336}"); + m.insert("topcir;", "\u{2AF1}"); + m.insert("topf;", "\u{1D565}"); + m.insert("topfork;", "\u{2ADA}"); + m.insert("tosa;", "\u{2929}"); + m.insert("tprime;", "\u{2034}"); + m.insert("trade;", "\u{2122}"); + m.insert("triangle;", "\u{25B5}"); + m.insert("triangledown;", "\u{25BF}"); + m.insert("triangleleft;", "\u{25C3}"); + m.insert("trianglelefteq;", "\u{22B4}"); + m.insert("triangleq;", "\u{225C}"); + m.insert("triangleright;", "\u{25B9}"); + m.insert("trianglerighteq;", "\u{22B5}"); + m.insert("tridot;", "\u{25EC}"); + m.insert("trie;", "\u{225C}"); + m.insert("triminus;", "\u{2A3A}"); + m.insert("triplus;", "\u{2A39}"); + m.insert("trisb;", "\u{29CD}"); + m.insert("tritime;", "\u{2A3B}"); + m.insert("trpezium;", "\u{23E2}"); + m.insert("tscr;", "\u{1D4C9}"); + m.insert("tscy;", "\u{446}"); + m.insert("tshcy;", "\u{45B}"); + m.insert("tstrok;", "\u{167}"); + m.insert("twixt;", "\u{226C}"); + m.insert("twoheadleftarrow;", "\u{219E}"); + m.insert("twoheadrightarrow;", "\u{21A0}"); + m.insert("uArr;", "\u{21D1}"); + m.insert("uHar;", "\u{2963}"); + m.insert("uacute", "\u{FA}"); + m.insert("uacute;", "\u{FA}"); + m.insert("uarr;", "\u{2191}"); + m.insert("ubrcy;", "\u{45E}"); + m.insert("ubreve;", "\u{16D}"); + m.insert("ucirc", "\u{FB}"); + m.insert("ucirc;", "\u{FB}"); + m.insert("ucy;", "\u{443}"); + m.insert("udarr;", "\u{21C5}"); + m.insert("udblac;", "\u{171}"); + m.insert("udhar;", "\u{296E}"); + m.insert("ufisht;", "\u{297E}"); + m.insert("ufr;", "\u{1D532}"); + m.insert("ugrave", "\u{F9}"); + m.insert("ugrave;", "\u{F9}"); + m.insert("uharl;", "\u{21BF}"); + m.insert("uharr;", "\u{21BE}"); + m.insert("uhblk;", "\u{2580}"); + m.insert("ulcorn;", "\u{231C}"); + m.insert("ulcorner;", "\u{231C}"); + m.insert("ulcrop;", "\u{230F}"); + m.insert("ultri;", "\u{25F8}"); + m.insert("umacr;", "\u{16B}"); + m.insert("uml", "\u{A8}"); + m.insert("uml;", "\u{A8}"); + m.insert("uogon;", "\u{173}"); + m.insert("uopf;", "\u{1D566}"); + m.insert("uparrow;", "\u{2191}"); + m.insert("updownarrow;", "\u{2195}"); + m.insert("upharpoonleft;", "\u{21BF}"); + m.insert("upharpoonright;", "\u{21BE}"); + m.insert("uplus;", "\u{228E}"); + m.insert("upsi;", "\u{3C5}"); + m.insert("upsih;", "\u{3D2}"); + m.insert("upsilon;", "\u{3C5}"); + m.insert("upuparrows;", "\u{21C8}"); + m.insert("urcorn;", "\u{231D}"); + m.insert("urcorner;", "\u{231D}"); + m.insert("urcrop;", "\u{230E}"); + m.insert("uring;", "\u{16F}"); + m.insert("urtri;", "\u{25F9}"); + m.insert("uscr;", "\u{1D4CA}"); + m.insert("utdot;", "\u{22F0}"); + m.insert("utilde;", "\u{169}"); + m.insert("utri;", "\u{25B5}"); + m.insert("utrif;", "\u{25B4}"); + m.insert("uuarr;", "\u{21C8}"); + m.insert("uuml", "\u{FC}"); + m.insert("uuml;", "\u{FC}"); + m.insert("uwangle;", "\u{29A7}"); + m.insert("vArr;", "\u{21D5}"); + m.insert("vBar;", "\u{2AE8}"); + m.insert("vBarv;", "\u{2AE9}"); + m.insert("vDash;", "\u{22A8}"); + m.insert("vangrt;", "\u{299C}"); + m.insert("varepsilon;", "\u{3F5}"); + m.insert("varkappa;", "\u{3F0}"); + m.insert("varnothing;", "\u{2205}"); + m.insert("varphi;", "\u{3D5}"); + m.insert("varpi;", "\u{3D6}"); + m.insert("varpropto;", "\u{221D}"); + m.insert("varr;", "\u{2195}"); + m.insert("varrho;", "\u{3F1}"); + m.insert("varsigma;", "\u{3C2}"); + m.insert("varsubsetneq;", "\u{228A}\u{FE00}"); + m.insert("varsubsetneqq;", "\u{2ACB}\u{FE00}"); + m.insert("varsupsetneq;", "\u{228B}\u{FE00}"); + m.insert("varsupsetneqq;", "\u{2ACC}\u{FE00}"); + m.insert("vartheta;", "\u{3D1}"); + m.insert("vartriangleleft;", "\u{22B2}"); + m.insert("vartriangleright;", "\u{22B3}"); + m.insert("vcy;", "\u{432}"); + m.insert("vdash;", "\u{22A2}"); + m.insert("vee;", "\u{2228}"); + m.insert("veebar;", "\u{22BB}"); + m.insert("veeeq;", "\u{225A}"); + m.insert("vellip;", "\u{22EE}"); + m.insert("verbar;", "\u{7C}"); + m.insert("vert;", "\u{7C}"); + m.insert("vfr;", "\u{1D533}"); + m.insert("vltri;", "\u{22B2}"); + m.insert("vnsub;", "\u{2282}\u{20D2}"); + m.insert("vnsup;", "\u{2283}\u{20D2}"); + m.insert("vopf;", "\u{1D567}"); + m.insert("vprop;", "\u{221D}"); + m.insert("vrtri;", "\u{22B3}"); + m.insert("vscr;", "\u{1D4CB}"); + m.insert("vsubnE;", "\u{2ACB}\u{FE00}"); + m.insert("vsubne;", "\u{228A}\u{FE00}"); + m.insert("vsupnE;", "\u{2ACC}\u{FE00}"); + m.insert("vsupne;", "\u{228B}\u{FE00}"); + m.insert("vzigzag;", "\u{299A}"); + m.insert("wcirc;", "\u{175}"); + m.insert("wedbar;", "\u{2A5F}"); + m.insert("wedge;", "\u{2227}"); + m.insert("wedgeq;", "\u{2259}"); + m.insert("weierp;", "\u{2118}"); + m.insert("wfr;", "\u{1D534}"); + m.insert("wopf;", "\u{1D568}"); + m.insert("wp;", "\u{2118}"); + m.insert("wr;", "\u{2240}"); + m.insert("wreath;", "\u{2240}"); + m.insert("wscr;", "\u{1D4CC}"); + m.insert("xcap;", "\u{22C2}"); + m.insert("xcirc;", "\u{25EF}"); + m.insert("xcup;", "\u{22C3}"); + m.insert("xdtri;", "\u{25BD}"); + m.insert("xfr;", "\u{1D535}"); + m.insert("xhArr;", "\u{27FA}"); + m.insert("xharr;", "\u{27F7}"); + m.insert("xi;", "\u{3BE}"); + m.insert("xlArr;", "\u{27F8}"); + m.insert("xlarr;", "\u{27F5}"); + m.insert("xmap;", "\u{27FC}"); + m.insert("xnis;", "\u{22FB}"); + m.insert("xodot;", "\u{2A00}"); + m.insert("xopf;", "\u{1D569}"); + m.insert("xoplus;", "\u{2A01}"); + m.insert("xotime;", "\u{2A02}"); + m.insert("xrArr;", "\u{27F9}"); + m.insert("xrarr;", "\u{27F6}"); + m.insert("xscr;", "\u{1D4CD}"); + m.insert("xsqcup;", "\u{2A06}"); + m.insert("xuplus;", "\u{2A04}"); + m.insert("xutri;", "\u{25B3}"); + m.insert("xvee;", "\u{22C1}"); + m.insert("xwedge;", "\u{22C0}"); + m.insert("yacute", "\u{FD}"); + m.insert("yacute;", "\u{FD}"); + m.insert("yacy;", "\u{44F}"); + m.insert("ycirc;", "\u{177}"); + m.insert("ycy;", "\u{44B}"); + m.insert("yen", "\u{A5}"); + m.insert("yen;", "\u{A5}"); + m.insert("yfr;", "\u{1D536}"); + m.insert("yicy;", "\u{457}"); + m.insert("yopf;", "\u{1D56A}"); + m.insert("yscr;", "\u{1D4CE}"); + m.insert("yucy;", "\u{44E}"); + m.insert("yuml", "\u{FF}"); + m.insert("yuml;", "\u{FF}"); + m.insert("zacute;", "\u{17A}"); + m.insert("zcaron;", "\u{17E}"); + m.insert("zcy;", "\u{437}"); + m.insert("zdot;", "\u{17C}"); + m.insert("zeetrf;", "\u{2128}"); + m.insert("zeta;", "\u{3B6}"); + m.insert("zfr;", "\u{1D537}"); + m.insert("zhcy;", "\u{436}"); + m.insert("zigrarr;", "\u{21DD}"); + m.insert("zopf;", "\u{1D56B}"); + m.insert("zscr;", "\u{1D4CF}"); + m.insert("zwj;", "\u{200D}"); + m.insert("zwnj;", "\u{200C}"); + m + }; +} diff --git a/packages/hurl/src/html/escape.rs b/packages/hurl/src/html/escape.rs new file mode 100644 index 00000000000..42e7d161c6b --- /dev/null +++ b/packages/hurl/src/html/escape.rs @@ -0,0 +1,66 @@ +/* + * Hurl (https://hurl.dev) + * Copyright (C) 2022 Orange + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// Replaces special characters "&", "<" and ">" to HTML-safe sequences. +/// +/// Both double quote (") and single quote (') characters are also +/// translated. +/// +/// # Examples +/// +/// ``` +/// use hurl::html; +/// +/// let output = html::html_escape(""); +/// assert_eq!(output, "<foo>") +/// ``` +pub fn html_escape(text: &str) -> String { + let mut output = String::new(); + for c in text.chars() { + match c { + '&' => output.push_str("&"), + '<' => output.push_str("<"), + '>' => output.push_str(">"), + '"' => output.push_str("""), + '\'' => output.push_str("'"), + _ => output.push(c), + } + } + output +} + +#[cfg(test)] +mod tests { + use super::html_escape; + + #[test] + pub fn eval_html_escape() { + let tests = vec![ + ("foo", "foo"), + ("", "<tag>"), + ("foo & bar", "foo & bar"), + ( + "string with double quote: \"baz\"", + "string with double quote: "baz"", + ), + ]; + for (input, output) in tests.iter() { + assert_eq!(html_escape(input), output.to_string()) + } + } +} diff --git a/packages/hurl/src/html/mod.rs b/packages/hurl/src/html/mod.rs new file mode 100644 index 00000000000..a75dc759469 --- /dev/null +++ b/packages/hurl/src/html/mod.rs @@ -0,0 +1,23 @@ +/* + * Hurl (https://hurl.dev) + * Copyright (C) 2022 Orange + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +mod entities; +mod escape; +mod unescape; + +pub use self::escape::html_escape; +pub use self::unescape::html_unescape; diff --git a/packages/hurl/src/html/unescape.rs b/packages/hurl/src/html/unescape.rs new file mode 100644 index 00000000000..d069b196c05 --- /dev/null +++ b/packages/hurl/src/html/unescape.rs @@ -0,0 +1,511 @@ +/* + * Hurl (https://hurl.dev) + * Copyright (C) 2022 Orange + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +use crate::html::entities::HTML5_ENTITIES; +use lazy_static::lazy_static; +use regex::{Captures, Regex}; +use std::collections::HashMap; + +// Ref https://html.spec.whatwg.org/#decimal-character-reference-start-state +lazy_static! { + static ref INVALID_CHAR_REF: HashMap = { + let mut m = HashMap::new(); + m.insert(0x00, "\u{fffd}"); // REPLACEMENT CHARACTER + m.insert(0x0d, "\r"); // CARRIAGE RETURN + m.insert(0x80, "\u{20ac}"); // EURO SIGN + m.insert(0x81, "\u{81}"); // + m.insert(0x82, "\u{201a}"); // SINGLE LOW-9 QUOTATION MARK + m.insert(0x83, "\u{0192}"); // LATIN SMALL LETTER F WITH HOOK + m.insert(0x84, "\u{201e}"); // DOUBLE LOW-9 QUOTATION MARK + m.insert(0x85, "\u{2026}"); // HORIZONTAL ELLIPSIS + m.insert(0x86, "\u{2020}"); // DAGGER + m.insert(0x87, "\u{2021}"); // DOUBLE DAGGER + m.insert(0x88, "\u{02c6}"); // MODIFIER LETTER CIRCUMFLEX ACCENT + m.insert(0x89, "\u{2030}"); // PER MILLE SIGN + m.insert(0x8a, "\u{0160}"); // LATIN CAPITAL LETTER S WITH CARON + m.insert(0x8b, "\u{2039}"); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK + m.insert(0x8c, "\u{0152}"); // LATIN CAPITAL LIGATURE OE + m.insert(0x8d, "\u{8d}"); // + m.insert(0x8e, "\u{017d}"); // LATIN CAPITAL LETTER Z WITH CARON + m.insert(0x8f, "\u{8f}"); // + m.insert(0x90, "\u{90}"); // + m.insert(0x91, "\u{2018}"); // LEFT SINGLE QUOTATION MARK + m.insert(0x92, "\u{2019}"); // RIGHT SINGLE QUOTATION MARK + m.insert(0x93, "\u{201c}"); // LEFT DOUBLE QUOTATION MARK + m.insert(0x94, "\u{201d}"); // RIGHT DOUBLE QUOTATION MARK + m.insert(0x95, "\u{2022}"); // BULLET + m.insert(0x96, "\u{2013}"); // EN DASH + m.insert(0x97, "\u{2014}"); // EM DASH + m.insert(0x98, "\u{02dc}"); // SMALL TILDE + m.insert(0x99, "\u{2122}"); // TRADE MARK SIGN + m.insert(0x9a, "\u{0161}"); // LATIN SMALL LETTER S WITH CARON + m.insert(0x9b, "\u{203a}"); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + m.insert(0x9c, "\u{0153}"); // LATIN SMALL LIGATURE OE + m.insert(0x9d, "\u{9d}"); // + m.insert(0x9e, "\u{017e}"); // LATIN SMALL LETTER Z WITH CARON + m.insert(0x9f, "\u{0178}"); // LATIN CAPITAL LETTER Y WITH DIAERESIS + m + }; +} + +const INVALID_CODEPOINTS: [u32; 126] = [ + // 0x0001 to 0x0008 + 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, // 0x000E to 0x001F + 0xe, 0xf, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, // 0x007F to 0x009F + 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, + 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, + 0x9f, // 0xFDD0 to 0xFDEF + 0xfdd0, 0xfdd1, 0xfdd2, 0xfdd3, 0xfdd4, 0xfdd5, 0xfdd6, 0xfdd7, 0xfdd8, 0xfdd9, 0xfdda, 0xfddb, + 0xfddc, 0xfddd, 0xfdde, 0xfddf, 0xfde0, 0xfde1, 0xfde2, 0xfde3, 0xfde4, 0xfde5, 0xfde6, 0xfde7, + 0xfde8, 0xfde9, 0xfdea, 0xfdeb, 0xfdec, 0xfded, 0xfdee, 0xfdef, // Others + 0xb, 0xfffe, 0xffff, 0x1fffe, 0x1ffff, 0x2fffe, 0x2ffff, 0x3fffe, 0x3ffff, 0x4fffe, 0x4ffff, + 0x5fffe, 0x5ffff, 0x6fffe, 0x6ffff, 0x7fffe, 0x7ffff, 0x8fffe, 0x8ffff, 0x9fffe, 0x9ffff, + 0xafffe, 0xaffff, 0xbfffe, 0xbffff, 0xcfffe, 0xcffff, 0xdfffe, 0xdffff, 0xefffe, 0xeffff, + 0xffffe, 0xfffff, 0x10fffe, 0x10ffff, +]; + +lazy_static! { + static ref CHAR_REF: Regex = Regex::new(concat!( + r"&(#\d+;?", + r"|#[xX][\da-fA-F]+;?", + r"|[^\t\n\f <&#;]{1,32};?)", + )) + .unwrap(); +} + +/// Convert all named and numeric character references (e.g. >, >, +/// &x3e;) in the string `text` to the corresponding unicode characters. +/// This function uses the rules defined by the HTML 5 standard +/// for both valid and invalid character references, and the list of +/// HTML 5 named character references defined in html.entities.html5. +/// +/// The code is adapted from the Python standard library: +/// https://github.com/python/cpython/blob/main/Lib/html/__init__.py +/// +/// See MDN decoder tool: https://mothereff.in/html-entities +/// +/// # Examples +/// +/// ``` +/// use hurl::html; +/// +/// let output = html::html_unescape("Foo © bar 𝌆 baz ☃ qux"); +/// assert_eq!(output, "Foo © bar 𝌆 baz ☃ qux") +/// ``` +pub fn html_unescape(text: &str) -> String { + return if text.chars().any(|c| c == '&') { + CHAR_REF + .replace_all(text, |caps: &Captures| { + let s = &caps[1]; + let s0 = s.chars().next().unwrap(); + return if s0 == '#' { + // Numeric charref + let s1 = s.chars().nth(1).unwrap(); + let num = if s1 == 'x' || s1 == 'X' { + let val = s[2..].trim_end_matches(';'); + match u32::from_str_radix(val, 16) { + Ok(val) => val, + Err(_) => return "\u{FFFD}".to_string(), + } + } else { + let val = s[1..].trim_end_matches(';'); + match val.parse::() { + Ok(val) => val, + Err(_) => return "\u{FFFD}".to_string(), + } + }; + if let Some(char) = INVALID_CHAR_REF.get(&num) { + return char.to_string(); + } + if (0xD800..=0xDFFF).contains(&num) || num > 0x10FFFF { + return "\u{FFFD}".to_string(); + } + if INVALID_CODEPOINTS.contains(&num) { + return "".to_string(); + } + char::from_u32(num).unwrap().to_string() + } else { + if let Some(entity) = HTML5_ENTITIES.get(s) { + return entity.to_string(); + } + // Find the longest matching name (as defined by the standard) + for x in (1..s.len()).rev() { + let name = &s[..x]; + if let Some(entity) = HTML5_ENTITIES.get(name) { + return format!("{}{}", entity, &s[x..]); + } + } + format!("&{s}") + }; + }) + .to_string() + } else { + text.to_string() + }; +} + +#[cfg(test)] +mod tests { + use super::html_unescape; + + /// Extracts from Python test suites: https://github.com/python/cpython/blob/main/Lib/test/test_html.py + #[test] + fn test_html_unescape() { + fn check(text: &str, expected: &str) { + assert_eq!(html_unescape(text), expected.to_string()) + } + + fn check_num(num: usize, expected: &str) { + let text = format!("&#{}", num); + check(&text, expected); + let text = format!("&#{};", num); + check(&text, expected); + let text = format!("&#x{:x}", num); + check(&text, expected); + let text = format!("&#x{:x};", num); + check(&text, expected); + } + + check("Hurl⇄", "Hurl⇄"); + + // Check simple + check( + "Foo © bar 𝌆 baz ☃ qux", + "Foo © bar 𝌆 baz ☃ qux", + ); + + // Check text with no character references + check("no character references", "no character references"); + + // Check & followed by invalid chars + check("&\n&\t& &&", "&\n&\t& &&"); + + // Check & followed by numbers and letters + check("&0 &9 &a &0; &9; &a;", "&0 &9 &a &0; &9; &a;"); + + // Check incomplete entities at the end of the string + for x in ["&", "&#", "&#x", "&#X", "&#y", "&#xy", "&#Xy"].iter() { + check(x, x); + check(&format!("{x};"), &format!("{x};")) + } + + // Check several combinations of numeric character references, + // possibly followed by different characters + + // Format Ӓ (without ending semi-colon) + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#{}", num), &format!("{}", char)); + check(&format!("&#{} ", num), &format!("{} ", char)); + check(&format!("&#{}X", num), &format!("{}X", char)); + } + + // Format Ӓ (without ending semi-colon) + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#{:07}", num), &format!("{}", char)); + check(&format!("&#{:07} ", num), &format!("{} ", char)); + check(&format!("&#{:07}X", num), &format!("{}X", char)); + } + + // Format Ӓ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#{};", num), &format!("{}", char)); + check(&format!("&#{}; ", num), &format!("{} ", char)); + check(&format!("&#{};X", num), &format!("{}X", char)); + } + + // Format Ӓ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#{:07};", num), &format!("{}", char)); + check(&format!("&#{:07}; ", num), &format!("{} ", char)); + check(&format!("&#{:07};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:x}", num), &format!("{}", char)); + check(&format!("&#x{:x} ", num), &format!("{} ", char)); + check(&format!("&#x{:x}X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:06x}", num), &format!("{}", char)); + check(&format!("&#x{:06x} ", num), &format!("{} ", char)); + check(&format!("&#x{:06x}X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:x};", num), &format!("{}", char)); + check(&format!("&#x{:x}; ", num), &format!("{} ", char)); + check(&format!("&#x{:x};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:06x};", num), &format!("{}", char)); + check(&format!("&#x{:06x}; ", num), &format!("{} ", char)); + check(&format!("&#x{:06x};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:X}", num), &format!("{}", char)); + check(&format!("&#x{:X} ", num), &format!("{} ", char)); + check(&format!("&#x{:X}X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:06X}", num), &format!("{}", char)); + check(&format!("&#x{:06X} ", num), &format!("{} ", char)); + check(&format!("&#x{:06X}X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:X};", num), &format!("{}", char)); + check(&format!("&#x{:X}; ", num), &format!("{} ", char)); + check(&format!("&#x{:X};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#x{:06X};", num), &format!("{}", char)); + check(&format!("&#x{:06X}; ", num), &format!("{} ", char)); + check(&format!("&#x{:06X};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#X{:x};", num), &format!("{}", char)); + check(&format!("&#X{:x}; ", num), &format!("{} ", char)); + check(&format!("&#X{:x};X", num), &format!("{}X", char)); + } + + // Format ᪼ + for (num, char) in [ + (65, 'A'), + (97, 'a'), + (34, '"'), + (38, '&'), + (0x2603, '\u{2603}'), + (0x101234, '\u{101234}'), + ] + .iter() + { + check(&format!("&#X{:06x};", num), &format!("{}", char)); + check(&format!("&#X{:06x}; ", num), &format!("{} ", char)); + check(&format!("&#X{:06x};X", num), &format!("{}X", char)); + } + + // Check invalid code points + for cp in [0xD800, 0xDB00, 0xDC00, 0xDFFF, 0x110000] { + check_num(cp, "\u{FFFD}"); + } + + // Check more invalid code points + for cp in [0x1, 0xb, 0xe, 0x7f, 0xfffe, 0xffff, 0x10fffe, 0x10ffff] { + check_num(cp, ""); + } + + // Check invalid numbers + for (num, ch) in [(0x0d, "\r"), (0x80, "\u{20ac}"), (0x95, "\u{2022}")] { + check_num(num, ch) + } + + // Check small numbers + check_num(0, "\u{FFFD}"); + check_num(9, "\t"); + + // Check a big number + check_num(1000000000000000000, "\u{FFFD}"); + + // Check that multiple trailing semicolons are handled correctly + for e in ["";", "";", "";", "";"] { + check(e, "\";") + } + + // Check that semicolons in the middle don't create problems + for e in [""quot;", ""quot;", ""quot;", ""quot;"] { + check(e, "\"quot;") + } + + // Check triple adjacent charrefs + for e in [""", """, """, """] { + // check(&e.repeat(3), "\"\"\""); + check(&format!("{};", e).repeat(3), "\"\"\"") + } + + // Check that the case is respected + for e in ["&", "&", "&", "&"] { + check(e, "&") + } + for e in ["&Amp", "&Amp;"] { + check(e, e) + } + + // Check that non-existent named entities are returned unchanged + check("&svadilfari;", "&svadilfari;"); + + // The following examples are in the html5 specs + check("¬it", "¬it"); + check("¬it;", "¬it;"); + check("¬in", "¬in"); + check("∉", "∉"); + + // A similar example with a long name + check( + "¬ReallyAnExistingNamedCharacterReference;", + "¬ReallyAnExistingNamedCharacterReference;", + ); + + // Longest valid name + check("∳", "∳"); + + // Check a charref that maps to two unicode chars + check("∾̳", "\u{223e}\u{333}"); + check("&acE", "&acE"); + + // See Python #12888 + check(&"{ ".repeat(1050), &"{ ".repeat(1050)); + // See Python #15156 + check( + "ÉricÉric&alphacentauriαcentauri", + "ÉricÉric&alphacentauriαcentauri", + ); + check("&co;", "&co;") + } +} diff --git a/packages/hurl/src/lib.rs b/packages/hurl/src/lib.rs index 6135d97ab8a..dd36c44f032 100644 --- a/packages/hurl/src/lib.rs +++ b/packages/hurl/src/lib.rs @@ -18,6 +18,7 @@ #![cfg_attr(feature = "strict", deny(warnings))] pub mod cli; +pub mod html; pub mod http; pub mod json; pub mod jsonpath; diff --git a/packages/hurl/src/runner/filter.rs b/packages/hurl/src/runner/filter.rs index 8ec3c81253e..bc89559029f 100644 --- a/packages/hurl/src/runner/filter.rs +++ b/packages/hurl/src/runner/filter.rs @@ -15,6 +15,7 @@ * limitations under the License. * */ +use crate::html; use crate::runner::template::eval_template; use crate::runner::{Error, RunnerError, Value}; use hurl_core::ast::{Filter, FilterValue, RegexValue, SourceInfo}; @@ -158,9 +159,8 @@ fn eval_url_decode(value: &Value, source_info: &SourceInfo) -> Result Result { match value { Value::String(value) => { - let mut enco = String::from(value); - let encoded = html_escape::encode_text_to_string(value, &mut enco); - Ok(Value::String(encoded.to_string())) + let encoded = html::html_escape(value); + Ok(Value::String(encoded)) } v => Err(Error { source_info: source_info.clone(), @@ -173,7 +173,7 @@ fn eval_html_encode(value: &Value, source_info: &SourceInfo) -> Result Result { match value { Value::String(value) => { - let decoded = html_escape::decode_html_entities(value).to_string(); + let decoded = html::html_unescape(value); Ok(Value::String(decoded)) } v => Err(Error { @@ -418,4 +418,54 @@ pub mod tests { RunnerError::FilterInvalidInput("bool ".to_string()) ); } + + #[test] + pub fn eval_filter_html_escape() { + let variables = HashMap::new(); + let filter = Filter { + source_info: SourceInfo::new(1, 1, 1, 1), + value: FilterValue::HtmlEscape, + }; + + let tests = vec![ + ("foo", "foo"), + ("", "<tag>"), + ("foo & bar", "foo & bar"), + ( + "string with double quote: \"baz\"", + "string with double quote: "baz"", + ), + ]; + for (input, output) in tests.iter() { + assert_eq!( + eval_filter(&filter, &Value::String(input.to_string()), &variables).unwrap(), + Value::String(output.to_string()) + ); + } + } + + #[test] + pub fn eval_filter_html_unescape() { + let variables = HashMap::new(); + let filter = Filter { + source_info: SourceInfo::new(1, 1, 1, 1), + value: FilterValue::HtmlUnescape, + }; + + let tests = vec![ + ("foo", "foo"), + ("<tag>", ""), + ("foo & bar", "foo & bar"), + ( + "string with double quote: "baz"", + "string with double quote: \"baz\"", + ), + ]; + for (input, output) in tests.iter() { + assert_eq!( + eval_filter(&filter, &Value::String(input.to_string()), &variables).unwrap(), + Value::String(output.to_string()) + ); + } + } }