U
    $Pfc                    @   s  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Zd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z d dl!Z"d dl#Z#ddl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZBmCZC dd ZDeEeFdZGd	d
 ZHeH dddddZIddiZJeK ZLddddddddddddgZMeMddd d!d"d#d$d%d&d'd(d)gd*ZNd+ZOePeQd,eRd-d.gd/d0gd1d2d3gd4d5gd6d7gd8d9gd:ZSd;ZTeUeTZVeVWd<d=d>d?d@dAg eUeTZXeXWdBdCdDdEdFg dGZYdHZZdIdJ Z[dKdL Z\ej]dMkrddNdOZ^nddPdOZ^dQdR Z_ddSeLfdTdUZ`ddSeLfdVdWZaddSeLfdXdYZbdZd[ Zcd\d] Zddd_d`Zedadb ZfddcddZgG dedf dfe&Zhdgdh Zididj Zjdkdl Zkdmdn ZlddodpZmdqdr Zndsdt Zodudv Zpdwdx Zqdydz Zrd{d| Zsd}d~ Ztdd ZudddZvdddZwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}G dd de~ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdd Zdd ZG dd de>jZdd ZG dd de>jZG dd de*jZG dd de>jZG dd de>jZdd ZdddZdddZdddÄZdddńZdddȄZdddʄZdd̄ Zdd΄ ZG ddЄ deKZdd҄ ZddԄ ZdddքZdd؄ Zddڄ Zejdkrd dlZd dlZG dd݄ dejZejjZejZejjejjejjejjejjeege_ejje_ejZejjejjejjejjeege_ejje_dZdZdd Zdd ZnHzd dlZdd Zdd ZW n* ek
