]> jfr.im git - yt-dlp.git/blame - youtube_dl/compat.py
[compat] Introduce compat_realpath (refs #23991)
[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 2366 # implementations from cpython 3.4.3's stdlib. Python 2's version
067aa17e 2367 # is apparently broken (see https://github.com/ytdl-org/youtube-dl/pull/6244)
55139679 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
399f7687
S
2511try:
2512 # xml.etree.ElementTree.Element is a method in Python <=2.6 and
2513 # the following will crash with:
2514 # TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
2515 isinstance(None, xml.etree.ElementTree.Element)
2516 from xml.etree.ElementTree import Element as compat_etree_Element
2517except TypeError: # Python <=2.6
2518 from xml.etree.ElementTree import _ElementInterface as compat_etree_Element
2519
36e6f62c 2520if sys.version_info[0] >= 3:
eb7941e3
YCH
2521 def compat_etree_fromstring(text):
2522 return etree.XML(text, parser=etree.XMLParser(target=_TreeBuilder()))
36e6f62c 2523else:
ae37338e
JMF
2524 # python 2.x tries to encode unicode strings with ascii (see the
2525 # XMLParser._fixtext method)
f7854627
JMF
2526 try:
2527 _etree_iter = etree.Element.iter
2528 except AttributeError: # Python <=2.6
2529 def _etree_iter(root):
2530 for el in root.findall('*'):
2531 yield el
2532 for sub in _etree_iter(el):
2533 yield sub
2534
36e6f62c
JMF
2535 # on 2.6 XML doesn't have a parser argument, function copied from CPython
2536 # 2.7 source
2537 def _XML(text, parser=None):
2538 if not parser:
eb7941e3 2539 parser = etree.XMLParser(target=_TreeBuilder())
36e6f62c
JMF
2540 parser.feed(text)
2541 return parser.close()
2542
2543 def _element_factory(*args, **kwargs):
2544 el = etree.Element(*args, **kwargs)
2545 for k, v in el.items():
387db16a
JMF
2546 if isinstance(v, bytes):
2547 el.set(k, v.decode('utf-8'))
36e6f62c
JMF
2548 return el
2549
2550 def compat_etree_fromstring(text):
eb7941e3 2551 doc = _XML(text, parser=etree.XMLParser(target=_TreeBuilder(element_factory=_element_factory)))
f7854627
JMF
2552 for el in _etree_iter(doc):
2553 if el.text is not None and isinstance(el.text, bytes):
2554 el.text = el.text.decode('utf-8')
2555 return doc
8c25f81b 2556
c2d9c25f
RA
2557if hasattr(etree, 'register_namespace'):
2558 compat_etree_register_namespace = etree.register_namespace
2559else:
2560 def compat_etree_register_namespace(prefix, uri):
2561 """Register a namespace prefix.
2562 The registry is global, and any existing mapping for either the
2563 given prefix or the namespace URI will be removed.
2564 *prefix* is the namespace prefix, *uri* is a namespace uri. Tags and
2565 attributes in this namespace will be serialized with prefix if possible.
2566 ValueError is raised if prefix is reserved or is invalid.
2567 """
2568 if re.match(r"ns\d+$", prefix):
2569 raise ValueError("Prefix format reserved for internal use")
2570 for k, v in list(etree._namespace_map.items()):
2571 if k == uri or v == prefix:
2572 del etree._namespace_map[k]
2573 etree._namespace_map[uri] = prefix
2574
57f7e3c6
S
2575if sys.version_info < (2, 7):
2576 # Here comes the crazy part: In 2.6, if the xpath is a unicode,
2577 # .//node does not match if a node is a direct child of . !
2578 def compat_xpath(xpath):
2579 if isinstance(xpath, compat_str):
2580 xpath = xpath.encode('ascii')
2581 return xpath
2582else:
2583 compat_xpath = lambda xpath: xpath
2584
8c25f81b
PH
2585try:
2586 from urllib.parse import parse_qs as compat_parse_qs
5f6a1245 2587except ImportError: # Python 2
8c25f81b
PH
2588 # HACK: The following is the correct parse_qs implementation from cpython 3's stdlib.
2589 # Python 2's version is apparently totally broken
2590
2591 def _parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2592 encoding='utf-8', errors='replace'):
8f9312c3 2593 qs, _coerce_result = qs, compat_str
8c25f81b
PH
2594 pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
2595 r = []
2596 for name_value in pairs:
2597 if not name_value and not strict_parsing:
2598 continue
2599 nv = name_value.split('=', 1)
2600 if len(nv) != 2:
2601 if strict_parsing:
611c1dd9 2602 raise ValueError('bad query field: %r' % (name_value,))
8c25f81b
PH
2603 # Handle case of a control-name with no equal sign
2604 if keep_blank_values:
2605 nv.append('')
2606 else:
2607 continue
2608 if len(nv[1]) or keep_blank_values:
2609 name = nv[0].replace('+', ' ')
2610 name = compat_urllib_parse_unquote(
2611 name, encoding=encoding, errors=errors)
2612 name = _coerce_result(name)
2613 value = nv[1].replace('+', ' ')
2614 value = compat_urllib_parse_unquote(
2615 value, encoding=encoding, errors=errors)
2616 value = _coerce_result(value)
2617 r.append((name, value))
2618 return r
2619
2620 def compat_parse_qs(qs, keep_blank_values=False, strict_parsing=False,
9e1a5b84 2621 encoding='utf-8', errors='replace'):
8c25f81b
PH
2622 parsed_result = {}
2623 pairs = _parse_qsl(qs, keep_blank_values, strict_parsing,
9e1a5b84 2624 encoding=encoding, errors=errors)
8c25f81b
PH
2625 for name, value in pairs:
2626 if name in parsed_result:
2627 parsed_result[name].append(value)
2628 else:
2629 parsed_result[name] = [value]
2630 return parsed_result
2631
b08e235f
S
2632
2633compat_os_name = os._name if os.name == 'java' else os.name
2634
2635
2636if compat_os_name == 'nt':
702ccf2d 2637 def compat_shlex_quote(s):
b08e235f
S
2638 return s if re.match(r'^[-_\w./]+$', s) else '"%s"' % s.replace('"', '\\"')
2639else:
2640 try:
2641 from shlex import quote as compat_shlex_quote
2642 except ImportError: # Python < 3.3
2643 def compat_shlex_quote(s):
2644 if re.match(r'^[-_\w./]+$', s):
2645 return s
2646 else:
2647 return "'" + s.replace("'", "'\"'\"'") + "'"
8c25f81b
PH
2648
2649
dfe5fa49 2650try:
ec351872 2651 args = shlex.split('中文')
3089bc74
S
2652 assert (isinstance(args, list)
2653 and isinstance(args[0], compat_str)
2654 and args[0] == '中文')
51f579b6 2655 compat_shlex_split = shlex.split
ec351872 2656except (AssertionError, UnicodeEncodeError):
51f579b6
S
2657 # Working around shlex issue with unicode strings on some python 2
2658 # versions (see http://bugs.python.org/issue1548891)
2659 def compat_shlex_split(s, comments=False, posix=True):
953fed28 2660 if isinstance(s, compat_str):
51f579b6 2661 s = s.encode('utf-8')
dfe5fa49 2662 return list(map(lambda s: s.decode('utf-8'), shlex.split(s, comments, posix)))
51f579b6
S
2663
2664
8c25f81b 2665def compat_ord(c):
5f6a1245
JW
2666 if type(c) is int:
2667 return c
2668 else:
2669 return ord(c)
8c25f81b
PH
2670
2671
2672if sys.version_info >= (3, 0):
2673 compat_getenv = os.getenv
2674 compat_expanduser = os.path.expanduser
fe40f9ee
S
2675
2676 def compat_setenv(key, value, env=os.environ):
2677 env[key] = value
8c25f81b
PH
2678else:
2679 # Environment variables should be decoded with filesystem encoding.
2680 # Otherwise it will fail if any non-ASCII characters present (see #3854 #3217 #2918)
2681
2682 def compat_getenv(key, default=None):
2683 from .utils import get_filesystem_encoding
2684 env = os.getenv(key, default)
2685 if env:
2686 env = env.decode(get_filesystem_encoding())
2687 return env
2688
fe40f9ee
S
2689 def compat_setenv(key, value, env=os.environ):
2690 def encode(v):
2691 from .utils import get_filesystem_encoding
2692 return v.encode(get_filesystem_encoding()) if isinstance(v, compat_str) else v
2693 env[encode(key)] = encode(value)
2694
8c25f81b
PH
2695 # HACK: The default implementations of os.path.expanduser from cpython do not decode
2696 # environment variables with filesystem encoding. We will work around this by
2697 # providing adjusted implementations.
2698 # The following are os.path.expanduser implementations from cpython 2.7.8 stdlib
2699 # for different platforms with correct environment variables decoding.
2700
e9c0cdd3 2701 if compat_os_name == 'posix':
8c25f81b
PH
2702 def compat_expanduser(path):
2703 """Expand ~ and ~user constructions. If user or $HOME is unknown,
2704 do nothing."""
2705 if not path.startswith('~'):
2706 return path
2707 i = path.find('/', 1)
2708 if i < 0:
2709 i = len(path)
2710 if i == 1:
2711 if 'HOME' not in os.environ:
2712 import pwd
2713 userhome = pwd.getpwuid(os.getuid()).pw_dir
2714 else:
2715 userhome = compat_getenv('HOME')
2716 else:
2717 import pwd
2718 try:
2719 pwent = pwd.getpwnam(path[1:i])
2720 except KeyError:
2721 return path
2722 userhome = pwent.pw_dir
2723 userhome = userhome.rstrip('/')
2724 return (userhome + path[i:]) or '/'
40fcba5e 2725 elif compat_os_name in ('nt', 'ce'):
8c25f81b
PH
2726 def compat_expanduser(path):
2727 """Expand ~ and ~user constructs.
2728
2729 If user or $HOME is unknown, do nothing."""
2730 if path[:1] != '~':
2731 return path
2732 i, n = 1, len(path)
2733 while i < n and path[i] not in '/\\':
2734 i = i + 1
2735
2736 if 'HOME' in os.environ:
2737 userhome = compat_getenv('HOME')
2738 elif 'USERPROFILE' in os.environ:
2739 userhome = compat_getenv('USERPROFILE')
83e865a3 2740 elif 'HOMEPATH' not in os.environ:
8c25f81b
PH
2741 return path
2742 else:
2743 try:
2744 drive = compat_getenv('HOMEDRIVE')
2745 except KeyError:
2746 drive = ''
2747 userhome = os.path.join(drive, compat_getenv('HOMEPATH'))
2748
5f6a1245 2749 if i != 1: # ~user
8c25f81b
PH
2750 userhome = os.path.join(os.path.dirname(userhome), path[1:i])
2751
2752 return userhome + path[i:]
2753 else:
2754 compat_expanduser = os.path.expanduser
2755
2756
82fea5b4
S
2757if compat_os_name == 'nt' and sys.version_info < (3, 8):
2758 # os.path.realpath on Windows does not follow symbolic links
2759 # prior to Python 3.8 (see https://bugs.python.org/issue9949)
2760 def compat_realpath(path):
2761 while os.path.islink(path):
2762 path = os.path.abspath(os.readlink(path))
2763 return path
2764else:
2765 compat_realpath = os.path.realpath
2766
2767
8c25f81b
PH
2768if sys.version_info < (3, 0):
2769 def compat_print(s):
2770 from .utils import preferredencoding
2771 print(s.encode(preferredencoding(), 'xmlcharrefreplace'))
2772else:
2773 def compat_print(s):
b061ea6e 2774 assert isinstance(s, compat_str)
8c25f81b
PH
2775 print(s)
2776
2777
8c25f81b
PH
2778if sys.version_info < (3, 0) and sys.platform == 'win32':
2779 def compat_getpass(prompt, *args, **kwargs):
2780 if isinstance(prompt, compat_str):
baa70803 2781 from .utils import preferredencoding
8c25f81b
PH
2782 prompt = prompt.encode(preferredencoding())
2783 return getpass.getpass(prompt, *args, **kwargs)
2784else:
2785 compat_getpass = getpass.getpass
2786
1ae6c83b
S
2787try:
2788 compat_input = raw_input
2789except NameError: # Python 3
2790 compat_input = input
2791
614db89a 2792# Python < 2.6.5 require kwargs to be bytes
c7b0add8 2793try:
c6973bd4
PH
2794 def _testfunc(x):
2795 pass
2796 _testfunc(**{'x': 0})
c7b0add8
PH
2797except TypeError:
2798 def compat_kwargs(kwargs):
2799 return dict((bytes(k), v) for k, v in kwargs.items())
2800else:
2801 compat_kwargs = lambda kwargs: kwargs
8c25f81b 2802
e07e9313 2803
83121729
S
2804try:
2805 compat_numeric_types = (int, float, long, complex)
2806except NameError: # Python 3
2807 compat_numeric_types = (int, float, complex)
28572a1a
S
2808
2809
075a13d3
S
2810try:
2811 compat_integer_types = (int, long)
2812except NameError: # Python 3
2813 compat_integer_types = (int, )
2814
2815
be4a824d
PH
2816if sys.version_info < (2, 7):
2817 def compat_socket_create_connection(address, timeout, source_address=None):
2818 host, port = address
2819 err = None
2820 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
2821 af, socktype, proto, canonname, sa = res
2822 sock = None
2823 try:
2824 sock = socket.socket(af, socktype, proto)
2825 sock.settimeout(timeout)
2826 if source_address:
2827 sock.bind(source_address)
2828 sock.connect(sa)
2829 return sock
2830 except socket.error as _:
2831 err = _
2832 if sock is not None:
2833 sock.close()
2834 if err is not None:
2835 raise err
2836 else:
611c1dd9 2837 raise socket.error('getaddrinfo returns an empty list')
be4a824d
PH
2838else:
2839 compat_socket_create_connection = socket.create_connection
2840
2841
067aa17e 2842# Fix https://github.com/ytdl-org/youtube-dl/issues/4223
e07e9313
PH
2843# See http://bugs.python.org/issue9161 for what is broken
2844def workaround_optparse_bug9161():
07e378fa
PH
2845 op = optparse.OptionParser()
2846 og = optparse.OptionGroup(op, 'foo')
e07e9313 2847 try:
07e378fa 2848 og.add_option('-t')
b244b5c3 2849 except TypeError:
e07e9313
PH
2850 real_add_option = optparse.OptionGroup.add_option
2851
2852 def _compat_add_option(self, *args, **kwargs):
2853 enc = lambda v: (
2854 v.encode('ascii', 'replace') if isinstance(v, compat_str)
2855 else v)
2856 bargs = [enc(a) for a in args]
2857 bkwargs = dict(
2858 (k, enc(v)) for k, v in kwargs.items())
2859 return real_add_option(self, *bargs, **bkwargs)
2860 optparse.OptionGroup.add_option = _compat_add_option
2861
582be358 2862
003c69a8
JMF
2863if hasattr(shutil, 'get_terminal_size'): # Python >= 3.3
2864 compat_get_terminal_size = shutil.get_terminal_size
2865else:
2866 _terminal_size = collections.namedtuple('terminal_size', ['columns', 'lines'])
2867
13118a50 2868 def compat_get_terminal_size(fallback=(80, 24)):
4810c48d 2869 columns = compat_getenv('COLUMNS')
003c69a8
JMF
2870 if columns:
2871 columns = int(columns)
2872 else:
2873 columns = None
4810c48d 2874 lines = compat_getenv('LINES')
003c69a8
JMF
2875 if lines:
2876 lines = int(lines)
2877 else:
2878 lines = None
2879
4810c48d 2880 if columns is None or lines is None or columns <= 0 or lines <= 0:
13118a50
YCH
2881 try:
2882 sp = subprocess.Popen(
2883 ['stty', 'size'],
2884 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2885 out, err = sp.communicate()
f2dbc540 2886 _lines, _columns = map(int, out.split())
13118a50
YCH
2887 except Exception:
2888 _columns, _lines = _terminal_size(*fallback)
2889
4810c48d 2890 if columns is None or columns <= 0:
13118a50 2891 columns = _columns
4810c48d 2892 if lines is None or lines <= 0:
13118a50 2893 lines = _lines
003c69a8
JMF
2894 return _terminal_size(columns, lines)
2895
a0e060ac
YCH
2896try:
2897 itertools.count(start=0, step=1)
2898 compat_itertools_count = itertools.count
2899except TypeError: # Python 2.6
2900 def compat_itertools_count(start=0, step=1):
2901 n = start
2902 while True:
2903 yield n
2904 n += step
e07e9313 2905
67134eab
JMF
2906if sys.version_info >= (3, 0):
2907 from tokenize import tokenize as compat_tokenize_tokenize
2908else:
2909 from tokenize import generate_tokens as compat_tokenize_tokenize
e07e9313 2910
dab0daee
YCH
2911
2912try:
2913 struct.pack('!I', 0)
2914except TypeError:
2915 # In Python 2.6 and 2.7.x < 2.7.7, struct requires a bytes argument
2916 # See https://bugs.python.org/issue19099
edaa23f8 2917 def compat_struct_pack(spec, *args):
dab0daee
YCH
2918 if isinstance(spec, compat_str):
2919 spec = spec.encode('ascii')
2920 return struct.pack(spec, *args)
2921
edaa23f8 2922 def compat_struct_unpack(spec, *args):
dab0daee
YCH
2923 if isinstance(spec, compat_str):
2924 spec = spec.encode('ascii')
2925 return struct.unpack(spec, *args)
65220c3b
S
2926
2927 class compat_Struct(struct.Struct):
2928 def __init__(self, fmt):
2929 if isinstance(fmt, compat_str):
2930 fmt = fmt.encode('ascii')
2931 super(compat_Struct, self).__init__(fmt)
dab0daee 2932else:
edaa23f8
YCH
2933 compat_struct_pack = struct.pack
2934 compat_struct_unpack = struct.unpack
65220c3b
S
2935 if platform.python_implementation() == 'IronPython' and sys.version_info < (2, 7, 8):
2936 class compat_Struct(struct.Struct):
2937 def unpack(self, string):
9a340af3
S
2938 if not isinstance(string, buffer): # noqa: F821
2939 string = buffer(string) # noqa: F821
65220c3b
S
2940 return super(compat_Struct, self).unpack(string)
2941 else:
2942 compat_Struct = struct.Struct
2943
dab0daee 2944
2384f5a6
TI
2945try:
2946 from future_builtins import zip as compat_zip
2947except ImportError: # not 2.6+ or is 3.x
2948 try:
2949 from itertools import izip as compat_zip # < 2.5 or 3.x
2950 except ImportError:
2951 compat_zip = zip
dab0daee 2952
f206126d
S
2953
2954if sys.version_info < (3, 3):
2955 def compat_b64decode(s, *args, **kwargs):
2956 if isinstance(s, compat_str):
2957 s = s.encode('ascii')
2958 return base64.b64decode(s, *args, **kwargs)
2959else:
2960 compat_b64decode = base64.b64decode
2961
2962
d7cd9a9e
PH
2963if platform.python_implementation() == 'PyPy' and sys.pypy_version_info < (5, 4, 0):
2964 # PyPy2 prior to version 5.4.0 expects byte strings as Windows function
2965 # names, see the original PyPy issue [1] and the youtube-dl one [2].
2966 # 1. https://bitbucket.org/pypy/pypy/issues/2360/windows-ctypescdll-typeerror-function-name
067aa17e 2967 # 2. https://github.com/ytdl-org/youtube-dl/pull/4392
d7cd9a9e
PH
2968 def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2969 real = ctypes.WINFUNCTYPE(*args, **kwargs)
2970
2971 def resf(tpl, *args, **kwargs):
2972 funcname, dll = tpl
2973 return real((str(funcname), dll), *args, **kwargs)
2974
2975 return resf
2976else:
2977 def compat_ctypes_WINFUNCTYPE(*args, **kwargs):
2978 return ctypes.WINFUNCTYPE(*args, **kwargs)
2979
2980
8c25f81b 2981__all__ = [
b081f53b 2982 'compat_HTMLParseError',
8bb56eee 2983 'compat_HTMLParser',
8c25f81b 2984 'compat_HTTPError',
65220c3b 2985 'compat_Struct',
f206126d 2986 'compat_b64decode',
0196149c 2987 'compat_basestring',
8c25f81b
PH
2988 'compat_chr',
2989 'compat_cookiejar',
799207e8 2990 'compat_cookies',
d7cd9a9e 2991 'compat_ctypes_WINFUNCTYPE',
399f7687 2992 'compat_etree_Element',
36e6f62c 2993 'compat_etree_fromstring',
da162c11 2994 'compat_etree_register_namespace',
8c25f81b 2995 'compat_expanduser',
003c69a8 2996 'compat_get_terminal_size',
8c25f81b
PH
2997 'compat_getenv',
2998 'compat_getpass',
2999 'compat_html_entities',
9631a94f 3000 'compat_html_entities_html5',
8c25f81b 3001 'compat_http_client',
83fda3c0 3002 'compat_http_server',
e67f6880 3003 'compat_input',
075a13d3 3004 'compat_integer_types',
a0e060ac 3005 'compat_itertools_count',
c7b0add8 3006 'compat_kwargs',
28572a1a 3007 'compat_numeric_types',
8c25f81b 3008 'compat_ord',
e9c0cdd3 3009 'compat_os_name',
8c25f81b
PH
3010 'compat_parse_qs',
3011 'compat_print',
fe40f9ee 3012 'compat_setenv',
702ccf2d 3013 'compat_shlex_quote',
51f579b6 3014 'compat_shlex_split',
be4a824d 3015 'compat_socket_create_connection',
987493ae 3016 'compat_str',
edaa23f8
YCH
3017 'compat_struct_pack',
3018 'compat_struct_unpack',
8c25f81b 3019 'compat_subprocess_get_DEVNULL',
67134eab 3020 'compat_tokenize_tokenize',
8c25f81b
PH
3021 'compat_urllib_error',
3022 'compat_urllib_parse',
3023 'compat_urllib_parse_unquote',
aa99aa4e 3024 'compat_urllib_parse_unquote_plus',
9fefc886 3025 'compat_urllib_parse_unquote_to_bytes',
15707c7e 3026 'compat_urllib_parse_urlencode',
8c25f81b
PH
3027 'compat_urllib_parse_urlparse',
3028 'compat_urllib_request',
0a67a363
YCH
3029 'compat_urllib_request_DataHandler',
3030 'compat_urllib_response',
8c25f81b
PH
3031 'compat_urlparse',
3032 'compat_urlretrieve',
3033 'compat_xml_parse_error',
57f7e3c6 3034 'compat_xpath',
2384f5a6 3035 'compat_zip',
e07e9313 3036 'workaround_optparse_bug9161',
8c25f81b 3037]