[compat] Introduce compat_HTMLParseError
[youtube-dl] / youtube_dl / compat.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import binascii
5 import collections
6 import email
7 import getpass
8 import io
9 import optparse
10 import os
11 import re
12 import shlex
13 import shutil
14 import socket
15 import struct
16 import subprocess
17 import sys
18 import itertools
19 import xml.etree.ElementTree
20
21
22 try:
23     import urllib.request as compat_urllib_request
24 except ImportError:  # Python 2
25     import urllib2 as compat_urllib_request
26
27 try:
28     import urllib.error as compat_urllib_error
29 except ImportError:  # Python 2
30     import urllib2 as compat_urllib_error
31
32 try:
33     import urllib.parse as compat_urllib_parse
34 except ImportError:  # Python 2
35     import urllib as compat_urllib_parse
36
37 try:
38     from urllib.parse import urlparse as compat_urllib_parse_urlparse
39 except ImportError:  # Python 2
40     from urlparse import urlparse as compat_urllib_parse_urlparse
41
42 try:
43     import urllib.parse as compat_urlparse
44 except ImportError:  # Python 2
45     import urlparse as compat_urlparse
46
47 try:
48     import urllib.response as compat_urllib_response
49 except ImportError:  # Python 2
50     import urllib as compat_urllib_response
51
52 try:
53     import http.cookiejar as compat_cookiejar
54 except ImportError:  # Python 2
55     import cookielib as compat_cookiejar
56
57 try:
58     import http.cookies as compat_cookies
59 except ImportError:  # Python 2
60     import Cookie as compat_cookies
61
62 try:
63     import html.entities as compat_html_entities
64 except ImportError:  # Python 2
65     import htmlentitydefs as compat_html_entities
66
67 try:  # Python >= 3.3
68     compat_html_entities_html5 = compat_html_entities.html5
69 except AttributeError:
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
2305 try:
2306     import http.client as compat_http_client
2307 except ImportError:  # Python 2
2308     import httplib as compat_http_client
2309
2310 try:
2311     from urllib.error import HTTPError as compat_HTTPError
2312 except ImportError:  # Python 2
2313     from urllib2 import HTTPError as compat_HTTPError
2314
2315 try:
2316     from urllib.request import urlretrieve as compat_urlretrieve
2317 except ImportError:  # Python 2
2318     from urllib import urlretrieve as compat_urlretrieve
2319
2320 try:
2321     from html.parser import HTMLParser as compat_HTMLParser
2322 except ImportError:  # Python 2
2323     from HTMLParser import HTMLParser as compat_HTMLParser
2324
2325 try:  # Python 2
2326     from HTMLParser import HTMLParseError as compat_HTMLParseError
2327 except ImportError:  # Python <3.4
2328     try:
2329         from html.parser import HTMLParseError as compat_HTMLParseError
2330     except ImportError:  # Python >3.4
2331
2332         # HTMLParseError has been deprecated in Python 3.3 and removed in
2333         # Python 3.5. Introducing dummy exception for Python >3.5 for compatible
2334         # and uniform cross-version exceptiong handling
2335         class compat_HTMLParseError(Exception):
2336             pass
2337
2338 try:
2339     from subprocess import DEVNULL
2340     compat_subprocess_get_DEVNULL = lambda: DEVNULL
2341 except ImportError:
2342     compat_subprocess_get_DEVNULL = lambda: open(os.path.devnull, 'w')
2343
2344 try:
2345     import http.server as compat_http_server
2346 except ImportError:
2347     import BaseHTTPServer as compat_http_server
2348
2349 try:
2350     compat_str = unicode  # Python 2
2351 except NameError:
2352     compat_str = str
2353
2354 try:
2355     from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
2356     from urllib.parse import unquote as compat_urllib_parse_unquote
2357     from urllib.parse import unquote_plus as compat_urllib_parse_unquote_plus
2358 except ImportError:  # Python 2
2359     _asciire = (compat_urllib_parse._asciire if hasattr(compat_urllib_parse, '_asciire')
2360                 else re.compile(r'([\x00-\x7f]+)'))
2361
2362     # HACK: The following are the correct unquote_to_bytes, unquote and unquote_plus
2363     # implementations from cpython 3.4.3's stdlib. Python 2's version
2364     # is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244)
2365
2366     def compat_urllib_parse_unquote_to_bytes(string):
2367         """unquote_to_bytes('abc%20def') -> b'abc def'."""
2368         # Note: strings are encoded as UTF-8. This is only an issue if it contains
2369         # unescaped non-ASCII characters, which URIs should not.
2370         if not string:
2371             # Is it a string-like object?
2372             string.split
2373             return b''
2374         if isinstance(string, compat_str):
2375             string = string.encode('utf-8')
2376         bits = string.split(b'%')
2377         if len(bits) == 1:
2378             return string
2379         res = [bits[0]]
2380         append = res.append
2381         for item in bits[1:]:
2382             try:
2383                 append(compat_urllib_parse._hextochr[item[:2]])
2384                 append(item[2:])
2385             except KeyError:
2386                 append(b'%')
2387                 append(item)
2388         return b''.join(res)
2389
2390     def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
2391         """Replace %xx escapes by their single-character equivalent. The optional
2392         encoding and errors parameters specify how to decode percent-encoded
2393         sequences into Unicode characters, as accepted by the bytes.decode()
2394         method.
2395         By default, percent-encoded sequences are decoded with UTF-8, and invalid
2396         sequences are replaced by a placeholder character.
2397
2398         unquote('abc%20def') -> 'abc def'.
2399         """
2400         if '%' not in string:
2401             string.split
2402             return string
2403         if encoding is None:
2404             encoding = 'utf-8'
2405         if errors is None:
2406             errors = 'replace'
2407         bits = _asciire.split(string)
2408         res = [bits[0]]
2409         append = res.append
2410         for i in range(1, len(bits), 2):
2411             append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
2412             append(bits[i + 1])
2413         return ''.join(res)
2414
2415     def compat_urllib_parse_unquote_plus(string, encoding='utf-8', errors='replace'):
2416         """Like unquote(), but also replace plus signs by spaces, as required for
2417         unquoting HTML form values.
2418
2419         unquote_plus('%7e/abc+def') -> '~/abc def'
2420         """
2421         string = string.replace('+', ' ')
2422         return compat_urllib_parse_unquote(string, encoding, errors)
2423
2424 try:
2425     from urllib.parse import urlencode as compat_urllib_parse_urlencode
2426 except ImportError:  # Python 2
2427     # Python 2 will choke in urlencode on mixture of byte and unicode strings.
2428     # Possible solutions are to either port it from python 3 with all
2429     # the friends or manually ensure input query contains only byte strings.
2430     # We will stick with latter thus recursively encoding the whole query.
2431     def compat_urllib_parse_urlencode(query, doseq=0, encoding='utf-8'):
2432         def encode_elem(e):
2433             if isinstance(e, dict):
2434                 e = encode_dict(e)
2435             elif isinstance(e, (list, tuple,)):
2436                 list_e = encode_list(e)
2437                 e = tuple(list_e) if isinstance(e, tuple) else list_e
2438             elif isinstance(e, compat_str):
2439                 e = e.encode(encoding)
2440             return e
2441
2442         def encode_dict(d):
2443             return dict((encode_elem(k), encode_elem(v)) for k, v in d.items())
2444
2445         def encode_list(l):
2446             return [encode_elem(e) for e in l]
2447
2448         return compat_urllib_parse.urlencode(encode_elem(query), doseq=doseq)
2449
2450 try:
2451     from urllib.request import DataHandler as compat_urllib_request_DataHandler
2452 except ImportError:  # Python < 3.4
2453     # Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
2454     class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
2455         def data_open(self, req):
2456             # data URLs as specified in RFC 2397.
2457             #
2458             # ignores POSTed data
2459             #
2460             # syntax:
2461             # dataurl   := "data:" [ mediatype ] [ ";base64" ] "," data
2462             # mediatype := [ type "/" subtype ] *( ";" parameter )
2463             # data      := *urlchar
2464             # parameter := attribute "=" value
2465             url = req.get_full_url()
2466
2467             scheme, data = url.split(':', 1)
2468             mediatype, data = data.split(',', 1)
2469
2470             # even base64 encoded data URLs might be quoted so unquote in any case:
2471             data = compat_urllib_parse_unquote_to_bytes(data)
2472             if mediatype.endswith(';base64'):
2473                 data = binascii.a2b_base64(data)
2474                 mediatype = mediatype[:-7]
2475
2476             if not mediatype:
2477                 mediatype = 'text/plain;charset=US-ASCII'
2478
2479             headers = email.message_from_string(
2480                 'Content-type: %s\nContent-length: %d\n' % (mediatype, len(data)))
2481
2482             return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
2483
2484 try:
2485     compat_basestring = basestring  # Python 2
2486 except NameError:
2487     compat_basestring = str
2488
2489 try:
2490     compat_chr = unichr  # Python 2
2491 except NameError:
2492     compat_chr = chr
2493
2494 try:
2495     from xml.etree.ElementTree import ParseError as compat_xml_parse_error
2496 except ImportError:  # Python 2.6
2497     from xml.parsers.expat import ExpatError as compat_xml_parse_error
2498
2499
2500 etree = xml.etree.ElementTree
2501
2502
2503 class _TreeBuilder(etree.TreeBuilder):
2504     def doctype(self, name, pubid, system):
2505         pass
2506
2507
2508 if sys.version_info[0] >= 3:
2509     def compat_etree_fromstring(text):
2510         return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
2511 else:
2512     # python 2.x tries to encode unicode strings with ascii (see the
2513     # XMLParser._fixtext method)
2514     try:
2515         _etree_iter = etree.Element.iter
2516     except AttributeError:  # Python <=2.6
2517         def _etree_iter(root):
2518             for el in root.findall('*'):
2519                 yield el
2520                 for sub in _etree_iter(el):
2521                     yield sub
2522
2523     # on 2.6 XML doesn't have a parser argument, function copied from CPython
2524     # 2.7 source
2525     def _XML(text, parser=None):
2526         if not parser:
2527             parser = etree.XMLParser(target=_TreeBuilder())
2528         parser.feed(text)
2529         return parser.close()
2530
2531     def _element_factory(*args, **kwargs):
2532         el = etree.Element(*args, **kwargs)
2533         for k, v in el.items():
2534             if isinstance(v, bytes):
2535                 el.set(k, v.decode('utf-8'))
2536         return el
2537
2538     def compat_etree_fromstring(text):
2539         doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
2540         for el in _etree_iter(doc):
2541             if el.text is not None and isinstance(el.text, bytes):
2542                 el.text = el.text.decode('utf-8')
2543         return doc
2544
2545 if hasattr(etree, 'register_namespace'):
2546     compat_etree_register_namespace = etree.register_namespace
2547 else:
2548     def compat_etree_register_namespace(prefix, uri):
2549         """Register a namespace prefix.
2550         The registry is global, and any existing mapping for either the
2551         given prefix or the namespace URI will be removed.
2552         *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
2553         attributes in this namespace will be serialized with prefix if possible.
2554         ValueError is raised if prefix is reserved or is invalid.
2555         """
2556         if re.match(r"ns\d+$", prefix):
2557             raise ValueError("Prefix format reserved for internal use")
2558         for k, v in list(etree._namespace_map.items()):
2559             if k == uri or v == prefix:
2560                 del etree._namespace_map[k]
2561         etree._namespace_map[uri] = prefix
2562
2563 if sys.version_info < (2, 7):
2564     # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2565     # .//node does not match if a node is a direct child of . !
2566     def compat_xpath(xpath):
2567         if isinstance(xpath, compat_str):
2568             xpath = xpath.encode('ascii')
2569         return xpath
2570 else:
2571     compat_xpath = lambda xpath: xpath
2572
2573 try:
2574     from urllib.parse import parse_qs as compat_parse_qs
2575 except ImportError:  # Python 2
2576     # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2577     # Python 2's version is apparently totally broken
2578
2579     def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
2580                    encoding='utf-8', errors='replace'):
2581         qs, _coerce_result = qs, compat_str
2582         pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2583         r = []
2584         for name_value in pairs:
2585             if not name_value and not strict_parsing:
2586                 continue
2587             nv = name_value.split('=', 1)
2588             if len(nv) != 2:
2589                 if strict_parsing:
2590                     raise ValueError('bad query field: %r' % (name_value,))
2591                 # Handle case of a control-name with no equal sign
2592                 if keep_blank_values:
2593                     nv.append('')
2594                 else:
2595                     continue
2596             if len(nv[1]) or keep_blank_values:
2597                 name = nv[0].replace('+', ' ')
2598                 name = compat_urllib_parse_unquote(
2599                     name, encoding=encoding, errors=errors)
2600                 name = _coerce_result(name)
2601                 value = nv[1].replace('+', ' ')
2602                 value = compat_urllib_parse_unquote(
2603                     value, encoding=encoding, errors=errors)
2604                 value = _coerce_result(value)
2605                 r.append((name, value))
2606         return r
2607
2608     def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
2609                         encoding='utf-8', errors='replace'):
2610         parsed_result = {}
2611         pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
2612                            encoding=encoding, errors=errors)
2613         for name, value in pairs:
2614             if name in parsed_result:
2615                 parsed_result[name].append(value)
2616             else:
2617                 parsed_result[name] = [value]
2618         return parsed_result
2619
2620 try:
2621     from shlex import quote as compat_shlex_quote
2622 except ImportError:  # Python < 3.3
2623     def compat_shlex_quote(s):
2624         if re.match(r'^[-_\w./]+$', s):
2625             return s
2626         else:
2627             return "'" + s.replace("'", "'\"'\"'") + "'"
2628
2629
2630 try:
2631     args = shlex.split('中文')
2632     assert (isinstance(args, list) and
2633             isinstance(args[0], compat_str) and
2634             args[0] == '中文')
2635     compat_shlex_split = shlex.split
2636 except (AssertionError, UnicodeEncodeError):
2637     # Working around shlex issue with unicode strings on some python 2
2638     # versions (see http://bugs.python.org/issue1548891)
2639     def compat_shlex_split(s, comments=False, posix=True):
2640         if isinstance(s, compat_str):
2641             s = s.encode('utf-8')
2642         return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
2643
2644
2645 def compat_ord(c):
2646     if type(c) is int:
2647         return c
2648     else:
2649         return ord(c)
2650
2651
2652 compat_os_name = os._name if os.name == 'java' else os.name
2653
2654
2655 if sys.version_info >= (3, 0):
2656     compat_getenv = os.getenv
2657     compat_expanduser = os.path.expanduser
2658
2659     def compat_setenv(key, value, env=os.environ):
2660         env[key] = value
2661 else:
2662     # Environment variables should be decoded with filesystem encoding.
2663     # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2664
2665     def compat_getenv(key, default=None):
2666         from .utils import get_filesystem_encoding
2667         env = os.getenv(key, default)
2668         if env:
2669             env = env.decode(get_filesystem_encoding())
2670         return env
2671
2672     def compat_setenv(key, value, env=os.environ):
2673         def encode(v):
2674             from .utils import get_filesystem_encoding
2675             return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2676         env[encode(key)] = encode(value)
2677
2678     # HACK: The default implementations of os.path.expanduser from cpython do not decode
2679     # environment variables with filesystem encoding. We will work around this by
2680     # providing adjusted implementations.
2681     # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2682     # for different platforms with correct environment variables decoding.
2683
2684     if compat_os_name == 'posix':
2685         def compat_expanduser(path):
2686             """Expand ~ and ~user constructions.  If user or $HOME is unknown,
2687             do nothing."""
2688             if not path.startswith('~'):
2689                 return path
2690             i = path.find('/', 1)
2691             if i < 0:
2692                 i = len(path)
2693             if i == 1:
2694                 if 'HOME' not in os.environ:
2695                     import pwd
2696                     userhome = pwd.getpwuid(os.getuid()).pw_dir
2697                 else:
2698                     userhome = compat_getenv('HOME')
2699             else:
2700                 import pwd
2701                 try:
2702                     pwent = pwd.getpwnam(path[1:i])
2703                 except KeyError:
2704                     return path
2705                 userhome = pwent.pw_dir
2706             userhome = userhome.rstrip('/')
2707             return (userhome + path[i:]) or '/'
2708     elif compat_os_name in ('nt', 'ce'):
2709         def compat_expanduser(path):
2710             """Expand ~ and ~user constructs.
2711
2712             If user or $HOME is unknown, do nothing."""
2713             if path[:1] != '~':
2714                 return path
2715             i, n = 1, len(path)
2716             while i < n and path[i] not in '/\\':
2717                 i = i + 1
2718
2719             if 'HOME' in os.environ:
2720                 userhome = compat_getenv('HOME')
2721             elif 'USERPROFILE' in os.environ:
2722                 userhome = compat_getenv('USERPROFILE')
2723             elif 'HOMEPATH' not in os.environ:
2724                 return path
2725             else:
2726                 try:
2727                     drive = compat_getenv('HOMEDRIVE')
2728                 except KeyError:
2729                     drive = ''
2730                 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2731
2732             if i != 1:  # ~user
2733                 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2734
2735             return userhome + path[i:]
2736     else:
2737         compat_expanduser = os.path.expanduser
2738
2739
2740 if sys.version_info < (3, 0):
2741     def compat_print(s):
2742         from .utils import preferredencoding
2743         print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2744 else:
2745     def compat_print(s):
2746         assert isinstance(s, compat_str)
2747         print(s)
2748
2749
2750 if sys.version_info < (3, 0) and sys.platform == 'win32':
2751     def compat_getpass(prompt, *args, **kwargs):
2752         if isinstance(prompt, compat_str):
2753             from .utils import preferredencoding
2754             prompt = prompt.encode(preferredencoding())
2755         return getpass.getpass(prompt, *args, **kwargs)
2756 else:
2757     compat_getpass = getpass.getpass
2758
2759 try:
2760     compat_input = raw_input
2761 except NameError:  # Python 3
2762     compat_input = input
2763
2764 # Python < 2.6.5 require kwargs to be bytes
2765 try:
2766     def _testfunc(x):
2767         pass
2768     _testfunc(**{'x': 0})
2769 except TypeError:
2770     def compat_kwargs(kwargs):
2771         return dict((bytes(k), v) for k, v in kwargs.items())
2772 else:
2773     compat_kwargs = lambda kwargs: kwargs
2774
2775
2776 try:
2777     compat_numeric_types = (int, float, long, complex)
2778 except NameError:  # Python 3
2779     compat_numeric_types = (int, float, complex)
2780
2781
2782 if sys.version_info < (2, 7):
2783     def compat_socket_create_connection(address, timeout, source_address=None):
2784         host, port = address
2785         err = None
2786         for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2787             af, socktype, proto, canonname, sa = res
2788             sock = None
2789             try:
2790                 sock = socket.socket(af, socktype, proto)
2791                 sock.settimeout(timeout)
2792                 if source_address:
2793                     sock.bind(source_address)
2794                 sock.connect(sa)
2795                 return sock
2796             except socket.error as _:
2797                 err = _
2798                 if sock is not None:
2799                     sock.close()
2800         if err is not None:
2801             raise err
2802         else:
2803             raise socket.error('getaddrinfo returns an empty list')
2804 else:
2805     compat_socket_create_connection = socket.create_connection
2806
2807
2808 # Fix https://github.com/rg3/youtube-dl/issues/4223
2809 # See http://bugs.python.org/issue9161 for what is broken
2810 def workaround_optparse_bug9161():
2811     op = optparse.OptionParser()
2812     og = optparse.OptionGroup(op, 'foo')
2813     try:
2814         og.add_option('-t')
2815     except TypeError:
2816         real_add_option = optparse.OptionGroup.add_option
2817
2818         def _compat_add_option(self, *args, **kwargs):
2819             enc = lambda v: (
2820                 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2821                 else v)
2822             bargs = [enc(a) for a in args]
2823             bkwargs = dict(
2824                 (k, enc(v)) for k, v in kwargs.items())
2825             return real_add_option(self, *bargs, **bkwargs)
2826         optparse.OptionGroup.add_option = _compat_add_option
2827
2828
2829 if hasattr(shutil, 'get_terminal_size'):  # Python >= 3.3
2830     compat_get_terminal_size = shutil.get_terminal_size
2831 else:
2832     _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2833
2834     def compat_get_terminal_size(fallback=(80, 24)):
2835         columns = compat_getenv('COLUMNS')
2836         if columns:
2837             columns = int(columns)
2838         else:
2839             columns = None
2840         lines = compat_getenv('LINES')
2841         if lines:
2842             lines = int(lines)
2843         else:
2844             lines = None
2845
2846         if columns is None or lines is None or columns <= 0 or lines <= 0:
2847             try:
2848                 sp = subprocess.Popen(
2849                     ['stty', 'size'],
2850                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2851                 out, err = sp.communicate()
2852                 _lines, _columns = map(int, out.split())
2853             except Exception:
2854                 _columns, _lines = _terminal_size(*fallback)
2855
2856             if columns is None or columns <= 0:
2857                 columns = _columns
2858             if lines is None or lines <= 0:
2859                 lines = _lines
2860         return _terminal_size(columns, lines)
2861
2862 try:
2863     itertools.count(start=0, step=1)
2864     compat_itertools_count = itertools.count
2865 except TypeError:  # Python 2.6
2866     def compat_itertools_count(start=0, step=1):
2867         n = start
2868         while True:
2869             yield n
2870             n += step
2871
2872 if sys.version_info >= (3, 0):
2873     from tokenize import tokenize as compat_tokenize_tokenize
2874 else:
2875     from tokenize import generate_tokens as compat_tokenize_tokenize
2876
2877
2878 try:
2879     struct.pack('!I', 0)
2880 except TypeError:
2881     # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2882     # See https://bugs.python.org/issue19099
2883     def compat_struct_pack(spec, *args):
2884         if isinstance(spec, compat_str):
2885             spec = spec.encode('ascii')
2886         return struct.pack(spec, *args)
2887
2888     def compat_struct_unpack(spec, *args):
2889         if isinstance(spec, compat_str):
2890             spec = spec.encode('ascii')
2891         return struct.unpack(spec, *args)
2892 else:
2893     compat_struct_pack = struct.pack
2894     compat_struct_unpack = struct.unpack
2895
2896
2897 __all__ = [
2898     'compat_HTMLParser',
2899     'compat_HTTPError',
2900     'compat_basestring',
2901     'compat_chr',
2902     'compat_cookiejar',
2903     'compat_cookies',
2904     'compat_etree_fromstring',
2905     'compat_etree_register_namespace',
2906     'compat_expanduser',
2907     'compat_get_terminal_size',
2908     'compat_getenv',
2909     'compat_getpass',
2910     'compat_html_entities',
2911     'compat_html_entities_html5',
2912     'compat_http_client',
2913     'compat_http_server',
2914     'compat_input',
2915     'compat_itertools_count',
2916     'compat_kwargs',
2917     'compat_numeric_types',
2918     'compat_ord',
2919     'compat_os_name',
2920     'compat_parse_qs',
2921     'compat_print',
2922     'compat_setenv',
2923     'compat_shlex_quote',
2924     'compat_shlex_split',
2925     'compat_socket_create_connection',
2926     'compat_str',
2927     'compat_struct_pack',
2928     'compat_struct_unpack',
2929     'compat_subprocess_get_DEVNULL',
2930     'compat_tokenize_tokenize',
2931     'compat_urllib_error',
2932     'compat_urllib_parse',
2933     'compat_urllib_parse_unquote',
2934     'compat_urllib_parse_unquote_plus',
2935     'compat_urllib_parse_unquote_to_bytes',
2936     'compat_urllib_parse_urlencode',
2937     'compat_urllib_parse_urlparse',
2938     'compat_urllib_request',
2939     'compat_urllib_request_DataHandler',
2940     'compat_urllib_response',
2941     'compat_urlparse',
2942     'compat_urlretrieve',
2943     'compat_xml_parse_error',
2944     'compat_xpath',
2945     'workaround_optparse_bug9161',
2946 ]