r   dZdd Zdd ZY nX G dd deKZdd Zdd Zdd ZdddZdd Zdd Zdd Zdd Zdd Zdd ZȐdΐd dZɐdd Zʐdd Zːdd Z̐dd	 Z͐d
d Zΐdd Zϐdd ZАdd Zѐdd ZG dd de>jӃZG dd de>jӃZՐdϐddZ֐dАddZאdd ZؐdѐddZِdҐd d!ZڐdӐd"d#Zېd$d% Zܐd&d' ZݐdԐd(d)ZސdՐd*d+Zg fd,d-Zd.gdd/fd0d1Zd֐d2d3ZG d4d5 d5eKZG d6d7 d7eZG d8d9 d9eZd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG Zddi i fdHdIZdJdK ZdאdLdMZdؐdNdOZdِdPdQZdRdS Ze[ dTfdUdVZd dWdXdYdZd[Zd d\d d d]d^d_Zd`da Zdbdc Zddde Zdfdg ZdhZdidj Zdkdl ZdڐdmdnZdodp Zdqdr Zdsdt Z dudv Zdwdx Zdydz Zd{d| Zd}d~ Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdېddZdܐddZg fddZG dd deKZG dd deKZG dd deKZG dd de>jZdݐddZdd Zdd Zdd ZdސddZdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dS (      )unicode_literalsN   )compat_HTMLParseErrorcompat_HTMLParsercompat_HTTPErrorcompat_basestring
compat_chrcompat_cookiejarcompat_ctypes_WINFUNCTYPEcompat_etree_fromstringcompat_expandusercompat_html_entitiescompat_html_entities_html5compat_http_clientcompat_integer_typescompat_kwargscompat_os_namecompat_parse_qscompat_shlex_quote
compat_strcompat_struct_packcompat_struct_unpackcompat_urllib_errorcompat_urllib_parsecompat_urllib_parse_urlencodecompat_urllib_parse_urlparse compat_urllib_parse_unquote_pluscompat_urllib_requestcompat_urlparsecompat_xpath)	ProxyTypesockssocketc                  C   s$   dD ]} | t jkrt j|  qd S )Nsockssocks4socks4asocks5)r   uses_netlocappend)scheme r*   4/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/utils.pyregister_socks_protocolsL   s    
r,    c                  C   s   d} d}| t | S )NzhMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36((  z74.0.3729.129z76.0.3780.3z76.0.3780.2z74.0.3729.128z76.0.3780.1z76.0.3780.0z75.0.3770.15z74.0.3729.127z74.0.3729.126z76.0.3779.1z76.0.3779.0z75.0.3770.14z74.0.3729.125z76.0.3778.1z76.0.3778.0z75.0.3770.13z74.0.3729.124z74.0.3729.123z73.0.3683.121z76.0.3777.1z76.0.3777.0z75.0.3770.12z74.0.3729.122z76.0.3776.4z75.0.3770.11z74.0.3729.121z76.0.3776.3z76.0.3776.2z73.0.3683.120z74.0.3729.120z74.0.3729.119z74.0.3729.118z76.0.3776.1z76.0.3776.0z76.0.3775.5z75.0.3770.10z74.0.3729.117z76.0.3775.4z76.0.3775.3z74.0.3729.116z75.0.3770.9z76.0.3775.2z76.0.3775.1z76.0.3775.0z75.0.3770.8z74.0.3729.115z74.0.3729.114z76.0.3774.1z76.0.3774.0z75.0.3770.7z74.0.3729.113z74.0.3729.112z74.0.3729.111z76.0.3773.1z76.0.3773.0z75.0.3770.6z74.0.3729.110z74.0.3729.109z76.0.3772.1z76.0.3772.0z75.0.3770.5z74.0.3729.108z74.0.3729.107z76.0.3771.1z76.0.3771.0z75.0.3770.4z74.0.3729.106z74.0.3729.105z75.0.3770.3z74.0.3729.104z74.0.3729.103z74.0.3729.102z75.0.3770.2z74.0.3729.101z75.0.3770.1z75.0.3770.0z74.0.3729.100z75.0.3769.5z75.0.3769.4z74.0.3729.99z75.0.3769.3z75.0.3769.2z75.0.3768.6z74.0.3729.98z75.0.3769.1z75.0.3769.0z74.0.3729.97z73.0.3683.119z73.0.3683.118z74.0.3729.96z75.0.3768.5z75.0.3768.4z75.0.3768.3z75.0.3768.2z74.0.3729.95z74.0.3729.94z75.0.3768.1z75.0.3768.0z74.0.3729.93z74.0.3729.92z73.0.3683.117z74.0.3729.91z75.0.3766.3z74.0.3729.90z75.0.3767.2z75.0.3767.1z75.0.3767.0z74.0.3729.89z73.0.3683.116z75.0.3766.2z74.0.3729.88z75.0.3766.1z75.0.3766.0z74.0.3729.87z73.0.3683.115z74.0.3729.86z75.0.3765.1z75.0.3765.0z74.0.3729.85z73.0.3683.114z74.0.3729.84z75.0.3764.1z75.0.3764.0z74.0.3729.83z73.0.3683.113z75.0.3763.2z75.0.3761.4z74.0.3729.82z75.0.3763.1z75.0.3763.0z74.0.3729.81z73.0.3683.112z75.0.3762.1z75.0.3762.0z74.0.3729.80z75.0.3761.3z74.0.3729.79z73.0.3683.111z75.0.3761.2z74.0.3729.78z74.0.3729.77z75.0.3761.1z75.0.3761.0z73.0.3683.110z74.0.3729.76z74.0.3729.75z75.0.3760.0z74.0.3729.74z75.0.3759.8z75.0.3759.7z75.0.3759.6z74.0.3729.73z75.0.3759.5z74.0.3729.72z73.0.3683.109z75.0.3759.4z75.0.3759.3z74.0.3729.71z75.0.3759.2z74.0.3729.70z73.0.3683.108z74.0.3729.69z75.0.3759.1z75.0.3759.0z74.0.3729.68z73.0.3683.107z74.0.3729.67z75.0.3758.1z75.0.3758.0z74.0.3729.66z73.0.3683.106z74.0.3729.65z75.0.3757.1z75.0.3757.0z74.0.3729.64z73.0.3683.105z74.0.3729.63z75.0.3756.1z75.0.3756.0z74.0.3729.62z73.0.3683.104z75.0.3755.3z75.0.3755.2z73.0.3683.103z75.0.3755.1z75.0.3755.0z74.0.3729.61z73.0.3683.102z74.0.3729.60z75.0.3754.2z74.0.3729.59z75.0.3753.4z74.0.3729.58z75.0.3754.1z75.0.3754.0z74.0.3729.57z73.0.3683.101z75.0.3753.3z75.0.3752.2z75.0.3753.2z74.0.3729.56z75.0.3753.1z75.0.3753.0z74.0.3729.55z73.0.3683.100z74.0.3729.54z75.0.3752.1z75.0.3752.0z74.0.3729.53z73.0.3683.99z74.0.3729.52z75.0.3751.1z75.0.3751.0z74.0.3729.51z73.0.3683.98z74.0.3729.50z75.0.3750.0z74.0.3729.49z74.0.3729.48z74.0.3729.47z75.0.3749.3z74.0.3729.46z73.0.3683.97z75.0.3749.2z74.0.3729.45z75.0.3749.1z75.0.3749.0z74.0.3729.44z73.0.3683.96z74.0.3729.43z74.0.3729.42z75.0.3748.1z75.0.3748.0z74.0.3729.41z75.0.3747.1z73.0.3683.95z75.0.3746.4z74.0.3729.40z74.0.3729.39z75.0.3747.0z75.0.3746.3z75.0.3746.2z74.0.3729.38z75.0.3746.1z75.0.3746.0z74.0.3729.37z73.0.3683.94z75.0.3745.5z75.0.3745.4z75.0.3745.3z75.0.3745.2z74.0.3729.36z75.0.3745.1z75.0.3745.0z75.0.3744.2z74.0.3729.35z73.0.3683.93z74.0.3729.34z75.0.3744.1z75.0.3744.0z74.0.3729.33z73.0.3683.92z74.0.3729.32z74.0.3729.31z73.0.3683.91z75.0.3741.2z75.0.3740.5z74.0.3729.30z75.0.3741.1z75.0.3741.0z74.0.3729.29z75.0.3740.4z73.0.3683.90z74.0.3729.28z75.0.3740.3z73.0.3683.89z75.0.3740.2z74.0.3729.27z75.0.3740.1z75.0.3740.0z74.0.3729.26z73.0.3683.88z73.0.3683.87z74.0.3729.25z75.0.3739.1z75.0.3739.0z73.0.3683.86z74.0.3729.24z73.0.3683.85z75.0.3738.4z75.0.3738.3z75.0.3738.2z75.0.3738.1z75.0.3738.0z74.0.3729.23z73.0.3683.84z74.0.3729.22z74.0.3729.21z75.0.3737.1z75.0.3737.0z74.0.3729.20z73.0.3683.83z74.0.3729.19z75.0.3736.1z75.0.3736.0z74.0.3729.18z73.0.3683.82z74.0.3729.17z75.0.3735.1z75.0.3735.0z74.0.3729.16z73.0.3683.81z75.0.3734.1z75.0.3734.0z74.0.3729.15z73.0.3683.80z74.0.3729.14z75.0.3733.1z75.0.3733.0z75.0.3732.1z74.0.3729.13z74.0.3729.12z73.0.3683.79z74.0.3729.11z75.0.3732.0z74.0.3729.10z73.0.3683.78z74.0.3729.9z74.0.3729.8z74.0.3729.7z75.0.3731.3z75.0.3731.2z75.0.3731.0z74.0.3729.6z73.0.3683.77z73.0.3683.76z75.0.3730.5z75.0.3730.4z73.0.3683.75z74.0.3729.5z73.0.3683.74z75.0.3730.3z75.0.3730.2z74.0.3729.4z73.0.3683.73z73.0.3683.72z75.0.3730.1z75.0.3730.0z74.0.3729.3z73.0.3683.71z74.0.3729.2z73.0.3683.70z74.0.3729.1z74.0.3729.0z74.0.3726.4z73.0.3683.69z74.0.3726.3z74.0.3728.0z74.0.3726.2z73.0.3683.68z74.0.3726.1z74.0.3726.0z74.0.3725.4z73.0.3683.67z73.0.3683.66z74.0.3725.3z74.0.3725.2z74.0.3725.1z74.0.3724.8z74.0.3725.0z73.0.3683.65z74.0.3724.7z74.0.3724.6z74.0.3724.5z74.0.3724.4z74.0.3724.3z74.0.3724.2z74.0.3724.1z74.0.3724.0z73.0.3683.64z74.0.3723.1z74.0.3723.0z73.0.3683.63z74.0.3722.1z74.0.3722.0z73.0.3683.62z74.0.3718.9z74.0.3702.3z74.0.3721.3z74.0.3721.2z74.0.3721.1z74.0.3721.0z74.0.3720.6z73.0.3683.61z72.0.3626.122z73.0.3683.60z74.0.3720.5z72.0.3626.121z74.0.3718.8z74.0.3720.4z74.0.3720.3z74.0.3718.7z74.0.3720.2z74.0.3720.1z74.0.3720.0z74.0.3718.6z74.0.3719.5z73.0.3683.59z74.0.3718.5z74.0.3718.4z74.0.3719.4z74.0.3719.3z74.0.3719.2z74.0.3719.1z73.0.3683.58z74.0.3719.0z73.0.3683.57z73.0.3683.56z74.0.3718.3z73.0.3683.55z74.0.3718.2z74.0.3718.1z74.0.3718.0z73.0.3683.54z74.0.3717.2z73.0.3683.53z74.0.3717.1z74.0.3717.0z73.0.3683.52z74.0.3716.1z74.0.3716.0z73.0.3683.51z74.0.3715.1z74.0.3715.0z73.0.3683.50z74.0.3711.2z74.0.3714.2z74.0.3713.3z74.0.3714.1z74.0.3714.0z73.0.3683.49z74.0.3713.1z74.0.3713.0z72.0.3626.120z73.0.3683.48z74.0.3712.2z74.0.3712.1z74.0.3712.0z73.0.3683.47z72.0.3626.119z73.0.3683.46z74.0.3710.2z72.0.3626.118z74.0.3711.1z74.0.3711.0z73.0.3683.45z72.0.3626.117z74.0.3710.1z74.0.3710.0z73.0.3683.44z72.0.3626.116z74.0.3709.1z74.0.3709.0z74.0.3704.9z73.0.3683.43z72.0.3626.115z74.0.3704.8z74.0.3704.7z74.0.3708.0z74.0.3706.7z74.0.3704.6z73.0.3683.42z72.0.3626.114z74.0.3706.6z72.0.3626.113z74.0.3704.5z74.0.3706.5z74.0.3706.4z74.0.3706.3z74.0.3706.2z74.0.3706.1z74.0.3706.0z73.0.3683.41z72.0.3626.112z74.0.3705.1z74.0.3705.0z73.0.3683.40z72.0.3626.111z73.0.3683.39z74.0.3704.4z73.0.3683.38z74.0.3704.3z74.0.3704.2z74.0.3704.1z74.0.3704.0z73.0.3683.37z72.0.3626.110z72.0.3626.109z74.0.3703.3z74.0.3703.2z73.0.3683.36z74.0.3703.1z74.0.3703.0z73.0.3683.35z72.0.3626.108z74.0.3702.2z74.0.3699.3z74.0.3702.1z74.0.3702.0z73.0.3683.34z72.0.3626.107z73.0.3683.33z74.0.3701.1z74.0.3701.0z73.0.3683.32z73.0.3683.31z72.0.3626.105z74.0.3700.1z74.0.3700.0z73.0.3683.29z72.0.3626.103z74.0.3699.2z74.0.3699.1z74.0.3699.0z73.0.3683.28z72.0.3626.102z73.0.3683.27z73.0.3683.26z74.0.3698.0z74.0.3696.2z72.0.3626.101z73.0.3683.25z74.0.3696.1z74.0.3696.0z74.0.3694.8z72.0.3626.100z74.0.3694.7z74.0.3694.6z74.0.3694.5z74.0.3694.4z72.0.3626.99z72.0.3626.98z74.0.3694.3z73.0.3683.24z72.0.3626.97z72.0.3626.96z72.0.3626.95z73.0.3683.23z72.0.3626.94z73.0.3683.22z73.0.3683.21z72.0.3626.93z74.0.3694.2z72.0.3626.92z74.0.3694.1z74.0.3694.0z74.0.3693.6z73.0.3683.20z72.0.3626.91z74.0.3693.5z74.0.3693.4z74.0.3693.3z74.0.3693.2z73.0.3683.19z74.0.3693.1z74.0.3693.0z73.0.3683.18z72.0.3626.90z74.0.3692.1z74.0.3692.0z73.0.3683.17z72.0.3626.89z74.0.3687.3z74.0.3691.1z74.0.3691.0z73.0.3683.16z72.0.3626.88z72.0.3626.87z73.0.3683.15z74.0.3690.1z74.0.3690.0z73.0.3683.14z72.0.3626.86z73.0.3683.13z73.0.3683.12z74.0.3689.1z74.0.3689.0z73.0.3683.11z72.0.3626.85z73.0.3683.10z72.0.3626.84z73.0.3683.9z74.0.3688.1z74.0.3688.0z73.0.3683.8z72.0.3626.83z74.0.3687.2z74.0.3687.1z74.0.3687.0z73.0.3683.7z72.0.3626.82z74.0.3686.4z72.0.3626.81z74.0.3686.3z74.0.3686.2z74.0.3686.1z74.0.3686.0z73.0.3683.6z72.0.3626.80z74.0.3685.1z74.0.3685.0z73.0.3683.5z72.0.3626.79z74.0.3684.1z74.0.3684.0z73.0.3683.4z72.0.3626.78z72.0.3626.77z73.0.3683.3z73.0.3683.2z72.0.3626.76z73.0.3683.1z73.0.3683.0z72.0.3626.75z71.0.3578.141z73.0.3682.1z73.0.3682.0z72.0.3626.74z71.0.3578.140z73.0.3681.4z73.0.3681.3z73.0.3681.2z73.0.3681.1z73.0.3681.0z72.0.3626.73z71.0.3578.139z72.0.3626.72z72.0.3626.71z73.0.3680.1z73.0.3680.0z72.0.3626.70z71.0.3578.138z73.0.3678.2z73.0.3679.1z73.0.3679.0z72.0.3626.69z71.0.3578.137z73.0.3678.1z73.0.3678.0z71.0.3578.136z73.0.3677.1z73.0.3677.0z72.0.3626.68z72.0.3626.67z71.0.3578.135z73.0.3676.1z73.0.3676.0z73.0.3674.2z72.0.3626.66z71.0.3578.134z73.0.3674.1z73.0.3674.0z72.0.3626.65z71.0.3578.133z73.0.3673.2z73.0.3673.1z73.0.3673.0z72.0.3626.64z71.0.3578.132z72.0.3626.63z72.0.3626.62z72.0.3626.61z72.0.3626.60z73.0.3672.1z73.0.3672.0z72.0.3626.59z71.0.3578.131z73.0.3671.3z73.0.3671.2z73.0.3671.1z73.0.3671.0z72.0.3626.58z71.0.3578.130z73.0.3670.1z73.0.3670.0z72.0.3626.57z71.0.3578.129z73.0.3669.1z73.0.3669.0z72.0.3626.56z71.0.3578.128z73.0.3668.2z73.0.3668.1z73.0.3668.0z72.0.3626.55z71.0.3578.127z73.0.3667.2z73.0.3667.1z73.0.3667.0z72.0.3626.54z71.0.3578.126z73.0.3666.1z73.0.3666.0z72.0.3626.53z71.0.3578.125z73.0.3665.4z73.0.3665.3z72.0.3626.52z73.0.3665.2z73.0.3664.4z73.0.3665.1z73.0.3665.0z72.0.3626.51z71.0.3578.124z72.0.3626.50z73.0.3664.3z73.0.3664.2z73.0.3664.1z73.0.3664.0z73.0.3663.2z72.0.3626.49z71.0.3578.123z73.0.3663.1z73.0.3663.0z72.0.3626.48z71.0.3578.122z73.0.3662.1z73.0.3662.0z72.0.3626.47z71.0.3578.121z73.0.3661.1z72.0.3626.46z73.0.3661.0z72.0.3626.45z71.0.3578.120z73.0.3660.2z73.0.3660.1z73.0.3660.0z72.0.3626.44z71.0.3578.119z73.0.3659.1z73.0.3659.0z72.0.3626.43z71.0.3578.118z73.0.3658.1z73.0.3658.0z72.0.3626.42z71.0.3578.117z73.0.3657.1z73.0.3657.0z72.0.3626.41z71.0.3578.116z73.0.3656.1z73.0.3656.0z72.0.3626.40z71.0.3578.115z73.0.3655.1z73.0.3655.0z72.0.3626.39z71.0.3578.114z73.0.3654.1z73.0.3654.0z72.0.3626.38z71.0.3578.113z73.0.3653.1z73.0.3653.0z72.0.3626.37z71.0.3578.112z73.0.3652.1z73.0.3652.0z72.0.3626.36z71.0.3578.111z73.0.3651.1z73.0.3651.0z72.0.3626.35z71.0.3578.110z73.0.3650.1z73.0.3650.0z72.0.3626.34z71.0.3578.109z73.0.3649.1z73.0.3649.0z72.0.3626.33z71.0.3578.108z73.0.3648.2z73.0.3648.1z73.0.3648.0z72.0.3626.32z71.0.3578.107z73.0.3647.2z73.0.3647.1z73.0.3647.0z72.0.3626.31z71.0.3578.106z73.0.3635.3z73.0.3646.2z73.0.3646.1z73.0.3646.0z72.0.3626.30z71.0.3578.105z72.0.3626.29z73.0.3645.2z73.0.3645.1z73.0.3645.0z72.0.3626.28z71.0.3578.104z72.0.3626.27z72.0.3626.26z72.0.3626.25z72.0.3626.24z73.0.3644.0z73.0.3643.2z72.0.3626.23z71.0.3578.103z73.0.3643.1z73.0.3643.0z72.0.3626.22z71.0.3578.102z73.0.3642.1z73.0.3642.0z72.0.3626.21z71.0.3578.101z73.0.3641.1z73.0.3641.0z72.0.3626.20z71.0.3578.100z72.0.3626.19z73.0.3640.1z73.0.3640.0z72.0.3626.18z73.0.3639.1z71.0.3578.99z73.0.3639.0z72.0.3626.17z73.0.3638.2z72.0.3626.16z73.0.3638.1z73.0.3638.0z72.0.3626.15z71.0.3578.98z73.0.3635.2z71.0.3578.97z73.0.3637.1z73.0.3637.0z72.0.3626.14z71.0.3578.96z71.0.3578.95z72.0.3626.13z71.0.3578.94z73.0.3636.2z71.0.3578.93z73.0.3636.1z73.0.3636.0z72.0.3626.12z71.0.3578.92z73.0.3635.1z73.0.3635.0z72.0.3626.11z71.0.3578.91z73.0.3634.2z73.0.3634.1z73.0.3634.0z72.0.3626.10z71.0.3578.90z71.0.3578.89z73.0.3633.2z73.0.3633.1z73.0.3633.0z72.0.3610.4z72.0.3626.9z71.0.3578.88z73.0.3632.5z73.0.3632.4z73.0.3632.3z73.0.3632.2z73.0.3632.1z73.0.3632.0z72.0.3626.8z71.0.3578.87z73.0.3631.2z73.0.3631.1z73.0.3631.0z72.0.3626.7z71.0.3578.86z72.0.3626.6z73.0.3630.1z73.0.3630.0z72.0.3626.5z71.0.3578.85z72.0.3626.4z73.0.3628.3z73.0.3628.2z73.0.3629.1z73.0.3629.0z72.0.3626.3z71.0.3578.84z73.0.3628.1z73.0.3628.0z71.0.3578.83z73.0.3627.1z73.0.3627.0z72.0.3626.2z71.0.3578.82z71.0.3578.81z71.0.3578.80z72.0.3626.1z72.0.3626.0z71.0.3578.79z70.0.3538.124z71.0.3578.78z72.0.3623.4z72.0.3625.2z72.0.3625.1z72.0.3625.0z71.0.3578.77z70.0.3538.123z72.0.3624.4z72.0.3624.3z72.0.3624.2z71.0.3578.76z72.0.3624.1z72.0.3624.0z72.0.3623.3z71.0.3578.75z70.0.3538.122z71.0.3578.74z72.0.3623.2z72.0.3610.3z72.0.3623.1z72.0.3623.0z72.0.3622.3z72.0.3622.2z71.0.3578.73z70.0.3538.121z72.0.3622.1z72.0.3622.0z71.0.3578.72z70.0.3538.120z72.0.3621.1z72.0.3621.0z71.0.3578.71z70.0.3538.119z72.0.3620.1z72.0.3620.0z71.0.3578.70z70.0.3538.118z71.0.3578.69z72.0.3619.1z72.0.3619.0z71.0.3578.68z70.0.3538.117z71.0.3578.67z72.0.3618.1z72.0.3618.0z71.0.3578.66z70.0.3538.116z72.0.3617.1z72.0.3617.0z71.0.3578.65z70.0.3538.115z72.0.3602.3z71.0.3578.64z72.0.3616.1z72.0.3616.0z71.0.3578.63z70.0.3538.114z71.0.3578.62z72.0.3615.1z72.0.3615.0z71.0.3578.61z70.0.3538.113z72.0.3614.1z72.0.3614.0z71.0.3578.60z70.0.3538.112z72.0.3613.1z72.0.3613.0z71.0.3578.59z70.0.3538.111z72.0.3612.2z72.0.3612.1z72.0.3612.0z70.0.3538.110z71.0.3578.58z70.0.3538.109z72.0.3611.2z72.0.3611.1z72.0.3611.0z71.0.3578.57z70.0.3538.108z72.0.3610.2z71.0.3578.56z71.0.3578.55z72.0.3610.1z72.0.3610.0z71.0.3578.54z70.0.3538.107z71.0.3578.53z72.0.3609.3z71.0.3578.52z72.0.3609.2z71.0.3578.51z72.0.3608.5z72.0.3609.1z72.0.3609.0z71.0.3578.50z70.0.3538.106z72.0.3608.4z72.0.3608.3z72.0.3608.2z71.0.3578.49z72.0.3608.1z72.0.3608.0z70.0.3538.105z71.0.3578.48z72.0.3607.1z72.0.3607.0z71.0.3578.47z70.0.3538.104z72.0.3606.2z72.0.3606.1z72.0.3606.0z71.0.3578.46z70.0.3538.103z70.0.3538.102z72.0.3605.3z72.0.3605.2z72.0.3605.1z72.0.3605.0z71.0.3578.45z70.0.3538.101z71.0.3578.44z71.0.3578.43z70.0.3538.100z70.0.3538.99z71.0.3578.42z72.0.3604.1z72.0.3604.0z71.0.3578.41z70.0.3538.98z71.0.3578.40z72.0.3603.2z72.0.3603.1z72.0.3603.0z71.0.3578.39z70.0.3538.97z72.0.3602.2z71.0.3578.38z71.0.3578.37z72.0.3602.1z72.0.3602.0z71.0.3578.36z70.0.3538.96z72.0.3601.1z72.0.3601.0z71.0.3578.35z70.0.3538.95z72.0.3600.1z72.0.3600.0z71.0.3578.34z70.0.3538.94z72.0.3599.3z72.0.3599.2z72.0.3599.1z72.0.3599.0z71.0.3578.33z70.0.3538.93z72.0.3598.1z72.0.3598.0z71.0.3578.32z70.0.3538.87z72.0.3597.1z72.0.3597.0z72.0.3596.2z71.0.3578.31z70.0.3538.86z71.0.3578.30z71.0.3578.29z72.0.3596.1z72.0.3596.0z71.0.3578.28z70.0.3538.85z72.0.3595.2z72.0.3591.3z72.0.3595.1z72.0.3595.0z71.0.3578.27z70.0.3538.84z72.0.3594.1z72.0.3594.0z71.0.3578.26z70.0.3538.83z72.0.3593.2z72.0.3593.1z72.0.3593.0z71.0.3578.25z70.0.3538.82z72.0.3589.3z72.0.3592.2z72.0.3592.1z72.0.3592.0z71.0.3578.24z72.0.3589.2z70.0.3538.81z70.0.3538.80z72.0.3591.2z72.0.3591.1z72.0.3591.0z71.0.3578.23z70.0.3538.79z71.0.3578.22z72.0.3590.1z72.0.3590.0z71.0.3578.21z70.0.3538.78z70.0.3538.77z72.0.3589.1z72.0.3589.0z71.0.3578.20z70.0.3538.76z71.0.3578.19z70.0.3538.75z72.0.3588.1z72.0.3588.0z71.0.3578.18z70.0.3538.74z72.0.3586.2z72.0.3587.0z71.0.3578.17z70.0.3538.73z72.0.3586.1z72.0.3586.0z71.0.3578.16z70.0.3538.72z72.0.3585.1z72.0.3585.0z71.0.3578.15z70.0.3538.71z71.0.3578.14z72.0.3584.1z72.0.3584.0z71.0.3578.13z70.0.3538.70z72.0.3583.2z71.0.3578.12z72.0.3583.1z72.0.3583.0z71.0.3578.11z70.0.3538.69z71.0.3578.10z72.0.3582.0z72.0.3581.4z71.0.3578.9z70.0.3538.67z72.0.3581.3z72.0.3581.2z72.0.3581.1z72.0.3581.0z71.0.3578.8z70.0.3538.66z72.0.3580.1z72.0.3580.0z71.0.3578.7z70.0.3538.65z71.0.3578.6z72.0.3579.1z72.0.3579.0z71.0.3578.5z70.0.3538.64z71.0.3578.4z71.0.3578.3z71.0.3578.2z71.0.3578.1z71.0.3578.0z70.0.3538.63z69.0.3497.128z70.0.3538.62z70.0.3538.61z70.0.3538.60z70.0.3538.59z71.0.3577.1z71.0.3577.0z70.0.3538.58z69.0.3497.127z71.0.3576.2z71.0.3576.1z71.0.3576.0z70.0.3538.57z70.0.3538.56z71.0.3575.2z70.0.3538.55z69.0.3497.126z70.0.3538.54z71.0.3575.1z71.0.3575.0z71.0.3574.1z71.0.3574.0z70.0.3538.53z69.0.3497.125z70.0.3538.52z71.0.3573.1z71.0.3573.0z70.0.3538.51z69.0.3497.124z71.0.3572.1z71.0.3572.0z70.0.3538.50z69.0.3497.123z71.0.3571.2z70.0.3538.49z69.0.3497.122z71.0.3571.1z71.0.3571.0z70.0.3538.48z69.0.3497.121z71.0.3570.1z71.0.3570.0z70.0.3538.47z69.0.3497.120z71.0.3568.2z71.0.3569.1z71.0.3569.0z70.0.3538.46z69.0.3497.119z70.0.3538.45z71.0.3568.1z71.0.3568.0z70.0.3538.44z69.0.3497.118z70.0.3538.43z70.0.3538.42z71.0.3567.1z71.0.3567.0z70.0.3538.41z69.0.3497.117z71.0.3566.1z71.0.3566.0z70.0.3538.40z69.0.3497.116z71.0.3565.1z71.0.3565.0z70.0.3538.39z69.0.3497.115z71.0.3564.1z71.0.3564.0z70.0.3538.38z69.0.3497.114z71.0.3563.0z71.0.3562.2z70.0.3538.37z69.0.3497.113z70.0.3538.36z70.0.3538.35z71.0.3562.1z71.0.3562.0z70.0.3538.34z69.0.3497.112z70.0.3538.33z71.0.3561.1z71.0.3561.0z70.0.3538.32z69.0.3497.111z71.0.3559.6z71.0.3560.1z71.0.3560.0z71.0.3559.5z71.0.3559.4z70.0.3538.31z69.0.3497.110z71.0.3559.3z70.0.3538.30z69.0.3497.109z71.0.3559.2z71.0.3559.1z71.0.3559.0z70.0.3538.29z69.0.3497.108z71.0.3558.2z71.0.3558.1z71.0.3558.0z70.0.3538.28z69.0.3497.107z71.0.3557.2z71.0.3557.1z71.0.3557.0z70.0.3538.27z69.0.3497.106z71.0.3554.4z70.0.3538.26z71.0.3556.1z71.0.3556.0z70.0.3538.25z71.0.3554.3z69.0.3497.105z71.0.3554.2z70.0.3538.24z69.0.3497.104z71.0.3555.2z70.0.3538.23z71.0.3555.1z71.0.3555.0z70.0.3538.22z69.0.3497.103z71.0.3554.1z71.0.3554.0z70.0.3538.21z69.0.3497.102z71.0.3553.3z70.0.3538.20z69.0.3497.101z71.0.3553.2z69.0.3497.100z71.0.3553.1z71.0.3553.0z70.0.3538.19z69.0.3497.99z69.0.3497.98z69.0.3497.97z71.0.3552.6z71.0.3552.5z71.0.3552.4z71.0.3552.3z71.0.3552.2z71.0.3552.1z71.0.3552.0z70.0.3538.18z69.0.3497.96z71.0.3551.3z71.0.3551.2z71.0.3551.1z71.0.3551.0z70.0.3538.17z69.0.3497.95z71.0.3550.3z71.0.3550.2z71.0.3550.1z71.0.3550.0z70.0.3538.16z69.0.3497.94z71.0.3549.1z71.0.3549.0z70.0.3538.15z69.0.3497.93z69.0.3497.92z71.0.3548.1z71.0.3548.0z70.0.3538.14z69.0.3497.91z71.0.3547.1z71.0.3547.0z70.0.3538.13z69.0.3497.90z71.0.3546.2z69.0.3497.89z71.0.3546.1z71.0.3546.0z70.0.3538.12z69.0.3497.88z71.0.3545.4z71.0.3545.3z71.0.3545.2z71.0.3545.1z71.0.3545.0z70.0.3538.11z69.0.3497.87z71.0.3544.5z71.0.3544.4z71.0.3544.3z71.0.3544.2z71.0.3544.1z71.0.3544.0z69.0.3497.86z70.0.3538.10z69.0.3497.85z70.0.3538.9z69.0.3497.84z71.0.3543.4z70.0.3538.8z71.0.3543.3z71.0.3543.2z71.0.3543.1z71.0.3543.0z70.0.3538.7z69.0.3497.83z71.0.3542.2z71.0.3542.1z71.0.3542.0z70.0.3538.6z69.0.3497.82z69.0.3497.81z71.0.3541.1z71.0.3541.0z70.0.3538.5z69.0.3497.80z71.0.3540.1z71.0.3540.0z70.0.3538.4z69.0.3497.79z70.0.3538.3z71.0.3539.1z71.0.3539.0z69.0.3497.78z68.0.3440.134z69.0.3497.77z70.0.3538.2z70.0.3538.1z70.0.3538.0z69.0.3497.76z68.0.3440.133z69.0.3497.75z70.0.3537.2z70.0.3537.1z70.0.3537.0z69.0.3497.74z68.0.3440.132z70.0.3536.0z70.0.3535.5z70.0.3535.4z70.0.3535.3z69.0.3497.73z68.0.3440.131z70.0.3532.8z70.0.3532.7z69.0.3497.72z69.0.3497.71z70.0.3535.2z70.0.3535.1z70.0.3535.0z69.0.3497.70z68.0.3440.130z69.0.3497.69z68.0.3440.129z70.0.3534.4z70.0.3534.3z70.0.3534.2z70.0.3534.1z70.0.3534.0z69.0.3497.68z68.0.3440.128z70.0.3533.2z70.0.3533.1z70.0.3533.0z69.0.3497.67z68.0.3440.127z70.0.3532.6z70.0.3532.5z70.0.3532.4z69.0.3497.66z68.0.3440.126z70.0.3532.3z70.0.3532.2z70.0.3532.1z69.0.3497.60z69.0.3497.65z69.0.3497.64z70.0.3532.0z70.0.3531.0z70.0.3530.4z70.0.3530.3z70.0.3530.2z69.0.3497.58z68.0.3440.125z69.0.3497.57z69.0.3497.56z69.0.3497.55z69.0.3497.54z70.0.3530.1z70.0.3530.0z69.0.3497.53z68.0.3440.124z69.0.3497.52z70.0.3529.3z70.0.3529.2z70.0.3529.1z70.0.3529.0z69.0.3497.51z70.0.3528.4z68.0.3440.123z70.0.3528.3z70.0.3528.2z70.0.3528.1z70.0.3528.0z69.0.3497.50z68.0.3440.122z70.0.3527.1z70.0.3527.0z69.0.3497.49z68.0.3440.121z70.0.3526.1z70.0.3526.0z68.0.3440.120z69.0.3497.48z69.0.3497.47z68.0.3440.119z68.0.3440.118z70.0.3525.5z70.0.3525.4z70.0.3525.3z68.0.3440.117z69.0.3497.46z70.0.3525.2z70.0.3525.1z70.0.3525.0z69.0.3497.45z68.0.3440.116z70.0.3524.4z70.0.3524.3z69.0.3497.44z70.0.3524.2z70.0.3524.1z70.0.3524.0z70.0.3523.2z69.0.3497.43z68.0.3440.115z70.0.3505.9z69.0.3497.42z70.0.3505.8z70.0.3523.1z70.0.3523.0z69.0.3497.41z68.0.3440.114z70.0.3505.7z69.0.3497.40z70.0.3522.1z70.0.3522.0z70.0.3521.2z69.0.3497.39z68.0.3440.113z70.0.3505.6z70.0.3521.1z70.0.3521.0z69.0.3497.38z68.0.3440.112z70.0.3520.1z70.0.3520.0z69.0.3497.37z68.0.3440.111z70.0.3519.3z70.0.3519.2z70.0.3519.1z70.0.3519.0z69.0.3497.36z68.0.3440.110z70.0.3518.1z70.0.3518.0z69.0.3497.35z69.0.3497.34z68.0.3440.109z70.0.3517.1z70.0.3517.0z69.0.3497.33z68.0.3440.108z69.0.3497.32z70.0.3516.3z70.0.3516.2z70.0.3516.1z70.0.3516.0z69.0.3497.31z68.0.3440.107z70.0.3515.4z68.0.3440.106z70.0.3515.3z70.0.3515.2z70.0.3515.1z70.0.3515.0z69.0.3497.30z68.0.3440.105z68.0.3440.104z70.0.3514.2z70.0.3514.1z70.0.3514.0z69.0.3497.29z68.0.3440.103z70.0.3513.1z70.0.3513.0z69.0.3497.28)randomchoice)Z_USER_AGENT_TPLZ_CHROME_VERSIONSr*   r*   r+   random_user_agentY   s                6r0   zISO-8859-1,utf-8;q=0.7,*;q=0.7z?text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8zgzip, deflatezen-us,en;q=0.5)z
User-AgentzAccept-CharsetAcceptzAccept-EncodingzAccept-LanguageZSafarizqMozilla/5.0 (X11; Linux x86_64; rv:10.0) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27JanuaryFebruaryZMarchZAprilMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecemberZjanvieru   févrierZmarsZavrilmaiZjuinZjuilletu   aoûtZ	septembreZoctobreZnovembreu	   décembre)enfr)%mp4m4aZm4pZm4bZm4rZm4vaacflvZf4vZf4aZf4bZwebmZoggZogvZogaZogxZspxopusZmkvZmkaZmk3dZaviZdivxmovZasfwmvZwma3gpZ3g2mp3ZflacZapewavZf4ff4mm3u8Zsmilu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿZAAAAAAAEZCEEEEIIIIDNOOOOOOOZOEZUUUUUYTHssZaaaaaaaeZceeeeiiiionoooooooZoeZuuuuuythy)$z%d %B %Yz%d %b %Yz%B %d %Yz
%B %dst %Yz
%B %dnd %Yz
%B %drd %Yz
%B %dth %Yz%b %d %Yz
%b %dst %Yz
%b %dnd %Yz
%b %drd %Yz
%b %dth %Yz%b %dst %Y %I:%Mz%b %dnd %Y %I:%Mz%b %drd %Y %I:%Mz%b %dth %Y %I:%Mz%Y %m %dz%Y-%m-%dz%Y/%m/%dz%Y/%m/%d %H:%Mz%Y/%m/%d %H:%M:%Sz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%Mz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz%Y-%m-%dT%H:%M:%S.%f0Zz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%Mz%b %d %Y at %H:%Mz%b %d %Y at %H:%M:%Sz%B %d %Y at %H:%Mz%B %d %Y at %H:%M:%Sz%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zS(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>c                  C   s4   zt  } d|  W n tk
r.   d} Y nX | S )zGet preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    ZTESTzUTF-8)localegetpreferredencodingencode	Exception)Zprefr*   r*   r+   preferredencoding  s    
rN   c                    s  t tjdk r@tjdkr@t   fdd} fdd}ntjj}tjj}d|d |dd	}tjdk r~d
|d< n|	ddd t
jf t|}z| t| | W 5 Q R X tjdkrzt W n tk
r   Y nX z,td}t| t|jd| @  W n tk
r,   Y nX t|j W n@ tk
r~   zt|j W n tk
rv   Y nX  Y nX dS )z? Encode obj as JSON and write it to fn, atomically if possible    r   win32c                    s   t j S N)ospathbasenamedecodefencodingfnr*   r+   <lambda>      z!write_json_file.<locals>.<lambda>c                    s   t j S rR   )rS   rT   dirnamerV   rW   rY   r*   r+   r\     r]   z.tmp.F)suffixprefixdirdeletewbmodewutf-8)re   rZ   r   i  N)encodeFilenamesysversion_infoplatformget_filesystem_encodingrS   rT   rU   r^   updatetempfileNamedTemporaryFiler   jsondumpunlinkOSErrorumaskchmodnamerenamerM   remove)objr[   Zpath_basenameZpath_dirnameargstfmaskr*   rY   r+   write_json_file  sP    
	




r}         c                 C   s:   t d|st||dkr"d| n
d||f  }| |S )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$Nz[@%s]z
[@%s='%s'])rematchAssertionErrorfind)nodexpathkeyvalexprr*   r*   r+   find_xpath_attrA  s     r   c                 C   sD   |  t|D ]0}||jkrq|d ks6|j||kr|  S qd S rR   )findallr   attribget)r   r   r   r   rX   r*   r*   r+   r   G  s    

