[openload] Add support for oload.life (#21495)
[youtube-dl] / youtube_dl / extractor / openload.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import json
5 import os
6 import random
7 import re
8 import subprocess
9 import tempfile
10
11 from .common import InfoExtractor
12 from ..compat import (
13     compat_urlparse,
14     compat_kwargs,
15 )
16 from ..utils import (
17     check_executable,
18     determine_ext,
19     encodeArgument,
20     ExtractorError,
21     get_element_by_id,
22     get_exe_version,
23     is_outdated_version,
24     std_headers,
25 )
26
27
28 def cookie_to_dict(cookie):
29     cookie_dict = {
30         'name': cookie.name,
31         'value': cookie.value,
32     }
33     if cookie.port_specified:
34         cookie_dict['port'] = cookie.port
35     if cookie.domain_specified:
36         cookie_dict['domain'] = cookie.domain
37     if cookie.path_specified:
38         cookie_dict['path'] = cookie.path
39     if cookie.expires is not None:
40         cookie_dict['expires'] = cookie.expires
41     if cookie.secure is not None:
42         cookie_dict['secure'] = cookie.secure
43     if cookie.discard is not None:
44         cookie_dict['discard'] = cookie.discard
45     try:
46         if (cookie.has_nonstandard_attr('httpOnly')
47                 or cookie.has_nonstandard_attr('httponly')
48                 or cookie.has_nonstandard_attr('HttpOnly')):
49             cookie_dict['httponly'] = True
50     except TypeError:
51         pass
52     return cookie_dict
53
54
55 def cookie_jar_to_list(cookie_jar):
56     return [cookie_to_dict(cookie) for cookie in cookie_jar]
57
58
59 class PhantomJSwrapper(object):
60     """PhantomJS wrapper class
61
62     This class is experimental.
63     """
64
65     _TEMPLATE = r'''
66         phantom.onError = function(msg, trace) {{
67           var msgStack = ['PHANTOM ERROR: ' + msg];
68           if(trace && trace.length) {{
69             msgStack.push('TRACE:');
70             trace.forEach(function(t) {{
71               msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line
72                 + (t.function ? ' (in function ' + t.function +')' : ''));
73             }});
74           }}
75           console.error(msgStack.join('\n'));
76           phantom.exit(1);
77         }};
78         var page = require('webpage').create();
79         var fs = require('fs');
80         var read = {{ mode: 'r', charset: 'utf-8' }};
81         var write = {{ mode: 'w', charset: 'utf-8' }};
82         JSON.parse(fs.read("{cookies}", read)).forEach(function(x) {{
83           phantom.addCookie(x);
84         }});
85         page.settings.resourceTimeout = {timeout};
86         page.settings.userAgent = "{ua}";
87         page.onLoadStarted = function() {{
88           page.evaluate(function() {{
89             delete window._phantom;
90             delete window.callPhantom;
91           }});
92         }};
93         var saveAndExit = function() {{
94           fs.write("{html}", page.content, write);
95           fs.write("{cookies}", JSON.stringify(phantom.cookies), write);
96           phantom.exit();
97         }};
98         page.onLoadFinished = function(status) {{
99           if(page.url === "") {{
100             page.setContent(fs.read("{html}", read), "{url}");
101           }}
102           else {{
103             {jscode}
104           }}
105         }};
106         page.open("");
107     '''
108
109     _TMP_FILE_NAMES = ['script', 'html', 'cookies']
110
111     @staticmethod
112     def _version():
113         return get_exe_version('phantomjs', version_re=r'([0-9.]+)')
114
115     def __init__(self, extractor, required_version=None, timeout=10000):
116         self._TMP_FILES = {}
117
118         self.exe = check_executable('phantomjs', ['-v'])
119         if not self.exe:
120             raise ExtractorError('PhantomJS executable not found in PATH, '
121                                  'download it from http://phantomjs.org',
122                                  expected=True)
123
124         self.extractor = extractor
125
126         if required_version:
127             version = self._version()
128             if is_outdated_version(version, required_version):
129                 self.extractor._downloader.report_warning(
130                     'Your copy of PhantomJS is outdated, update it to version '
131                     '%s or newer if you encounter any errors.' % required_version)
132
133         self.options = {
134             'timeout': timeout,
135         }
136         for name in self._TMP_FILE_NAMES:
137             tmp = tempfile.NamedTemporaryFile(delete=False)
138             tmp.close()
139             self._TMP_FILES[name] = tmp
140
141     def __del__(self):
142         for name in self._TMP_FILE_NAMES:
143             try:
144                 os.remove(self._TMP_FILES[name].name)
145             except (IOError, OSError, KeyError):
146                 pass
147
148     def _save_cookies(self, url):
149         cookies = cookie_jar_to_list(self.extractor._downloader.cookiejar)
150         for cookie in cookies:
151             if 'path' not in cookie:
152                 cookie['path'] = '/'
153             if 'domain' not in cookie:
154                 cookie['domain'] = compat_urlparse.urlparse(url).netloc
155         with open(self._TMP_FILES['cookies'].name, 'wb') as f:
156             f.write(json.dumps(cookies).encode('utf-8'))
157
158     def _load_cookies(self):
159         with open(self._TMP_FILES['cookies'].name, 'rb') as f:
160             cookies = json.loads(f.read().decode('utf-8'))
161         for cookie in cookies:
162             if cookie['httponly'] is True:
163                 cookie['rest'] = {'httpOnly': None}
164             if 'expiry' in cookie:
165                 cookie['expire_time'] = cookie['expiry']
166             self.extractor._set_cookie(**compat_kwargs(cookie))
167
168     def get(self, url, html=None, video_id=None, note=None, note2='Executing JS on webpage', headers={}, jscode='saveAndExit();'):
169         """
170         Downloads webpage (if needed) and executes JS
171
172         Params:
173             url: website url
174             html: optional, html code of website
175             video_id: video id
176             note: optional, displayed when downloading webpage
177             note2: optional, displayed when executing JS
178             headers: custom http headers
179             jscode: code to be executed when page is loaded
180
181         Returns tuple with:
182             * downloaded website (after JS execution)
183             * anything you print with `console.log` (but not inside `page.execute`!)
184
185         In most cases you don't need to add any `jscode`.
186         It is executed in `page.onLoadFinished`.
187         `saveAndExit();` is mandatory, use it instead of `phantom.exit()`
188         It is possible to wait for some element on the webpage, for example:
189             var check = function() {
190               var elementFound = page.evaluate(function() {
191                 return document.querySelector('#b.done') !== null;
192               });
193               if(elementFound)
194                 saveAndExit();
195               else
196                 window.setTimeout(check, 500);
197             }
198
199             page.evaluate(function(){
200               document.querySelector('#a').click();
201             });
202             check();
203         """
204         if 'saveAndExit();' not in jscode:
205             raise ExtractorError('`saveAndExit();` not found in `jscode`')
206         if not html:
207             html = self.extractor._download_webpage(url, video_id, note=note, headers=headers)
208         with open(self._TMP_FILES['html'].name, 'wb') as f:
209             f.write(html.encode('utf-8'))
210
211         self._save_cookies(url)
212
213         replaces = self.options
214         replaces['url'] = url
215         user_agent = headers.get('User-Agent') or std_headers['User-Agent']
216         replaces['ua'] = user_agent.replace('"', '\\"')
217         replaces['jscode'] = jscode
218
219         for x in self._TMP_FILE_NAMES:
220             replaces[x] = self._TMP_FILES[x].name.replace('\\', '\\\\').replace('"', '\\"')
221
222         with open(self._TMP_FILES['script'].name, 'wb') as f:
223             f.write(self._TEMPLATE.format(**replaces).encode('utf-8'))
224
225         if video_id is None:
226             self.extractor.to_screen('%s' % (note2,))
227         else:
228             self.extractor.to_screen('%s: %s' % (video_id, note2))
229
230         p = subprocess.Popen([
231             self.exe, '--ssl-protocol=any',
232             self._TMP_FILES['script'].name
233         ], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
234         out, err = p.communicate()
235         if p.returncode != 0:
236             raise ExtractorError(
237                 'Executing JS failed\n:' + encodeArgument(err))
238         with open(self._TMP_FILES['html'].name, 'rb') as f:
239             html = f.read().decode('utf-8')
240
241         self._load_cookies()
242
243         return (html, encodeArgument(out))
244
245
246 class OpenloadIE(InfoExtractor):
247     _DOMAINS = r'(?:openload\.(?:co|io|link|pw)|oload\.(?:tv|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|press|pw|life|live|space|services|website)|oladblock\.(?:services|xyz|me)|openloed\.co)'
248     _VALID_URL = r'''(?x)
249                     https?://
250                         (?P<host>
251                             (?:www\.)?
252                             %s
253                         )/
254                         (?:f|embed)/
255                         (?P<id>[a-zA-Z0-9-_]+)
256                     ''' % _DOMAINS
257     _EMBED_WORD = 'embed'
258     _STREAM_WORD = 'f'
259     _REDIR_WORD = 'stream'
260     _URL_IDS = ('streamurl', 'streamuri', 'streamurj')
261     _TESTS = [{
262         'url': 'https://openload.co/f/kUEfGclsU9o',
263         'md5': 'bf1c059b004ebc7a256f89408e65c36e',
264         'info_dict': {
265             'id': 'kUEfGclsU9o',
266             'ext': 'mp4',
267             'title': 'skyrim_no-audio_1080.mp4',
268             'thumbnail': r're:^https?://.*\.jpg$',
269         },
270     }, {
271         'url': 'https://openload.co/embed/rjC09fkPLYs',
272         'info_dict': {
273             'id': 'rjC09fkPLYs',
274             'ext': 'mp4',
275             'title': 'movie.mp4',
276             'thumbnail': r're:^https?://.*\.jpg$',
277             'subtitles': {
278                 'en': [{
279                     'ext': 'vtt',
280                 }],
281             },
282         },
283         'params': {
284             'skip_download': True,  # test subtitles only
285         },
286     }, {
287         'url': 'https://openload.co/embed/kUEfGclsU9o/skyrim_no-audio_1080.mp4',
288         'only_matching': True,
289     }, {
290         'url': 'https://openload.io/f/ZAn6oz-VZGE/',
291         'only_matching': True,
292     }, {
293         'url': 'https://openload.co/f/_-ztPaZtMhM/',
294         'only_matching': True,
295     }, {
296         # unavailable via https://openload.co/f/Sxz5sADo82g/, different layout
297         # for title and ext
298         'url': 'https://openload.co/embed/Sxz5sADo82g/',
299         'only_matching': True,
300     }, {
301         # unavailable via https://openload.co/embed/e-Ixz9ZR5L0/ but available
302         # via https://openload.co/f/e-Ixz9ZR5L0/
303         'url': 'https://openload.co/f/e-Ixz9ZR5L0/',
304         'only_matching': True,
305     }, {
306         'url': 'https://oload.tv/embed/KnG-kKZdcfY/',
307         'only_matching': True,
308     }, {
309         'url': 'http://www.openload.link/f/KnG-kKZdcfY',
310         'only_matching': True,
311     }, {
312         'url': 'https://oload.stream/f/KnG-kKZdcfY',
313         'only_matching': True,
314     }, {
315         'url': 'https://oload.xyz/f/WwRBpzW8Wtk',
316         'only_matching': True,
317     }, {
318         'url': 'https://oload.win/f/kUEfGclsU9o',
319         'only_matching': True,
320     }, {
321         'url': 'https://oload.download/f/kUEfGclsU9o',
322         'only_matching': True,
323     }, {
324         'url': 'https://oload.cloud/f/4ZDnBXRWiB8',
325         'only_matching': True,
326     }, {
327         # Its title has not got its extension but url has it
328         'url': 'https://oload.download/f/N4Otkw39VCw/Tomb.Raider.2018.HDRip.XviD.AC3-EVO.avi.mp4',
329         'only_matching': True,
330     }, {
331         'url': 'https://oload.cc/embed/5NEAbI2BDSk',
332         'only_matching': True,
333     }, {
334         'url': 'https://oload.icu/f/-_i4y_F_Hs8',
335         'only_matching': True,
336     }, {
337         'url': 'https://oload.fun/f/gb6G1H4sHXY',
338         'only_matching': True,
339     }, {
340         'url': 'https://oload.club/f/Nr1L-aZ2dbQ',
341         'only_matching': True,
342     }, {
343         'url': 'https://oload.info/f/5NEAbI2BDSk',
344         'only_matching': True,
345     }, {
346         'url': 'https://openload.pw/f/WyKgK8s94N0',
347         'only_matching': True,
348     }, {
349         'url': 'https://oload.pw/f/WyKgK8s94N0',
350         'only_matching': True,
351     }, {
352         'url': 'https://oload.live/f/-Z58UZ-GR4M',
353         'only_matching': True,
354     }, {
355         'url': 'https://oload.space/f/IY4eZSst3u8/',
356         'only_matching': True,
357     }, {
358         'url': 'https://oload.services/embed/bs1NWj1dCag/',
359         'only_matching': True,
360     }, {
361         'url': 'https://oload.press/embed/drTBl1aOTvk/',
362         'only_matching': True,
363     }, {
364         'url': 'https://oload.website/embed/drTBl1aOTvk/',
365         'only_matching': True,
366     }, {
367         'url': 'https://oload.life/embed/oOzZjNPw9Dc/',
368         'only_matching': True,
369     }, {
370         'url': 'https://oladblock.services/f/b8NWEgkqNLI/',
371         'only_matching': True,
372     }, {
373         'url': 'https://oladblock.xyz/f/b8NWEgkqNLI/',
374         'only_matching': True,
375     }, {
376         'url': 'https://oladblock.me/f/b8NWEgkqNLI/',
377         'only_matching': True,
378     }, {
379         'url': 'https://openloed.co/f/b8NWEgkqNLI/',
380         'only_matching': True,
381     }]
382
383     _USER_AGENT_TPL = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36'
384     _CHROME_VERSIONS = (
385         '74.0.3729.129',
386         '76.0.3780.3',
387         '76.0.3780.2',
388         '74.0.3729.128',
389         '76.0.3780.1',
390         '76.0.3780.0',
391         '75.0.3770.15',
392         '74.0.3729.127',
393         '74.0.3729.126',
394         '76.0.3779.1',
395         '76.0.3779.0',
396         '75.0.3770.14',
397         '74.0.3729.125',
398         '76.0.3778.1',
399         '76.0.3778.0',
400         '75.0.3770.13',
401         '74.0.3729.124',
402         '74.0.3729.123',
403         '73.0.3683.121',
404         '76.0.3777.1',
405         '76.0.3777.0',
406         '75.0.3770.12',
407         '74.0.3729.122',
408         '76.0.3776.4',
409         '75.0.3770.11',
410         '74.0.3729.121',
411         '76.0.3776.3',
412         '76.0.3776.2',
413         '73.0.3683.120',
414         '74.0.3729.120',
415         '74.0.3729.119',
416         '74.0.3729.118',
417         '76.0.3776.1',
418         '76.0.3776.0',
419         '76.0.3775.5',
420         '75.0.3770.10',
421         '74.0.3729.117',
422         '76.0.3775.4',
423         '76.0.3775.3',
424         '74.0.3729.116',
425         '75.0.3770.9',
426         '76.0.3775.2',
427         '76.0.3775.1',
428         '76.0.3775.0',
429         '75.0.3770.8',
430         '74.0.3729.115',
431         '74.0.3729.114',
432         '76.0.3774.1',
433         '76.0.3774.0',
434         '75.0.3770.7',
435         '74.0.3729.113',
436         '74.0.3729.112',
437         '74.0.3729.111',
438         '76.0.3773.1',
439         '76.0.3773.0',
440         '75.0.3770.6',
441         '74.0.3729.110',
442         '74.0.3729.109',
443         '76.0.3772.1',
444         '76.0.3772.0',
445         '75.0.3770.5',
446         '74.0.3729.108',
447         '74.0.3729.107',
448         '76.0.3771.1',
449         '76.0.3771.0',
450         '75.0.3770.4',
451         '74.0.3729.106',
452         '74.0.3729.105',
453         '75.0.3770.3',
454         '74.0.3729.104',
455         '74.0.3729.103',
456         '74.0.3729.102',
457         '75.0.3770.2',
458         '74.0.3729.101',
459         '75.0.3770.1',
460         '75.0.3770.0',
461         '74.0.3729.100',
462         '75.0.3769.5',
463         '75.0.3769.4',
464         '74.0.3729.99',
465         '75.0.3769.3',
466         '75.0.3769.2',
467         '75.0.3768.6',
468         '74.0.3729.98',
469         '75.0.3769.1',
470         '75.0.3769.0',
471         '74.0.3729.97',
472         '73.0.3683.119',
473         '73.0.3683.118',
474         '74.0.3729.96',
475         '75.0.3768.5',
476         '75.0.3768.4',
477         '75.0.3768.3',
478         '75.0.3768.2',
479         '74.0.3729.95',
480         '74.0.3729.94',
481         '75.0.3768.1',
482         '75.0.3768.0',
483         '74.0.3729.93',
484         '74.0.3729.92',
485         '73.0.3683.117',
486         '74.0.3729.91',
487         '75.0.3766.3',
488         '74.0.3729.90',
489         '75.0.3767.2',
490         '75.0.3767.1',
491         '75.0.3767.0',
492         '74.0.3729.89',
493         '73.0.3683.116',
494         '75.0.3766.2',
495         '74.0.3729.88',
496         '75.0.3766.1',
497         '75.0.3766.0',
498         '74.0.3729.87',
499         '73.0.3683.115',
500         '74.0.3729.86',
501         '75.0.3765.1',
502         '75.0.3765.0',
503         '74.0.3729.85',
504         '73.0.3683.114',
505         '74.0.3729.84',
506         '75.0.3764.1',
507         '75.0.3764.0',
508         '74.0.3729.83',
509         '73.0.3683.113',
510         '75.0.3763.2',
511         '75.0.3761.4',
512         '74.0.3729.82',
513         '75.0.3763.1',
514         '75.0.3763.0',
515         '74.0.3729.81',
516         '73.0.3683.112',
517         '75.0.3762.1',
518         '75.0.3762.0',
519         '74.0.3729.80',
520         '75.0.3761.3',
521         '74.0.3729.79',
522         '73.0.3683.111',
523         '75.0.3761.2',
524         '74.0.3729.78',
525         '74.0.3729.77',
526         '75.0.3761.1',
527         '75.0.3761.0',
528         '73.0.3683.110',
529         '74.0.3729.76',
530         '74.0.3729.75',
531         '75.0.3760.0',
532         '74.0.3729.74',
533         '75.0.3759.8',
534         '75.0.3759.7',
535         '75.0.3759.6',
536         '74.0.3729.73',
537         '75.0.3759.5',
538         '74.0.3729.72',
539         '73.0.3683.109',
540         '75.0.3759.4',
541         '75.0.3759.3',
542         '74.0.3729.71',
543         '75.0.3759.2',
544         '74.0.3729.70',
545         '73.0.3683.108',
546         '74.0.3729.69',
547         '75.0.3759.1',
548         '75.0.3759.0',
549         '74.0.3729.68',
550         '73.0.3683.107',
551         '74.0.3729.67',
552         '75.0.3758.1',
553         '75.0.3758.0',
554         '74.0.3729.66',
555         '73.0.3683.106',
556         '74.0.3729.65',
557         '75.0.3757.1',
558         '75.0.3757.0',
559         '74.0.3729.64',
560         '73.0.3683.105',
561         '74.0.3729.63',
562         '75.0.3756.1',
563         '75.0.3756.0',
564         '74.0.3729.62',
565         '73.0.3683.104',
566         '75.0.3755.3',
567         '75.0.3755.2',
568         '73.0.3683.103',
569         '75.0.3755.1',
570         '75.0.3755.0',
571         '74.0.3729.61',
572         '73.0.3683.102',
573         '74.0.3729.60',
574         '75.0.3754.2',
575         '74.0.3729.59',
576         '75.0.3753.4',
577         '74.0.3729.58',
578         '75.0.3754.1',
579         '75.0.3754.0',
580         '74.0.3729.57',
581         '73.0.3683.101',
582         '75.0.3753.3',
583         '75.0.3752.2',
584         '75.0.3753.2',
585         '74.0.3729.56',
586         '75.0.3753.1',
587         '75.0.3753.0',
588         '74.0.3729.55',
589         '73.0.3683.100',
590         '74.0.3729.54',
591         '75.0.3752.1',
592         '75.0.3752.0',
593         '74.0.3729.53',
594         '73.0.3683.99',
595         '74.0.3729.52',
596         '75.0.3751.1',
597         '75.0.3751.0',
598         '74.0.3729.51',
599         '73.0.3683.98',
600         '74.0.3729.50',
601         '75.0.3750.0',
602         '74.0.3729.49',
603         '74.0.3729.48',
604         '74.0.3729.47',
605         '75.0.3749.3',
606         '74.0.3729.46',
607         '73.0.3683.97',
608         '75.0.3749.2',
609         '74.0.3729.45',
610         '75.0.3749.1',
611         '75.0.3749.0',
612         '74.0.3729.44',
613         '73.0.3683.96',
614         '74.0.3729.43',
615         '74.0.3729.42',
616         '75.0.3748.1',
617         '75.0.3748.0',
618         '74.0.3729.41',
619         '75.0.3747.1',
620         '73.0.3683.95',
621         '75.0.3746.4',
622         '74.0.3729.40',
623         '74.0.3729.39',
624         '75.0.3747.0',
625         '75.0.3746.3',
626         '75.0.3746.2',
627         '74.0.3729.38',
628         '75.0.3746.1',
629         '75.0.3746.0',
630         '74.0.3729.37',
631         '73.0.3683.94',
632         '75.0.3745.5',
633         '75.0.3745.4',
634         '75.0.3745.3',
635         '75.0.3745.2',
636         '74.0.3729.36',
637         '75.0.3745.1',
638         '75.0.3745.0',
639         '75.0.3744.2',
640         '74.0.3729.35',
641         '73.0.3683.93',
642         '74.0.3729.34',
643         '75.0.3744.1',
644         '75.0.3744.0',
645         '74.0.3729.33',
646         '73.0.3683.92',
647         '74.0.3729.32',
648         '74.0.3729.31',
649         '73.0.3683.91',
650         '75.0.3741.2',
651         '75.0.3740.5',
652         '74.0.3729.30',
653         '75.0.3741.1',
654         '75.0.3741.0',
655         '74.0.3729.29',
656         '75.0.3740.4',
657         '73.0.3683.90',
658         '74.0.3729.28',
659         '75.0.3740.3',
660         '73.0.3683.89',
661         '75.0.3740.2',
662         '74.0.3729.27',
663         '75.0.3740.1',
664         '75.0.3740.0',
665         '74.0.3729.26',
666         '73.0.3683.88',
667         '73.0.3683.87',
668         '74.0.3729.25',
669         '75.0.3739.1',
670         '75.0.3739.0',
671         '73.0.3683.86',
672         '74.0.3729.24',
673         '73.0.3683.85',
674         '75.0.3738.4',
675         '75.0.3738.3',
676         '75.0.3738.2',
677         '75.0.3738.1',
678         '75.0.3738.0',
679         '74.0.3729.23',
680         '73.0.3683.84',
681         '74.0.3729.22',
682         '74.0.3729.21',
683         '75.0.3737.1',
684         '75.0.3737.0',
685         '74.0.3729.20',
686         '73.0.3683.83',
687         '74.0.3729.19',
688         '75.0.3736.1',
689         '75.0.3736.0',
690         '74.0.3729.18',
691         '73.0.3683.82',
692         '74.0.3729.17',
693         '75.0.3735.1',
694         '75.0.3735.0',
695         '74.0.3729.16',
696         '73.0.3683.81',
697         '75.0.3734.1',
698         '75.0.3734.0',
699         '74.0.3729.15',
700         '73.0.3683.80',
701         '74.0.3729.14',
702         '75.0.3733.1',
703         '75.0.3733.0',
704         '75.0.3732.1',
705         '74.0.3729.13',
706         '74.0.3729.12',
707         '73.0.3683.79',
708         '74.0.3729.11',
709         '75.0.3732.0',
710         '74.0.3729.10',
711         '73.0.3683.78',
712         '74.0.3729.9',
713         '74.0.3729.8',
714         '74.0.3729.7',
715         '75.0.3731.3',
716         '75.0.3731.2',
717         '75.0.3731.0',
718         '74.0.3729.6',
719         '73.0.3683.77',
720         '73.0.3683.76',
721         '75.0.3730.5',
722         '75.0.3730.4',
723         '73.0.3683.75',
724         '74.0.3729.5',
725         '73.0.3683.74',
726         '75.0.3730.3',
727         '75.0.3730.2',
728         '74.0.3729.4',
729         '73.0.3683.73',
730         '73.0.3683.72',
731         '75.0.3730.1',
732         '75.0.3730.0',
733         '74.0.3729.3',
734         '73.0.3683.71',
735         '74.0.3729.2',
736         '73.0.3683.70',
737         '74.0.3729.1',
738         '74.0.3729.0',
739         '74.0.3726.4',
740         '73.0.3683.69',
741         '74.0.3726.3',
742         '74.0.3728.0',
743         '74.0.3726.2',
744         '73.0.3683.68',
745         '74.0.3726.1',
746         '74.0.3726.0',
747         '74.0.3725.4',
748         '73.0.3683.67',
749         '73.0.3683.66',
750         '74.0.3725.3',
751         '74.0.3725.2',
752         '74.0.3725.1',
753         '74.0.3724.8',
754         '74.0.3725.0',
755         '73.0.3683.65',
756         '74.0.3724.7',
757         '74.0.3724.6',
758         '74.0.3724.5',
759         '74.0.3724.4',
760         '74.0.3724.3',
761         '74.0.3724.2',
762         '74.0.3724.1',
763         '74.0.3724.0',
764         '73.0.3683.64',
765         '74.0.3723.1',
766         '74.0.3723.0',
767         '73.0.3683.63',
768         '74.0.3722.1',
769         '74.0.3722.0',
770         '73.0.3683.62',
771         '74.0.3718.9',
772         '74.0.3702.3',
773         '74.0.3721.3',
774         '74.0.3721.2',
775         '74.0.3721.1',
776         '74.0.3721.0',
777         '74.0.3720.6',
778         '73.0.3683.61',
779         '72.0.3626.122',
780         '73.0.3683.60',
781         '74.0.3720.5',
782         '72.0.3626.121',
783         '74.0.3718.8',
784         '74.0.3720.4',
785         '74.0.3720.3',
786         '74.0.3718.7',
787         '74.0.3720.2',
788         '74.0.3720.1',
789         '74.0.3720.0',
790         '74.0.3718.6',
791         '74.0.3719.5',
792         '73.0.3683.59',
793         '74.0.3718.5',
794         '74.0.3718.4',
795         '74.0.3719.4',
796         '74.0.3719.3',
797         '74.0.3719.2',
798         '74.0.3719.1',
799         '73.0.3683.58',
800         '74.0.3719.0',
801         '73.0.3683.57',
802         '73.0.3683.56',
803         '74.0.3718.3',
804         '73.0.3683.55',
805         '74.0.3718.2',
806         '74.0.3718.1',
807         '74.0.3718.0',
808         '73.0.3683.54',
809         '74.0.3717.2',
810         '73.0.3683.53',
811         '74.0.3717.1',
812         '74.0.3717.0',
813         '73.0.3683.52',
814         '74.0.3716.1',
815         '74.0.3716.0',
816         '73.0.3683.51',
817         '74.0.3715.1',
818         '74.0.3715.0',
819         '73.0.3683.50',
820         '74.0.3711.2',
821         '74.0.3714.2',
822         '74.0.3713.3',
823         '74.0.3714.1',
824         '74.0.3714.0',
825         '73.0.3683.49',
826         '74.0.3713.1',
827         '74.0.3713.0',
828         '72.0.3626.120',
829         '73.0.3683.48',
830         '74.0.3712.2',
831         '74.0.3712.1',
832         '74.0.3712.0',
833         '73.0.3683.47',
834         '72.0.3626.119',
835         '73.0.3683.46',
836         '74.0.3710.2',
837         '72.0.3626.118',
838         '74.0.3711.1',
839         '74.0.3711.0',
840         '73.0.3683.45',
841         '72.0.3626.117',
842         '74.0.3710.1',
843         '74.0.3710.0',
844         '73.0.3683.44',
845         '72.0.3626.116',
846         '74.0.3709.1',
847         '74.0.3709.0',
848         '74.0.3704.9',
849         '73.0.3683.43',
850         '72.0.3626.115',
851         '74.0.3704.8',
852         '74.0.3704.7',
853         '74.0.3708.0',
854         '74.0.3706.7',
855         '74.0.3704.6',
856         '73.0.3683.42',
857         '72.0.3626.114',
858         '74.0.3706.6',
859         '72.0.3626.113',
860         '74.0.3704.5',
861         '74.0.3706.5',
862         '74.0.3706.4',
863         '74.0.3706.3',
864         '74.0.3706.2',
865         '74.0.3706.1',
866         '74.0.3706.0',
867         '73.0.3683.41',
868         '72.0.3626.112',
869         '74.0.3705.1',
870         '74.0.3705.0',
871         '73.0.3683.40',
872         '72.0.3626.111',
873         '73.0.3683.39',
874         '74.0.3704.4',
875         '73.0.3683.38',
876         '74.0.3704.3',
877         '74.0.3704.2',
878         '74.0.3704.1',
879         '74.0.3704.0',
880         '73.0.3683.37',
881         '72.0.3626.110',
882         '72.0.3626.109',
883         '74.0.3703.3',
884         '74.0.3703.2',
885         '73.0.3683.36',
886         '74.0.3703.1',
887         '74.0.3703.0',
888         '73.0.3683.35',
889         '72.0.3626.108',
890         '74.0.3702.2',
891         '74.0.3699.3',
892         '74.0.3702.1',
893         '74.0.3702.0',
894         '73.0.3683.34',
895         '72.0.3626.107',
896         '73.0.3683.33',
897         '74.0.3701.1',
898         '74.0.3701.0',
899         '73.0.3683.32',
900         '73.0.3683.31',
901         '72.0.3626.105',
902         '74.0.3700.1',
903         '74.0.3700.0',
904         '73.0.3683.29',
905         '72.0.3626.103',
906         '74.0.3699.2',
907         '74.0.3699.1',
908         '74.0.3699.0',
909         '73.0.3683.28',
910         '72.0.3626.102',
911         '73.0.3683.27',
912         '73.0.3683.26',
913         '74.0.3698.0',
914         '74.0.3696.2',
915         '72.0.3626.101',
916         '73.0.3683.25',
917         '74.0.3696.1',
918         '74.0.3696.0',
919         '74.0.3694.8',
920         '72.0.3626.100',
921         '74.0.3694.7',
922         '74.0.3694.6',
923         '74.0.3694.5',
924         '74.0.3694.4',
925         '72.0.3626.99',
926         '72.0.3626.98',
927         '74.0.3694.3',
928         '73.0.3683.24',
929         '72.0.3626.97',
930         '72.0.3626.96',
931         '72.0.3626.95',
932         '73.0.3683.23',
933         '72.0.3626.94',
934         '73.0.3683.22',
935         '73.0.3683.21',
936         '72.0.3626.93',
937         '74.0.3694.2',
938         '72.0.3626.92',
939         '74.0.3694.1',
940         '74.0.3694.0',
941         '74.0.3693.6',
942         '73.0.3683.20',
943         '72.0.3626.91',
944         '74.0.3693.5',
945         '74.0.3693.4',
946         '74.0.3693.3',
947         '74.0.3693.2',
948         '73.0.3683.19',
949         '74.0.3693.1',
950         '74.0.3693.0',
951         '73.0.3683.18',
952         '72.0.3626.90',
953         '74.0.3692.1',
954         '74.0.3692.0',
955         '73.0.3683.17',
956         '72.0.3626.89',
957         '74.0.3687.3',
958         '74.0.3691.1',
959         '74.0.3691.0',
960         '73.0.3683.16',
961         '72.0.3626.88',
962         '72.0.3626.87',
963         '73.0.3683.15',
964         '74.0.3690.1',
965         '74.0.3690.0',
966         '73.0.3683.14',
967         '72.0.3626.86',
968         '73.0.3683.13',
969         '73.0.3683.12',
970         '74.0.3689.1',
971         '74.0.3689.0',
972         '73.0.3683.11',
973         '72.0.3626.85',
974         '73.0.3683.10',
975         '72.0.3626.84',
976         '73.0.3683.9',
977         '74.0.3688.1',
978         '74.0.3688.0',
979         '73.0.3683.8',
980         '72.0.3626.83',
981         '74.0.3687.2',
982         '74.0.3687.1',
983         '74.0.3687.0',
984         '73.0.3683.7',
985         '72.0.3626.82',
986         '74.0.3686.4',
987         '72.0.3626.81',
988         '74.0.3686.3',
989         '74.0.3686.2',
990         '74.0.3686.1',
991         '74.0.3686.0',
992         '73.0.3683.6',
993         '72.0.3626.80',
994         '74.0.3685.1',
995         '74.0.3685.0',
996         '73.0.3683.5',
997         '72.0.3626.79',
998         '74.0.3684.1',
999         '74.0.3684.0',
1000         '73.0.3683.4',
1001         '72.0.3626.78',
1002         '72.0.3626.77',
1003         '73.0.3683.3',
1004         '73.0.3683.2',
1005         '72.0.3626.76',
1006         '73.0.3683.1',
1007         '73.0.3683.0',
1008         '72.0.3626.75',
1009         '71.0.3578.141',
1010         '73.0.3682.1',
1011         '73.0.3682.0',
1012         '72.0.3626.74',
1013         '71.0.3578.140',
1014         '73.0.3681.4',
1015         '73.0.3681.3',
1016         '73.0.3681.2',
1017         '73.0.3681.1',
1018         '73.0.3681.0',
1019         '72.0.3626.73',
1020         '71.0.3578.139',
1021         '72.0.3626.72',
1022         '72.0.3626.71',
1023         '73.0.3680.1',
1024         '73.0.3680.0',
1025         '72.0.3626.70',
1026         '71.0.3578.138',
1027         '73.0.3678.2',
1028         '73.0.3679.1',
1029         '73.0.3679.0',
1030         '72.0.3626.69',
1031         '71.0.3578.137',
1032         '73.0.3678.1',
1033         '73.0.3678.0',
1034         '71.0.3578.136',
1035         '73.0.3677.1',
1036         '73.0.3677.0',
1037         '72.0.3626.68',
1038         '72.0.3626.67',
1039         '71.0.3578.135',
1040         '73.0.3676.1',
1041         '73.0.3676.0',
1042         '73.0.3674.2',
1043         '72.0.3626.66',
1044         '71.0.3578.134',
1045         '73.0.3674.1',
1046         '73.0.3674.0',
1047         '72.0.3626.65',
1048         '71.0.3578.133',
1049         '73.0.3673.2',
1050         '73.0.3673.1',
1051         '73.0.3673.0',
1052         '72.0.3626.64',
1053         '71.0.3578.132',
1054         '72.0.3626.63',
1055         '72.0.3626.62',
1056         '72.0.3626.61',
1057         '72.0.3626.60',
1058         '73.0.3672.1',
1059         '73.0.3672.0',
1060         '72.0.3626.59',
1061         '71.0.3578.131',
1062         '73.0.3671.3',
1063         '73.0.3671.2',
1064         '73.0.3671.1',
1065         '73.0.3671.0',
1066         '72.0.3626.58',
1067         '71.0.3578.130',
1068         '73.0.3670.1',
1069         '73.0.3670.0',
1070         '72.0.3626.57',
1071         '71.0.3578.129',
1072         '73.0.3669.1',
1073         '73.0.3669.0',
1074         '72.0.3626.56',
1075         '71.0.3578.128',
1076         '73.0.3668.2',
1077         '73.0.3668.1',
1078         '73.0.3668.0',
1079         '72.0.3626.55',
1080         '71.0.3578.127',
1081         '73.0.3667.2',
1082         '73.0.3667.1',
1083         '73.0.3667.0',
1084         '72.0.3626.54',
1085         '71.0.3578.126',
1086         '73.0.3666.1',
1087         '73.0.3666.0',
1088         '72.0.3626.53',
1089         '71.0.3578.125',
1090         '73.0.3665.4',
1091         '73.0.3665.3',
1092         '72.0.3626.52',
1093         '73.0.3665.2',
1094         '73.0.3664.4',
1095         '73.0.3665.1',
1096         '73.0.3665.0',
1097         '72.0.3626.51',
1098         '71.0.3578.124',
1099         '72.0.3626.50',
1100         '73.0.3664.3',
1101         '73.0.3664.2',
1102         '73.0.3664.1',
1103         '73.0.3664.0',
1104         '73.0.3663.2',
1105         '72.0.3626.49',
1106         '71.0.3578.123',
1107         '73.0.3663.1',
1108         '73.0.3663.0',
1109         '72.0.3626.48',
1110         '71.0.3578.122',
1111         '73.0.3662.1',
1112         '73.0.3662.0',
1113         '72.0.3626.47',
1114         '71.0.3578.121',
1115         '73.0.3661.1',
1116         '72.0.3626.46',
1117         '73.0.3661.0',
1118         '72.0.3626.45',
1119         '71.0.3578.120',
1120         '73.0.3660.2',
1121         '73.0.3660.1',
1122         '73.0.3660.0',
1123         '72.0.3626.44',
1124         '71.0.3578.119',
1125         '73.0.3659.1',
1126         '73.0.3659.0',
1127         '72.0.3626.43',
1128         '71.0.3578.118',
1129         '73.0.3658.1',
1130         '73.0.3658.0',
1131         '72.0.3626.42',
1132         '71.0.3578.117',
1133         '73.0.3657.1',
1134         '73.0.3657.0',
1135         '72.0.3626.41',
1136         '71.0.3578.116',
1137         '73.0.3656.1',
1138         '73.0.3656.0',
1139         '72.0.3626.40',
1140         '71.0.3578.115',
1141         '73.0.3655.1',
1142         '73.0.3655.0',
1143         '72.0.3626.39',
1144         '71.0.3578.114',
1145         '73.0.3654.1',
1146         '73.0.3654.0',
1147         '72.0.3626.38',
1148         '71.0.3578.113',
1149         '73.0.3653.1',
1150         '73.0.3653.0',
1151         '72.0.3626.37',
1152         '71.0.3578.112',
1153         '73.0.3652.1',
1154         '73.0.3652.0',
1155         '72.0.3626.36',
1156         '71.0.3578.111',
1157         '73.0.3651.1',
1158         '73.0.3651.0',
1159         '72.0.3626.35',
1160         '71.0.3578.110',
1161         '73.0.3650.1',
1162         '73.0.3650.0',
1163         '72.0.3626.34',
1164         '71.0.3578.109',
1165         '73.0.3649.1',
1166         '73.0.3649.0',
1167         '72.0.3626.33',
1168         '71.0.3578.108',
1169         '73.0.3648.2',
1170         '73.0.3648.1',
1171         '73.0.3648.0',
1172         '72.0.3626.32',
1173         '71.0.3578.107',
1174         '73.0.3647.2',
1175         '73.0.3647.1',
1176         '73.0.3647.0',
1177         '72.0.3626.31',
1178         '71.0.3578.106',
1179         '73.0.3635.3',
1180         '73.0.3646.2',
1181         '73.0.3646.1',
1182         '73.0.3646.0',
1183         '72.0.3626.30',
1184         '71.0.3578.105',
1185         '72.0.3626.29',
1186         '73.0.3645.2',
1187         '73.0.3645.1',
1188         '73.0.3645.0',
1189         '72.0.3626.28',
1190         '71.0.3578.104',
1191         '72.0.3626.27',
1192         '72.0.3626.26',
1193         '72.0.3626.25',
1194         '72.0.3626.24',
1195         '73.0.3644.0',
1196         '73.0.3643.2',
1197         '72.0.3626.23',
1198         '71.0.3578.103',
1199         '73.0.3643.1',
1200         '73.0.3643.0',
1201         '72.0.3626.22',
1202         '71.0.3578.102',
1203         '73.0.3642.1',
1204         '73.0.3642.0',
1205         '72.0.3626.21',
1206         '71.0.3578.101',
1207         '73.0.3641.1',
1208         '73.0.3641.0',
1209         '72.0.3626.20',
1210         '71.0.3578.100',
1211         '72.0.3626.19',
1212         '73.0.3640.1',
1213         '73.0.3640.0',
1214         '72.0.3626.18',
1215         '73.0.3639.1',
1216         '71.0.3578.99',
1217         '73.0.3639.0',
1218         '72.0.3626.17',
1219         '73.0.3638.2',
1220         '72.0.3626.16',
1221         '73.0.3638.1',
1222         '73.0.3638.0',
1223         '72.0.3626.15',
1224         '71.0.3578.98',
1225         '73.0.3635.2',
1226         '71.0.3578.97',
1227         '73.0.3637.1',
1228         '73.0.3637.0',
1229         '72.0.3626.14',
1230         '71.0.3578.96',
1231         '71.0.3578.95',
1232         '72.0.3626.13',
1233         '71.0.3578.94',
1234         '73.0.3636.2',
1235         '71.0.3578.93',
1236         '73.0.3636.1',
1237         '73.0.3636.0',
1238         '72.0.3626.12',
1239         '71.0.3578.92',
1240         '73.0.3635.1',
1241         '73.0.3635.0',
1242         '72.0.3626.11',
1243         '71.0.3578.91',
1244         '73.0.3634.2',
1245         '73.0.3634.1',
1246         '73.0.3634.0',
1247         '72.0.3626.10',
1248         '71.0.3578.90',
1249         '71.0.3578.89',
1250         '73.0.3633.2',
1251         '73.0.3633.1',
1252         '73.0.3633.0',
1253         '72.0.3610.4',
1254         '72.0.3626.9',
1255         '71.0.3578.88',
1256         '73.0.3632.5',
1257         '73.0.3632.4',
1258         '73.0.3632.3',
1259         '73.0.3632.2',
1260         '73.0.3632.1',
1261         '73.0.3632.0',
1262         '72.0.3626.8',
1263         '71.0.3578.87',
1264         '73.0.3631.2',
1265         '73.0.3631.1',
1266         '73.0.3631.0',
1267         '72.0.3626.7',
1268         '71.0.3578.86',
1269         '72.0.3626.6',
1270         '73.0.3630.1',
1271         '73.0.3630.0',
1272         '72.0.3626.5',
1273         '71.0.3578.85',
1274         '72.0.3626.4',
1275         '73.0.3628.3',
1276         '73.0.3628.2',
1277         '73.0.3629.1',
1278         '73.0.3629.0',
1279         '72.0.3626.3',
1280         '71.0.3578.84',
1281         '73.0.3628.1',
1282         '73.0.3628.0',
1283         '71.0.3578.83',
1284         '73.0.3627.1',
1285         '73.0.3627.0',
1286         '72.0.3626.2',
1287         '71.0.3578.82',
1288         '71.0.3578.81',
1289         '71.0.3578.80',
1290         '72.0.3626.1',
1291         '72.0.3626.0',
1292         '71.0.3578.79',
1293         '70.0.3538.124',
1294         '71.0.3578.78',
1295         '72.0.3623.4',
1296         '72.0.3625.2',
1297         '72.0.3625.1',
1298         '72.0.3625.0',
1299         '71.0.3578.77',
1300         '70.0.3538.123',
1301         '72.0.3624.4',
1302         '72.0.3624.3',
1303         '72.0.3624.2',
1304         '71.0.3578.76',
1305         '72.0.3624.1',
1306         '72.0.3624.0',
1307         '72.0.3623.3',
1308         '71.0.3578.75',
1309         '70.0.3538.122',
1310         '71.0.3578.74',
1311         '72.0.3623.2',
1312         '72.0.3610.3',
1313         '72.0.3623.1',
1314         '72.0.3623.0',
1315         '72.0.3622.3',
1316         '72.0.3622.2',
1317         '71.0.3578.73',
1318         '70.0.3538.121',
1319         '72.0.3622.1',
1320         '72.0.3622.0',
1321         '71.0.3578.72',
1322         '70.0.3538.120',
1323         '72.0.3621.1',
1324         '72.0.3621.0',
1325         '71.0.3578.71',
1326         '70.0.3538.119',
1327         '72.0.3620.1',
1328         '72.0.3620.0',
1329         '71.0.3578.70',
1330         '70.0.3538.118',
1331         '71.0.3578.69',
1332         '72.0.3619.1',
1333         '72.0.3619.0',
1334         '71.0.3578.68',
1335         '70.0.3538.117',
1336         '71.0.3578.67',
1337         '72.0.3618.1',
1338         '72.0.3618.0',
1339         '71.0.3578.66',
1340         '70.0.3538.116',
1341         '72.0.3617.1',
1342         '72.0.3617.0',
1343         '71.0.3578.65',
1344         '70.0.3538.115',
1345         '72.0.3602.3',
1346         '71.0.3578.64',
1347         '72.0.3616.1',
1348         '72.0.3616.0',
1349         '71.0.3578.63',
1350         '70.0.3538.114',
1351         '71.0.3578.62',
1352         '72.0.3615.1',
1353         '72.0.3615.0',
1354         '71.0.3578.61',
1355         '70.0.3538.113',
1356         '72.0.3614.1',
1357         '72.0.3614.0',
1358         '71.0.3578.60',
1359         '70.0.3538.112',
1360         '72.0.3613.1',
1361         '72.0.3613.0',
1362         '71.0.3578.59',
1363         '70.0.3538.111',
1364         '72.0.3612.2',
1365         '72.0.3612.1',
1366         '72.0.3612.0',
1367         '70.0.3538.110',
1368         '71.0.3578.58',
1369         '70.0.3538.109',
1370         '72.0.3611.2',
1371         '72.0.3611.1',
1372         '72.0.3611.0',
1373         '71.0.3578.57',
1374         '70.0.3538.108',
1375         '72.0.3610.2',
1376         '71.0.3578.56',
1377         '71.0.3578.55',
1378         '72.0.3610.1',
1379         '72.0.3610.0',
1380         '71.0.3578.54',
1381         '70.0.3538.107',
1382         '71.0.3578.53',
1383         '72.0.3609.3',
1384         '71.0.3578.52',
1385         '72.0.3609.2',
1386         '71.0.3578.51',
1387         '72.0.3608.5',
1388         '72.0.3609.1',
1389         '72.0.3609.0',
1390         '71.0.3578.50',
1391         '70.0.3538.106',
1392         '72.0.3608.4',
1393         '72.0.3608.3',
1394         '72.0.3608.2',
1395         '71.0.3578.49',
1396         '72.0.3608.1',
1397         '72.0.3608.0',
1398         '70.0.3538.105',
1399         '71.0.3578.48',
1400         '72.0.3607.1',
1401         '72.0.3607.0',
1402         '71.0.3578.47',
1403         '70.0.3538.104',
1404         '72.0.3606.2',
1405         '72.0.3606.1',
1406         '72.0.3606.0',
1407         '71.0.3578.46',
1408         '70.0.3538.103',
1409         '70.0.3538.102',
1410         '72.0.3605.3',
1411         '72.0.3605.2',
1412         '72.0.3605.1',
1413         '72.0.3605.0',
1414         '71.0.3578.45',
1415         '70.0.3538.101',
1416         '71.0.3578.44',
1417         '71.0.3578.43',
1418         '70.0.3538.100',
1419         '70.0.3538.99',
1420         '71.0.3578.42',
1421         '72.0.3604.1',
1422         '72.0.3604.0',
1423         '71.0.3578.41',
1424         '70.0.3538.98',
1425         '71.0.3578.40',
1426         '72.0.3603.2',
1427         '72.0.3603.1',
1428         '72.0.3603.0',
1429         '71.0.3578.39',
1430         '70.0.3538.97',
1431         '72.0.3602.2',
1432         '71.0.3578.38',
1433         '71.0.3578.37',
1434         '72.0.3602.1',
1435         '72.0.3602.0',
1436         '71.0.3578.36',
1437         '70.0.3538.96',
1438         '72.0.3601.1',
1439         '72.0.3601.0',
1440         '71.0.3578.35',
1441         '70.0.3538.95',
1442         '72.0.3600.1',
1443         '72.0.3600.0',
1444         '71.0.3578.34',
1445         '70.0.3538.94',
1446         '72.0.3599.3',
1447         '72.0.3599.2',
1448         '72.0.3599.1',
1449         '72.0.3599.0',
1450         '71.0.3578.33',
1451         '70.0.3538.93',
1452         '72.0.3598.1',
1453         '72.0.3598.0',
1454         '71.0.3578.32',
1455         '70.0.3538.87',
1456         '72.0.3597.1',
1457         '72.0.3597.0',
1458         '72.0.3596.2',
1459         '71.0.3578.31',
1460         '70.0.3538.86',
1461         '71.0.3578.30',
1462         '71.0.3578.29',
1463         '72.0.3596.1',
1464         '72.0.3596.0',
1465         '71.0.3578.28',
1466         '70.0.3538.85',
1467         '72.0.3595.2',
1468         '72.0.3591.3',
1469         '72.0.3595.1',
1470         '72.0.3595.0',
1471         '71.0.3578.27',
1472         '70.0.3538.84',
1473         '72.0.3594.1',
1474         '72.0.3594.0',
1475         '71.0.3578.26',
1476         '70.0.3538.83',
1477         '72.0.3593.2',
1478         '72.0.3593.1',
1479         '72.0.3593.0',
1480         '71.0.3578.25',
1481         '70.0.3538.82',
1482         '72.0.3589.3',
1483         '72.0.3592.2',
1484         '72.0.3592.1',
1485         '72.0.3592.0',
1486         '71.0.3578.24',
1487         '72.0.3589.2',
1488         '70.0.3538.81',
1489         '70.0.3538.80',
1490         '72.0.3591.2',
1491         '72.0.3591.1',
1492         '72.0.3591.0',
1493         '71.0.3578.23',
1494         '70.0.3538.79',
1495         '71.0.3578.22',
1496         '72.0.3590.1',
1497         '72.0.3590.0',
1498         '71.0.3578.21',
1499         '70.0.3538.78',
1500         '70.0.3538.77',
1501         '72.0.3589.1',
1502         '72.0.3589.0',
1503         '71.0.3578.20',
1504         '70.0.3538.76',
1505         '71.0.3578.19',
1506         '70.0.3538.75',
1507         '72.0.3588.1',
1508         '72.0.3588.0',
1509         '71.0.3578.18',
1510         '70.0.3538.74',
1511         '72.0.3586.2',
1512         '72.0.3587.0',
1513         '71.0.3578.17',
1514         '70.0.3538.73',
1515         '72.0.3586.1',
1516         '72.0.3586.0',
1517         '71.0.3578.16',
1518         '70.0.3538.72',
1519         '72.0.3585.1',
1520         '72.0.3585.0',
1521         '71.0.3578.15',
1522         '70.0.3538.71',
1523         '71.0.3578.14',
1524         '72.0.3584.1',
1525         '72.0.3584.0',
1526         '71.0.3578.13',
1527         '70.0.3538.70',
1528         '72.0.3583.2',
1529         '71.0.3578.12',
1530         '72.0.3583.1',
1531         '72.0.3583.0',
1532         '71.0.3578.11',
1533         '70.0.3538.69',
1534         '71.0.3578.10',
1535         '72.0.3582.0',
1536         '72.0.3581.4',
1537         '71.0.3578.9',
1538         '70.0.3538.67',
1539         '72.0.3581.3',
1540         '72.0.3581.2',
1541         '72.0.3581.1',
1542         '72.0.3581.0',
1543         '71.0.3578.8',
1544         '70.0.3538.66',
1545         '72.0.3580.1',
1546         '72.0.3580.0',
1547         '71.0.3578.7',
1548         '70.0.3538.65',
1549         '71.0.3578.6',
1550         '72.0.3579.1',
1551         '72.0.3579.0',
1552         '71.0.3578.5',
1553         '70.0.3538.64',
1554         '71.0.3578.4',
1555         '71.0.3578.3',
1556         '71.0.3578.2',
1557         '71.0.3578.1',
1558         '71.0.3578.0',
1559         '70.0.3538.63',
1560         '69.0.3497.128',
1561         '70.0.3538.62',
1562         '70.0.3538.61',
1563         '70.0.3538.60',
1564         '70.0.3538.59',
1565         '71.0.3577.1',
1566         '71.0.3577.0',
1567         '70.0.3538.58',
1568         '69.0.3497.127',
1569         '71.0.3576.2',
1570         '71.0.3576.1',
1571         '71.0.3576.0',
1572         '70.0.3538.57',
1573         '70.0.3538.56',
1574         '71.0.3575.2',
1575         '70.0.3538.55',
1576         '69.0.3497.126',
1577         '70.0.3538.54',
1578         '71.0.3575.1',
1579         '71.0.3575.0',
1580         '71.0.3574.1',
1581         '71.0.3574.0',
1582         '70.0.3538.53',
1583         '69.0.3497.125',
1584         '70.0.3538.52',
1585         '71.0.3573.1',
1586         '71.0.3573.0',
1587         '70.0.3538.51',
1588         '69.0.3497.124',
1589         '71.0.3572.1',
1590         '71.0.3572.0',
1591         '70.0.3538.50',
1592         '69.0.3497.123',
1593         '71.0.3571.2',
1594         '70.0.3538.49',
1595         '69.0.3497.122',
1596         '71.0.3571.1',
1597         '71.0.3571.0',
1598         '70.0.3538.48',
1599         '69.0.3497.121',
1600         '71.0.3570.1',
1601         '71.0.3570.0',
1602         '70.0.3538.47',
1603         '69.0.3497.120',
1604         '71.0.3568.2',
1605         '71.0.3569.1',
1606         '71.0.3569.0',
1607         '70.0.3538.46',
1608         '69.0.3497.119',
1609         '70.0.3538.45',
1610         '71.0.3568.1',
1611         '71.0.3568.0',
1612         '70.0.3538.44',
1613         '69.0.3497.118',
1614         '70.0.3538.43',
1615         '70.0.3538.42',
1616         '71.0.3567.1',
1617         '71.0.3567.0',
1618         '70.0.3538.41',
1619         '69.0.3497.117',
1620         '71.0.3566.1',
1621         '71.0.3566.0',
1622         '70.0.3538.40',
1623         '69.0.3497.116',
1624         '71.0.3565.1',
1625         '71.0.3565.0',
1626         '70.0.3538.39',
1627         '69.0.3497.115',
1628         '71.0.3564.1',
1629         '71.0.3564.0',
1630         '70.0.3538.38',
1631         '69.0.3497.114',
1632         '71.0.3563.0',
1633         '71.0.3562.2',
1634         '70.0.3538.37',
1635         '69.0.3497.113',
1636         '70.0.3538.36',
1637         '70.0.3538.35',
1638         '71.0.3562.1',
1639         '71.0.3562.0',
1640         '70.0.3538.34',
1641         '69.0.3497.112',
1642         '70.0.3538.33',
1643         '71.0.3561.1',
1644         '71.0.3561.0',
1645         '70.0.3538.32',
1646         '69.0.3497.111',
1647         '71.0.3559.6',
1648         '71.0.3560.1',
1649         '71.0.3560.0',
1650         '71.0.3559.5',
1651         '71.0.3559.4',
1652         '70.0.3538.31',
1653         '69.0.3497.110',
1654         '71.0.3559.3',
1655         '70.0.3538.30',
1656         '69.0.3497.109',
1657         '71.0.3559.2',
1658         '71.0.3559.1',
1659         '71.0.3559.0',
1660         '70.0.3538.29',
1661         '69.0.3497.108',
1662         '71.0.3558.2',
1663         '71.0.3558.1',
1664         '71.0.3558.0',
1665         '70.0.3538.28',
1666         '69.0.3497.107',
1667         '71.0.3557.2',
1668         '71.0.3557.1',
1669         '71.0.3557.0',
1670         '70.0.3538.27',
1671         '69.0.3497.106',
1672         '71.0.3554.4',
1673         '70.0.3538.26',
1674         '71.0.3556.1',
1675         '71.0.3556.0',
1676         '70.0.3538.25',
1677         '71.0.3554.3',
1678         '69.0.3497.105',
1679         '71.0.3554.2',
1680         '70.0.3538.24',
1681         '69.0.3497.104',
1682         '71.0.3555.2',
1683         '70.0.3538.23',
1684         '71.0.3555.1',
1685         '71.0.3555.0',
1686         '70.0.3538.22',
1687         '69.0.3497.103',
1688         '71.0.3554.1',
1689         '71.0.3554.0',
1690         '70.0.3538.21',
1691         '69.0.3497.102',
1692         '71.0.3553.3',
1693         '70.0.3538.20',
1694         '69.0.3497.101',
1695         '71.0.3553.2',
1696         '69.0.3497.100',
1697         '71.0.3553.1',
1698         '71.0.3553.0',
1699         '70.0.3538.19',
1700         '69.0.3497.99',
1701         '69.0.3497.98',
1702         '69.0.3497.97',
1703         '71.0.3552.6',
1704         '71.0.3552.5',
1705         '71.0.3552.4',
1706         '71.0.3552.3',
1707         '71.0.3552.2',
1708         '71.0.3552.1',
1709         '71.0.3552.0',
1710         '70.0.3538.18',
1711         '69.0.3497.96',
1712         '71.0.3551.3',
1713         '71.0.3551.2',
1714         '71.0.3551.1',
1715         '71.0.3551.0',
1716         '70.0.3538.17',
1717         '69.0.3497.95',
1718         '71.0.3550.3',
1719         '71.0.3550.2',
1720         '71.0.3550.1',
1721         '71.0.3550.0',
1722         '70.0.3538.16',
1723         '69.0.3497.94',
1724         '71.0.3549.1',
1725         '71.0.3549.0',
1726         '70.0.3538.15',
1727         '69.0.3497.93',
1728         '69.0.3497.92',
1729         '71.0.3548.1',
1730         '71.0.3548.0',
1731         '70.0.3538.14',
1732         '69.0.3497.91',
1733         '71.0.3547.1',
1734         '71.0.3547.0',
1735         '70.0.3538.13',
1736         '69.0.3497.90',
1737         '71.0.3546.2',
1738         '69.0.3497.89',
1739         '71.0.3546.1',
1740         '71.0.3546.0',
1741         '70.0.3538.12',
1742         '69.0.3497.88',
1743         '71.0.3545.4',
1744         '71.0.3545.3',
1745         '71.0.3545.2',
1746         '71.0.3545.1',
1747         '71.0.3545.0',
1748         '70.0.3538.11',
1749         '69.0.3497.87',
1750         '71.0.3544.5',
1751         '71.0.3544.4',
1752         '71.0.3544.3',
1753         '71.0.3544.2',
1754         '71.0.3544.1',
1755         '71.0.3544.0',
1756         '69.0.3497.86',
1757         '70.0.3538.10',
1758         '69.0.3497.85',
1759         '70.0.3538.9',
1760         '69.0.3497.84',
1761         '71.0.3543.4',
1762         '70.0.3538.8',
1763         '71.0.3543.3',
1764         '71.0.3543.2',
1765         '71.0.3543.1',
1766         '71.0.3543.0',
1767         '70.0.3538.7',
1768         '69.0.3497.83',
1769         '71.0.3542.2',
1770         '71.0.3542.1',
1771         '71.0.3542.0',
1772         '70.0.3538.6',
1773         '69.0.3497.82',
1774         '69.0.3497.81',
1775         '71.0.3541.1',
1776         '71.0.3541.0',
1777         '70.0.3538.5',
1778         '69.0.3497.80',
1779         '71.0.3540.1',
1780         '71.0.3540.0',
1781         '70.0.3538.4',
1782         '69.0.3497.79',
1783         '70.0.3538.3',
1784         '71.0.3539.1',
1785         '71.0.3539.0',
1786         '69.0.3497.78',
1787         '68.0.3440.134',
1788         '69.0.3497.77',
1789         '70.0.3538.2',
1790         '70.0.3538.1',
1791         '70.0.3538.0',
1792         '69.0.3497.76',
1793         '68.0.3440.133',
1794         '69.0.3497.75',
1795         '70.0.3537.2',
1796         '70.0.3537.1',
1797         '70.0.3537.0',
1798         '69.0.3497.74',
1799         '68.0.3440.132',
1800         '70.0.3536.0',
1801         '70.0.3535.5',
1802         '70.0.3535.4',
1803         '70.0.3535.3',
1804         '69.0.3497.73',
1805         '68.0.3440.131',
1806         '70.0.3532.8',
1807         '70.0.3532.7',
1808         '69.0.3497.72',
1809         '69.0.3497.71',
1810         '70.0.3535.2',
1811         '70.0.3535.1',
1812         '70.0.3535.0',
1813         '69.0.3497.70',
1814         '68.0.3440.130',
1815         '69.0.3497.69',
1816         '68.0.3440.129',
1817         '70.0.3534.4',
1818         '70.0.3534.3',
1819         '70.0.3534.2',
1820         '70.0.3534.1',
1821         '70.0.3534.0',
1822         '69.0.3497.68',
1823         '68.0.3440.128',
1824         '70.0.3533.2',
1825         '70.0.3533.1',
1826         '70.0.3533.0',
1827         '69.0.3497.67',
1828         '68.0.3440.127',
1829         '70.0.3532.6',
1830         '70.0.3532.5',
1831         '70.0.3532.4',
1832         '69.0.3497.66',
1833         '68.0.3440.126',
1834         '70.0.3532.3',
1835         '70.0.3532.2',
1836         '70.0.3532.1',
1837         '69.0.3497.60',
1838         '69.0.3497.65',
1839         '69.0.3497.64',
1840         '70.0.3532.0',
1841         '70.0.3531.0',
1842         '70.0.3530.4',
1843         '70.0.3530.3',
1844         '70.0.3530.2',
1845         '69.0.3497.58',
1846         '68.0.3440.125',
1847         '69.0.3497.57',
1848         '69.0.3497.56',
1849         '69.0.3497.55',
1850         '69.0.3497.54',
1851         '70.0.3530.1',
1852         '70.0.3530.0',
1853         '69.0.3497.53',
1854         '68.0.3440.124',
1855         '69.0.3497.52',
1856         '70.0.3529.3',
1857         '70.0.3529.2',
1858         '70.0.3529.1',
1859         '70.0.3529.0',
1860         '69.0.3497.51',
1861         '70.0.3528.4',
1862         '68.0.3440.123',
1863         '70.0.3528.3',
1864         '70.0.3528.2',
1865         '70.0.3528.1',
1866         '70.0.3528.0',
1867         '69.0.3497.50',
1868         '68.0.3440.122',
1869         '70.0.3527.1',
1870         '70.0.3527.0',
1871         '69.0.3497.49',
1872         '68.0.3440.121',
1873         '70.0.3526.1',
1874         '70.0.3526.0',
1875         '68.0.3440.120',
1876         '69.0.3497.48',
1877         '69.0.3497.47',
1878         '68.0.3440.119',
1879         '68.0.3440.118',
1880         '70.0.3525.5',
1881         '70.0.3525.4',
1882         '70.0.3525.3',
1883         '68.0.3440.117',
1884         '69.0.3497.46',
1885         '70.0.3525.2',
1886         '70.0.3525.1',
1887         '70.0.3525.0',
1888         '69.0.3497.45',
1889         '68.0.3440.116',
1890         '70.0.3524.4',
1891         '70.0.3524.3',
1892         '69.0.3497.44',
1893         '70.0.3524.2',
1894         '70.0.3524.1',
1895         '70.0.3524.0',
1896         '70.0.3523.2',
1897         '69.0.3497.43',
1898         '68.0.3440.115',
1899         '70.0.3505.9',
1900         '69.0.3497.42',
1901         '70.0.3505.8',
1902         '70.0.3523.1',
1903         '70.0.3523.0',
1904         '69.0.3497.41',
1905         '68.0.3440.114',
1906         '70.0.3505.7',
1907         '69.0.3497.40',
1908         '70.0.3522.1',
1909         '70.0.3522.0',
1910         '70.0.3521.2',
1911         '69.0.3497.39',
1912         '68.0.3440.113',
1913         '70.0.3505.6',
1914         '70.0.3521.1',
1915         '70.0.3521.0',
1916         '69.0.3497.38',
1917         '68.0.3440.112',
1918         '70.0.3520.1',
1919         '70.0.3520.0',
1920         '69.0.3497.37',
1921         '68.0.3440.111',
1922         '70.0.3519.3',
1923         '70.0.3519.2',
1924         '70.0.3519.1',
1925         '70.0.3519.0',
1926         '69.0.3497.36',
1927         '68.0.3440.110',
1928         '70.0.3518.1',
1929         '70.0.3518.0',
1930         '69.0.3497.35',
1931         '69.0.3497.34',
1932         '68.0.3440.109',
1933         '70.0.3517.1',
1934         '70.0.3517.0',
1935         '69.0.3497.33',
1936         '68.0.3440.108',
1937         '69.0.3497.32',
1938         '70.0.3516.3',
1939         '70.0.3516.2',
1940         '70.0.3516.1',
1941         '70.0.3516.0',
1942         '69.0.3497.31',
1943         '68.0.3440.107',
1944         '70.0.3515.4',
1945         '68.0.3440.106',
1946         '70.0.3515.3',
1947         '70.0.3515.2',
1948         '70.0.3515.1',
1949         '70.0.3515.0',
1950         '69.0.3497.30',
1951         '68.0.3440.105',
1952         '68.0.3440.104',
1953         '70.0.3514.2',
1954         '70.0.3514.1',
1955         '70.0.3514.0',
1956         '69.0.3497.29',
1957         '68.0.3440.103',
1958         '70.0.3513.1',
1959         '70.0.3513.0',
1960         '69.0.3497.28',
1961     )
1962
1963     @classmethod
1964     def _extract_urls(cls, webpage):
1965         return re.findall(
1966             r'<iframe[^>]+src=["\']((?:https?://)?%s/%s/[a-zA-Z0-9-_]+)'
1967             % (cls._DOMAINS, cls._EMBED_WORD), webpage)
1968
1969     def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
1970         phantom = PhantomJSwrapper(self, required_version='2.0')
1971         webpage, _ = phantom.get(page_url, html=webpage, video_id=video_id, headers=headers)
1972         return webpage
1973
1974     def _real_extract(self, url):
1975         mobj = re.match(self._VALID_URL, url)
1976         host = mobj.group('host')
1977         video_id = mobj.group('id')
1978
1979         url_pattern = 'https://%s/%%s/%s/' % (host, video_id)
1980         headers = {
1981             'User-Agent': self._USER_AGENT_TPL % random.choice(self._CHROME_VERSIONS),
1982         }
1983
1984         for path in (self._EMBED_WORD, self._STREAM_WORD):
1985             page_url = url_pattern % path
1986             last = path == self._STREAM_WORD
1987             webpage = self._download_webpage(
1988                 page_url, video_id, 'Downloading %s webpage' % path,
1989                 headers=headers, fatal=last)
1990             if not webpage:
1991                 continue
1992             if 'File not found' in webpage or 'deleted by the owner' in webpage:
1993                 if not last:
1994                     continue
1995                 raise ExtractorError('File not found', expected=True, video_id=video_id)
1996             break
1997
1998         webpage = self._extract_decrypted_page(page_url, webpage, video_id, headers)
1999         for element_id in self._URL_IDS:
2000             decoded_id = get_element_by_id(element_id, webpage)
2001             if decoded_id:
2002                 break
2003         if not decoded_id:
2004             decoded_id = self._search_regex(
2005                 (r'>\s*([\w-]+~\d{10,}~\d+\.\d+\.0\.0~[\w-]+)\s*<',
2006                  r'>\s*([\w~-]+~\d+\.\d+\.\d+\.\d+~[\w~-]+)',
2007                  r'>\s*([\w-]+~\d{10,}~(?:[a-f\d]+:){2}:~[\w-]+)\s*<',
2008                  r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)\s*<',
2009                  r'>\s*([\w~-]+~[a-f0-9:]+~[\w~-]+)'), webpage,
2010                 'stream URL')
2011         video_url = 'https://%s/%s/%s?mime=true' % (host, self._REDIR_WORD, decoded_id)
2012
2013         title = self._og_search_title(webpage, default=None) or self._search_regex(
2014             r'<span[^>]+class=["\']title["\'][^>]*>([^<]+)', webpage,
2015             'title', default=None) or self._html_search_meta(
2016             'description', webpage, 'title', fatal=True)
2017
2018         entries = self._parse_html5_media_entries(page_url, webpage, video_id)
2019         entry = entries[0] if entries else {}
2020         subtitles = entry.get('subtitles')
2021
2022         return {
2023             'id': video_id,
2024             'title': title,
2025             'thumbnail': entry.get('thumbnail') or self._og_search_thumbnail(webpage, default=None),
2026             'url': video_url,
2027             'ext': determine_ext(title, None) or determine_ext(url, 'mp4'),
2028             'subtitles': subtitles,
2029             'http_headers': headers,
2030         }
2031
2032
2033 class VerystreamIE(OpenloadIE):
2034     IE_NAME = 'verystream'
2035
2036     _DOMAINS = r'(?:verystream\.com)'
2037     _VALID_URL = r'''(?x)
2038                     https?://
2039                         (?P<host>
2040                             (?:www\.)?
2041                             %s
2042                         )/
2043                         (?:stream|e)/
2044                         (?P<id>[a-zA-Z0-9-_]+)
2045                     ''' % _DOMAINS
2046     _EMBED_WORD = 'e'
2047     _STREAM_WORD = 'stream'
2048     _REDIR_WORD = 'gettoken'
2049     _URL_IDS = ('videolink', )
2050     _TESTS = [{
2051         'url': 'https://verystream.com/stream/c1GWQ9ngBBx/',
2052         'md5': 'd3e8c5628ccb9970b65fd65269886795',
2053         'info_dict': {
2054             'id': 'c1GWQ9ngBBx',
2055             'ext': 'mp4',
2056             'title': 'Big Buck Bunny.mp4',
2057             'thumbnail': r're:^https?://.*\.jpg$',
2058         },
2059     }, {
2060         'url': 'https://verystream.com/e/c1GWQ9ngBBx/',
2061         'only_matching': True,
2062     }]
2063
2064     def _extract_decrypted_page(self, page_url, webpage, video_id, headers):
2065         return webpage  # for Verystream, the webpage is already decrypted