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