c                 C   sf   dd |  dD }g }|D ]>}t|dkr<||d  q|\}}|d|| |f  qd|S )Nc                 S   s   g | ]}| d qS ):)split.0cr*   r*   r+   
<listcomp>T  s     z!xpath_with_ns.<locals>.<listcomp>/r   r   z{%s}%s)r   lenr(   join)rT   ns_map
componentsZreplacedr   nstagr*   r*   r+   xpath_with_nsS  s    r   Fc                    s    fdd}t |ttfr$||}n|D ]}||}|d k	r( qBq(|d kr||tk	rV|S |rx|d krf|n|}td| nd S |S )Nc                    s     t| S rR   )r   r   )r   r   r*   r+   _find_xpath`  s    z"xpath_element.<locals>._find_xpathzCould not find XML element %s)
isinstancestrr   
NO_DEFAULTExtractorError)r   r   rv   fataldefaultr   nZxpr*   r   r+   xpath_element_  s    
r   c                 C   sh   t | ||||d}|d ks"||kr&|S |jd krb|tk	r<|S |r^|d krL|n|}td| nd S |jS )N)r   r   z$Could not find XML element's text %s)r   textr   r   )r   r   rv   r   r   r   r*   r*   r+   
xpath_textv  s    
r   c                 C   sX   t | ||}|d krN|tk	r |S |rJ|d kr8d||f n|}td| nd S |j| S )Nz%s[@%s]zCould not find XML attribute %s)r   r   r   r   )r   r   r   rv   r   r   r   r*   r*   r+   
xpath_attr  s    r   c                 C   s   t d| |S )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attribute)r   htmlr*   r*   r+   get_element_by_id  s    r   c                 C   s   t | |}|r|d S dS )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)get_elements_by_class)
class_namer   retvalr*   r*   r+   get_element_by_class  s    
r   Tc                 C   s   t | |||}|r|d S d S Nr   )get_elements_by_attribute)	attributevaluer   escape_valuer   r*   r*   r+   r     s    r   c                 C   s   t ddt|  |ddS )z]Return the content of all tags with the specified class in the passed HTML document as a listclassz[^\'"]*\b%s\b[^\'"]*F)r   )r   r   escape)r   r   r*   r*   r+   r     s      r   c                 C   sr   |rt |n|}g }t dt | |f |D ]<}|d}|dsR|dr^|dd }|t| q0|S )zVReturn the content of the tag with the specified attribute in the passed HTML documenta  (?xs)
        <([a-zA-Z0-9:._-]+)
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
         \s+%s=['"]?%s['"]?
         (?:\s+[a-zA-Z0-9:._-]+(?:=[a-zA-Z0-9:._-]*|="[^"]*"|='[^']*'|))*?
        \s*>
        (?P<content>.*?)
        </\1>
    content"'r   )r   r   finditergroup
startswithr(   unescapeHTML)r   r   r   r   Zretlistmresr*   r*   r+   r     s    	
r   c                   @   s    e Zd ZdZdd Zdd ZdS )HTMLAttributeParserzATrivial HTML parser to gather the attributes for a single elementc                 C   s   i | _ t|  d S rR   )attrsr   __init__selfr*   r*   r+   r     s    zHTMLAttributeParser.__init__c                 C   s   t || _d S rR   )dictr   )r   r   r   r*   r*   r+   handle_starttag  s    z#HTMLAttributeParser.handle_starttagN)__name__
__module____qualname____doc__r   r   r*   r*   r*   r+   r     s   r   c                 C   s8   t  }z||  |  W n tk
r0   Y nX |jS )a  Given a string for an HTML element such as
    <el
         a="foo" B="bar" c="&98;az" d=boz
         empty= noval entity="&amp;"
         sq='"' dq="'"
    >
    Decode and return a dictionary of attributes.
    {
        'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
        'empty': '', 'noval': None, 'entity': '&',
        'sq': '"', 'dq': '''
    }.
    NB HTMLParser is stricter in Python 2.6 & 3.2 than in later versions,
    but the cases in the unit test will work for all of 2.6, 2.7, 3.2-3.5.
    )r   feedcloser   r   )Zhtml_elementparserr*   r*   r+   extract_attributes  s    
r   c                 C   sR   | dkr| S |  dd} tdd| } tdd| } tdd| } t| } |  S )z,Clean an HTML snippet into a readable stringN
 z(?u)\s*<\s*br\s*/?\s*>\s*z(?u)<\s*/\s*p\s*>\s*<\s*p[^>]*>z<.*?>r-   )replacer   subr   strip)r   r*   r*   r+   
clean_html  s    r   c              
   C   s   zf| dkrPt jdkr0ddl}|t j tj tt jdrDt jj	nt j| fW S t
t| |}|| fW S  ttfk
r } zF|jtjfkr t| }|| kr nt
t||}||f W Y S W 5 d}~X Y nX dS )ao  Try to open the given filename, and slightly tweak it if this fails.

    Attempts to open the given filename. If this fails, it tries to change
    the filename slightly, step by step, until it's either able to open it
    or it fails and raises a final exception, like the standard open()
    function.

    It returns the tuple (stream, definitive_file_name).
    -rQ   r   Nbuffer)ri   rk   msvcrtZsetmodestdoutfilenorS   O_BINARYhasattrr   openrh   IOErrorrs   errnoEACCESsanitize_path)filenameZ	open_moder   streamerrZalt_filenamer*   r*   r+   sanitize_open  s     

 
r   c                 C   s(   d}t j| }|dk	r$t j|}|S )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)Ztimestr	timestamp	timetupler*   r*   r+   timeconvert  s
    r   c                    s    fdd}t ddd | } dt|| }|sd|krH|dd}q2|d} rl|d	rl|d
d }|drd|tdd  }|d}|sd}|S )zSanitizes a string so it could be used as part of a filename.
    If restricted is set, use a stricter subset of allowed characters.
    Set is_id if this is not an arbitrary string, but an ID that should be kept
    if possible.
    c                    s    r| t krt |  S | dks4t| dk s4t| dkr8dS | dkrL rHdS dS | dkr` r\dS d	S | d
krldS  r| dks|  rdS  rt| dkrdS | S )N?       r-   r   r   r   z_-z -z\/|*<>_z!&'()[]{}$;`^,#)ACCENT_CHARSordisspace)char
restrictedr*   r+   replace_insane&  s     z)sanitize_filename.<locals>.replace_insanez[0-9]+(?::[0-9]+)+c                 S   s   |  dddS )Nr   r   r   )r   r   r   r*   r*   r+   r\   8  r]   z#sanitize_filename.<locals>.<lambda>r-   __r   z-_r   Nr   r_   )	r   r   r   mapr   r   r   r   lstrip)sr   Zis_idr   resultr*   r   r+   sanitize_filename   s    


r   c                 C   s   t jdkr| S tj| \}}t jdk r<|s<tj| \}}tjt| |	tjj
}|rf|d dd |D }|r|d|tjj
  tjj| S )z(Sanitizes and normalizes path on WindowsrQ   r~   r   c                 S   s&   g | ]}|d kr|nt dd|qS ))r_   z..z(?:[/<>:"\|\\?\*]|[\s.]$)#r   r   )r   Z	path_partr*   r*   r+   r   S  s   z!sanitize_path.<locals>.<listcomp>)ri   rk   rS   rT   
splitdriverj   Zsplituncnormpathremove_startr   seppopinsertr   )r   Zdrive_or_uncr   Z	norm_pathZsanitized_pathr*   r*   r+   r   I  s    

r   c                 C   sF   |  drd|  S d}|D ]&\}}t|| rt|||   S q| S )N//zhttp:%s))z
^httpss://zhttps://)z^rmtp([es]?)://z	rtmp\1://)r   r   r   r   )urlZCOMMON_TYPOSZmistakefixupr*   r*   r+   sanitize_url[  s    
r  c                 O   s   t jt| f||S rR   )r   Requestr  )r	  rz   kwargsr*   r*   r+   sanitized_Requestm  s    r  c                 C   s   t jt| S )zExpand shell variables and ~)rS   rT   
expandvarsr   r   r*   r*   r+   expand_pathq  s    r  c                 C   s$   g }| D ]}||kr| | q|S )z/ Remove all duplicates from the input iterable )r(   )iterabler   elr*   r*   r+   
orderedSetv  s
    r  c                 C   s   | dd }|t jkr$tt j| S | tkr4t|  S td|}|dk	r|d}|drjd}d| }nd}ztt||W S  t	k
r   Y nX d	| S )
z)Transforms an HTML entity to a character.Nr   z#(x[0-9a-fA-F]+|[0-9]+)r   x   z0%s
   z&%s;)
r   name2codepointr   r   r   r   r   r   int
ValueError)Zentity_with_semicolonentitymobjZnumstrbaser*   r*   r+   _htmlentity_transform  s"    



r  c                 C   s.   | d krd S t | tksttddd | S )Nz
&([^&;]+;)c                 S   s   t | dS Nr   )r  r   r   r*   r*   r+   r\     r]   zunescapeHTML.<locals>.<lambda>)typer   r   r   r   r  r*   r*   r+   r     s      r   c                  C   s:   t jdkr"t  d dkr"t } nt  } | d kr6d} | S )NrQ   r      rg   )ri   rk   getwindowsversionrN   getfilesystemencodingrZ   r*   r*   r+   get_subprocess_encoding  s    r%  c                 C   s^   t | tksttjdkr| S |s@tjdkr@t d dkr@| S tjdrP| S | t	 dS )z'
    @param s The name of the file
    rO   rQ   r   r!  javaignore)
r   r   r   ri   rj   rk   r"  r   rL   r%  )r   for_subprocessr*   r*   r+   rh     s    
rh   c                 C   s*   t jdkr| S t| ts| S | t dS )NrO   r'  )ri   rj   r   bytesrV   r%  )br(  r*   r*   r+   decodeFilename  s
    

r+  c                 C   s   t | ts| d} t| dS )NasciiT)r   r   rV   rh   r  r*   r*   r+   encodeArgument  s    

r-  c                 C   s
   t | dS NT)r+  )r*  r*   r*   r+   decodeArgument  s    r/  c                 C   s4   | d kr| S t | tr"| t } t | ts0t| S rR   )r   r)  rV   rN   r   r   )optvalr*   r*   r+   decodeOption  s    
r1  c                 C   sN   | dkr&d| d | d d | d f S | dkrBd| d | d f S d|  S d S )N  z%d:%02d:%02d<   z%d:%02d%dr*   )secsr*   r*   r+   formatSeconds  s
    r6  c                 K   s   |  dd}ttdrbttjj}|r6d|_tj|_zt	| fd|i|W S  t
