]> jfr.im git - yt-dlp.git/blame - youtube_dl/compat.py
Merge branch 'fstirlitz-filmon'
[yt-dlp.git] / youtube_dl / compat.py
CommitLineData
dfe5fa49 1# coding: utf-8
451948b2
PH
2from __future__ import unicode_literals
3
0a67a363 4import binascii
003c69a8 5import collections
0a67a363 6import email
8c25f81b 7import getpass
0a67a363 8import io
e07e9313 9import optparse
8c25f81b 10import os
7d4111ed 11import re
51f579b6 12import shlex
003c69a8 13import shutil
be4a824d 14import socket
dab0daee 15import struct
8c25f81b
PH
16import subprocess
17import sys
a0e060ac 18import itertools
36e6f62c 19import xml.etree.ElementTree
8c25f81b
PH
20
21
22try:
23 import urllib.request as compat_urllib_request
5f6a1245 24except ImportError: # Python 2
8c25f81b
PH
25 import urllib2 as compat_urllib_request
26
27try:
28 import urllib.error as compat_urllib_error
5f6a1245 29except ImportError: # Python 2
8c25f81b
PH
30 import urllib2 as compat_urllib_error
31
32try:
33 import urllib.parse as compat_urllib_parse
5f6a1245 34except ImportError: # Python 2
8c25f81b
PH
35 import urllib as compat_urllib_parse
36
37try:
38 from urllib.parse import urlparse as compat_urllib_parse_urlparse
5f6a1245 39except ImportError: # Python 2
8c25f81b
PH
40 from urlparse import urlparse as compat_urllib_parse_urlparse
41
42try:
43 import urllib.parse as compat_urlparse
5f6a1245 44except ImportError: # Python 2
8c25f81b
PH
45 import urlparse as compat_urlparse
46
0a67a363
YCH
47try:
48 import urllib.response as compat_urllib_response
49except ImportError: # Python 2
50 import urllib as compat_urllib_response
51
8c25f81b
PH
52try:
53 import http.cookiejar as compat_cookiejar
5f6a1245 54except ImportError: # Python 2
8c25f81b
PH
55 import cookielib as compat_cookiejar
56
799207e8 57try:
58 import http.cookies as compat_cookies
59except ImportError: # Python 2
60 import Cookie as compat_cookies
61
8c25f81b
PH
62try:
63 import html.entities as compat_html_entities
5f6a1245 64except ImportError: # Python 2
8c25f81b
PH
65 import htmlentitydefs as compat_html_entities
66
9631a94f 67try: # Python >= 3.3
836ab0c5
YCH
68 compat_html_entities_html5 = compat_html_entities.html5
69except AttributeError:
9631a94f
YCH
70 # Copied from CPython 3.5.1 html/entities.py
71 compat_html_entities_html5 = {
72 'Aacute': '\xc1',
73 'aacute': '\xe1',
74 'Aacute;': '\xc1',
75 'aacute;': '\xe1',
76 'Abreve;': '\u0102',
77 'abreve;': '\u0103',
78 'ac;': '\u223e',
79 'acd;': '\u223f',
80 'acE;': '\u223e\u0333',
81 'Acirc': '\xc2',
82 'acirc': '\xe2',
83 'Acirc;': '\xc2',
84 'acirc;': '\xe2',
85 'acute': '\xb4',
86 'acute;': '\xb4',
87 'Acy;': '\u0410',
88 'acy;': '\u0430',
89 'AElig': '\xc6',
90 'aelig': '\xe6',
91 'AElig;': '\xc6',
92 'aelig;': '\xe6',
93 'af;': '\u2061',
94 'Afr;': '\U0001d504',
95 'afr;': '\U0001d51e',
96 'Agrave': '\xc0',
97 'agrave': '\xe0',
98 'Agrave;': '\xc0',
99 'agrave;': '\xe0',
100 'alefsym;': '\u2135',
101 'aleph;': '\u2135',
102 'Alpha;': '\u0391',
103 'alpha;': '\u03b1',
104 'Amacr;': '\u0100',
105 'amacr;': '\u0101',
106 'amalg;': '\u2a3f',
107 'AMP': '&',
108 'amp': '&',
109 'AMP;': '&',
110 'amp;': '&',
111 'And;': '\u2a53',
112 'and;': '\u2227',
113 'andand;': '\u2a55',
114 'andd;': '\u2a5c',
115 'andslope;': '\u2a58',
116 'andv;': '\u2a5a',
117 'ang;': '\u2220',
118 'ange;': '\u29a4',
119 'angle;': '\u2220',
120 'angmsd;': '\u2221',
121 'angmsdaa;': '\u29a8',
122 'angmsdab;': '\u29a9',
123 'angmsdac;': '\u29aa',
124 'angmsdad;': '\u29ab',
125 'angmsdae;': '\u29ac',
126 'angmsdaf;': '\u29ad',
127 'angmsdag;': '\u29ae',
128 'angmsdah;': '\u29af',
129 'angrt;': '\u221f',
130 'angrtvb;': '\u22be',
131 'angrtvbd;': '\u299d',
132 'angsph;': '\u2222',
133 'angst;': '\xc5',
134 'angzarr;': '\u237c',
135 'Aogon;': '\u0104',
136 'aogon;': '\u0105',
137 'Aopf;': '\U0001d538',
138 'aopf;': '\U0001d552',
139 'ap;': '\u2248',
140 'apacir;': '\u2a6f',
141 'apE;': '\u2a70',
142 'ape;': '\u224a',
143 'apid;': '\u224b',
144 'apos;': "'",
145 'ApplyFunction;': '\u2061',
146 'approx;': '\u2248',
147 'approxeq;': '\u224a',
148 'Aring': '\xc5',
149 'aring': '\xe5',
150 'Aring;': '\xc5',
151 'aring;': '\xe5',
152 'Ascr;': '\U0001d49c',
153 'ascr;': '\U0001d4b6',
154 'Assign;': '\u2254',
155 'ast;': '*',
156 'asymp;': '\u2248',
157 'asympeq;': '\u224d',
158 'Atilde': '\xc3',
159 'atilde': '\xe3',
160 'Atilde;': '\xc3',
161 'atilde;': '\xe3',
162 'Auml': '\xc4',
163 'auml': '\xe4',
164 'Auml;': '\xc4',
165 'auml;': '\xe4',
166 'awconint;': '\u2233',
167 'awint;': '\u2a11',
168 'backcong;': '\u224c',
169 'backepsilon;': '\u03f6',
170 'backprime;': '\u2035',
171 'backsim;': '\u223d',
172 'backsimeq;': '\u22cd',
173 'Backslash;': '\u2216',
174 'Barv;': '\u2ae7',
175 'barvee;': '\u22bd',
176 'Barwed;': '\u2306',
177 'barwed;': '\u2305',
178 'barwedge;': '\u2305',
179 'bbrk;': '\u23b5',
180 'bbrktbrk;': '\u23b6',
181 'bcong;': '\u224c',
182 'Bcy;': '\u0411',
183 'bcy;': '\u0431',
184 'bdquo;': '\u201e',
185 'becaus;': '\u2235',
186 'Because;': '\u2235',
187 'because;': '\u2235',
188 'bemptyv;': '\u29b0',
189 'bepsi;': '\u03f6',
190 'bernou;': '\u212c',
191 'Bernoullis;': '\u212c',
192 'Beta;': '\u0392',
193 'beta;': '\u03b2',
194 'beth;': '\u2136',
195 'between;': '\u226c',
196 'Bfr;': '\U0001d505',
197 'bfr;': '\U0001d51f',
198 'bigcap;': '\u22c2',
199 'bigcirc;': '\u25ef',
200 'bigcup;': '\u22c3',
201 'bigodot;': '\u2a00',
202 'bigoplus;': '\u2a01',
203 'bigotimes;': '\u2a02',
204 'bigsqcup;': '\u2a06',
205 'bigstar;': '\u2605',
206 'bigtriangledown;': '\u25bd',
207 'bigtriangleup;': '\u25b3',
208 'biguplus;': '\u2a04',
209 'bigvee;': '\u22c1',
210 'bigwedge;': '\u22c0',
211 'bkarow;': '\u290d',
212 'blacklozenge;': '\u29eb',
213 'blacksquare;': '\u25aa',
214 'blacktriangle;': '\u25b4',
215 'blacktriangledown;': '\u25be',
216 'blacktriangleleft;': '\u25c2',
217 'blacktriangleright;': '\u25b8',
218 'blank;': '\u2423',
219 'blk12;': '\u2592',
220 'blk14;': '\u2591',
221 'blk34;': '\u2593',
222 'block;': '\u2588',
223 'bne;': '=\u20e5',
224 'bnequiv;': '\u2261\u20e5',
225 'bNot;': '\u2aed',
226 'bnot;': '\u2310',
227 'Bopf;': '\U0001d539',
228 'bopf;': '\U0001d553',
229 'bot;': '\u22a5',
230 'bottom;': '\u22a5',
231 'bowtie;': '\u22c8',
232 'boxbox;': '\u29c9',
233 'boxDL;': '\u2557',
234 'boxDl;': '\u2556',
235 'boxdL;': '\u2555',
236 'boxdl;': '\u2510',
237 'boxDR;': '\u2554',
238 'boxDr;': '\u2553',
239 'boxdR;': '\u2552',
240 'boxdr;': '\u250c',
241 'boxH;': '\u2550',
242 'boxh;': '\u2500',
243 'boxHD;': '\u2566',
244 'boxHd;': '\u2564',
245 'boxhD;': '\u2565',
246 'boxhd;': '\u252c',
247 'boxHU;': '\u2569',
248 'boxHu;': '\u2567',
249 'boxhU;': '\u2568',
250 'boxhu;': '\u2534',
251 'boxminus;': '\u229f',
252 'boxplus;': '\u229e',
253 'boxtimes;': '\u22a0',
254 'boxUL;': '\u255d',
255 'boxUl;': '\u255c',
256 'boxuL;': '\u255b',
257 'boxul;': '\u2518',
258 'boxUR;': '\u255a',
259 'boxUr;': '\u2559',
260 'boxuR;': '\u2558',
261 'boxur;': '\u2514',
262 'boxV;': '\u2551',
263 'boxv;': '\u2502',
264 'boxVH;': '\u256c',
265 'boxVh;': '\u256b',
266 'boxvH;': '\u256a',
267 'boxvh;': '\u253c',
268 'boxVL;': '\u2563',
269 'boxVl;': '\u2562',
270 'boxvL;': '\u2561',
271 'boxvl;': '\u2524',
272 'boxVR;': '\u2560',
273 'boxVr;': '\u255f',
274 'boxvR;': '\u255e',
275 'boxvr;': '\u251c',
276 'bprime;': '\u2035',
277 'Breve;': '\u02d8',
278 'breve;': '\u02d8',
279 'brvbar': '\xa6',
280 'brvbar;': '\xa6',
281 'Bscr;': '\u212c',
282 'bscr;': '\U0001d4b7',
283 'bsemi;': '\u204f',
284 'bsim;': '\u223d',
285 'bsime;': '\u22cd',
286 'bsol;': '\\',
287 'bsolb;': '\u29c5',
288 'bsolhsub;': '\u27c8',
289 'bull;': '\u2022',
290 'bullet;': '\u2022',
291 'bump;': '\u224e',
292 'bumpE;': '\u2aae',
293 'bumpe;': '\u224f',
294 'Bumpeq;': '\u224e',
295 'bumpeq;': '\u224f',
296 'Cacute;': '\u0106',
297 'cacute;': '\u0107',
298 'Cap;': '\u22d2',
299 'cap;': '\u2229',
300 'capand;': '\u2a44',
301 'capbrcup;': '\u2a49',
302 'capcap;': '\u2a4b',
303 'capcup;': '\u2a47',
304 'capdot;': '\u2a40',
305 'CapitalDifferentialD;': '\u2145',
306 'caps;': '\u2229\ufe00',
307 'caret;': '\u2041',
308 'caron;': '\u02c7',
309 'Cayleys;': '\u212d',
310 'ccaps;': '\u2a4d',
311 'Ccaron;': '\u010c',
312 'ccaron;': '\u010d',
313 'Ccedil': '\xc7',
314 'ccedil': '\xe7',
315 'Ccedil;': '\xc7',
316 'ccedil;': '\xe7',
317 'Ccirc;': '\u0108',
318 'ccirc;': '\u0109',
319 'Cconint;': '\u2230',
320 'ccups;': '\u2a4c',
321 'ccupssm;': '\u2a50',
322 'Cdot;': '\u010a',
323 'cdot;': '\u010b',
324 'cedil': '\xb8',
325 'cedil;': '\xb8',
326 'Cedilla;': '\xb8',
327 'cemptyv;': '\u29b2',
328 'cent': '\xa2',
329 'cent;': '\xa2',
330 'CenterDot;': '\xb7',
331 'centerdot;': '\xb7',
332 'Cfr;': '\u212d',
333 'cfr;': '\U0001d520',
334 'CHcy;': '\u0427',
335 'chcy;': '\u0447',
336 'check;': '\u2713',
337 'checkmark;': '\u2713',
338 'Chi;': '\u03a7',
339 'chi;': '\u03c7',
340 'cir;': '\u25cb',
341 'circ;': '\u02c6',
342 'circeq;': '\u2257',
343 'circlearrowleft;': '\u21ba',
344 'circlearrowright;': '\u21bb',
345 'circledast;': '\u229b',
346 'circledcirc;': '\u229a',
347 'circleddash;': '\u229d',
348 'CircleDot;': '\u2299',
349 'circledR;': '\xae',
350 'circledS;': '\u24c8',
351 'CircleMinus;': '\u2296',
352 'CirclePlus;': '\u2295',
353 'CircleTimes;': '\u2297',
354 'cirE;': '\u29c3',
355 'cire;': '\u2257',
356 'cirfnint;': '\u2a10',
357 'cirmid;': '\u2aef',
358 'cirscir;': '\u29c2',
359 'ClockwiseContourIntegral;': '\u2232',
360 'CloseCurlyDoubleQuote;': '\u201d',
361 'CloseCurlyQuote;': '\u2019',
362 'clubs;': '\u2663',
363 'clubsuit;': '\u2663',
364 'Colon;': '\u2237',
365 'colon;': ':',
366 'Colone;': '\u2a74',
367 'colone;': '\u2254',
368 'coloneq;': '\u2254',
369 'comma;': ',',
370 'commat;': '@',
371 'comp;': '\u2201',
372 'compfn;': '\u2218',
373 'complement;': '\u2201',
374 'complexes;': '\u2102',
375 'cong;': '\u2245',
376 'congdot;': '\u2a6d',
377 'Congruent;': '\u2261',
378 'Conint;': '\u222f',
379 'conint;': '\u222e',
380 'ContourIntegral;': '\u222e',
381 'Copf;': '\u2102',
382 'copf;': '\U0001d554',
383 'coprod;': '\u2210',
384 'Coproduct;': '\u2210',
385 'COPY': '\xa9',
386 'copy': '\xa9',
387 'COPY;': '\xa9',
388 'copy;': '\xa9',
389 'copysr;': '\u2117',
390 'CounterClockwiseContourIntegral;': '\u2233',
391 'crarr;': '\u21b5',
392 'Cross;': '\u2a2f',
393 'cross;': '\u2717',
394 'Cscr;': '\U0001d49e',
395 'cscr;': '\U0001d4b8',
396 'csub;': '\u2acf',
397 'csube;': '\u2ad1',
398 'csup;': '\u2ad0',
399 'csupe;': '\u2ad2',
400 'ctdot;': '\u22ef',
401 'cudarrl;': '\u2938',
402 'cudarrr;': '\u2935',
403 'cuepr;': '\u22de',
404 'cuesc;': '\u22df',
405 'cularr;': '\u21b6',
406 'cularrp;': '\u293d',
407 'Cup;': '\u22d3',
408 'cup;': '\u222a',
409 'cupbrcap;': '\u2a48',
410 'CupCap;': '\u224d',
411 'cupcap;': '\u2a46',
412 'cupcup;': '\u2a4a',
413 'cupdot;': '\u228d',
414 'cupor;': '\u2a45',
415 'cups;': '\u222a\ufe00',
416 'curarr;': '\u21b7',
417 'curarrm;': '\u293c',
418 'curlyeqprec;': '\u22de',
419 'curlyeqsucc;': '\u22df',
420 'curlyvee;': '\u22ce',
421 'curlywedge;': '\u22cf',
422 'curren': '\xa4',
423 'curren;': '\xa4',
424 'curvearrowleft;': '\u21b6',
425 'curvearrowright;': '\u21b7',
426 'cuvee;': '\u22ce',
427 'cuwed;': '\u22cf',
428 'cwconint;': '\u2232',
429 'cwint;': '\u2231',
430 'cylcty;': '\u232d',
431 'Dagger;': '\u2021',
432 'dagger;': '\u2020',
433 'daleth;': '\u2138',
434 'Darr;': '\u21a1',
435 'dArr;': '\u21d3',
436 'darr;': '\u2193',
437 'dash;': '\u2010',
438 'Dashv;': '\u2ae4',
439 'dashv;': '\u22a3',
440 'dbkarow;': '\u290f',
441 'dblac;': '\u02dd',
442 'Dcaron;': '\u010e',
443 'dcaron;': '\u010f',
444 'Dcy;': '\u0414',
445 'dcy;': '\u0434',
446 'DD;': '\u2145',
447 'dd;': '\u2146',
448 'ddagger;': '\u2021',
449 'ddarr;': '\u21ca',
450 'DDotrahd;': '\u2911',
451 'ddotseq;': '\u2a77',
452 'deg': '\xb0',
453 'deg;': '\xb0',
454 'Del;': '\u2207',
455 'Delta;': '\u0394',
456 'delta;': '\u03b4',
457 'demptyv;': '\u29b1',
458 'dfisht;': '\u297f',
459 'Dfr;': '\U0001d507',
460 'dfr;': '\U0001d521',
461 'dHar;': '\u2965',
462 'dharl;': '\u21c3',
463 'dharr;': '\u21c2',
464 'DiacriticalAcute;': '\xb4',
465 'DiacriticalDot;': '\u02d9',
466 'DiacriticalDoubleAcute;': '\u02dd',
467 'DiacriticalGrave;': '`',
468 'DiacriticalTilde;': '\u02dc',
469 'diam;': '\u22c4',
470 'Diamond;': '\u22c4',
471 'diamond;': '\u22c4',
472 'diamondsuit;': '\u2666',
473 'diams;': '\u2666',
474 'die;': '\xa8',
475 'DifferentialD;': '\u2146',
476 'digamma;': '\u03dd',
477 'disin;': '\u22f2',
478 'div;': '\xf7',
479 'divide': '\xf7',
480 'divide;': '\xf7',
481 'divideontimes;': '\u22c7',
482 'divonx;': '\u22c7',
483 'DJcy;': '\u0402',
484 'djcy;': '\u0452',
485 'dlcorn;': '\u231e',
486 'dlcrop;': '\u230d',
487 'dollar;': '$',
488 'Dopf;': '\U0001d53b',
489 'dopf;': '\U0001d555',
490 'Dot;': '\xa8',
491 'dot;': '\u02d9',
492 'DotDot;': '\u20dc',
493 'doteq;': '\u2250',
494 'doteqdot;': '\u2251',
495 'DotEqual;': '\u2250',
496 'dotminus;': '\u2238',
497 'dotplus;': '\u2214',
498 'dotsquare;': '\u22a1',
499 'doublebarwedge;': '\u2306',
500 'DoubleContourIntegral;': '\u222f',
501 'DoubleDot;': '\xa8',
502 'DoubleDownArrow;': '\u21d3',
503 'DoubleLeftArrow;': '\u21d0',
504 'DoubleLeftRightArrow;': '\u21d4',
505 'DoubleLeftTee;': '\u2ae4',
506 'DoubleLongLeftArrow;': '\u27f8',
507 'DoubleLongLeftRightArrow;': '\u27fa',
508 'DoubleLongRightArrow;': '\u27f9',
509 'DoubleRightArrow;': '\u21d2',
510 'DoubleRightTee;': '\u22a8',
511 'DoubleUpArrow;': '\u21d1',
512 'DoubleUpDownArrow;': '\u21d5',
513 'DoubleVerticalBar;': '\u2225',
514 'DownArrow;': '\u2193',
515 'Downarrow;': '\u21d3',
516 'downarrow;': '\u2193',
517 'DownArrowBar;': '\u2913',
518 'DownArrowUpArrow;': '\u21f5',
519 'DownBreve;': '\u0311',
520 'downdownarrows;': '\u21ca',
521 'downharpoonleft;': '\u21c3',
522 'downharpoonright;': '\u21c2',
523 'DownLeftRightVector;': '\u2950',
524 'DownLeftTeeVector;': '\u295e',
525 'DownLeftVector;': '\u21bd',
526 'DownLeftVectorBar;': '\u2956',
527 'DownRightTeeVector;': '\u295f',
528 'DownRightVector;': '\u21c1',
529 'DownRightVectorBar;': '\u2957',
530 'DownTee;': '\u22a4',
531 'DownTeeArrow;': '\u21a7',
532 'drbkarow;': '\u2910',
533 'drcorn;': '\u231f',
534 'drcrop;': '\u230c',
535 'Dscr;': '\U0001d49f',
536 'dscr;': '\U0001d4b9',
537 'DScy;': '\u0405',
538 'dscy;': '\u0455',
539 'dsol;': '\u29f6',
540 'Dstrok;': '\u0110',
541 'dstrok;': '\u0111',
542 'dtdot;': '\u22f1',
543 'dtri;': '\u25bf',
544 'dtrif;': '\u25be',
545 'duarr;': '\u21f5',
546 'duhar;': '\u296f',
547 'dwangle;': '\u29a6',
548 'DZcy;': '\u040f',
549 'dzcy;': '\u045f',
550 'dzigrarr;': '\u27ff',
551 'Eacute': '\xc9',
552 'eacute': '\xe9',
553 'Eacute;': '\xc9',
554 'eacute;': '\xe9',
555 'easter;': '\u2a6e',
556 'Ecaron;': '\u011a',
557 'ecaron;': '\u011b',
558 'ecir;': '\u2256',
559 'Ecirc': '\xca',
560 'ecirc': '\xea',
561 'Ecirc;': '\xca',
562 'ecirc;': '\xea',
563 'ecolon;': '\u2255',
564 'Ecy;': '\u042d',
565 'ecy;': '\u044d',
566 'eDDot;': '\u2a77',
567 'Edot;': '\u0116',
568 'eDot;': '\u2251',
569 'edot;': '\u0117',
570 'ee;': '\u2147',
571 'efDot;': '\u2252',
572 'Efr;': '\U0001d508',
573 'efr;': '\U0001d522',
574 'eg;': '\u2a9a',
575 'Egrave': '\xc8',
576 'egrave': '\xe8',
577 'Egrave;': '\xc8',
578 'egrave;': '\xe8',
579 'egs;': '\u2a96',
580 'egsdot;': '\u2a98',
581 'el;': '\u2a99',
582 'Element;': '\u2208',
583 'elinters;': '\u23e7',
584 'ell;': '\u2113',
585 'els;': '\u2a95',
586 'elsdot;': '\u2a97',
587 'Emacr;': '\u0112',
588 'emacr;': '\u0113',
589 'empty;': '\u2205',
590 'emptyset;': '\u2205',
591 'EmptySmallSquare;': '\u25fb',
592 'emptyv;': '\u2205',
593 'EmptyVerySmallSquare;': '\u25ab',
594 'emsp13;': '\u2004',
595 'emsp14;': '\u2005',
596 'emsp;': '\u2003',
597 'ENG;': '\u014a',
598 'eng;': '\u014b',
599 'ensp;': '\u2002',
600 'Eogon;': '\u0118',
601 'eogon;': '\u0119',
602 'Eopf;': '\U0001d53c',
603 'eopf;': '\U0001d556',
604 'epar;': '\u22d5',
605 'eparsl;': '\u29e3',
606 'eplus;': '\u2a71',
607 'epsi;': '\u03b5',
608 'Epsilon;': '\u0395',
609 'epsilon;': '\u03b5',
610 'epsiv;': '\u03f5',
611 'eqcirc;': '\u2256',
612 'eqcolon;': '\u2255',
613 'eqsim;': '\u2242',
614 'eqslantgtr;': '\u2a96',
615 'eqslantless;': '\u2a95',
616 'Equal;': '\u2a75',
617 'equals;': '=',
618 'EqualTilde;': '\u2242',
619 'equest;': '\u225f',
620 'Equilibrium;': '\u21cc',
621 'equiv;': '\u2261',
622 'equivDD;': '\u2a78',
623 'eqvparsl;': '\u29e5',
624 'erarr;': '\u2971',
625 'erDot;': '\u2253',
626 'Escr;': '\u2130',
627 'escr;': '\u212f',
628 'esdot;': '\u2250',
629 'Esim;': '\u2a73',
630 'esim;': '\u2242',
631 'Eta;': '\u0397',
632 'eta;': '\u03b7',
633 'ETH': '\xd0',
634 'eth': '\xf0',
635 'ETH;': '\xd0',
636 'eth;': '\xf0',
637 'Euml': '\xcb',
638 'euml': '\xeb',
639 'Euml;': '\xcb',
640 'euml;': '\xeb',
641 'euro;': '\u20ac',
642 'excl;': '!',
643 'exist;': '\u2203',
644 'Exists;': '\u2203',
645 'expectation;': '\u2130',
646 'ExponentialE;': '\u2147',
647 'exponentiale;': '\u2147',
648 'fallingdotseq;': '\u2252',
649 'Fcy;': '\u0424',
650 'fcy;': '\u0444',
651 'female;': '\u2640',
652 'ffilig;': '\ufb03',
653 'fflig;': '\ufb00',
654 'ffllig;': '\ufb04',
655 'Ffr;': '\U0001d509',
656 'ffr;': '\U0001d523',
657 'filig;': '\ufb01',
658 'FilledSmallSquare;': '\u25fc',
659 'FilledVerySmallSquare;': '\u25aa',
660 'fjlig;': 'fj',
661 'flat;': '\u266d',
662 'fllig;': '\ufb02',
663 'fltns;': '\u25b1',
664 'fnof;': '\u0192',
665 'Fopf;': '\U0001d53d',
666 'fopf;': '\U0001d557',
667 'ForAll;': '\u2200',
668 'forall;': '\u2200',
669 'fork;': '\u22d4',
670 'forkv;': '\u2ad9',
671 'Fouriertrf;': '\u2131',
672 'fpartint;': '\u2a0d',
673 'frac12': '\xbd',
674 'frac12;': '\xbd',
675 'frac13;': '\u2153',
676 'frac14': '\xbc',
677 'frac14;': '\xbc',
678 'frac15;': '\u2155',
679 'frac16;': '\u2159',
680 'frac18;': '\u215b',
681 'frac23;': '\u2154',
682 'frac25;': '\u2156',
683 'frac34': '\xbe',
684 'frac34;': '\xbe',
685 'frac35;': '\u2157',
686 'frac38;': '\u215c',
687 'frac45;': '\u2158',
688 'frac56;': '\u215a',
689 'frac58;': '\u215d',
690 'frac78;': '\u215e',
691 'frasl;': '\u2044',
692 'frown;': '\u2322',
693 'Fscr;': '\u2131',
694 'fscr;': '\U0001d4bb',
695 'gacute;': '\u01f5',
696 'Gamma;': '\u0393',
697 'gamma;': '\u03b3',
698 'Gammad;': '\u03dc',
699 'gammad;': '\u03dd',
700 'gap;': '\u2a86',
701 'Gbreve;': '\u011e',
702 'gbreve;': '\u011f',
703 'Gcedil;': '\u0122',
704 'Gcirc;': '\u011c',
705 'gcirc;': '\u011d',
706 'Gcy;': '\u0413',
707 'gcy;': '\u0433',
708 'Gdot;': '\u0120',
709 'gdot;': '\u0121',
710 'gE;': '\u2267',
711 'ge;': '\u2265',
712 'gEl;': '\u2a8c',
713 'gel;': '\u22db',
714 'geq;': '\u2265',
715 'geqq;': '\u2267',
716 'geqslant;': '\u2a7e',
717 'ges;': '\u2a7e',
718 'gescc;': '\u2aa9',
719 'gesdot;': '\u2a80',
720 'gesdoto;': '\u2a82',
721 'gesdotol;': '\u2a84',
722 'gesl;': '\u22db\ufe00',
723 'gesles;': '\u2a94',
724 'Gfr;': '\U0001d50a',
725 'gfr;': '\U0001d524',
726 'Gg;': '\u22d9',
727 'gg;': '\u226b',
728 'ggg;': '\u22d9',
729 'gimel;': '\u2137',
730 'GJcy;': '\u0403',
731 'gjcy;': '\u0453',
732 'gl;': '\u2277',
733 'gla;': '\u2aa5',
734 'glE;': '\u2a92',
735 'glj;': '\u2aa4',
736 'gnap;': '\u2a8a',
737 'gnapprox;': '\u2a8a',
738 'gnE;': '\u2269',
739 'gne;': '\u2a88',
740 'gneq;': '\u2a88',
741 'gneqq;': '\u2269',
742 'gnsim;': '\u22e7',
743 'Gopf;': '\U0001d53e',
744 'gopf;': '\U0001d558',
745 'grave;': '`',
746 'GreaterEqual;': '\u2265',
747 'GreaterEqualLess;': '\u22db',
748 'GreaterFullEqual;': '\u2267',
749 'GreaterGreater;': '\u2aa2',
750 'GreaterLess;': '\u2277',
751 'GreaterSlantEqual;': '\u2a7e',
752 'GreaterTilde;': '\u2273',
753 'Gscr;': '\U0001d4a2',
754 'gscr;': '\u210a',
755 'gsim;': '\u2273',
756 'gsime;': '\u2a8e',
757 'gsiml;': '\u2a90',
758 'GT': '>',
759 'gt': '>',
760 'GT;': '>',
761 'Gt;': '\u226b',
762 'gt;': '>',
763 'gtcc;': '\u2aa7',
764 'gtcir;': '\u2a7a',
765 'gtdot;': '\u22d7',
766 'gtlPar;': '\u2995',
767 'gtquest;': '\u2a7c',
768 'gtrapprox;': '\u2a86',
769 'gtrarr;': '\u2978',
770 'gtrdot;': '\u22d7',
771 'gtreqless;': '\u22db',
772 'gtreqqless;': '\u2a8c',
773 'gtrless;': '\u2277',
774 'gtrsim;': '\u2273',
775 'gvertneqq;': '\u2269\ufe00',
776 'gvnE;': '\u2269\ufe00',
777 'Hacek;': '\u02c7',
778 'hairsp;': '\u200a',
779 'half;': '\xbd',
780 'hamilt;': '\u210b',
781 'HARDcy;': '\u042a',
782 'hardcy;': '\u044a',
783 'hArr;': '\u21d4',
784 'harr;': '\u2194',
785 'harrcir;': '\u2948',
786 'harrw;': '\u21ad',
787 'Hat;': '^',
788 'hbar;': '\u210f',
789 'Hcirc;': '\u0124',
790 'hcirc;': '\u0125',
791 'hearts;': '\u2665',
792 'heartsuit;': '\u2665',
793 'hellip;': '\u2026',
794 'hercon;': '\u22b9',
795 'Hfr;': '\u210c',
796 'hfr;': '\U0001d525',
797 'HilbertSpace;': '\u210b',
798 'hksearow;': '\u2925',
799 'hkswarow;': '\u2926',
800 'hoarr;': '\u21ff',
801 'homtht;': '\u223b',
802 'hookleftarrow;': '\u21a9',
803 'hookrightarrow;': '\u21aa',
804 'Hopf;': '\u210d',
805 'hopf;': '\U0001d559',
806 'horbar;': '\u2015',
807 'HorizontalLine;': '\u2500',
808 'Hscr;': '\u210b',
809 'hscr;': '\U0001d4bd',
810 'hslash;': '\u210f',
811 'Hstrok;': '\u0126',
812 'hstrok;': '\u0127',
813 'HumpDownHump;': '\u224e',
814 'HumpEqual;': '\u224f',
815 'hybull;': '\u2043',
816 'hyphen;': '\u2010',
817 'Iacute': '\xcd',
818 'iacute': '\xed',
819 'Iacute;': '\xcd',
820 'iacute;': '\xed',
821 'ic;': '\u2063',
822 'Icirc': '\xce',
823 'icirc': '\xee',
824 'Icirc;': '\xce',
825 'icirc;': '\xee',
826 'Icy;': '\u0418',
827 'icy;': '\u0438',
828 'Idot;': '\u0130',
829 'IEcy;': '\u0415',
830 'iecy;': '\u0435',
831 'iexcl': '\xa1',
832 'iexcl;': '\xa1',
833 'iff;': '\u21d4',
834 'Ifr;': '\u2111',
835 'ifr;': '\U0001d526',
836 'Igrave': '\xcc',
837 'igrave': '\xec',
838 'Igrave;': '\xcc',
839 'igrave;': '\xec',
840 'ii;': '\u2148',
841 'iiiint;': '\u2a0c',
842 'iiint;': '\u222d',
843 'iinfin;': '\u29dc',
844 'iiota;': '\u2129',
845 'IJlig;': '\u0132',
846 'ijlig;': '\u0133',
847 'Im;': '\u2111',
848 'Imacr;': '\u012a',
849 'imacr;': '\u012b',
850 'image;': '\u2111',
851 'ImaginaryI;': '\u2148',
852 'imagline;': '\u2110',
853 'imagpart;': '\u2111',
854 'imath;': '\u0131',
855 'imof;': '\u22b7',
856 'imped;': '\u01b5',
857 'Implies;': '\u21d2',
858 'in;': '\u2208',
859 'incare;': '\u2105',
860 'infin;': '\u221e',
861 'infintie;': '\u29dd',
862 'inodot;': '\u0131',
863 'Int;': '\u222c',
864 'int;': '\u222b',
865 'intcal;': '\u22ba',
866 'integers;': '\u2124',
867 'Integral;': '\u222b',
868 'intercal;': '\u22ba',
869 'Intersection;': '\u22c2',
870 'intlarhk;': '\u2a17',
871 'intprod;': '\u2a3c',
872 'InvisibleComma;': '\u2063',
873 'InvisibleTimes;': '\u2062',
874 'IOcy;': '\u0401',
875 'iocy;': '\u0451',
876 'Iogon;': '\u012e',
877 'iogon;': '\u012f',
878 'Iopf;': '\U0001d540',
879 'iopf;': '\U0001d55a',
880 'Iota;': '\u0399',
881 'iota;': '\u03b9',
882 'iprod;': '\u2a3c',
883 'iquest': '\xbf',
884 'iquest;': '\xbf',
885 'Iscr;': '\u2110',
886 'iscr;': '\U0001d4be',
887 'isin;': '\u2208',
888 'isindot;': '\u22f5',
889 'isinE;': '\u22f9',
890 'isins;': '\u22f4',
891 'isinsv;': '\u22f3',
892 'isinv;': '\u2208',
893 'it;': '\u2062',
894 'Itilde;': '\u0128',
895 'itilde;': '\u0129',
896 'Iukcy;': '\u0406',
897 'iukcy;': '\u0456',
898 'Iuml': '\xcf',
899 'iuml': '\xef',
900 'Iuml;': '\xcf',
901 'iuml;': '\xef',
902 'Jcirc;': '\u0134',
903 'jcirc;': '\u0135',
904 'Jcy;': '\u0419',
905 'jcy;': '\u0439',
906 'Jfr;': '\U0001d50d',
907 'jfr;': '\U0001d527',
908 'jmath;': '\u0237',
909 'Jopf;': '\U0001d541',
910 'jopf;': '\U0001d55b',
911 'Jscr;': '\U0001d4a5',
912 'jscr;': '\U0001d4bf',
913 'Jsercy;': '\u0408',
914 'jsercy;': '\u0458',
915 'Jukcy;': '\u0404',
916 'jukcy;': '\u0454',
917 'Kappa;': '\u039a',
918 'kappa;': '\u03ba',
919 'kappav;': '\u03f0',
920 'Kcedil;': '\u0136',
921 'kcedil;': '\u0137',
922 'Kcy;': '\u041a',
923 'kcy;': '\u043a',
924 'Kfr;': '\U0001d50e',
925 'kfr;': '\U0001d528',
926 'kgreen;': '\u0138',
927 'KHcy;': '\u0425',
928 'khcy;': '\u0445',
929 'KJcy;': '\u040c',
930 'kjcy;': '\u045c',
931 'Kopf;': '\U0001d542',
932 'kopf;': '\U0001d55c',
933 'Kscr;': '\U0001d4a6',
934 'kscr;': '\U0001d4c0',
935 'lAarr;': '\u21da',
936 'Lacute;': '\u0139',
937 'lacute;': '\u013a',
938 'laemptyv;': '\u29b4',
939 'lagran;': '\u2112',
940 'Lambda;': '\u039b',
941 'lambda;': '\u03bb',
942 'Lang;': '\u27ea',
943 'lang;': '\u27e8',
944 'langd;': '\u2991',
945 'langle;': '\u27e8',
946 'lap;': '\u2a85',
947 'Laplacetrf;': '\u2112',
948 'laquo': '\xab',
949 'laquo;': '\xab',
950 'Larr;': '\u219e',
951 'lArr;': '\u21d0',
952 'larr;': '\u2190',
953 'larrb;': '\u21e4',
954 'larrbfs;': '\u291f',
955 'larrfs;': '\u291d',
956 'larrhk;': '\u21a9',
957 'larrlp;': '\u21ab',
958 'larrpl;': '\u2939',
959 'larrsim;': '\u2973',
960 'larrtl;': '\u21a2',
961 'lat;': '\u2aab',
962 'lAtail;': '\u291b',
963 'latail;': '\u2919',
964 'late;': '\u2aad',
965 'lates;': '\u2aad\ufe00',
966 'lBarr;': '\u290e',
967 'lbarr;': '\u290c',
968 'lbbrk;': '\u2772',
969 'lbrace;': '{',
970 'lbrack;': '[',
971 'lbrke;': '\u298b',
972 'lbrksld;': '\u298f',
973 'lbrkslu;': '\u298d',
974 'Lcaron;': '\u013d',
975 'lcaron;': '\u013e',
976 'Lcedil;': '\u013b',
977 'lcedil;': '\u013c',
978 'lceil;': '\u2308',
979 'lcub;': '{',
980 'Lcy;': '\u041b',
981 'lcy;': '\u043b',
982 'ldca;': '\u2936',
983 'ldquo;': '\u201c',
984 'ldquor;': '\u201e',
985 'ldrdhar;': '\u2967',
986 'ldrushar;': '\u294b',
987 'ldsh;': '\u21b2',
988 'lE;': '\u2266',
989 'le;': '\u2264',
990 'LeftAngleBracket;': '\u27e8',
991 'LeftArrow;': '\u2190',
992 'Leftarrow;': '\u21d0',
993 'leftarrow;': '\u2190',
994 'LeftArrowBar;': '\u21e4',
995 'LeftArrowRightArrow;': '\u21c6',
996 'leftarrowtail;': '\u21a2',
997 'LeftCeiling;': '\u2308',
998 'LeftDoubleBracket;': '\u27e6',
999 'LeftDownTeeVector;': '\u2961',
1000 'LeftDownVector;': '\u21c3',
1001 'LeftDownVectorBar;': '\u2959',
1002 'LeftFloor;': '\u230a',
1003 'leftharpoondown;': '\u21bd',
1004 'leftharpoonup;': '\u21bc',
1005 'leftleftarrows;': '\u21c7',
1006 'LeftRightArrow;': '\u2194',
1007 'Leftrightarrow;': '\u21d4',
1008 'leftrightarrow;': '\u2194',
1009 'leftrightarrows;': '\u21c6',
1010 'leftrightharpoons;': '\u21cb',
1011 'leftrightsquigarrow;': '\u21ad',
1012 'LeftRightVector;': '\u294e',
1013 'LeftTee;': '\u22a3',
1014 'LeftTeeArrow;': '\u21a4',
1015 'LeftTeeVector;': '\u295a',
1016 'leftthreetimes;': '\u22cb',
1017 'LeftTriangle;': '\u22b2',
1018 'LeftTriangleBar;': '\u29cf',
1019 'LeftTriangleEqual;': '\u22b4',
1020 'LeftUpDownVector;': '\u2951',
1021 'LeftUpTeeVector;': '\u2960',
1022 'LeftUpVector;': '\u21bf',
1023 'LeftUpVectorBar;': '\u2958',
1024 'LeftVector;': '\u21bc',
1025 'LeftVectorBar;': '\u2952',
1026 'lEg;': '\u2a8b',
1027 'leg;': '\u22da',
1028 'leq;': '\u2264',
1029 'leqq;': '\u2266',
1030 'leqslant;': '\u2a7d',
1031 'les;': '\u2a7d',
1032 'lescc;': '\u2aa8',
1033 'lesdot;': '\u2a7f',
1034 'lesdoto;': '\u2a81',
1035 'lesdotor;': '\u2a83',
1036 'lesg;': '\u22da\ufe00',
1037 'lesges;': '\u2a93',
1038 'lessapprox;': '\u2a85',
1039 'lessdot;': '\u22d6',
1040 'lesseqgtr;': '\u22da',
1041 'lesseqqgtr;': '\u2a8b',
1042 'LessEqualGreater;': '\u22da',
1043 'LessFullEqual;': '\u2266',
1044 'LessGreater;': '\u2276',
1045 'lessgtr;': '\u2276',
1046 'LessLess;': '\u2aa1',
1047 'lesssim;': '\u2272',
1048 'LessSlantEqual;': '\u2a7d',
1049 'LessTilde;': '\u2272',
1050 'lfisht;': '\u297c',
1051 'lfloor;': '\u230a',
1052 'Lfr;': '\U0001d50f',
1053 'lfr;': '\U0001d529',
1054 'lg;': '\u2276',
1055 'lgE;': '\u2a91',
1056 'lHar;': '\u2962',
1057 'lhard;': '\u21bd',
1058 'lharu;': '\u21bc',
1059 'lharul;': '\u296a',
1060 'lhblk;': '\u2584',
1061 'LJcy;': '\u0409',
1062 'ljcy;': '\u0459',
1063 'Ll;': '\u22d8',
1064 'll;': '\u226a',
1065 'llarr;': '\u21c7',
1066 'llcorner;': '\u231e',
1067 'Lleftarrow;': '\u21da',
1068 'llhard;': '\u296b',
1069 'lltri;': '\u25fa',
1070 'Lmidot;': '\u013f',
1071 'lmidot;': '\u0140',
1072 'lmoust;': '\u23b0',
1073 'lmoustache;': '\u23b0',
1074 'lnap;': '\u2a89',
1075 'lnapprox;': '\u2a89',
1076 'lnE;': '\u2268',
1077 'lne;': '\u2a87',
1078 'lneq;': '\u2a87',
1079 'lneqq;': '\u2268',
1080 'lnsim;': '\u22e6',
1081 'loang;': '\u27ec',
1082 'loarr;': '\u21fd',
1083 'lobrk;': '\u27e6',
1084 'LongLeftArrow;': '\u27f5',
1085 'Longleftarrow;': '\u27f8',
1086 'longleftarrow;': '\u27f5',
1087 'LongLeftRightArrow;': '\u27f7',
1088 'Longleftrightarrow;': '\u27fa',
1089 'longleftrightarrow;': '\u27f7',
1090 'longmapsto;': '\u27fc',
1091 'LongRightArrow;': '\u27f6',
1092 'Longrightarrow;': '\u27f9',
1093 'longrightarrow;': '\u27f6',
1094 'looparrowleft;': '\u21ab',
1095 'looparrowright;': '\u21ac',
1096 'lopar;': '\u2985',
1097 'Lopf;': '\U0001d543',
1098 'lopf;': '\U0001d55d',
1099 'loplus;': '\u2a2d',
1100 'lotimes;': '\u2a34',
1101 'lowast;': '\u2217',
1102 'lowbar;': '_',
1103 'LowerLeftArrow;': '\u2199',
1104 'LowerRightArrow;': '\u2198',
1105 'loz;': '\u25ca',
1106 'lozenge;': '\u25ca',
1107 'lozf;': '\u29eb',
1108 'lpar;': '(',
1109 'lparlt;': '\u2993',
1110 'lrarr;': '\u21c6',
1111 'lrcorner;': '\u231f',
1112 'lrhar;': '\u21cb',
1113 'lrhard;': '\u296d',
1114 'lrm;': '\u200e',
1115 'lrtri;': '\u22bf',
1116 'lsaquo;': '\u2039',
1117 'Lscr;': '\u2112',
1118 'lscr;': '\U0001d4c1',
1119 'Lsh;': '\u21b0',
1120 'lsh;': '\u21b0',
1121 'lsim;': '\u2272',
1122 'lsime;': '\u2a8d',
1123 'lsimg;': '\u2a8f',
1124 'lsqb;': '[',
1125 'lsquo;': '\u2018',
1126 'lsquor;': '\u201a',
1127 'Lstrok;': '\u0141',
1128 'lstrok;': '\u0142',
1129 'LT': '<',
1130 'lt': '<',
1131 'LT;': '<',
1132 'Lt;': '\u226a',
1133 'lt;': '<',
1134 'ltcc;': '\u2aa6',
1135 'ltcir;': '\u2a79',
1136 'ltdot;': '\u22d6',
1137 'lthree;': '\u22cb',
1138 'ltimes;': '\u22c9',
1139 'ltlarr;': '\u2976',
1140 'ltquest;': '\u2a7b',
1141 'ltri;': '\u25c3',
1142 'ltrie;': '\u22b4',
1143 'ltrif;': '\u25c2',
1144 'ltrPar;': '\u2996',
1145 'lurdshar;': '\u294a',
1146 'luruhar;': '\u2966',
1147 'lvertneqq;': '\u2268\ufe00',
1148 'lvnE;': '\u2268\ufe00',
1149 'macr': '\xaf',
1150 'macr;': '\xaf',
1151 'male;': '\u2642',
1152 'malt;': '\u2720',
1153 'maltese;': '\u2720',
1154 'Map;': '\u2905',
1155 'map;': '\u21a6',
1156 'mapsto;': '\u21a6',
1157 'mapstodown;': '\u21a7',
1158 'mapstoleft;': '\u21a4',
1159 'mapstoup;': '\u21a5',
1160 'marker;': '\u25ae',
1161 'mcomma;': '\u2a29',
1162 'Mcy;': '\u041c',
1163 'mcy;': '\u043c',
1164 'mdash;': '\u2014',
1165 'mDDot;': '\u223a',
1166 'measuredangle;': '\u2221',
1167 'MediumSpace;': '\u205f',
1168 'Mellintrf;': '\u2133',
1169 'Mfr;': '\U0001d510',
1170 'mfr;': '\U0001d52a',
1171 'mho;': '\u2127',
1172 'micro': '\xb5',
1173 'micro;': '\xb5',
1174 'mid;': '\u2223',
1175 'midast;': '*',
1176 'midcir;': '\u2af0',
1177 'middot': '\xb7',
1178 'middot;': '\xb7',
1179 'minus;': '\u2212',
1180 'minusb;': '\u229f',
1181 'minusd;': '\u2238',
1182 'minusdu;': '\u2a2a',
1183 'MinusPlus;': '\u2213',
1184 'mlcp;': '\u2adb',
1185 'mldr;': '\u2026',
1186 'mnplus;': '\u2213',
1187 'models;': '\u22a7',
1188 'Mopf;': '\U0001d544',
1189 'mopf;': '\U0001d55e',
1190 'mp;': '\u2213',
1191 'Mscr;': '\u2133',
1192 'mscr;': '\U0001d4c2',
1193 'mstpos;': '\u223e',
1194 'Mu;': '\u039c',
1195 'mu;': '\u03bc',
1196 'multimap;': '\u22b8',
1197 'mumap;': '\u22b8',
1198 'nabla;': '\u2207',
1199 'Nacute;': '\u0143',
1200 'nacute;': '\u0144',
1201 'nang;': '\u2220\u20d2',
1202 'nap;': '\u2249',
1203 'napE;': '\u2a70\u0338',
1204 'napid;': '\u224b\u0338',
1205 'napos;': '\u0149',
1206 'napprox;': '\u2249',
1207 'natur;': '\u266e',
1208 'natural;': '\u266e',
1209 'naturals;': '\u2115',
1210 'nbsp': '\xa0',
1211 'nbsp;': '\xa0',
1212 'nbump;': '\u224e\u0338',
1213 'nbumpe;': '\u224f\u0338',
1214 'ncap;': '\u2a43',
1215 'Ncaron;': '\u0147',
1216 'ncaron;': '\u0148',
1217 'Ncedil;': '\u0145',
1218 'ncedil;': '\u0146',
1219 'ncong;': '\u2247',
1220 'ncongdot;': '\u2a6d\u0338',
1221 'ncup;': '\u2a42',
1222 'Ncy;': '\u041d',
1223 'ncy;': '\u043d',
1224 'ndash;': '\u2013',
1225 'ne;': '\u2260',
1226 'nearhk;': '\u2924',
1227 'neArr;': '\u21d7',
1228 'nearr;': '\u2197',
1229 'nearrow;': '\u2197',
1230 'nedot;': '\u2250\u0338',
1231 'NegativeMediumSpace;': '\u200b',
1232 'NegativeThickSpace;': '\u200b',
1233 'NegativeThinSpace;': '\u200b',
1234 'NegativeVeryThinSpace;': '\u200b',
1235 'nequiv;': '\u2262',
1236 'nesear;': '\u2928',
1237 'nesim;': '\u2242\u0338',
1238 'NestedGreaterGreater;': '\u226b',
1239 'NestedLessLess;': '\u226a',
1240 'NewLine;': '\n',
1241 'nexist;': '\u2204',
1242 'nexists;': '\u2204',
1243 'Nfr;': '\U0001d511',
1244 'nfr;': '\U0001d52b',
1245 'ngE;': '\u2267\u0338',
1246 'nge;': '\u2271',
1247 'ngeq;': '\u2271',
1248 'ngeqq;': '\u2267\u0338',
1249 'ngeqslant;': '\u2a7e\u0338',
1250 'nges;': '\u2a7e\u0338',
1251 'nGg;': '\u22d9\u0338',
1252 'ngsim;': '\u2275',
1253 'nGt;': '\u226b\u20d2',
1254 'ngt;': '\u226f',
1255 'ngtr;': '\u226f',
1256 'nGtv;': '\u226b\u0338',
1257 'nhArr;': '\u21ce',
1258 'nharr;': '\u21ae',
1259 'nhpar;': '\u2af2',
1260 'ni;': '\u220b',
1261 'nis;': '\u22fc',
1262 'nisd;': '\u22fa',
1263 'niv;': '\u220b',
1264 'NJcy;': '\u040a',
1265 'njcy;': '\u045a',
1266 'nlArr;': '\u21cd',
1267 'nlarr;': '\u219a',
1268 'nldr;': '\u2025',
1269 'nlE;': '\u2266\u0338',
1270 'nle;': '\u2270',
1271 'nLeftarrow;': '\u21cd',
1272 'nleftarrow;': '\u219a',
1273 'nLeftrightarrow;': '\u21ce',
1274 'nleftrightarrow;': '\u21ae',
1275 'nleq;': '\u2270',
1276 'nleqq;': '\u2266\u0338',
1277 'nleqslant;': '\u2a7d\u0338',
1278 'nles;': '\u2a7d\u0338',
1279 'nless;': '\u226e',
1280 'nLl;': '\u22d8\u0338',
1281 'nlsim;': '\u2274',
1282 'nLt;': '\u226a\u20d2',
1283 'nlt;': '\u226e',
1284 'nltri;': '\u22ea',
1285 'nltrie;': '\u22ec',
1286 'nLtv;': '\u226a\u0338',
1287 'nmid;': '\u2224',
1288 'NoBreak;': '\u2060',
1289 'NonBreakingSpace;': '\xa0',
1290 'Nopf;': '\u2115',
1291 'nopf;': '\U0001d55f',
1292 'not': '\xac',
1293 'Not;': '\u2aec',
1294 'not;': '\xac',
1295 'NotCongruent;': '\u2262',
1296 'NotCupCap;': '\u226d',
1297 'NotDoubleVerticalBar;': '\u2226',
1298 'NotElement;': '\u2209',
1299 'NotEqual;': '\u2260',
1300 'NotEqualTilde;': '\u2242\u0338',
1301 'NotExists;': '\u2204',
1302 'NotGreater;': '\u226f',
1303 'NotGreaterEqual;': '\u2271',
1304 'NotGreaterFullEqual;': '\u2267\u0338',
1305 'NotGreaterGreater;': '\u226b\u0338',
1306 'NotGreaterLess;': '\u2279',
1307 'NotGreaterSlantEqual;': '\u2a7e\u0338',
1308 'NotGreaterTilde;': '\u2275',
1309 'NotHumpDownHump;': '\u224e\u0338',
1310 'NotHumpEqual;': '\u224f\u0338',
1311 'notin;': '\u2209',
1312 'notindot;': '\u22f5\u0338',
1313 'notinE;': '\u22f9\u0338',
1314 'notinva;': '\u2209',
1315 'notinvb;': '\u22f7',
1316 'notinvc;': '\u22f6',
1317 'NotLeftTriangle;': '\u22ea',
1318 'NotLeftTriangleBar;': '\u29cf\u0338',
1319 'NotLeftTriangleEqual;': '\u22ec',
1320 'NotLess;': '\u226e',
1321 'NotLessEqual;': '\u2270',
1322 'NotLessGreater;': '\u2278',
1323 'NotLessLess;': '\u226a\u0338',
1324 'NotLessSlantEqual;': '\u2a7d\u0338',
1325 'NotLessTilde;': '\u2274',
1326 'NotNestedGreaterGreater;': '\u2aa2\u0338',
1327 'NotNestedLessLess;': '\u2aa1\u0338',
1328 'notni;': '\u220c',
1329 'notniva;': '\u220c',
1330 'notnivb;': '\u22fe',
1331 'notnivc;': '\u22fd',
1332 'NotPrecedes;': '\u2280',
1333 'NotPrecedesEqual;': '\u2aaf\u0338',
1334 'NotPrecedesSlantEqual;': '\u22e0',
1335 'NotReverseElement;': '\u220c',
1336 'NotRightTriangle;': '\u22eb',
1337 'NotRightTriangleBar;': '\u29d0\u0338',
1338 'NotRightTriangleEqual;': '\u22ed',
1339 'NotSquareSubset;': '\u228f\u0338',
1340 'NotSquareSubsetEqual;': '\u22e2',
1341 'NotSquareSuperset;': '\u2290\u0338',
1342 'NotSquareSupersetEqual;': '\u22e3',
1343 'NotSubset;': '\u2282\u20d2',
1344 'NotSubsetEqual;': '\u2288',
1345 'NotSucceeds;': '\u2281',
1346 'NotSucceedsEqual;': '\u2ab0\u0338',
1347 'NotSucceedsSlantEqual;': '\u22e1',
1348 'NotSucceedsTilde;': '\u227f\u0338',
1349 'NotSuperset;': '\u2283\u20d2',
1350 'NotSupersetEqual;': '\u2289',
1351 'NotTilde;': '\u2241',
1352 'NotTildeEqual;': '\u2244',
1353 'NotTildeFullEqual;': '\u2247',
1354 'NotTildeTilde;': '\u2249',
1355 'NotVerticalBar;': '\u2224',
1356 'npar;': '\u2226',
1357 'nparallel;': '\u2226',
1358 'nparsl;': '\u2afd\u20e5',
1359 'npart;': '\u2202\u0338',
1360 'npolint;': '\u2a14',
1361 'npr;': '\u2280',
1362 'nprcue;': '\u22e0',
1363 'npre;': '\u2aaf\u0338',
1364 'nprec;': '\u2280',
1365 'npreceq;': '\u2aaf\u0338',
1366 'nrArr;': '\u21cf',
1367 'nrarr;': '\u219b',
1368 'nrarrc;': '\u2933\u0338',
1369 'nrarrw;': '\u219d\u0338',
1370 'nRightarrow;': '\u21cf',
1371 'nrightarrow;': '\u219b',
1372 'nrtri;': '\u22eb',
1373 'nrtrie;': '\u22ed',
1374 'nsc;': '\u2281',
1375 'nsccue;': '\u22e1',
1376 'nsce;': '\u2ab0\u0338',
1377 'Nscr;': '\U0001d4a9',
1378 'nscr;': '\U0001d4c3',
1379 'nshortmid;': '\u2224',
1380 'nshortparallel;': '\u2226',
1381 'nsim;': '\u2241',
1382 'nsime;': '\u2244',
1383 'nsimeq;': '\u2244',
1384 'nsmid;': '\u2224',
1385 'nspar;': '\u2226',
1386 'nsqsube;': '\u22e2',
1387 'nsqsupe;': '\u22e3',
1388 'nsub;': '\u2284',
1389 'nsubE;': '\u2ac5\u0338',
1390 'nsube;': '\u2288',
1391 'nsubset;': '\u2282\u20d2',
1392 'nsubseteq;': '\u2288',
1393 'nsubseteqq;': '\u2ac5\u0338',
1394 'nsucc;': '\u2281',
1395 'nsucceq;': '\u2ab0\u0338',
1396 'nsup;': '\u2285',
1397 'nsupE;': '\u2ac6\u0338',
1398 'nsupe;': '\u2289',
1399 'nsupset;': '\u2283\u20d2',
1400 'nsupseteq;': '\u2289',
1401 'nsupseteqq;': '\u2ac6\u0338',
1402 'ntgl;': '\u2279',
1403 'Ntilde': '\xd1',
1404 'ntilde': '\xf1',
1405 'Ntilde;': '\xd1',
1406 'ntilde;': '\xf1',
1407 'ntlg;': '\u2278',
1408 'ntriangleleft;': '\u22ea',
1409 'ntrianglelefteq;': '\u22ec',
1410 'ntriangleright;': '\u22eb',
1411 'ntrianglerighteq;': '\u22ed',
1412 'Nu;': '\u039d',
1413 'nu;': '\u03bd',
1414 'num;': '#',
1415 'numero;': '\u2116',
1416 'numsp;': '\u2007',
1417 'nvap;': '\u224d\u20d2',
1418 'nVDash;': '\u22af',
1419 'nVdash;': '\u22ae',
1420 'nvDash;': '\u22ad',
1421 'nvdash;': '\u22ac',
1422 'nvge;': '\u2265\u20d2',
1423 'nvgt;': '>\u20d2',
1424 'nvHarr;': '\u2904',
1425 'nvinfin;': '\u29de',
1426 'nvlArr;': '\u2902',
1427 'nvle;': '\u2264\u20d2',
1428 'nvlt;': '<\u20d2',
1429 'nvltrie;': '\u22b4\u20d2',
1430 'nvrArr;': '\u2903',
1431 'nvrtrie;': '\u22b5\u20d2',
1432 'nvsim;': '\u223c\u20d2',
1433 'nwarhk;': '\u2923',
1434 'nwArr;': '\u21d6',
1435 'nwarr;': '\u2196',
1436 'nwarrow;': '\u2196',
1437 'nwnear;': '\u2927',
1438 'Oacute': '\xd3',
1439 'oacute': '\xf3',
1440 'Oacute;': '\xd3',
1441 'oacute;': '\xf3',
1442 'oast;': '\u229b',
1443 'ocir;': '\u229a',
1444 'Ocirc': '\xd4',
1445 'ocirc': '\xf4',
1446 'Ocirc;': '\xd4',
1447 'ocirc;': '\xf4',
1448 'Ocy;': '\u041e',
1449 'ocy;': '\u043e',
1450 'odash;': '\u229d',
1451 'Odblac;': '\u0150',
1452 'odblac;': '\u0151',
1453 'odiv;': '\u2a38',
1454 'odot;': '\u2299',
1455 'odsold;': '\u29bc',
1456 'OElig;': '\u0152',
1457 'oelig;': '\u0153',
1458 'ofcir;': '\u29bf',
1459 'Ofr;': '\U0001d512',
1460 'ofr;': '\U0001d52c',
1461 'ogon;': '\u02db',
1462 'Ograve': '\xd2',
1463 'ograve': '\xf2',
1464 'Ograve;': '\xd2',
1465 'ograve;': '\xf2',
1466 'ogt;': '\u29c1',
1467 'ohbar;': '\u29b5',
1468 'ohm;': '\u03a9',
1469 'oint;': '\u222e',
1470 'olarr;': '\u21ba',
1471 'olcir;': '\u29be',
1472 'olcross;': '\u29bb',
1473 'oline;': '\u203e',
1474 'olt;': '\u29c0',
1475 'Omacr;': '\u014c',
1476 'omacr;': '\u014d',
1477 'Omega;': '\u03a9',
1478 'omega;': '\u03c9',
1479 'Omicron;': '\u039f',
1480 'omicron;': '\u03bf',
1481 'omid;': '\u29b6',
1482 'ominus;': '\u2296',
1483 'Oopf;': '\U0001d546',
1484 'oopf;': '\U0001d560',
1485 'opar;': '\u29b7',
1486 'OpenCurlyDoubleQuote;': '\u201c',
1487 'OpenCurlyQuote;': '\u2018',
1488 'operp;': '\u29b9',
1489 'oplus;': '\u2295',
1490 'Or;': '\u2a54',
1491 'or;': '\u2228',
1492 'orarr;': '\u21bb',
1493 'ord;': '\u2a5d',
1494 'order;': '\u2134',
1495 'orderof;': '\u2134',
1496 'ordf': '\xaa',
1497 'ordf;': '\xaa',
1498 'ordm': '\xba',
1499 'ordm;': '\xba',
1500 'origof;': '\u22b6',
1501 'oror;': '\u2a56',
1502 'orslope;': '\u2a57',
1503 'orv;': '\u2a5b',
1504 'oS;': '\u24c8',
1505 'Oscr;': '\U0001d4aa',
1506 'oscr;': '\u2134',
1507 'Oslash': '\xd8',
1508 'oslash': '\xf8',
1509 'Oslash;': '\xd8',
1510 'oslash;': '\xf8',
1511 'osol;': '\u2298',
1512 'Otilde': '\xd5',
1513 'otilde': '\xf5',
1514 'Otilde;': '\xd5',
1515 'otilde;': '\xf5',
1516 'Otimes;': '\u2a37',
1517 'otimes;': '\u2297',
1518 'otimesas;': '\u2a36',
1519 'Ouml': '\xd6',
1520 'ouml': '\xf6',
1521 'Ouml;': '\xd6',
1522 'ouml;': '\xf6',
1523 'ovbar;': '\u233d',
1524 'OverBar;': '\u203e',
1525 'OverBrace;': '\u23de',
1526 'OverBracket;': '\u23b4',
1527 'OverParenthesis;': '\u23dc',
1528 'par;': '\u2225',
1529 'para': '\xb6',
1530 'para;': '\xb6',
1531 'parallel;': '\u2225',
1532 'parsim;': '\u2af3',
1533 'parsl;': '\u2afd',
1534 'part;': '\u2202',
1535 'PartialD;': '\u2202',
1536 'Pcy;': '\u041f',
1537 'pcy;': '\u043f',
1538 'percnt;': '%',
1539 'period;': '.',
1540 'permil;': '\u2030',
1541 'perp;': '\u22a5',
1542 'pertenk;': '\u2031',
1543 'Pfr;': '\U0001d513',
1544 'pfr;': '\U0001d52d',
1545 'Phi;': '\u03a6',
1546 'phi;': '\u03c6',
1547 'phiv;': '\u03d5',
1548 'phmmat;': '\u2133',
1549 'phone;': '\u260e',
1550 'Pi;': '\u03a0',
1551 'pi;': '\u03c0',
1552 'pitchfork;': '\u22d4',
1553 'piv;': '\u03d6',
1554 'planck;': '\u210f',
1555 'planckh;': '\u210e',
1556 'plankv;': '\u210f',
1557 'plus;': '+',
1558 'plusacir;': '\u2a23',
1559 'plusb;': '\u229e',
1560 'pluscir;': '\u2a22',
1561 'plusdo;': '\u2214',
1562 'plusdu;': '\u2a25',
1563 'pluse;': '\u2a72',
1564 'PlusMinus;': '\xb1',
1565 'plusmn': '\xb1',
1566 'plusmn;': '\xb1',
1567 'plussim;': '\u2a26',
1568 'plustwo;': '\u2a27',
1569 'pm;': '\xb1',
1570 'Poincareplane;': '\u210c',
1571 'pointint;': '\u2a15',
1572 'Popf;': '\u2119',
1573 'popf;': '\U0001d561',
1574 'pound': '\xa3',
1575 'pound;': '\xa3',
1576 'Pr;': '\u2abb',
1577 'pr;': '\u227a',
1578 'prap;': '\u2ab7',
1579 'prcue;': '\u227c',
1580 'prE;': '\u2ab3',
1581 'pre;': '\u2aaf',
1582 'prec;': '\u227a',
1583 'precapprox;': '\u2ab7',
1584 'preccurlyeq;': '\u227c',
1585 'Precedes;': '\u227a',
1586 'PrecedesEqual;': '\u2aaf',
1587 'PrecedesSlantEqual;': '\u227c',
1588 'PrecedesTilde;': '\u227e',
1589 'preceq;': '\u2aaf',
1590 'precnapprox;': '\u2ab9',
1591 'precneqq;': '\u2ab5',
1592 'precnsim;': '\u22e8',
1593 'precsim;': '\u227e',
1594 'Prime;': '\u2033',
1595 'prime;': '\u2032',
1596 'primes;': '\u2119',
1597 'prnap;': '\u2ab9',
1598 'prnE;': '\u2ab5',
1599 'prnsim;': '\u22e8',
1600 'prod;': '\u220f',
1601 'Product;': '\u220f',
1602 'profalar;': '\u232e',
1603 'profline;': '\u2312',
1604 'profsurf;': '\u2313',
1605 'prop;': '\u221d',
1606 'Proportion;': '\u2237',
1607 'Proportional;': '\u221d',
1608 'propto;': '\u221d',
1609 'prsim;': '\u227e',
1610 'prurel;': '\u22b0',
1611 'Pscr;': '\U0001d4ab',
1612 'pscr;': '\U0001d4c5',
1613 'Psi;': '\u03a8',
1614 'psi;': '\u03c8',
1615 'puncsp;': '\u2008',
1616 'Qfr;': '\U0001d514',
1617 'qfr;': '\U0001d52e',
1618 'qint;': '\u2a0c',
1619 'Qopf;': '\u211a',
1620 'qopf;': '\U0001d562',
1621 'qprime;': '\u2057',
1622 'Qscr;': '\U0001d4ac',
1623 'qscr;': '\U0001d4c6',
1624 'quaternions;': '\u210d',
1625 'quatint;': '\u2a16',
1626 'quest;': '?',
1627 'questeq;': '\u225f',
1628 'QUOT': '"',
1629 'quot': '"',
1630 'QUOT;': '"',
1631 'quot;': '"',
1632 'rAarr;': '\u21db',
1633 'race;': '\u223d\u0331',
1634 'Racute;': '\u0154',
1635 'racute;': '\u0155',
1636 'radic;': '\u221a',
1637 'raemptyv;': '\u29b3',
1638 'Rang;': '\u27eb',
1639 'rang;': '\u27e9',
1640 'rangd;': '\u2992',
1641 'range;': '\u29a5',
1642 'rangle;': '\u27e9',
1643 'raquo': '\xbb',
1644 'raquo;': '\xbb',
1645 'Rarr;': '\u21a0',
1646 'rArr;': '\u21d2',
1647 'rarr;': '\u2192',
1648 'rarrap;': '\u2975',
1649 'rarrb;': '\u21e5',
1650 'rarrbfs;': '\u2920',
1651 'rarrc;': '\u2933',
1652 'rarrfs;': '\u291e',
1653 'rarrhk;': '\u21aa',
1654 'rarrlp;': '\u21ac',
1655 'rarrpl;': '\u2945',
1656 'rarrsim;': '\u2974',
1657 'Rarrtl;': '\u2916',
1658 'rarrtl;': '\u21a3',
1659 'rarrw;': '\u219d',
1660 'rAtail;': '\u291c',
1661 'ratail;': '\u291a',
1662 'ratio;': '\u2236',
1663 'rationals;': '\u211a',
1664 'RBarr;': '\u2910',
1665 'rBarr;': '\u290f',
1666 'rbarr;': '\u290d',
1667 'rbbrk;': '\u2773',
1668 'rbrace;': '}',
1669 'rbrack;': ']',
1670 'rbrke;': '\u298c',
1671 'rbrksld;': '\u298e',
1672 'rbrkslu;': '\u2990',
1673 'Rcaron;': '\u0158',
1674 'rcaron;': '\u0159',
1675 'Rcedil;': '\u0156',
1676 'rcedil;': '\u0157',
1677 'rceil;': '\u2309',
1678 'rcub;': '}',
1679 'Rcy;': '\u0420',
1680 'rcy;': '\u0440',
1681 'rdca;': '\u2937',
1682 'rdldhar;': '\u2969',
1683 'rdquo;': '\u201d',
1684 'rdquor;': '\u201d',
1685 'rdsh;': '\u21b3',
1686 'Re;': '\u211c',
1687 'real;': '\u211c',
1688 'realine;': '\u211b',
1689 'realpart;': '\u211c',
1690 'reals;': '\u211d',
1691 'rect;': '\u25ad',
1692 'REG': '\xae',
1693 'reg': '\xae',
1694 'REG;': '\xae',
1695 'reg;': '\xae',
1696 'ReverseElement;': '\u220b',
1697 'ReverseEquilibrium;': '\u21cb',
1698 'ReverseUpEquilibrium;': '\u296f',
1699 'rfisht;': '\u297d',
1700 'rfloor;': '\u230b',
1701 'Rfr;': '\u211c',
1702 'rfr;': '\U0001d52f',
1703 'rHar;': '\u2964',
1704 'rhard;': '\u21c1',
1705 'rharu;': '\u21c0',
1706 'rharul;': '\u296c',
1707 'Rho;': '\u03a1',
1708 'rho;': '\u03c1',
1709 'rhov;': '\u03f1',
1710 'RightAngleBracket;': '\u27e9',
1711 'RightArrow;': '\u2192',
1712 'Rightarrow;': '\u21d2',
1713 'rightarrow;': '\u2192',
1714 'RightArrowBar;': '\u21e5',
1715 'RightArrowLeftArrow;': '\u21c4',
1716 'rightarrowtail;': '\u21a3',
1717 'RightCeiling;': '\u2309',
1718 'RightDoubleBracket;': '\u27e7',
1719 'RightDownTeeVector;': '\u295d',
1720 'RightDownVector;': '\u21c2',
1721 'RightDownVectorBar;': '\u2955',
1722 'RightFloor;': '\u230b',
1723 'rightharpoondown;': '\u21c1',
1724 'rightharpoonup;': '\u21c0',
1725 'rightleftarrows;': '\u21c4',
1726 'rightleftharpoons;': '\u21cc',
1727 'rightrightarrows;': '\u21c9',
1728 'rightsquigarrow;': '\u219d',
1729 'RightTee;': '\u22a2',
1730 'RightTeeArrow;': '\u21a6',
1731 'RightTeeVector;': '\u295b',
1732 'rightthreetimes;': '\u22cc',
1733 'RightTriangle;': '\u22b3',
1734 'RightTriangleBar;': '\u29d0',
1735 'RightTriangleEqual;': '\u22b5',
1736 'RightUpDownVector;': '\u294f',
1737 'RightUpTeeVector;': '\u295c',
1738 'RightUpVector;': '\u21be',
1739 'RightUpVectorBar;': '\u2954',
1740 'RightVector;': '\u21c0',
1741 'RightVectorBar;': '\u2953',
1742 'ring;': '\u02da',
1743 'risingdotseq;': '\u2253',
1744 'rlarr;': '\u21c4',
1745 'rlhar;': '\u21cc',
1746 'rlm;': '\u200f',
1747 'rmoust;': '\u23b1',
1748 'rmoustache;': '\u23b1',
1749 'rnmid;': '\u2aee',
1750 'roang;': '\u27ed',
1751 'roarr;': '\u21fe',
1752 'robrk;': '\u27e7',
1753 'ropar;': '\u2986',
1754 'Ropf;': '\u211d',
1755 'ropf;': '\U0001d563',
1756 'roplus;': '\u2a2e',
1757 'rotimes;': '\u2a35',
1758 'RoundImplies;': '\u2970',
1759 'rpar;': ')',
1760 'rpargt;': '\u2994',
1761 'rppolint;': '\u2a12',
1762 'rrarr;': '\u21c9',
1763 'Rrightarrow;': '\u21db',
1764 'rsaquo;': '\u203a',
1765 'Rscr;': '\u211b',
1766 'rscr;': '\U0001d4c7',
1767 'Rsh;': '\u21b1',
1768 'rsh;': '\u21b1',
1769 'rsqb;': ']',
1770 'rsquo;': '\u2019',
1771 'rsquor;': '\u2019',
1772 'rthree;': '\u22cc',
1773 'rtimes;': '\u22ca',
1774 'rtri;': '\u25b9',
1775 'rtrie;': '\u22b5',
1776 'rtrif;': '\u25b8',
1777 'rtriltri;': '\u29ce',
1778 'RuleDelayed;': '\u29f4',
1779 'ruluhar;': '\u2968',
1780 'rx;': '\u211e',
1781 'Sacute;': '\u015a',
1782 'sacute;': '\u015b',
1783 'sbquo;': '\u201a',
1784 'Sc;': '\u2abc',
1785 'sc;': '\u227b',
1786 'scap;': '\u2ab8',
1787 'Scaron;': '\u0160',
1788 'scaron;': '\u0161',
1789 'sccue;': '\u227d',
1790 'scE;': '\u2ab4',
1791 'sce;': '\u2ab0',
1792 'Scedil;': '\u015e',
1793 'scedil;': '\u015f',
1794 'Scirc;': '\u015c',
1795 'scirc;': '\u015d',
1796 'scnap;': '\u2aba',
1797 'scnE;': '\u2ab6',
1798 'scnsim;': '\u22e9',
1799 'scpolint;': '\u2a13',
1800 'scsim;': '\u227f',
1801 'Scy;': '\u0421',
1802 'scy;': '\u0441',
1803 'sdot;': '\u22c5',
1804 'sdotb;': '\u22a1',
1805 'sdote;': '\u2a66',
1806 'searhk;': '\u2925',
1807 'seArr;': '\u21d8',
1808 'searr;': '\u2198',
1809 'searrow;': '\u2198',
1810 'sect': '\xa7',
1811 'sect;': '\xa7',
1812 'semi;': ';',
1813 'seswar;': '\u2929',
1814 'setminus;': '\u2216',
1815 'setmn;': '\u2216',
1816 'sext;': '\u2736',
1817 'Sfr;': '\U0001d516',
1818 'sfr;': '\U0001d530',
1819 'sfrown;': '\u2322',
1820 'sharp;': '\u266f',
1821 'SHCHcy;': '\u0429',
1822 'shchcy;': '\u0449',
1823 'SHcy;': '\u0428',
1824 'shcy;': '\u0448',
1825 'ShortDownArrow;': '\u2193',
1826 'ShortLeftArrow;': '\u2190',
1827 'shortmid;': '\u2223',
1828 'shortparallel;': '\u2225',
1829 'ShortRightArrow;': '\u2192',
1830 'ShortUpArrow;': '\u2191',
1831 'shy': '\xad',
1832 'shy;': '\xad',
1833 'Sigma;': '\u03a3',
1834 'sigma;': '\u03c3',
1835 'sigmaf;': '\u03c2',
1836 'sigmav;': '\u03c2',
1837 'sim;': '\u223c',
1838 'simdot;': '\u2a6a',
1839 'sime;': '\u2243',
1840 'simeq;': '\u2243',
1841 'simg;': '\u2a9e',
1842 'simgE;': '\u2aa0',
1843 'siml;': '\u2a9d',
1844 'simlE;': '\u2a9f',
1845 'simne;': '\u2246',
1846 'simplus;': '\u2a24',
1847 'simrarr;': '\u2972',
1848 'slarr;': '\u2190',
1849 'SmallCircle;': '\u2218',
1850 'smallsetminus;': '\u2216',
1851 'smashp;': '\u2a33',
1852 'smeparsl;': '\u29e4',
1853 'smid;': '\u2223',
1854 'smile;': '\u2323',
1855 'smt;': '\u2aaa',
1856 'smte;': '\u2aac',
1857 'smtes;': '\u2aac\ufe00',
1858 'SOFTcy;': '\u042c',
1859 'softcy;': '\u044c',
1860 'sol;': '/',
1861 'solb;': '\u29c4',
1862 'solbar;': '\u233f',
1863 'Sopf;': '\U0001d54a',
1864 'sopf;': '\U0001d564',
1865 'spades;': '\u2660',
1866 'spadesuit;': '\u2660',
1867 'spar;': '\u2225',
1868 'sqcap;': '\u2293',
1869 'sqcaps;': '\u2293\ufe00',
1870 'sqcup;': '\u2294',
1871 'sqcups;': '\u2294\ufe00',
1872 'Sqrt;': '\u221a',
1873 'sqsub;': '\u228f',
1874 'sqsube;': '\u2291',
1875 'sqsubset;': '\u228f',
1876 'sqsubseteq;': '\u2291',
1877 'sqsup;': '\u2290',
1878 'sqsupe;': '\u2292',
1879 'sqsupset;': '\u2290',
1880 'sqsupseteq;': '\u2292',
1881 'squ;': '\u25a1',
1882 'Square;': '\u25a1',
1883 'square;': '\u25a1',
1884 'SquareIntersection;': '\u2293',
1885 'SquareSubset;': '\u228f',
1886 'SquareSubsetEqual;': '\u2291',
1887 'SquareSuperset;': '\u2290',
1888 'SquareSupersetEqual;': '\u2292',
1889 'SquareUnion;': '\u2294',
1890 'squarf;': '\u25aa',
1891 'squf;': '\u25aa',
1892 'srarr;': '\u2192',
1893 'Sscr;': '\U0001d4ae',
1894 'sscr;': '\U0001d4c8',
1895 'ssetmn;': '\u2216',
1896 'ssmile;': '\u2323',
1897 'sstarf;': '\u22c6',
1898 'Star;': '\u22c6',
1899 'star;': '\u2606',
1900 'starf;': '\u2605',
1901 'straightepsilon;': '\u03f5',
1902 'straightphi;': '\u03d5',
1903 'strns;': '\xaf',
1904 'Sub;': '\u22d0',
1905 'sub;': '\u2282',
1906 'subdot;': '\u2abd',
1907 'subE;': '\u2ac5',
1908 'sube;': '\u2286',
1909 'subedot;': '\u2ac3',
1910 'submult;': '\u2ac1',
1911 'subnE;': '\u2acb',
1912 'subne;': '\u228a',
1913 'subplus;': '\u2abf',
1914 'subrarr;': '\u2979',
1915 'Subset;': '\u22d0',
1916 'subset;': '\u2282',
1917 'subseteq;': '\u2286',
1918 'subseteqq;': '\u2ac5',
1919 'SubsetEqual;': '\u2286',
1920 'subsetneq;': '\u228a',
1921 'subsetneqq;': '\u2acb',
1922 'subsim;': '\u2ac7',
1923 'subsub;': '\u2ad5',
1924 'subsup;': '\u2ad3',
1925 'succ;': '\u227b',
1926 'succapprox;': '\u2ab8',
1927 'succcurlyeq;': '\u227d',
1928 'Succeeds;': '\u227b',
1929 'SucceedsEqual;': '\u2ab0',
1930 'SucceedsSlantEqual;': '\u227d',
1931 'SucceedsTilde;': '\u227f',
1932 'succeq;': '\u2ab0',
1933 'succnapprox;': '\u2aba',
1934 'succneqq;': '\u2ab6',
1935 'succnsim;': '\u22e9',
1936 'succsim;': '\u227f',
1937 'SuchThat;': '\u220b',
1938 'Sum;': '\u2211',
1939 'sum;': '\u2211',
1940 'sung;': '\u266a',
1941 'sup1': '\xb9',
1942 'sup1;': '\xb9',
1943 'sup2': '\xb2',
1944 'sup2;': '\xb2',
1945 'sup3': '\xb3',
1946 'sup3;': '\xb3',
1947 'Sup;': '\u22d1',
1948 'sup;': '\u2283',
1949 'supdot;': '\u2abe',
1950 'supdsub;': '\u2ad8',
1951 'supE;': '\u2ac6',
1952 'supe;': '\u2287',
1953 'supedot;': '\u2ac4',
1954 'Superset;': '\u2283',
1955 'SupersetEqual;': '\u2287',
1956 'suphsol;': '\u27c9',
1957 'suphsub;': '\u2ad7',
1958 'suplarr;': '\u297b',
1959 'supmult;': '\u2ac2',
1960 'supnE;': '\u2acc',
1961 'supne;': '\u228b',
1962 'supplus;': '\u2ac0',
1963 'Supset;': '\u22d1',
1964 'supset;': '\u2283',
1965 'supseteq;': '\u2287',
1966 'supseteqq;': '\u2ac6',
1967 'supsetneq;': '\u228b',
1968 'supsetneqq;': '\u2acc',
1969 'supsim;': '\u2ac8',
1970 'supsub;': '\u2ad4',
1971 'supsup;': '\u2ad6',
1972 'swarhk;': '\u2926',
1973 'swArr;': '\u21d9',
1974 'swarr;': '\u2199',
1975 'swarrow;': '\u2199',
1976 'swnwar;': '\u292a',
1977 'szlig': '\xdf',
1978 'szlig;': '\xdf',
1979 'Tab;': '\t',
1980 'target;': '\u2316',
1981 'Tau;': '\u03a4',
1982 'tau;': '\u03c4',
1983 'tbrk;': '\u23b4',
1984 'Tcaron;': '\u0164',
1985 'tcaron;': '\u0165',
1986 'Tcedil;': '\u0162',
1987 'tcedil;': '\u0163',
1988 'Tcy;': '\u0422',
1989 'tcy;': '\u0442',
1990 'tdot;': '\u20db',
1991 'telrec;': '\u2315',
1992 'Tfr;': '\U0001d517',
1993 'tfr;': '\U0001d531',
1994 'there4;': '\u2234',
1995 'Therefore;': '\u2234',
1996 'therefore;': '\u2234',
1997 'Theta;': '\u0398',
1998 'theta;': '\u03b8',
1999 'thetasym;': '\u03d1',
2000 'thetav;': '\u03d1',
2001 'thickapprox;': '\u2248',
2002 'thicksim;': '\u223c',
2003 'ThickSpace;': '\u205f\u200a',
2004 'thinsp;': '\u2009',
2005 'ThinSpace;': '\u2009',
2006 'thkap;': '\u2248',
2007 'thksim;': '\u223c',
2008 'THORN': '\xde',
2009 'thorn': '\xfe',
2010 'THORN;': '\xde',
2011 'thorn;': '\xfe',
2012 'Tilde;': '\u223c',
2013 'tilde;': '\u02dc',
2014 'TildeEqual;': '\u2243',
2015 'TildeFullEqual;': '\u2245',
2016 'TildeTilde;': '\u2248',
2017 'times': '\xd7',
2018 'times;': '\xd7',
2019 'timesb;': '\u22a0',
2020 'timesbar;': '\u2a31',
2021 'timesd;': '\u2a30',
2022 'tint;': '\u222d',
2023 'toea;': '\u2928',
2024 'top;': '\u22a4',
2025 'topbot;': '\u2336',
2026 'topcir;': '\u2af1',
2027 'Topf;': '\U0001d54b',
2028 'topf;': '\U0001d565',
2029 'topfork;': '\u2ada',
2030 'tosa;': '\u2929',
2031 'tprime;': '\u2034',
2032 'TRADE;': '\u2122',
2033 'trade;': '\u2122',
2034 'triangle;': '\u25b5',
2035 'triangledown;': '\u25bf',
2036 'triangleleft;': '\u25c3',
2037 'trianglelefteq;': '\u22b4',
2038 'triangleq;': '\u225c',
2039 'triangleright;': '\u25b9',
2040 'trianglerighteq;': '\u22b5',
2041 'tridot;': '\u25ec',
2042 'trie;': '\u225c',
2043 'triminus;': '\u2a3a',
2044 'TripleDot;': '\u20db',
2045 'triplus;': '\u2a39',
2046 'trisb;': '\u29cd',
2047 'tritime;': '\u2a3b',
2048 'trpezium;': '\u23e2',
2049 'Tscr;': '\U0001d4af',
2050 'tscr;': '\U0001d4c9',
2051 'TScy;': '\u0426',
2052 'tscy;': '\u0446',
2053 'TSHcy;': '\u040b',
2054 'tshcy;': '\u045b',
2055 'Tstrok;': '\u0166',
2056 'tstrok;': '\u0167',
2057 'twixt;': '\u226c',
2058 'twoheadleftarrow;': '\u219e',
2059 'twoheadrightarrow;': '\u21a0',
2060 'Uacute': '\xda',
2061 'uacute': '\xfa',
2062 'Uacute;': '\xda',
2063 'uacute;': '\xfa',
2064 'Uarr;': '\u219f',
2065 'uArr;': '\u21d1',
2066 'uarr;': '\u2191',
2067 'Uarrocir;': '\u2949',
2068 'Ubrcy;': '\u040e',
2069 'ubrcy;': '\u045e',
2070 'Ubreve;': '\u016c',
2071 'ubreve;': '\u016d',
2072 'Ucirc': '\xdb',
2073 'ucirc': '\xfb',
2074 'Ucirc;': '\xdb',
2075 'ucirc;': '\xfb',
2076 'Ucy;': '\u0423',
2077 'ucy;': '\u0443',
2078 'udarr;': '\u21c5',
2079 'Udblac;': '\u0170',
2080 'udblac;': '\u0171',
2081 'udhar;': '\u296e',
2082 'ufisht;': '\u297e',
2083 'Ufr;': '\U0001d518',
2084 'ufr;': '\U0001d532',
2085 'Ugrave': '\xd9',
2086 'ugrave': '\xf9',
2087 'Ugrave;': '\xd9',
2088 'ugrave;': '\xf9',
2089 'uHar;': '\u2963',
2090 'uharl;': '\u21bf',
2091 'uharr;': '\u21be',
2092 'uhblk;': '\u2580',
2093 'ulcorn;': '\u231c',
2094 'ulcorner;': '\u231c',
2095 'ulcrop;': '\u230f',
2096 'ultri;': '\u25f8',
2097 'Umacr;': '\u016a',
2098 'umacr;': '\u016b',
2099 'uml': '\xa8',
2100 'uml;': '\xa8',
2101 'UnderBar;': '_',
2102 'UnderBrace;': '\u23df',
2103 'UnderBracket;': '\u23b5',
2104 'UnderParenthesis;': '\u23dd',
2105 'Union;': '\u22c3',
2106 'UnionPlus;': '\u228e',
2107 'Uogon;': '\u0172',
2108 'uogon;': '\u0173',
2109 'Uopf;': '\U0001d54c',
2110 'uopf;': '\U0001d566',
2111 'UpArrow;': '\u2191',
2112 'Uparrow;': '\u21d1',
2113 'uparrow;': '\u2191',
2114 'UpArrowBar;': '\u2912',
2115 'UpArrowDownArrow;': '\u21c5',
2116 'UpDownArrow;': '\u2195',
2117 'Updownarrow;': '\u21d5',
2118 'updownarrow;': '\u2195',
2119 'UpEquilibrium;': '\u296e',
2120 'upharpoonleft;': '\u21bf',
2121 'upharpoonright;': '\u21be',
2122 'uplus;': '\u228e',
2123 'UpperLeftArrow;': '\u2196',
2124 'UpperRightArrow;': '\u2197',
2125 'Upsi;': '\u03d2',
2126 'upsi;': '\u03c5',
2127 'upsih;': '\u03d2',
2128 'Upsilon;': '\u03a5',
2129 'upsilon;': '\u03c5',
2130 'UpTee;': '\u22a5',
2131 'UpTeeArrow;': '\u21a5',
2132 'upuparrows;': '\u21c8',
2133 'urcorn;': '\u231d',
2134 'urcorner;': '\u231d',
2135 'urcrop;': '\u230e',
2136 'Uring;': '\u016e',
2137 'uring;': '\u016f',
2138 'urtri;': '\u25f9',
2139 'Uscr;': '\U0001d4b0',
2140 'uscr;': '\U0001d4ca',
2141 'utdot;': '\u22f0',
2142 'Utilde;': '\u0168',
2143 'utilde;': '\u0169',
2144 'utri;': '\u25b5',
2145 'utrif;': '\u25b4',
2146 'uuarr;': '\u21c8',
2147 'Uuml': '\xdc',
2148 'uuml': '\xfc',
2149 'Uuml;': '\xdc',
2150 'uuml;': '\xfc',
2151 'uwangle;': '\u29a7',
2152 'vangrt;': '\u299c',
2153 'varepsilon;': '\u03f5',
2154 'varkappa;': '\u03f0',
2155 'varnothing;': '\u2205',
2156 'varphi;': '\u03d5',
2157 'varpi;': '\u03d6',
2158 'varpropto;': '\u221d',
2159 'vArr;': '\u21d5',
2160 'varr;': '\u2195',
2161 'varrho;': '\u03f1',
2162 'varsigma;': '\u03c2',
2163 'varsubsetneq;': '\u228a\ufe00',
2164 'varsubsetneqq;': '\u2acb\ufe00',
2165 'varsupsetneq;': '\u228b\ufe00',
2166 'varsupsetneqq;': '\u2acc\ufe00',
2167 'vartheta;': '\u03d1',
2168 'vartriangleleft;': '\u22b2',
2169 'vartriangleright;': '\u22b3',
2170 'Vbar;': '\u2aeb',
2171 'vBar;': '\u2ae8',
2172 'vBarv;': '\u2ae9',
2173 'Vcy;': '\u0412',
2174 'vcy;': '\u0432',
2175 'VDash;': '\u22ab',
2176 'Vdash;': '\u22a9',
2177 'vDash;': '\u22a8',
2178 'vdash;': '\u22a2',
2179 'Vdashl;': '\u2ae6',
2180 'Vee;': '\u22c1',
2181 'vee;': '\u2228',
2182 'veebar;': '\u22bb',
2183 'veeeq;': '\u225a',
2184 'vellip;': '\u22ee',
2185 'Verbar;': '\u2016',
2186 'verbar;': '|',
2187 'Vert;': '\u2016',
2188 'vert;': '|',
2189 'VerticalBar;': '\u2223',
2190 'VerticalLine;': '|',
2191 'VerticalSeparator;': '\u2758',
2192 'VerticalTilde;': '\u2240',
2193 'VeryThinSpace;': '\u200a',
2194 'Vfr;': '\U0001d519',
2195 'vfr;': '\U0001d533',
2196 'vltri;': '\u22b2',
2197 'vnsub;': '\u2282\u20d2',
2198 'vnsup;': '\u2283\u20d2',
2199 'Vopf;': '\U0001d54d',
2200 'vopf;': '\U0001d567',
2201 'vprop;': '\u221d',
2202 'vrtri;': '\u22b3',
2203 'Vscr;': '\U0001d4b1',
2204 'vscr;': '\U0001d4cb',
2205 'vsubnE;': '\u2acb\ufe00',
2206 'vsubne;': '\u228a\ufe00',
2207 'vsupnE;': '\u2acc\ufe00',
2208 'vsupne;': '\u228b\ufe00',
2209 'Vvdash;': '\u22aa',
2210 'vzigzag;': '\u299a',
2211 'Wcirc;': '\u0174',
2212 'wcirc;': '\u0175',
2213 'wedbar;': '\u2a5f',
2214 'Wedge;': '\u22c0',
2215 'wedge;': '\u2227',
2216 'wedgeq;': '\u2259',
2217 'weierp;': '\u2118',
2218 'Wfr;': '\U0001d51a',
2219 'wfr;': '\U0001d534',
2220 'Wopf;': '\U0001d54e',
2221 'wopf;': '\U0001d568',
2222 'wp;': '\u2118',
2223 'wr;': '\u2240',
2224 'wreath;': '\u2240',
2225 'Wscr;': '\U0001d4b2',
2226 'wscr;': '\U0001d4cc',
2227 'xcap;': '\u22c2',
2228 'xcirc;': '\u25ef',
2229 'xcup;': '\u22c3',
2230 'xdtri;': '\u25bd',
2231 'Xfr;': '\U0001d51b',
2232 'xfr;': '\U0001d535',
2233 'xhArr;': '\u27fa',
2234 'xharr;': '\u27f7',
2235 'Xi;': '\u039e',
2236 'xi;': '\u03be',
2237 'xlArr;': '\u27f8',
2238 'xlarr;': '\u27f5',
2239 'xmap;': '\u27fc',
2240 'xnis;': '\u22fb',
2241 'xodot;': '\u2a00',
2242 'Xopf;': '\U0001d54f',
2243 'xopf;': '\U0001d569',
2244 'xoplus;': '\u2a01',
2245 'xotime;': '\u2a02',
2246 'xrArr;': '\u27f9',
2247 'xrarr;': '\u27f6',
2248 'Xscr;': '\U0001d4b3',
2249 'xscr;': '\U0001d4cd',
2250 'xsqcup;': '\u2a06',
2251 'xuplus;': '\u2a04',
2252 'xutri;': '\u25b3',
2253 'xvee;': '\u22c1',
2254 'xwedge;': '\u22c0',
2255 'Yacute': '\xdd',
2256 'yacute': '\xfd',
2257 'Yacute;': '\xdd',
2258 'yacute;': '\xfd',
2259 'YAcy;': '\u042f',
2260 'yacy;': '\u044f',
2261 'Ycirc;': '\u0176',
2262 'ycirc;': '\u0177',
2263 'Ycy;': '\u042b',
2264 'ycy;': '\u044b',
2265 'yen': '\xa5',
2266 'yen;': '\xa5',
2267 'Yfr;': '\U0001d51c',
2268 'yfr;': '\U0001d536',
2269 'YIcy;': '\u0407',
2270 'yicy;': '\u0457',
2271 'Yopf;': '\U0001d550',
2272 'yopf;': '\U0001d56a',
2273 'Yscr;': '\U0001d4b4',
2274 'yscr;': '\U0001d4ce',
2275 'YUcy;': '\u042e',
2276 'yucy;': '\u044e',
2277 'yuml': '\xff',
2278 'Yuml;': '\u0178',
2279 'yuml;': '\xff',
2280 'Zacute;': '\u0179',
2281 'zacute;': '\u017a',
2282 'Zcaron;': '\u017d',
2283 'zcaron;': '\u017e',
2284 'Zcy;': '\u0417',
2285 'zcy;': '\u0437',
2286 'Zdot;': '\u017b',
2287 'zdot;': '\u017c',
2288 'zeetrf;': '\u2128',
2289 'ZeroWidthSpace;': '\u200b',
2290 'Zeta;': '\u0396',
2291 'zeta;': '\u03b6',
2292 'Zfr;': '\u2128',
2293 'zfr;': '\U0001d537',
2294 'ZHcy;': '\u0416',
2295 'zhcy;': '\u0436',
2296 'zigrarr;': '\u21dd',
2297 'Zopf;': '\u2124',
2298 'zopf;': '\U0001d56b',
2299 'Zscr;': '\U0001d4b5',
2300 'zscr;': '\U0001d4cf',
2301 'zwj;': '\u200d',
2302 'zwnj;': '\u200c',
2303 }
2304
8c25f81b
PH
2305try:
2306 import http.client as compat_http_client
5f6a1245 2307except ImportError: # Python 2
8c25f81b
PH
2308 import httplib as compat_http_client
2309
2310try:
2311 from urllib.error import HTTPError as compat_HTTPError
2312except ImportError: # Python 2
2313 from urllib2 import HTTPError as compat_HTTPError
2314
2315try:
2316 from urllib.request import urlretrieve as compat_urlretrieve
2317except ImportError: # Python 2
2318 from urllib import urlretrieve as compat_urlretrieve
2319
8bb56eee
BF
2320try:
2321 from html.parser import HTMLParser as compat_HTMLParser
2322except ImportError: # Python 2
2323 from HTMLParser import HTMLParser as compat_HTMLParser
2324
8c25f81b
PH
2325try:
2326 from subprocess import DEVNULL
2327 compat_subprocess_get_DEVNULL = lambda: DEVNULL
2328except ImportError:
2329 compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2330
83fda3c0
PH
2331try:
2332 import http.server as compat_http_server
2333except ImportError:
2334 import BaseHTTPServer as compat_http_server
2335
953fed28
PH
2336try:
2337 compat_str = unicode # Python 2
2338except NameError:
2339 compat_str = str
2340
8c25f81b 2341try:
55139679 2342 from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
8c25f81b 2343 from urllib.parse import unquote as compat_urllib_parse_unquote
aa99aa4e 2344 from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
55139679 2345except ImportError: # Python 2
22603348 2346 _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
ec85ded8 2347 else re.compile(r'([\x00-\x7f]+)'))
3cc8b4c3 2348
4d08161a 2349 # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
55139679
S
2350 # implementations from cpython 3.4.3's stdlib. Python 2's version
2351 # is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244)
2352
c9c854ce 2353 def compat_urllib_parse_unquote_to_bytes(string):
2354 """unquote_to_bytes('abc%20def') -> b'abc def'."""
2355 # Note: strings are encoded as UTF-8. This is only an issue if it contains
2356 # unescaped non-ASCII characters, which URIs should not.
2357 if not string:
2358 # Is it a string-like object?
2359 string.split
2360 return b''
953fed28 2361 if isinstance(string, compat_str):
c9c854ce 2362 string = string.encode('utf-8')
55139679 2363 bits = string.split(b'%')
c9c854ce 2364 if len(bits) == 1:
2365 return string
2366 res = [bits[0]]
2367 append = res.append
c9c854ce 2368 for item in bits[1:]:
2369 try:
55139679 2370 append(compat_urllib_parse._hextochr[item[:2]])
c9c854ce 2371 append(item[2:])
55139679 2372 except KeyError:
c9c854ce 2373 append(b'%')
2374 append(item)
2375 return b''.join(res)
2376
a0f28f90 2377 def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
c9c854ce 2378 """Replace %xx escapes by their single-character equivalent. The optional
2379 encoding and errors parameters specify how to decode percent-encoded
2380 sequences into Unicode characters, as accepted by the bytes.decode()
2381 method.
2382 By default, percent-encoded sequences are decoded with UTF-8, and invalid
2383 sequences are replaced by a placeholder character.
2384
2385 unquote('abc%20def') -> 'abc def'.
2386 """
c9c854ce 2387 if '%' not in string:
2388 string.split
2389 return string
2390 if encoding is None:
2391 encoding = 'utf-8'
2392 if errors is None:
2393 errors = 'replace'
3cc8b4c3 2394 bits = _asciire.split(string)
c9c854ce 2395 res = [bits[0]]
2396 append = res.append
2397 for i in range(1, len(bits), 2):
55139679
S
2398 append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2399 append(bits[i + 1])
c9c854ce 2400 return ''.join(res)
2401
aa99aa4e
S
2402 def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2403 """Like unquote(), but also replace plus signs by spaces, as required for
2404 unquoting HTML form values.
2405
2406 unquote_plus('%7e/abc+def') -> '~/abc def'
2407 """
2408 string = string.replace('+', ' ')
2409 return compat_urllib_parse_unquote(string, encoding, errors)
2410
15707c7e
S
2411try:
2412 from urllib.parse import urlencode as compat_urllib_parse_urlencode
2413except ImportError: # Python 2
2414 # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2415 # Possible solutions are to either port it from python 3 with all
2416 # the friends or manually ensure input query contains only byte strings.
2417 # We will stick with latter thus recursively encoding the whole query.
2418 def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2419 def encode_elem(e):
2420 if isinstance(e, dict):
2421 e = encode_dict(e)
2422 elif isinstance(e, (list, tuple,)):
92d5477d
YCH
2423 list_e = encode_list(e)
2424 e = tuple(list_e) if isinstance(e, tuple) else list_e
15707c7e
S
2425 elif isinstance(e, compat_str):
2426 e = e.encode(encoding)
2427 return e
2428
2429 def encode_dict(d):
2430 return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2431
2432 def encode_list(l):
2433 return [encode_elem(e) for e in l]
2434
2435 return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2436
0a67a363
YCH
2437try:
2438 from urllib.request import DataHandler as compat_urllib_request_DataHandler
2439except ImportError: # Python < 3.4
2440 # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2441 class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2442 def data_open(self, req):
2443 # data URLs as specified in RFC 2397.
2444 #
2445 # ignores POSTed data
2446 #
2447 # syntax:
2448 # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
2449 # mediatype := [ type "/" subtype ] *( ";" parameter )
2450 # data := *urlchar
2451 # parameter := attribute "=" value
2452 url = req.get_full_url()
2453
611c1dd9
S
2454 scheme, data = url.split(':', 1)
2455 mediatype, data = data.split(',', 1)
0a67a363
YCH
2456
2457 # even base64 encoded data URLs might be quoted so unquote in any case:
2458 data = compat_urllib_parse_unquote_to_bytes(data)
611c1dd9 2459 if mediatype.endswith(';base64'):
0a67a363
YCH
2460 data = binascii.a2b_base64(data)
2461 mediatype = mediatype[:-7]
2462
2463 if not mediatype:
611c1dd9 2464 mediatype = 'text/plain;charset=US-ASCII'
0a67a363
YCH
2465
2466 headers = email.message_from_string(
611c1dd9 2467 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
0a67a363
YCH
2468
2469 return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2470
8f9312c3 2471try:
0196149c 2472 compat_basestring = basestring # Python 2
8f9312c3 2473except NameError:
0196149c 2474 compat_basestring = str
8f9312c3
PH
2475
2476try:
2477 compat_chr = unichr # Python 2
2478except NameError:
2479 compat_chr = chr
2480
2481try:
2482 from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2483except ImportError: # Python 2.6
2484 from xml.parsers.expat import ExpatError as compat_xml_parse_error
2485
eb7941e3
YCH
2486
2487etree = xml.etree.ElementTree
2488
2489
2490class _TreeBuilder(etree.TreeBuilder):
2491 def doctype(self, name, pubid, system):
2492 pass
2493
582be358 2494
36e6f62c 2495if sys.version_info[0] >= 3:
eb7941e3
YCH
2496 def compat_etree_fromstring(text):
2497 return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
36e6f62c 2498else:
ae37338e
JMF
2499 # python 2.x tries to encode unicode strings with ascii (see the
2500 # XMLParser._fixtext method)
f7854627
JMF
2501 try:
2502 _etree_iter = etree.Element.iter
2503 except AttributeError: # Python <=2.6
2504 def _etree_iter(root):
2505 for el in root.findall('*'):
2506 yield el
2507 for sub in _etree_iter(el):
2508 yield sub
2509
36e6f62c
JMF
2510 # on 2.6 XML doesn't have a parser argument, function copied from CPython
2511 # 2.7 source
2512 def _XML(text, parser=None):
2513 if not parser:
eb7941e3 2514 parser = etree.XMLParser(target=_TreeBuilder())
36e6f62c
JMF
2515 parser.feed(text)
2516 return parser.close()
2517
2518 def _element_factory(*args, **kwargs):
2519 el = etree.Element(*args, **kwargs)
2520 for k, v in el.items():
387db16a
JMF
2521 if isinstance(v, bytes):
2522 el.set(k, v.decode('utf-8'))
36e6f62c
JMF
2523 return el
2524
2525 def compat_etree_fromstring(text):
eb7941e3 2526 doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
f7854627
JMF
2527 for el in _etree_iter(doc):
2528 if el.text is not None and isinstance(el.text, bytes):
2529 el.text = el.text.decode('utf-8')
2530 return doc
8c25f81b 2531
c2d9c25f
RA
2532if hasattr(etree, 'register_namespace'):
2533 compat_etree_register_namespace = etree.register_namespace
2534else:
2535 def compat_etree_register_namespace(prefix, uri):
2536 """Register a namespace prefix.
2537 The registry is global, and any existing mapping for either the
2538 given prefix or the namespace URI will be removed.
2539 *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
2540 attributes in this namespace will be serialized with prefix if possible.
2541 ValueError is raised if prefix is reserved or is invalid.
2542 """
2543 if re.match(r"ns\d+$", prefix):
2544 raise ValueError("Prefix format reserved for internal use")
2545 for k, v in list(etree._namespace_map.items()):
2546 if k == uri or v == prefix:
2547 del etree._namespace_map[k]
2548 etree._namespace_map[uri] = prefix
2549
57f7e3c6
S
2550if sys.version_info < (2, 7):
2551 # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2552 # .//node does not match if a node is a direct child of . !
2553 def compat_xpath(xpath):
2554 if isinstance(xpath, compat_str):
2555 xpath = xpath.encode('ascii')
2556 return xpath
2557else:
2558 compat_xpath = lambda xpath: xpath
2559
8c25f81b
PH
2560try:
2561 from urllib.parse import parse_qs as compat_parse_qs
5f6a1245 2562except ImportError: # Python 2
8c25f81b
PH
2563 # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2564 # Python 2's version is apparently totally broken
2565
2566 def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2567 encoding='utf-8', errors='replace'):
8f9312c3 2568 qs, _coerce_result = qs, compat_str
8c25f81b
PH
2569 pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2570 r = []
2571 for name_value in pairs:
2572 if not name_value and not strict_parsing:
2573 continue
2574 nv = name_value.split('=', 1)
2575 if len(nv) != 2:
2576 if strict_parsing:
611c1dd9 2577 raise ValueError('bad query field: %r' % (name_value,))
8c25f81b
PH
2578 # Handle case of a control-name with no equal sign
2579 if keep_blank_values:
2580 nv.append('')
2581 else:
2582 continue
2583 if len(nv[1]) or keep_blank_values:
2584 name = nv[0].replace('+', ' ')
2585 name = compat_urllib_parse_unquote(
2586 name, encoding=encoding, errors=errors)
2587 name = _coerce_result(name)
2588 value = nv[1].replace('+', ' ')
2589 value = compat_urllib_parse_unquote(
2590 value, encoding=encoding, errors=errors)
2591 value = _coerce_result(value)
2592 r.append((name, value))
2593 return r
2594
2595 def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2596 encoding='utf-8', errors='replace'):
8c25f81b
PH
2597 parsed_result = {}
2598 pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
9e1a5b84 2599 encoding=encoding, errors=errors)
8c25f81b
PH
2600 for name, value in pairs:
2601 if name in parsed_result:
2602 parsed_result[name].append(value)
2603 else:
2604 parsed_result[name] = [value]
2605 return parsed_result
2606
8c25f81b 2607try:
702ccf2d 2608 from shlex import quote as compat_shlex_quote
8c25f81b 2609except ImportError: # Python < 3.3
702ccf2d 2610 def compat_shlex_quote(s):
7d4111ed
PH
2611 if re.match(r'^[-_\w./]+$', s):
2612 return s
2613 else:
2614 return "'" + s.replace("'", "'\"'\"'") + "'"
8c25f81b
PH
2615
2616
dfe5fa49 2617try:
ec351872
YCH
2618 args = shlex.split('中文')
2619 assert (isinstance(args, list) and
2620 isinstance(args[0], compat_str) and
2621 args[0] == '中文')
51f579b6 2622 compat_shlex_split = shlex.split
ec351872 2623except (AssertionError, UnicodeEncodeError):
51f579b6
S
2624 # Working around shlex issue with unicode strings on some python 2
2625 # versions (see http://bugs.python.org/issue1548891)
2626 def compat_shlex_split(s, comments=False, posix=True):
953fed28 2627 if isinstance(s, compat_str):
51f579b6 2628 s = s.encode('utf-8')
dfe5fa49 2629 return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
51f579b6
S
2630
2631
8c25f81b 2632def compat_ord(c):
5f6a1245
JW
2633 if type(c) is int:
2634 return c
2635 else:
2636 return ord(c)
8c25f81b
PH
2637
2638
e9c0cdd3
YCH
2639compat_os_name = os._name if os.name == 'java' else os.name
2640
2641
8c25f81b
PH
2642if sys.version_info >= (3, 0):
2643 compat_getenv = os.getenv
2644 compat_expanduser = os.path.expanduser
fe40f9ee
S
2645
2646 def compat_setenv(key, value, env=os.environ):
2647 env[key] = value
8c25f81b
PH
2648else:
2649 # Environment variables should be decoded with filesystem encoding.
2650 # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2651
2652 def compat_getenv(key, default=None):
2653 from .utils import get_filesystem_encoding
2654 env = os.getenv(key, default)
2655 if env:
2656 env = env.decode(get_filesystem_encoding())
2657 return env
2658
fe40f9ee
S
2659 def compat_setenv(key, value, env=os.environ):
2660 def encode(v):
2661 from .utils import get_filesystem_encoding
2662 return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2663 env[encode(key)] = encode(value)
2664
8c25f81b
PH
2665 # HACK: The default implementations of os.path.expanduser from cpython do not decode
2666 # environment variables with filesystem encoding. We will work around this by
2667 # providing adjusted implementations.
2668 # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2669 # for different platforms with correct environment variables decoding.
2670
e9c0cdd3 2671 if compat_os_name == 'posix':
8c25f81b
PH
2672 def compat_expanduser(path):
2673 """Expand ~ and ~user constructions. If user or $HOME is unknown,
2674 do nothing."""
2675 if not path.startswith('~'):
2676 return path
2677 i = path.find('/', 1)
2678 if i < 0:
2679 i = len(path)
2680 if i == 1:
2681 if 'HOME' not in os.environ:
2682 import pwd
2683 userhome = pwd.getpwuid(os.getuid()).pw_dir
2684 else:
2685 userhome = compat_getenv('HOME')
2686 else:
2687 import pwd
2688 try:
2689 pwent = pwd.getpwnam(path[1:i])
2690 except KeyError:
2691 return path
2692 userhome = pwent.pw_dir
2693 userhome = userhome.rstrip('/')
2694 return (userhome + path[i:]) or '/'
e9c0cdd3 2695 elif compat_os_name == 'nt' or compat_os_name == 'ce':
8c25f81b
PH
2696 def compat_expanduser(path):
2697 """Expand ~ and ~user constructs.
2698
2699 If user or $HOME is unknown, do nothing."""
2700 if path[:1] != '~':
2701 return path
2702 i, n = 1, len(path)
2703 while i < n and path[i] not in '/\\':
2704 i = i + 1
2705
2706 if 'HOME' in os.environ:
2707 userhome = compat_getenv('HOME')
2708 elif 'USERPROFILE' in os.environ:
2709 userhome = compat_getenv('USERPROFILE')
83e865a3 2710 elif 'HOMEPATH' not in os.environ:
8c25f81b
PH
2711 return path
2712 else:
2713 try:
2714 drive = compat_getenv('HOMEDRIVE')
2715 except KeyError:
2716 drive = ''
2717 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2718
5f6a1245 2719 if i != 1: # ~user
8c25f81b
PH
2720 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2721
2722 return userhome + path[i:]
2723 else:
2724 compat_expanduser = os.path.expanduser
2725
2726
2727if sys.version_info < (3, 0):
2728 def compat_print(s):
2729 from .utils import preferredencoding
2730 print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2731else:
2732 def compat_print(s):
b061ea6e 2733 assert isinstance(s, compat_str)
8c25f81b
PH
2734 print(s)
2735
2736
8c25f81b
PH
2737if sys.version_info < (3, 0) and sys.platform == 'win32':
2738 def compat_getpass(prompt, *args, **kwargs):
2739 if isinstance(prompt, compat_str):
baa70803 2740 from .utils import preferredencoding
8c25f81b
PH
2741 prompt = prompt.encode(preferredencoding())
2742 return getpass.getpass(prompt, *args, **kwargs)
2743else:
2744 compat_getpass = getpass.getpass
2745
1ae6c83b
S
2746try:
2747 compat_input = raw_input
2748except NameError: # Python 3
2749 compat_input = input
2750
614db89a 2751# Python < 2.6.5 require kwargs to be bytes
c7b0add8 2752try:
c6973bd4
PH
2753 def _testfunc(x):
2754 pass
2755 _testfunc(**{'x': 0})
c7b0add8
PH
2756except TypeError:
2757 def compat_kwargs(kwargs):
2758 return dict((bytes(k), v) for k, v in kwargs.items())
2759else:
2760 compat_kwargs = lambda kwargs: kwargs
8c25f81b 2761
e07e9313 2762
be4a824d
PH
2763if sys.version_info < (2, 7):
2764 def compat_socket_create_connection(address, timeout, source_address=None):
2765 host, port = address
2766 err = None
2767 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2768 af, socktype, proto, canonname, sa = res
2769 sock = None
2770 try:
2771 sock = socket.socket(af, socktype, proto)
2772 sock.settimeout(timeout)
2773 if source_address:
2774 sock.bind(source_address)
2775 sock.connect(sa)
2776 return sock
2777 except socket.error as _:
2778 err = _
2779 if sock is not None:
2780 sock.close()
2781 if err is not None:
2782 raise err
2783 else:
611c1dd9 2784 raise socket.error('getaddrinfo returns an empty list')
be4a824d
PH
2785else:
2786 compat_socket_create_connection = socket.create_connection
2787
2788
e07e9313
PH
2789# Fix https://github.com/rg3/youtube-dl/issues/4223
2790# See http://bugs.python.org/issue9161 for what is broken
2791def workaround_optparse_bug9161():
07e378fa
PH
2792 op = optparse.OptionParser()
2793 og = optparse.OptionGroup(op, 'foo')
e07e9313 2794 try:
07e378fa 2795 og.add_option('-t')
b244b5c3 2796 except TypeError:
e07e9313
PH
2797 real_add_option = optparse.OptionGroup.add_option
2798
2799 def _compat_add_option(self, *args, **kwargs):
2800 enc = lambda v: (
2801 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2802 else v)
2803 bargs = [enc(a) for a in args]
2804 bkwargs = dict(
2805 (k, enc(v)) for k, v in kwargs.items())
2806 return real_add_option(self, *bargs, **bkwargs)
2807 optparse.OptionGroup.add_option = _compat_add_option
2808
582be358 2809
003c69a8
JMF
2810if hasattr(shutil, 'get_terminal_size'): # Python >= 3.3
2811 compat_get_terminal_size = shutil.get_terminal_size
2812else:
2813 _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2814
13118a50 2815 def compat_get_terminal_size(fallback=(80, 24)):
4810c48d 2816 columns = compat_getenv('COLUMNS')
003c69a8
JMF
2817 if columns:
2818 columns = int(columns)
2819 else:
2820 columns = None
4810c48d 2821 lines = compat_getenv('LINES')
003c69a8
JMF
2822 if lines:
2823 lines = int(lines)
2824 else:
2825 lines = None
2826
4810c48d 2827 if columns is None or lines is None or columns <= 0 or lines <= 0:
13118a50
YCH
2828 try:
2829 sp = subprocess.Popen(
2830 ['stty', 'size'],
2831 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2832 out, err = sp.communicate()
f2dbc540 2833 _lines, _columns = map(int, out.split())
13118a50
YCH
2834 except Exception:
2835 _columns, _lines = _terminal_size(*fallback)
2836
4810c48d 2837 if columns is None or columns <= 0:
13118a50 2838 columns = _columns
4810c48d 2839 if lines is None or lines <= 0:
13118a50 2840 lines = _lines
003c69a8
JMF
2841 return _terminal_size(columns, lines)
2842
a0e060ac
YCH
2843try:
2844 itertools.count(start=0, step=1)
2845 compat_itertools_count = itertools.count
2846except TypeError: # Python 2.6
2847 def compat_itertools_count(start=0, step=1):
2848 n = start
2849 while True:
2850 yield n
2851 n += step
e07e9313 2852
67134eab
JMF
2853if sys.version_info >= (3, 0):
2854 from tokenize import tokenize as compat_tokenize_tokenize
2855else:
2856 from tokenize import generate_tokens as compat_tokenize_tokenize
e07e9313 2857
dab0daee
YCH
2858
2859try:
2860 struct.pack('!I', 0)
2861except TypeError:
2862 # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2863 # See https://bugs.python.org/issue19099
edaa23f8 2864 def compat_struct_pack(spec, *args):
dab0daee
YCH
2865 if isinstance(spec, compat_str):
2866 spec = spec.encode('ascii')
2867 return struct.pack(spec, *args)
2868
edaa23f8 2869 def compat_struct_unpack(spec, *args):
dab0daee
YCH
2870 if isinstance(spec, compat_str):
2871 spec = spec.encode('ascii')
2872 return struct.unpack(spec, *args)
2873else:
edaa23f8
YCH
2874 compat_struct_pack = struct.pack
2875 compat_struct_unpack = struct.unpack
dab0daee
YCH
2876
2877
8c25f81b 2878__all__ = [
8bb56eee 2879 'compat_HTMLParser',
8c25f81b 2880 'compat_HTTPError',
0196149c 2881 'compat_basestring',
8c25f81b
PH
2882 'compat_chr',
2883 'compat_cookiejar',
799207e8 2884 'compat_cookies',
36e6f62c 2885 'compat_etree_fromstring',
da162c11 2886 'compat_etree_register_namespace',
8c25f81b 2887 'compat_expanduser',
003c69a8 2888 'compat_get_terminal_size',
8c25f81b
PH
2889 'compat_getenv',
2890 'compat_getpass',
2891 'compat_html_entities',
9631a94f 2892 'compat_html_entities_html5',
8c25f81b 2893 'compat_http_client',
83fda3c0 2894 'compat_http_server',
e67f6880 2895 'compat_input',
a0e060ac 2896 'compat_itertools_count',
c7b0add8 2897 'compat_kwargs',
8c25f81b 2898 'compat_ord',
e9c0cdd3 2899 'compat_os_name',
8c25f81b
PH
2900 'compat_parse_qs',
2901 'compat_print',
fe40f9ee 2902 'compat_setenv',
702ccf2d 2903 'compat_shlex_quote',
51f579b6 2904 'compat_shlex_split',
be4a824d 2905 'compat_socket_create_connection',
987493ae 2906 'compat_str',
edaa23f8
YCH
2907 'compat_struct_pack',
2908 'compat_struct_unpack',
8c25f81b 2909 'compat_subprocess_get_DEVNULL',
67134eab 2910 'compat_tokenize_tokenize',
8c25f81b
PH
2911 'compat_urllib_error',
2912 'compat_urllib_parse',
2913 'compat_urllib_parse_unquote',
aa99aa4e 2914 'compat_urllib_parse_unquote_plus',
9fefc886 2915 'compat_urllib_parse_unquote_to_bytes',
15707c7e 2916 'compat_urllib_parse_urlencode',
8c25f81b
PH
2917 'compat_urllib_parse_urlparse',
2918 'compat_urllib_request',
0a67a363
YCH
2919 'compat_urllib_request_DataHandler',
2920 'compat_urllib_response',
8c25f81b
PH
2921 'compat_urlparse',
2922 'compat_urlretrieve',
2923 'compat_xml_parse_error',
57f7e3c6 2924 'compat_xpath',
e07e9313 2925 'workaround_optparse_bug9161',
8c25f81b 2926]