k
r`   Y nX tjdk rxt	| f|S ttj}|rtjntj|_|  t	| fd|i|S d S )NZnocheckcertificateFcreate_default_contextcontext)rP   r   )r   r   sslr7  PurposeSERVER_AUTHcheck_hostname	CERT_NONEverify_modeYoutubeDLHTTPSHandler	TypeErrorri   rj   
SSLContextPROTOCOL_TLSv1CERT_REQUIREDset_default_verify_paths)paramsr  Zopts_no_check_certificater8  r*   r*   r+   make_HTTPS_handler  s&    

rF  c                  C   s,   t  rd} nd} d}|d|  7 }|d7 }|S )Nztype  youtube-dl -U  to updatez/see  https://yt-dl.org/update  on how to updatez5; please report this issue on https://yt-dl.org/bug .z0 Make sure you are using the latest version; %s.zT Be sure to call youtube-dl with the --verbose flag and include its complete output.)ytdl_is_updateable)Z
update_cmdmsgr*   r*   r+   bug_reports_message	  s    rI  c                   @   s   e Zd ZdZdS )YoutubeDLErrorz$Base exception for YoutubeDL errors.Nr   r   r   r   r*   r*   r*   r+   rJ  	  s   rJ  c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	r   zError during info extraction.NFc                    s   t  d tjtjtfkrd}|dk	r2|d | }|rB|d| 7 }|sP|t 7 }tt	| 
| || _t  | _|| _|| _dS )z tb, if given, is the original traceback (so that it can be printed out).
        If expected is set, this is a normal error message and most likely not a bug in youtube-dl.
        r   TNz: z (caused by %r))ri   exc_infor   URLErrorsockettimeoutUnavailableVideoErrorrI  superr   r   	tracebackcausevideo_id)r   rH  tbexpectedrS  rT  	__class__r*   r+   r   "	  s    

zExtractorError.__init__c                 C   s    | j d krd S dt | j S Nr-   )rR  r   	format_tbr   r*   r*   r+   format_traceback6	  s    
zExtractorError.format_traceback)NFNN)r   r   r   r   r   r[  __classcell__r*   r*   rW  r+   r   	  s   r   c                       s   e Zd Z fddZ  ZS )UnsupportedErrorc                    s"   t t| jd| dd || _d S )NzUnsupported URL: %sTrV  )rQ  r]  r   r	  )r   r	  rW  r*   r+   r   =	  s
    
 zUnsupportedError.__init__r   r   r   r   r\  r*   r*   rW  r+   r]  <	  s   r]  c                   @   s   e Zd ZdZdS )RegexNotFoundErrorzError when a regex didn't matchNrK  r*   r*   r*   r+   r`  C	  s   r`  c                       s"   e Zd ZdZd fdd	Z  ZS )GeoRestrictedErrorzGeographic restriction Error exception.

    This exception may be thrown when a video is not available from your
    geographic location due to geographic restrictions imposed by a website.
    Nc                    s$   t t| j|dd || _|| _d S )NTr^  )rQ  ra  r   rH  	countries)r   rH  rb  rW  r*   r+   r   N	  s    zGeoRestrictedError.__init__)Nr   r   r   r   r   r\  r*   r*   rW  r+   ra  H	  s   ra  c                       s"   e Zd ZdZd fdd	Z  ZS )DownloadErrorzDownload Error exception.

    This exception may be thrown by FileDownloader objects if they are not
    configured to continue on errors. They will contain the appropriate
    error message.
    Nc                    s   t t| | || _dS )zh exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)rQ  rd  r   rL  )r   rH  rL  rW  r*   r+   r   \	  s    zDownloadError.__init__)Nrc  r*   r*   rW  r+   rd  T	  s   rd  c                   @   s   e Zd ZdZdS )SameFileErrorzSame File exception.

    This exception will be thrown by FileDownloader objects if they detect
    multiple files would have to be downloaded to the same file on disk.
    NrK  r*   r*   r*   r+   re  b	  s   re  c                       s    e Zd ZdZ fddZ  ZS )PostProcessingErrorzPost Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    c                    s   t t| | || _d S rR   )rQ  rf  r   rH  )r   rH  rW  r*   r+   r   r	  s    zPostProcessingError.__init__rc  r*   r*   rW  r+   rf  k	  s   rf  c                   @   s   e Zd ZdZdS )MaxDownloadsReachedz) --max-downloads limit has been reached. NrK  r*   r*   r*   r+   rg  w	  s   rg  c                   @   s   e Zd ZdZdS )rP  zUnavailable Format exception.

    This exception will be thrown when a video is requested
    in a format that is not available for that video.
    NrK  r*   r*   r*   r+   rP  |	  s   rP  c                       s    e Zd ZdZ fddZ  ZS )ContentTooShortErrorzContent Too Short exception.

    This exception may be raised by FileDownloader objects when a file they
    download is too small for what the server announced first, indicating
    the connection was probably interrupted.
    c                    s(   t t| d|| || _|| _d S )Nz(Downloaded {0} bytes, expected {1} bytes)rQ  rh  r   format
downloadedrV  )r   rj  rV  rW  r*   r+   r   	  s
    

zContentTooShortError.__init__rc  r*   r*   rW  r+   rh  	  s   rh  c                       s   e Zd Zd fdd	Z  ZS )XAttrMetadataErrorNUnknown errorc                    sr   t t| | || _|| _| jtjtjfksBd| jksBd| jkrJd| _n$| jtj	ks`d| jkrhd| _nd| _d S )NzNo space leftzDisk quota exceededZNO_SPACEzArgument list too longZVALUE_TOO_LONGZNOT_SUPPORTED)
rQ  rk  r   coderH  r   ENOSPCZEDQUOTreasonZE2BIG)r   rm  rH  rW  r*   r+   r   	  s    zXAttrMetadataError.__init__)Nrl  r_  r*   r*   rW  r+   rk  	  s   rk  c                   @   s   e Zd ZdS )XAttrUnavailableErrorN)r   r   r   r*   r*   r*   r+   rp  	  s   rp  c                    s   t jdk rd|d< ||t|}| jd}|d k	rtjd fdd t|drT |_|dft|drn|_	n fd	d
}t
|||_|S )NrO   Tstrictsource_addressc                    s4  | \}}d }t ||dt j}d|d kr0t jnt j  fdd|D }|rx|sx t jkr^dnd}t d||d f |D ]}	|	\ }
}}}d }zDt   |
|}|t jk	r|| || |	| d }|W   S  t jk
r } z|}|d k	r|
  W 5 d }~X Y q|X q||d k	r&|n
t dd S )	Nr   r_   c                    s   g | ]}|d   kr|qS )r   r*   )r   addrafr*   r+   r   	  s      zG_create_http_connection.<locals>._create_connection.<locals>.<listcomp>Zv4Zv6zPNo remote IP%s addresses available for connect, can't use '%s' as source addressz!getaddrinfo returns an empty list)rN  getaddrinfoSOCK_STREAMAF_INETAF_INET6error_GLOBAL_DEFAULT_TIMEOUT
settimeoutbindconnectr   )addressrO  rr  hostportr   addrsZip_addrsZ
ip_versionr   socktypeproto	canonnamesasockr   r*   rt  r+   _create_connection	  s<    







z3_create_http_connection.<locals>._create_connectionr  r   c                    s@    | j | jf| j}r6tj|| j| jtjd| _n|| _d S )N)ssl_version)	r  r  rO  r9  wrap_socketkey_file	cert_filerB  r  )r   rz   r  r  r  is_httpsr  r*   r+   _hc_connect	  s    
    
z,_create_http_connection.<locals>._hc_connect)ri   rj   r   _paramsr   rN  r{  r   r  rr  	functoolspartialr~  )Zydl_handler
http_classr  rz   r  Zhcrr  r  r*   r  r+   _create_http_connection	  s    


	r  c                 C   s,   | }d|kr(t dd | D }|d= |S )NzYoutubedl-no-compressionc                 s   s&   | ]\}}|  d kr||fV  qdS )zaccept-encodingNlowerr   kvr*   r*   r+   	<genexpr>	  s      z+handle_youtubedl_headers.<locals>.<genexpr>)r   items)headersZfiltered_headersr*   r*   r+   handle_youtubedl_headers	  s
    r  c                   @   sD   e Zd ZdZdd Zdd Zedd Zdd	 Zd
d Z	eZ
e	ZdS )YoutubeDLHandlera  Handler for HTTP requests and responses.

    This class, when installed with an OpenerDirector, automatically adds
    the standard headers to every HTTP request and handles gzipped and
    deflated responses from web servers. If compression is to be avoided in
    a particular request, the original request in the program code only has
    to include the HTTP header "Youtubedl-no-compression", which will be
    removed before making the real request.

    Part of this code was copied from:

    http://techknack.net/python-urllib2-handlers/

    Andrew Rowls, the author of that code, agreed to release it to the
    public domain.
    c                 O   s   t jj| f|| || _d S rR   )r   HTTPHandlerr   r  )r   rE  rz   r  r*   r*   r+   r   
  s    zYoutubeDLHandler.__init__c                 C   s@   t j}|jd}|r(t||}|jd= | tt| |d|S )NYtdl-socks-proxyF)	r   HTTPConnectionr  r   make_socks_conn_classdo_openr  r  r  )r   req
conn_classsocks_proxyr*   r*   r+   	http_open
  s    
   zYoutubeDLHandler.http_openc                 C   s8   zt | t j W S  t jk
r2   t |  Y S X d S rR   )zlib
decompress	MAX_WBITSrz  )datar*   r*   r+   deflate
  s    zYoutubeDLHandler.deflatec                 C   s   |  }t|}||kr$t||d}t D ]"\}}| |jkr,||| q,t|j|_t	j
dk rd|  kr|jdd |_|jdd |_|S )Nr	  r~   r   r   )get_full_url
escape_urlupdate_Requeststd_headersr  
capitalizer  
add_headerr  ri   rj   Z_Request__original	partitionZ_Request__r_type)r   r  r	  Zurl_escapedhr  r*   r*   r+   http_request
  s    	zYoutubeDLHandler.http_requestc                 C   s  |}|j dddkr| }tjt|dd}zt| }W n tk
r } zftddD ]R}z0tjt|d |  dd}t| }W n tk
r   Y q`Y nX  qq`|W 5 d }~X Y nX t	
||j |j|j}|j|_|j d= |j dddkr>t| | }t	
||j |j|j}|j|_|j d= d	|j  krXd
k rn nt|j d}	|	rtjdkr|	dd}	n
|	d}	t|	}
|	|
kr|j d= tjdk r|
d}
|
|j d< |S )NzContent-encodingr-   gziprb)fileobjre   r      r  i,  i  ZLocationrO   z
iso-8859-1rg   )r  r   readr  GzipFileioBytesIOr   ranger   
addinfourlr	  rm  rH  r  ri   rj   rL   rV   r  )r   r  respZold_respr   gzZuncompressedZoriginal_ioerrorilocationZlocation_escapedr*   r*   r+   http_response=
  sH    




zYoutubeDLHandler.http_responseN)r   r   r   r   r   r  staticmethodr  r  r  https_requesthttps_responser*   r*   r*   r+   r  	  s   
/r  c                    s   t | tjtjfstt|}|j dkr6t	j
}n*|j dkrLt	j}n|j dkr`t	j}dd }||j|jpvdd||j||jf G  fdd	d	| }|S )
Nr&   )r#   r$   r%   c                 S   s   | s| S t | S rR   )r   r  r*   r*   r+   unquote_if_non_empty|
  s    z3make_socks_conn_class.<locals>.unquote_if_non_emptyi8  Tc                       s   e Zd Z fddZdS )z.make_socks_conn_class.<locals>.SocksConnectionc                    s   t  | _| jj   t| jttfkr4| j| j | j| j	| j
f t| tjrt| drv| jj| j| j	d| _nt| j| _d S )N_context)server_hostname)r!   r  Zsetproxyr   rO  r  floatr|  r~  r  r  r   r   HTTPSConnectionr   r  r  r9  r   Z
proxy_argsr*   r+   r~  
  s    
 
z6make_socks_conn_class.<locals>.SocksConnection.connectN)r   r   r   r~  r*   r  r*   r+   SocksConnection
  s   r  )
issubclassr   r  r  r   r   urlparser)   r  r    ZSOCKS5ZSOCKS4ZSOCKS4Ahostnamer  usernamepassword)Z
base_classr  Zurl_componentsZ
socks_typer  r  r*   r  r+   r  p
  s*     

 r  c                   @   s   e Zd ZdddZdd ZdS )r?  Nc                 O   s*   t jj| f|| |ptj| _|| _d S rR   )r   HTTPSHandlerr   r   r  _https_conn_classr  )r   rE  Zhttps_conn_classrz   r  r*   r*   r+   r   
  s    zYoutubeDLHTTPSHandler.__init__c                 C   sp   i }| j }t| dr| j|d< t| dr2| j|d< |jd}|rTt||}|jd= | jt	t
| |d|f|S )Nr  r8  _check_hostnamer<  r  T)r  r   r  r  r  r   r  r  r  r  r  )r   r  r  r  r  r*   r*   r+   
https_open
  s(    




   z YoutubeDLHTTPSHandler.https_open)N)r   r   r   r   r  r*   r*   r*   r+   r?  
  s   
r?  c                   @   s<   e Zd ZdZdZdZdZeddZ	dd	d
Z
dddZdS )YoutubeDLCookieJarz]
    See [1] for cookie file format.

    1. https://curl.haxx.se/docs/http-cookies.html
    z
#HttpOnly_r   zS# Netscape HTTP Cookie File
# This file is generated by youtube-dl.  Do not edit.

ZCookieFileEntry)Zdomain_nameZinclude_subdomainsrT   Z
https_only
expires_atrv   r   NFc                 C   s   |dkr$| j dk	r| j }n
ttj| D ]}|jdkr(d|_q(tj|ddd}|| j t		 }| D ]}|sx|j
rxqh|s||rqh|jrd}nd}|jdrd}nd}|jdk	rt|j}	nd	}	|jdkrd	}
|j}n|j}
|j}|d
|j||j||	|
|gd  qhW 5 Q R X dS )z
        Save cookies to a file.

        Most of the code is taken from CPython 3.8 and slightly adapted
        to support cookie files with UTF-8 in both python 2 and 3.
        Nr   rf   rg   r$  TRUEFALSEr_   r-   	r   )r   r  r	   MISSING_FILENAME_TEXTexpiresr  r   write_HEADERtimediscard
is_expiredsecuredomainr   r   r   rv   r   rT   )r   r   ignore_discardignore_expirescookierX   nowr  initial_dotr  rv   r   r*   r*   r+   save
  sN    





   zYoutubeDLCookieJar.savec           
         s   |dkr$ j dk	r j }n
ttj fdd}t }tj|ddd}|D ]X}z||| W qL tjk
r } z t	d||f t
j W Y qLW 5 d}~X Y qLX qLW 5 Q R X |d  ||||  D ]}	|	jdkrd|	_d|	_qdS )	zLoad cookies from a file.Nc                    s   |   jr| t jd  } |  ds0|  s4| S | d}t| jkr^tdt|  j| }|j	r|j	
 std|j	 | S )Nr   r  zinvalid length %dzinvalid expires at %s)r   _HTTPONLY_PREFIXr   r   r   
_ENTRY_LENr	   	LoadError_CookieFileEntryr  isdigit)lineZcookie_listr  r   r*   r+   prepare_line   s    

z-YoutubeDLCookieJar.load.<locals>.prepare_linerg   r$  z2WARNING: skipping cookie file entry due to %s: %r
r   T)r   r  r	   r  r  StringIOr   r  r  write_stringri   stderrseek_really_loadr  r  )
r   r   r  r  r  cfrX   r  er  r*   r   r+   load
  s0    

&


zYoutubeDLCookieJar.load)NFF)NFF)r   r   r   r   r  r  r  collections
namedtupler  r  r  r*   r*   r*   r+   r  
  s   
4r  c                   @   s*   e Zd ZdddZdd ZejjZeZ	dS )YoutubeDLCookieProcessorNc                 C   s   t j| | d S rR   )r   HTTPCookieProcessorr   )r   	cookiejarr*   r*   r+   r   +  s    z!YoutubeDLCookieProcessor.__init__c                 C   s   t j| ||S rR   )r   r  r  )r   requestresponser*   r*   r+   r  .  s    z&YoutubeDLCookieProcessor.http_response)N)
r   r   r   r   r  r   r  r  r  r  r*   r*   r*   r+   r  *  s   
r  c                   @   s,   e Zd ZdZejj Z Z Z	Z
dd ZdS )YoutubeDLRedirectHandlera"  YoutubeDL redirect handler

    The code is based on HTTPRedirectHandler implementation from CPython [1].

    This redirect handler solves two issues:
     - ensures redirect URL is always unicode under python 2
     - introduces support for experimental HTTP response status code
       308 Permanent Redirect [2] used by some sites [3]

    1. https://github.com/python/cpython/blob/master/Lib/urllib/request.py
    2. https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/308
    3. https://github.com/ytdl-org/youtube-dl/issues/28768
    c           	         s   |  }|dkr|dks:|dkr(|dks:t|j||||tjd dk rPt|}|dd}d	 t fd
d|j	 D }t
j|||jddS )a  Return a Request or None in response to a redirect.

        This is called by the http_error_30x methods when a
        redirection response is received.  If a redirection should
        take place, return a new Request to allow http_error_30x to
        perform the redirect.  Otherwise, raise HTTPError if no-one
        else should try to handle this url.  Return None if you can't
        but another Handler might.
        )-  .  /  i3  i4  )GETHEAD)r  r  r  POSTr   rP   r   z%20)zcontent-lengthzcontent-typec                 3   s&   | ]\}}|   kr||fV  qd S rR   r  r  CONTENT_HEADERSr*   r+   r  t  s    z<YoutubeDLRedirectHandler.redirect_request.<locals>.<genexpr>T)r  origin_req_hostunverifiable)
get_methodr   full_urlri   rj   r   r   r   r  r  r   r  r  )	r   r  fprm  rH  r  newurlr   
newheadersr*   r
  r+   redirect_requestS  s$    

  z)YoutubeDLRedirectHandler.redirect_requestN)r   r   r   r   r   HTTPRedirectHandlerhttp_error_302http_error_301http_error_303http_error_307Zhttp_error_308r  r*   r*   r*   r+   r  B  s   r  c                 C   s   t d| }|st }nl| d t|d  } |dsFt }n@|ddkrXdnd}tj|t|d |t|d d	}|| fS )
NzM^.{8,}?(?P<tz>Z$| ?(?P<sign>\+|-)(?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})$)tzsign+r   r   hoursminutes)r  r  )r   searchdatetime	timedeltar   r   r  )date_strr   timezoner  r*   r*   r+   extract_timezone{  s    


r#  Tc                 C   st   | dkrdS t dd| } |dkr.t| \}} z,d|}tj| || }t| W S  t	k
rn   Y nX dS )z- Return a UNIX timestamp from the given date Nz\.[0-9]+r-   z%Y-%m-%d{0}%H:%M:%S)
r   r   r#  ri  r  strptimecalendartimegmr   r  )r!  	delimiterr"  Zdate_formatdtr*   r*   r+   parse_iso8601  s    
r*  c                 C   s   | rt S tS rR   )DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firstr*   r*   r+   date_formats  s    r.  c              	   C   s   | dkrdS d}|  dd} tdd| } t| \}} t|D ]2}ztj| |d}W q> tk
rn   Y q>X q>|dkrt	j
| }|rztj|dd  d}W n tk
r   Y nX |dk	rt|S dS )z4Return a string with the date in the format YYYYMMDDN,r   (?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r-   %Y%m%d   )r   r   r   r#  r.  r  r%  strftimer  r   r   r   r   )r!  r-  Zupload_dater   
expressionr   r*   r*   r+   unified_strdate  s(    r5  c              	   C   s  | d krd S t dd| } t d| r*dnd}t| \}} t dd| } t d| }|rp| d t|d  } t d	| }|r|d
} t|D ]L}z2tj| || tj	|d }t
| W   S  tk
r   Y qX qtj| }|rt
||d  S d S )Nz[,|]r-   z(?i)PM   r   r0  z+\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$r  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   )r  r2  )r   r   r  r#  r   r   r.  r  r%  r   r&  r'  r   r  r   r   r   )r!  r-  Zpm_deltar"  r   r4  r)  r   r*   r*   r+   unified_timestamp  s*    
r7  unknown_videoc                 C   s\   | d ksd| kr|S |  dd dd }td|r<|S |dtkrT|dS |S d S )Nr_   r   r   r   z^[A-Za-z0-9]+$r   )r  
rpartitionr   r   rstripKNOWN_EXTENSIONS)r	  default_extguessr*   r*   r+   determine_ext  s    
r>  c                 C   s   t | |d | |S )Nr_   )replace_extension)r   Zsub_langZ
sub_formatexpected_real_extr*   r*   r+   subtitles_filename  s    rA  c                 C   s   t j }| dkr|S | dkr.|t jdd S td| }|dk	r|d}t|d}|d	krh| }|d
}|dkrd}|d9 }n|dkrd}|d9 }|d7 }t jf ||i}|| S t j | d S )zw
    Return a datetime object from a string in the format YYYYMMDD or
    (now|today)[+-][0-9](day|week|month|year)(s)?)r  todayZ	yesterdayr   )dayszG(now|today)(?P<sign>[+-])(?P<time>\d+)(?P<unit>day|week|month|year)(s)?Nr  r  r   unitmonthday   yearim  r   r1  )	r  daterB  r   r   r   r   r  r%  )r!  rB  r   r  r  rD  deltar*   r*   r+   date_from_str  s,    



rK  c                 C   s*   t d| }|dk	r"d| S | S dS )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$Nr   )r   r   r   groups)r!  r   r*   r*   r+   hyphenate_date  s    rM  c                   @   s6   e Zd ZdZdddZedd Zdd Zd	d
 ZdS )	DateRangez,Represents a time interval between two datesNc                 C   s`   |dk	rt || _ntjj | _|dk	r6t || _ntjj | _| j| jkr\td|  dS )z<start and end must be strings in the format accepted by dateNz=Date range: "%s" , the start date must be before the end date)rK  startr  minrI  endmaxr  )r   rO  rQ  r*   r*   r+   r     s    zDateRange.__init__c                 C   s
   | ||S )z0Returns a range that only contains the given dayr*   )clsrF  r*   r*   r+   rF  )  s    zDateRange.dayc                 C   s0   t |tjst|}| j|  ko*| jkS   S )z!Check if the date is in the range)r   r  rI  rK  rO  rQ  )r   rI  r*   r*   r+   __contains__.  s    zDateRange.__contains__c                 C   s   d| j  | j f S )Nz%s - %s)rO  	isoformatrQ  r   r*   r*   r+   __str__4  s    zDateRange.__str__)NN)	r   r   r   r   r   classmethodrF  rT  rV  r*   r*   r*   r+   rN    s   

rN  c                  C   s0   t   } t| tr| t } t| ts,t| S )z+ Returns the platform name as a compat_str )rk   r   r)  rV   rN   r   r   )r   r*   r*   r+   platform_name8  s
    
rX  c                    s  ddl ddlddd}z| }W n, tk
r<   Y dS  tjk
rR   Y dS X ||kr`dS tjjjj	dj
jf}||| }tjjjjjjjj	jj	jjdj
jf}j	d}tjj	jj	d	j
jfd
 dtjjjjjj	dj
jfj	dj fdd}||rTdS dd }	| rt|	| d}
||| |
r|
nd
|d}|dkrtd|
s|jd
kst| dd } n|jdkst| |jd } q\dS )zi Returns True if the string was written using special methods,
    False if it has yet to be written out.r   Nii)r   r   FGetStdHandleWriteConsoleWGetFileTyper   i   GetConsoleModer   c                    s@   | ks| d krdS |  @  kp>|  j dkS )NTr   )byrefwintypesDWORD)handleZFILE_TYPE_CHARZFILE_TYPE_REMOTEr\  r[  ZINVALID_HANDLE_VALUEctypesr*   r+   not_a_consolen  s
    z,_windows_write_string.<locals>.not_a_consolec                 S   s:   zt dd t| D W S  tk
r4   t|  Y S X d S )Nc                 s   s"   | ]\}}t |d kr|V  qdS )i  Nr   )r   r  r   r*   r*   r+   r  y  s      zA_windows_write_string.<locals>.next_nonbmp_pos.<locals>.<genexpr>)next	enumerateStopIterationr   r  r*   r*   r+   next_nonbmp_posw  s    z._windows_write_string.<locals>.next_nonbmp_posr  zFailed to write stringr   T)rb  ctypes.wintypesr   AttributeErrorr  UnsupportedOperationr
   r^  HANDLEr_  windllkernel32BOOLZLPWSTRPOINTERLPVOIDr   rP  r]  rs   r   )r   outZWIN_OUTPUT_IDSr   rY  r  rZ  Zwrittenrc  rh  countretr*   ra  r+   _windows_write_stringB  s~     
   
 

    
ru  c                 C   s   |d krt j}t| tkstt jdkrH|d krHt|drHt| |rHd S dt|ddksft j	d dk r| 
|prt d}|| nDt|d	r|pt|d
d pt }| 
|d}|j| n
||  |  d S )NrQ   r   r*  re   r-   r   rP   r'  r   rZ   )ri   r  r   r   r   rk   r   ru  getattrrj   rL   rN   r  r   flush)r   rr  rZ   Zbytencr*   r*   r+   r    s"    


r  c                 C   s0   | sg S t | d trt| S dd | D S d S )Nr   c                 S   s   g | ]}t |qS r*   rd  r   r*   r*   r+   r     s     z$bytes_to_intlist.<locals>.<listcomp>)r   r  list)bsr*   r*   r+   bytes_to_intlist  s
    r{  c                 C   s   | sdS t dt|  f|  S )Nr]   z%dB)r   r   )xsr*   r*   r+   intlist_to_bytes  s    r}  rQ   c                   @   sB   e Zd ZdejjfdejjfdejjfdejjfdejjfgZdS )
OVERLAPPEDZInternalZInternalHighOffset
OffsetHighhEventN)	r   r   r   rb  r^  rq  r_  rl  _fields_r*   r*   r*   r+   r~    s   




r~      ic                 C   sb   t  }d|_d|_d|_t|| _t| 	 }t
||r>dnddtt| js^tdt  d S )Nr   r   zLocking file failed: %r)r~  r  r  r  rb  pointer_lock_file_overlapped_pr   get_osfhandler   
LockFileEx	whole_low
whole_highrs   FormatError)rX   	exclusiveZ
overlappedr`  r*   r*   r+   
_lock_file  s      r  c                 C   s>   | j s
tt|  }t|dtt| j s:tdt	
  d S )Nr   zUnlocking file failed: %r)r  r   r   r  r   UnlockFileExr  r  rs   rb  r  )rX   r`  r*   r*   r+   _unlock_file  s    
  r  c                 C   s   t | |rt jnt j d S rR   )fcntlflockZLOCK_EXZLOCK_SHrX   r  r*   r*   r+   r    s    c                 C   s   t | t j d S rR   )r  r  ZLOCK_UNrW   r*   r*   r+   r    s    z.file locking is not supported on this platformc                 C   s   t td S rR   r   UNSUPPORTED_MSGr  r*   r*   r+   r    s    c                 C   s   t td S rR   r  rW   r*   r*   r+   r    s    c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )locked_fileNc                 C   s(   |dkst tj|||d| _|| _d S )N)rarf   r$  )r   r  r   rX   re   )r   r   re   rZ   r*   r*   r+   r     s    zlocked_file.__init__c                 C   s@   | j dk}zt| j| W n  tk
r:   | j   Y nX | S )Nr  )re   r  rX   r   r   )r   r  r*   r*   r+   	__enter__  s    

zlocked_file.__enter__c                 C   s    zt| j  W 5 | j   X d S rR   )rX   r   r  )r   etyper   rR  r*   r*   r+   __exit__  s    zlocked_file.__exit__c                 C   s
   t | jS rR   )iterrX   r   r*   r*   r+   __iter__  s    zlocked_file.__iter__c                 G   s   | j j| S rR   )rX   r  r   rz   r*   r*   r+   r    s    zlocked_file.writec                 G   s   | j j| S rR   )rX   r  r  r*   r*   r+   r    s    zlocked_file.read)N)	r   r   r   r   r  r  r  r  r  r*   r*   r*   r+   r    s   
	r  c                  C   s   t  } | d k	r| S dS )Nrg   )ri   r#  r$  r*   r*   r+   rl     s    rl   c                 C   s@   g }t  }| D ]&}t|tr&||}|t| qd|S )Nr   )rl   r   r)  rV   r(   r   r   )rz   Zquoted_argsrZ   r  r*   r*   r+   shell_quote!  s    

r  c                 C   s6   t | i \} }|| tdt|i}| d | S )z1 Pass additional data in a URL for internal use. __youtubedl_smuggler   )unsmuggle_urlrm   r   rp   dumps)r	  r  Zidatasdatar*   r*   r+   smuggle_url,  s    
r  c                 C   sB   d| kr| |fS |  d\}}}t|d d }t|}||fS )Nz#__youtubedl_smuggler   r  r   )r9  r   rp   loads)Zsmug_urlr   r	  r   r  Zjsondr  r*   r*   r+   r  6  s    
r  c              	   C   sx   | d krdS t | tkr t| } | dkr.d}ntt| d}ddddd	d
dddg	| }t| td|  }d||f S )NzN/Ag        r   g      @BKiBMiBGiBTiBPiBEiBZiBYiBr  z%.2f%s)r   r   r  r  mathlog)r)  exponentr`   Z	convertedr*   r*   r+   format_bytes?  s    r  c                 C   s\   d dd | D }td| |}|s,d S |ddd}| |d }tt|| S )	N|c                 s   s   | ]}t |V  qd S rR   )r   r   )r   ur*   r*   r+   r  N  s     z$lookup_unit_table.<locals>.<genexpr>z/(?P<num>[0-9]+(?:[,.][0-9]*)?)\s*(?P<unit>%s)\bnumr/  r_   rD  )r   r   r   r   r   r  r  )Z
unit_tabler   Zunits_rer   Znum_strZmultr*   r*   r+   lookup_unit_tableM  s     r  c              <   C   s   | d krd S dddddddddddddddddddddddddd	dd	d	d	dd
dd
dddd
dddddddddddddddddddddd;}t || S )Nr   r    i   @B i   @i ʚ;l        l    J)l           l     I5 l            l     NZol            l     @=7M.cl               l      B3v^!< );r  r*  r)  r  ZKBZkBZKbkbZ	kilobytesZ	kibibytesr  ZMBZmBZMbmbZ	megabytesZ	mebibytesr  GBZgBZGbgbZ	gigabytesZ	gibibytesr  ZTBZtBZTbrU  Z	terabytesZ	tebibytesr  ZPBZpBZPbpbZ	petabytesZ	pebibytesr  ZEBZeBZEbZebZexabytesZ	exbibytesr  ZZBZzBZZbZzbZ
zettabytesZ	zebibytesr  ZYBZyBZYbZybZ
yottabytesZ	yobibytes)r  r   Z_UNIT_TABLEr*   r*   r+   parse_filesizeX  s~    >r  c                 C   sD   | d krd S |   } td| r(t| S ddddddd}t|| S )Nz	^[\d,.]+$r  r  )r  Kr   MkkZKK)r   r   r   
str_to_intr  r  r*   r*   r+   parse_count  s    	r  c                 C   s   | d kri S t d| }|r:t|dt|ddS t d| }|r\dt|diS t d| }|rdt|dd	 iS i S )
Nu$   \b(?P<w>\d+)\s*[xX×]\s*(?P<h>\d+)\brf   r  )widthheightz\b(\d+)[pPiI]\br  r   z\b([48])[kK]\bi  )r   r  r  r   r   r  r*   r*   r+   parse_resolution  s    r  c                 C   s0   t | tsd S td| }|r,t|dS d S )Nz\b(\d+)\s*kbpsr   )r   r   r   r  r  r   r  r*   r*   r+   parse_bitrate  s
    
r  r6   c                 C   s<   t |t d }z|| d W S  tk
r6   Y dS X dS )zE Return the number of a month by (locale-independently) English name r6   r   N)MONTH_NAMESr   indexr  )rv   langZmonth_namesr*   r*   r+   month_by_name  s
    r  c                 C   s6   zdd t D | d W S  tk
r0   Y dS X dS )zV Return the number of a month by (locale-independently) English
        abbreviations c                 S   s   g | ]}|d d qS )NrP   r*   )r   r   r*   r*   r+   r     s     z)month_by_abbreviation.<locals>.<listcomp>r   N)ENGLISH_MONTH_NAMESr  r  )Zabbrevr*   r*   r+   month_by_abbreviation  s    r  c                 C   s   t dd| S )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)z&amp;r  )Zxml_strr*   r*   r+   fix_xml_ampersands  s
    r  c                 C   s   t | tsttjdrd S ztjd}W n* t	k
rD   Y d S  t
k
rX   Y d S X | d}tt|}||_z|d|ddd W n tk
r   Y d S X d S )Nr&  z	libc.so.6rg      r   )r   r   r   ri   rk   r   rb  cdllLoadLibraryrs   r@  rL   create_string_bufferr   r   Zprctlrj  )titlelibcZtitle_bytesbufr*   r*   r+   setproctitle  s     
r  c                 C   s&   | d k	r"|  |r"| t|d  S | S rR   )r   r   )r   rO  r*   r*   r+   r  	  s    r  c                 C   s(   | d k	r$|  |r$| d t|  S | S rR   )endswithr   )r   rQ  r*   r*   r+   
remove_end  s    r  c                 C   sN   | d kst | dk r| S dD ],}| d |kr| d |kr| dd   S q| S )Nr   )r   r   r   r   r   r   )r   quoter*   r*   r+   remove_quotes  s    r  c                 C   s    t | j}|ddd S )Nr   r   )r   r  rT   r   r   )r	  rT   r*   r*   r+   url_basename  s    r  c                 C   s   t d|  S )Nzhttps?://[^?#&]+/)r   r   r   r  r*   r*   r+   base_url  s    r  c                 C   sp   t |tr|d}t |tr"|s&d S td|r6|S t | trJ| d} t | tr`td| sdd S t| |S )Nrg   z ^(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)r   r)  rV   r   r   r   r   urljoin)r  rT   r*   r*   r+   r  #  s    



 r  c                   @   s   e Zd Zdd ZdS )HEADRequestc                 C   s   dS )Nr  r*   r   r*   r*   r+   r  3  s    zHEADRequest.get_methodNr   r   r   r  r*   r*   r*   r+   r  2  s   r  c                   @   s   e Zd Zdd ZdS )
PUTRequestc                 C   s   dS )NPUTr*   r   r*   r*   r+   r  8  s    zPUTRequest.get_methodNr  r*   r*   r*   r+   r  7  s   r  c              	   C   sd   |r| d k	rt | |d } | dkr$d } | d kr0|S zt| | | W S  ttfk
r^   | Y S X d S rY  )rv  r  r  r@  )r  scaler   Zget_attrinvscaler*   r*   r+   int_or_none<  s    r  c                 C   s   | d kr|S t | S rR   r   r  r   r*   r*   r+   str_or_noneJ  s    r  c                 C   s2   t | tr| S t | tr.tdd| } t| S dS )z' A more relaxed version of int_or_none z[,\.\+]r-   N)r   r   r   r   r   r  )Zint_strr*   r*   r+   r  N  s
    

r  c              	   C   s@   | d kr|S zt | | | W S  ttfk
r:   | Y S X d S rR   )r  r  r@  )r  r  r  r   r*   r*   r+   float_or_noneW  s    r  c                 C   s   t | tr| S |S rR   r   boolr  r*   r*   r+   bool_or_none`  s    r  c                 C   s   t | tr|  S |S rR   )r   r   r   r  r*   r*   r+   strip_or_noned  s    r  c                 C   s.   | rt | tsd S |  } td| r*| S d S )Nz<^(?:(?:https?|rt(?:m(?:pt?[es]?|fp)|sp[su]?)|mms|ftps?):)?//)r   r   r   r   r   r  r*   r*   r+   url_or_noneh  s    r  c                 C   s  t | tsd S |  } d gd \}}}}}td| }|rN| \}}}}}nFtd| }|rr| \}}}}}n"td| }|r| \}}nd S d}|r|t|7 }|r|t|d 7 }|r|t|d d 7 }|r|t|d d d 7 }|r|t|7 }|S )Nr!  zg(?:(?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?(?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?Z?$a  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:ours?)?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r3     )r   r   r   r   r   rL  r  )r   rC  r  Zminsr5  msr   durationr*   r*   r+   parse_durationo  s:    
r  c                 C   s>   t j| \}}|r$|dd  |kr2d|||S d| |S )Nr   z
{0}.{1}{2}{0}.{1}rS   rT   splitextri  r   extr@  rv   Zreal_extr*   r*   r+   prepend_extension  s    
r  c                 C   s4   t j| \}}d|r(|dd  |kr,|n| |S )Nr  r   r  r  r*   r*   r+   r?    s
    r?  c                 C   s>   z"t j| g| t jt jd  W n tk
r8   Y dS X | S )z Checks if the given binary is installed somewhere in PATH, and returns its name.
    args can be a list of arguments for a short output (like -version) )r   r  F)
subprocessPopenPIPEcommunicaters   )exerz   r*   r*   r+   check_executable  s
    "r  	--versionpresentc                 C   sh   z.t jt| g| t jt jt jd \}}W n tk
rD   Y dS X t|tr\|	dd}t
|||S )z` Returns the version of the specified executable,
    or False if the executable is not present )stdinr   r  Fr,  r'  )r  r  r-  r  STDOUTr  rs   r   r)  rV   detect_exe_version)r  rz   
version_reunrecognizedrr  r   r*   r*   r+   get_exe_version  s     
r  c                 C   s<   t | tst|d krd}t|| }|r4|dS |S d S )Nzversion\s+([-0-9._a-zA-Z]+)r   )r   r   r   r   r  r   )outputr  r  r   r*   r*   r+   r    s    
r  c                   @   s   e Zd Zdd ZdS )	PagedListc                 C   s   t |  S rR   )r   getslicer   r*   r*   r+   __len__  s    zPagedList.__len__N)r   r   r   r
  r*   r*   r*   r+   r    s   r  c                   @   s    e Zd ZdddZd	ddZdS )
OnDemandPagedListTc                 C   s    || _ || _|| _|ri | _d S rR   )	_pagefunc	_pagesize
_use_cache_cache)r   pagefuncpagesizeZ	use_cacher*   r*   r+   r     s
    zOnDemandPagedList.__init__r   Nc           
      C   s*  g }t || j D ]}|| j }|| j | j }||kr>qd }| jrT| j|}|d krjt| |}| jrz|| j|< ||  kr|k rn n
|| j nd}|d k	r||  kr|krn n|d | j d nd }	|dks|	d k	r|||	 }|| t	|| | jk r q&||kr q&q|S )Nr   r   )
	itertoolsrs  r  r  r  r   ry  r  extendr   )
r   rO  rQ  r   pagenumZfirstidZnextfirstidZpage_resultsZstartvZendvr*   r*   r+   r	    sJ    

  
zOnDemandPagedList.getslice)T)r   Nr   r   r   r   r	  r*   r*   r*   r+   r    s   
r  c                   @   s   e Zd Zdd ZdddZdS )InAdvancePagedListc                 C   s   || _ || _|| _d S rR   )r  
_pagecountr  )r   r  Z	pagecountr  r*   r*   r+   r     s    zInAdvancePagedList.__init__r   Nc           
      C   s   g }|| j  }|d kr| jn|| j  d }||| j   }|d krDd n|| }t||D ]l}t| |}	|r||	|d  }	d }|d k	rt|	|k r|t|	8 }n|	d | }	||	  q||	 qV|S r  )r  r  r  ry  r  r   r  )
r   rO  rQ  r   Z
start_pageZend_pageZ
skip_elemsZ	only_morer  pager*   r*   r+   r	     s&    

zInAdvancePagedList.getslice)r   Nr  r*   r*   r*   r+   r    s   r  c                    s    t d td fdd| S )Nunicode_escapez\\U[0-9a-fA-F]{8}c                    s    |  dd S r   r   r   r  r*   r+   r\   ;  r]   z"uppercase_escape.<locals>.<lambda>codecs
getdecoderr   r   r  r*   r  r+   uppercase_escape7  s    

r  c                    s    t d td fdd| S )Nr  z\\u[0-9a-fA-F]{4}c                    s    |  dd S r   r  r   r  r*   r+   r\   C  r]   z"lowercase_escape.<locals>.<lambda>r  r  r*   r  r+   lowercase_escape?  s    

r   c                 C   s*   t jdk rt| tr| d} t| dS )z4Escape non-ASCII characters as suggested by RFC 3986rO   rg   s   %/;:@&=+$,!~*'()?#[])ri   rj   r   r   rL   r   r  r  r*   r*   r+   escape_rfc3986G  s    
r!  c                 C   sF   t | }|j|jddt|jt|jt|jt|j	d
 S )z#Escape URL as suggested by RFC 3986idnar,  )netlocrT   rE  queryfragment)r   _replacer#  rL   rV   r!  rT   rE  r$  r%  geturl)r	  Z
url_parsedr*   r*   r+   r  N  s    r  c              
   C   s>   dd }t | "}dd t||D W  5 Q R  S Q R X d S )Nc                 S   sN   t | ts| dd} d}| |r4| t|d  } |  } | drJdS | S )Nrg   r   u   ï»¿)r   ;]F)r   r   rV   r   r   r   )r	  BOM_UTF8r*   r*   r+   r
  [  s    


zread_batch_urls.<locals>.fixupc                 S   s   g | ]}|r|qS r*   r*   )r   r	  r*   r*   r+   r   g  s      z#read_batch_urls.<locals>.<listcomp>)
contextlibclosingr   )Zbatch_fdr
  fdr*   r*   r+   read_batch_urlsZ  s    r.  c                  O   s   t | |dS )Nr,  )r   rL   )rz   Zkargsr*   r*   r+   urlencode_postdataj  s    r/  c                 C   s>   |s| S t | }t|j}|| t |jt|ddS )NT)r$  )r   r  r   r$  rm   
urlunparser&  r   )r	  r$  
parsed_urlqsr*   r*   r+   update_url_queryn  s    


r3  c                 C   s   | j  }|| |p| j}t|p*|  |}|  }|dkrFt}	n|dkrTt}	nt	j
}	|	|||| j| jd}
t| dr| j|
_|
S )Nr  r  )r  r  r  r  rO  )r  copyrm   r  r3  r  r  r  r  r   r  r  r  r   rO  )r  r	  r  r  r$  Zreq_headersZreq_dataZreq_urlZreq_get_methodZreq_typeZnew_reqr*   r*   r+   r  x  s(    


   
r  c                 C   s   d| }d}|   D ]x\}}|d|d d 7 }t|trF|d}t|trZ|d}d| d | d }|d|krtd	||7 }q|d|d d
 7 }||fS )Nz multipart/form-data; boundary=%sr]   s   --r,  s   
rg   s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)r  rL   r   r   r  )r  boundarycontent_typerr  r  r  r   r*   r*   r+   _multipart_encode_impl  s    




r7  c                 C   sd   |dk	}|dkr$dt tdd }zt| |\}}W q\W q tk
rX   |rP d}Y qX q||fS )aR  
    Encode a dict to RFC 7578-compliant form-data

    data:
        A dict where keys and values can be either Unicode or bytes-like
        objects.
    boundary:
        If specified a Unicode object, it's used as the boundary. Otherwise
        a random boundary is generated.

    Reference: https://tools.ietf.org/html/rfc7578
    Nz---------------ir  )r   r.   	randranger7  r  )r  r5  Zhas_specified_boundaryrr  r6  r*   r*   r+   multipart_encode  s    r9  c                 C   sT   t |ttfrH|D ]0}|| ks| | d ks|r8| | s8q| |   S |S | ||S rR   )r   ry  tupler   )dZkey_or_keysr   Zskip_false_valuesr   r*   r*   r+   dict_get  s     r<  c                 C   sf   t |ttfs|g}|D ]H}z|| }W n ttttfk
rD   Y qX |d ksXt ||r|  S qd S rR   )r   ry  r:  rj  KeyErrorr@  
IndexError)srcgetterZexpected_typer   r  r*   r*   r+   try_get  s    rA  c                  G   sb   i }| D ]T}|  D ]F\}}|d kr&q||ksRt|tr|rt|| tr|| s|||< qq|S rR   )r  r   r   )ZdictsmergedZa_dictr  r  r*   r*   r+   merge_dicts  s     rC  rq  c                 C   s   t | tr| S t| ||S rR   )r   r   )stringrZ   errorsr*   r*   r+   encode_compat_str  s    rF  r     r     )GPGzPG-13RNCr         )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc                 C   s   t | tkr,d|   kr dkr(n n| S d S t| ts:d S td| }|rXt|dS | tkrht|  S tdddd t	D  | }|rt	d	|d
  S d S )Nr      z^(?P<age>\d{1,2})\+?$Zagez^TV[_-]?(%s)$r  c                 s   s   | ]}|d d V  qdS )rP   Nr*   )r   r  r*   r*   r+   r    s     z"parse_age_limit.<locals>.<genexpr>zTV-r   )
r   r  r   r   r   r   r   
US_RATINGSr   TV_PARENTAL_GUIDELINES)r   r   r*   r*   r+   parse_age_limit  s     
 rR  c                 C   s   t dd| S )Nz(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>r  )rm  r*   r*   r+   strip_jsonp  s
     rS  c                    sT   d}dj |d}dj |ddfdj |ddff  fd	d
}tdj ||d|| S )Nz/\*(?:(?!\*/).)*?\*/|//[^\n]*z\s*(?:{comment})?\s*)commentz!(?s)^(0[xX][0-9a-fA-F]+){skip}:?$)skipr  z(?s)^(0+[0-7]+){skip}:?$   c                    s   |  d}|dkr|S |ds<|ds<|ds<|dkr@dS |d dkrhtd	d
d |dd }nL D ]F\}}t||}|rlt| d|}|drd| nd|   S qld| S )Nr   )truefalsenullz/*r  !r/  r-   )r   r   z	(?s)\\.|"c                 S   s"   ddddd | d| dS )Nz\"r   r-   z\u00)r   z\'z\
z\xr   )r   r   r   r*   r*   r+   r\   &  s     z,js_to_json.<locals>.fix_kv.<locals>.<lambda>r   r   r   z"%d":r4  z"%s")r   r   r   r   r   r  r  )r   r  regexr  Zimr  ZINTEGER_TABLEr*   r+   fix_kv  s    
&
 zjs_to_json.<locals>.fix_kva9  (?sx)
        "(?:[^"\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^"\\]*"|
        '(?:[^'\\]*(?:\\\\|\\['"nurtbfx/\n]))*[^'\\]*'|
        {comment}|,(?={skip}[\]}}])|
        (?:(?<![0-9])[eE]|[a-df-zA-DF-Z_])[.a-zA-Z_0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:{skip}:)?|
        [0-9]+(?={skip}:)|
        !+
        )rT  rU  )ri  r   r   )rm  
COMMENT_REZSKIP_REr]  r*   r\  r+   
js_to_json  s      r_  c                    s    fdd}|S )z> Get a numeric quality value out of a list of possible values c                    s(   z  | W S  tk
r"   Y dS X d S )Nr   )r  r  )Zqidquality_idsr*   r+   qB  s    zqualities.<locals>.qr*   )ra  rb  r*   r`  r+   	qualities@  s    rc  z%(title)s-%(id)s.%(ext)sc                 C   s8   | dkrdS d}t | |kr4| d|t |  | S | S )z% Add ellipses to overly long strings Nz...r  )r   lengthZELLIPSESr*   r*   r+   limit_lengthM  s    re  c                 C   s   t dd td| D S )Nc                 s   s   | ]}t |V  qd S rR   )r  )r   r  r*   r*   r+   r  X  s     z version_tuple.<locals>.<genexpr>z[-.])r:  r   r   r  r*   r*   r+   version_tupleW  s    rg  c                 C   s<   | s
| S zt | t |k W S  tk
r6   |  Y S X d S rR   )rg  r  )versionlimitZ
assume_newr*   r*   r+   is_outdated_version[  s    rj  c                  C   s(   ddl m}  tt d| p&ttdS )z. Returns if youtube-dl can be updated with -U r   zipimporter
__loader__frozen)	zipimportrl  r   globalsr   r   ri   rk  r*   r*   r+   rG  d  s    rG  c                 C   s   d dd | D S )Nr   c                 s   s   | ]}t |V  qd S rR   )r   )r   r  r*   r*   r+   r  m  s     zargs_to_str.<locals>.<genexpr>)r   )rz   r*   r*   r+   args_to_strk  s    rq  c                 C   s&   t | }tjd dk r"|t }|S )Nr   rP   )r   ri   rj   rV   rN   )r   err_strr*   r*   r+   error_to_compat_strp  s    rs  c                 C   s   | d krd S ddd | }|d k	r(|S | d\}}}|dd   }ddd	d
ddddddddddddddd ||S )Nr9   r@   )z	audio/mp4z
audio/mpegr   r(  r   r?   ttdfxpttmlr;   r8   Zsamir>   rC   ZmpdrB   Zismr=   tsrA   )Z3gppzsmptett+xmlzttaf+xmlzttml+xmlzx-flvzx-mp4-fragmentedz	x-ms-samizx-ms-wmvZmpegurlz	x-mpegurlzvnd.apple.mpegurlzdash+xmlzf4m+xmlzhds+xmlzvnd.ms-sstr+xmlZ	quicktimeZmp2tzx-wav)r   r9  r   r   r  )mtr  r   r   r*   r*   r+   mimetype2exty  sB     ry  c                 C   s   | si S t td tdd |  dd}d\}}|D ]F}|dd }|dkr`|s|}q<|dkrr|s|}q<td	| tj q<|s|st|d
kr|d |d dS n|pd|pddS i S )Nc                 S   s   |   S rR   )r   )r   r*   r*   r+   r\     r]   zparse_codecs.<locals>.<lambda>r/  )NNr_   r   )Zavc1Zavc2Zavc3Zavc4Zvp9Zvp8Zhev1Zhev2Zh263Zh264Zmp4vZhvc1Zav01Ztheora)Zmp4ar<   Zvorbisr@   r:   zac-3zec-3Zeac3ZdtscZdtseZdtshZdtslzWARNING: Unknown codec %s
r   r   )vcodecacodecnone)	ry  filterr   r   r   r  ri   r  r   )Z
codecs_strZsplit_codecsrz  r{  Z
full_codeccodecr*   r*   r+   parse_codecs  s2     r  c                 C   sJ   | j j}|d}|r>td|}|r>t|dd d}|r>|S t|dS )NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r   )r<  zContent-Type)r  r   r   r   r>  r   ry  )Z
url_handle	getheaderZcdr   r  r*   r*   r+   urlhandle_detect_ext  s    r  c                 C   s   d|t | df S )Nzdata:%s;base64,%sr,  )base64	b64encoderV   )r  Z	mime_typer*   r*   r+   encode_data_uri  s    r  c                 C   s    |dkrdS | dkrdS || k S )z0 Returns True iff the content should be blocked NFr*   )Zcontent_limitZ	age_limitr*   r*   r+   age_restricted  s
    r  c                 C   sZ   dddddg}|D ].\}}|  |r| t|d |d} qNq| dd}td	|S )
zC Detect whether a file contains HTML by examining its first bytes. )s   ﻿rg   )s     z	utf-32-be)s     z	utf-32-le)s   z	utf-16-le)s   z	utf-16-beNr   rg   z^\s*<)r   r   rV   r   r   )Zfirst_bytesBOMSbomrx  r   r*   r*   r+   is_html  s    
r  c                 C   sr   |  d}|d k	r|S | d }|dr,dS |dr:dS |drHdS t|}|dkr\dS |dkrhdS t|jS )Nprotocolr	  ZrtmpmmsrtsprC   rB   )r   r   r>  r   r)   )	info_dictr  r	  r  r*   r*   r+   determine_protocol  s     



r  c                    sT   | g| }dd t | D }ddd |dd D d  d	 fd
d|D S )z1 Render a list of rows, each as a list of values c                 S   s   g | ]}t d d |D qS )c                 s   s   | ]}t t|V  qd S rR   )r   r   )r   r  r*   r*   r+   r    s     z*render_table.<locals>.<listcomp>.<genexpr>)rR  )r   colr*   r*   r+   r     s     z render_table.<locals>.<listcomp>r   c                 s   s"   | ]}d t |d  d V  qdS )z%-r   r   Nr  )r   mlr*   r*   r+   r    s     zrender_table.<locals>.<genexpr>Nr   z%sr   c                 3   s   | ]} t | V  qd S rR   )r:  )r   rowZ
format_strr*   r+   r  	  s     )zipr   )Z
header_rowr  tableZmax_lensr*   r  r+   render_table  s    
 r  c           
   	   C   s  t jt jt jt jt jt jd}tdd	t
tj|  }|| }|r||d }||d}|dd k	s|dd k	s|d k	r|dd k	rt|tr|dd	krtd
|d |dp|dp|d}|d}|d k	r|d| |}ntzt|d}W n` tk
r   t|d}|d kr`t|dd }|d krtd|d| f Y nX |d kr|dS |||S dd dd d}	tdd	t
tj|	  }|| }|r|	|d }||d}||S td|  d S )N)<z<=>z>==!=aC  (?x)\s*
        (?P<key>[a-z_]+)
        \s*(?P<op>%s)(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<intval>[0-9.]+(?:[kKmMgGtTpPeEzZyY]i?[Bb]?)?)|
            (?P<quote>["\'])(?P<quotedstrval>(?:\\.|(?!(?P=quote)|\\).)+?)(?P=quote)|
            (?P<strval>(?![0-9.])[a-z0-9A-Z]*)
        )
        \s*$
        r  opr   ZquotedstrvalstrvalZintval)r  r  z+Operator %s does not support string values!r  z\%sr  z*Invalid integer value %r in filter part %rZnone_inclusivec                 S   s   t | tr| dkS | d k	S r.  r  rf  r*   r*   r+   r\   B  r]   z_match_one.<locals>.<lambda>c                 S   s   t | tr| dkS | d kS )NFr  rf  r*   r*   r+   r\   C  r]   )r-   rZ  zC(?x)\s*
        (?P<op>%s)\s*(?P<key>[a-z_]+)
        \s*$
        zInvalid filter part %r)operatorltlegtgeeqner   compiler   r   r   keysr  r   r   r   r   r  r   r  r  )
filter_partdctZCOMPARISON_OPERATORSZoperator_rexr   r  Zactual_valueZcomparison_valuer  ZUNARY_OPERATORSr*   r*   r+   
_match_one  sv    	





 




r  c                    s   t  fdd| dD S )zY Filter a dictionary with a simple string syntax. Returns True (=passes filter) or false c                 3   s   | ]}t | V  qd S rR   )r  )r   r  r  r*   r+   r  U  s    zmatch_str.<locals>.<genexpr>&)allr   )
filter_strr  r*   r  r+   	match_strR  s    r  c                    s    fdd}|S )Nc                    s2   t  | rd S | d| dd}d| f S d S )Nr  r   videoz'%s does not pass filter %s, skipping ..)r  r   )r  Zvideo_titler  r*   r+   _match_funcZ  s    
z&match_filter_func.<locals>._match_funcr*   )r  r  r*   r  r+   match_filter_funcY  s    r  c                 C   st   | sd S t d| }|r&t|dS t d| }|rpdt|d dt|d  t|dd	d
 S d S )Nz"^(?P<time_offset>\d+(?:\.\d+)?)s?$Ztime_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$r2  r   r3  r   rP   r   r_   )r   r   r  r   r  r   )Z	time_exprr  r*   r*   r+   parse_dfxp_time_exprc  s    r  c                 C   s(   d| d | d d | d | d d f S )Nz%02d:%02d:%02d,%03dr2  r3  r   r  r*   )secondsr*   r*   r+   srt_subtitles_timecodep  s    r  c              	      sb  ddddgfddgff}ddd	d
ddg t jtdddddi i G  fdddtfdd}|D ]\}}|D ]}| ||} q|qpt| }g }|dp|d}|stdd}	|dD ]}
|
dp|
d}|sq|
d}|r$|krd}	q҈| 	 |<  D ].}|
d| }|r(|
|i |< q(q|	rld}	qĐqlqd D ]R}t|d!| d"| g}|d#krqp|d}
|
sqp|
 qpt|td$D ]\}}t|jd%}t|jd&}t|jd'}|d#krq|s2|s*q|| }|d(|t|t|||f  qd)|S )*z
    @param dfxp_data A bytes-like object containing DFXP data
    @returns A unicode object containing converted SRT data
    s   http://www.w3.org/ns/ttmls   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#stylecolor
fontFamilyfontSize	fontStyle
fontWeighttextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)xmlrv  Ztts)r   c                       sF   e Zd ZdZg Zg Z fddZfddZdd Zdd	 Z	d
S )z$dfxp2srt.<locals>.TTMLPElementParserr-   c                    s  |ddfkr"|  j d7  _ ng }i }|d}rB| |rX||i   D ]"}|d| }|r\|||< q\|rd}t| D ]\}	}
| jr| jd |	|
krq|	dkr|d	|
 7 }q|	d
kr|d|
 7 }q|	dkr|d|
 7 }q|	dkr*|
dkr*|  j d7  _ |d q|	dkrX|
dkrX|  j d7  _ |d q|	dkr|
dkr|  j d7  _ |d q|r|  j d| d 7  _ |d i }| jr|| jd  || | j| | j| d S )Nttml:brbrr   styletts:r-   r   r  z color="%s"r  z
 size="%s"r  z
 face="%s"r  Zboldz<b>r*  r  Zitalicz<i>r  r  Z	underlinez<u>r  z<fontr  font)_outr   rm   sortedr  _applied_stylesr(   _unclosed_elements)r   r   r   unclosed_elementsr  Zelement_style_idpropprop_valr  r  r  Zapplied_styleSUPPORTED_STYLING_xdefault_stylestylesr*   r+   rO    sT    




z*dfxp2srt.<locals>.TTMLPElementParser.startc                    sR   | ddfkrN| j  }t|D ]}|  jd| 7  _q"|rN| jrN| j  d S )Nr  r  z</%s>)r  r  reversedr  r  )r   r   r  element)r  r*   r+   rQ    s    

z(dfxp2srt.<locals>.TTMLPElementParser.endc                 S   s   |  j |7  _ d S rR   )r  )r   r  r*   r*   r+   r    s    z)dfxp2srt.<locals>.TTMLPElementParser.datac                 S   s
   | j  S rR   )r  r   r   r*   r*   r+   r     s    z*dfxp2srt.<locals>.TTMLPElementParser.closeN)
r   r   r   r  r  r  rO  rQ  r  r   r*   r  r*   r+   TTMLPElementParser  s   -r  c                    s2     }t jjj|d}|t jj|  | S )N)target)r  etreeElementTree	XMLParserr   tostringr   )r   r  r   )r  r*   r+   
parse_node  s    zdfxp2srt.<locals>.parse_nodez	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFz.//ttml:styler   zxml:idr  Tr  )bodydivz.//ttml:z.//Nr   beginrQ  durz%d
%s --> %s
%s

r-   )r  r  r   objectr   r   r   r  r   r4  
setdefaultr   rm   r  r  rs  r  r   r(   r  r   )Z	dfxp_dataZLEGACY_NAMESPACESr  r  r  r   ru  rr  Zparasrepeatr  Zstyle_idZparent_style_idr  r  pZeleparar  Z
begin_timeZend_timer  r*   )r  r  r  r  r  r+   dfxp2srtt  s    	
@



r  c                 C   s*   |  |}|rt|}|d k	r&||gS g S rR   )r   r   )rE  command_optionparamr*   r*   r+   
cli_option  s    
r  rW  rX  c                 C   sN   |  |}|d krg S t|ts$t|r>|| |r6|n| gS ||rH|n|gS rR   )r   r   r  r   )rE  r  r  Z
true_valueZfalse_value	separatorr*   r*   r+   cli_bool_option  s    
r  c                 C   s   |  |}||kr|gS g S rR   )r   )rE  r  r  Zexpected_valuer*   r*   r+   cli_valueless_option)  s    
r  c                 C   s(   |  |}|d kr|S t|ts$t|S rR   )r   r   ry  r   )rE  r  r   Zex_argsr*   r*   r+   cli_configuration_args.  s
    
r  c                   @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d9d:d;d<d=d>d?d@dAdBdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd Zedd ZdS )ISO639UtilsZaarZabkZaveZafrZakaZamhargZaraZasmZavaZaymZazeZbakZbelZbulZbihZbisZbamZbenZbodZbreZboscatZcheZchacosZcreZcesZchuZchvZcymZdanZdeur  ZdzoZeweZellZengZepoZspaZestZeusZfasZfulZfinZfijZfaoZfraZfryZgleZglaZglgZgrnZgujZglvZhauZhebZhinZhmoZhrvZhatZhunZhyeZherZinaindZileZiboZiiiZipkZidoZislZitaZikuZjpnZjavZkatZkonZkikZkuaZkazZkalZkhmZkanZkorZkauZkasZkurZkomZcorZkirZlatZltzZlugZlimZlinZlaoZlitZlubZlavZmlgZmahZmriZmkdZmalmonmarZmsaZmltZmyaZnauZnobZndeZnepZndoZnldZnnoZnorZnblnavZnyaZociZojiZormZoriZossZpanZpliZpolZpusZporZqueZrohrunZronZrusZkinsanZsrdZsndZsmeZsagsinZslkZslvZsmoZsnaZsomZsqiZsrpZsswZsotsunZsweZswaZtamtelZtgkZthaZtirZtukZtglZtsnZtonZturZtsoZtatZtwiZtahZuigZukrZurdZuzbZvenZvieZvolZwlnZwolZxhoZyidZyorZzhaZzhoZzul)ZaaabrG   ru  ZakamZanarasavZayazbabebgZbhZbiZbmZbnZbor  rz  caZcechcoZcrcsZcuZcvcydadeZdvZdzeer  r6   eoeseteufafffifjfor7   ZfygagdglZgnZgugvZhaheiwhiZhohrZhthuZhyhziar   inZieZigiiZikr  isitiujaZjvkaZkgZkiZkjr  klkmknkoZkrksZkukvkwkyZlaZlbZlglilnlor  ZlulvZmgZmhmimkr  mnmrr  rx  ZmynanbZndr  ZngnlnnnonrnvnyocZojZomorrS   papiplZpsptZquZrmZrnrorurwr  ZscsdseZsgsiskslsmZsnsosqsrrF   stZsusvswtatetgrH   ZtiZtktltntotrrw  rt  ZtwtyZugukuruzveviZvowaZwoxhyiZjiZyoZzazhzuc                 C   s   | j |dd S )z3Convert language code from ISO 639-1 to ISO 639-2/TNr   )	_lang_mapr   rS  rm  r*   r*   r+   
short2long  s    zISO639Utils.short2longc                 C   s(   | j  D ]\}}||kr
|  S q
dS )z3Convert language code from ISO 639-2/T to ISO 639-1N)r]  r  )rS  rm  Z
short_nameZ	long_namer*   r*   r+   
long2short  s    zISO639Utils.long2shortN)r   r   r   r]  rW  r_  r`  r*   r*   r*   r+   r  6  s    ?
r  c                   @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS )ISO3166UtilsZAfghanistanu   Åland IslandsZAlbaniaZAlgeriazAmerican SamoaZAndorraZAngolaZAnguillaZ
AntarcticazAntigua and BarbudaZ	ArgentinaZArmeniaZArubaZ	AustraliaZAustriaZ
AzerbaijanZBahamasZBahrainZ
BangladeshZBarbadosZBelarusZBelgiumZBelizeZBeninZBermudaZBhutanzBolivia, Plurinational State ofz Bonaire, Sint Eustatius and SabazBosnia and HerzegovinaZBotswanazBouvet IslandZBrazilzBritish Indian Ocean TerritoryzBrunei DarussalamZBulgariazBurkina FasoZBurundiZCambodiaZCameroonZCanadaz
Cape VerdezCayman IslandszCentral African RepublicZChadZChileZChinazChristmas IslandzCocos (Keeling) IslandsZColombiaZComorosZCongoz%Congo, the Democratic Republic of thezCook Islandsz
Costa Ricau   Côte d'IvoireZCroatiaZCubau   CuraçaoZCypruszCzech RepublicZDenmarkZDjiboutiZDominicazDominican RepublicZEcuadorZEgyptzEl SalvadorzEquatorial GuineaZEritreaZEstoniaZEthiopiazFalkland Islands (Malvinas)zFaroe IslandsZFijiZFinlandZFrancezFrench GuianazFrench PolynesiazFrench Southern TerritoriesZGabonZGambiaZGeorgiaZGermanyZGhanaZ	GibraltarZGreeceZ	GreenlandZGrenadaZ
GuadeloupeZGuamZ	GuatemalaZGuernseyZGuineazGuinea-BissauZGuyanaZHaitiz!Heard Island and McDonald IslandszHoly See (Vatican City State)ZHondurasz	Hong KongZHungaryZIcelandZIndiaZ	IndonesiazIran, Islamic Republic ofZIraqZIrelandzIsle of ManZIsraelZItalyZJamaicaZJapanZJerseyZJordanZ
KazakhstanZKenyaZKiribatiz&Korea, Democratic People's Republic ofzKorea, Republic ofZKuwaitZ
Kyrgyzstanz Lao People's Democratic RepublicZLatviaZLebanonZLesothoZLiberiaZLibyaZLiechtensteinZ	LithuaniaZ
LuxembourgZMacaoz*Macedonia, the Former Yugoslav Republic ofZ
MadagascarZMalawiZMalaysiaZMaldivesZMaliZMaltazMarshall IslandsZ
MartiniqueZ
MauritaniaZ	MauritiusZMayotteZMexicozMicronesia, Federated States ofzMoldova, Republic ofZMonacoZMongoliaZ
MontenegroZ
MontserratZMoroccoZ
MozambiqueZMyanmarZNamibiaZNauruZNepalZNetherlandszNew CaledoniazNew ZealandZ	NicaraguaZNigerZNigeriaZNiuezNorfolk IslandzNorthern Mariana IslandsZNorwayZOmanZPakistanZPalauzPalestine, State ofZPanamazPapua New GuineaZParaguayZPeruZPhilippinesZPitcairnZPolandZPortugalzPuerto RicoZQataru   RéunionZRomaniazRussian FederationZRwandau   Saint Barthélemyz,Saint Helena, Ascension and Tristan da CunhazSaint Kitts and NeviszSaint LuciazSaint Martin (French part)zSaint Pierre and Miquelonz Saint Vincent and the GrenadinesZSamoaz
San MarinozSao Tome and PrincipezSaudi ArabiaZSenegalZSerbiaZ
SeychelleszSierra LeoneZ	SingaporezSint Maarten (Dutch part)ZSlovakiaZSloveniazSolomon IslandsZSomaliazSouth Africaz,South Georgia and the South Sandwich IslandszSouth SudanZSpainz	Sri LankaZSudanZSurinamezSvalbard and Jan MayenZ	SwazilandZSwedenZSwitzerlandzSyrian Arab RepubliczTaiwan, Province of ChinaZ
TajikistanzTanzania, United Republic ofZThailandzTimor-LesteZTogoZTokelauZTongazTrinidad and TobagoZTunisiaZTurkeyZTurkmenistanzTurks and Caicos IslandsZTuvaluZUgandaZUkrainezUnited Arab EmirateszUnited KingdomzUnited Statesz$United States Minor Outlying IslandsZUruguayZ
UzbekistanZVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaZYemenZZambiaZZimbabwe)AFAXALDZASADAOAIAQAGARAMAWAUATAZBSBHBDBBBYBEBZBJBMBTBOBQBABWZBVBRIOBNBGBFBIKHCMCACVKYCFTDCLCNZCXCCCOKMCGCDCKCRCIHRCUCWCYCZDKDJDMDOECEGSVGQEREEETFKFOFJFIFRGFPFZTFGAGMGEDEGHGIGRGLGDGPGUGTGGGNGWGYHTZHMVAHNHKHUISINIDIRIQIEIMILITJMJPJEJOKZKEKIKPKRKWKGLALVLBLSLRLYLILTLUMOMKMGMWMYMVMLMTMHMQMRMUYTMXFMMDMCMNMEMSMAMZMMNANRNPNLrL  NZNINENGNUNFMPNOOMPKPWPSPArJ  PYPEPHZPNPLPTPRQARERORURWBLZSHKNLCMFPMVCWSSMSTSASNRSSCSLSGSXSKSISBSOZAZGSSSESLKSDSRZSJSZSECHSYTWTJTZrE   TLTGTKTOTTTNTRTMTCTVUGUArD   r  USZUMUYUZVUVEVNVGVIWFZEHYEZMZWc                 C   s   | j | S )zAConvert an ISO 3166-2 country code to the corresponding full name)_country_mapr   upperr^  r*   r*   r+   
short2full  s    zISO3166Utils.short2fullN)r   r   r   rL  rW  rN  r*   r*   r*   r+   ra    s    }ra  c                   @   s  e Zd Zddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddZedd ZdS )GeoUtilsz46.172.224.0/19z94.200.0.0/13z149.54.0.0/17z209.59.64.0/18z204.14.248.0/21z46.99.0.0/16z46.70.0.0/15z105.168.0.0/13z182.50.184.0/21z23.154.160.0/24z181.0.0.0/12z202.70.112.0/20z77.116.0.0/14z1.128.0.0/11z181.41.0.0/18z185.217.4.0/22z5.197.0.0/16z31.176.128.0/17z65.48.128.0/17z114.130.0.0/16z
57.0.0.0/8z102.178.0.0/15z95.42.0.0/15z37.131.0.0/17z154.117.192.0/18z137.255.0.0/16z185.212.72.0/23z196.12.64.0/18z156.31.0.0/16z161.56.0.0/16z161.0.80.0/20z191.128.0.0/12z24.51.64.0/18z119.2.96.0/19z168.167.0.0/16z178.120.0.0/13z179.42.192.0/18z99.224.0.0/11z41.243.0.0/16z197.242.176.0/21z160.113.0.0/16z85.0.0.0/13z102.136.0.0/14z202.65.32.0/19z152.172.0.0/14z102.244.0.0/14z36.128.0.0/10z181.240.0.0/12z201.192.0.0/12z152.206.0.0/15z165.90.96.0/19z190.88.128.0/17z31.153.0.0/16z88.100.0.0/14z
53.0.0.0/8z197.241.0.0/17z87.48.0.0/12z192.243.48.0/20z152.166.0.0/15z41.96.0.0/12z186.68.0.0/15z90.190.0.0/15z156.160.0.0/11z196.200.96.0/20z88.0.0.0/11z196.188.0.0/14z2.16.0.0/13z91.152.0.0/13z144.120.0.0/16z80.73.208.0/21z119.252.112.0/20z88.85.32.0/19z
90.0.0.0/9z41.158.0.0/15z
25.0.0.0/8z74.122.88.0/21z31.146.0.0/16z161.22.64.0/18z62.68.160.0/19z154.160.0.0/12z95.164.0.0/16z88.83.0.0/19z160.182.0.0/15z197.149.192.0/18z104.250.0.0/19z105.235.224.0/20z94.64.0.0/13z168.234.0.0/16z168.123.0.0/16z197.214.80.0/20z181.41.64.0/18z113.252.0.0/14z181.210.0.0/16z93.136.0.0/13z148.102.128.0/17z84.0.0.0/14z39.192.0.0/10z87.32.0.0/12z79.176.0.0/13z5.62.80.0/20z117.192.0.0/10z203.83.48.0/21z37.236.0.0/14z2.176.0.0/12z82.221.0.0/16z79.0.0.0/10z87.244.64.0/18z72.27.0.0/17z176.29.0.0/16z133.0.0.0/8z105.48.0.0/12z158.181.128.0/17z36.37.128.0/17z103.25.140.0/22z197.255.224.0/20z198.167.192.0/19z175.45.176.0/22z175.192.0.0/10z37.36.0.0/14z64.96.0.0/15z2.72.0.0/13z115.84.64.0/18z178.135.0.0/16z24.92.144.0/20z82.117.0.0/19z112.134.0.0/15z102.183.0.0/16z129.232.0.0/17z78.56.0.0/13z188.42.0.0/16z46.109.0.0/16z41.252.0.0/14z105.128.0.0/11z88.209.64.0/18z37.246.0.0/16z178.175.0.0/17z74.112.232.0/21z154.126.0.0/17z117.103.88.0/21z77.28.0.0/15z154.118.128.0/18z37.111.0.0/17z49.0.128.0/17z60.246.0.0/16z202.88.64.0/20z109.203.224.0/19z41.188.64.0/18z208.90.112.0/22z46.11.0.0/16z105.16.0.0/12z27.114.128.0/18z102.70.0.0/15z187.192.0.0/11z175.136.0.0/13z197.218.0.0/15z41.182.0.0/16z101.101.0.0/18z197.214.0.0/18z203.17.240.0/22z105.112.0.0/12z186.76.0.0/15z145.96.0.0/11z84.208.0.0/13z36.252.0.0/15z203.98.224.0/19z49.156.48.0/22z49.224.0.0/14z5.36.0.0/15z186.72.0.0/15z186.160.0.0/14z123.50.64.0/18z124.240.192.0/19z49.144.0.0/13z39.32.0.0/11z83.0.0.0/11z70.36.0.0/20z66.50.0.0/16z188.161.0.0/16z85.240.0.0/13z202.124.224.0/20z181.120.0.0/14z37.210.0.0/15z102.35.0.0/16z79.112.0.0/13z93.86.0.0/15z5.136.0.0/13z41.186.0.0/16z188.48.0.0/13z202.1.160.0/19z154.192.0.0/11z102.120.0.0/13z78.64.0.0/12z8.128.0.0/10z188.196.0.0/14z78.98.0.0/15z102.143.0.0/17z89.186.32.0/19z41.82.0.0/15z154.115.192.0/18z186.179.128.0/17z105.235.208.0/21z197.159.160.0/19z168.243.0.0/16z190.102.0.0/20z
5.0.0.0/16z41.84.224.0/19z65.255.48.0/20z154.68.128.0/19z196.168.0.0/14z171.96.0.0/13z85.9.128.0/18z27.96.24.0/21z180.189.160.0/20z95.85.96.0/19z197.0.0.0/11z175.176.144.0/21z78.160.0.0/11z186.44.0.0/15z202.2.96.0/19z120.96.0.0/11z156.156.0.0/14z37.52.0.0/14z102.80.0.0/13z	6.0.0.0/8z167.56.0.0/13z84.54.64.0/18z212.77.0.0/19z207.191.240.0/21z186.88.0.0/13z66.81.192.0/20z146.226.0.0/16z14.160.0.0/11z202.80.32.0/20z117.20.32.0/21z202.4.32.0/19z134.35.0.0/16z41.242.116.0/22z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)rg  rD   rb  rk  ri  rd  rm  rh  ZAPrj  rl  rf  rp  ro  rn  rc  rq  r~  ru  rt  rw  r  r  rs  r  ry  r  rz  r  r|  r}  r  rr  r{  r  rv  rx  r  r  r  r  r/  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  re  r  r  r  r  r)  r  ZEUr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rL  r  r   r  r  r  r  r  r  r  r  r  r  r	  r  rJ  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r  r+  r.  r!  r$  r#  r   r  r  r&  r,  r(  r  r  r"  r0  r-  r<  r  r5  rE   r2  r6  r4  r;  r9  r7  r:  r8  r=  r1  r3  r?  r>  r@  rA  rB  r  r  rD  rF  rG  rE  rC  rH  r  rI  r  r'  rJ  rK  c              	   C   sx   t |dkr&| j| }|s*d S n|}|d\}}tdt|d }|dt|? B }t	t
tdt||S )Nr   r   z!Lr   r  )r   _country_ip_mapr   rM  r   r   rN  	inet_atonr  r   	inet_ntoar   r.   randint)rS  Zcode_or_blockblockrs  ZpreflenZaddr_minZaddr_maxr*   r*   r+   random_ipv4  s    zGeoUtils.random_ipv4N)r   r   r   rP  rW  rU  r*   r*   r*   r+   rO    s    trO  c                   @   s   e Zd ZdddZdd ZdS )PerRequestProxyHandlerNc                 C   s:   dD ]"}t | d| d|| jfdd qtj| | d S )N)httphttpsz%s_open__noproxy__c                 S   s   || ||S rR   r*   )r  proxyr   methr*   r*   r+   r\     s    z1PerRequestProxyHandler.__init__.<locals>.<lambda>)setattr
proxy_openr   ProxyHandlerr   )r   proxiesr   r*   r*   r+   r     s
    
zPerRequestProxyHandler.__init__c                 C   sb   |j d}|d k	r |}|j d= |dkr,d S t|j dkrP|d| d S tj	| |||S )NzYtdl-request-proxyrY  r"   r  )
r  r   r   r  r)   r  r  r   r^  r]  )r   r  rZ  r   Z	req_proxyr*   r*   r+   r]    s       z!PerRequestProxyHandler.proxy_open)N)r   r   r   r   r]  r*   r*   r*   r+   rV    s   
rV  c                 C   s   d}t | } | dkr0td| d@ | }| d? } qtt|D ]}|| dkr< qZq<d}d}||d }|dkrt|| r|t||  d | }|S )a  long_to_bytes(n:long, blocksize:int) : string
    Convert a long integer to a byte string.

    If optional blocksize is given and greater than zero, pad the front of the
    byte string with binary zeros so that the length is a multiple of
    blocksize.
    r]   r   >Ir  r       N)r  r   r  r   )r   	blocksizer   r  r*   r*   r+   long_to_bytes(  s    	
rc  c                 C   sl   d}t | }|d r4d|d  }d| |  } || }td|dD ]&}|d> td| ||d  d  }q@|S )zbytes_to_long(string) : long
    Convert a byte string to a long integer.

    This is (essentially) the inverse of long_to_bytes().
    r      ra  r   r`  )r   r  r   )r   accrd  extrar  r*   r*   r+   bytes_to_longF  s    $rg  c                 C   s.   t t| ddd d}t|||}d| S )a0  
    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

    Input:
        data: data to encrypt, bytes-like object
        exponent, modulus: parameter e and N of RSA algorithm, both integer
    Output: hex string of encrypted data

    Limitation: supports one block encryption only
    Nr   r  z%x)r  binasciihexlifypow)r  r  moduluspayloadZ	encryptedr*   r*   r+   ohdave_rsa_encryptW  s    rm  c                 C   sL   t | |d krtddd t|t |  d D }ddg| dg |  S )z
    Padding input data with PKCS#1 scheme

    @param {int[]} data        input data
    @param {int}   length      target length
    @returns {int[]}           padded data
       z&Input data too long for PKCS#1 paddingc                 S   s   g | ]}t d dqS )r      )r.   rS  )r   r   r*   r*   r+   r   s  s     zpkcs1pad.<locals>.<listcomp>rP   r   r   )r   r  r  )r  rd  Zpseudo_randomr*   r*   r+   pkcs1padh  s    rp  c                 C   sj   d}|s|d | }|t |kr4td|t |f | dkrD|d S d}| rf|| |  | }| | } qH|S )NZ>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase %d exceeds table length %dr   r-   )r   r  )r  r   r  Z
FULL_TABLErt  r*   r*   r+   encode_base_nw  s    
rq  c                    sx   t t| }| \}}}}t|}t|}|d}i  |rb|d8 }t||}|| pZ| |< q:t d fdd|S )Nr  r   z	\b(\w+)\bc                    s    |  d S r   r  )r  Zsymbol_tabler*   r+   r\     r]   z%decode_packed_codes.<locals>.<lambda>)r   r  PACKED_CODES_RErL  r  r   rq  r   )rm  r  Zobfuscated_coder  rs  symbolsZbase_n_countr*   rr  r+   decode_packed_codes  s    

 
ru  c                    s0   dkr| S t  d fdd| D S )Nr   r-   c                 3   s0   | ](}| kr$   |   n|V  qd S rR   )r  r   alphabetlshiftr*   r+   r    s   zcaesar.<locals>.<genexpr>)r   r   )r   rw  ry  r*   rv  r+   caesar  s    rz  c                 C   s   t | ddS )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )rz  r  r*   r*   r+   rot47  s    r|  c                 C   s<   i }t d| D ]&\}}|dr.|dd }|||< q|S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r   r   r   )r   r   r   )r   infor   r   r*   r*   r+   parse_m3u8_attributes  s    

r~  c                 C   s   | dkr| |? S | d |? S )Nr   l        r*   )r   r   r*   r*   r+   urshift  s    r  c                    s  | dd  }| d d dks,|dd dkr4t ddddd	  fd
d}g }|r||d d }|dd  }|d d }|dd  }|d | }||d  }|dd  }||||d qP|d d }||d d }||dd }	d}
|D ]}|d dkr|
|d 7 }
q|
s t dtt|
}|d g fdd}t|	D ]}|d  }|| }g }| tD ]`}|d| |  }| | }d}d}|dkr||d }|dkr|| }|dkr|| d@ }n|dkr|| d@ }n|dkr&||| d?  d@ }n|dkr|}|}d}|dkr`|dkr`|| d }|| | }t|| }t|| }t|| }||kr||kr|| d@ }n$||kr|| d@ }n|| d@ }|| qqP||	fS )NrV  s   PNG

rd  s   IHDRzNot a valid PNG file.z>Bz>Hr`  )r   r   rd  c                    s   t  t|  | d S r   )r   r   )r  )int_mapr*   r+   r\     r]   zdecode_png.<locals>.<lambda>)r   rd  r  r   r  r]   r   s   IDATzUnable to read PNG data.rP   c                    s   |  }|  } | | S rR   r*   )idxr  rI   )pixelsstrider*   r+   
_get_pixel  s    zdecode_png.<locals>._get_pixelr   r      )r   r(   	bytearrayr  r  r  abs)Zpng_dataheaderZunpack_integerchunksrd  Z
chunk_typeZ
chunk_dataZihdrr  r  ZidatchunkZdecompressed_datar  rI   ZbasePosZfilter_typeZcurrent_rowr  r  ZbasexleftZupr  r*  r   r  r8  r  Zpcr*   )r  r  r  r+   
decode_png  s     








r  c                 C   s\  zdd l }t|drDd}t|jt|k r<td||jf |j}n|j}z|| || W n0 tk
r } zt|j	|j
W 5 d }~X Y nX W n tk
rV   tdkr0d|ksttj| st| d | }z$t|d}|| W 5 Q R X W n2 tk
r* } zt|j	|j
W 5 d }~X Y nX n"tdd	g}	td
dg}
|	sT|
r2|d}|	rvd}d|d|g}n|
rd
}d||g}t|dgdd |D  t| dg }ztj|tjtjtjd}W n2 tk
r } zt|j	|j
W 5 d }~X Y nX | \}}|dd}|jdkrRt|j|n tjdrJtdntdY nX d S )Nr   setz0.5.0zpython-pyxattr is detected but is too old. youtube-dl requires %s or above while your version is %s. Falling back to other xattr implementationsntr   rd   Zsetfattrr  xattrz-hrg   z-nz-vz-wTc                 S   s   g | ]}t |qS r*   )r-  )r   or*   r*   r+   r   X  s     zwrite_xattr.<locals>.<listcomp>)r   r  r  r   linuxzCouldn't find a tool to set the xattrs. Install either the python 'pyxattr' or 'xattr' modules, or the GNU 'attr' package (which contains the 'setfattr' tool).zhCouldn't find a tool to set the xattrs. Install either the python 'xattr' module, or the 'xattr' binary.)r  r   rg  __version__rp  r  setxattrEnvironmentErrorrk  r   strerrorImportErrorr   r   rS   rT   existsr   r  r  rV   rh   r  r  r  r  
returncoderi   rk   r   )rT   r   r   r  Zpyxattr_required_versionr  r  Zads_fnrX   Zuser_has_setfattrZuser_has_xattr
executableoptscmdr  r   r  r*   r*   r+   write_xattr   s~    
 &
$



   
 r  c                 C   s^   t ddd}t ddd}td|| j}|t | }| t|j|t|j|t|j	iS )Ni  r   i  r6     r   )
r  rI  r.   rS  rC  r   r   rH  rE  rF  )Z
year_fieldZmonth_fieldZ	day_fieldZ
start_dateend_dateoffsetZrandom_dater*   r*   r+   random_birthdayt  s       r  c                 C   s   t dd| S )Na/  (?x)
        (?:
            (?:
                chtbl\.com/track|
                media\.blubrry\.com| # https://create.blubrry.com/resources/podcast-media-download-statistics/getting-started/
                play\.podtrac\.com
            )/[^/]+|
            (?:dts|www)\.podtrac\.com/(?:pts/)?redirect\.[0-9a-z]{3,4}| # http://analytics.podtrac.com/how-to-measure
            flex\.acast\.com|
            pd(?:
                cn\.co| # https://podcorn.com/analytics-prefix/
                st\.fm # https://podsights.com/docs/
            )/e
        )/r-   r  r  r*   r*   r+   clean_podcast_url  s     r  )N)N)T)T)FF)F)F)r$  N)T)T)T)r8  )N)NN)N)r6   )r   NNr   )N)r   r   N)N)N)N)N)Nr   )N)NT)N)T)rW  rX  N)T)r   )N(&  
__future__r   r  rh  r&  r  r  r+  rb  r  email.utilsr   Zemail.headerr   r  r  r  r  rp   rJ   r  r  rS   rk   r.   r   rN  r9  r  ri   rn   r  rR  xml.etree.ElementTreer  r  compatr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r#   r    r!   r,   r   r  Zcompiled_regex_typer0   r  ZUSER_AGENTSr  r   r  r  r;  r   r  chainr   ZDATE_FORMATSry  r+  r  r,  rs  Z
JSON_LD_RErN   r}   rj   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r   r%  rh   r+  r-  r/  r1  r6  rF  rI  rM   rJ  r   r]  r`  ra  rd  re  rf  rg  rP  rh  rk  rp  r  r  r  r  r  r  r?  MozillaCookieJarr  r  r  r  r  r#  r*  r.  r5  r7  r>  rA  rK  rM  rN  rX  ru  r  r{  r}  ri  r   	Structurer~  rm  rn  r  r^  rl  r_  rp  argtypesro  restyper  r  r  r  r  r  r  r  r  rl   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r?  r  r  r  r  r  r  r  r   r!  r  r.  r/  r3  r  r7  r9  r<  rA  rC  rF  rP  rQ  rR  rS  r_  rc  ZDEFAULT_OUTTMPLre  rg  rj  rG  rq  rs  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  rO  r^  rV  rc  rg  rm  rp  rq  ru  rz  r|  r~  r  r  r  r  r  r*   r*   r*   r+   <module>   s  x
            <
                           '	<
 	)			
			A
{+v9!

K		


	
	G
			:
 4




*

		&
F
 %
 N    		iT